Vector2 _lastPixelSize; // For dirty state detection public DialogFrame(IUiElement child) { On <BackendChangedEvent>(_ => { _sprite?.Dispose(); _sprite = null; }); Children.Add(child); }
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); }
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; }
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); }
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); } }
protected override void Unsubscribed() { _sprite?.Dispose(); _sprite = null; }
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); } }
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); }