void GenerateRiver() { var param = new RiverParameter { ChunkSize = parameter.chunkSize, NumberOfChunk = parameter.numberOfChunk, HeadwaterIsOutside = parameter.headwaterIsOutside, MinInitialWidth = parameter.minInitialRiverWidth, MaxInitialWidth = parameter.maxInitialRiverWidth, AngleRange = parameter.angleRange, StepSize = parameter.riverStepSize, MinInitialBranchingProbability = parameter.minInitialBranchingProbability, MaxInitialBranchingProbability = parameter.maxInitialBranchingProbability, MinNumStepWithoutBranching = parameter.minNumStepWithoutBranching, MaxNumStepWithoutBranching = parameter.maxNumStepWithoutBranching, BendabilityAttenuation = parameter.bendabilityAttenuation, }; river.Generate(param, random); fieldPoints.AddRange(river.Points); }
public void Generate(RiverParameter parameter, System.Random random) { lastInterruptionTime = System.DateTime.Now; this.parameter = parameter; this.random = random; width = Mathf.Lerp(parameter.MinInitialWidth, parameter.MaxInitialWidth, (float)random.NextDouble()); branchingProbability = CalcBranchingProbability(); numStepWithoutBranching = CalcNumStepWithoutBranching(); points.Clear(); vertices.Clear(); riverPointsMap.Clear(); leftRightPoints.Clear(); pointLevels.Clear(); quadranglesMap.Clear(); Vector3 initialPosition = DecideInitialPosition(); float initialAngle = DecideInitialAngle(initialPosition); rootPoint = new RiverPoint(); rootPoint.Position = initialPosition; rootPoint.Width = width; AddToPointMap(rootPoint); var step = new Vector3(0, 0, parameter.StepSize); Vector3 initialDir = Quaternion.Euler(0, initialAngle, 0) * step; minAngleForBranching = Mathf.Atan2(width * 0.5f, parameter.StepSize) * Mathf.Rad2Deg * 2; canBranch = parameter.AngleRange >= minAngleForBranching; GenerateRiverRecursive(rootPoint, initialDir, 1); ConnectPoints(); for (int i0 = 0; i0 < leftRightPoints.Count - 1; ++i0) { if (pointLevels[i0 + 1] - pointLevels[i0] == 1) { Vector3 point1, point2, point3, point4; point1 = leftRightPoints[i0][0]; point2 = leftRightPoints[i0 + 1][0]; point3 = leftRightPoints[i0 + 1][1]; point4 = leftRightPoints[i0][1]; Vector2Int chunk1, chunk2, chunk3, chunk4; chunk1 = GetChunk(point1); chunk2 = GetChunk(point2); chunk3 = GetChunk(point3); chunk4 = GetChunk(point4); var chunks = new List <Vector2Int>(); chunks.Add(chunk1); if (chunk2 != chunk1) { chunks.Add(chunk2); } if (chunk3 != chunk1 && chunk3 != chunk2) { chunks.Add(chunk3); } if (chunk4 != chunk1 && chunk4 != chunk2 && chunk4 != chunk3) { chunks.Add(chunk4); } for (int i1 = 0; i1 < chunks.Count; ++i1) { Vector2Int chunk = chunks[i1]; List <Vector3[]> quadrangles; if (quadranglesMap.TryGetValue(chunk, out quadrangles) == false) { quadrangles = new List <Vector3[]>(); quadranglesMap.Add(chunk, quadrangles); } quadrangles.Add(new Vector3[] { point1, point2, point3, point4 }); } } } }