void TriangulateRoadAdjacentToRiver(HexDirection dir, HexCell cell, Vector3 center, EdgeVertices e) { var hasRoadThroughEdge = cell.HasRoadThroughEdge(dir); var previousHasRiver = cell.HasRiverThroughEdge(dir.Previous()); var nextHasRiver = cell.HasRiverThroughEdge(dir.Next()); var interpolators = GetRoadInterpolators(dir, cell); var roadCenter = center; if (cell.hasRiverBeginOrEnd) { roadCenter += HexMetrics.GetSolidEdgeMiddle( cell.riverBeginOrEndDirection.Opposite() ) * (1f / 3f); } else if (cell.incomingRiver == cell.outgoingRiver.Opposite()) { Vector3 corner; if (previousHasRiver) { if (!hasRoadThroughEdge && !cell.HasRoadThroughEdge(dir.Next())) { return; } corner = HexMetrics.GetSecondSolidCorner(dir); } else { if (!hasRoadThroughEdge && !cell.HasRoadThroughEdge(dir.Previous())) { return; } corner = HexMetrics.GetFirstSolidCorner(dir); } roadCenter += corner * 0.5f; if (CanAddBridge(cell, dir)) { features.AddBridge(roadCenter, center - corner * 0.5f); } center += corner * 0.25f; } else if (cell.incomingRiver == cell.outgoingRiver.Previous()) { roadCenter -= HexMetrics.GetSecondCorner(cell.incomingRiver) * 0.2f; } else if (cell.incomingRiver == cell.outgoingRiver.Next()) { roadCenter -= HexMetrics.GetFirstCorner(cell.incomingRiver) * 0.2f; } else if (previousHasRiver && nextHasRiver) { if (!hasRoadThroughEdge) { return; } var offset = HexMetrics.GetSolidEdgeMiddle(dir) * HexMetrics.innerToOuter; roadCenter += offset * 0.7f; center += offset * 0.5f; } else { HexDirection middle; if (previousHasRiver) { middle = dir.Next(); } else if (nextHasRiver) { middle = dir.Previous(); } else { middle = dir; } if (!cell.HasRoadThroughEdge(middle) && !cell.HasRoadThroughEdge(middle.Previous()) && !cell.HasRoadThroughEdge(middle.Next())) { return; } var offset = HexMetrics.GetSolidEdgeMiddle(middle); roadCenter += offset * 0.25f; if (dir == middle && cell.HasRoadThroughEdge(dir.Opposite())) { features.AddBridge( roadCenter, center - offset * (HexMetrics.innerToOuter * 0.7f)); } } var mL = Vector3.Lerp(roadCenter, e.v1, interpolators.x); var mR = Vector3.Lerp(roadCenter, e.v5, interpolators.y); TriangulateRoad(roadCenter, mL, mR, e, hasRoadThroughEdge); if (previousHasRiver) { TriangulateRoadEdge(roadCenter, center, mL); } if (nextHasRiver) { TriangulateRoadEdge(roadCenter, mR, center); } }