예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
                                        }
                                    }
                                }
                }
            }
        }
예제 #4
0
        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);
            }
        }