示例#1
0
 private void AddDecal(TerrainDecalLayer decal)
 {
     // Decals are added to the layers of a tile. We have to add the decal to each terrain tile
     // which it overlaps.
     foreach (var tile in _terrainObject.TerrainNode.Terrain.Tiles)
     {
         if (GeometryHelper.HaveContact(tile.Aabb, decal.Aabb.Value))
         {
             tile.Layers.Add(decal);
         }
     }
 }
示例#2
0
        public TerrainDecalSample(Microsoft.Xna.Framework.Game game)
            : base(game)
        {
            SampleFramework.IsMouseVisible = false;

            _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);

            var scene = _graphicsScreen.Scene;

            Services.Register(typeof(IScene), null, 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 cameraObject = new CameraObject(Services, 5000);

            cameraObject.ResetPose(new Vector3F(0, 2, 5), 0, 0);
            GameObjectService.Objects.Add(cameraObject);
            _graphicsScreen.ActiveCameraNode = cameraObject.CameraNode;

            // Add standard game objects.
            GameObjectService.Objects.Add(new GrabObject(Services));
            GameObjectService.Objects.Add(new ObjectCreatorObject(Services));
            GameObjectService.Objects.Add(new LavaBallsObject(Services));
            GameObjectService.Objects.Add(new DynamicSkyObject(Services, true, false, true)
            {
                EnableCloudShadows = false,
            });
            GameObjectService.Objects.Add(new FogObject(Services));

            // Create terrain.
            _terrainObject = new TerrainObject(Services);
            GameObjectService.Objects.Add(_terrainObject);

            // Add a blood decal to the terrain.
            var decal0 = new TerrainDecalLayer(GraphicsService)
            {
                Pose            = GetRandomPose(),
                Width           = 2,
                Height          = 2,
                DiffuseColor    = new Vector3F(0.08f),
                SpecularColor   = new Vector3F(0.2f),
                SpecularPower   = 100,
                DiffuseTexture  = ContentManager.Load <Texture2D>("Decals/Decal_diffuse_mask"), // Original: "Decals/Blood_diffuse_mask",
                NormalTexture   = GraphicsService.GetDefaultNormalTexture(),                    // Original: ContentManager.Load<Texture2D>("Decals/Blood_normal"),
                SpecularTexture = GraphicsService.GetDefaultTexture2DWhite(),                   // Original: ContentManager.Load<Texture2D>("Decals/Blood_specular"),
                FadeOutStart    = 3,
                FadeOutEnd      = 5,
                Alpha           = 0.9f,
            };

            AddDecal(decal0);

            // Add a black blood decal (oil spill?)
            var decal1 = new TerrainDecalLayer(GraphicsService)
            {
                Pose            = GetRandomPose(),
                Width           = 2,
                Height          = 2,
                DiffuseColor    = new Vector3F(0.0f),
                SpecularColor   = new Vector3F(0.5f),
                SpecularPower   = 100,
                DiffuseTexture  = ContentManager.Load <Texture2D>("Decals/Decal_diffuse_mask"), // Original: "Decals/Blood_diffuse_mask",
                NormalTexture   = GraphicsService.GetDefaultNormalTexture(),                    // Original: ContentManager.Load<Texture2D>("Decals/Blood_normal"),
                SpecularTexture = GraphicsService.GetDefaultTexture2DWhite(),                   // Original: ContentManager.Load<Texture2D>("Decals/Blood_specular"),
                FadeOutStart    = 3,
                FadeOutEnd      = 5,
            };

            AddDecal(decal1);

            // Add more random decals. The decals can share materials!
            var decal0Material = decal0.Material;

            for (int i = 0; i < 50; i++)
            {
                var decal = new TerrainDecalLayer(decal0Material)
                {
                    Pose   = GetRandomPose(),
                    Width  = 2,
                    Height = 2,
                };
                AddDecal(decal);
            }
        }