public void renderChunk(Chunk c)
        {
            string chunk = "Chunk_" + c.x + "_" + c.z;
            SceneNode root = (SceneNode)mSceneMgr.RootSceneNode;
            SceneNode cn;
            if(chunksm.ContainsKey(chunk))
            {
                cn = (SceneNode)root.GetChild(chunk);
                mSceneMgr.DestroyManualObject("MeshManChunk" + c.x + "_" + c.z);
                cn.RemoveAndDestroyAllChildren();
            }else{
                cn = mSceneMgr.RootSceneNode.CreateChildSceneNode(chunk);
                cn.SetPosition(c.x * 16, 0, c.z * 16);
                chunksm.Add(chunk,cn);
            }

            cn.AttachObject(chunkMesh(c));
        }
        ManualObject chunkMesh(Chunk c)
        {
            Mogre.ManualObject MeshChunk = mSceneMgr.CreateManualObject("MeshManChunk" + c.x + "_" + c.z);

            MeshChunk.Begin("BoxColor",RenderOperation.OperationTypes.OT_TRIANGLE_LIST);

            uint iVertex = 0;
            Block Block;
            Block Block1;
            float bo = 1f / 16f;
            //Console.WriteLine(bo);
            float U1, U2, V1, V2;
            for (int z = 0; z < 16; ++z)
            {
                for (int y = 0; y < 256; ++y)
                {
                    for (int x = 0; x < 16; ++x)
                    {
                        Block = c.blocks[x, y, z];
                        if (Block == null) continue;
                        if (Block.ID == 0) continue;

                        //Compute the block's texture coordinates
                        U1 = bo * (float)(Block.U());
                        U2 = U1 + bo;
                        V1 = bo * (float)(Block.V());
                        V2 = V1 + bo;
                        //x-1

                        Block1 = new Block(x, y, z, 0, 0);
                        if (x > 0) Block1 = c.blocks[x-1,y,z];
                        //if (x == 0) Block1 = chunks[(c.x - 1) + "_" + c.z].blocks[15, y, z];

                        if (Block1.ID == 0)
                        {
                            MeshChunk.Position(x, y,   z+1);	MeshChunk.Normal(-1,0,0);	MeshChunk.TextureCoord(U2, V2);
                            MeshChunk.Position(x, y+1, z+1);	MeshChunk.Normal(-1,0,0);	MeshChunk.TextureCoord(U2, V1);
                            MeshChunk.Position(x, y+1, z);		MeshChunk.Normal(-1,0,0);	MeshChunk.TextureCoord(U1, V1);
                            MeshChunk.Position(x, y,   z);		MeshChunk.Normal(-1,0,0);	MeshChunk.TextureCoord(U1, V2);

                            //MeshChunk.Triangle(iVertex, iVertex+1, iVertex+2);
                            //MeshChunk.Triangle(iVertex+2, iVertex+3, iVertex);
                            MeshChunk.Quad(iVertex, iVertex + 1, iVertex + 2, iVertex + 3);

                            iVertex += 4;
                        }

                        //x+1
                        Block1 = new Block(x, y, z, 0, 0);
                        if (x < 15) Block1 = c.blocks[x + 1, y, z];
                        //if (x == 15) Block1 = chunks[(c.x + 1) + "_" + c.z].blocks[0, y, z];

                        if (Block1.ID == 0)
                        {
                            MeshChunk.Position(x+1, y,   z);	MeshChunk.Normal(1,0,0); MeshChunk.TextureCoord(U2, V2);
                            MeshChunk.Position(x+1, y+1, z);	MeshChunk.Normal(1,0,0); MeshChunk.TextureCoord(U2, V1);
                            MeshChunk.Position(x+1, y+1, z+1);	MeshChunk.Normal(1,0,0); MeshChunk.TextureCoord(U1, V1);
                            MeshChunk.Position(x+1, y,   z+1);	MeshChunk.Normal(1,0,0); MeshChunk.TextureCoord(U1, V2);

                            //MeshChunk.Triangle(iVertex, iVertex+1, iVertex+2);
                            //MeshChunk.Triangle(iVertex+2, iVertex+3, iVertex);
                            MeshChunk.Quad(iVertex, iVertex + 1, iVertex + 2, iVertex + 3);

                            iVertex += 4;
                        }

                        //y-1
                        Block1 = new Block(x, y, z, 0, 0);
                        if (y > 0) Block1 = c.blocks[x, y - 1, z];

                        //if (Block1 == null) Block1 = new Block(x, y, z, 0, 0);

                        if (Block1.ID == 0)
                        {
                            MeshChunk.Position(x,   y, z);		MeshChunk.Normal(0,-1,0); MeshChunk.TextureCoord(U1, V2);
                            MeshChunk.Position(x+1, y, z);		MeshChunk.Normal(0,-1,0); MeshChunk.TextureCoord(U2, V2);
                            MeshChunk.Position(x+1, y, z+1);	MeshChunk.Normal(0,-1,0); MeshChunk.TextureCoord(U2,V1);
                            MeshChunk.Position(x,   y, z+1);	MeshChunk.Normal(0,-1,0); MeshChunk.TextureCoord(U1,V1);

                            //MeshChunk.Triangle(iVertex, iVertex+1, iVertex+2);
                            //MeshChunk.Triangle(iVertex+2, iVertex+3, iVertex);
                            MeshChunk.Quad(iVertex, iVertex + 1, iVertex + 2, iVertex + 3);

                            iVertex += 4;
                        }

                        //y+1
                        Block1 = new Block(x, y, z, 0, 0);
                        if (y < 256 - 1) Block1 = c.blocks[x, y + 1, z];
                        //if (Block1 == null) Block1 = new Block(x, y, z, 0, 0);

                        if (Block1.ID == 0)
                        {
                            MeshChunk.Position(x,   y+1, z+1);		MeshChunk.Normal(0,1,0); MeshChunk.TextureCoord(U1, V2);
                            MeshChunk.Position(x+1, y+1, z+1);		MeshChunk.Normal(0,1,0); MeshChunk.TextureCoord(U2, V2);
                            MeshChunk.Position(x+1, y+1, z);		MeshChunk.Normal(0,1,0); MeshChunk.TextureCoord(U2,V1);
                            MeshChunk.Position(x,   y+1, z);		MeshChunk.Normal(0,1,0); MeshChunk.TextureCoord(U1,V1);

                            //MeshChunk.Triangle(iVertex, iVertex+1, iVertex+2);
                            //MeshChunk.Triangle(iVertex+2, iVertex+3, iVertex);
                            MeshChunk.Quad(iVertex, iVertex + 1, iVertex + 2, iVertex + 3);

                            iVertex += 4;
                        }

                        //z-1
                        Block1 = new Block(x, y, z, 0, 0);
                        if (z > 0) Block1 = c.blocks[x, y, z - 1];
                        //if (x == 0) Block1 = chunks[c.x + "_" + (c.z - 1)].blocks[x, y, 15];
                        //if (Block1 == null) Block1 = new Block(x, y, z, 0, 0);

                        if (Block1.ID == 0)
                        {
                            MeshChunk.Position(x,   y+1, z);		MeshChunk.Normal(0,0,-1); MeshChunk.TextureCoord(U2, V1);
                            MeshChunk.Position(x+1, y+1, z);		MeshChunk.Normal(0,0,-1); MeshChunk.TextureCoord(U1, V1);
                            MeshChunk.Position(x+1, y,   z);		MeshChunk.Normal(0,0,-1); MeshChunk.TextureCoord(U1, V2);
                            MeshChunk.Position(x,   y,   z);		MeshChunk.Normal(0,0,-1); MeshChunk.TextureCoord(U2, V2);

                            //MeshChunk.Triangle(iVertex, iVertex+1, iVertex+2);
                            //MeshChunk.Triangle(iVertex+2, iVertex+3, iVertex);
                            MeshChunk.Quad(iVertex, iVertex + 1, iVertex + 2, iVertex + 3);
                            iVertex += 4;
                        }

                            //z+1
                        Block1 = new Block(x,y,z,0,0);
                        if (z < 15) Block1 = c.blocks[x, y, z + 1];
                        //if (x == 15) Block1 = chunks[c.x+"_"+(c.z + 1)].blocks[x, y, 0];

                        //if (Block1 == null) Block1 = new Block(x, y, z, 0, 0);

                        if (Block1.ID == 0)
                        {
                            MeshChunk.Position(x,   y,   z+1);		MeshChunk.Normal(0,0,1); MeshChunk.TextureCoord(U1, V2);
                            MeshChunk.Position(x+1, y,   z+1);		MeshChunk.Normal(0,0,1); MeshChunk.TextureCoord(U2, V2);
                            MeshChunk.Position(x+1, y+1, z+1);		MeshChunk.Normal(0,0,1); MeshChunk.TextureCoord(U2,V1);
                            MeshChunk.Position(x,   y+1, z+1);		MeshChunk.Normal(0,0,1); MeshChunk.TextureCoord(U1,V1);

                            //MeshChunk.Triangle(iVertex, iVertex+1, iVertex+2);
                            //MeshChunk.Triangle(iVertex+2, iVertex+3, iVertex);
                            MeshChunk.Quad(iVertex, iVertex + 1, iVertex + 2, iVertex + 3);

                            iVertex += 4;
                        }
                    }
                }
            }

            MeshChunk.End();
            return MeshChunk;
        }
 public void QueueChunk(Chunk c)
 {
     lock(chunkq)
         chunkq.Enqueue(c);
 }