Esempio n. 1
0
    public void Generate(Map map)
    {
        int w = map.Width;
        int h = map.Height;
        int faces = 0;          // face count needed
        int vCount = 0;         // total vertices
        int index = 0;
        int[, ,] indexMap = new int[w + 1, h + 1, 2];

        for (int x = 0; x < w + 1; ++x)
        {
            for (int y = 0; y < h + 1; ++y)
            {
                if (map.IsSquareOnLevel(x, y, 1))
                {
                    ++vCount;

                    if (map.IsSquareOnLevel(x, y, 0))
                    {
                        ++vCount;
                    }
                }
            }
        }
        vertices = new Vector3[vCount];

        index = 0;
        for (int x = 0; x < w + 1; ++x)
        {
            for (int y = 0; y < h + 1; ++y)
            {
                if (map.IsSquareOnLevel(x, y, 1))
                {
                    vertices[index] = new Vector3(x, 1, y);
                    indexMap[x, y, 1] = index;
                    ++index;

                    if (map.IsSquareOnLevel(x, y, 0))
                    {
                        vertices[index] = new Vector3(x, 0, y);
                        indexMap[x, y, 0] = index;
                        ++index;
                    }
                }
            }
        }

        for (int x = 0; x < w; ++x)
        {
            for (int y = 0; y < h; ++y)
            {
                int t = map.GetHeight(x, y);
                if (t > 0)
                {
                    if (map.GetHeight(x + 1, y) < 1)
                    {
                        ++faces;
                    }

                    if (map.GetHeight(x - 1, y) < 1)
                    {
                        ++faces;
                    }

                    if (map.GetHeight(x, y + 1) < 1)
                    {
                        ++faces;
                    }

                    if (map.GetHeight(x, y - 1) < 1)
                    {
                        ++faces;
                    }

                    ++faces;
                }
            }
        }
        triangles = new int[faces * 3 * 2];

        index = 0;
        for (int x = 0; x < w; ++x)
        {
            for (int y = 0; y < h; ++y)
            {
                if (map.IsLevel(x, y, 1))
                {
                    // top
                    triangles[index++] = indexMap[x, y, 1];
                    triangles[index++] = indexMap[x, y + 1, 1];
                    triangles[index++] = indexMap[x + 1, y + 1, 1];

                    triangles[index++] = indexMap[x, y, 1];
                    triangles[index++] = indexMap[x + 1, y + 1, 1];
                    triangles[index++] = indexMap[x + 1, y, 1];

                    if (map.GetHeight(x + 1, y) < 1)
                    {
                        // East
                        triangles[index++] = indexMap[x + 1, y + 1, 1];
                        triangles[index++] = indexMap[x + 1, y, 0];
                        triangles[index++] = indexMap[x + 1, y, 1];

                        triangles[index++] = indexMap[x + 1, y, 0];
                        triangles[index++] = indexMap[x + 1, y + 1, 1];
                        triangles[index++] = indexMap[x + 1, y + 1, 0];
                    }

                    if (map.GetHeight(x - 1, y) < 1)
                    {
                        // West
                        triangles[index++] = indexMap[x, y, 1];
                        triangles[index++] = indexMap[x, y + 1, 0];
                        triangles[index++] = indexMap[x, y + 1, 1];

                        triangles[index++] = indexMap[x, y, 0];
                        triangles[index++] = indexMap[x, y + 1, 0];
                        triangles[index++] = indexMap[x, y, 1];
                    }

                    if (map.GetHeight(x, y + 1) < 1)
                    {
                        // North
                        triangles[index++] = indexMap[x + 1, y + 1, 1];
                        triangles[index++] = indexMap[x, y + 1, 1];
                        triangles[index++] = indexMap[x + 1, y + 1, 0];

                        triangles[index++] = indexMap[x + 1, y + 1, 0];
                        triangles[index++] = indexMap[x, y + 1, 1];
                        triangles[index++] = indexMap[x, y + 1, 0];
                    }

                    if (map.GetHeight(x, y - 1) < 1)
                    {
                        // South
                        triangles[index++] = indexMap[x + 1, y, 1];
                        triangles[index++] = indexMap[x, y, 0];
                        triangles[index++] = indexMap[x, y, 1];

                        triangles[index++] = indexMap[x + 1, y, 0];
                        triangles[index++] = indexMap[x, y, 0];
                        triangles[index++] = indexMap[x + 1, y, 1];
                    }
                }
            }
        }
    }