public VoxelPlayGreedySliceLit()
 {
     qq = new QuadFull[VoxelPlayEnvironment.CHUNK_SIZE * VoxelPlayEnvironment.CHUNK_SIZE];
     for (int k = 0; k < qq.Length; k++)
     {
         qq [k] = new QuadFull();
     }
 }
Esempio n. 2
0
 public VoxelPlayGreedySliceFullVertexData()
 {
     qq = new QuadFull[256];
     for (int k = 0; k < qq.Length; k++)
     {
         qq [k] = new QuadFull();
     }
 }
 public void AddQuad(float x, float y, Color32 color, float light, int textureIndex)
 {
     if (qqCount > 0 && lastQ.y == y && lastQ.x + lastQ.w == x && lastQ.textureIndex == textureIndex && lastQ.light == light && lastQ.color.r == color.r && lastQ.color.g == color.g && lastQ.color.b == color.b)
     {
         lastQ.w++;
     }
     else
     {
         QuadFull q = lastQ = qq [qqCount++];
         q.x            = x;
         q.y            = y;
         q.w            = 1;
         q.h            = 1;
         q.color        = color;
         q.light        = light;
         q.textureIndex = textureIndex;
         q.used         = false;
     }
 }
Esempio n. 4
0
 public void AddQuad(int x, int y, ref Vector3 normal, ref Color32 color, float light, int textureIndex)
 {
     if (qqCount > 0 && lastQ.y == y && lastQ.x + lastQ.w == x && lastQ.textureIndex == textureIndex && lastQ.light == light && lastQ.normal.x == normal.x && lastQ.normal.y == normal.y && lastQ.normal.z == normal.z && lastQ.color.r == color.r && lastQ.color.g == color.g && lastQ.color.b == color.b)
     {
         lastQ.w++;
     }
     else
     {
         QuadFull q = lastQ = qq [qqCount++];
         q.x            = x;
         q.y            = y;
         q.w            = 1;
         q.h            = 1;
         q.normal       = normal;
         q.color        = color;
         q.light        = light;
         q.textureIndex = textureIndex;
         q.used         = false;
     }
 }
        public void FlushTriangles(FaceDirection direction, int slice, List <Vector3> vertices, List <int> indices, List <Vector4> uv0, List <Vector3> normals, List <Color32> colors)
        {
            if (qqCount == 0)
            {
                return;
            }
            Vector3 pos;
            Vector4 uv;
            Vector3 normal;

            switch (direction)
            {
            case FaceDirection.Back: normal = Misc.vector3back; break;

            case FaceDirection.Forward: normal = Misc.vector3forward; break;

            case FaceDirection.Left: normal = Misc.vector3left; break;

            case FaceDirection.Right: normal = Misc.vector3right; break;

            case FaceDirection.Top: normal = Misc.vector3up; break;

            default: normal = Misc.vector3down; break;
            }
            int  index        = vertices.Count;
            bool enableColors = colors != null;

            for (int k = 0; k < qqCount; k++)
            {
                QuadFull q1 = qq [k];
                if (q1.used)
                {
                    continue;
                }
                for (int j = k + 1; j < qqCount; j++)
                {
                    QuadFull q2 = qq [j];
                    if (q2.used)
                    {
                        continue;
                    }
                    if (q1.y == q2.y && q1.h == q2.h && q1.x + q1.w == q2.x && q1.textureIndex == q2.textureIndex && q1.light == q2.light && q1.color.r == q2.color.r && q1.color.g == q2.color.g && q1.color.b == q2.color.b)
                    {
                        q1.w   += q2.w;
                        q2.used = true;
                        continue;
                    }
                    if (q1.x == q2.x && q1.w == q2.w && q1.y + q1.h == q2.y && q1.textureIndex == q2.textureIndex && q1.light == q2.light && q1.color.r == q2.color.r && q1.color.g == q2.color.g && q1.color.b == q2.color.b)
                    {
                        q1.h   += q2.h;
                        q2.used = true;
                        continue;
                    }
                }
                uv.x = 0;
                uv.y = 0;
                uv.z = q1.textureIndex;
                uv.w = q1.light;
                uv0.Add(uv);
                switch (direction)
                {
                case FaceDirection.Top:
                    pos.y = slice - (VoxelPlayEnvironment.CHUNK_HALF_SIZE - 1);
                    pos.x = q1.x - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    pos.z = q1.y - VoxelPlayEnvironment.CHUNK_HALF_SIZE + q1.h;
                    vertices.Add(pos);
                    pos.x += q1.w;
                    vertices.Add(pos);
                    pos.x -= q1.w;
                    pos.z -= q1.h;
                    vertices.Add(pos);
                    pos.x += q1.w;
                    vertices.Add(pos);
                    // tex coords
                    uv.y = q1.w;
                    uv0.Add(uv);
                    uv.x = q1.h;
                    uv.y = 0f;
                    uv0.Add(uv);
                    uv.y = q1.w;
                    uv0.Add(uv);
                    break;

                case FaceDirection.Bottom:
                    pos.y = slice - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    pos.x = q1.x - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    pos.z = q1.y - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    vertices.Add(pos);
                    pos.x += q1.w;
                    vertices.Add(pos);
                    pos.x -= q1.w;
                    pos.z += q1.h;
                    vertices.Add(pos);
                    pos.x += q1.w;
                    vertices.Add(pos);
                    // tex coords
                    uv.y = q1.w;
                    uv0.Add(uv);
                    uv.x = q1.h;
                    uv.y = 0f;
                    uv0.Add(uv);
                    uv.y = q1.w;
                    uv0.Add(uv);
                    break;

                case FaceDirection.Left:
                    pos.x = slice - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    pos.z = q1.x - VoxelPlayEnvironment.CHUNK_HALF_SIZE + q1.w;
                    pos.y = q1.y - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    vertices.Add(pos);
                    pos.y += q1.h;
                    vertices.Add(pos);
                    pos.y -= q1.h;
                    pos.z -= q1.w;
                    vertices.Add(pos);
                    pos.y += q1.h;
                    vertices.Add(pos);
                    // tex coords
                    uv.y = q1.h;
                    uv0.Add(uv);
                    uv.x = q1.w;
                    uv.y = 0f;
                    uv0.Add(uv);
                    uv.y = q1.h;
                    uv0.Add(uv);
                    break;

                case FaceDirection.Right:
                    pos.x = slice - (VoxelPlayEnvironment.CHUNK_HALF_SIZE - 1);
                    pos.z = q1.x - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    pos.y = q1.y - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    vertices.Add(pos);
                    pos.y += q1.h;
                    vertices.Add(pos);
                    pos.z += q1.w;
                    pos.y -= q1.h;
                    vertices.Add(pos);
                    pos.y += q1.h;
                    vertices.Add(pos);
                    // tex coords
                    uv.y = q1.h;
                    uv0.Add(uv);
                    uv.x = q1.w;
                    uv.y = 0f;
                    uv0.Add(uv);
                    uv.y = q1.h;
                    uv0.Add(uv);
                    break;

                case FaceDirection.Back:
                    pos.z = slice - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    pos.x = q1.x - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    pos.y = q1.y - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    vertices.Add(pos);
                    pos.y += q1.h;
                    vertices.Add(pos);
                    pos.x += q1.w;
                    pos.y -= q1.h;
                    vertices.Add(pos);
                    pos.y += q1.h;
                    vertices.Add(pos);
                    // tex coords
                    uv.y = q1.h;
                    uv0.Add(uv);
                    uv.x = q1.w;
                    uv.y = 0f;
                    uv0.Add(uv);
                    uv.y = q1.h;
                    uv0.Add(uv);
                    break;

                case FaceDirection.Forward:
                    pos.z = slice - (VoxelPlayEnvironment.CHUNK_HALF_SIZE - 1);
                    pos.x = q1.x - VoxelPlayEnvironment.CHUNK_HALF_SIZE + q1.w;
                    pos.y = q1.y - VoxelPlayEnvironment.CHUNK_HALF_SIZE;
                    vertices.Add(pos);
                    pos.y += q1.h;
                    vertices.Add(pos);
                    pos.x -= q1.w;
                    pos.y -= q1.h;
                    vertices.Add(pos);
                    pos.y += q1.h;
                    vertices.Add(pos);
                    // tex coords
                    uv.y = q1.h;
                    uv0.Add(uv);
                    uv.x = q1.w;
                    uv.y = 0f;
                    uv0.Add(uv);
                    uv.y = q1.h;
                    uv0.Add(uv);
                    break;
                }

                if (enableColors)
                {
                    colors.Add(q1.color);
                    colors.Add(q1.color);
                    colors.Add(q1.color);
                    colors.Add(q1.color);
                }

                normals.Add(normal);
                normals.Add(normal);
                normals.Add(normal);
                normals.Add(normal);

                indices.Add(index);
                indices.Add(index + 1);
                indices.Add(index + 2);
                indices.Add(index + 3);
                indices.Add(index + 2);
                indices.Add(index + 1);
                index += 4;
            }

            // Clear for next usage
            qqCount = 0;
        }