private static void RenderChunkTerrain(Object state) { Object[] parameters = (Object[])state; Chunk c = (Chunk)parameters[0]; Bitmap b = (Bitmap)parameters[1]; int offsetX = (int)parameters[2]; int offsetY = (int)parameters[3]; TAG_Compound[] sections = new TAG_Compound[16]; int highest = -1; foreach (TAG t in (TAG[])c.Root["Level"]["Sections"]) { byte index = (byte)t["Y"]; if (index > highest) { highest = index; } sections[index] = (TAG_Compound)t; } if (c.ManualHeightmap == null) { c.ManualHeightmap = new int[256]; for (int i = 0; i < c.ManualHeightmap.Length; i++) { c.ManualHeightmap[i] = -1; } } //chunk exists but all blocks are air if (highest < 0) { if (Interlocked.Decrement(ref taskCount) == 0) { signal.Set(); } return; } Color[,] pixels = new Color[16, 16]; highest = ((highest + 1) * 16) - 1; TAG biomes = null; c.Root["Level"].TryGetValue("Biomes", out biomes); for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++) { int y; if (c.ManualHeightmap[x + z * 16] >= 0) { y = c.ManualHeightmap[x + z * 16]; } else { y = GetHeight(sections, x, z, highest); c.ManualHeightmap[x + z * 16] = y; } if (y < 0) { continue; } byte id, data; GetBlock(sections, x, y, z, out id, out data); byte biome = (byte)Biome.Unspecified; if (biomes != null && Settings.BiomeFoliage) { biome = ((byte[])biomes)[x + z * 16]; } Color color = ColorPalette.Lookup(id, data, biome); if (Settings.Transparency) { y--; while (color.A < 255 && y >= 0) { GetBlock(sections, x, y, z, out id, out data); Color c2 = ColorPalette.Lookup(id, data, biome); color = Blend(color, c2); y--; } } else { color = Color.FromArgb(255, color.R, color.G, color.B); } //brighten/darken by height; arbitrary value, but /seems/ to look okay color = AddtoColor(color, (int)(y / 1.7 - 42)); pixels[x, z] = color; } } mutex.WaitOne(); for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++) { b.SetPixel(offsetX + x, offsetY + z, pixels[x, z]); } } mutex.ReleaseMutex(); if (Interlocked.Decrement(ref taskCount) == 0) { signal.Set(); } }