Ejemplo n.º 1
0
        void RenderCursor(IAssetManager assets, ISpriteManager sm, IWindowManager window, Vector3 position)
        {
            if (!_showCursor)
            {
                _cursorSprite?.Dispose();
                _itemSprite?.Dispose();
                _cursorSprite = null;
                _itemSprite   = null;
                return;
            }

            var cursorTexture = assets.LoadTexture(_cursorId);

            if (cursorTexture == null)
            {
                return;
            }

            if (cursorTexture != _cursorSprite?.Key.Texture)
            {
                _cursorSprite?.Dispose();
                var key = new SpriteKey(cursorTexture, DrawLayer.Cursor, SpriteKeyFlags.NoDepthTest | SpriteKeyFlags.NoTransform);
                _cursorSprite = sm.Borrow(key, 1, this);
            }

            var instances = _cursorSprite.Access();
            var size      = window.UiToNormRelative(new Vector2(cursorTexture.Width, cursorTexture.Height));

            instances[0] = SpriteInstanceData.TopMid(position, size, _cursorSprite, 0, 0);
        }
Ejemplo n.º 2
0
        void RenderHotspot(ISpriteManager sm, IWindowManager window, bool showHotspot)
        {
            if (!showHotspot)
            {
                _hotspotSprite?.Dispose();
                _hotspotSprite = null;
                return;
            }

            var commonColors = Resolve <ICommonColors>();

            if (_hotspotSprite == null)
            {
                var key = new SpriteKey(commonColors.BorderTexture, SpriteSampler.Point, DrawLayer.MaxLayer, SpriteKeyFlags.NoTransform | SpriteKeyFlags.NoDepthTest);
                _hotspotSprite = sm.Borrow(key, 1, this);
            }

            var position = new Vector3(window.PixelToNorm(Position), 0.0f);
            var size     = window.UiToNormRelative(Vector2.One);

            bool lockWasTaken = false;
            var  instances    = _hotspotSprite.Lock(ref lockWasTaken);

            try
            {
                var region = _hotspotSprite.Key.Texture.Regions[(int)commonColors.Palette[CommonColor.Yellow3]];
                instances[0] = new SpriteInstanceData(position, size, region, SpriteFlags.TopMid);
            }
            finally { _hotspotSprite.Unlock(lockWasTaken); }
        }
Ejemplo n.º 3
0
        public MapRenderable2D(MapData2D mapData, ITexture tileset, TilesetData tileData) : base(Handlers)
        {
            _mapData  = mapData;
            _tileset  = tileset;
            _tileData = tileData;
            _tileset.GetSubImageDetails(0, out var tileSize, out _, out _, out _);
            TileSize = tileSize;

            var underlay = new SpriteInstanceData[_mapData.Width * _mapData.Height];
            var overlay  = new SpriteInstanceData[_mapData.Width * _mapData.Height];

            _underlay = new MultiSprite(new SpriteKey(
                                            _tileset,
                                            (int)DrawLayer.Underlay,
                                            underlay[0].Flags))
            {
                Instances = underlay.ToArray()
            };

            _overlay = new MultiSprite(new SpriteKey(
                                           _tileset,
                                           (int)DrawLayer.Overlay3,
                                           overlay[0].Flags))
            {
                Instances = overlay.ToArray()
            };
        }
Ejemplo n.º 4
0
        public override int Render(Rectangle extents, int order, Action <IRenderable> addFunc)
        {
            var window = Resolve <IWindowManager>();
            var size   = window.UiToNormRelative(new Vector2(extents.Width, extents.Height));
            var flags  = SpriteFlags.NoTransform | SpriteFlags.UsePalette | SpriteFlags.LeftAligned | SpriteFlags.NoDepthTest;

            // TODO: Cache sprite and rebuild when necessary
            var instances = new []
            {
                SpriteInstanceData.TopLeft(
                    Vector3.Zero,
                    size,
                    Vector2.Zero,
                    Vector2.One,
                    0,
                    flags
                    )
            };

            addFunc(new UiMultiSprite(new SpriteKey(_pixel, order, flags))
            {
                Position  = new Vector3(window.UiToNorm(new Vector2(extents.X, extents.Y)), 0),
                Instances = instances,
            });
            return(order);
        }
Ejemplo n.º 5
0
        public Tuple <SpriteKey, SpriteInstanceData> Resolve(Sprite sprite)
        {
            var      assetType = AssetTypeLookup[sprite.IdType];
            var      id        = sprite.NumericId;
            ITexture texture   = Resolve <IAssetManager>().LoadTexture(assetType, id);

            if (texture == null)
            {
                return(Tuple.Create(new SpriteKey(_defaultTexture, (int)DrawLayer.Diagnostic, sprite.Flags),
                                    SpriteInstanceData.Centred(sprite.Position,
                                                               new Vector2(_defaultTexture.Width, _defaultTexture.Height),
                                                               Vector2.Zero, Vector2.One, 0, 0)));
            }

            texture.GetSubImageDetails(sprite.SubObject, out var size, out var texOffset, out var texSize, out var layer);

            var key      = new SpriteKey(texture, sprite.RenderOrder, sprite.Flags);
            var instance = SpriteInstanceData.CopyFlags(
                sprite.Position,
                sprite.Size ?? size, texOffset, texSize, layer,
                sprite.Flags | (texture.Format == PixelFormat.R8_UNorm ? SpriteFlags.UsePalette : 0)
                );

            return(Tuple.Create(key, instance));
        }
Ejemplo n.º 6
0
    public void Update(int index, Vector3 position, Vector2 size, Region region, SpriteFlags flags)
    {
        bool taken = false;
        var  span  = Lock(ref taken);

        span[index] = new SpriteInstanceData(position, size, region, flags);
        Unlock(taken);
    }
Ejemplo n.º 7
0
        void Rebuild()
        {
            var window   = Resolve <IWindowManager>();
            var position = new Vector3(window.UiToNorm(_extents.X, _extents.Y), 0);
            var size     = window.UiToNormRelative(_extents.Width, _extents.Height);

            var instances = _sprite.Access();

            instances[0] = SpriteInstanceData.TopLeft(position, size, _sprite, 0, 0);
        }
Ejemplo n.º 8
0
        SpriteInstanceData BuildInstanceData(int i, int j, TilesetData.TileData tile, int tickCount)
        {
            if (tile == null || tile.Flags.HasFlag(TilesetData.TileFlags.Debug))
            {
                return(_blankInstance);
            }

            int index    = j * _mapData.Width + i;
            int subImage = tile.GetSubImageForTile(tickCount);

            _tileset.GetSubImageDetails(
                subImage,
                out var tileSize,
                out var texPosition,
                out var texSize,
                out var layer);

            DrawLayer drawLayer = tile.Layer.ToDrawLayer();
            var       position  = new Vector3(
                new Vector2(i, j) * tileSize,
                drawLayer.ToZCoordinate(j));

            var instance = _tileData.UseSmallGraphics
                ?  SpriteInstanceData.TopMid(
                position,
                tileSize,
                texPosition,
                texSize,
                layer,
                0)
                : SpriteInstanceData.TopLeft(
                position,
                tileSize,
                texPosition,
                texSize,
                layer,
                0);

            // int zoneNum = _mapData.ZoneLookup[index];
            // int eventNum = zoneNum == -1 ? -1 : _mapData.Zones[zoneNum].EventNumber;

            instance.Flags = 0
                             // |(_tileset is EightBitTexture ? SpriteFlags.UsePalette : 0)
                             // | (HighlightIndex == index ? SpriteFlags.Highlight : 0)
                             // | (eventNum != -1 && _highLightEvent != eventNum ? SpriteFlags.Highlight : 0)
                             // | (_highLightEvent == eventNum ? SpriteFlags.GreenTint : 0)
                             // | (tile.Collision != TilesetData.Passability.Passable ? SpriteFlags.RedTint : 0)
                             // | ((tile.Flags & TilesetData.TileFlags.TextId) != 0 ? SpriteFlags.RedTint : 0)
                             // | (((int) tile.Type) == 8 ? SpriteFlags.GreenTint : 0)
                             // | (((int) tile.Type) == 12 ? SpriteFlags.BlueTint : 0)
                             // | (((int) tile.Type) == 14 ? SpriteFlags.GreenTint | SpriteFlags.RedTint : 0) //&& tickCount % 2 == 0 ? SpriteFlags.Transparent : 0)
            ;

            return(instance);
        }
Ejemplo n.º 9
0
        void Rebuild(int width, int height, int order)
        {
            var window = Resolve <IWindowManager>();

            {
                var normSize  = window.UiToNormRelative(new Vector2(width, height));
                var pixelSize = window.NormToPixelRelative(normSize);

                if ((pixelSize - _lastPixelSize).LengthSquared() < float.Epsilon && _sprite.RenderOrder == order)
                {
                    return;
                }
                _lastPixelSize = pixelSize;
            }

            var totalSize = GetSize();
            var extents   = new Rectangle(0, 0, (int)totalSize.X, (int)totalSize.Y);

            var instances = new List <SpriteInstanceData>();

            for (int j = extents.Y; j < extents.Height; j++)
            {
                for (int i = extents.X; i < extents.Width; i++)
                {
                    int         n     = instances.Count;
                    SpriteFlags flags = SpriteFlags.NoTransform | SpriteFlags.NoDepthTest;
                    if ((n & 1) != 0)
                    {
                        flags |= SpriteFlags.BlueTint;
                    }
                    if ((n & 2) != 0)
                    {
                        flags |= SpriteFlags.GreenTint;
                    }
                    if ((n & 4) != 0)
                    {
                        flags |= SpriteFlags.RedTint;
                    }
                    if ((n & 8) != 0)
                    {
                        flags |= SpriteFlags.Highlight;
                    }

                    var position = new Vector3(window.UiToNorm(new Vector2(i, j)), 0);
                    var size     = 2 * Vector2.One / window.Size;
                    instances.Add(SpriteInstanceData.Centred(position, size, Vector2.Zero, Vector2.One, 0, flags));
                }
            }

            _sprite = new MultiSprite(new SpriteKey(_pixel, order, instances[0].Flags))
            {
                Instances = instances.ToArray()
            };
        }
Ejemplo n.º 10
0
        static void TransformTests()
        {
            Vector3 Transform(SpriteInstanceData instance, Vector3 vector)
            {
                var vec4        = new Vector4(vector, 1.0f);
                var m           = instance.Transform;
                var transformed = Vector4.Transform(vec4, m);

                return(new Vector3(transformed.X, transformed.Y, transformed.Z));
            }

            var origin = new Vector3();
            var oneX   = new Vector3(1, 0, 0);
            var oneY   = new Vector3(0, 1, 0);
            var oneZ   = new Vector3(0, 0, 1);

            void Test(string name, SpriteInstanceData instance)
            {
                var origin2 = Transform(instance, origin);
                var x2      = Transform(instance, oneX);
                var y2      = Transform(instance, oneY);
                var z2      = Transform(instance, oneZ);

                Console.WriteLine(name + ":");
                Console.WriteLine($"  0: {origin2}");
                Console.WriteLine($"  X: {x2}");
                Console.WriteLine($"  Y: {y2}");
                Console.WriteLine($"  Z: {z2}");
            }

            SpriteInstanceData Make(Vector3 position, Vector2 size) =>
            SpriteInstanceData.TopLeft(
                position, size,
                Vector2.Zero, Vector2.One,
                0, 0);


            Test("Neutral", Make(Vector3.Zero, Vector2.One));
            Test("+1X", Make(new Vector3(1, 0, 0), Vector2.One));
            Test("+1Y", Make(new Vector3(0, 1, 0), Vector2.One));
            Test("+1Z", Make(new Vector3(0, 0, 1), Vector2.One));
            Test("*2X", Make(Vector3.Zero, new Vector2(2, 1)));
            Test("*2Y", Make(Vector3.Zero, new Vector2(1, 2)));

            var x = Make(new Vector3(1, 0, 0), Vector2.One);

            x.OffsetBy(new Vector3(0, 1, 0));
            Test("+1X+1Y", x);

            Console.ReadLine();
        }
Ejemplo n.º 11
0
    void Rebuild(int width, int height, DrawLayer order)
    {
        var shadowSubImage = new Region(Vector2.Zero, Vector2.Zero, Vector2.One, 0);
        var window         = Resolve <IWindowManager>();
        var sm             = Resolve <ISpriteManager>();

        { // Check if we need to rebuild
            var normSize  = window.UiToNormRelative(width, height);
            var pixelSize = window.NormToPixelRelative(normSize);

            if ((pixelSize - _lastPixelSize).LengthSquared() < float.Epsilon && _sprite?.RenderOrder == order)
            {
                return;
            }
            _lastPixelSize = pixelSize;
        }

        var assets = Resolve <IAssetManager>();
        var multi  = new CompositedTexture(AssetId.None, $"Background {width}x{height}", assets.LoadPalette(Base.Palette.Inventory));

        // Background
        var background = assets.LoadTexture(Base.CoreSprite.UiBackground);

        multi.AddTexture(1, background, 0, 0, 0, true, width, height);

        var subImage       = multi.Regions[multi.GetSubImageAtTime(1, 0, false)];
        var normalisedSize = window.UiToNormRelative(subImage.Size);

        var key = new SpriteKey(multi, SpriteSampler.Point, order, SpriteKeyFlags.NoTransform);

        _sprite?.Dispose();

        var lease = sm.Borrow(key, 2, this);
        var flags = SpriteFlags.None.SetOpacity(0.5f);

        var shadowPosition = new Vector3(window.UiToNormRelative(10, 10), 0);
        var shadowSize     = window.UiToNormRelative(subImage.Size - new Vector2(10, 10));

        bool lockWasTaken = false;
        var  instances    = lease.Lock(ref lockWasTaken);

        try
        {
            instances[0] = new SpriteInstanceData(shadowPosition, shadowSize, shadowSubImage, SpriteFlags.TopLeft | flags); // Drop shadow
            instances[1] = new SpriteInstanceData(Vector3.Zero, normalisedSize, subImage, SpriteFlags.TopLeft);             // DialogFrame
        }
        finally { lease.Unlock(lockWasTaken); }

        _sprite = new PositionedSpriteBatch(lease, normalisedSize);
    }
Ejemplo n.º 12
0
        void Rebuild(int width, int height, DrawLayer order)
        {
            var shadowSubImage = new SubImage(Vector2.Zero, Vector2.Zero, Vector2.One, 0);
            var window         = Resolve <IWindowManager>();
            var sm             = Resolve <ISpriteManager>();
            var factory        = Resolve <ICoreFactory>();

            { // Check if we need to rebuild
                var normSize  = window.UiToNormRelative(width, height);
                var pixelSize = window.NormToPixelRelative(normSize);

                if ((pixelSize - _lastPixelSize).LengthSquared() < float.Epsilon && _sprite?.RenderOrder == order)
                {
                    return;
                }
                _lastPixelSize = pixelSize;
            }

            var assets = Resolve <IAssetManager>();
            var multi  = factory.CreateMultiTexture(AssetId.None, $"Background {width}x{height}",
                                                    new DummyPaletteManager(assets.LoadPalette(Base.Palette.Inventory)));

            // Background
            var background = assets.LoadTexture(Base.CoreSprite.UiBackground);

            multi.AddTexture(1, background, 0, 0,
                             0, true, (uint)width, (uint)height);

            var subImage       = multi.GetSubImageDetails(multi.GetSubImageAtTime(1, 0));
            var normalisedSize = window.UiToNormRelative(subImage.Size);

            var key = new SpriteKey(multi, order, SpriteKeyFlags.NoTransform);

            _sprite?.Dispose();

            var lease     = sm.Borrow(key, 2, this);
            var flags     = SpriteFlags.None.SetOpacity(0.5f);
            var instances = lease.Access();

            var shadowPosition = new Vector3(window.UiToNormRelative(10, 10), 0);
            var shadowSize     = window.UiToNormRelative(subImage.Size - new Vector2(10, 10));

            instances[0] = SpriteInstanceData.TopLeft(shadowPosition, shadowSize, shadowSubImage, flags); // Drop shadow
            instances[1] = SpriteInstanceData.TopLeft(Vector3.Zero, normalisedSize, subImage, 0);         // DialogFrame
            _sprite      = new PositionedSpriteBatch(lease, normalisedSize);
        }
Ejemplo n.º 13
0
        void UpdateSprite(Vector3 position, Vector2 size, DrawLayer layer)
        {
            if (layer != _sprite?.Key.RenderOrder)
            {
                _sprite?.Dispose();

                var sm  = Resolve <ISpriteManager>();
                var key = new SpriteKey(CommonColors.BorderTexture, layer, SpriteKeyFlags.NoTransform | SpriteKeyFlags.NoDepthTest);
                _sprite = sm.Borrow(key, 1, this);
            }
            else if (_lastPosition == position && _lastSize == size)
            {
                return;
            }

            var instances = _sprite.Access();

            instances[0]  = SpriteInstanceData.TopLeft(position, size, _sprite, (int)CommonColors.Palette[_color], 0);
            _lastPosition = position;
            _lastSize     = size;
        }
Ejemplo n.º 14
0
        void RenderHotspot(ISpriteManager sm, IWindowManager window, bool showHotspot)
        {
            if (!showHotspot)
            {
                _hotspotSprite?.Dispose();
                _hotspotSprite = null;
                return;
            }

            var commonColors = Resolve <ICommonColors>();

            if (_hotspotSprite == null)
            {
                var key = new SpriteKey(commonColors.BorderTexture, DrawLayer.MaxLayer, SpriteKeyFlags.NoTransform | SpriteKeyFlags.NoDepthTest);
                _hotspotSprite = sm.Borrow(key, 1, this);
            }

            var instances = _hotspotSprite.Access();
            var position  = new Vector3(window.PixelToNorm(Position), 0.0f);
            var size      = window.UiToNormRelative(Vector2.One);

            instances[0] = SpriteInstanceData.TopLeft(position, size, _hotspotSprite, (int)commonColors.Palette[CommonColor.Yellow3], 0);
        }
Ejemplo n.º 15
0
        void RenderCursor(IAssetManager assets, ISpriteManager sm, IWindowManager window, Vector3 position)
        {
            if (!_showCursor)
            {
                _cursorSprite?.Dispose();
                _itemSprite?.Dispose();
                _cursorSprite = null;
                _itemSprite   = null;
                return;
            }

            var cursorTexture = assets.LoadTexture(_cursorId);

            if (cursorTexture == null)
            {
                return;
            }

            if (cursorTexture != _cursorSprite?.Key.Texture)
            {
                _cursorSprite?.Dispose();
                var key = new SpriteKey(cursorTexture, SpriteSampler.Point, DrawLayer.Cursor, SpriteKeyFlags.NoDepthTest | SpriteKeyFlags.NoTransform);
                _cursorSprite = sm.Borrow(key, 1, this);
            }

            var size = window.UiToNormRelative(new Vector2(cursorTexture.Width, cursorTexture.Height));

            bool lockWasTaken = false;
            var  instances    = _cursorSprite.Lock(ref lockWasTaken);

            try
            {
                instances[0] = new SpriteInstanceData(position, size, _cursorSprite.Key.Texture.Regions[0], SpriteFlags.TopMid);
            }
            finally { _cursorSprite.Unlock(lockWasTaken); }
        }
Ejemplo n.º 16
0
        public PositionedSpriteBatch BuildRenderable(TextBlock block, DrawLayer order, Rectangle?scissorRegion, object caller)
        {
            if (block == null)
            {
                throw new ArgumentNullException(nameof(block));
            }
            var assets = Resolve <IAssetManager>();
            var sm     = Resolve <ISpriteManager>();
            var window = Resolve <IWindowManager>();

            var font  = assets.LoadFont(block.Color, block.Style == TextStyle.Big);
            var text  = block.Text ?? "";
            var isFat = block.Style == TextStyle.Fat || block.Style == TextStyle.FatAndHigh;

            int offset = 0;
            var flags  = SpriteKeyFlags.NoTransform | SpriteKeyFlags.NoDepthTest;
            var key    = new SpriteKey(font, order, flags, scissorRegion);
            int displayableCharacterCount = text.Count(x => FontMapping.ContainsKey(x));
            int instanceCount             = displayableCharacterCount * (isFat ? 4 : 2);
            var lease     = sm.Borrow(key, instanceCount, caller);
            var instances = lease.Access();

            int n = 0;

            foreach (var c in text)
            {
                if (!FontMapping.TryGetValue(c, out var index))
                {
                    offset += SpaceSize; continue;
                }                                                                                  // Spaces etc

                var subImage = font.GetSubImageDetails(index);

                // Adjust texture coordinates slightly to avoid bleeding
                // var texOffset = subImage.TexOffset.Y + 0.1f / font.Height;

                var normPosition = window.UiToNormRelative(offset, 0);
                var baseInstance = SpriteInstanceData.TopLeft(
                    new Vector3(normPosition, 0),
                    window.UiToNormRelative(subImage.Size),
                    subImage, 0);

                instances[n]     = baseInstance;
                instances[n + 1] = baseInstance;
                if (isFat)
                {
                    instances[n + 2] = baseInstance;
                    instances[n + 3] = baseInstance;

                    instances[n].OffsetBy(new Vector3(window.UiToNormRelative(2, 1), 0));
                    instances[n].Flags |= SpriteFlags.DropShadow;

                    instances[n + 1].OffsetBy(new Vector3(window.UiToNormRelative(1, 1), 0));
                    instances[n + 1].Flags |= SpriteFlags.DropShadow;

                    instances[n + 2].OffsetBy(new Vector3(window.UiToNormRelative(1, 0), 0));
                    offset += 1;
                }
                else
                {
                    instances[n].Flags |= SpriteFlags.DropShadow;
                    instances[n].OffsetBy(new Vector3(window.UiToNormRelative(1, 1), 0));
                }

                offset += (int)subImage.Size.X;
                n      += isFat ? 4 : 2;
            }

            var fontSize = font.GetSubImageDetails(0).Size;
            var size     = new Vector2(offset + 1, fontSize.Y + 1); // +1 for the drop shadow

            return(new PositionedSpriteBatch(lease, size));
        }
Ejemplo n.º 17
0
        void Rebuild(int width, int height, DrawLayer order)
        {
            var window  = Resolve <IWindowManager>();
            var sm      = Resolve <ISpriteManager>();
            var factory = Resolve <ICoreFactory>();

            { // Check if we need to rebuild
                var normSize  = window.UiToNormRelative(width, height);
                var pixelSize = window.NormToPixelRelative(normSize);

                if ((pixelSize - _lastPixelSize).LengthSquared() < float.Epsilon && _sprite?.RenderOrder == order)
                {
                    return;
                }
                _lastPixelSize = pixelSize;
            }

            var assets = Resolve <IAssetManager>();
            var multi  = factory.CreateMultiTexture($"DialogFrame {width}x{height}", new DummyPaletteManager(assets.LoadPalette(PaletteId.Inventory)));

            void DrawLine(uint y)
            {
                uint x = TileSize;
                uint n = 0;

                while (x < width - TileSize)
                {
                    var  texture = assets.LoadTexture((CoreSpriteId)((int)CoreSpriteId.UiBackgroundLines1 + n % 4));
                    uint?w       = x + 2 * TileSize > width ? (uint)(width - TileSize - x) : (uint?)null;
                    multi.AddTexture(1, texture, x, y, 0, true, w);
                    n++;
                    x += TileSize;
                }
            }

            void DrawVerticalLine(uint x)
            {
                uint y       = TileSize;
                uint n       = 0;
                var  texture = assets.LoadTexture((CoreSpriteId)((int)CoreSpriteId.UiBackgroundLines1 + n % 4));

                texture = CoreUtil.BuildRotatedTexture(factory, (EightBitTexture)texture);
                while (y < height - TileSize)
                {
                    uint?h = y + 2 * TileSize > height ? (uint)(height - TileSize - y) : (uint?)null;
                    multi.AddTexture(1, texture, x, y, 0, true, null, h);
                    n++;
                    y += TileSize;
                }
            }

            // Background
            switch (Background)
            {
            case DialogFrameBackgroundStyle.MainMenuPattern:
            {
                var background = assets.LoadTexture(CoreSpriteId.UiBackground);
                multi.AddTexture(1, background,
                                 FrameOffsetX, FrameOffsetY, 0, true,
                                 (uint)width - FrameOffsetX * 2, (uint)height - FrameOffsetY * 2);
                break;
            }

            case DialogFrameBackgroundStyle.DarkTint:
            {
                var colors = Resolve <ICommonColors>();
                multi.AddTexture(1, colors.BorderTexture,
                                 FrameOffsetX, FrameOffsetY, 0, false,
                                 (uint)width - FrameOffsetX * 2, (uint)height - FrameOffsetY * 2, 128);
                break;
            }
            }

            // Corners
            multi.AddTexture(1, assets.LoadTexture(CoreSpriteId.UiWindowTopLeft), 0, 0, 0, true);
            multi.AddTexture(1, assets.LoadTexture(CoreSpriteId.UiWindowTopRight), (uint)width - TileSize, 0, 0, true);
            multi.AddTexture(1, assets.LoadTexture(CoreSpriteId.UiWindowBottomLeft), 0, (uint)height - TileSize, 0, true);
            multi.AddTexture(1, assets.LoadTexture(CoreSpriteId.UiWindowBottomRight), (uint)width - TileSize, (uint)height - TileSize, 0, true);

            DrawLine(4);                                  // Left
            DrawLine((uint)height - FrameOffsetY);        // Right
            DrawVerticalLine(4);                          // Top
            DrawVerticalLine((uint)width - FrameOffsetX); // Bottom

            var subImage       = multi.GetSubImageDetails(multi.GetSubImageAtTime(1, 0));
            var normalisedSize = window.UiToNormRelative(subImage.Size);

            var key = new SpriteKey(multi, order, SpriteKeyFlags.NoTransform);

            _sprite?.Dispose();

            var lease     = sm.Borrow(key, 3, this);
            var flags     = SpriteFlags.None.SetOpacity(0.5f);
            var instances = lease.Access();

            var shadowSubImage = new SubImage(Vector2.Zero, Vector2.Zero, Vector2.One, 0);

            var bottomShadowPosition = new Vector3(window.UiToNormRelative(
                                                       ShadowX, subImage.Size.Y - ShadowY), 0);

            var sideShadowPosition = new Vector3(window.UiToNormRelative(
                                                     subImage.Size.X - ShadowX, ShadowY), 0);

            var bottomShadowSize = window.UiToNormRelative(subImage.Size.X - ShadowX, ShadowY);
            var sideShadowSize   = window.UiToNormRelative(ShadowX, subImage.Size.Y - ShadowY * 2);

            instances[0] = SpriteInstanceData.TopLeft(bottomShadowPosition, bottomShadowSize, shadowSubImage, flags);
            instances[1] = SpriteInstanceData.TopLeft(sideShadowPosition, sideShadowSize, shadowSubImage, flags);
            instances[2] = SpriteInstanceData.TopLeft(Vector3.Zero, normalisedSize, subImage, 0);
            _sprite      = new PositionedSpriteBatch(lease, normalisedSize);
        }
Ejemplo n.º 18
0
        void RenderItemInHandCursor(IAssetManager assets, ISpriteManager sm, IWindowManager window, Vector3 normPosition)
        {
            var held           = Resolve <IInventoryManager>().ItemInHand;
            var itemAmountText = GetAmountText();

            if (_lastItemAmountText != itemAmountText)
            {
                var tm = Resolve <ITextManager>();
                _lastItemAmountText = itemAmountText;
                _itemAmountSprite?.Dispose();
                _itemAmountSprite = itemAmountText == null
                    ? null
                    : tm.BuildRenderable(new TextBlock(itemAmountText), DrawLayer.MaxLayer, null, this);
            }

            if (_cursorId != CoreSpriteId.CursorSmall) // Inventory screen, check what's being held.
            {
                _itemSprite?.Dispose(); _itemSprite             = null;
                _itemAmountSprite?.Dispose(); _itemAmountSprite = null;
                return;
            }

            int      subItem = 0;
            ITexture texture = null;

            switch (held.Item)
            {
            case Gold _: texture = assets.LoadTexture(CoreSpriteId.UiGold); break;

            case Rations _: texture = assets.LoadTexture(CoreSpriteId.UiFood); break;

            case ItemData item:
            {
                ItemSpriteId spriteId = (ItemSpriteId)((int)item.Icon + _frame % item.IconAnim);
                texture = assets.LoadTexture(spriteId);
                subItem = (int)spriteId;
                break;
            }
            }

            if (texture == null)
            {
                _itemSprite?.Dispose();
                _itemSprite = null;
                return;
            }

            if (texture != _itemSprite?.Key.Texture)
            {
                _itemSprite?.Dispose();

                var key = new SpriteKey(texture, DrawLayer.Cursor,
                                        SpriteKeyFlags.NoDepthTest | SpriteKeyFlags.NoTransform);

                _itemSprite = sm.Borrow(key, 1, this);
            }

            var subImage = texture.GetSubImageDetails(subItem);

            // TODO: Quantity text
            var instances = _itemSprite.Access();

            instances[0] = SpriteInstanceData.TopMid(
                normPosition + new Vector3(window.UiToNormRelative(6, 6), 0),
                window.UiToNormRelative(subImage.Size),
                subImage, 0);

            if (_itemAmountSprite != null)
            {
                _itemAmountSprite.Position = normPosition + new Vector3(window.UiToNormRelative(6, 18), 0);
            }
        }
Ejemplo n.º 19
0
        void RenderItemInHandCursor(IAssetManager assets, ISpriteManager sm, IWindowManager window, Vector3 normPosition)
        {
            var held           = Resolve <IInventoryManager>().ItemInHand;
            var itemAmountText = GetAmountText();

            if (_lastItemAmountText != itemAmountText)
            {
                var tm = Resolve <ITextManager>();
                _lastItemAmountText = itemAmountText;
                _itemAmountSprite?.Dispose();
                _itemAmountSprite = itemAmountText == null
                    ? null
                    : tm.BuildRenderable(new TextBlock(itemAmountText), DrawLayer.MaxLayer, null, this);
            }

            if (_cursorId != Base.CoreSprite.CursorSmall) // Inventory screen, check what's being held.
            {
                _itemSprite?.Dispose(); _itemSprite             = null;
                _itemAmountSprite?.Dispose(); _itemAmountSprite = null;
                return;
            }

            int      subItem = 0;
            ITexture texture = null;

            switch (held.Item)
            {
            case Gold: texture = assets.LoadTexture(Base.CoreSprite.UiGold); break;

            case Rations: texture = assets.LoadTexture(Base.CoreSprite.UiFood); break;

            case ItemData item:
            {
                texture = assets.LoadTexture(item.Icon);
                subItem = item.IconSubId + _frame % item.IconAnim;
                break;
            }
            }

            if (texture == null)
            {
                _itemSprite?.Dispose();
                _itemSprite = null;
                return;
            }

            if (texture != _itemSprite?.Key.Texture)
            {
                _itemSprite?.Dispose();

                var key = new SpriteKey(texture, SpriteSampler.Point, DrawLayer.Cursor, SpriteKeyFlags.NoDepthTest | SpriteKeyFlags.NoTransform);
                _itemSprite = sm.Borrow(key, 1, this);
            }

            var subImage = texture.Regions[subItem];

            bool lockWasTaken = false;
            var  instances    = _itemSprite.Lock(ref lockWasTaken);

            try
            {
                // TODO: Quantity text
                instances[0] = new SpriteInstanceData(
                    normPosition + new Vector3(window.UiToNormRelative(6, 6), 0),
                    window.UiToNormRelative(subImage.Size),
                    subImage, SpriteFlags.TopMid);
            }
            finally { _itemSprite.Unlock(lockWasTaken); }

            if (_itemAmountSprite != null)
            {
                _itemAmountSprite.Position = normPosition + new Vector3(window.UiToNormRelative(6, 18), 0);
            }
        }
Ejemplo n.º 20
0
        public IPositionedRenderable BuildRenderable(TextBlock block, out Vector2 size)
        {
            var assets = Resolve <IAssetManager>();
            var window = Resolve <IWindowManager>();

            var font  = assets.LoadFont(block.Color, block.Style == TextStyle.Big);
            var text  = block.Text ?? "";
            var isFat = block.Style == TextStyle.Fat || block.Style == TextStyle.FatAndHigh;

            var instances = new SpriteInstanceData[text.Length * (isFat ? 4 : 2)];
            int offset    = 0;
            var flags     = SpriteFlags.UsePalette | SpriteFlags.NoTransform | SpriteFlags.NoDepthTest;

            for (int i = 0; i < text.Length; i++)
            {
                int  n = i * (isFat ? 4 : 2);
                char c = text[i];
                if (FontMapping.TryGetValue(c, out var index))
                {
                    font.GetSubImageDetails(index, out var characterSize, out var texOffset, out var texSize, out var layer);

                    // Adjust texture coordinates slightly to avoid bleeding
                    texOffset.Y += 0.1f / font.Height;

                    var normPosition = window.UiToNormRelative(new Vector2(offset, 0));
                    var baseInstance = SpriteInstanceData.TopLeft(
                        new Vector3(normPosition, 0),
                        window.UiToNormRelative(new Vector2(characterSize.X, characterSize.Y)),
                        texOffset, texSize, layer, flags);

                    instances[n]     = baseInstance;
                    instances[n + 1] = baseInstance;
                    if (isFat)
                    {
                        instances[n + 2] = baseInstance;
                        instances[n + 3] = baseInstance;

                        instances[n].OffsetBy(new Vector3(window.UiToNormRelative(new Vector2(2, 1)), 0));
                        instances[n].Flags |= SpriteFlags.DropShadow;

                        instances[n + 1].OffsetBy(new Vector3(window.UiToNormRelative(new Vector2(1, 1)), 0));
                        instances[n + 1].Flags |= SpriteFlags.DropShadow;

                        instances[n + 2].OffsetBy(new Vector3(window.UiToNormRelative(new Vector2(1, 0)), 0));
                        offset += 1;
                    }
                    else
                    {
                        instances[n].Flags |= SpriteFlags.DropShadow;
                        instances[n].OffsetBy(new Vector3(window.UiToNormRelative(new Vector2(1, 1)), 0));
                    }

                    offset += (int)characterSize.X;
                }
                else
                {
                    offset += SpaceSize;
                }
            }

            font.GetSubImageDetails(0, out var fontSize, out _, out _, out _);
            size = new Vector2(offset + 1, fontSize.Y + 1); // +1 for the drop shadow
            return(new UiMultiSprite(new SpriteKey(font, (int)DrawLayer.Interface, flags))
            {
                Instances = instances
            });
        }
Ejemplo n.º 21
0
        void Render()
        {
            if (!_dirty)
            {
                return;
            }
            _dirty = false;

            var assets = Resolve <IAssetManager>();
            var sm     = Resolve <ISpriteManager>();
            var window = Resolve <IWindowManager>();

            if (window.Size.X < 1 || window.Size.Y < 1)
            {
                return;
            }

            var cursorTexture = assets.LoadTexture(_cursorId);

            if (cursorTexture == null)
            {
                return;
            }

            if (cursorTexture != _cursorSprite?.Key.Texture)
            {
                _cursorSprite?.Dispose();

                var key = new SpriteKey(cursorTexture, DrawLayer.MaxLayer,
                                        SpriteKeyFlags.NoDepthTest | SpriteKeyFlags.NoTransform);

                _cursorSprite = sm.Borrow(key, 1, this);
            }

            var instances = _cursorSprite.Access();
            var position  = new Vector3(window.PixelToNorm(_position), 0.0f);
            var size      = window.UiToNormRelative(_size) / 2;

            instances[0] = SpriteInstanceData.TopMid(position, size, _cursorSprite, 0, 0);

            if (_cursorId == CoreSpriteId.CursorSmall) // Inventory screen, check what's being held.
            {
                var held = Resolve <IInventoryScreenState>().ItemInHand;

                int      subItem = 0;
                ITexture texture = null;

                if (held is GoldInHand)
                {
                    texture = assets.LoadTexture(CoreSpriteId.UiGold);
                }
                else if (held is RationsInHand)
                {
                    texture = assets.LoadTexture(CoreSpriteId.UiFood);
                }
                else if (held is ItemSlot itemInHand)
                {
                    var          item     = assets.LoadItem(itemInHand.Id);
                    ItemSpriteId spriteId = item.Icon + _frame % item.IconAnim;
                    texture = assets.LoadTexture(spriteId);
                    subItem = (int)spriteId;
                }

                if (texture == null)
                {
                    _itemSprite?.Dispose();
                    _itemSprite = null;
                    return;
                }

                if (texture != _itemSprite?.Key.Texture)
                {
                    _itemSprite?.Dispose();

                    var key = new SpriteKey(texture, DrawLayer.MaxLayer,
                                            SpriteKeyFlags.NoDepthTest | SpriteKeyFlags.NoTransform);

                    _itemSprite = sm.Borrow(key, 1, this);
                }

                texture.GetSubImageDetails(subItem, out size, out var to, out var ts, out var tl);

                // TODO: Quantity text
                instances    = _itemSprite.Access();
                instances[0] = SpriteInstanceData.TopMid(
                    position + new Vector3(window.UiToNormRelative(new Vector2(6, 6)), 0),
                    window.UiToNormRelative(size),
                    to, ts, tl, 0);
            }
            else
            {
                _itemSprite?.Dispose();
                _itemSprite = null;
            }
        }