public ChunkRenderer(ReadOnlyWorld world, TrueCraftGame game, IBlockRepository blockRepository) : base() { World = world; BlockRepository = blockRepository; Game = game; }
private void ProcessChunk(ReadOnlyWorld world, ReadOnlyChunk chunk, RenderState state) { state.Verticies.Clear(); state.OpaqueIndicies.Clear(); state.TransparentIndicies.Clear(); state.DrawableCoordinates.Clear(); for (byte x = 0; x < Chunk.Width; x++) { for (byte z = 0; z < Chunk.Depth; z++) { for (byte y = 0; y < Chunk.Height; y++) { var coords = new Coordinates3D(x, y, z); var id = chunk.GetBlockId(coords); var provider = BlockRepository.GetBlockProvider(id); if (id != 0 && coords.Y == 0) { AddBottomBlock(coords, state, chunk); } if (!provider.Opaque) { AddAdjacentBlocks(coords, state, chunk); if (id != 0) { AddTransparentBlock(coords, state, chunk); } } else { if (coords.X == 0 || coords.X == Chunk.Width - 1 || coords.Z == 0 || coords.Z == Chunk.Depth - 1) { AddChunkBoundaryBlocks(coords, state, chunk); } } } } } var enumerator = state.DrawableCoordinates.GetEnumerator(); for (int j = 0; j <= state.DrawableCoordinates.Count; j++) { var coords = enumerator.Current; enumerator.MoveNext(); var c = coords.Key; var descriptor = new BlockDescriptor { ID = chunk.GetBlockId(coords.Key), Metadata = chunk.GetMetadata(coords.Key), BlockLight = chunk.GetBlockLight(coords.Key), SkyLight = chunk.GetSkyLight(coords.Key), Coordinates = coords.Key, Chunk = chunk.Chunk }; var provider = BlockRepository.GetBlockProvider(descriptor.ID); if (provider.RenderOpaque) { int[] i; var v = BlockRenderer.RenderBlock(provider, descriptor, coords.Value, new Vector3(chunk.X * Chunk.Width + c.X, c.Y, chunk.Z * Chunk.Depth + c.Z), state.Verticies.Count, out i); state.Verticies.AddRange(v); state.OpaqueIndicies.AddRange(i); } else { int[] i; var v = BlockRenderer.RenderBlock(provider, descriptor, coords.Value, new Vector3(chunk.X * Chunk.Width + c.X, c.Y, chunk.Z * Chunk.Depth + c.Z), state.Verticies.Count, out i); state.Verticies.AddRange(v); state.TransparentIndicies.AddRange(i); } } }