Пример #1
0
        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;
        }
Пример #2
0
        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;
        }
Пример #3
0
        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);
                        }
                    }
                }
            }
        }