public void BuildMesh()
    {
        MagicTileSet magic_tile_set = LoadMagicTile();
        TileMeshData tile_mesh_data = new TileMeshData(magic_tile_set);

        tile_mesh_data.BuildMesh(GetComponent <MeshFilter> (),
                                 GetComponent <MeshRenderer> (), //this one doesnt seem to be used
                                 GetComponent <MeshCollider> ());
    }
Beispiel #2
0
    private static void AddTileToLevel(LevelEnvironmentData data, TileData tile, Vector3 worldPosition, byte bitmask)
    {
        int verticeCount = data.Vertices.Count;

        TileMeshData meshData = tile.Brush.GetMeshData(bitmask);

        // Vertices.
        foreach (Vector3 vertex in meshData.Vertices)
        {
            data.Vertices.Add(Utility.ScaleToHexagonalSize(vertex) + worldPosition);
        }

        // Triangles.
        int[][] rawTriangles = meshData.Triangles;
        for (int i = 0; i < rawTriangles.Length; i++)
        {
            int[] trianglesToSet = new int[rawTriangles[i].Length];

            // Offset the triangles
            for (int w = 0; w < rawTriangles[i].Length; w++)
            {
                trianglesToSet[w] = rawTriangles[i][w] + verticeCount;
            }

            data.SetTriangles(tile.BrushMaterials[i], trianglesToSet);
        }

        // UVs.
        foreach (Vector2 uv in meshData.UVs)
        {
            data.UVs.Add(uv);
        }

        // Edges.
        if (!AxialDirection.ContainsDirection(bitmask, AxialDirection.DownLeft) || !AxialDirection.ContainsDirection(bitmask, AxialDirection.DownRight))
        {
            EdgeBuilder.Build(data, tile, worldPosition, bitmask);
        }
    }
Beispiel #3
0
    private void MeshIt(Vector3Int[] tiles, float[,] noiseMap)
    {
        Vector3 toTopLeft  = -Vector3.right * .25f * hexWidth + Vector3.forward * .5f * hexHeight;
        Vector3 toTopRight = Vector3.right * .25f * hexWidth + Vector3.forward * .5f * hexHeight;
        Vector3 toRight    = Vector3.right * .5f * hexWidth;

        Dictionary <Vector3Int, TileMeshData> tileVertexCodex = new Dictionary <Vector3Int, TileMeshData>();

        int[] triangleIndices = new int[tiles.Length * 12];
        int   vertexIndex     = 0;
        int   triangleIndex   = 0;
        float minX            = float.MaxValue;
        float maxX            = float.MinValue;
        float minY            = float.MaxValue;
        float maxY            = float.MinValue;

        foreach (Vector3Int tile in tiles)
        {
            Vector3 tileCenter = tilemap.GetCellCenterWorld(tile);

            Vector3 topLeftCorner     = tileCenter + toTopLeft;
            Vector3 topRightCorner    = tileCenter + toTopRight;
            Vector3 rightCorner       = tileCenter + toRight;
            Vector3 bottomRightCorner = tileCenter - toTopLeft;
            Vector3 bottomLeftCorner  = tileCenter - toTopRight;
            Vector3 leftCorner        = tileCenter - toRight;

            minX = Mathf.Min(minX, leftCorner.x);
            maxX = Mathf.Max(maxX, rightCorner.x);
            minY = Mathf.Min(minY, bottomRightCorner.z);
            maxY = Mathf.Max(maxY, topRightCorner.z);


            TileMeshData tmd = new TileMeshData();
            tmd.verticeIndices = new Tuple <Vector3, int> [6];
            // look for shared vertices
            Vector3Int[] surroundingTiles = HexTools.GetSurroundingTilesOffset(tile);

            if (tileVertexCodex.TryGetValue(surroundingTiles[(int)Cardinality.N], out TileMeshData sharedData))
            {
                tmd.verticeIndices[(int)IndexOrder.TopLeft]  = new Tuple <Vector3, int>(topLeftCorner, sharedData.verticeIndices[(int)IndexOrder.BottomLeft].Item2);
                tmd.verticeIndices[(int)IndexOrder.TopRight] = new Tuple <Vector3, int>(topRightCorner, sharedData.verticeIndices[(int)IndexOrder.BottomRight].Item2);
            }

            if (tileVertexCodex.TryGetValue(surroundingTiles[(int)Cardinality.NE], out sharedData))
            {
                tmd.verticeIndices[(int)IndexOrder.TopRight] = new Tuple <Vector3, int>(topRightCorner, sharedData.verticeIndices[(int)IndexOrder.Left].Item2);
                tmd.verticeIndices[(int)IndexOrder.Right]    = new Tuple <Vector3, int>(rightCorner, sharedData.verticeIndices[(int)IndexOrder.BottomLeft].Item2);
            }

            if (tileVertexCodex.TryGetValue(surroundingTiles[(int)Cardinality.SE], out sharedData))
            {
                tmd.verticeIndices[(int)IndexOrder.Right]       = new Tuple <Vector3, int>(rightCorner, sharedData.verticeIndices[(int)IndexOrder.TopLeft].Item2);
                tmd.verticeIndices[(int)IndexOrder.BottomRight] = new Tuple <Vector3, int>(bottomRightCorner, sharedData.verticeIndices[(int)IndexOrder.Left].Item2);
            }

            if (tileVertexCodex.TryGetValue(surroundingTiles[(int)Cardinality.S], out sharedData))
            {
                tmd.verticeIndices[(int)IndexOrder.BottomRight] = new Tuple <Vector3, int>(bottomRightCorner, sharedData.verticeIndices[(int)IndexOrder.TopRight].Item2);
                tmd.verticeIndices[(int)IndexOrder.BottomLeft]  = new Tuple <Vector3, int>(bottomLeftCorner, sharedData.verticeIndices[(int)IndexOrder.TopLeft].Item2);
            }

            if (tileVertexCodex.TryGetValue(surroundingTiles[(int)Cardinality.SW], out sharedData))
            {
                tmd.verticeIndices[(int)IndexOrder.BottomLeft] = new Tuple <Vector3, int>(bottomLeftCorner, sharedData.verticeIndices[(int)IndexOrder.Right].Item2);
                tmd.verticeIndices[(int)IndexOrder.Left]       = new Tuple <Vector3, int>(leftCorner, sharedData.verticeIndices[(int)IndexOrder.TopRight].Item2);
            }

            if (tileVertexCodex.TryGetValue(surroundingTiles[(int)Cardinality.NW], out sharedData))
            {
                tmd.verticeIndices[(int)IndexOrder.Left]    = new Tuple <Vector3, int>(leftCorner, sharedData.verticeIndices[(int)IndexOrder.BottomRight].Item2);
                tmd.verticeIndices[(int)IndexOrder.TopLeft] = new Tuple <Vector3, int>(topLeftCorner, sharedData.verticeIndices[(int)IndexOrder.Right].Item2);
            }


            if (tmd.verticeIndices[(int)IndexOrder.TopLeft] == null)
            {
                tmd.verticeIndices[(int)IndexOrder.TopLeft] = new Tuple <Vector3, int>(topLeftCorner, vertexIndex++);
            }
            if (tmd.verticeIndices[(int)IndexOrder.TopRight] == null)
            {
                tmd.verticeIndices[(int)IndexOrder.TopRight] = new Tuple <Vector3, int>(topRightCorner, vertexIndex++);
            }
            if (tmd.verticeIndices[(int)IndexOrder.Right] == null)
            {
                tmd.verticeIndices[(int)IndexOrder.Right] = new Tuple <Vector3, int>(rightCorner, vertexIndex++);
            }
            if (tmd.verticeIndices[(int)IndexOrder.BottomRight] == null)
            {
                tmd.verticeIndices[(int)IndexOrder.BottomRight] = new Tuple <Vector3, int>(bottomRightCorner, vertexIndex++);
            }
            if (tmd.verticeIndices[(int)IndexOrder.BottomLeft] == null)
            {
                tmd.verticeIndices[(int)IndexOrder.BottomLeft] = new Tuple <Vector3, int>(bottomLeftCorner, vertexIndex++);
            }
            if (tmd.verticeIndices[(int)IndexOrder.Left] == null)
            {
                tmd.verticeIndices[(int)IndexOrder.Left] = new Tuple <Vector3, int>(leftCorner, vertexIndex++);
            }


            tileVertexCodex[tile] = tmd;


            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.TopLeft].Item2;
            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.TopRight].Item2;
            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.BottomRight].Item2;
            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.TopRight].Item2;
            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.Right].Item2;
            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.BottomRight].Item2;
            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.BottomRight].Item2;
            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.BottomLeft].Item2;
            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.TopLeft].Item2;
            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.BottomLeft].Item2;
            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.Left].Item2;
            triangleIndices[triangleIndex++] = tmd.verticeIndices[(int)IndexOrder.TopLeft].Item2;
        }

        Vector3[] vertices = new Vector3[vertexIndex];

        int mapX = noiseMap.GetLength(0);
        int mapY = noiseMap.GetLength(1);
        int i    = 0;

        foreach (var kvp in tileVertexCodex)
        {
            TileMeshData tmd = kvp.Value;
            foreach (Tuple <Vector3, int> verts in tmd.verticeIndices)
            {
                if (vertices[verts.Item2] != Vector3.zero)
                {
                    continue;                    // If the tilemap is positioned at 0,0 there should never be a vertex there
                }
                Vector3 pos      = verts.Item1;
                float   percentX = Mathf.InverseLerp(minX, maxX, pos.x);
                float   percentY = Mathf.InverseLerp(minY, maxY, pos.z);
                int     x        = Mathf.RoundToInt(percentX * (mapX - 1));
                int     y        = Mathf.RoundToInt(percentY * (mapY - 1));
                vertices[verts.Item2] = pos + new Vector3(0, noiseMap[x, y] * 5, 0);
                ++i;
            }
        }

        Mesh mesh = new Mesh();

        mesh.vertices  = vertices;
        mesh.triangles = triangleIndices;
        mesh.RecalculateBounds();

        GetComponent <MeshFilter>().sharedMesh = mesh;

        Debug.Log("i: " + i + " vertices: " + vertices.Length + " triangles: " + (triangleIndices.Length / 3));
    }
Beispiel #4
0
            public void Execute(int index)
            {
                byte configuration = 0;
                int3 dc            = CoordFromIndex(index, tileExtents);

                bool hasLF = dc.x > 0 && dc.z < dataExtents.Z && IsFilled(dc.x - 1, yLevel, dc.z);
                bool hasRF = dc.x < dataExtents.X && dc.z < dataExtents.Z && IsFilled(dc.x, yLevel, dc.z);
                bool hasLB = dc.x > 0 && dc.z > 0 && IsFilled(dc.x - 1, yLevel, dc.z - 1);
                bool hasRB = dc.x < dataExtents.X && dc.z > 0 && IsFilled(dc.x, yLevel, dc.z - 1);

                if (emptyBoundaries != Direction.All && (hasLF || hasRF || hasLB || hasRB))
                {
                    if (dc.x == 0 && !HasFlag(emptyBoundaries, Direction.XMinus))
                    {
                        hasLF = true; hasLB = true;
                    }
                    if (dc.x == dataExtents.X && !HasFlag(emptyBoundaries, Direction.XPlus))
                    {
                        hasRF = true; hasRB = true;
                    }
                    if (dc.z == 0 && !HasFlag(emptyBoundaries, Direction.ZMinus))
                    {
                        hasLB = true; hasRB = true;
                    }
                    if (dc.z == dataExtents.Z && !HasFlag(emptyBoundaries, Direction.ZPlus))
                    {
                        hasLF = true; hasRF = true;
                    }
                }

                if (hasLF)
                {
                    configuration |= Tile.LeftForward;
                }
                if (hasRF)
                {
                    configuration |= Tile.RightForward;
                }
                if (hasLB)
                {
                    configuration |= Tile.LeftBackward;
                }
                if (hasRB)
                {
                    configuration |= Tile.RightBackward;
                }

                var transformGroup = configs[configuration];

                var tileType = TileType.Normal;

                if (configuration == 0)
                {
                    tileType = TileType.Void;
                }
                else if (configuration == configs.Length - 1)
                {
                    if (skipCenter)
                    {
                        tileType = TileType.Void;
                    }
                    else
                    if (centerRandomRotation)
                    {
                        var rot = (PieceTransform)(1 << (2 + (index % 4)));
                        if ((byte)rot >= (byte)PieceTransform.Rotate90)
                        {
                            transformGroup = new ConfigTransformGroup(new TileTheme.ConfigTransform(transformGroup[0].BaseMeshIndex, rot));
                        }
                    }
                }
                else
                {
                    if (skipBorder)
                    {
                        tileType = TileType.Void;
                    }
                }

                tiles[index] = new TileMeshData {
                    type = tileType, configTransformGroup = transformGroup, variant0 = 0, variant1 = 0
                };
            }