Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 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;
 }
Esempio n. 5
0
 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);
 }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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);
            }
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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();
        }
Esempio n. 12
0
        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();
        }
Esempio n. 13
0
        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);
        }
Esempio n. 15
0
 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);
         }
     }
 }
Esempio n. 16
0
        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);
        }
Esempio n. 17
0
 public void AddFringeMaterial(TraversalContext.MaterialFlags materialFlag, EffectApplication fringeMaterial) // For the key, please only set one flag at a time.
 {
     mFringeMaterials.Add(materialFlag, fringeMaterial);
 }
Esempio n. 18
0
 public ParticleSystemGeometryNode(ParticleData particleData, IncrementDrawCounterDelegate incrementDrawCounter, EffectApplication defaultMaterial)
     : base(defaultMaterial)
 {
     mParticleData         = particleData;
     mIncrementDrawCounter = incrementDrawCounter;
 }
Esempio n. 19
0
 public TerrainGeometryNode(Terrain geometry, int vertexOffset, EffectApplication defaultMaterial)
     : base(defaultMaterial)
 {
     Geometry = geometry;
     VertexOffset = vertexOffset;
 }
Esempio n. 20
0
 public GeometryNode(EffectApplication defaultMaterial)
 {
     mMaterials = new Dictionary<TraversalContext.MaterialFlags, EffectApplication>();
     mMaterials.Add(TraversalContext.MaterialFlags.None, defaultMaterial);
 }
Esempio n. 21
0
 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);
     }
 }
Esempio n. 22
0
        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.
        }
Esempio n. 23
0
 public ModelGeometryNode(ModelMeshPart geometry, EffectApplication defaultMaterial)
     : base(defaultMaterial)
 {
     Geometry = geometry;
 }
Esempio n. 24
0
 public GeometryNode(EffectApplication defaultMaterial)
 {
     mMaterials = new Dictionary <TraversalContext.MaterialFlags, EffectApplication>();
     mMaterials.Add(TraversalContext.MaterialFlags.None, defaultMaterial);
 }
 public ParticleSystemGeometryNode(ParticleData particleData, IncrementDrawCounterDelegate incrementDrawCounter, EffectApplication defaultMaterial)
     : base(defaultMaterial)
 {
     mParticleData = particleData;
     mIncrementDrawCounter = incrementDrawCounter;
 }
Esempio n. 26
0
 public AlphaCutoutGeometryNode(MeshPart geometry, EffectApplication defaultOpaqueMaterial, EffectApplication defaultFringeMaterial)
     : base(geometry, defaultOpaqueMaterial)
 {
     mFringeMaterials = new Dictionary <TraversalContext.MaterialFlags, EffectApplication>();
     mFringeMaterials.Add(TraversalContext.MaterialFlags.None, defaultFringeMaterial);
 }
Esempio n. 27
0
 // 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);
        }
Esempio n. 29
0
 public TerrainGeometryNode(Terrain geometry, int vertexOffset, EffectApplication defaultMaterial)
     : base(defaultMaterial)
 {
     Geometry     = geometry;
     VertexOffset = vertexOffset;
 }
        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);
        }
Esempio n. 31
0
 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);
 }
Esempio n. 33
0
 // 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);
 }
Esempio n. 35
0
        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.
                }
            }
        }
Esempio n. 36
0
        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.
                }
            }
        }