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++; } }