Beispiel #1
0
        public List <BasinVertex> basinVertices;                // the basin points

        public WaterSeed(Terrain_holistic _T, Vector3 _position, float _flow)
        {
            T    = _T;
            flow = _flow;

            Vector2 uv = T.worldToTerrainUV(_position);
            Vector3 n  = T.thisTerrain.terrainData.GetInterpolatedNormal(uv.x, uv.y);

            source = new BasinVertex(_position, uv, n);

            updateBasin();
        }
Beispiel #2
0
        private void updateBasin()
        {
            // Reset collection
            basinVertices = new List <BasinVertex>();

            // Start eroding again
            erosionStrength = 1.0f;

            // Add source
            basinVertices.Add(source);

            int safe = 300;
            int step = 0;

            BasinVertex prev = source;

            // Gradient descent (gross sort of...)
            while (step < safe)
            {
                Vector3 p   = prev.position + 10 * prev.normal;
                Vector2 puv = T.worldToTerrainUV(p);
                Vector3 pn  = T.thisTerrain.terrainData.GetInterpolatedNormal(puv.x, puv.y);
                Vector3 pp  = T.terrainUVToWorld(puv);

                // Reached a local minimum?
                if (pn.y > minimaLimit)
                {
                    break;
                }

                BasinVertex v = new BasinVertex(pp, puv, pn);
                basinVertices.Add(v);

                prev = v;
                step++;
            }
        }
        public WaterSeed(Terrain_holistic _T, Vector3 _position, float _flow)
        {
            T = _T;
            flow = _flow;

            Vector2 uv = T.worldToTerrainUV(_position);
            Vector3 n = T.thisTerrain.terrainData.GetInterpolatedNormal(uv.x, uv.y);
            source = new BasinVertex(_position, uv, n);

            updateBasin();
        }