Beispiel #1
0
        Vector2 _lastPixelSize; // For dirty state detection

        public DialogFrame(IUiElement child)
        {
            On <BackendChangedEvent>(_ =>
            {
                _sprite?.Dispose();
                _sprite = null;
            });
            Children.Add(child);
        }
Beispiel #2
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);
    }
Beispiel #3
0
        void Rebuild(DrawLayer order)
        {
            if (!IsSubscribed || !IsDirty && order == _sprite?.RenderOrder)
                return;

            _sprite?.Dispose();
            _sprite = 
                string.IsNullOrWhiteSpace(Block.Text)
                ? null
                : Resolve<ITextManager>().BuildRenderable(Block, order, _scissorRegion, this);

            _lastOrder = order;
            IsDirty = false;
        }
Beispiel #4
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);
        }
Beispiel #5
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);
            }
        }
Beispiel #6
0
 protected override void Unsubscribed()
 {
     _sprite?.Dispose();
     _sprite = null;
 }
Beispiel #7
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);
            }
        }
Beispiel #8
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);
        }