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); }
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); } }
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() }; }
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); }
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)); }
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); }
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); }
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); }
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() }; }
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(); }
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(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 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; }
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); }
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); } }
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)); }
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); }
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); } }
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); } }
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 }); }
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; } }