void TriangulateBoundaryTriangle(Vector3 begin, Color beginColor, Vector3 left, Color leftColor, Vector3 boundary, Color boundaryColor, Vector3 types) { Vector3 v2 = HexMetric.Perturb(HexMetric.TerraceLerp(begin, left, 1)); Color c2 = HexMetric.TerraceLerp(beginColor, leftColor, 1); // first triangle terrain.AddTriangleUnperturbed(HexMetric.Perturb(begin), v2, boundary); terrain.AddTriangleColor(beginColor, c2, boundaryColor); terrain.AddTriangleTerrainTypes(types); //connect terrace with cliff for (int i = 2; i < HexMetric.terraceSteps; i++) { Vector3 v1 = v2; Color c1 = c2; v2 = HexMetric.Perturb(HexMetric.TerraceLerp(begin, left, i)); c2 = HexMetric.TerraceLerp(beginColor, leftColor, i); terrain.AddTriangleUnperturbed(v1, v2, boundary); terrain.AddTriangleColor(c1, c2, boundaryColor); terrain.AddTriangleTerrainTypes(types); } //last triangle terrain.AddTriangleUnperturbed(v2, HexMetric.Perturb(left), boundary); terrain.AddTriangleColor(c2, leftColor, boundaryColor); terrain.AddTriangleTerrainTypes(types); }
internal static EdgeVertices TerraceLerp(EdgeVertices a, EdgeVertices b, int step) { EdgeVertices result; result.v1 = HexMetric.TerraceLerp(a.v1, b.v1, step); result.v2 = HexMetric.TerraceLerp(a.v2, b.v2, step); result.v3 = HexMetric.TerraceLerp(a.v3, b.v3, step); result.v4 = HexMetric.TerraceLerp(a.v4, b.v4, step); result.v5 = HexMetric.TerraceLerp(a.v5, b.v5, step); return(result); }
void TriangulateEdgeTerraces(EdgeVertices begin, HexCell beginCell, EdgeVertices end, HexCell endCell, bool hasRoad) { EdgeVertices e2 = EdgeVertices.TerraceLerp(begin, end, 1); Color c2 = HexMetric.TerraceLerp(color1, color2, 1); float t1 = beginCell.TerrainTypeIndex; float t2 = endCell.TerrainTypeIndex; //first task TriangulateEdgeStrip(begin, color1, t1, e2, c2, t2, hasRoad); //process of creating actual steps for (int i = 2; i < HexMetric.terraceSteps; i++) { EdgeVertices e1 = e2; Color c1 = c2; e2 = EdgeVertices.TerraceLerp(begin, end, i); c2 = HexMetric.TerraceLerp(color1, color2, i); TriangulateEdgeStrip(e1, c1, t1, e2, c2, t2, hasRoad); } //last task TriangulateEdgeStrip(e2, c2, t1, end, color2, t2, hasRoad); }
void TriangulateCornerTerraces(Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell) { Vector3 v3 = HexMetric.TerraceLerp(begin, left, 1); Vector3 v4 = HexMetric.TerraceLerp(begin, right, 1); Color c3 = HexMetric.TerraceLerp(color1, color2, 1); Color c4 = HexMetric.TerraceLerp(color1, color3, 1); Vector3 types; types.x = beginCell.TerrainTypeIndex; types.y = leftCell.TerrainTypeIndex; types.z = rightCell.TerrainTypeIndex; terrain.AddTriangle(begin, v3, v4); terrain.AddTriangleColor(color1, c3, c4); terrain.AddTriangleTerrainTypes(types); for (int i = 2; i < HexMetric.terraceSteps; i++) { Vector3 v1 = v3; Vector3 v2 = v4; Color c1 = c3; Color c2 = c4; v3 = HexMetric.TerraceLerp(begin, left, i); v4 = HexMetric.TerraceLerp(begin, right, i); c3 = HexMetric.TerraceLerp(color1, color2, i); c4 = HexMetric.TerraceLerp(color1, color3, i); terrain.AddQuad(v1, v2, v3, v4); terrain.AddQuadColor(c1, c2, c3, c4); terrain.AddQuadTerrainTypes(types); } terrain.AddQuad(v3, v4, left, right); terrain.AddQuadColor(c3, c4, color2, color3); terrain.AddQuadTerrainTypes(types); }