void TriangulateCornerCliffTerraces( Vector3 bottom, HexCell bottomCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell) { float b = Mathf.Abs(1f / (leftCell.elevation - bottomCell.elevation)); Vector3 boundary = Vector3.Lerp(HexMetrics.Perturb(bottom), HexMetrics.Perturb(left), b); Color boundaryColor = Color.Lerp(color1, color2, b); Vector3 types; types.x = bottomCell.terrainTypeIndex; types.y = leftCell.terrainTypeIndex; types.z = rightCell.terrainTypeIndex; TriangulateBoundaryTriangle( right, color3, bottom, color1, boundary, boundaryColor, types); if (leftCell.GetEdgeType(rightCell) == HexEdgeType.Slope) { TriangulateBoundaryTriangle( left, color2, right, color3, boundary, boundaryColor, types); } else { terrain.AddTriangleUnperturbed(HexMetrics.Perturb(left), HexMetrics.Perturb(right), boundary); terrain.AddTriangleColor(color2, color3, boundaryColor); terrain.AddTriangleTerrainTypes(types); } }
void TriangulateBoundaryTriangle( Vector3 bottom, Color beginColor, Vector3 left, Color leftColor, Vector3 boundary, Color boundaryColor, Vector3 types) { Vector3 v2 = HexMetrics.Perturb(HexMetrics.TerraceLerp(bottom, left, 1)); Color c2 = HexMetrics.TerraceLerp(beginColor, leftColor, 1); terrain.AddTriangleUnperturbed(HexMetrics.Perturb(bottom), v2, boundary); terrain.AddTriangleColor(beginColor, c2, boundaryColor); terrain.AddTriangleTerrainTypes(types); for (int i = 2; i < HexMetrics.terracedSteps; i++) { Vector3 v1 = v2; Color c1 = c2; v2 = HexMetrics.Perturb(HexMetrics.TerraceLerp(bottom, left, i)); c2 = HexMetrics.TerraceLerp(beginColor, leftColor, i); terrain.AddTriangleUnperturbed(v1, v2, boundary); terrain.AddTriangleColor(c1, c2, boundaryColor); terrain.AddTriangleTerrainTypes(types); } terrain.AddTriangleUnperturbed(v2, HexMetrics.Perturb(left), boundary); terrain.AddTriangleColor(c2, leftColor, boundaryColor); terrain.AddTriangleTerrainTypes(types); }
public void AddTriangle(Vector3 v1, Vector3 v2, Vector3 v3) { int vertexIndex = m_Vertices.Count; m_Vertices.Add(HexMetrics.Perturb(v1)); m_Vertices.Add(HexMetrics.Perturb(v2)); m_Vertices.Add(HexMetrics.Perturb(v3)); m_Triangles.Add(vertexIndex); m_Triangles.Add(vertexIndex + 1); m_Triangles.Add(vertexIndex + 2); }
public void AddSpecialFeature(HexCell cell, Vector3 position) { if (cell.specialIndex == 0) { return; // shouldn't happen, but guard against it all the same.) } position = HexMetrics.Perturb(position); var hash = HexMetrics.SampleHashGrid(position); var rotation = Quaternion.Euler(0f, 360f * hash.e, 0f); Instantiate(special[cell.specialIndex - 1], position, rotation, m_Container); }
public void AddBridge(Vector3 roadCenter1, Vector3 roadCenter2) { roadCenter1 = HexMetrics.Perturb(roadCenter1); roadCenter2 = HexMetrics.Perturb(roadCenter2); var bridgePos = (roadCenter1 + roadCenter2) * 0.5f; var bridgeRot = Quaternion.FromToRotation(Vector3.forward, roadCenter2 - roadCenter1); var newBridge = Instantiate(bridge, bridgePos, bridgeRot, m_Container); var length = Vector3.Distance(roadCenter1, roadCenter2); newBridge.localScale = new Vector3( 1f, 1f, length * (1f / HexMetrics.bridgeDesignLength)); }
void AddWallSegment(Vector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight, bool addTower = false) { // pre-perturb our vertices nearLeft = HexMetrics.Perturb(nearLeft); nearRight = HexMetrics.Perturb(nearRight); farLeft = HexMetrics.Perturb(farLeft); farRight = HexMetrics.Perturb(farRight); var left = HexMetrics.WallLerp(nearLeft, farLeft); var right = HexMetrics.WallLerp(nearRight, farRight); var leftThicknessOffset = HexMetrics.WallThicknessOffset(nearLeft, farLeft); var rightThicknessOffset = HexMetrics.WallThicknessOffset(nearRight, farRight); var leftTop = left.y + HexMetrics.wallHeight; var rightTop = right.y + HexMetrics.wallHeight; Vector3 v1, v2, v3, v4; v1 = v3 = left - leftThicknessOffset; v2 = v4 = right - rightThicknessOffset; v3.y = leftTop; v4.y = rightTop; walls.AddQuadUnperturbed(v1, v2, v3, v4); Vector3 t1 = v3, t2 = v4; // make the wall double-sided v1 = v3 = left + leftThicknessOffset; v2 = v4 = right + rightThicknessOffset; v3.y = leftTop; v4.y = rightTop; walls.AddQuadUnperturbed(v2, v1, v4, v3); // add a wall top too! walls.AddQuadUnperturbed(t1, t2, v3, v4); if (!addTower) { return; } var towerPos = (left + right) * 0.5f; var rightDir = right - left; rightDir.y = 0; var towerRot = Quaternion.FromToRotation(Vector3.right, rightDir); Instantiate(wallTower, towerPos, towerRot, m_Container); }
void AddWallCap(Vector3 near, Vector3 far) { near = HexMetrics.Perturb(near); far = HexMetrics.Perturb(far); var center = HexMetrics.WallLerp(near, far); var thickness = HexMetrics.WallThicknessOffset(near, far); Vector3 v1, v2, v3, v4; v1 = v3 = center - thickness; v2 = v4 = center + thickness; v3.y = v4.y = center.y + HexMetrics.wallHeight; walls.AddQuadUnperturbed(v1, v2, v3, v4); }
public void AddQuad(Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4) { var index = m_Vertices.Count; m_Vertices.Add(HexMetrics.Perturb(v1)); m_Vertices.Add(HexMetrics.Perturb(v2)); m_Vertices.Add(HexMetrics.Perturb(v3)); m_Vertices.Add(HexMetrics.Perturb(v4)); m_Triangles.Add(index); // v1 m_Triangles.Add(index + 2); // v3 m_Triangles.Add(index + 1); // v2 m_Triangles.Add(index + 1); // v2 m_Triangles.Add(index + 2); // v3 m_Triangles.Add(index + 3); // v4 }
void TriangulateWaterfallInWater( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y1, float y2, float waterY) { v1.y = v2.y = y1; v3.y = v4.y = y2; v1 = HexMetrics.Perturb(v1); v2 = HexMetrics.Perturb(v2); v3 = HexMetrics.Perturb(v3); v4 = HexMetrics.Perturb(v4); float t = (waterY - y2) / (y1 - y2); v3 = Vector3.Lerp(v3, v1, t); v4 = Vector3.Lerp(v4, v2, t); rivers.AddQuadUnperturbed(v1, v2, v3, v4); rivers.AddQuadUV(0f, 1f, 0.8f, 1f); }
public void AddFeature(HexCell cell, Vector3 position) { if (cell.isSpecial) { return; } var hash = HexMetrics.SampleHashGrid(position); var prefab = PickPrefab(urbanCollections, cell.urbanLevel, hash.a, hash.d); var otherPrefab = PickPrefab(farmCollections, cell.farmLevel, hash.b, hash.d); float usedHash = hash.a; if (prefab) { if (otherPrefab && hash.b < usedHash) { prefab = otherPrefab; usedHash = hash.b; } } else if (otherPrefab) { prefab = otherPrefab; usedHash = hash.b; } otherPrefab = PickPrefab(plantCollections, cell.plantLevel, hash.c, hash.d); if (prefab) { if (otherPrefab && hash.c < usedHash) { prefab = otherPrefab; } } else if (otherPrefab) { prefab = otherPrefab; } else { return; } var instance = Instantiate(prefab, m_Container, false); position.y += instance.localScale.y * 0.5f; instance.localPosition = HexMetrics.Perturb(position); instance.localRotation = Quaternion.Euler(0f, 360f * hash.e, 0f); }
void AddWallWedge(Vector3 near, Vector3 far, Vector3 point) { near = HexMetrics.Perturb(near); far = HexMetrics.Perturb(far); point = HexMetrics.Perturb(point); var center = HexMetrics.WallLerp(near, far); var thickness = HexMetrics.WallThicknessOffset(near, far); Vector3 v1, v2, v3, v4; var pointTop = point; point.y = center.y; v1 = v3 = center - thickness; v2 = v4 = center + thickness; v3.y = v4.y = pointTop.y = center.y + HexMetrics.wallHeight; walls.AddQuadUnperturbed(v1, point, v3, pointTop); walls.AddQuadUnperturbed(point, v2, pointTop, v4); walls.AddTriangleUnperturbed(pointTop, v3, v4); }