コード例 #1
0
ファイル: Chunk.cs プロジェクト: lancelot2112/CubeEngine
 public void BuildVertices(CubeVertex[] buffer, GraphicsDevice graphics, CubeStorage store)
 {
     ChunkMesh currentMesh;
     int i = 0;
     while (i < HEIGHT)
     {
         currentMesh = new ChunkMesh(i, ref Position);
         currentMesh.BuildVertices(buffer, graphics, this, store);
         if(!currentMesh.Empty) Meshes.Add(currentMesh);
         i += Chunk.WIDTH;
     }
 }
コード例 #2
0
ファイル: Chunk.cs プロジェクト: lancelot2112/CubeEngine
        public void RebuildVertices(CubeVertex[] buffer, GraphicsDevice graphics, CubeStorage store, int yChange)
        {
            //ChunkMesh currentMesh;
            for (int i = 0; i < Meshes.Count; i++)
            {

            }
        }
コード例 #3
0
ファイル: ChunkMesh.cs プロジェクト: lancelot2112/CubeEngine
        public void BuildVertices(CubeVertex[] vertexBuffer, GraphicsDevice graphics, Chunk parent, CubeStorage store)
        {
            if (SideCountNeeded) CollectSubmeshStats(parent, store);
            if (vertexBuffer.Length < SidesRenderable * 6f) vertexBuffer = new CubeVertex[(int)(SidesRenderable * 6.1f)];

            Cube current;
            Cube n0;
            Cube n1;
            Cube n2;
            Cube n3;
            Cube n4;
            Cube n5;
            Cube n6;
            Cube n7;
            Cube n8;

            Vector3 offset;
            Vector3 posNNN;
            Vector3 posNNP;
            Vector3 posNPN;
            Vector3 posNPP;
            Vector3 posPNN;
            Vector3 posPNP;
            Vector3 posPPN;
            Vector3 posPPP;

            int ind = 0;
            int worldX = 0;
            int worldZ = 0;
            int reg=0;

            //int vert1light = 0;
            //int vert2light = 0;
            //int vert3light = 0;
            //int vert4light = 0;

            int maxY = Chunk.HEIGHT - 1;

            for (int x = 0; x < Chunk.WIDTH; x++)
            {
                worldX = x + parent.Coords.X * Chunk.WIDTH;
                for (int z = 0; z < Chunk.WIDTH; z++)
                {
                    worldZ = z + parent.Coords.Z * Chunk.WIDTH;
                    for (int y = _yStartIndex; y <= _yEndIndex; y++)
                    {
                        store.GetCube(worldX, y, worldZ, out current);

                        //log.Write("worldCoords", "{" + worldX.ToString() + "," + y.ToString() + "," + worldZ.ToString() + "}", "");

                        if (!current.IsRenderable) continue;

                        offset.X = x;
                        offset.Y = y - _yStartIndex;
                        offset.Z = z;

                        Vector3.Add(ref CubeVertex.CORNER_NNN, ref offset, out posNNN);
                        Vector3.Add(ref CubeVertex.CORNER_NNP, ref offset, out posNNP);
                        Vector3.Add(ref CubeVertex.CORNER_NPN, ref offset, out posNPN);
                        Vector3.Add(ref CubeVertex.CORNER_NPP, ref offset, out posNPP);
                        Vector3.Add(ref CubeVertex.CORNER_PNN, ref offset, out posPNN);
                        Vector3.Add(ref CubeVertex.CORNER_PNP, ref offset, out posPNP);
                        Vector3.Add(ref CubeVertex.CORNER_PPN, ref offset, out posPPN);
                        Vector3.Add(ref CubeVertex.CORNER_PPP, ref offset, out posPPP);

                        //-x
                        reg = worldX - 1;
                        store.GetCube(reg, y, worldZ, out n0);

                        if (n0.IsTransparent)
                        {
                            store.CheckYGetCube(reg, y + 1, worldZ, out n1);
                            store.CheckYGetCube(reg, y + 1, worldZ + 1, out n2);
                            store.GetCube(reg, y, worldZ + 1, out n3);
                            store.CheckYGetCube(reg, y - 1, worldZ + 1, out n4);
                            store.CheckYGetCube(reg, y - 1, worldZ, out n5);
                            store.CheckYGetCube(reg, y - 1, worldZ - 1, out n6);
                            store.GetCube(reg, y, worldZ - 1, out n7);
                            store.CheckYGetCube(reg, y + 1, worldZ - 1, out n8);

                            vertexBuffer[ind++] = new CubeVertex(ref posNPN, ref CubeVertex.N_NEG_X, ref CubeVertex.TC00, ref current, ref n0, ref n1, ref n7, ref n8);
                            vertexBuffer[ind++] = new CubeVertex(ref posNPP, ref CubeVertex.N_NEG_X, ref CubeVertex.TC10, ref current, ref n0, ref n1, ref n2, ref n3);
                            vertexBuffer[ind++] = new CubeVertex(ref posNNN, ref CubeVertex.N_NEG_X, ref CubeVertex.TC01, ref current, ref n0, ref n5, ref n6, ref n7);
                            vertexBuffer[ind++] = new CubeVertex(ref posNNN, ref CubeVertex.N_NEG_X, ref CubeVertex.TC01, ref current, ref n0, ref n5, ref n6, ref n7);
                            vertexBuffer[ind++] = new CubeVertex(ref posNPP, ref CubeVertex.N_NEG_X, ref CubeVertex.TC10, ref current, ref n0, ref n1, ref n2, ref n3);
                            vertexBuffer[ind++] = new CubeVertex(ref posNNP, ref CubeVertex.N_NEG_X, ref CubeVertex.TC11, ref current, ref n0, ref n3, ref n4, ref n5);
                        }

                        //+x
                        reg = worldX + 1;
                        store.GetCube(reg, y, worldZ, out n0);

                        if (n0.IsTransparent)
                        {
                            store.CheckYGetCube(reg, y + 1, worldZ, out n1);
                            store.CheckYGetCube(reg, y + 1, worldZ + 1, out n2);
                            store.GetCube(reg, y, worldZ + 1, out n3);
                            store.CheckYGetCube(reg, y - 1, worldZ + 1, out n4);
                            store.CheckYGetCube(reg, y - 1, worldZ, out n5);
                            store.CheckYGetCube(reg, y - 1, worldZ - 1, out n6);
                            store.GetCube(reg, y, worldZ - 1, out n7);
                            store.CheckYGetCube(reg, y + 1, worldZ - 1, out n8);

                            vertexBuffer[ind++] = new CubeVertex(ref posPPP, ref CubeVertex.N_POS_X, ref CubeVertex.TC00, ref current, ref n0, ref n1, ref n2, ref n3);
                            vertexBuffer[ind++] = new CubeVertex(ref posPPN, ref CubeVertex.N_POS_X, ref CubeVertex.TC10, ref current, ref n0, ref n1, ref n7, ref n8);
                            vertexBuffer[ind++] = new CubeVertex(ref posPNP, ref CubeVertex.N_POS_X, ref CubeVertex.TC01, ref current, ref n0, ref n3, ref n4, ref n5);
                            vertexBuffer[ind++] = new CubeVertex(ref posPNP, ref CubeVertex.N_POS_X, ref CubeVertex.TC01, ref current, ref n0, ref n3, ref n4, ref n5);
                            vertexBuffer[ind++] = new CubeVertex(ref posPPN, ref CubeVertex.N_POS_X, ref CubeVertex.TC10, ref current, ref n0, ref n1, ref n7, ref n8);
                            vertexBuffer[ind++] = new CubeVertex(ref posPNN, ref CubeVertex.N_POS_X, ref CubeVertex.TC11, ref current, ref n0, ref n5, ref n6, ref n7);
                        }

                        //-y
                        reg = y - 1;
                        if (y != 0) store.GetCube(worldX, reg, worldZ, out n0);
                        else n0 = Cube.NULL;

                        if (n0.IsTransparent && n0.Material != CubeMaterial.None)
                        {
                            store.GetCube(worldX + 1, reg, worldZ, out n1);
                            store.GetCube(worldX + 1, reg, worldZ + 1, out n2);
                            store.GetCube(worldX, reg, worldZ + 1, out n3);
                            store.GetCube(worldX - 1, reg, worldZ + 1, out n4);
                            store.GetCube(worldX - 1, reg, worldZ, out n5);
                            store.GetCube(worldX - 1, reg, worldZ - 1, out n6);
                            store.GetCube(worldX, reg, worldZ - 1, out n7);
                            store.GetCube(worldX + 1, reg, worldZ - 1, out n8);

                            vertexBuffer[ind++] = new CubeVertex(ref posNNP, ref CubeVertex.N_NEG_Y, ref CubeVertex.TC00, ref current, ref n0, ref n3, ref n4, ref n5);
                            vertexBuffer[ind++] = new CubeVertex(ref posPNP, ref CubeVertex.N_NEG_Y, ref CubeVertex.TC10, ref current, ref n0, ref n1, ref n2, ref n3);
                            vertexBuffer[ind++] = new CubeVertex(ref posNNN, ref CubeVertex.N_NEG_Y, ref CubeVertex.TC01, ref current, ref n0, ref n5, ref n6, ref n7);
                            vertexBuffer[ind++] = new CubeVertex(ref posNNN, ref CubeVertex.N_NEG_Y, ref CubeVertex.TC01, ref current, ref n0, ref n5, ref n6, ref n7);
                            vertexBuffer[ind++] = new CubeVertex(ref posPNP, ref CubeVertex.N_NEG_Y, ref CubeVertex.TC10, ref current, ref n0, ref n1, ref n2, ref n3);
                            vertexBuffer[ind++] = new CubeVertex(ref posPNN, ref CubeVertex.N_NEG_Y, ref CubeVertex.TC11, ref current, ref n0, ref n1, ref n7, ref n8);
                        }

                        //+y
                        reg = y + 1;
                        if (y != maxY) store.GetCube(worldX, reg, worldZ, out n0);
                        else n0 = Cube.NULL;

                        if (n0.IsTransparent && n0.Material != CubeMaterial.None)
                        {
                            store.GetCube(worldX + 1, reg, worldZ, out n1);
                            store.GetCube(worldX + 1, reg, worldZ + 1, out n2);
                            store.GetCube(worldX, reg, worldZ + 1, out n3);
                            store.GetCube(worldX - 1, reg, worldZ + 1, out n4);
                            store.GetCube(worldX - 1, reg, worldZ, out n5);
                            store.GetCube(worldX - 1, reg, worldZ - 1, out n6);
                            store.GetCube(worldX, reg, worldZ - 1, out n7);
                            store.GetCube(worldX + 1, reg, worldZ - 1, out n8);

                            vertexBuffer[ind++] = new CubeVertex(ref posNPN, ref CubeVertex.N_POS_Y, ref CubeVertex.TC00, ref current, ref n0, ref n5, ref n6, ref n7);
                            vertexBuffer[ind++] = new CubeVertex(ref posPPN, ref CubeVertex.N_POS_Y, ref CubeVertex.TC10, ref current, ref n0, ref n1, ref n7, ref n8);
                            vertexBuffer[ind++] = new CubeVertex(ref posNPP, ref CubeVertex.N_POS_Y, ref CubeVertex.TC01, ref current, ref n0, ref n3, ref n4, ref n5);
                            vertexBuffer[ind++] = new CubeVertex(ref posNPP, ref CubeVertex.N_POS_Y, ref CubeVertex.TC01, ref current, ref n0, ref n3, ref n4, ref n5);
                            vertexBuffer[ind++] = new CubeVertex(ref posPPN, ref CubeVertex.N_POS_Y, ref CubeVertex.TC10, ref current, ref n0, ref n1, ref n7, ref n8);
                            vertexBuffer[ind++] = new CubeVertex(ref posPPP, ref CubeVertex.N_POS_Y, ref CubeVertex.TC11, ref current, ref n0, ref n1, ref n2, ref n3);
                        }

                        //-z
                        reg = worldZ - 1;
                        store.GetCube(worldX, y, reg, out n0);

                        if (n0.IsTransparent)
                        {
                            store.GetCube(worldX + 1, y, reg, out n1);
                            store.CheckYGetCube(worldX + 1, y + 1, reg, out n2);
                            store.CheckYGetCube(worldX, y + 1, reg, out n3);
                            store.CheckYGetCube(worldX - 1, y + 1, reg, out n4);
                            store.GetCube(worldX - 1, y, reg, out n5);
                            store.CheckYGetCube(worldX - 1, y - 1, reg, out n6);
                            store.CheckYGetCube(worldX, y - 1, reg, out n7);
                            store.CheckYGetCube(worldX + 1, y - 1, reg, out n8);

                            vertexBuffer[ind++] = new CubeVertex(ref posPPN, ref CubeVertex.N_NEG_Z, ref CubeVertex.TC00, ref current, ref n0, ref n1, ref n2, ref n3);
                            vertexBuffer[ind++] = new CubeVertex(ref posNPN, ref CubeVertex.N_NEG_Z, ref CubeVertex.TC10, ref current, ref n0, ref n3, ref n4, ref n5);
                            vertexBuffer[ind++] = new CubeVertex(ref posPNN, ref CubeVertex.N_NEG_Z, ref CubeVertex.TC01, ref current, ref n0, ref n1, ref n7, ref n8);
                            vertexBuffer[ind++] = new CubeVertex(ref posPNN, ref CubeVertex.N_NEG_Z, ref CubeVertex.TC01, ref current, ref n0, ref n1, ref n7, ref n8);
                            vertexBuffer[ind++] = new CubeVertex(ref posNPN, ref CubeVertex.N_NEG_Z, ref CubeVertex.TC10, ref current, ref n0, ref n3, ref n4, ref n5);
                            vertexBuffer[ind++] = new CubeVertex(ref posNNN, ref CubeVertex.N_NEG_Z, ref CubeVertex.TC11, ref current, ref n0, ref n5, ref n6, ref n7);
                        }

                        //+z
                        reg = worldZ + 1;
                        store.GetCube(worldX, y, reg, out n0);

                        if (n0.IsTransparent)
                        {
                            store.GetCube(worldX + 1, y, reg, out n1);
                            store.CheckYGetCube(worldX + 1, y + 1, reg, out n2);
                            store.CheckYGetCube(worldX, y + 1, reg, out n3);
                            store.CheckYGetCube(worldX - 1, y + 1, reg, out n4);
                            store.GetCube(worldX - 1, y, reg, out n5);
                            store.CheckYGetCube(worldX - 1, y - 1, reg, out n6);
                            store.CheckYGetCube(worldX, y - 1, reg, out n7);
                            store.CheckYGetCube(worldX + 1, y - 1, reg, out n8);

                            vertexBuffer[ind++] = new CubeVertex(ref posNPP, ref CubeVertex.N_POS_Z, ref CubeVertex.TC00, ref current, ref n0, ref n3, ref n4, ref n5);
                            vertexBuffer[ind++] = new CubeVertex(ref posPPP, ref CubeVertex.N_POS_Z, ref CubeVertex.TC10, ref current, ref n0, ref n1, ref n2, ref n3);
                            vertexBuffer[ind++] = new CubeVertex(ref posNNP, ref CubeVertex.N_POS_Z, ref CubeVertex.TC01, ref current, ref n0, ref n5, ref n6, ref n7);
                            vertexBuffer[ind++] = new CubeVertex(ref posNNP, ref CubeVertex.N_POS_Z, ref CubeVertex.TC01, ref current, ref n0, ref n5, ref n6, ref n7);
                            vertexBuffer[ind++] = new CubeVertex(ref posPPP, ref CubeVertex.N_POS_Z, ref CubeVertex.TC10, ref current, ref n0, ref n1, ref n2, ref n3);
                            vertexBuffer[ind++] = new CubeVertex(ref posPNP, ref CubeVertex.N_POS_Z, ref CubeVertex.TC11, ref current, ref n0, ref n1, ref n7, ref n8);
                        }
                    }
                }
            }

            if (ind > 0)
            {
                VertexBuffer = new VertexBuffer(graphics, typeof(CubeVertex), ind, BufferUsage.None);
                VertexBuffer.SetData<CubeVertex>(vertexBuffer,0,ind);
                Empty = false;
            }
            else Empty = true;
        }