void TriangulateBoundaryTriangle( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 boundary, Color boundaryColor ) { Vector3 v2 = Perturb(HecMetrics.TerraceLerp(begin, left, 1)); Color c2 = HecMetrics.TerranceLerp(beginCell.Color, leftCell.Color, 1); AddTriangleUnperturbed(Perturb(begin), v2, boundary); AddTriangleColor(beginCell.Color, c2, boundaryColor); for (int i = 2; i < HecMetrics.terraceSteps; i++) { Vector3 v1 = v2; Color c1 = c2; v2 = Perturb(HecMetrics.TerraceLerp(begin, left, i)); c2 = HecMetrics.TerranceLerp(beginCell.Color, leftCell.Color, i); AddTriangleUnperturbed(v1, v2, boundary); AddTriangleColor(c1, c2, boundaryColor); } AddTriangleUnperturbed(v2, Perturb(left), boundary); AddTriangleColor(c2, leftCell.Color, boundaryColor); }
void TriangulateCornerTerraces( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { Vector3 v3 = HecMetrics.TerraceLerp(begin, left, 1); Vector3 v4 = HecMetrics.TerraceLerp(begin, right, 1); Color c3 = HecMetrics.TerranceLerp(beginCell.Color, leftCell.Color, 1); Color c4 = HecMetrics.TerranceLerp(beginCell.Color, rightCell.Color, 1); AddTriangle(begin, v3, v4); AddTriangleColor(beginCell.Color, c3, c4); for (int i = 2; i < HecMetrics.terraceSteps; i++) { Vector3 v1 = v3; Vector3 v2 = v4; Color c1 = c3; Color c2 = c4; v3 = HecMetrics.TerraceLerp(begin, left, i); v4 = HecMetrics.TerraceLerp(begin, right, i); c3 = HecMetrics.TerranceLerp(beginCell.Color, leftCell.Color, i); c4 = HecMetrics.TerranceLerp(beginCell.Color, rightCell.Color, i); AddQuad(v1, v2, v3, v4); AddQuadColor(c1, c2, c3, c4); } AddQuad(v3, v4, left, right); AddQuadColor(c3, c4, leftCell.Color, rightCell.Color); }
Vector3 Perturb(Vector3 position) { Vector4 sample = HecMetrics.SampleNoise(position); position.x += (sample.x * 2f - 1f) * HecMetrics.cellPerturbStrength; position.z += (sample.z * 2f - 1f) * HecMetrics.cellPerturbStrength; return(position); }
public static EdgeVertices TerraceLerp( EdgeVertices a, EdgeVertices b, int step) { EdgeVertices result; result.v1 = HecMetrics.TerraceLerp(a.v1, b.v1, step); result.v2 = HecMetrics.TerraceLerp(a.v2, b.v2, step); result.v3 = HecMetrics.TerraceLerp(a.v3, b.v3, step); result.v4 = HecMetrics.TerraceLerp(a.v4, b.v4, step); return(result); }
void Triangulate(HexDirection direction, HexCell cell) { Vector3 center = cell.Position; EdgeVertices e = new EdgeVertices(center + HecMetrics.GetFirstSolidCorner(direction), center + HecMetrics.GetSecondSolidCorner(direction)); TriangulateEdgeFan(center, e, cell.Color); if (direction <= HexDirection.SE) { TriangulateConnection(direction, cell, e); } }
void TriangulateEdgeTerraces( EdgeVertices begin, HexCell beginCell, EdgeVertices end, HexCell endCell ) { EdgeVertices e2 = EdgeVertices.TerraceLerp(begin, end, 1); Color c2 = HecMetrics.TerranceLerp(beginCell.Color, endCell.Color, 1); TriangulateEdgeStrip(begin, beginCell.Color, e2, c2); for (int i = 2; i < HecMetrics.terraceSteps; i++) { EdgeVertices e1 = e2; Color c1 = c2; e2 = EdgeVertices.TerraceLerp(begin, end, i); c2 = HecMetrics.TerranceLerp(beginCell.Color, endCell.Color, i); TriangulateEdgeStrip(e1, c1, e2, c2); } TriangulateEdgeStrip(e2, c2, end, endCell.Color); }
void TriangulateConnection( HexDirection direction, HexCell cell, EdgeVertices e1 ) { HexCell neighbor = cell.GetNeighbor(direction); if (neighbor == null) { return; } Vector3 bridge = HecMetrics.GetBridge(direction); bridge.y = neighbor.Position.y - cell.Position.y; EdgeVertices e2 = new EdgeVertices( e1.v1 + bridge, e1.v4 + bridge ); if (cell.GetEdgeType(direction) == HexEdgeType.slope) { TriangulateEdgeTerraces(e1, cell, e2, neighbor); } else { TriangulateEdgeStrip(e1, cell.Color, e2, neighbor.Color); } HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (direction <= HexDirection.E && nextNeighbor != null) { Vector3 v5 = e1.v4 + HecMetrics.GetBridge(direction.Next()); v5.y = nextNeighbor.Position.y; if (cell.Elevation <= neighbor.Elevation) { if (cell.Elevation <= nextNeighbor.Elevation) { TriangulateCorner( e1.v4, cell, e2.v4, neighbor, v5, nextNeighbor ); } else { TriangulateCorner( v5, nextNeighbor, e1.v4, cell, e2.v4, neighbor ); } } else if (neighbor.Elevation <= nextNeighbor.Elevation) { TriangulateCorner( e2.v4, neighbor, v5, nextNeighbor, e1.v4, cell ); } else { TriangulateCorner( v5, nextNeighbor, e1.v4, cell, e2.v4, neighbor ); } } }
public HexEdgeType GetEdgeType(HexDirection direction) { return(HecMetrics.GetEdgeType(elevation, neighbors[(int)direction].elevation)); }
public HexEdgeType GetEdgeType(HexCell othercell) { return(HecMetrics.GetEdgeType(elevation, othercell.elevation)); }