public static DxTexture LoadFromStream(GtexData gtex, Stream input) { if (gtex.Header.LayerCount == 0) return null; return gtex.Header.IsCubeMap ? ReadTextureCubeFromStream(gtex, input) : Read2DTextureFromStream(gtex, input); }
public override void ReadFromStream(Stream input) { base.ReadFromStream(input); TextureHeader = input.ReadContent <TextureHeader>(); Gtex = input.ReadContent <GtexData>(); }
private static Texture2DDescription Get2DTextureDescription(GtexData gtex) { if (gtex.Header.IsCubeMap) throw new Exception("IsCubeMap: true"); return new Texture2DDescription { ArraySize = 1, Width = gtex.Header.Width, Height = gtex.Header.Height, Format = GetDxFormat(gtex.Header.Format), MipLevels = gtex.Header.MipMapCount, BindFlags = BindFlags.ShaderResource, OptionFlags = ResourceOptionFlags.Shared, Usage = ResourceUsage.Default, CpuAccessFlags = CpuAccessFlags.None, SampleDescription = new SampleDescription(1, 0) }; }
private static DxTexture ReadTextureCubeFromStream(GtexData gtex, Stream input) { Texture2DDescription descriptor = GetTextureCubeDescription(gtex); using (SafeUnmanagedArray array = new SafeUnmanagedArray(gtex.MipMapData.Sum(d => d.Length))) { DataRectangle[] rects = new DataRectangle[gtex.MipMapData.Length]; using (UnmanagedMemoryStream io = array.OpenStream(FileAccess.Write)) { byte[] buff = new byte[32 * 1024]; for (int index = 0; index < gtex.MipMapData.Length; index++) { GtexMipMapLocation mimMap = gtex.MipMapData[index]; Int32 pitch = GetPitch(descriptor, index); rects[index] = CreateDataRectangle(array, io, pitch); input.SetPosition(mimMap.Offset); input.CopyToStream(io, mimMap.Length, buff); } } Texture2D texture = new Texture2D(_device, descriptor, rects); // Workaround _textureCreatingWorkaround(_device.ImmediateContext, texture, ImageFileFormat.Dds); return new DxTexture(texture, descriptor); } }
public override void ReadFromStream(Stream input) { base.ReadFromStream(input); TextureHeader = input.ReadContent<TextureHeader>(); Gtex = input.ReadContent<GtexData>(); }