Пример #1
0
    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);
    }
Пример #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);
    }