Ejemplo n.º 1
0
        void TriangulateConnection(HexDirection direction, HexCell cell, EdgeVertices el)
        {
            var neighbor = cell.GetNeighbor(direction);

            if (!neighbor)
            {
                return;
            }

            var bridge = HexMetrics.GetBridge(direction);

            bridge.y = neighbor.position.y - cell.position.y;
            var el2 = new EdgeVertices(
                el.v1 + bridge,
                el.v5 + bridge);

            var hasRiver = cell.HasRiverThroughEdge(direction);
            var hasRoad  = cell.HasRoadThroughEdge(direction);

            if (hasRiver)
            {
                el2.v3.y = neighbor.streamBedY;

                if (!cell.isUnderWater)
                {
                    if (!neighbor.isUnderWater)
                    {
                        TriangulateRiverQuad(
                            el.v2, el.v4, el2.v2, el2.v4,
                            cell.riverSurfaceY, neighbor.riverSurfaceY,
                            cell.hasIncomingRiver && cell.incomingRiver == direction);
                    }
                    else if (cell.elevation > neighbor.waterLevel)
                    {
                        TriangulateWaterfallInWater(el.v2, el.v4, el2.v2, el2.v4,
                                                    cell.riverSurfaceY, neighbor.riverSurfaceY, neighbor.waterSurfaceY);
                    }
                }
                else if (!neighbor.isUnderWater && neighbor.elevation > cell.waterLevel)
                {
                    TriangulateWaterfallInWater(el2.v4, el2.v2, el.v4, el.v2,
                                                neighbor.riverSurfaceY, cell.riverSurfaceY, cell.waterSurfaceY);
                }
            }

            if (cell.GetEdgeType(direction) == HexEdgeType.Slope)
            {
                TriangulateEdgeTerraces(el, cell, el2, neighbor, hasRoad);
            }
            else
            {
                TriangulateEdgeStrip(el, color1, cell.terrainTypeIndex, el2, color2, neighbor.terrainTypeIndex, hasRoad);
            }

            features.AddWall(el, cell, el2, neighbor, hasRiver, hasRoad);

            var next_d       = direction.Next();
            var nextNeighbor = cell.GetNeighbor(next_d);

            if (direction <= HexDirection.E && nextNeighbor)
            {
                var v5 = el.v5 + HexMetrics.GetBridge(next_d);
                v5.y = nextNeighbor.position.y;
                if (cell.elevation <= neighbor.elevation)
                {
                    if (cell.elevation <= nextNeighbor.elevation)
                    {
                        TriangulateCorner(el.v5, cell, el2.v5, neighbor, v5, nextNeighbor);
                    }
                    else
                    {
                        TriangulateCorner(v5, nextNeighbor, el.v5, cell, el2.v5, neighbor);
                    }
                }
                else if (neighbor.elevation <= nextNeighbor.elevation)
                {
                    TriangulateCorner(el2.v5, neighbor, v5, nextNeighbor, el.v5, cell);
                }
                else
                {
                    TriangulateCorner(v5, nextNeighbor, el.v5, cell, el2.v5, neighbor);
                }
                //AddTriangle(v2, v4, v5);
                //AddTriangleColor(cell.color, neighbor.color, nextNeighbor.color);
            }
        }