Exemple #1
0
    void TriangulateAdjacentToRiver(Direction direction, Cell cell, Vector3 center, EdgeVertices edges)
    {
        if (cell.HasRoads)
        {
            TriangulateRoadsNearRiver(direction, cell, center, edges);
        }

        if (cell.HasRiverAtDirection(direction.Next()))
        {
            if (cell.HasRiverAtDirection(direction.Previous()))
            {
                center += Metrics.GetMiddleSolidCorner(direction) * Metrics.InnerToOuter * 0.5f;
            }
            else if (cell.HasRiverAtDirection(direction.PrePrevious()))
            {
                center += Metrics.GetFirstSolidCorner(direction) * 0.25f;
            }
        }
        else if (cell.HasRiverAtDirection(direction.Previous()) && cell.HasRiverAtDirection(direction.AfterNext()))
        {
            center += Metrics.GetSecondSolidCorner(direction) * 0.25f;
        }

        var middleChannelVertices = new EdgeVertices(
            Vector3.Lerp(center, edges.vertex1, 0.5f),
            Vector3.Lerp(center, edges.vertex5, 0.5f));

        middleChannelVertices.vertex3.y = edges.vertex3.y;
        TriangulateEdgeStrip(middleChannelVertices, edges, cell.Color, cell.Color);
        TriangulateEdgeFan(center, middleChannelVertices, cell.Color);

        if (!cell.IsUnderWater && !cell.HasRoadAtDirection(direction))
        {
            objectManager.AddObjects((center + edges.vertex1 + edges.vertex5) / 3, cell);
        }
    }
Exemple #2
0
    void TriangulateRoadsNearRiver(Direction direction, Cell cell, Vector3 center, EdgeVertices edges)
    {
        var interpolators             = GetRoadInterpolators(direction, cell);
        var roadCenter                = center;
        var previousDirectionHasRiver = cell.HasRiverAtDirection(direction.Previous());
        var nextDirectionHasRiver     = cell.HasRiverAtDirection(direction.Next());

        if (cell.HasOneEndOfRiver)
        {
            roadCenter += Metrics.GetMiddleSolidCorner(cell.RiverDirection.Opposite()) / 3f;
        }
        else if (cell.IncomingRiverDirection == cell.OutGoingRiverDirection.Opposite())
        {
            Vector3 corner;
            if (previousDirectionHasRiver)
            {
                if (!cell.HasRoadAtDirection(direction) && !cell.HasRoadAtDirection(direction.Next()))
                {
                    return;
                }
                corner = Metrics.GetSecondSolidCorner(direction);
            }
            else
            {
                if (!cell.HasRoadAtDirection(direction) && !cell.HasRoadAtDirection(direction.Previous()))
                {
                    return;
                }
                corner = Metrics.GetFirstSolidCorner(direction);
            }

            roadCenter += corner * 0.5f;
            if (cell.IncomingRiverDirection == direction.Next() && (cell.HasRoadAtDirection(direction.AfterNext()) || cell.HasRoadAtDirection(direction.Opposite())))
            {
                objectManager.AddBridgeStraightRiver(roadCenter, center - corner * 0.5f);
            }
            center += corner * 0.25f;
        }
        else if (cell.IncomingRiverDirection == cell.OutGoingRiverDirection.Previous())
        {
            roadCenter -= Metrics.GetSecondCorner(cell.IncomingRiverDirection) * 0.2f;
        }
        else if (cell.IncomingRiverDirection == cell.OutGoingRiverDirection.Next())
        {
            roadCenter -= Metrics.GetFirstCorner(cell.IncomingRiverDirection) * 0.2f;
        }
        else if (previousDirectionHasRiver && nextDirectionHasRiver)
        {
            if (!cell.HasRoadAtDirection(direction))
            {
                return;
            }
            var offset = Metrics.GetMiddleSolidCorner(direction) * Metrics.InnerToOuter;
            roadCenter += offset * 0.7f;
            center     += offset * 0.5f;
        }
        else
        {
            Direction middleDirection;
            if (previousDirectionHasRiver)
            {
                middleDirection = direction.Next();
            }
            else if (nextDirectionHasRiver)
            {
                middleDirection = direction.Previous();
            }
            else
            {
                middleDirection = direction;
            }

            if (!cell.HasRoadAtDirection(middleDirection) && !cell.HasRoadAtDirection(middleDirection.Next()) &&
                !cell.HasRoadAtDirection(middleDirection.Previous()))
            {
                return;
            }

            var offset = Metrics.GetMiddleSolidCorner(middleDirection);
            roadCenter += offset * 0.25f;
            if (direction == middleDirection && cell.HasRoadAtDirection(direction.Opposite()))
            {
                objectManager.AddBridgeCurvedRiver(roadCenter, center - offset * Metrics.InnerToOuter * 0.7f);
            }
        }


        var roadLeftVertex  = Vector3.Lerp(roadCenter, edges.vertex1, interpolators.x);
        var roadRightVertex = Vector3.Lerp(roadCenter, edges.vertex5, interpolators.y);

        TriangulateRoad(roadCenter, roadLeftVertex, roadRightVertex, edges, cell.HasRoadAtDirection(direction));

        if (previousDirectionHasRiver)
        {
            TriangulateRoadEnd(roadCenter, center, roadLeftVertex);
        }
        if (nextDirectionHasRiver)
        {
            TriangulateRoadEnd(roadCenter, roadRightVertex, center);
        }
    }
Exemple #3
0
    void TriangulateWithRiver(Direction direction, Cell cell, Vector3 center, EdgeVertices edges)
    {
        Vector3 channelLeftVertice;
        Vector3 channelRightVertice;

        if (cell.HasRiverAtDirection(direction.Opposite()))
        {
            channelLeftVertice  = center + Metrics.GetFirstSolidCorner(direction.Previous()) * 0.25f;
            channelRightVertice = center + Metrics.GetSecondSolidCorner(direction.Next()) * 0.25f;
        }
        else if (cell.HasRiverAtDirection(direction.Next()))
        {
            channelLeftVertice  = center;
            channelRightVertice = Vector3.Lerp(center, edges.vertex5, 2f / 3f);
        }
        else if (cell.HasRiverAtDirection(direction.Previous()))
        {
            channelLeftVertice  = Vector3.Lerp(center, edges.vertex1, 2f / 3f);
            channelRightVertice = center;
        }
        else if (cell.HasRiverAtDirection(direction.AfterNext()))
        {
            channelLeftVertice  = center;
            channelRightVertice = center + Metrics.GetMiddleSolidCorner(direction.Next()) * 0.5f * Metrics.InnerToOuter;
        }
        else if (cell.HasRiverAtDirection(direction.PrePrevious()))
        {
            channelLeftVertice  = center + Metrics.GetMiddleSolidCorner(direction.Previous()) * 0.5f * Metrics.InnerToOuter;
            channelRightVertice = center;
        }
        else
        {
            channelLeftVertice = channelRightVertice = center;
        }

        center = Vector3.Lerp(channelLeftVertice, channelRightVertice, 0.5f);

        var middleChannelVertices = new EdgeVertices(
            Vector3.Lerp(channelLeftVertice, edges.vertex1, 0.5f),
            Vector3.Lerp(channelRightVertice, edges.vertex5, 0.5f),
            1f / 6f);

        middleChannelVertices.vertex3.y = center.y = edges.vertex3.y;
        TriangulateEdgeStrip(middleChannelVertices, edges, cell.Color, cell.Color);

        terrain.AddTriangle(channelLeftVertice, middleChannelVertices.vertex1, middleChannelVertices.vertex2);
        terrain.AddTriangleColor(cell.Color, cell.Color, cell.Color);

        terrain.AddQuad(channelLeftVertice, center, middleChannelVertices.vertex2, middleChannelVertices.vertex3);
        terrain.AddQuadColor(cell.Color, cell.Color);
        terrain.AddQuad(center, channelRightVertice, middleChannelVertices.vertex3, middleChannelVertices.vertex4);
        terrain.AddQuadColor(cell.Color, cell.Color);

        terrain.AddTriangle(channelRightVertice, middleChannelVertices.vertex4, middleChannelVertices.vertex5);
        terrain.AddTriangleColor(cell.Color, cell.Color, cell.Color);

        if (!cell.IsUnderWater)
        {
            var isReversed = cell.IncomingRiverDirection == direction;
            TriangulateRiverQuad(channelLeftVertice, channelRightVertice, middleChannelVertices.vertex2, middleChannelVertices.vertex4, cell.RiverSurfaceY, 0.4f, isReversed);
            TriangulateRiverQuad(middleChannelVertices.vertex2, middleChannelVertices.vertex4, edges.vertex2, edges.vertex4, cell.RiverSurfaceY, 0.6f, isReversed);
        }
    }