public ExtrudedTilemap(EtmManager manager, IAssetId id, string name, int tileCount, DungeonTileMapProperties properties, IPalette dayPalette, IPalette nightPalette) { if (dayPalette == null) { throw new ArgumentNullException(nameof(dayPalette)); } _manager = manager ?? throw new ArgumentNullException(nameof(manager)); _tiles = new MultiBuffer <DungeonTile>(tileCount, BufferUsage.VertexBuffer) { Name = $"B_Inst{name}" }; _properties = new SingleBuffer <DungeonTileMapProperties>(properties, BufferUsage.UniformBuffer) { Name = $"B_TileProps:{name}" }; AttachChild(_tiles); AttachChild(_properties); Name = name; _dayFloors = new CompositedTexture(id, "FloorTiles:" + name, dayPalette); _dayWalls = new CompositedTexture(id, "WallTiles:" + name, dayPalette); if (nightPalette != null) { _nightFloors = new CompositedTexture(id, "FloorTiles:" + name, nightPalette); _nightWalls = new CompositedTexture(id, "WallTiles:" + name, nightPalette); } OpaqueWindow = new EtmWindow($"{Name}_Opaque", this, tileCount, false); AlphaWindow = new EtmWindow($"{Name}_Alpha", this, tileCount, true); AttachChild(OpaqueWindow); AttachChild(AlphaWindow); }
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); }