Exemple #1
0
    void TriangulateEstuary(HexCell cell, HexDirection direction)
    {
        var neighbor = cell.GetNeighbor(direction);

        EdgeVertices closerWaterEdge  = cell.WaterEdges[(int)direction];
        EdgeVertices furtherWaterEdge = neighbor.WaterEdges[(int)direction.Opposite()];
        EdgeVertices furtherEdge      = neighbor.Edges[(int)direction.Opposite()];

        furtherEdge.V1.y = HexMetrics.WaterSurfaceY;
        furtherEdge.V2.y = HexMetrics.WaterSurfaceY;
        furtherEdge.V3.y = HexMetrics.WaterSurfaceY;
        furtherEdge.V4.y = HexMetrics.WaterSurfaceY;
        furtherEdge.V5.y = HexMetrics.WaterSurfaceY;

        WaterShore.AddTriangleUnperturbed(furtherEdge.V5, closerWaterEdge.V2, closerWaterEdge.V1);
        WaterShore.AddTriangleUnperturbed(furtherEdge.V1, closerWaterEdge.V5, closerWaterEdge.V4);
        WaterShore.AddTriangleUV(new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(0f, 0f));
        WaterShore.AddTriangleUV(new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(0f, 0f));

        // left quad
        // quad is rotated 90 degrees to the right so the diagonal connection is shorter
        // it is done to maintain the symetry with the other quad
        Estuaries.AddQuadUnperturbed(furtherEdge.V5, closerWaterEdge.V2, furtherEdge.V4, closerWaterEdge.V3);
        Estuaries.AddQuadUV(new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(1f, 1f), new Vector2(0f, 0f));

        // big triangle in the middle
        Estuaries.AddTriangleUnperturbed(closerWaterEdge.V3, furtherEdge.V4, furtherEdge.V2);
        Estuaries.AddTriangleUV(new Vector2(0f, 0f), new Vector2(1f, 1f), new Vector2(0f, 1f));

        // right quad
        Estuaries.AddQuadUnperturbed(closerWaterEdge.V3, closerWaterEdge.V4, furtherEdge.V2, furtherEdge.V1);
        Estuaries.AddQuadUV(new Vector2(0f, 0f), new Vector2(0f, 0f), new Vector2(1f, 1f), new Vector2(0f, 1f));

        // is incoming river
        if (cell.IncomingRiver == direction)
        {
            Estuaries.AddQuadUV2(
                new Vector2(1.5f, 1f), new Vector2(0.7f, 1.15f),
                new Vector2(1f, 0.8f), new Vector2(0.5f, 1.1f));
            Estuaries.AddTriangleUV2(
                new Vector2(0.5f, 1.1f), new Vector2(1f, 0.8f), new Vector2(0f, 0.8f));
            Estuaries.AddQuadUV2(
                new Vector2(0.5f, 1.1f), new Vector2(0.3f, 1.15f),
                new Vector2(0f, 0.8f), new Vector2(-0.5f, 1f));
        }
        else
        {
            // the U coordinates have to be mirrored for outgoing rivers
            // the V coordinates are a little bit less straightforward
            Estuaries.AddQuadUV2(
                new Vector2(-0.5f, -0.2f), new Vector2(0.3f, -0.35f),
                new Vector2(0f, 0f), new Vector2(0.5f, -0.3f));
            Estuaries.AddTriangleUV2(
                new Vector2(0.5f, -0.3f), new Vector2(0f, 0f), new Vector2(1f, 0f));
            Estuaries.AddQuadUV2(
                new Vector2(0.5f, -0.3f), new Vector2(0.7f, -0.35f),
                new Vector2(1f, 0f), new Vector2(1.5f, -0.2f));
        }
    }