Пример #1
0
        /// <summary>
        /// Cast shadow.(Prepare shadow mapping texture)
        /// </summary>
        /// <param name="param"></param>
        public override void Act(ActionParams param)
        {
            Scene scene = this.scene;

            // Render ambient color.
            {
                var arg = new ShadowMappingAmbientEventArgs(param, scene.Camera, scene.AmbientColor);
                RenderAmbientColor(scene.RootNode, arg);
            }

            foreach (var light in scene.Lights)
            {
                if (light is SpotLight || light is DirectionalLight)
                {
                    LightTheScene(light, scene, param);
                }
                else if (light is PointLight)
                {
                    var xLight = new TSpotLight(light.Position, TSpotLightDirection.X, light.Attenuation)
                    {
                        Diffuse = light.Diffuse, Specular = light.Specular,
                    };
                    var nxLight = new TSpotLight(light.Position, TSpotLightDirection.NX, light.Attenuation)
                    {
                        Diffuse = light.Diffuse, Specular = light.Specular,
                    };
                    var yLight = new TSpotLight(light.Position, TSpotLightDirection.Y, light.Attenuation)
                    {
                        Diffuse = light.Diffuse, Specular = light.Specular,
                    };
                    var nyLight = new TSpotLight(light.Position, TSpotLightDirection.NY, light.Attenuation)
                    {
                        Diffuse = light.Diffuse, Specular = light.Specular,
                    };
                    var zLight = new TSpotLight(light.Position, TSpotLightDirection.Z, light.Attenuation)
                    {
                        Diffuse = light.Diffuse, Specular = light.Specular,
                    };
                    var nzLight = new TSpotLight(light.Position, TSpotLightDirection.NZ, light.Attenuation)
                    {
                        Diffuse = light.Diffuse, Specular = light.Specular,
                    };
                    var lights = new TSpotLight[] { xLight, nxLight, yLight, nyLight, zLight, nzLight };
                    foreach (var item in lights)
                    {
                        LightTheScene(item, scene, param);
                    }
                }
                else
                {
                    throw new Exception(string.Format("Unexpected light type:{0}", light.GetType().FullName));
                }
            }
        }
Пример #2
0
        private void RenderAmbientColor(SceneNodeBase sceneNodeBase, ShadowMappingAmbientEventArgs arg)
        {
            if (sceneNodeBase != null)
            {
                var      node     = sceneNodeBase as ISupportShadowMapping;
                TwoFlags flags    = (node != null) ? node.EnableShadowMapping : TwoFlags.None;
                bool     before   = (node != null) && ((flags & TwoFlags.BeforeChildren) == TwoFlags.BeforeChildren);
                bool     children = (node == null) || ((flags & TwoFlags.Children) == TwoFlags.Children);

                if (before)
                {
                    node.RenderAmbientColor(arg);
                }

                if (children)
                {
                    foreach (var item in sceneNodeBase.Children)
                    {
                        RenderAmbientColor(item, arg);
                    }
                }
            }
        }