public VolumetricLightSample(Microsoft.Xna.Framework.Game game) : base(game) { SampleFramework.IsMouseVisible = false; // Create a graphics screen. This screen has to call the VolumetricLightRenderer // to handle the VolumetricLightNode! _graphicsScreen = new DeferredGraphicsScreen(Services); _graphicsScreen.DrawReticle = true; GraphicsService.Screens.Insert(0, _graphicsScreen); GameObjectService.Objects.Add(new DeferredGraphicsOptionsObject(Services)); Services.Register(typeof(DebugRenderer), null, _graphicsScreen.DebugRenderer); Services.Register(typeof(IScene), null, _graphicsScreen.Scene); // Add gravity and damping to the physics simulation. Simulation.ForceEffects.Add(new Gravity()); Simulation.ForceEffects.Add(new Damping()); // Add a custom game object which controls the camera. var cameraGameObject = new CameraObject(Services); GameObjectService.Objects.Add(cameraGameObject); _graphicsScreen.ActiveCameraNode = cameraGameObject.CameraNode; GameObjectService.Objects.Add(new GrabObject(Services)); GameObjectService.Objects.Add(new DynamicSkyObject(Services, true, false, true) { #if XBOX Time = new DateTime(2014, 06, 01, 0, 0, 0, 0), #else Time = new DateTimeOffset(2014, 06, 01, 0, 0, 0, 0, TimeSpan.Zero), #endif }); //GameObjectService.Objects.Add(new GroundObject(Services)); // Add a ground plane with some detail to see the water refractions. Simulation.RigidBodies.Add(new RigidBody(new PlaneShape(new Vector3F(0, 1, 0), 0))); GameObjectService.Objects.Add(new StaticObject(Services, "Gravel/Gravel", 1, new Pose(new Vector3F(0, 0.001f, 0)))); GameObjectService.Objects.Add(new DudeObject(Services)); GameObjectService.Objects.Add(new DynamicObject(Services, 1)); GameObjectService.Objects.Add(new DynamicObject(Services, 2)); GameObjectService.Objects.Add(new DynamicObject(Services, 3)); GameObjectService.Objects.Add(new DynamicObject(Services, 4)); GameObjectService.Objects.Add(new DynamicObject(Services, 5)); GameObjectService.Objects.Add(new DynamicObject(Services, 6)); GameObjectService.Objects.Add(new DynamicObject(Services, 7)); GameObjectService.Objects.Add(new ObjectCreatorObject(Services)); GameObjectService.Objects.Add(new FogObject(Services)); var lavaBallsObject = new LavaBallsObject(Services); GameObjectService.Objects.Add(lavaBallsObject); lavaBallsObject.Spawn(); // Add a few palm trees. Random random = new Random(12345); for (int i = 0; i < 10; i++) { Vector3F position = new Vector3F(random.NextFloat(-3, -8), 0, random.NextFloat(0, -5)); Matrix33F orientation = Matrix33F.CreateRotationY(random.NextFloat(0, ConstantsF.TwoPi)); float scale = random.NextFloat(0.5f, 1.2f); GameObjectService.Objects.Add(new StaticObject(Services, "PalmTree/palm_tree", scale, new Pose(position, orientation))); } // Add some additional test lights GameObjectService.Objects.Add(new TestLightsObject(Services)); // The following lights are not needed. _graphicsScreen.Scene.GetDescendants().First(n => n.Name == "AmbientLight").IsEnabled = false; _graphicsScreen.Scene.GetDescendants().First(n => n.Name == "DirectionalLightWithShadow").IsEnabled = false; // Add a volumetric light node under each light node (except ambient and directional lights). foreach (var lightNode in _graphicsScreen.Scene.GetSubtree().OfType <LightNode>()) { if (lightNode.Light is PointLight || lightNode.Light is Spotlight || lightNode.Light is ProjectorLight) { if (lightNode.Children == null) { lightNode.Children = new SceneNodeCollection(); } lightNode.Children.Add(new VolumetricLightNode { Color = new Vector3F(0.1f), NumberOfSamples = _numberOfSamples, MipMapBias = _mipMapBias, }); } } // Get the renderer used by the screen. _volumetricLightRenderer = _graphicsScreen.AlphaBlendSceneRenderer.Renderers.OfType <VolumetricLightRenderer>().First(); }
public VolumetricLightSample(Microsoft.Xna.Framework.Game game) : base(game) { SampleFramework.IsMouseVisible = false; // Create a graphics screen. This screen has to call the VolumetricLightRenderer // to handle the VolumetricLightNode! _graphicsScreen = new DeferredGraphicsScreen(Services); _graphicsScreen.DrawReticle = true; GraphicsService.Screens.Insert(0, _graphicsScreen); GameObjectService.Objects.Add(new DeferredGraphicsOptionsObject(Services)); Services.Register(typeof(DebugRenderer), null, _graphicsScreen.DebugRenderer); Services.Register(typeof(IScene), null, _graphicsScreen.Scene); // Add gravity and damping to the physics simulation. Simulation.ForceEffects.Add(new Gravity()); Simulation.ForceEffects.Add(new Damping()); // Add a custom game object which controls the camera. var cameraGameObject = new CameraObject(Services); GameObjectService.Objects.Add(cameraGameObject); _graphicsScreen.ActiveCameraNode = cameraGameObject.CameraNode; GameObjectService.Objects.Add(new GrabObject(Services)); GameObjectService.Objects.Add(new DynamicSkyObject(Services, true, false, true) { #if XBOX Time = new DateTime(2014, 06, 01, 0, 0, 0, 0), #else Time = new DateTimeOffset(2014, 06, 01, 0, 0, 0, 0, TimeSpan.Zero), #endif }); //GameObjectService.Objects.Add(new GroundObject(Services)); // Add a ground plane with some detail to see the water refractions. Simulation.RigidBodies.Add(new RigidBody(new PlaneShape(new Vector3F(0, 1, 0), 0))); GameObjectService.Objects.Add(new StaticObject(Services, "Gravel/Gravel", 1, new Pose(new Vector3F(0, 0.001f, 0)))); GameObjectService.Objects.Add(new DudeObject(Services)); GameObjectService.Objects.Add(new DynamicObject(Services, 1)); GameObjectService.Objects.Add(new DynamicObject(Services, 2)); GameObjectService.Objects.Add(new DynamicObject(Services, 3)); GameObjectService.Objects.Add(new DynamicObject(Services, 4)); GameObjectService.Objects.Add(new DynamicObject(Services, 5)); GameObjectService.Objects.Add(new DynamicObject(Services, 6)); GameObjectService.Objects.Add(new DynamicObject(Services, 7)); GameObjectService.Objects.Add(new ObjectCreatorObject(Services)); GameObjectService.Objects.Add(new FogObject(Services)); var lavaBallsObject = new LavaBallsObject(Services); GameObjectService.Objects.Add(lavaBallsObject); lavaBallsObject.Spawn(); // Add a few palm trees. Random random = new Random(12345); for (int i = 0; i < 10; i++) { Vector3F position = new Vector3F(random.NextFloat(-3, -8), 0, random.NextFloat(0, -5)); Matrix33F orientation = Matrix33F.CreateRotationY(random.NextFloat(0, ConstantsF.TwoPi)); float scale = random.NextFloat(0.5f, 1.2f); GameObjectService.Objects.Add(new StaticObject(Services, "PalmTree/palm_tree", scale, new Pose(position, orientation))); } // Add some additional test lights GameObjectService.Objects.Add(new TestLightsObject(Services)); // The following lights are not needed. _graphicsScreen.Scene.GetDescendants().First(n => n.Name == "AmbientLight").IsEnabled = false; _graphicsScreen.Scene.GetDescendants().First(n => n.Name == "DirectionalLightWithShadow").IsEnabled = false; // Add a volumetric light node under each light node (except ambient and directional lights). foreach (var lightNode in _graphicsScreen.Scene.GetSubtree().OfType<LightNode>()) { if (lightNode.Light is PointLight || lightNode.Light is Spotlight || lightNode.Light is ProjectorLight) { if (lightNode.Children == null) lightNode.Children = new SceneNodeCollection(); lightNode.Children.Add(new VolumetricLightNode { Color = new Vector3F(0.1f), NumberOfSamples = _numberOfSamples, MipMapBias = _mipMapBias, }); } } // Get the renderer used by the screen. _volumetricLightRenderer = _graphicsScreen.AlphaBlendSceneRenderer.Renderers.OfType<VolumetricLightRenderer>().First(); }