Ejemplo n.º 1
0
        public void Render()
        {
            gl.Enable(Capability.DepthTest);
            gl.Clear(Buffers.Color | Buffers.Depth);
            shaderProgram.Use(gl);
            gl.BindVertexArray(vertexArray);
            gl.BindBuffer(BufferTarget.Array, vertexBuffer);
            gl.ActiveTexture(TextureUnit.Texture0);
            gl.BindTexture(TextureTarget.Texture2d, texture);

            chunkPool.Update();
            var count = chunkPool.Uninitialized.Count;

            foreach (var c in chunkPool.Disposed)
            {
                if (count > 0)
                {
                    var(x, y, z) = chunkPool.Uninitialized[count - 1];
                    chunkPool.Uninitialized.RemoveAt(count - 1);
                    chunkPool.AddInsideRange(InitializeChunk(x, y, z, c));
                    count--;
                }
                else
                {
                    break;
                }
            }
            foreach (var(x, y, z) in chunkPool.Uninitialized)
            {
                chunkPool.AddInsideRange(InitializeChunk(x, y, z, new Chunk <bool>()));
            }
            foreach (var c in chunkPool.InsideRange)
            {
                if (frustum.SphereInFrustum(new Vector3(c.X * 16 + 8, c.Y * 16 + 8, c.Z * 16 + 8), chunkRadius) == FrustumIntersection.Outside)
                {
                    continue;
                }
                index = 0;
                int vertexCount = 0;
                for (int i = 0; i < 16; i++)
                {
                    for (int j = 0; j < 16; j++)
                    {
                        for (int k = 0; k < 16; k++)
                        {
                            if (c[i, j, k])
                            {
                                vertexCount += GenerateCubeFaces(c, i, j, k, vertexCount);
                            }
                        }
                    }
                }
                vertexCount += FlushVertices(vertexCount, index);
                if (vertexCount > 0)
                {
                    gl.DrawArrays(DrawMode.Triangles, 0, vertexCount);
                }
            }
            gl.Disable(Capability.DepthTest);
        }