public void SetFeature(int index, GameObject feature) { feature.transform.localPosition = this.transform.position + HexMetrics.FirstCorner((HexDirection)index) * HexMetrics.coreMultiplier * (0.4f + Random.value * 0.2f); feature.transform.rotation = Quaternion.Euler(0f, Random.value * 360f, 0f); if (features[index] != null) { Object.Destroy(features[index]); } features[index] = feature; }
void Triangulate(HexCell cell) { Vector3 center = cell.transform.localPosition; center.y = 0f; Vector3 height = new Vector3(0f, cell.height, 0f); float average = cell.height; int cellCount = 1; for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { if (cell.GetNeighbor(d) != null) { cellCount++; average += cell.GetNeighbor(d).height; } } average /= cellCount; for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { // Heights Vector3 baseHeight = new Vector3(0f, 0f, 0f); Vector3 prevMidHeight = baseHeight; Vector3 firstMidHeight = baseHeight; Vector3 nextMidHeight = baseHeight; Vector3 secondMidHeight = baseHeight; Vector3 midHeight = baseHeight; Vector3 firstOuterHeight = baseHeight; Vector3 secondOuterHeight = baseHeight; Vector3 firstConnectorHeight = baseHeight; Vector3 secondConnectorHeight = baseHeight; Vector3 innerMidHeight = baseHeight; float dHeight = cell.GetNeighbor(d) == null ? 0f : cell.GetNeighbor(d).height; float dCCWHeight = cell.GetNeighbor(d.CounterClockwise(1)) == null ? 0f : cell.GetNeighbor(d.CounterClockwise(1)).height; float dCWHeight = cell.GetNeighbor(d.Clockwise(1)) == null ? 0f : cell.GetNeighbor(d.Clockwise(1)).height; float bridgeProportion = cell.bridgeProportion; if (cell.GetNeighbor(d) != null) { midHeight.y = (cell.height + dHeight) / 2f; innerMidHeight = (height + midHeight) / 2f; bridgeProportion += cell.GetNeighbor(d).bridgeProportion; bridgeProportion /= 2f; } if (cell.GetNeighbor(d) != null && cell.GetNeighbor(d.CounterClockwise(1)) != null) { prevMidHeight.y = cell.height + dCCWHeight; prevMidHeight.y /= 2f; firstMidHeight.y = cell.height + dHeight + dCCWHeight; firstMidHeight.y /= 3f; firstOuterHeight = (height + midHeight + prevMidHeight) / 3f; firstConnectorHeight = (firstMidHeight + midHeight) / 2f; } if (cell.GetNeighbor(d) != null && cell.GetNeighbor(d.Clockwise(1)) != null) { nextMidHeight.y = cell.height + dCWHeight; nextMidHeight.y /= 2f; secondMidHeight.y = cell.height + dHeight + dCWHeight; secondMidHeight.y /= 3f; secondOuterHeight = (height + midHeight + nextMidHeight) / 3f; secondConnectorHeight = (secondMidHeight + midHeight) / 2f; } // Vertices Vector3 coreCorner1 = center + HexMetrics.FirstCorner(d) * HexMetrics.coreMultiplier + height; Vector3 coreCorner2 = center + HexMetrics.SecondCorner(d) * HexMetrics.coreMultiplier + height; Vector3 outerCorner1 = center + HexMetrics.FirstCorner(d) + firstOuterHeight; Vector3 outerCorner2 = center + HexMetrics.SecondCorner(d) + secondOuterHeight; Vector3 borderCorner1 = center + (HexMetrics.FirstCorner(d) * HexMetrics.borderMultiplier) + firstMidHeight; Vector3 borderCorner2 = center + (HexMetrics.SecondCorner(d) * HexMetrics.borderMultiplier) + secondMidHeight; Vector3 bridgeConnector1 = center + (HexMetrics.FirstCorner(d) + HexMetrics.BorderMiddle(d)) + firstConnectorHeight; Vector3 bridgeConnector2 = center + (HexMetrics.SecondCorner(d) + HexMetrics.BorderMiddle(d)) + secondConnectorHeight; Vector3 bridgeInner1 = center + (HexMetrics.FirstCorner(d) * cell.bridgeProportion + HexMetrics.SecondCorner(d) * (1 - cell.bridgeProportion)) + innerMidHeight; Vector3 bridgeInner2 = center + (HexMetrics.SecondCorner(d) * cell.bridgeProportion + HexMetrics.FirstCorner(d) * (1 - cell.bridgeProportion)) + innerMidHeight; Vector3 bridgeOuter1 = center + (HexMetrics.FirstCorner(d) * bridgeProportion + HexMetrics.SecondCorner(d) * (1 - bridgeProportion)) + HexMetrics.BorderMiddle(d) + midHeight; Vector3 bridgeOuter2 = center + (HexMetrics.SecondCorner(d) * bridgeProportion + HexMetrics.FirstCorner(d) * (1 - bridgeProportion)) + HexMetrics.BorderMiddle(d) + midHeight; //bridgeInner1.y = bridgeInner2.y = (cell.height + midHeight.y) / 2f; //bridgeOuter1.y = bridgeOuter2.y = midHeight.y; // Core Hex AddTriangle( center + height, coreCorner1, coreCorner2 ); // Outer Hex AddTriangle( coreCorner1, outerCorner1, bridgeInner1 ); AddTriangle( coreCorner1, bridgeInner1, bridgeInner2 ); AddTriangle( coreCorner1, bridgeInner2, coreCorner2 ); AddTriangle( coreCorner2, bridgeInner2, outerCorner2 ); // Border AddTriangle( outerCorner1, borderCorner1, bridgeConnector1 ); AddTriangle( outerCorner1, bridgeConnector1, bridgeInner1 ); AddTriangle( bridgeInner1, bridgeConnector1, bridgeOuter1 ); AddTriangle( bridgeInner1, bridgeOuter1, bridgeOuter2 ); AddTriangle( bridgeInner2, bridgeInner1, bridgeOuter2 ); AddTriangle( bridgeInner2, bridgeOuter2, bridgeConnector2 ); AddTriangle( bridgeInner2, bridgeConnector2, outerCorner2 ); AddTriangle( outerCorner2, bridgeConnector2, borderCorner2 ); } }