XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Runtime.InteropServices;
using Vortice.Direct3D11;
using Vortice.DXGI;
using XFEEDToolBox.Core.Rendering;

namespace XFEEDToolBox.Rendering;

internal sealed partial class GalaxyGraphics
{
    private ID3D11Texture2D? originalSpriteTexture;
    private ID3D11ShaderResourceView? originalSprites;
    internal bool OriginalClassifiedSpritesReady=>originalSprites is not null;
    internal bool OriginalGalaxyWorldSizeRestored=>true;
    internal bool OriginalClassifiedShaderRestored=>false;
    private void InitializeOriginalSprites()
    {
        var source=GalaxyOriginalStarSprites.Reference;
        if(!MemoryMarshal.TryGetArray(source.Payload,out ArraySegment<byte> data)||data.Array is null)
            throw new InvalidDataException("原星图点纹理缓冲区不可用。");
        var pin=GCHandle.Alloc(data.Array,GCHandleType.Pinned);
        try
        {
            var slices=new SubresourceData[GalaxyOriginalSpriteArray.Layers*GalaxyOriginalSpriteArray.MipCount];
            for(var layer=0;layer<GalaxyOriginalSpriteArray.Layers;layer++)
            for(var level=0;level<GalaxyOriginalSpriteArray.MipCount;level++)
            {
                var mip=source.Mips[level];
                slices[layer*GalaxyOriginalSpriteArray.MipCount+level]=new(pin.AddrOfPinnedObject()+data.Offset+mip.Offset+layer*mip.SliceBytes,
                    (uint)mip.RowPitch,(uint)mip.SliceBytes);
            }
            originalSpriteTexture=device.CreateTexture2D(new Texture2DDescription{Width=GalaxyOriginalSpriteArray.Width,Height=GalaxyOriginalSpriteArray.Height,
                ArraySize=GalaxyOriginalSpriteArray.Layers,MipLevels=GalaxyOriginalSpriteArray.MipCount,Format=Format.BC1_UNorm,
                SampleDescription=new(1,0),Usage=ResourceUsage.Immutable,BindFlags=BindFlags.ShaderResource},slices);
            originalSprites=device.CreateShaderResourceView(originalSpriteTexture);
        }
        finally{pin.Free();}
    }
    private void DisposeOriginalSprites(){originalSprites?.Dispose();originalSpriteTexture?.Dispose();}
}