public ChunkGenerator(ChunkHandler ChunkHandler, long Seed) { rnd = new JavaRandom(); rnd2 = new JavaRandom(); rnd.SetSeed(Seed); this.Seed = Seed; chunkXMul = rnd.nextLong(); chunkZMul = rnd.nextLong(); n1 = new CombinedNoise( new OctaveNoise(8, rnd), new OctaveNoise(8, rnd)); n2 = new CombinedNoise( new OctaveNoise(8, rnd), new OctaveNoise(8, rnd)); n3 = new OctaveNoise(6, rnd); n4 = new OctaveNoise(8, rnd); n5 = new OctaveNoise(8, rnd); n6 = new OctaveNoise(8, rnd); n7 = new OctaveNoise(8, rnd); this.ChunkHandler = ChunkHandler; }
protected virtual void DrawSprite(int count) { int texId = BlockInfo.textures[curBlock * Side.Sides + Side.Right]; int i = texId / elementsPerAtlas1D; float vOrigin = (texId % elementsPerAtlas1D) * invVerElementSize; float x1 = X + 2.50f / 16, y1 = Y, z1 = Z + 2.50f / 16; float x2 = X + 13.5f / 16, y2 = Y + 1, z2 = Z + 13.5f / 16; const float u1 = 0, u2 = 15.99f / 16f; float v1 = vOrigin, v2 = vOrigin + invVerElementSize * 15.99f / 16f; byte offsetType = BlockInfo.SpriteOffset[curBlock]; if (offsetType >= 6 && offsetType <= 7) { spriteRng.SetSeed((X + 1217 * Z) & 0x7fffffff); float valX = spriteRng.Next(-3, 3 + 1) / 16.0f; float valY = spriteRng.Next(0, 3 + 1) / 16.0f; float valZ = spriteRng.Next(-3, 3 + 1) / 16.0f; const float stretch = 1.7f / 16.0f; x1 += valX - stretch; x2 += valX + stretch; z1 += valZ - stretch; z2 += valZ + stretch; if (offsetType == 7) { y1 -= valY; y2 -= valY; } } DrawInfo part = normalParts[i]; int col = fullBright ? FastColour.WhitePacked : light.LightCol_Sprite_Fast(X, Y, Z); if (tinted) { col = TintBlock(curBlock, col); } VertexP3fT2fC4b v; v.Colour = col; // Draw Z axis int index = part.sIndex; v.X = x1; v.Y = y1; v.Z = z1; v.U = u2; v.V = v2; part.vertices[index + 0] = v; v.Y = y2; v.V = v1; part.vertices[index + 1] = v; v.X = x2; v.Z = z2; v.U = u1; part.vertices[index + 2] = v; v.Y = y1; v.V = v2; part.vertices[index + 3] = v; // Draw Z axis mirrored index += part.sAdvance; v.X = x2; v.Y = y1; v.Z = z2; v.U = u2; part.vertices[index + 0] = v; v.Y = y2; v.V = v1; part.vertices[index + 1] = v; v.X = x1; v.Z = z1; v.U = u1; part.vertices[index + 2] = v; v.Y = y1; v.V = v2; part.vertices[index + 3] = v; // Draw X axis index += part.sAdvance; v.X = x1; v.Y = y1; v.Z = z2; v.U = u2; part.vertices[index + 0] = v; v.Y = y2; v.V = v1; part.vertices[index + 1] = v; v.X = x2; v.Z = z1; v.U = u1; part.vertices[index + 2] = v; v.Y = y1; v.V = v2; part.vertices[index + 3] = v; // Draw X axis mirrored index += part.sAdvance; v.X = x2; v.Y = y1; v.Z = z1; v.U = u2; part.vertices[index + 0] = v; v.Y = y2; v.V = v1; part.vertices[index + 1] = v; v.X = x1; v.Z = z2; v.U = u1; part.vertices[index + 2] = v; v.Y = y1; v.V = v2; part.vertices[index + 3] = v; part.sIndex += 4; }
void DumpVertices() { w.WriteLine("#vertices"); int i = -1, mask = BlockInfo.IDMask; Vector3 min, max; for (int y = 0; y < map.Height; y++) { for (int z = 0; z < map.Length; z++) { for (int x = 0; x < map.Width; x++) { ++i; int b = (blocks[i] | (blocks2[i] << 8)) & mask; if (!include[b]) { continue; } min.X = x; min.Y = y; min.Z = z; max.X = x; max.Y = y; max.Z = z; if (BlockInfo.Draw[b] == DrawType.Sprite) { min.X += 2.50f / 16f; min.Z += 2.50f / 16f; max.X += 13.5f / 16f; max.Z += 13.5f / 16f; max.Y += 1.0f; byte offsetType = BlockInfo.SpriteOffset[b]; if (offsetType >= 6 && offsetType <= 7) { spriteRng.SetSeed((x + 1217 * z) & 0x7fffffff); float valX = spriteRng.Next(-3, 3 + 1) / 16.0f; float valY = spriteRng.Next(0, 3 + 1) / 16.0f; float valZ = spriteRng.Next(-3, 3 + 1) / 16.0f; const float stretch = 1.7f / 16.0f; min.X += valX - stretch; max.X += valX + stretch; min.Z += valZ - stretch; max.Z += valZ + stretch; if (offsetType == 7) { min.Y -= valY; max.Y -= valY; } } // Draw Z axis w.WriteLine("v " + min.X + " " + min.Y + " " + min.Z); w.WriteLine("v " + min.X + " " + max.Y + " " + min.Z); w.WriteLine("v " + max.X + " " + max.Y + " " + max.Z); w.WriteLine("v " + max.X + " " + min.Y + " " + max.Z); // Draw Z axis mirrored if (mirror) { w.WriteLine("v " + max.X + " " + min.Y + " " + max.Z); w.WriteLine("v " + max.X + " " + max.Y + " " + max.Z); w.WriteLine("v " + min.X + " " + max.Y + " " + min.Z); w.WriteLine("v " + min.X + " " + min.Y + " " + min.Z); } // Draw X axis w.WriteLine("v " + min.X + " " + min.Y + " " + max.Z); w.WriteLine("v " + min.X + " " + max.Y + " " + max.Z); w.WriteLine("v " + max.X + " " + max.Y + " " + min.Z); w.WriteLine("v " + max.X + " " + min.Y + " " + min.Z); // Draw X axis mirrored if (mirror) { w.WriteLine("v " + max.X + " " + min.Y + " " + min.Z); w.WriteLine("v " + max.X + " " + max.Y + " " + min.Z); w.WriteLine("v " + min.X + " " + max.Y + " " + max.Z); w.WriteLine("v " + min.X + " " + min.Y + " " + max.Z); } continue; } min += BlockInfo.RenderMinBB[b]; max += BlockInfo.RenderMaxBB[b]; // minx if (x == 0 || all || !IsFaceHidden(b, (blocks[i - oneX] | (blocks2[i - oneX] << 8)) & mask, Side.Left)) { w.WriteLine("v " + min.X + " " + min.Y + " " + min.Z); w.WriteLine("v " + min.X + " " + max.Y + " " + min.Z); w.WriteLine("v " + min.X + " " + max.Y + " " + max.Z); w.WriteLine("v " + min.X + " " + min.Y + " " + max.Z); } // maxx if (x == maxX || all || !IsFaceHidden(b, (blocks[i + oneX] | (blocks2[i + oneX] << 8)) & mask, Side.Right)) { w.WriteLine("v " + max.X + " " + min.Y + " " + min.Z); w.WriteLine("v " + max.X + " " + max.Y + " " + min.Z); w.WriteLine("v " + max.X + " " + max.Y + " " + max.Z); w.WriteLine("v " + max.X + " " + min.Y + " " + max.Z); } // minz if (z == 0 || all || !IsFaceHidden(b, (blocks[i - oneZ] | (blocks2[i - oneZ] << 8)) & mask, Side.Front)) { w.WriteLine("v " + min.X + " " + min.Y + " " + min.Z); w.WriteLine("v " + min.X + " " + max.Y + " " + min.Z); w.WriteLine("v " + max.X + " " + max.Y + " " + min.Z); w.WriteLine("v " + max.X + " " + min.Y + " " + min.Z); } // maxz if (z == maxZ || all || !IsFaceHidden(b, (blocks[i + oneZ] | (blocks2[i + oneZ] << 8)) & mask, Side.Back)) { w.WriteLine("v " + min.X + " " + min.Y + " " + max.Z); w.WriteLine("v " + min.X + " " + max.Y + " " + max.Z); w.WriteLine("v " + max.X + " " + max.Y + " " + max.Z); w.WriteLine("v " + max.X + " " + min.Y + " " + max.Z); } // miny if (y == 0 || all || !IsFaceHidden(b, (blocks[i - oneY] | (blocks2[i - oneY] << 8)) & mask, Side.Bottom)) { w.WriteLine("v " + min.X + " " + min.Y + " " + min.Z); w.WriteLine("v " + min.X + " " + min.Y + " " + max.Z); w.WriteLine("v " + max.X + " " + min.Y + " " + max.Z); w.WriteLine("v " + max.X + " " + min.Y + " " + min.Z); } // maxy if (y == maxY || all || !IsFaceHidden(b, (blocks[i + oneY] | (blocks2[i + oneY] << 8)) & mask, Side.Top)) { w.WriteLine("v " + min.X + " " + max.Y + " " + min.Z); w.WriteLine("v " + min.X + " " + max.Y + " " + max.Z); w.WriteLine("v " + max.X + " " + max.Y + " " + max.Z); w.WriteLine("v " + max.X + " " + max.Y + " " + min.Z); } } } } }