Пример #1
0
        public void generateBlocks()
        {
            blocks.Clear();
            int blockCount = (uncompressedSize + blocksize - 1) / blocksize;

            compressedSize = 0;
            for (int i = 0; i < blockCount; i++)
            {
                //if data was not found, skip
                if (uncompressedData == null)
                {
                    continue;
                }

                int blockOffset = i * blocksize;
                int blockEnd    = blockOffset + blocksize;
                if (blockEnd > uncompressedSize)
                {
                    blockEnd = uncompressedSize;
                }

                var block = new ChunkBlock();
                block.uncompressedDataSize = blockEnd - blockOffset;
                block.uncompressedData     = new byte[block.uncompressedDataSize];
                Array.ConstrainedCopy(uncompressedData, blockOffset, block.uncompressedData, 0, block.uncompressedData.Length);

                block.compressTextureFlags(flags);

                compressedSize += block.compressedSize;
                blocks.Add(block);
            }
        }
Пример #2
0
        private void ReadMipMapFromReader(BinaryReader reader, MipMap map, GpkPackage package)
        {
            map.signature = reader.ReadInt32(); //0x9e2a83c1
            Debug.Assert(map.signature == Constants.DEFAULT_SIGNATURE);

            map.blocksize = reader.ReadInt32();

            map.compressedSize = reader.ReadInt32();
            map.uncompressedSize_chunkheader = reader.ReadInt32();
            map.uncompressedData             = new byte[map.uncompressedSize];

            map.blockCount = (map.uncompressedSize + map.blocksize - 1) / map.blocksize;
            int blockOffset = 0;


            for (int j = 0; j < map.blockCount; ++j)
            {
                var block = new ChunkBlock();
                block.compressedSize       = reader.ReadInt32();
                block.uncompressedDataSize = reader.ReadInt32();

                map.blocks.Add(block);
            }


            foreach (ChunkBlock block in map.blocks)
            {
                block.compressedData = reader.ReadBytes(block.compressedSize);
                block.decompressTextureFlags(map.flags);

                Array.ConstrainedCopy(block.uncompressedData, 0, map.uncompressedData, blockOffset, block.uncompressedDataSize);
                blockOffset += block.uncompressedDataSize;

                //save memory
                block.uncompressedData = null;
            }

            //we clear the compressed chunkblocks, so only uncompressed data is present
            //blocks need to be rebuild when saving
            if (package.LowMemMode)
            {
                map.blocks.Clear();
            }
        }