示例#1
0
        private _2DSprite GetAirSprite(WorldState world)
        {
            var _Sprite = new _2DSprite()
            {
                RenderMode = _2DBatchRenderMode.Z_BUFFER
            };
            var       airTiles = TextureGenerator.GetAirTiles(world.Device);
            Texture2D sprite   = null;

            switch (world.Zoom)
            {
            case WorldZoom.Far:
                sprite           = airTiles[2];
                _Sprite.DestRect = FLOORDEST_FAR;
                _Sprite.Depth    = ArchZBuffers[14];
                break;

            case WorldZoom.Medium:
                sprite           = airTiles[1];
                _Sprite.DestRect = FLOORDEST_MED;
                _Sprite.Depth    = ArchZBuffers[13];
                break;

            case WorldZoom.Near:
                sprite           = airTiles[0];
                _Sprite.DestRect = FLOORDEST_NEAR;
                _Sprite.Depth    = ArchZBuffers[12];
                break;
            }

            _Sprite.Pixel   = sprite;
            _Sprite.SrcRect = new Microsoft.Xna.Framework.Rectangle(0, 0, _Sprite.Pixel.Width, _Sprite.Pixel.Height);

            return(_Sprite);
        }
示例#2
0
        public override void Draw(GraphicsDevice device, WorldState world)
        {
#if !DEBUG
            if (!Visible)
            {
                return;
            }
#endif
            if (this.DrawGroup != null)
            {
                dgrp.Draw(world);
            }

            if (Headline != null)
            {
                var headOff = new Vector3(0, 0, 0.66f);
                var headPx  = world.WorldSpace.GetScreenFromTile(headOff);

                var item = new _2DSprite();
                item.Pixel      = Headline;
                item.Depth      = TextureGenerator.GetWallZBuffer(device)[30];
                item.RenderMode = _2DBatchRenderMode.Z_BUFFER;

                item.SrcRect       = new Rectangle(0, 0, Headline.Width, Headline.Height);
                item.WorldPosition = headOff;
                var off = PosCenterOffsets[(int)world.Zoom - 1];
                item.DestRect = new Rectangle(
                    ((int)headPx.X - Headline.Width / 2) + (int)off.X,
                    ((int)headPx.Y - Headline.Height / 2) + (int)off.Y, Headline.Width, Headline.Height);
                world._2D.Draw(item);
            }
        }
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (_Dirty)
            {
                if (_Floor == null)
                {
                    _Floor = Content.Get().WorldFloors.Get((ulong)_FloorID);
                    if (_Floor != null)
                    {
                        _Sprite = new _2DSprite
                        {
                            RenderMode = _2DBatchRenderMode.NO_DEPTH
                        };
                    }
                }
                if (_DirtyTexture && _Floor != null)
                {
                    SPR2 sprite = null;
                    switch (world.Zoom)
                    {
                    case WorldZoom.Far:
                        sprite           = _Floor.Far;
                        _Sprite.DestRect = DESTINATION_FAR;
                        break;

                    case WorldZoom.Medium:
                        sprite           = _Floor.Medium;
                        _Sprite.DestRect = DESTINATION_MED;
                        break;

                    case WorldZoom.Near:
                        sprite           = _Floor.Near;
                        _Sprite.DestRect = DESTINATION_NEAR;
                        break;
                    }
                    if (world.Rotation == WorldRotation.TopRight || world.Rotation == WorldRotation.BottomRight)
                    {
                        _Sprite.FlipVertically = true;
                    }
                    if ((int)world.Rotation > 1)
                    {
                        _Sprite.FlipHorizontally = true;                          //todo - find out why these don't work (really it is a mystery)
                    }
                    _Sprite.Pixel   = world._2D.GetTexture(sprite.Frames[0]);
                    _Sprite.SrcRect = new Microsoft.Xna.Framework.Rectangle(0, 0, _Sprite.Pixel.Width, _Sprite.Pixel.Height);
                }

                _DirtyTexture = false;
                _Dirty        = false;
            }

            if (_Sprite != null)
            {
                world._2D.Draw(_Sprite);
            }
        }
示例#4
0
        private _2DSprite GetFloorSprite(Floor pattern, int rotation, WorldState world)
        {
            var _Sprite = new _2DSprite()
            {
                RenderMode = _2DBatchRenderMode.Z_BUFFER
            };

            if (pattern == null)
            {
                return(_Sprite);
            }
            SPR2 sprite   = null;
            bool vertFlip = world.Rotation == WorldRotation.TopRight || world.Rotation == WorldRotation.BottomRight;
            int  bufOff   = (vertFlip) ? 3 : 0;

            switch (world.Zoom)
            {
            case WorldZoom.Far:
                sprite           = pattern.Far;
                _Sprite.DestRect = FLOORDEST_FAR;
                _Sprite.Depth    = ArchZBuffers[14 + bufOff];
                break;

            case WorldZoom.Medium:
                sprite           = pattern.Medium;
                _Sprite.DestRect = FLOORDEST_MED;
                _Sprite.Depth    = ArchZBuffers[13 + bufOff];
                break;

            case WorldZoom.Near:
                sprite           = pattern.Near;
                _Sprite.DestRect = FLOORDEST_NEAR;
                _Sprite.Depth    = ArchZBuffers[12 + bufOff];
                break;
            }
            if (sprite != null)
            {
                _Sprite.Pixel   = world._2D.GetTexture(sprite.Frames[rotation]);
                _Sprite.SrcRect = new Microsoft.Xna.Framework.Rectangle(0, 0, _Sprite.Pixel.Width, _Sprite.Pixel.Height);

                if (vertFlip)
                {
                    _Sprite.FlipVertically = true;
                }
                if ((int)world.Rotation > 1)
                {
                    _Sprite.FlipHorizontally = true;
                }
            }

            return(_Sprite);
        }
示例#5
0
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (this.DrawGroup == null)
            {
                return;
            }
            if (!world.TempDraw)
            {
                LastScreenPos = world.WorldSpace.GetScreenFromTile(Position) + world.WorldSpace.GetScreenOffset() + PosCenterOffsets[(int)world.Zoom - 1];
                LastZoomLevel = (int)world.Zoom;
            }
            if (!Visible)
            {
                return;
            }
            dgrp.Draw(world);

            if (Headline != null)
            {
                var headOff = new Vector3(0, 0, 0.66f);
                var headPx  = world.WorldSpace.GetScreenFromTile(headOff);

                var item = new _2DSprite();
                item.Pixel      = Headline;
                item.Depth      = TextureGenerator.GetWallZBuffer(device)[30];
                item.RenderMode = _2DBatchRenderMode.Z_BUFFER;

                item.SrcRect       = new Rectangle(0, 0, Headline.Width, Headline.Height);
                item.WorldPosition = headOff;
                var off = PosCenterOffsets[(int)world.Zoom - 1];
                item.DestRect = new Rectangle(
                    ((int)headPx.X - Headline.Width / 2) + (int)off.X,
                    ((int)headPx.Y - Headline.Height / 2) + (int)off.Y, Headline.Width, Headline.Height);
                world._2D.Draw(item);
            }

            bool forceDynamic = ForceDynamic;

            if (Container != null && Container is ObjectComponent)
            {
                forceDynamic = ((ObjectComponent)Container).ForceDynamic;
                if (forceDynamic && renderInfo.Layer == WorldObjectRenderLayer.STATIC)
                {
                    blueprint.Damage.Add(new BlueprintDamage(BlueprintDamageType.OBJECT_GRAPHIC_CHANGE, TileX, TileY, Level, this));
                }
            }
            if (renderInfo.Layer == WorldObjectRenderLayer.DYNAMIC && !forceDynamic && DynamicCounter++ > 120 && blueprint != null)
            {
                blueprint.Damage.Add(new BlueprintDamage(BlueprintDamageType.OBJECT_RETURN_TO_STATIC, TileX, TileY, Level, this));
            }
        }
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (_Dirty)
            {
                if (_Floor == null)
                {
                    _Floor = Content.Get().WorldFloors.Get((ulong)_FloorID);
                    if (_Floor != null)
                    {
                        _Sprite = new _2DSprite
                        {
                            RenderMode = _2DBatchRenderMode.NO_DEPTH
                        };
                    }
                }
                if (_DirtyTexture && _Floor != null)
                {
                    SPR2 sprite = null;
                    switch (world.Zoom)
                    {
                    case WorldZoom.Far:
                        sprite           = _Floor.Far;
                        _Sprite.DestRect = DESTINATION_FAR;
                        break;

                    case WorldZoom.Medium:
                        sprite           = _Floor.Medium;
                        _Sprite.DestRect = DESTINATION_MED;
                        break;

                    case WorldZoom.Near:
                        sprite           = _Floor.Near;
                        _Sprite.DestRect = DESTINATION_NEAR;
                        break;
                    }
                    _Sprite.Pixel   = world._2D.GetTexture(sprite.Frames[0]);
                    _Sprite.SrcRect = new Microsoft.Xna.Framework.Rectangle(0, 0, _Sprite.Pixel.Width, _Sprite.Pixel.Height);
                }

                _DirtyTexture = false;
                _Dirty        = false;
            }

            if (_Sprite != null)
            {
                world._2D.Draw(_Sprite);
            }
        }
示例#7
0
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            var headpos   = Avatar.Skeleton.GetBone("HEAD").AbsolutePosition / 3.0f;
            var transhead = Vector3.Transform(new Vector3(headpos.X, headpos.Z, headpos.Y), Matrix.CreateRotationZ((float)(RadianDirection + Math.PI))) + this.Position - new Vector3(0.5f, 0.5f, 0f);

            if (!world.TempDraw)
            {
                LastScreenPos = world.WorldSpace.GetScreenFromTile(transhead) + world.WorldSpace.GetScreenOffset() + PosCenterOffsets[(int)world.Zoom - 1];

                LastZoomLevel = (int)world.Zoom;
            }

            if (!Visible)
            {
                return;
            }

            if (Avatar != null)
            {
                world._3D.DrawMesh(Matrix.CreateRotationY((float)(Math.PI - RadianDirection)) * this.World, Avatar, (short)ObjectID, Room); //negated so avatars spin clockwise
            }

            if (Headline != null)
            {
                var headOff = (transhead - Position) + new Vector3(0, 0, 0.66f);
                var headPx  = world.WorldSpace.GetScreenFromTile(headOff);

                var item = new _2DSprite();
                item.Pixel      = Headline;
                item.Depth      = TextureGenerator.GetWallZBuffer(device)[30];
                item.RenderMode = _2DBatchRenderMode.Z_BUFFER;

                item.SrcRect       = new Rectangle(0, 0, Headline.Width, Headline.Height);
                item.WorldPosition = headOff;
                var off = PosCenterOffsets[(int)world.Zoom - 1];
                item.DestRect = new Rectangle(
                    ((int)headPx.X - Headline.Width / 2) + (int)off.X,
                    ((int)headPx.Y - Headline.Height / 2) + (int)off.Y, Headline.Width, Headline.Height);
                item.Room = Room;
                world._2D.Draw(item);
            }
        }
示例#8
0
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (ArchZBuffers == null)
            {
                ArchZBuffers = TextureGenerator.GetWallZBuffer(device);
            }

            var pxOffset     = world.WorldSpace.GetScreenOffset();
            var floorContent = Content.Content.Get().WorldFloors;

            for (sbyte level = 1; level <= world.Level; level++)
            {
                for (short y = 0; y < blueprint.Height; y++)
                { //ill decide on a reasonable system for components when it's finished ok pls :(
                    for (short x = 0; x < blueprint.Width; x++)
                    {
                        var comp = blueprint.GetFloor(x, y, level);
                        if (comp.Pattern != 0)
                        {
                            ushort room         = (ushort)blueprint.RoomMap[level - 1][x + y * blueprint.Width];
                            var    tilePosition = new Vector3(x, y, (level - 1) * 2.95f);
                            world._2D.OffsetPixel(world.WorldSpace.GetScreenFromTile(tilePosition));
                            world._2D.OffsetTile(tilePosition);

                            if (comp.Pattern > 65534)
                            {
                                //determine adjacent pool tiles
                                int poolAdj = 0;
                                for (int i = 0; i < PoolDirections.Length; i++)
                                {
                                    var testTile = new Point(x, y) + PoolDirections[i];
                                    if ((testTile.X < 0 || testTile.X >= blueprint.Width) || (testTile.Y < 0 || testTile.Y >= blueprint.Height))
                                    {
                                        continue;
                                    }
                                    if (blueprint.GetFloor((short)testTile.X, (short)testTile.Y, level).Pattern == comp.Pattern)
                                    {
                                        poolAdj |= 1 << i;
                                    }
                                }

                                var adj = RotatePoolSegs((PoolSegments)poolAdj, (int)world.Rotation);

                                //get and draw the base tile

                                int spriteNum = 0;
                                if ((adj & PoolSegments.TopRight) > 0)
                                {
                                    spriteNum |= 1;
                                }
                                if ((adj & PoolSegments.TopLeft) > 0)
                                {
                                    spriteNum |= 2;
                                }
                                if ((adj & PoolSegments.BottomLeft) > 0)
                                {
                                    spriteNum |= 4;
                                }
                                if ((adj & PoolSegments.BottomRight) > 0)
                                {
                                    spriteNum |= 8;
                                }

                                var _Sprite = new _2DSprite()
                                {
                                    RenderMode = _2DBatchRenderMode.Z_BUFFER
                                };
                                SPR2 sprite = null;
                                switch (world.Zoom)
                                {
                                case WorldZoom.Far:
                                    sprite           = floorContent.GetGlobalSPR((ushort)(0x400 + spriteNum));
                                    _Sprite.DestRect = FLOORDEST_FAR;
                                    _Sprite.Depth    = ArchZBuffers[14];
                                    break;

                                case WorldZoom.Medium:
                                    sprite           = floorContent.GetGlobalSPR((ushort)(0x410 + spriteNum));
                                    _Sprite.DestRect = FLOORDEST_MED;
                                    _Sprite.Depth    = ArchZBuffers[13];
                                    break;

                                case WorldZoom.Near:
                                    sprite           = floorContent.GetGlobalSPR((ushort)(0x420 + spriteNum));
                                    _Sprite.DestRect = FLOORDEST_NEAR;
                                    _Sprite.Depth    = ArchZBuffers[12];
                                    break;
                                }
                                _Sprite.Pixel   = world._2D.GetTexture(sprite.Frames[0]);
                                _Sprite.SrcRect = new Microsoft.Xna.Framework.Rectangle(0, 0, _Sprite.Pixel.Width, _Sprite.Pixel.Height);
                                _Sprite.Room    = room;
                                world._2D.Draw(_Sprite);

                                //draw any corners on top

                                PoolSegments[] CornerChecks =
                                {
                                    (PoolSegments.TopLeft | PoolSegments.TopRight),
                                    (PoolSegments.TopLeft | PoolSegments.BottomLeft),
                                    (PoolSegments.BottomLeft | PoolSegments.BottomRight),
                                    (PoolSegments.TopRight | PoolSegments.BottomRight)
                                };


                                if ((adj & CornerChecks[0]) == CornerChecks[0] && (adj & PoolSegments.Top) == 0)
                                {
                                    //top corner
                                    var tcS = new _2DSprite()
                                    {
                                        RenderMode = _2DBatchRenderMode.Z_BUFFER
                                    };
                                    //base sprite position on base tile
                                    sprite       = floorContent.GetGlobalSPR((ushort)(0x430 + ((int)world.Zoom - 1) * 4));
                                    tcS.Pixel    = world._2D.GetTexture(sprite.Frames[0]);
                                    tcS.DestRect = new Rectangle(_Sprite.DestRect.Center.X - tcS.Pixel.Width / 2, _Sprite.DestRect.Y, tcS.Pixel.Width, tcS.Pixel.Height);
                                    tcS.SrcRect  = new Microsoft.Xna.Framework.Rectangle(0, 0, tcS.Pixel.Width, tcS.Pixel.Height);
                                    tcS.Depth    = ArchZBuffers[21 + (3 - (int)world.Zoom)];
                                    tcS.Room     = room;
                                    world._2D.Draw(tcS);
                                }

                                if ((adj & CornerChecks[1]) == CornerChecks[1] && (adj & PoolSegments.Left) == 0)
                                {
                                    //left corner
                                    var tcS = new _2DSprite()
                                    {
                                        RenderMode = _2DBatchRenderMode.Z_BUFFER
                                    };
                                    //base sprite position on base tile
                                    sprite       = floorContent.GetGlobalSPR((ushort)(0x431 + ((int)world.Zoom - 1) * 4));
                                    tcS.Pixel    = world._2D.GetTexture(sprite.Frames[0]);
                                    tcS.DestRect = new Rectangle(_Sprite.DestRect.X, _Sprite.DestRect.Center.Y + 1 - tcS.Pixel.Height / 2, tcS.Pixel.Width, tcS.Pixel.Height);
                                    tcS.SrcRect  = new Microsoft.Xna.Framework.Rectangle(0, 0, tcS.Pixel.Width, tcS.Pixel.Height);
                                    tcS.Depth    = ArchZBuffers[24 + (3 - (int)world.Zoom)];
                                    tcS.Room     = room;
                                    world._2D.Draw(tcS);
                                }

                                if ((adj & CornerChecks[2]) == CornerChecks[2] && (adj & PoolSegments.Bottom) == 0)
                                {
                                    //bottom corner
                                    var tcS = new _2DSprite()
                                    {
                                        RenderMode = _2DBatchRenderMode.Z_BUFFER
                                    };
                                    //base sprite position on base tile
                                    sprite       = floorContent.GetGlobalSPR((ushort)(0x432 + ((int)world.Zoom - 1) * 4));
                                    tcS.Pixel    = world._2D.GetTexture(sprite.Frames[0]);
                                    tcS.DestRect = new Rectangle(_Sprite.DestRect.Center.X - tcS.Pixel.Width / 2, _Sprite.DestRect.Bottom - tcS.Pixel.Height, tcS.Pixel.Width, tcS.Pixel.Height);
                                    tcS.SrcRect  = new Microsoft.Xna.Framework.Rectangle(0, 0, tcS.Pixel.Width, tcS.Pixel.Height);
                                    tcS.Depth    = ArchZBuffers[27 + (3 - (int)world.Zoom)];
                                    tcS.Room     = room;
                                    world._2D.Draw(tcS);
                                }

                                if ((adj & CornerChecks[3]) == CornerChecks[3] && (adj & PoolSegments.Right) == 0)
                                {
                                    //right corner
                                    var tcS = new _2DSprite()
                                    {
                                        RenderMode = _2DBatchRenderMode.Z_BUFFER
                                    };
                                    //base sprite position on base tile
                                    sprite       = floorContent.GetGlobalSPR((ushort)(0x433 + ((int)world.Zoom - 1) * 4));
                                    tcS.Pixel    = world._2D.GetTexture(sprite.Frames[0]);
                                    tcS.DestRect = new Rectangle(_Sprite.DestRect.Right - tcS.Pixel.Width, _Sprite.DestRect.Center.Y + 1 - tcS.Pixel.Height / 2, tcS.Pixel.Width, tcS.Pixel.Height);
                                    tcS.SrcRect  = new Microsoft.Xna.Framework.Rectangle(0, 0, tcS.Pixel.Width, tcS.Pixel.Height);
                                    tcS.Depth    = ArchZBuffers[24 + (3 - (int)world.Zoom)];
                                    tcS.Room     = room;
                                    world._2D.Draw(tcS);
                                }
                            }
                            else
                            {
                                var floor = GetFloorSprite(floorContent.Get(comp.Pattern), 0, world);
                                floor.Room = room;
                                if (floor.Pixel != null)
                                {
                                    world._2D.Draw(floor);
                                }
                            }
                        }
                        else if (world.BuildMode && level > 1 && blueprint.Supported[level - 2][y * blueprint.Height + x])
                        {
                            var tilePosition = new Vector3(x, y, (level - 1) * 2.95f);
                            world._2D.OffsetPixel(world.WorldSpace.GetScreenFromTile(tilePosition));
                            world._2D.OffsetTile(tilePosition);

                            var floor = GetAirSprite(world);
                            floor.Room = 65535;
                            if (floor.Pixel != null)
                            {
                                world._2D.Draw(floor);
                            }
                        }
                    }
                }
            }
        }