Esempio n. 1
0
 public Color GetColor()
 {
     if (IsUnderwater)
     {
         return(TriMetrics.FromARGB(255, 0, 0, 255));
     }
     if (Statics)
     {
         if (Statics is Natural)
         {
             return(Color.green);
         }
         else if (Statics is Building)
         {
             return(TriMetrics.FromARGB(255, 139, 69, 19));
         }
         else
         {
             return(TriMetrics.FromARGB(255, 255, 248, 220));
         }
     }
     else
     {
         return(Color);
     }
 }
Esempio n. 2
0
    public void RecalculateTerrain(TriCell cell)
    {
        Vector3      nextCorner, prevCorner;
        EdgeVertices edge;

        for (TriDirection direction = TriDirection.VERT; direction <= TriDirection.RIGHT; direction++)
        {
            Vector3 center = cell.Position, v1, v2;
            v1         = center + (cell.inverted ? -1 : 1) * TriMetrics.GetFirstSolidCorner(direction);
            v2         = center + (cell.inverted ? -1 : 1) * TriMetrics.GetSecondSolidCorner(direction);
            edge       = new EdgeVertices(v1, v2);
            nextCorner = (center + edge.v1) / 2f;
            prevCorner = (center + edge.v5) / 2f;
            terrainSelectionViewer.AddTriangle(nextCorner, edge.v1, edge.v2);
            terrainSelectionViewer.AddTriangle(prevCorner, edge.v4, edge.v5);
            terrainSelectionViewer.AddTriangle(center, edge.v2, edge.v4);
            terrainSelectionViewer.AddTriangle(center, edge.v4, prevCorner);
            terrainSelectionViewer.AddTriangle(center, nextCorner, edge.v2);

            terrainSelectionViewer.AddTriangleColor(Color.blue);
            terrainSelectionViewer.AddTriangleColor(Color.blue);
            terrainSelectionViewer.AddTriangleColor(Color.blue);
            terrainSelectionViewer.AddTriangleColor(Color.blue);
            terrainSelectionViewer.AddTriangleColor(Color.blue);
        }
    }
Esempio n. 3
0
    public void RecalculateTerrain(TriCell cell, bool buildable)
    {
        Vector3      nextCorner, prevCorner;
        EdgeVertices edge;

        for (TriDirection direction = TriDirection.VERT; direction <= TriDirection.RIGHT; direction++)
        {
            Vector3 center = cell.Position, v1, v2;
            //entityMenu.transform.localPosition = center + new Vector3(0, 20, 0);
            v1         = center + (cell.inverted ? -1 : 1) * TriMetrics.GetFirstSolidCorner(direction);
            v2         = center + (cell.inverted ? -1 : 1) * TriMetrics.GetSecondSolidCorner(direction);
            edge       = new EdgeVertices(v1, v2);
            nextCorner = (center + edge.v1) / 2f;
            prevCorner = (center + edge.v5) / 2f;
            AddTriangle(nextCorner, edge.v1, edge.v2);
            AddTriangle(prevCorner, edge.v4, edge.v5);
            AddTriangle(center, edge.v2, edge.v4);
            AddTriangle(center, edge.v4, prevCorner);
            AddTriangle(center, nextCorner, edge.v2);
            Color c = buildable ? Color.blue : Color.red;
            AddTriangleColor(c);
            AddTriangleColor(c);
            AddTriangleColor(c);
            AddTriangleColor(c);
            AddTriangleColor(c);
        }
    }
Esempio n. 4
0
    public void AddTriangle(Vector3 v1, Vector3 v2, Vector3 v3)
    {
        int vertexIndex = vertices.Count;

        vertices.Add(TriMetrics.Perturb(v1));
        vertices.Add(TriMetrics.Perturb(v2));
        vertices.Add(TriMetrics.Perturb(v3));
        triangles.Add(vertexIndex++);
        triangles.Add(vertexIndex++);
        triangles.Add(vertexIndex);
    }
Esempio n. 5
0
    public void AddQuad(Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4)
    {
        int vertexIndex = vertices.Count;

        vertices.Add(TriMetrics.Perturb(v1));
        vertices.Add(TriMetrics.Perturb(v2));
        vertices.Add(TriMetrics.Perturb(v3));
        vertices.Add(TriMetrics.Perturb(v4));
        triangles.Add(vertexIndex);
        triangles.Add(vertexIndex + 2);
        triangles.Add(vertexIndex + 1);
        triangles.Add(vertexIndex + 1);
        triangles.Add(vertexIndex + 2);
        triangles.Add(vertexIndex + 3);
    }
Esempio n. 6
0
    void EvolveClimate(int cellIndex)
    {
        TriCell     cell = grid.GetCell(cellIndex);
        ClimateData cellClimate = climate[cellIndex];
        float       tMoisture = cellClimate.moisture, tClouds = cellClimate.clouds;

        if (cell.IsUnderwater)
        {
            tMoisture = 1f;
            tClouds  += evaporationFactor;
        }
        else
        {
            float evaporation = tMoisture * evaporationFactor;
            tMoisture -= evaporation;
            tClouds   += evaporation;
        }
        float precipitation = tClouds * precipitationFactor;

        tClouds   -= precipitation;
        tMoisture += precipitation;
        //SetClimateData(cellIndex, tMoisture, tClouds);
        float cloudDispersal = tClouds * (1f / 6f);
        float runoff         = tMoisture * runoffFactor * (1f / 6f);

        for (int i = 0; i < 4; i++)
        {
            TriCell neighbor = grid.GetCell(TriMetrics.TriToHex(cell.coordinates) + new Vector2Int(TriMetrics.hexDir[i, 0], TriMetrics.hexDir[i, 1]));
            if (!neighbor)
            {
                continue;
            }
            ClimateData neighborClimate = climate[neighbor.Index];
            float       tNMoisture = neighborClimate.moisture, tNClouds = neighborClimate.clouds;
            tNClouds += cloudDispersal;
            int elevationDelta = neighbor.Elevation - cell.Elevation;
            if (elevationDelta < 0)
            {
                tMoisture  -= runoff;
                tNMoisture += runoff;
            }
            SetClimateData(neighbor.Index, tNMoisture, tNClouds);
            //climate[neighbor.Index] = neighborClimate;
        }
        tClouds = 0f;
        SetClimateData(cellIndex, tMoisture, tClouds);
        //climate[cellIndex] = cellClimate;
    }
Esempio n. 7
0
    void Triangulate(TriDirection direction, TriCell cell)
    {
        int inverter = 0;

        if (cell.inverted)
        {
            inverter = -1;
        }
        else
        {
            inverter = 1;
        }

        Vector3 center = cell.Position, v1, v2;

        v1 = center + inverter * TriMetrics.GetFirstSolidCorner(direction);
        v2 = center + inverter * TriMetrics.GetSecondSolidCorner(direction);
        EdgeVertices e = new EdgeVertices(v1, v2);

        if (cell.IsUnderwater)
        {
            TriangulateWater(center, e);
        }
        if (cell.HasRiverThroughEdge(direction))
        {
            TriangulateWithRiver(cell, direction, center, e, cell.Color);
        }
        else
        {
            TriangulateEdgeFan(center, e, cell.Color);
        }
        if (cell.inverted)
        {
            if (direction != TriDirection.LEFT)
            {
                TriangulateConnection(direction, cell, e, inverter);
            }
        }
        else
        {
            if (direction == TriDirection.LEFT)
            {
                TriangulateConnection(direction, cell, e, inverter);
            }
        }
    }
Esempio n. 8
0
    void TriangulateConnection(TriDirection direction, TriCell cell, EdgeVertices e1, int inverter)
    {
        Vector3 center   = cell.transform.localPosition;
        TriCell neighbor = cell.GetNeighbor(direction);

        if (neighbor == null)
        {
            return;
        }
        Vector3 bridge = TriMetrics.GetBridge(direction);

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

        TriangulateEdgeStrip(terrain, e1, cell.Color, e2, neighbor.Color, cell.HasRiverThroughEdge(direction));
    }
Esempio n. 9
0
    void CreateClimate()
    {
        climate.Clear();
        ClimateData initialData = new ClimateData();

        for (int i = 0; i < cellCount; i++)
        {
            climate.Add(initialData);
        }
        for (int cycle = 0; cycle < 40; cycle++)
        {
            for (int i = 0; i < cellCount; i++)
            {
                TriCoordinates t = grid.GetCell(i).coordinates;
                if (t == TriMetrics.TriToHex(t))
                {
                    EvolveClimate(i);
                }
            }
        }
    }
Esempio n. 10
0
    IEnumerator <WaitForEndOfFrame> CreateClimate()
    {
        climate.Clear();
        ClimateData initialData = new ClimateData();

        for (int i = 0; i < cellCount; i++)
        {
            climate.Add(initialData);
        }
        for (int cycle = 0; cycle < 40; cycle++)
        {
            for (int i = 0; i < cellCount; i++)
            {
                TriCoordinates t = grid.GetCell(i).coordinates;
                if (t == TriMetrics.TriToHex(t))
                {
                    EvolveClimate(i);
                }
            }
        }
        yield return(null);
    }
Esempio n. 11
0
    TriCell GetRandomCell()
    {
        TriCoordinates t = TriMetrics.TriToHex(new TriCoordinates(Random.Range(xMin, xMax), Random.Range(zMin, zMax)));

        return(grid.GetCell(t.X, t.Z));
    }
Esempio n. 12
0
 IEnumerator <WaitForEndOfFrame> SetTerrainType()
 {
     for (int i = 0; i < cellCount; i++)
     {
         TriCell cell = grid.GetCell(i), hexCell = grid.GetCell(TriMetrics.TriToHex(cell.coordinates));
         if (cell.coordinates == hexCell.coordinates)
         {
             float        moisture = climate[hexCell.Index].moisture;
             TriDirection d        = TriDirection.VERT;
             TriIsland    isle     = TriIsland.Instance;
             for (int j = 0; j < 6; j++)
             {
                 if (!cell)
                 {
                     break;
                 }
                 if (!cell.IsUnderwater)
                 {
                     if (cell.Elevation > 10)
                     {
                         cell.TerrainTypeIndex = 4;
                     }
                     else if (moisture < 0.02f)
                     {
                         cell.TerrainTypeIndex = 3;
                         if (Random.value < 0.5f && !cell.HasRiver)
                         {
                             Tree t = (Tree)Instantiate(TriIsland.GetNaturalPrefabs((int)NaturalType.TREE, 0), isle.transform);
                             t.Location          = cell;
                             t.EntranceDirection = (TriDirection)((int)(Random.value * 3f));
                             entities.AddNatural(t);
                         }
                     }
                     else if (moisture < 0.12f)
                     {
                         cell.TerrainTypeIndex = 2;
                         if (Random.value < 0.2f && !cell.HasRiver)
                         {
                             Tree t = (Tree)Instantiate(TriIsland.GetNaturalPrefabs((int)NaturalType.TREE, 0), isle.transform);
                             t.Location          = cell;
                             t.EntranceDirection = (TriDirection)((int)(Random.value * 3f));
                             entities.AddNatural(t);
                         }
                     }
                     else if (moisture < 0.20f)
                     {
                         cell.TerrainTypeIndex = 1;
                     }
                     else if (moisture < 0.85f)
                     {
                         cell.TerrainTypeIndex = 0;
                     }
                     else
                     {
                         cell.TerrainTypeIndex = 0;
                     }
                 }
                 else
                 {
                     cell.TerrainTypeIndex = 1;
                 }
                 cell = cell.GetNeighbor(d);
                 if (hexCell.inverted)
                 {
                     d = d.Next();
                 }
                 else
                 {
                     d = d.Previous();
                 }
             }
             if (i % Metrics.refreshLimit == 0)
             {
                 yield return(null);
             }
         }
     }
 }
Esempio n. 13
0
    int RaiseTerrain(int chunkSize, int budget, bool initiated)
    {
        searchFrontierPhase += 1;
        TriCoordinates center = grid.GetCell(grid.cellCountX / 2, grid.cellCountZ / 2).coordinates;

        center = TriMetrics.TriToHex(center);
        TriCell firstCell = grid.GetCell(center.X, center.Z);

        if (initiated)
        {
            do
            {
                firstCell = GetRandomCell();
            } while (firstCell.Elevation < 1);
        }
        searchFrontier.Enqueue(firstCell);
        center = firstCell.coordinates;
        checker.Add(center);
        int size = 0;

        while (size < chunkSize && searchFrontier.Count > 0)
        {
            TriCell current = searchFrontier.Dequeue();
            if (current.Elevation < elevationMaximum)
            {
                TriDirection d = TriDirection.VERT;
                TriCell      k = current;
                if (k.Elevation < elevationMaximum)
                {
                    if (k.Elevation == 0)
                    {
                        budget -= 6;
                    }
                    for (int i = 0; i < 6; i++)
                    {
                        if (!k)
                        {
                            break;
                        }
                        k.Elevation += 1;
                        k            = k.GetNeighbor(d);
                        if (current.inverted)
                        {
                            d = d.Next();
                        }
                        else
                        {
                            d = d.Previous();
                        }
                    }
                }
            }

            if (current.Elevation == 1 && budget == 0)
            {
                break;
            }
            size += 6;
            TriCoordinates coord = current.coordinates;
            for (int i = 0; i < 4; i++)
            {
                TriCell neighbor = grid.GetCell(coord.X + TriMetrics.hexDir[i, 0], coord.Z + TriMetrics.hexDir[i, 1]);
                if (neighbor && checkbounds(neighbor.coordinates) && !checker.Contains(neighbor.coordinates) && (i == 3 || Random.value < jitterProbability ? true : false))
                {
                    searchFrontier.Enqueue(neighbor);
                    checker.Add(neighbor.coordinates);
                }
            }
        }
        searchFrontier.Clear();
        checker.Clear();
        return(budget);
    }