Пример #1
0
        private void DrawBlockTransform(Entity p, float dispX, float dispY, float dispZ, float scale)
        {
            int  lastTexIndex = -1;
            bool sprite       = BlockInfo.Draw[p.ModelBlock] == DrawType.Sprite;

            if (sprite)
            {
                SpriteXQuad(false, false, p.ModelBlock, ref lastTexIndex, game.ModelCache, dispX, dispY, dispZ, scale);
                SpriteXQuad(false, true, p.ModelBlock, ref lastTexIndex, game.ModelCache, dispX, dispY, dispZ, scale);
                SpriteZQuad(false, false, p.ModelBlock, ref lastTexIndex, game.ModelCache, dispX, dispY, dispZ, scale);
                SpriteZQuad(false, true, p.ModelBlock, ref lastTexIndex, game.ModelCache, dispX, dispY, dispZ, scale);

                SpriteZQuad(true, false, p.ModelBlock, ref lastTexIndex, game.ModelCache, dispX, dispY, dispZ, scale);
                SpriteZQuad(true, true, p.ModelBlock, ref lastTexIndex, game.ModelCache, dispX, dispY, dispZ, scale);
                SpriteXQuad(true, false, p.ModelBlock, ref lastTexIndex, game.ModelCache, dispX, dispY, dispZ, scale);
                SpriteXQuad(true, true, p.ModelBlock, ref lastTexIndex, game.ModelCache, dispX, dispY, dispZ, scale);
            }
            else
            {
                CuboidDrawer drawer = new CuboidDrawer();

                drawer.minBB = BlockInfo.MinBB[p.ModelBlock]; drawer.minBB.Y = 1 - drawer.minBB.Y;
                drawer.maxBB = BlockInfo.MaxBB[p.ModelBlock]; drawer.maxBB.Y = 1 - drawer.maxBB.Y;

                Vector3 min = BlockInfo.RenderMinBB[p.ModelBlock];
                Vector3 max = BlockInfo.RenderMaxBB[p.ModelBlock];
                drawer.x1 = (min.X - 0.5f) * scale + dispX; drawer.y1 = min.Y * scale + dispY; drawer.z1 = (min.Z - 0.5f) * scale + dispZ;
                drawer.x2 = (max.X - 0.5f) * scale + dispX; drawer.y2 = max.Y * scale + dispY; drawer.z2 = (max.Z - 0.5f) * scale + dispZ;

                drawer.Tinted  = BlockInfo.Tinted[p.ModelBlock];
                drawer.TintCol = BlockInfo.FogCol[p.ModelBlock];

                drawer.Bottom(1, cols[1], GetTex(Side.Bottom, p.ModelBlock, ref lastTexIndex), game.ModelCache.vertices, ref index);
                drawer.Front(1, cols[3], GetTex(Side.Front, p.ModelBlock, ref lastTexIndex), game.ModelCache.vertices, ref index);
                drawer.Right(1, cols[5], GetTex(Side.Right, p.ModelBlock, ref lastTexIndex), game.ModelCache.vertices, ref index);
                drawer.Back(1, cols[2], GetTex(Side.Back, p.ModelBlock, ref lastTexIndex), game.ModelCache.vertices, ref index);
                drawer.Left(1, cols[4], GetTex(Side.Left, p.ModelBlock, ref lastTexIndex), game.ModelCache.vertices, ref index);
                drawer.Top(1, cols[0], GetTex(Side.Top, p.ModelBlock, ref lastTexIndex), game.ModelCache.vertices, ref index);
            }

            if (index == 0)
            {
                return;
            }

            if (sprite)
            {
                game.Graphics.FaceCulling = true;
            }
            lastTexIndex = texIndex;
            if (lastTexIndex != -1)
            {
                game.Graphics.BindTexture(Atlas1D.TexIds[lastTexIndex]);
                UpdateVB();
            }

            lastTexIndex = texIndex;
            index        = 0;
            if (sprite)
            {
                game.Graphics.FaceCulling = false;
            }
        }