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