void TriangulateCornerTerraces( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { Vector3 vert3 = Hexmetrics.TerraceLerp(begin, left, 1); Vector3 vert4 = Hexmetrics.TerraceLerp(begin, right, 1); Color c3 = Hexmetrics.TerraceLerp(beginCell.color, leftCell.color, 1); Color c4 = Hexmetrics.TerraceLerp(beginCell.color, rightCell.color, 1); terrain.AddTriangle(begin, vert3, vert4); terrain.AddTriangleColor(beginCell.color, c3, c4); for (int i = 2; i < Hexmetrics.terraceSteps; i++) { Vector3 vert1 = vert3; Vector3 vert2 = vert4; Color c1 = c3; Color c2 = c4; vert3 = Hexmetrics.TerraceLerp(begin, left, i); vert4 = Hexmetrics.TerraceLerp(begin, right, i); c3 = Hexmetrics.TerraceLerp(beginCell.color, leftCell.color, i); c4 = Hexmetrics.TerraceLerp(beginCell.color, rightCell.color, i); terrain.AddQuad(vert1, vert2, vert3, vert4); terrain.AddQuadColor(c1, c2, c3, c4); } terrain.AddQuad(vert3, vert4, left, right); terrain.AddQuadColor(c3, c4, leftCell.color, rightCell.color); }
void TriangulateEdgeTerraces( Vector3 beginLeft, Vector3 beginRight, HexCell beginCell, Vector3 endLeft, Vector3 endRight, HexCell endCell ) { Vector3 vert3 = Hexmetrics.TerraceLerp(beginLeft, endLeft, 1); Vector3 vert4 = Hexmetrics.TerraceLerp(beginRight, endRight, 1); Color c2 = Hexmetrics.TerraceLerp(beginCell.color, endCell.color, 1); terrain.AddQuad(beginLeft, beginRight, vert3, vert4); terrain.AddQuadColor(beginCell.color, c2); for (int i = 2; i < Hexmetrics.terraceSteps; i++) { Vector3 vert1 = vert3; Vector3 vert2 = vert4; Color c1 = c2; vert3 = Hexmetrics.TerraceLerp(beginLeft, endLeft, i); vert4 = Hexmetrics.TerraceLerp(beginRight, endRight, i); c2 = Hexmetrics.TerraceLerp(beginCell.color, endCell.color, i); terrain.AddQuad(vert1, vert2, vert3, vert4); terrain.AddQuadColor(c1, c2); } terrain.AddQuad(vert3, vert4, endLeft, endRight); terrain.AddQuadColor(c2, endCell.color); }
void Triangulate(HexDirection direction, HexCell cell) { Vector3 center = cell.transform.localPosition; Vector3 vert1 = center + Hexmetrics.GetFirstSolidCorner(direction); Vector3 vert2 = center + Hexmetrics.GetSecondSolidCorner(direction); terrain.AddTriangle(center, vert1, vert2); terrain.AddTriangleColor(cell.color); if (direction <= HexDirection.SE) { TriangulateConnection(direction, cell, vert1, vert2); } }
void TriangulateConnection( HexDirection direction, HexCell cell, Vector3 vert1, Vector3 vert2 ) { HexCell neighbor = cell.GetNeighbor(direction); if (neighbor == null) { return; } Vector3 bridge = Hexmetrics.GetBridge(direction); Vector3 vert3 = vert1 + bridge; Vector3 vert4 = vert2 + bridge; vert3.y = vert4.y = neighbor.Elevation * Hexmetrics.elevationChange; if (cell.GetEdgeType(direction) == HexEdgeType.Slope) { TriangulateEdgeTerraces(vert1, vert2, cell, vert3, vert4, neighbor); } else { terrain.AddQuad(vert1, vert2, vert3, vert4); terrain.AddQuadColor(cell.color, neighbor.color); } // for (int i = 2; i < Hexmetrics.terraceSteps; i++) { // Vector3 v1 = vert3; // Vector3 v2 = vert4; // Color c1 = c2; // vert3 = Hexmetrics.TerraceLerp(beginLeft, endLeft, i); // vert4 = Hexmetrics.TerraceLerp(beginRight, endRight, i); // c2 = Hexmetrics.TerraceLerp(beginCell.color, endCell.color, i); // terrain.AddQuad(v1, v2, v3, v4); // terrain.AddQuadColor(c1, c2); // } // // terrain.AddQuad(vert3, vert4, endLeft, endRight); // terrain.AddQuadColor(c2, endCell.color); HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (direction <= HexDirection.E && nextNeighbor != null) { Vector3 vert5 = vert2 + Hexmetrics.GetBridge(direction.Next()); vert5.y = nextNeighbor.Elevation * Hexmetrics.elevationChange; if (cell.Elevation <= neighbor.Elevation) { if (cell.Elevation <= nextNeighbor.Elevation) { TriangulateCorner(vert2, cell, vert4, neighbor, vert5, nextNeighbor); } else { TriangulateCorner(vert5, nextNeighbor, vert2, cell, vert4, neighbor); } } else if (neighbor.Elevation <= nextNeighbor.Elevation) { TriangulateCorner(vert4, neighbor, vert5, nextNeighbor, vert2, cell); } else { TriangulateCorner(vert5, nextNeighbor, vert2, cell, vert4, neighbor); } terrain.AddTriangle(vert2, vert4, vert5); terrain.AddTriangleColor(cell.color, neighbor.color, nextNeighbor.color); } }
//determines edge type between two cells for triangulating corners public HexEdgeType GetEdgeType(HexCell otherCell) { return(Hexmetrics.GetEdgeType( elevation, otherCell.elevation )); }
//gets cells edge type for cliffs in a certain direction public HexEdgeType GetEdgeType(HexDirection direction) { return(Hexmetrics.GetEdgeType( elevation, neighbors[(int)direction].elevation )); }