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