InstancedModelProcessor.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // InstancedModelProcessor.cs
  4. //
  5. // Microsoft XNA Community Game Platform
  6. // Copyright (C) Microsoft Corporation. All rights reserved.
  7. //-----------------------------------------------------------------------------
  8. #endregion
  9. #region Using Statements
  10. using Microsoft.Xna.Framework.Content.Pipeline;
  11. using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
  12. using Microsoft.Xna.Framework.Content.Pipeline.Processors;
  13. #endregion
  14. namespace InstancedModelPipeline
  15. {
  16. /// <summary>
  17. /// Content Pipeline processor applies the InstancedModel.fx shader
  18. /// onto models, so they can be drawn using hardware instancing.
  19. /// </summary>
  20. [ContentProcessor(DisplayName = "Instanced Model")]
  21. public class InstancedModelProcessor : ModelProcessor
  22. {
  23. ContentIdentity rootIdentity;
  24. /// <summary>
  25. /// Override the Process method to store the ContentIdentity of the model root node.
  26. /// </summary>
  27. public override ModelContent Process(NodeContent input, ContentProcessorContext context)
  28. {
  29. rootIdentity = input.Identity;
  30. return base.Process(input, context);
  31. }
  32. /// <summary>
  33. /// Override the ConvertMaterial method to apply our custom InstancedModel.fx shader.
  34. /// </summary>
  35. protected override MaterialContent ConvertMaterial(MaterialContent material,
  36. ContentProcessorContext context)
  37. {
  38. // Create a new material.
  39. EffectMaterialContent newMaterial = new EffectMaterialContent();
  40. // Tell it to use our custom InstancedModel.fx shader.
  41. newMaterial.Effect = new ExternalReference<EffectContent>("InstancedModel.fx",
  42. rootIdentity);
  43. // Copy the texture setting across from the original material.
  44. BasicMaterialContent basicMaterial = material as BasicMaterialContent;
  45. if ((basicMaterial != null) && (basicMaterial.Texture != null))
  46. {
  47. newMaterial.Textures.Add("Texture", basicMaterial.Texture);
  48. }
  49. // Chain to the base ModelProcessor, so it can build our new material.
  50. return base.ConvertMaterial(newMaterial, context);
  51. }
  52. }
  53. }