Пример #1
0
    void TriangulateBoundaryTriangle(
        Vector3 begin, HexCell beginCell,
        Vector3 left, HexCell leftCell,
        Vector3 boundary, Color boundaryColor
        )
    {
        Vector3 v2 = Perturb(HecMetrics.TerraceLerp(begin, left, 1));
        Color   c2 = HecMetrics.TerranceLerp(beginCell.Color, leftCell.Color, 1);

        AddTriangleUnperturbed(Perturb(begin), v2, boundary);
        AddTriangleColor(beginCell.Color, c2, boundaryColor);

        for (int i = 2; i < HecMetrics.terraceSteps; i++)
        {
            Vector3 v1 = v2;
            Color   c1 = c2;
            v2 = Perturb(HecMetrics.TerraceLerp(begin, left, i));
            c2 = HecMetrics.TerranceLerp(beginCell.Color, leftCell.Color, i);
            AddTriangleUnperturbed(v1, v2, boundary);
            AddTriangleColor(c1, c2, boundaryColor);
        }

        AddTriangleUnperturbed(v2, Perturb(left), boundary);
        AddTriangleColor(c2, leftCell.Color, boundaryColor);
    }
Пример #2
0
    void TriangulateCornerTerraces(
        Vector3 begin, HexCell beginCell,
        Vector3 left, HexCell leftCell,
        Vector3 right, HexCell rightCell
        )
    {
        Vector3 v3 = HecMetrics.TerraceLerp(begin, left, 1);
        Vector3 v4 = HecMetrics.TerraceLerp(begin, right, 1);
        Color   c3 = HecMetrics.TerranceLerp(beginCell.Color, leftCell.Color, 1);
        Color   c4 = HecMetrics.TerranceLerp(beginCell.Color, rightCell.Color, 1);

        AddTriangle(begin, v3, v4);
        AddTriangleColor(beginCell.Color, c3, c4);

        for (int i = 2; i < HecMetrics.terraceSteps; i++)
        {
            Vector3 v1 = v3;
            Vector3 v2 = v4;
            Color   c1 = c3;
            Color   c2 = c4;
            v3 = HecMetrics.TerraceLerp(begin, left, i);
            v4 = HecMetrics.TerraceLerp(begin, right, i);
            c3 = HecMetrics.TerranceLerp(beginCell.Color, leftCell.Color, i);
            c4 = HecMetrics.TerranceLerp(beginCell.Color, rightCell.Color, i);
            AddQuad(v1, v2, v3, v4);
            AddQuadColor(c1, c2, c3, c4);
        }

        AddQuad(v3, v4, left, right);
        AddQuadColor(c3, c4, leftCell.Color, rightCell.Color);
    }
Пример #3
0
    Vector3 Perturb(Vector3 position)
    {
        Vector4 sample = HecMetrics.SampleNoise(position);

        position.x += (sample.x * 2f - 1f) * HecMetrics.cellPerturbStrength;
        position.z += (sample.z * 2f - 1f) * HecMetrics.cellPerturbStrength;
        return(position);
    }
Пример #4
0
    public static EdgeVertices TerraceLerp(
        EdgeVertices a, EdgeVertices b, int step)
    {
        EdgeVertices result;

        result.v1 = HecMetrics.TerraceLerp(a.v1, b.v1, step);
        result.v2 = HecMetrics.TerraceLerp(a.v2, b.v2, step);
        result.v3 = HecMetrics.TerraceLerp(a.v3, b.v3, step);
        result.v4 = HecMetrics.TerraceLerp(a.v4, b.v4, step);
        return(result);
    }
Пример #5
0
    void Triangulate(HexDirection direction, HexCell cell)
    {
        Vector3      center = cell.Position;
        EdgeVertices e      = new EdgeVertices(center + HecMetrics.GetFirstSolidCorner(direction), center + HecMetrics.GetSecondSolidCorner(direction));

        TriangulateEdgeFan(center, e, cell.Color);

        if (direction <= HexDirection.SE)
        {
            TriangulateConnection(direction, cell, e);
        }
    }
Пример #6
0
    void TriangulateEdgeTerraces(
        EdgeVertices begin, HexCell beginCell,
        EdgeVertices end, HexCell endCell
        )
    {
        EdgeVertices e2 = EdgeVertices.TerraceLerp(begin, end, 1);
        Color        c2 = HecMetrics.TerranceLerp(beginCell.Color, endCell.Color, 1);

        TriangulateEdgeStrip(begin, beginCell.Color, e2, c2);

        for (int i = 2; i < HecMetrics.terraceSteps; i++)
        {
            EdgeVertices e1 = e2;
            Color        c1 = c2;
            e2 = EdgeVertices.TerraceLerp(begin, end, i);
            c2 = HecMetrics.TerranceLerp(beginCell.Color, endCell.Color, i);
            TriangulateEdgeStrip(e1, c1, e2, c2);
        }

        TriangulateEdgeStrip(e2, c2, end, endCell.Color);
    }
Пример #7
0
    void TriangulateConnection(
        HexDirection direction, HexCell cell, EdgeVertices e1
        )
    {
        HexCell neighbor = cell.GetNeighbor(direction);

        if (neighbor == null)
        {
            return;
        }

        Vector3 bridge = HecMetrics.GetBridge(direction);

        bridge.y = neighbor.Position.y - cell.Position.y;
        EdgeVertices e2 = new EdgeVertices(
            e1.v1 + bridge,
            e1.v4 + bridge
            );

        if (cell.GetEdgeType(direction) == HexEdgeType.slope)
        {
            TriangulateEdgeTerraces(e1, cell, e2, neighbor);
        }
        else
        {
            TriangulateEdgeStrip(e1, cell.Color, e2, neighbor.Color);
        }

        HexCell nextNeighbor = cell.GetNeighbor(direction.Next());

        if (direction <= HexDirection.E && nextNeighbor != null)
        {
            Vector3 v5 = e1.v4 + HecMetrics.GetBridge(direction.Next());
            v5.y = nextNeighbor.Position.y;

            if (cell.Elevation <= neighbor.Elevation)
            {
                if (cell.Elevation <= nextNeighbor.Elevation)
                {
                    TriangulateCorner(
                        e1.v4, cell, e2.v4, neighbor, v5, nextNeighbor
                        );
                }
                else
                {
                    TriangulateCorner(
                        v5, nextNeighbor, e1.v4, cell, e2.v4, neighbor
                        );
                }
            }
            else if (neighbor.Elevation <= nextNeighbor.Elevation)
            {
                TriangulateCorner(
                    e2.v4, neighbor, v5, nextNeighbor, e1.v4, cell
                    );
            }
            else
            {
                TriangulateCorner(
                    v5, nextNeighbor, e1.v4, cell, e2.v4, neighbor
                    );
            }
        }
    }
Пример #8
0
 public HexEdgeType GetEdgeType(HexDirection direction)
 {
     return(HecMetrics.GetEdgeType(elevation, neighbors[(int)direction].elevation));
 }
Пример #9
0
 public HexEdgeType GetEdgeType(HexCell othercell)
 {
     return(HecMetrics.GetEdgeType(elevation, othercell.elevation));
 }