protected override void BuildSphereAndGeometryNodes(ComponentManifest manifest, SceneNode parent) { BoundingSphere bound = new BoundingSphere(); bound.Center = Vector3.Up; bound.Radius = SlagMath.SQRT_2 * 1.25f; // Billboards can be randomly enlarged and waving back and forth, so expand the bound by 25%. ExplicitBoundingSphereNode meshBound = new ExplicitBoundingSphereNode(bound); parent.AddChild(meshBound); // Create the default material EffectApplication defaultMaterial = new EffectApplication(Effect, Skelemator.RenderStatePresets.Default); defaultMaterial.AddParamSetter(new CommonParamSetter()); defaultMaterial.AddParamSetter(new FogParamSetter()); defaultMaterial.AddParamSetter(new BillboardParamSetter(true, delegate() { return(mCurrentTime); })); EffectApplication defaultFringeMaterial = new EffectApplication(Effect, Skelemator.RenderStatePresets.AlphaBlendNPM); defaultFringeMaterial.AddParamSetter(new CommonParamSetter()); defaultFringeMaterial.AddParamSetter(new FogParamSetter()); defaultFringeMaterial.AddParamSetter(new BillboardParamSetter(false, delegate() { return(mCurrentTime); })); AlphaCutoutGeometryNode geometry = new AlphaCutoutGeometryNode(mGeometry, defaultMaterial, defaultFringeMaterial); meshBound.AddChild(geometry); EffectApplication depthMaterial = new EffectApplication(mDepthOnlyEffect, Skelemator.RenderStatePresets.Default); depthMaterial.AddParamSetter(new CommonParamSetter()); depthMaterial.AddParamSetter(new BillboardParamSetter(true, delegate() { return(mCurrentTime); })); geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, null); geometry.AddFringeMaterial(TraversalContext.MaterialFlags.ShadowMap, null); }
public RenderEntry(GeometryNode drawNode, EffectApplication material) { DrawNode = drawNode; SceneDepth = 0.0f; Material = material; Transform = Matrix.Identity; }
protected override void BuildSphereAndGeometryNodes(ComponentManifest manifest, SceneNode parent) { Vector4 specColor = (Vector4)(manifest.Properties[ManifestKeys.MAT_SPEC_COLOR]); Effect.Parameters[EffectRegistry.MATERIAL_SPECULAR_COLOR_PARAM_NAME].SetValue(specColor); Effect.Parameters[EffectRegistry.TEXTURE_PARAM_NAME].SetValue(mTexture); float brightness = 1.0f; if (manifest.Properties.ContainsKey(ManifestKeys.BRIGHTNESS)) brightness = (float)(manifest.Properties[ManifestKeys.BRIGHTNESS]); Effect.Parameters[EffectRegistry.BRIGHTNESS_PARAM_NAME].SetValue(brightness); float contrast = 1.0f; if (manifest.Properties.ContainsKey(ManifestKeys.CONTRAST)) contrast = (float)(manifest.Properties[ManifestKeys.CONTRAST]); Effect.Parameters[EffectRegistry.CONTRAST_PARAM_NAME].SetValue(contrast); // First, add the effect's params to the EffectRegistry so the ParamSetter can retrieve them. EffectRegistry.Add(Effect, RenderOptions.RequiresHDRLighting | RenderOptions.RequiresShadowMap); // Create the default material EffectApplication defaultMaterial = new EffectApplication(Effect, RenderStatePresets.Default); defaultMaterial.AddParamSetter(new CommonParamSetter()); defaultMaterial.AddParamSetter(new HDRLightParamSetter()); defaultMaterial.AddParamSetter(new FogParamSetter()); defaultMaterial.AddParamSetter(new ShadowParamSetter()); RawGeometryNode geometry = null; ExplicitBoundingSphereNode meshBound = null; switch ((Shape)(manifest.Properties[ManifestKeys.SHAPE])) { case Shape.Box: geometry = new RawGeometryNode(GeneratedGeometry.Box, defaultMaterial); meshBound = new ExplicitBoundingSphereNode(GeneratedGeometry.BoxBound); break; case Shape.Sphere: geometry = new RawGeometryNode(GeneratedGeometry.Sphere, defaultMaterial); meshBound = new ExplicitBoundingSphereNode(GeneratedGeometry.SphereBound); break; } parent.AddChild(meshBound); meshBound.AddChild(geometry); // Create the ShadowMap material // Default to CastsShadow = true if (!manifest.Properties.ContainsKey(ManifestKeys.CASTS_SHADOW) || (bool)(manifest.Properties[ManifestKeys.CASTS_SHADOW])) { EffectApplication depthOnlyMaterial; depthOnlyMaterial = new EffectApplication(EffectRegistry.DepthOnlyFx, RenderStatePresets.Default); depthOnlyMaterial.AddParamSetter(new WorldViewProjParamSetter()); geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, depthOnlyMaterial); } else { geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, null); } // If the GeometryNode requires additional materials, they would need to be added here. }
public TerrainRenderComponent(Actor owner) : base(owner) { TerrainAsset = null; mDefaultMaterial = null; mDepthOnlyMaterial = null; Heights = null; }
protected override void CreateSceneGraph(ComponentManifest manifest) { EffectApplication defaultMaterial = new EffectApplication(EffectRegistry.SkyboxFx, RenderStatePresets.Skybox); defaultMaterial.AddParamSetter(new SkyboxWvpParamSetter()); defaultMaterial.AddParamSetter(new EnvironmentMapParamSetter()); SceneGraph = new RawGeometryNode(GeneratedGeometry.Sphere, defaultMaterial); ((GeometryNode)SceneGraph).AddMaterial(TraversalContext.MaterialFlags.ShadowMap, null); }
public override void Process(TraversalContext context) { // Choose the appropriate material TraversalContext.MaterialFlags materialFlags = (LocalMaterialFlags | context.ExternalMaterialFlags) & mSupportedMaterialFlags; EffectApplication currentMaterial = mMaterials[materialFlags & ~(materialFlags - 1)]; // Clear all but the lowest bit (highest priority flag) if (currentMaterial != null) { context.AcceptForRender(this, currentMaterial); } }
public void AcceptForRender(GeometryNode drawNode, EffectApplication material) { RenderEntry newEntry = new RenderEntry(drawNode, material); if (material.UseAlphaPass) { Vector3 homogeneousClipSpacePos = Vector3.Transform(Transform.Top.Translation, VisibilityFrustum.Matrix); newEntry.SceneDepth = -homogeneousClipSpacePos.Z; // Negate because we want to sort far-to-near. } newEntry.Transform = Transform.Top; mRenderEntries.Add(newEntry); }
public override void Draw(RenderContext context, EffectApplication material, Matrix transform) { material.SetEffectParams(context, transform); for (int p = 0; p < material.Effect.CurrentTechnique.Passes.Count; ++p) { material.Effect.CurrentTechnique.Passes[p].Apply(); if (mParticleData.FirstActiveParticleIndex < mParticleData.FirstFreeParticleIndex) { // If the active particles are all in one consecutive range, we can draw them all in a single call. if (SharedResources.GraphicsDeviceReady) { SharedResources.Game.GraphicsDevice.DrawIndexedPrimitives( PrimitiveType.TriangleList, 0, mParticleData.FirstActiveParticleIndex * 4, (mParticleData.FirstFreeParticleIndex - mParticleData.FirstActiveParticleIndex) * 4, mParticleData.FirstActiveParticleIndex * 6, (mParticleData.FirstFreeParticleIndex - mParticleData.FirstActiveParticleIndex) * 2); } } else { // If the active particle range wraps past the end of the queue back to the start, we must split them over two draw calls. if (SharedResources.GraphicsDeviceReady) { SharedResources.Game.GraphicsDevice.DrawIndexedPrimitives( PrimitiveType.TriangleList, 0, mParticleData.FirstActiveParticleIndex * 4, (mParticleData.MaxParticles - mParticleData.FirstActiveParticleIndex) * 4, mParticleData.FirstActiveParticleIndex * 6, (mParticleData.MaxParticles - mParticleData.FirstActiveParticleIndex) * 2); } if (mParticleData.FirstFreeParticleIndex > 0 && SharedResources.GraphicsDeviceReady) { SharedResources.Game.GraphicsDevice.DrawIndexedPrimitives( PrimitiveType.TriangleList, 0, 0, mParticleData.FirstFreeParticleIndex * 4, 0, mParticleData.FirstFreeParticleIndex * 2); } } } mIncrementDrawCounter(); }
public override void Initialize(ContentManager contentLoader, ComponentManifest manifest) { TerrainAsset = contentLoader.Load <Terrain>((string)(manifest.Properties[ManifestKeys.TERRAIN])); Heights = TerrainAsset.GetGeometry(); EffectRegistry.Add(TerrainAsset.Effect, (RenderOptions)(TerrainAsset.Tag)); mDefaultMaterial = new EffectApplication(TerrainAsset.Effect, RenderStatePresets.Default); mDefaultMaterial.AddParamSetter(new CommonParamSetter()); mDefaultMaterial.AddParamSetter(new ShadowParamSetter()); mDefaultMaterial.AddParamSetter(new HDRLightParamSetter()); mDefaultMaterial.AddParamSetter(new FogParamSetter()); mDepthOnlyMaterial = new EffectApplication(EffectRegistry.DepthOnlyFx, RenderStatePresets.Default); mDepthOnlyMaterial.AddParamSetter(new WorldViewProjParamSetter()); base.Initialize(contentLoader, manifest); }
public override void Initialize(ContentManager contentLoader, ComponentManifest manifest) { TerrainAsset = contentLoader.Load<Terrain>((string)(manifest.Properties[ManifestKeys.TERRAIN])); Heights = TerrainAsset.GetGeometry(); EffectRegistry.Add(TerrainAsset.Effect, (RenderOptions)(TerrainAsset.Tag)); mDefaultMaterial = new EffectApplication(TerrainAsset.Effect, RenderStatePresets.Default); mDefaultMaterial.AddParamSetter(new CommonParamSetter()); mDefaultMaterial.AddParamSetter(new ShadowParamSetter()); mDefaultMaterial.AddParamSetter(new HDRLightParamSetter()); mDefaultMaterial.AddParamSetter(new FogParamSetter()); mDepthOnlyMaterial = new EffectApplication(EffectRegistry.DepthOnlyFx, RenderStatePresets.Default); mDepthOnlyMaterial.AddParamSetter(new WorldViewProjParamSetter()); base.Initialize(contentLoader, manifest); }
public virtual void Draw(RenderContext context, EffectApplication material, Matrix transform) { material.SetEffectParams(context, transform); for (int p = 0; p < material.Effect.CurrentTechnique.Passes.Count; ++p) { material.Effect.CurrentTechnique.Passes[p].Apply(); if (SharedResources.GraphicsDeviceReady) { SharedResources.Game.GraphicsDevice.DrawIndexedPrimitives( PrimitiveType.TriangleList, mVertexOffset, 0, mNumVertices, mStartIndex, mPrimitiveCount); } } }
protected override void BuildSphereAndGeometryNodes(ComponentManifest manifest, SceneNode parent) { BoundingSphere bound = new BoundingSphere(); bound.Center = Vector3.Zero; // TODO: P2: Magic number? bound.Radius = 120.0f; ExplicitBoundingSphereNode meshBound = new ExplicitBoundingSphereNode(bound); parent.AddChild(meshBound); // Create the default material EffectApplication defaultMaterial = new EffectApplication(mEffect, mSettings.RenderState); defaultMaterial.AddParamSetter(new ParticlesParamSetter(delegate() { return(mCurrentTime); })); ParticleSystemGeometryNode geometry = new ParticleSystemGeometryNode(mParticleData, delegate() { mDrawCounter++; }, defaultMaterial); meshBound.AddChild(geometry); // It won't cast a shadow. geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, null); }
public void AddFringeMaterial(TraversalContext.MaterialFlags materialFlag, EffectApplication fringeMaterial) // For the key, please only set one flag at a time. { mFringeMaterials.Add(materialFlag, fringeMaterial); }
public ParticleSystemGeometryNode(ParticleData particleData, IncrementDrawCounterDelegate incrementDrawCounter, EffectApplication defaultMaterial) : base(defaultMaterial) { mParticleData = particleData; mIncrementDrawCounter = incrementDrawCounter; }
public TerrainGeometryNode(Terrain geometry, int vertexOffset, EffectApplication defaultMaterial) : base(defaultMaterial) { Geometry = geometry; VertexOffset = vertexOffset; }
public GeometryNode(EffectApplication defaultMaterial) { mMaterials = new Dictionary<TraversalContext.MaterialFlags, EffectApplication>(); mMaterials.Add(TraversalContext.MaterialFlags.None, defaultMaterial); }
public virtual void Draw(RenderContext context, EffectApplication material, Matrix transform) { material.SetEffectParams(context, transform); for (int p = 0; p < material.Effect.CurrentTechnique.Passes.Count; ++p) { material.Effect.CurrentTechnique.Passes[p].Apply(); if (SharedResources.GraphicsDeviceReady) SharedResources.Game.GraphicsDevice.DrawIndexedPrimitives( PrimitiveType.TriangleList, mVertexOffset, 0, mNumVertices, mStartIndex, mPrimitiveCount); } }
protected override void BuildSphereAndGeometryNodes(ComponentManifest manifest, SceneNode parent) { Vector4 specColor = (Vector4)(manifest.Properties[ManifestKeys.MAT_SPEC_COLOR]); Effect.Parameters[EffectRegistry.MATERIAL_SPECULAR_COLOR_PARAM_NAME].SetValue(specColor); Effect.Parameters[EffectRegistry.TEXTURE_PARAM_NAME].SetValue(mTexture); float brightness = 1.0f; if (manifest.Properties.ContainsKey(ManifestKeys.BRIGHTNESS)) { brightness = (float)(manifest.Properties[ManifestKeys.BRIGHTNESS]); } Effect.Parameters[EffectRegistry.BRIGHTNESS_PARAM_NAME].SetValue(brightness); float contrast = 1.0f; if (manifest.Properties.ContainsKey(ManifestKeys.CONTRAST)) { contrast = (float)(manifest.Properties[ManifestKeys.CONTRAST]); } Effect.Parameters[EffectRegistry.CONTRAST_PARAM_NAME].SetValue(contrast); // First, add the effect's params to the EffectRegistry so the ParamSetter can retrieve them. EffectRegistry.Add(Effect, RenderOptions.RequiresHDRLighting | RenderOptions.RequiresShadowMap); // Create the default material EffectApplication defaultMaterial = new EffectApplication(Effect, RenderStatePresets.Default); defaultMaterial.AddParamSetter(new CommonParamSetter()); defaultMaterial.AddParamSetter(new HDRLightParamSetter()); defaultMaterial.AddParamSetter(new FogParamSetter()); defaultMaterial.AddParamSetter(new ShadowParamSetter()); RawGeometryNode geometry = null; ExplicitBoundingSphereNode meshBound = null; switch ((Shape)(manifest.Properties[ManifestKeys.SHAPE])) { case Shape.Box: geometry = new RawGeometryNode(GeneratedGeometry.Box, defaultMaterial); meshBound = new ExplicitBoundingSphereNode(GeneratedGeometry.BoxBound); break; case Shape.Sphere: geometry = new RawGeometryNode(GeneratedGeometry.Sphere, defaultMaterial); meshBound = new ExplicitBoundingSphereNode(GeneratedGeometry.SphereBound); break; } parent.AddChild(meshBound); meshBound.AddChild(geometry); // Create the ShadowMap material // Default to CastsShadow = true if (!manifest.Properties.ContainsKey(ManifestKeys.CASTS_SHADOW) || (bool)(manifest.Properties[ManifestKeys.CASTS_SHADOW])) { EffectApplication depthOnlyMaterial; depthOnlyMaterial = new EffectApplication(EffectRegistry.DepthOnlyFx, RenderStatePresets.Default); depthOnlyMaterial.AddParamSetter(new WorldViewProjParamSetter()); geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, depthOnlyMaterial); } else { geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, null); } // If the GeometryNode requires additional materials, they would need to be added here. }
public ModelGeometryNode(ModelMeshPart geometry, EffectApplication defaultMaterial) : base(defaultMaterial) { Geometry = geometry; }
public GeometryNode(EffectApplication defaultMaterial) { mMaterials = new Dictionary <TraversalContext.MaterialFlags, EffectApplication>(); mMaterials.Add(TraversalContext.MaterialFlags.None, defaultMaterial); }
public AlphaCutoutGeometryNode(MeshPart geometry, EffectApplication defaultOpaqueMaterial, EffectApplication defaultFringeMaterial) : base(geometry, defaultOpaqueMaterial) { mFringeMaterials = new Dictionary <TraversalContext.MaterialFlags, EffectApplication>(); mFringeMaterials.Add(TraversalContext.MaterialFlags.None, defaultFringeMaterial); }
// Provide a material to use for special rendering modes. You can supply a null material if the node should not draw anything // for a certain mode (usually to not participate in the shadow pass.) public void AddMaterial(TraversalContext.MaterialFlags materialFlag, EffectApplication material) // For the key, please only set one flag at a time. { mMaterials.Add(materialFlag, material); mSupportedMaterialFlags |= materialFlag; }
protected override void BuildSphereAndGeometryNodes(ComponentManifest manifest, SceneNode parent) { BoundingSphere bound = new BoundingSphere(); bound.Center = Vector3.Zero; // TODO: P2: Magic number? bound.Radius = 120.0f; ExplicitBoundingSphereNode meshBound = new ExplicitBoundingSphereNode(bound); parent.AddChild(meshBound); // Create the default material EffectApplication defaultMaterial = new EffectApplication(mEffect, mSettings.RenderState); defaultMaterial.AddParamSetter(new ParticlesParamSetter(delegate() { return mCurrentTime; })); ParticleSystemGeometryNode geometry = new ParticleSystemGeometryNode(mParticleData, delegate() { mDrawCounter++; }, defaultMaterial); meshBound.AddChild(geometry); // It won't cast a shadow. geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, null); }
protected override void BuildSphereAndGeometryNodes(ComponentManifest manifest, SceneNode parent) { BoundingSphere bound = new BoundingSphere(); bound.Center = Vector3.Up; bound.Radius = SlagMath.SQRT_2 * 1.25f; // Billboards can be randomly enlarged and waving back and forth, so expand the bound by 25%. ExplicitBoundingSphereNode meshBound = new ExplicitBoundingSphereNode(bound); parent.AddChild(meshBound); // Create the default material EffectApplication defaultMaterial = new EffectApplication(Effect, Skelemator.RenderStatePresets.Default); defaultMaterial.AddParamSetter(new CommonParamSetter()); defaultMaterial.AddParamSetter(new FogParamSetter()); defaultMaterial.AddParamSetter(new BillboardParamSetter(true, delegate() { return mCurrentTime; })); EffectApplication defaultFringeMaterial = new EffectApplication(Effect, Skelemator.RenderStatePresets.AlphaBlendNPM); defaultFringeMaterial.AddParamSetter(new CommonParamSetter()); defaultFringeMaterial.AddParamSetter(new FogParamSetter()); defaultFringeMaterial.AddParamSetter(new BillboardParamSetter(false, delegate() { return mCurrentTime; })); AlphaCutoutGeometryNode geometry = new AlphaCutoutGeometryNode(mGeometry, defaultMaterial, defaultFringeMaterial); meshBound.AddChild(geometry); EffectApplication depthMaterial = new EffectApplication(mDepthOnlyEffect, Skelemator.RenderStatePresets.Default); depthMaterial.AddParamSetter(new CommonParamSetter()); depthMaterial.AddParamSetter(new BillboardParamSetter(true, delegate() { return mCurrentTime; })); geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, null); geometry.AddFringeMaterial(TraversalContext.MaterialFlags.ShadowMap, null); }
public RawGeometryNode(MeshPart geometry, EffectApplication defaultMaterial) : base(defaultMaterial) { Geometry = geometry; }
public AlphaCutoutGeometryNode(MeshPart geometry, EffectApplication defaultOpaqueMaterial, EffectApplication defaultFringeMaterial) : base(geometry, defaultOpaqueMaterial) { mFringeMaterials = new Dictionary<TraversalContext.MaterialFlags, EffectApplication>(); mFringeMaterials.Add(TraversalContext.MaterialFlags.None, defaultFringeMaterial); }
// For the key, please only set one flag at a time. // Provide a material to use for special rendering modes. You can supply a null material if the node should not draw anything // for a certain mode (usually to not participate in the shadow pass.) public void AddMaterial(TraversalContext.MaterialFlags materialFlag, EffectApplication material) { mMaterials.Add(materialFlag, material); mSupportedMaterialFlags |= materialFlag; }
// For the key, please only set one flag at a time. public void AddFringeMaterial(TraversalContext.MaterialFlags materialFlag, EffectApplication fringeMaterial) { mFringeMaterials.Add(materialFlag, fringeMaterial); }
protected override void BuildSphereAndGeometryNodes(ComponentManifest manifest, SceneNode parent) { foreach (ModelMesh mm in VisualModel.Meshes) { ExplicitBoundingSphereNode meshBound = new ExplicitBoundingSphereNode(mm.BoundingSphere); parent.AddChild(meshBound); foreach (ModelMeshPart mmp in mm.MeshParts) { MaterialInfo mi = mmp.Tag as MaterialInfo; if (mi == null) { throw new AssetFormatException("The VisualModel's ModelMeshParts do not contain the MaterialInfo in the Tag property."); } // First, add the effect's params to the EffectRegistry so the ParamSetter can retrieve them. EffectRegistry.Add(mmp.Effect, mi.HandlingFlags); // Create the default material EffectApplication defaultMaterial = new EffectApplication(mmp.Effect, mi.RenderState); defaultMaterial.AddParamSetter(new CommonParamSetter()); defaultMaterial.AddParamSetter(new FogParamSetter()); if ((mi.HandlingFlags & RenderOptions.RequiresHDRLighting) > 0) { defaultMaterial.AddParamSetter(new HDRLightParamSetter()); } if ((mi.HandlingFlags & RenderOptions.RequiresSkeletalPose) > 0) { defaultMaterial.AddParamSetter(new SkinParamSetter()); } if ((mi.HandlingFlags & RenderOptions.RequiresShadowMap) > 0) { defaultMaterial.AddParamSetter(new ShadowParamSetter()); } if ((mi.HandlingFlags & RenderOptions.RequiresFringeMap) > 0) { defaultMaterial.AddParamSetter(new FringeMapParamSetter()); } ModelGeometryNode geometry = new ModelGeometryNode(mmp, defaultMaterial); meshBound.AddChild(geometry); // Create the ShadowMap material // Default to CastsShadow = true if (!manifest.Properties.ContainsKey(ManifestKeys.CASTS_SHADOW) || (bool)(manifest.Properties[ManifestKeys.CASTS_SHADOW])) { EffectApplication depthOnlyMaterial; if ((mi.HandlingFlags & RenderOptions.RequiresSkeletalPose) > 0) { depthOnlyMaterial = new EffectApplication(EffectRegistry.DepthOnlySkinFx, RenderStatePresets.Default); depthOnlyMaterial.AddParamSetter(new SkinParamSetter()); } else { depthOnlyMaterial = new EffectApplication(EffectRegistry.DepthOnlyFx, RenderStatePresets.Default); } depthOnlyMaterial.AddParamSetter(new WorldViewProjParamSetter()); geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, depthOnlyMaterial); } else { geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, null); } // If the GeometryNode requires additional materials, they would need to be added here. } } }
protected override void BuildSphereAndGeometryNodes(ComponentManifest manifest, SceneNode parent) { foreach (ModelMesh mm in VisualModel.Meshes) { ExplicitBoundingSphereNode meshBound = new ExplicitBoundingSphereNode(mm.BoundingSphere); parent.AddChild(meshBound); foreach (ModelMeshPart mmp in mm.MeshParts) { MaterialInfo mi = mmp.Tag as MaterialInfo; if (mi == null) throw new AssetFormatException("The VisualModel's ModelMeshParts do not contain the MaterialInfo in the Tag property."); // First, add the effect's params to the EffectRegistry so the ParamSetter can retrieve them. EffectRegistry.Add(mmp.Effect, mi.HandlingFlags); // Create the default material EffectApplication defaultMaterial = new EffectApplication(mmp.Effect, mi.RenderState); defaultMaterial.AddParamSetter(new CommonParamSetter()); defaultMaterial.AddParamSetter(new FogParamSetter()); if ((mi.HandlingFlags & RenderOptions.RequiresHDRLighting) > 0) defaultMaterial.AddParamSetter(new HDRLightParamSetter()); if ((mi.HandlingFlags & RenderOptions.RequiresSkeletalPose) > 0) defaultMaterial.AddParamSetter(new SkinParamSetter()); if ((mi.HandlingFlags & RenderOptions.RequiresShadowMap) > 0) defaultMaterial.AddParamSetter(new ShadowParamSetter()); if ((mi.HandlingFlags & RenderOptions.RequiresFringeMap) > 0) defaultMaterial.AddParamSetter(new FringeMapParamSetter()); ModelGeometryNode geometry = new ModelGeometryNode(mmp, defaultMaterial); meshBound.AddChild(geometry); // Create the ShadowMap material // Default to CastsShadow = true if (!manifest.Properties.ContainsKey(ManifestKeys.CASTS_SHADOW) || (bool)(manifest.Properties[ManifestKeys.CASTS_SHADOW])) { EffectApplication depthOnlyMaterial; if ((mi.HandlingFlags & RenderOptions.RequiresSkeletalPose) > 0) { depthOnlyMaterial = new EffectApplication(EffectRegistry.DepthOnlySkinFx, RenderStatePresets.Default); depthOnlyMaterial.AddParamSetter(new SkinParamSetter()); } else { depthOnlyMaterial = new EffectApplication(EffectRegistry.DepthOnlyFx, RenderStatePresets.Default); } depthOnlyMaterial.AddParamSetter(new WorldViewProjParamSetter()); geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, depthOnlyMaterial); } else { geometry.AddMaterial(TraversalContext.MaterialFlags.ShadowMap, null); } // If the GeometryNode requires additional materials, they would need to be added here. } } }