private void TriangulateWithRiverBeginOrEnd(VoronoiCell cell, VoronoiDirection direction, Vector3 center, EdgeVertices e) { EdgeVertices m = new EdgeVertices( Vector3.Lerp(center, e.V1, 0.5f), Vector3.Lerp(center, e.V5, 0.5f) ); m.V3 = Vector3.ClampMagnitude(m.V3, cell.StreamBedElevation); TriangulateEdgeStrip(m, cell.Color, e, cell.Color); TriangulateEdgeFan(center, m, cell.Color); bool reversed = cell.HasIncomingRiver; TriangulateRiverQuad(m.V2, m.V4, e.V2, e.V4, cell.RiverSurfaceElevation, 0.6f, reversed); center = Vector3.ClampMagnitude(center, cell.RiverSurfaceElevation); m.V2 = Vector3.ClampMagnitude(m.V2, cell.RiverSurfaceElevation); m.V4 = Vector3.ClampMagnitude(m.V4, cell.RiverSurfaceElevation); Rivers.AddTriangle(center, m.V2, m.V4); if (reversed) { Rivers.AddTriangleUV(new Vector2(0.5f, 0.4f), new Vector2(1f, 0.2f), new Vector2(0f, 0.2f)); } else { Rivers.AddTriangleUV(new Vector2(0.5f, 0.4f), new Vector2(0f, 0.6f), new Vector2(1f, 0.6f)); } }
private void TriangulateRoad(Vector3 center, Vector3 mL, Vector3 mR, EdgeVertices e, bool hasRoadThroughCellEdge) { if (hasRoadThroughCellEdge) { Vector3 mC = Vector3.Lerp(mL, mR, 0.5f); TriangulateRoadSegment(mL, mC, mR, e.V2, e.V3, e.V4); Roads.AddTriangle(center, mL, mC); Roads.AddTriangle(center, mC, mR); Roads.AddTriangleUV(new Vector2(1f, 0f), new Vector2(0f, 0f), new Vector2(1f, 0f)); Roads.AddTriangleUV(new Vector2(1f, 0f), new Vector2(1f, 0f), new Vector2(0f, 0f)); } else { TriangulateRoadEdge(center, mL, mR); } }