/// <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)); } } }
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); } } } }