static List <MemoryStream> ContainTextureStreams(CR2WFile cr2w, MemoryStream texbuffer) { List <MemoryStream> textureStreams = new List <MemoryStream>(); int Index = int.MaxValue; for (int i = 0; i < cr2w.Chunks.Count; i++) { if (cr2w.Chunks[i].REDType == "rendRenderMorphTargetMeshBlob") { Index = i; } } int Count = (cr2w.Chunks[Index].Data as rendRenderMorphTargetMeshBlob).Header.TargetTextureDiffsData.Count; int texCount = 0; List <UInt32> TargetDiffsDataOffset = new List <UInt32>(); List <UInt32> TargetDiffsDataSize = new List <UInt32>(); List <UInt32> TargetDiffsMipLevelCounts = new List <UInt32>(); List <UInt32> TargetDiffsWidth = new List <UInt32>(); for (int i = 0; i < Count; i++) { if ((cr2w.Chunks[Index].Data as rendRenderMorphTargetMeshBlob).Header.TargetTextureDiffsData[i].TargetDiffsDataSize.Count == 0) { break; } TargetDiffsDataOffset.Add((cr2w.Chunks[Index].Data as rendRenderMorphTargetMeshBlob).Header.TargetTextureDiffsData[i].TargetDiffsDataOffset[0].Value); TargetDiffsDataSize.Add((cr2w.Chunks[Index].Data as rendRenderMorphTargetMeshBlob).Header.TargetTextureDiffsData[i].TargetDiffsDataSize[0].Value); TargetDiffsMipLevelCounts.Add((cr2w.Chunks[Index].Data as rendRenderMorphTargetMeshBlob).Header.TargetTextureDiffsData[i].TargetDiffsMipLevelCounts[0].Value); TargetDiffsWidth.Add((cr2w.Chunks[Index].Data as rendRenderMorphTargetMeshBlob).Header.TargetTextureDiffsData[i].TargetDiffsWidth[0].Value); texCount++; } BinaryReader texbr = new BinaryReader(texbuffer); for (int i = 0; i < texCount; i++) { texbuffer.Position = TargetDiffsDataOffset[i]; byte[] bytes = texbr.ReadBytes((int)TargetDiffsDataSize[i]); MemoryStream ms = new MemoryStream(); DDSMetadata metadata = new DDSMetadata(TargetDiffsWidth[i], TargetDiffsWidth[i], TargetDiffsMipLevelCounts[i], EFormat.BC7_UNORM, 16, false, 0, true); DDSUtils.GenerateAndWriteHeader(ms, metadata); BinaryWriter bw = new BinaryWriter(ms); bw.Write(bytes); textureStreams.Add(ms); } return(textureStreams); }
private static List <MemoryStream> ContainTextureStreams(rendRenderMorphTargetMeshBlob blob, MemoryStream texbuffer) { var textureStreams = new List <MemoryStream>(); var Count = blob.Header.TargetTextureDiffsData.Count; var texCount = 0; var TargetDiffsDataOffset = new List <uint>(); var TargetDiffsDataSize = new List <uint>(); var TargetDiffsMipLevelCounts = new List <uint>(); var TargetDiffsWidth = new List <uint>(); for (var i = 0; i < Count; i++) { if (blob.Header.TargetTextureDiffsData[i].TargetDiffsDataSize.Count == 0) { break; } TargetDiffsDataOffset.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsDataOffset[0]); TargetDiffsDataSize.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsDataSize[0]); TargetDiffsMipLevelCounts.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsMipLevelCounts[0]); TargetDiffsWidth.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsWidth[0]); texCount++; } var texbr = new BinaryReader(texbuffer); for (var i = 0; i < texCount; i++) { texbuffer.Position = TargetDiffsDataOffset[i]; var bytes = texbr.ReadBytes((int)TargetDiffsDataSize[i]); var ms = new MemoryStream(); var metadata = new DDSMetadata( TargetDiffsWidth[i], TargetDiffsWidth[i], 1, 1, TargetDiffsMipLevelCounts[i], 0, 0, DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM, TEX_DIMENSION.TEX_DIMENSION_TEXTURE2D, 16, true); DDSUtils.GenerateAndWriteHeader(ms, metadata); var bw = new BinaryWriter(ms); bw.Write(bytes); textureStreams.Add(ms); } return(textureStreams); }
public void Extract(Stream output) { using (var file = MemoryMappedFile.CreateFromFile(this.ParentFile, FileMode.Open)) { // generate header var metadata = new DDSMetadata( BaseWidth, BaseHeight, (uint)Mipcount, Format, BaseAlignment, IsCube == 1, SliceCount, false ); DDSUtils.GenerateAndWriteHeader(output, metadata); if (IsCube == 0) { using (var viewstream = file.CreateViewStream((PageOffset * 4096) + 9, ZSize, MemoryMappedFileAccess.Read)) { //if ( format != ETextureFormat.TEXFMT_R8G8B8A8) new ZlibStream(viewstream, CompressionMode.Decompress).CopyTo(output); } for (int i = 0; i < NumMipOffsets; i++) { var mippageoffset = MipMapInfo[i].Offset; var mipzsize = MipMapInfo[i].ZSize; using (var viewstream = file.CreateViewStream((mippageoffset), mipzsize, MemoryMappedFileAccess.Read)) { //if ( format != ETextureFormat.TEXFMT_R8G8B8A8) new ZlibStream(viewstream, CompressionMode.Decompress).CopyTo(output); } } } else { using (var imagestream = new MemoryStream()) using (var mipmapstream = new MemoryStream()) using (var imagereader = new BinaryReader(imagestream)) using (var mipmapreader = new BinaryReader(mipmapstream)) { // extract to memory // image using (var vs = file.CreateViewStream((PageOffset * 4096) + 9, ZSize, MemoryMappedFileAccess.Read)) { // extracts all 6 faces after each other new ZlibStream(vs, CompressionMode.Decompress).CopyTo(imagestream); } //mipmaps // mipmap data <offset, size> var mipmapoffsets = new List <Tuple <long, long> >(); foreach (var mipinfo in MipMapInfo) { var beginoffset = mipmapstream.Position; using (var tempvs = file.CreateViewStream(mipinfo.Offset, mipinfo.ZSize, MemoryMappedFileAccess.Read)) { new ZlibStream(tempvs, CompressionMode.Decompress).CopyTo(mipmapstream); } mipmapoffsets.Add(new Tuple <long, long>(beginoffset, mipmapstream.Position - beginoffset)); } //assemble faces for (int i = 0; i < 6; i++) { // get one face var offset = 0 + (i * imagestream.Length / 6); var facesize = (int)imagestream.Length / 6; imagereader.BaseStream.Seek(offset, SeekOrigin.Begin); var face = imagereader.ReadBytes(facesize); output.Write(face, 0, face.Length); // get mipmaps for face foreach (var o in mipmapoffsets) { var mipsize = (o.Item2 / 6); var moffset = o.Item1 + (i * mipsize); mipmapreader.BaseStream.Seek(moffset, SeekOrigin.Begin); var mipmap = mipmapreader.ReadBytes((int)(mipsize)); output.Write(mipmap, 0, mipmap.Length); } } } } } }
public static DdsImage Xbm2Dds(CR2WExportWrapper imagechunk) { try { var image = ((CBitmapTexture)(imagechunk.data)).Image; var compression = imagechunk.GetVariableByName("compression").ToString(); var width = uint.Parse(imagechunk.GetVariableByName("width").ToString()); var height = uint.Parse(imagechunk.GetVariableByName("height").ToString()); var unk2 = uint.Parse(imagechunk.GetVariableByName("unk2").ToString()); var residentMipIndex = imagechunk.GetVariableByName("residentMipIndex") != null?uint.Parse(imagechunk.GetVariableByName("residentMipIndex").ToString()) : 0; var mips = (CBufferUInt32 <CVector3 <CUInt32> >)imagechunk.GetVariableByName("mips"); var tempfile = new MemoryStream(); var format = ETextureFormat.TEXFMT_R8G8B8A8; switch (compression) { case "TCM_DXTNoAlpha": format = ETextureFormat.TEXFMT_BC1; break; case "TCM_DXTAlpha": format = ETextureFormat.TEXFMT_BC3; break; case "TCM_NormalsHigh": format = ETextureFormat.TEXFMT_BC3; break; case "TCM_Normals": format = ETextureFormat.TEXFMT_BC1; break; case "TCM_NormalsGloss": format = ETextureFormat.TEXFMT_BC3; break; case "TCM_QualityControl": format = ETextureFormat.TEXFMT_BC3; break; default: throw new Exception("Invalid compression type! [" + compression + "]"); } using (var bw = new BinaryWriter(tempfile)) { var residentmipwidth = mips.elements[(int)residentMipIndex].x.val; var residentmipheight = mips.elements[(int)residentMipIndex].y.val; var residentmipcount = mips.elements.Count - residentMipIndex; var metadata = new DDSMetadata(residentmipwidth, residentmipheight, (uint)residentmipcount, format); DDSUtils.GenerateAndWriteHeader(bw.BaseStream, metadata); bw.Write(image.Bytes); } tempfile.Flush(); #if DEBUG //File.WriteAllBytes(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\asd.dds",tempfile.ToArray()); #endif return(new DdsImage(tempfile.ToArray())); } catch (Exception e) { string message = e.Message; string caption = "Error!"; MessageBoxButtons buttons = MessageBoxButtons.OK; MessageBox.Show(message, caption, buttons); return(null); } }