コード例 #1
0
    //Create an offset in node and face arrays
    void moveNodesInArray(int offset)
    {
        WaterNode[] newArr = new WaterNode[nodes.Length];

        for (int i = 0; i < nodes.Length; i++)
        {
            int index = (i - offset) % nodes.Length;
            if (index < 0)
            {
                index = nodes.Length + index;
            }
            newArr[index] = nodes[i];
        }
        nodes = newArr;

        Mesh[]       meshArr        = new Mesh[meshes.Length];
        GameObject[] meshObjectsArr = new GameObject[meshes.Length];

        for (int i = 0; i < meshes.Length; i++)
        {
            int index = (i - offset) % meshes.Length;
            if (index < 0)
            {
                index = meshes.Length + index;
            }
            meshArr[index]        = meshes[i];
            meshObjectsArr[index] = meshObjects[i];
        }
        meshes      = meshArr;
        meshObjects = meshObjectsArr;
    }
コード例 #2
0
 // OnUnload() is called when the GameObject is removed from the IGameObjectService.
 protected override void OnUnload()
 {
     // Remove model and rigid body.
     _waterNode.Parent.Children.Remove(_waterNode);
     _waterNode.Dispose(false);
     _waterNode = null;
 }
コード例 #3
0
ファイル: Water.cs プロジェクト: nicoloLinder/Platform
    public void InitializeWater()
    {
        int edgeCount = Mathf.RoundToInt(width) * 5;
        int nodeCount = edgeCount + 1;

        waterSurface = gameObject.AddComponent <EdgeCollider2D> ();
        //waterSurface.points = new Vector2 [nodeCount];
        waterSurface.isTrigger = true;
        waterSurface.points    = new Vector2 [] { new Vector2(-width / 2f, baseHeight), new Vector2(width / 2f, baseHeight) };

        foamLine = GetComponent <LineRenderer> ();


        waterNodes             = new WaterNode [nodeCount];
        foamLine.positionCount = nodeCount;

        for (int i = 0; i < nodeCount; i++)
        {
            waterNodes [i] = new WaterNode(new Vector2((-width / 2f) + width * i / edgeCount, baseHeight), 0, 0);
            foamLine.SetPosition(i, transform.TransformPoint(waterNodes [i].Position));
        }

        mesh = new Mesh();
        Vector3 [] vertices = new Vector3 [nodeCount * 2];
        Vector2 [] UVs      = new Vector2 [nodeCount * 2];
        int []     tris     = new int [(vertices.Length - 1) * 3];

        int triangleIndex = 0;

        for (int i = 0; i < nodeCount - 1; i++)
        {
            vertices [i]                 = waterNodes [i].Position;
            vertices [i + 1]             = waterNodes [i + 1].Position;
            vertices [i + nodeCount]     = new Vector3(waterNodes [i].Position.x, 0);
            vertices [i + 1 + nodeCount] = new Vector3(waterNodes [i + 1].Position.x, 0);

            UVs [i]                 = new Vector2((float)i / nodeCount, 1);
            UVs [i + 1]             = new Vector2((float)(i + 1) / nodeCount, 1);
            UVs [i + nodeCount]     = new Vector2((float)i / nodeCount, 0);
            UVs [i + nodeCount + 1] = new Vector2((float)(i + 1) / nodeCount, 0);

            tris [triangleIndex++] = i;
            tris [triangleIndex++] = i + nodeCount + 1;
            tris [triangleIndex++] = i + nodeCount;
            tris [triangleIndex++] = i + nodeCount + 1;
            tris [triangleIndex++] = i;
            tris [triangleIndex++] = i + 1;
        }
        mesh.vertices  = vertices;
        mesh.uv        = UVs;
        mesh.triangles = tris;

        GetComponent <MeshFilter> ().mesh = mesh;
    }
コード例 #4
0
        public void UpdateSubmesh(IGraphicsService graphicsService, WaterNode node)
        {
            if (node.Volume == null)
            {
                return;
            }

            // We have to update the submesh if it is null or disposed.
            //   Submesh == null                            --> Update
            //   Submesh != null && VertexBuffer.IsDisposed --> Update
            //   Submesh != null && VertexBuffer == null    --> This is the EmptyShape. No updated needed.
            if (Submesh == null || (Submesh.VertexBuffer != null && Submesh.VertexBuffer.IsDisposed))
            {
                ShapeMeshCache.GetMesh(graphicsService, node.Volume, out Submesh, out SubmeshMatrix);
            }
        }
コード例 #5
0
        protected override void OnLoad()
        {
            var scene   = (Scene)_services.GetInstance <IScene>();
            var content = _services.GetInstance <ContentManager>();

            // Define the appearance of the water.
            var waterOcean = new Water
            {
                SpecularColor = new Vector3F(20f),
                SpecularPower = 500,

                NormalMap0 = null,
                NormalMap1 = null,

                RefractionDistortion = 0.1f,
                ReflectionColor      = new Vector3F(0.2f),
                RefractionColor      = new Vector3F(0.6f),

                //UnderwaterFogDensity = new Vector3F(1, 0.8f, 0.6f),
                //WaterColor = new Vector3F(0.2f, 0.4f, 0.5f),
                UnderwaterFogDensity = new Vector3F(12, 8, 8) * 0.02f,
                WaterColor           = new Vector3F(60, 30, 19) * 0.002f,

                // Water is scattered in high waves and this makes the wave crests brighter.
                // ScatterColor defines the intensity of this effect.
                ScatterColor = new Vector3F(0.05f, 0.1f, 0.1f),

                // Foam is automatically rendered where the water intersects geometry and
                // where wave are high.
                FoamMap      = content.Load <Texture2D>("Water/Foam"),
                FoamMapScale = 5,
                FoamColor    = new Vector3F(1),
                FoamCrestMin = 0.3f,
                FoamCrestMax = 0.8f,

                // Approximate underwater caustics are computed in real-time from the waves.
                CausticsSampleCount = 0,
                CausticsIntensity   = 3,
                CausticsPower       = 100,
            };

            // If we do not specify a shape in the WaterNode constructor, we get an infinite
            // water plane.
            _waterNode = new WaterNode(waterOcean, null)
            {
                PoseWorld        = new Pose(new Vector3F(0, -100, 0)),
                SkyboxReflection = scene.GetDescendants().OfType <SkyboxNode>().First(),

                // ExtraHeight must be set to a value greater than the max. wave height.
                ExtraHeight = 2,
            };
            scene.Children.Add(_waterNode);

            // OceanWaves can be set to displace water surface using a displacement map.
            // The displacement map is computed by the WaterWaveRenderer (see DeferredGraphicsScreen)
            // using FFT and a statistical ocean model.
            _waterNode.Waves = new OceanWaves
            {
                TextureSize      = 256,
                HeightScale      = 0.008f,
                Wind             = new Vector3F(10, 0, 10),
                Directionality   = 1,
                Choppiness       = 1,
                TileSize         = 20,
                EnableCpuQueries = false,
            };

            CreateGuiControls();
        }
コード例 #6
0
 void createNode(int i)
 {
     nodes[i] = new WaterNode(leftPosition + WIDTH * i / edgeCount, TOP_POSITION);
 }
コード例 #7
0
ファイル: OceanSample.cs プロジェクト: terrynoya/DigitalRune
        public OceanSample(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);
            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;

            // More standard objects.
            GameObjectService.Objects.Add(new GrabObject(Services));
            GameObjectService.Objects.Add(new ObjectCreatorObject(Services));
            //GameObjectService.Objects.Add(new StaticSkyObject(Services));
            var dynamicSkyObject = new DynamicSkyObject(Services, true, false, true);

            GameObjectService.Objects.Add(dynamicSkyObject);

            // Add an island model.
            GameObjectService.Objects.Add(new StaticObject(Services, "Island/Island", new Vector3F(30), new Pose(new Vector3F(0, 0.75f, 0)), true, true));

            GameObjectService.Objects.Add(new DynamicObject(Services, 1));
            GameObjectService.Objects.Add(new DynamicObject(Services, 2));
            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 FogObject(Services)
            {
                AttachToCamera = true
            });

            // The LavaBalls class controls all lava ball instances.
            var lavaBalls = new LavaBallsObject(Services);

            GameObjectService.Objects.Add(lavaBalls);

            // Add a few palm trees.
            Random random = new Random(12345);

            for (int i = 0; i < 20; i++)
            {
                Vector3F  position    = new Vector3F(random.NextFloat(-7, 4), 0, random.NextFloat(13, 18));
                Matrix33F orientation = Matrix33F.CreateRotationY(random.NextFloat(0, ConstantsF.TwoPi));
                float     scale       = random.NextFloat(0.8f, 1.2f);
                GameObjectService.Objects.Add(new StaticObject(Services, "PalmTree/palm_tree", scale, new Pose(position, orientation)));
            }

            // Define the appearance of the water.
            var waterOcean = new Water
            {
                SpecularColor = new Vector3F(20f),
                SpecularPower = 500,

                NormalMap0 = null,
                NormalMap1 = null,

                RefractionDistortion = 0.1f,
                ReflectionColor      = new Vector3F(0.2f),
                RefractionColor      = new Vector3F(0.6f),

                // Water is scattered in high waves and this makes the wave crests brighter.
                // ScatterColor defines the intensity of this effect.
                ScatterColor = new Vector3F(0.05f, 0.1f, 0.1f),

                // Foam is automatically rendered where the water intersects geometry and
                // where wave are high.
                FoamMap      = ContentManager.Load <Texture2D>("Water/Foam"),
                FoamMapScale = 5,
                FoamColor    = new Vector3F(1),
                FoamCrestMin = 0.3f,
                FoamCrestMax = 0.8f,

                // Approximate underwater caustics are computed in real-time from the waves.
                CausticsSampleCount = 3,
                CausticsIntensity   = 3,
                CausticsPower       = 100,
            };

            // If we do not specify a shape in the WaterNode constructor, we get an infinite
            // water plane.
            _waterNode = new WaterNode(waterOcean, null)
            {
                PoseWorld        = new Pose(new Vector3F(0, 0.5f, 0)),
                SkyboxReflection = _graphicsScreen.Scene.GetDescendants().OfType <SkyboxNode>().First(),

                // ExtraHeight must be set to a value greater than the max. wave height.
                ExtraHeight = 2,
            };
            _graphicsScreen.Scene.Children.Add(_waterNode);

            // OceanWaves can be set to displace water surface using a displacement map.
            // The displacement map is computed by the WaterWaveRenderer (see DeferredGraphicsScreen)
            // using FFT and a statistical ocean model.
            _waterNode.Waves = new OceanWaves
            {
                TextureSize    = 256,
                HeightScale    = 0.004f,
                Wind           = new Vector3F(10, 0, 10),
                Directionality = 1,
                Choppiness     = 1,
                TileSize       = 20,

                // If we enable CPU queries, we can call OceanWaves.GetDisplacement()
                // (see Update() method below).
                EnableCpuQueries = true,
            };

            // Optional: Use a planar reflection instead of the skybox reflection.
            // We add a PlanarReflectionNode as a child of the WaterNode.
            var renderToTexture = new RenderToTexture
            {
                Texture = new RenderTarget2D(GraphicsService.GraphicsDevice, 512, 512, false, SurfaceFormat.HdrBlendable, DepthFormat.None),
            };
            var planarReflectionNode = new PlanarReflectionNode(renderToTexture)
            {
                Shape       = _waterNode.Shape,
                NormalLocal = new Vector3F(0, 1, 0),
                IsEnabled   = false,
            };

            _waterNode.PlanarReflection = planarReflectionNode;
            _waterNode.Children         = new SceneNodeCollection(1)
            {
                planarReflectionNode
            };

            // To let rigid bodies swim, we add a Buoyancy force effect. This force effect
            // computes buoyancy of a flat water surface.
            Simulation.ForceEffects.Add(new Buoyancy
            {
                Surface     = new Plane(new Vector3F(0, 1, 0), _waterNode.PoseWorld.Position.Y),
                Density     = 1500,
                AngularDrag = 0.3f,
                LinearDrag  = 3,
            });
        }
コード例 #8
0
        public WaterSample(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);
            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;

            // More standard objects.
            GameObjectService.Objects.Add(new GrabObject(Services));
            GameObjectService.Objects.Add(new ObjectCreatorObject(Services));
            //GameObjectService.Objects.Add(new StaticSkyObject(Services));
            var dynamicSkyObject = new DynamicSkyObject(Services, true, false, true);

            GameObjectService.Objects.Add(dynamicSkyObject);

            // Add a ground plane with some detail to see the water refractions.
            Simulation.RigidBodies.Add(new RigidBody(new PlaneShape(new Vector3(0, 1, 0), 0)));
            GameObjectService.Objects.Add(new StaticObject(Services, "Gravel/Gravel", 1, new Pose(new Vector3(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, 5));
            GameObjectService.Objects.Add(new DynamicObject(Services, 6));
            GameObjectService.Objects.Add(new DynamicObject(Services, 7));
            GameObjectService.Objects.Add(new FogObject(Services)
            {
                AttachToCamera = true
            });

            // The LavaBalls class controls all lava ball instances.
            var lavaBalls = new LavaBallsObject(Services);

            GameObjectService.Objects.Add(lavaBalls);

            // Add a few palm trees.
            var random = new Random(12345);

            for (int i = 0; i < 10; i++)
            {
                Vector3 position    = new Vector3(random.NextFloat(-3, -8), 0, random.NextFloat(0, -5));
                Matrix  orientation = Matrix.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)));
            }

            // Define the appearance of the water.
            var water = new Water
            {
                SpecularColor = new Vector3(10f),

                // Small water ripples/waves are created using scrolling normal maps.
                NormalMap0         = ContentManager.Load <Texture2D>("Water/Wave0"),
                NormalMap1         = ContentManager.Load <Texture2D>("Water/Wave1"),
                NormalMap0Scale    = 1.8f,
                NormalMap1Scale    = 2.2f,
                NormalMap0Velocity = new Vector3(-0.02f, 0, 0.03f),
                NormalMap1Velocity = new Vector3(0.02f, 0, -0.03f),
                NormalMap0Strength = 0.5f,
                NormalMap1Strength = 0.5f,

                ReflectionDistortion = 0.2f,
                ReflectionColor      = new Vector3(0.7f),
                RefractionDistortion = 0.05f,
            };

            // Create a box-shaped body of water.
            // We use a TransformedShape containing a BoxShape because the top of the
            // water body must be at height 0.
            var shape = new TransformedShape(new GeometricObject(
                                                 new BoxShape(10, 1, 20),
                                                 new Pose(new Vector3(0, -0.5f, 0))));

            _waterNode0 = new WaterNode(water, shape)
            {
                PoseWorld              = new Pose(new Vector3(-1, 0.5f, 0), Matrix.CreateRotationY(0.1f)),
                SkyboxReflection       = _graphicsScreen.Scene.GetDescendants().OfType <SkyboxNode>().First(),
                DepthBufferWriteEnable = true,
            };
            _graphicsScreen.Scene.Children.Add(_waterNode0);

            // Optional: Create a WaterFlow to move the water using a flow texture.
            _waterFlow0 = new WaterFlow
            {
                FlowMapSpeed     = 0.5f,
                FlowMap          = GenerateFlowMap(),
                CycleDuration    = 3f,
                NoiseMapStrength = 0.1f,
                NoiseMapScale    = 0.5f,
            };
            _waterNode0.Flow = _waterFlow0;

            // Optional: Use a planar reflection instead of the skybox reflection.
            // We add a PlanarReflectionNode as a child of the WaterNode.
            var renderToTexture = new RenderToTexture
            {
                Texture = new RenderTarget2D(GraphicsService.GraphicsDevice, 512, 512, false, SurfaceFormat.HdrBlendable, DepthFormat.None),
            };
            var planarReflectionNode = new PlanarReflectionNode(renderToTexture)
            {
                // Same shape as WaterNode.
                Shape = _waterNode0.Shape,

                // Reflection plane is horizontal.
                NormalLocal = new Vector3(0, 1, 0),
            };

            _waterNode0.PlanarReflection = planarReflectionNode;
            _waterNode0.Children         = new SceneNodeCollection(1)
            {
                planarReflectionNode
            };

            // Create a short river with an inclined water surface.
            // Using a WaterFlow with a SurfaceSlopeSpeed, the water automatically flows
            // down the inclined surface.
            _waterNode1 = new WaterNode(water, GetSpiralShape())
            {
                PoseWorld = new Pose(new Vector3(10, 1.5f, 0), Matrix.CreateRotationY(0.1f)),
                EnableUnderwaterEffect = false,
                SkyboxReflection       = _graphicsScreen.Scene.GetDescendants().OfType <SkyboxNode>().First(),
                Flow = new WaterFlow
                {
                    SurfaceSlopeSpeed = 0.5f,
                    CycleDuration     = 2f,
                    NoiseMapStrength  = 0.1f,
                    NoiseMapScale     = 1,
                }
            };
            _graphicsScreen.Scene.Children.Add(_waterNode1);
        }