private void TriangulateCorner( Vector3 bottom, HexCell bottomCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell) { var leftEdge = bottomCell.GetEdgeType(leftCell); var rightEdge = bottomCell.GetEdgeType(rightCell); if (leftEdge == HexEdgeType.Slope) { if (rightEdge == HexEdgeType.Slope) // SSF: slope-slope-flat { TriangulateCornerTerraces(bottom, bottomCell, left, leftCell, right, rightCell); } else if (rightEdge == HexEdgeType.Flat) // SFS: slope-flat-slope { TriangulateCornerTerraces(left, leftCell, right, rightCell, bottom, bottomCell); } else { TriangulateCornerTerracesCliff(bottom, bottomCell, left, leftCell, right, rightCell); } } else if (rightEdge == HexEdgeType.Slope) { if (leftEdge == HexEdgeType.Flat) // FSS: flat-slope-slope { TriangulateCornerTerraces(right, rightCell, bottom, bottomCell, left, leftCell); } else // must be a cliff, as left as slope has already been covered { TriangulateCornerCliffTerraces(bottom, bottomCell, left, leftCell, right, rightCell); } } else if (leftCell.GetEdgeType(rightCell) == HexEdgeType.Slope) // both sides are cliffs, top is slope { if (leftCell.Elevation < rightCell.Elevation) { TriangulateCornerCliffTerraces(right, rightCell, bottom, bottomCell, left, leftCell); // CCSR: cliff, cliff, slope to right } else { TriangulateCornerTerracesCliff(left, leftCell, right, rightCell, bottom, bottomCell); // CCSL: cliff, cliff, slope to left } } else // no terraces anywhere, so a simple triangle will do { Terrain.AddTriangle(bottom, left, right); var indices = new Vector3(bottomCell.Index, leftCell.Index, rightCell.Index); Terrain.AddTriangleCellData(indices, weights1, weights2, weights3); } Features.AddWall(bottom, bottomCell, left, leftCell, right, rightCell); }
private void TriangulateCornerCliffTerraces( Vector3 bottom, HexCell bottomCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell) { var b = Mathf.Abs(1f / (leftCell.Elevation - bottomCell.Elevation)); var boundary = Vector3.Lerp(HexMetrics.Perturb(bottom), HexMetrics.Perturb(left), b); var boundaryWeights = Color.Lerp(weights1, weights2, b); var indices = new Vector3(bottomCell.Index, leftCell.Index, rightCell.Index); TriangulateBoundaryTriangle(right, weights1, bottom, weights2, boundary, boundaryWeights, indices); if (rightCell.GetEdgeType(leftCell) == HexEdgeType.Slope) { TriangulateBoundaryTriangle(left, weights2, right, weights3, boundary, boundaryWeights, indices); return; } Terrain.AddTriangleUnperturbed(HexMetrics.Perturb(left), HexMetrics.Perturb(right), boundary); Terrain.AddTriangleCellData(indices, weights2, weights3, boundaryWeights); }