Beispiel #1
0
        private static void UpdateUDKOffsets(ExportEntry export, int newDataOffset)
        {
            if (export.IsDefaultObject)
            {
                return; //this is not actually instance of that class
            }
            //update offsets for pcc-stored mips in Textures
            if (export.IsTexture())
            {
                int          baseOffset = newDataOffset + export.propsEnd();
                MemoryStream binData    = new MemoryStream(export.getBinaryData());
                binData.Skip(12);
                binData.WriteInt32(baseOffset + (int)binData.Position + 4);
                for (int i = binData.ReadInt32(); i > 0 && binData.Position < binData.Length; i--)
                {
                    var storageFlags = (StorageFlags)binData.ReadInt32();
                    if (!storageFlags.HasFlag(StorageFlags.externalFile)) //pcc-stored
                    {
                        int uncompressedSize = binData.ReadInt32();
                        int compressedSize   = binData.ReadInt32();
                        binData.WriteInt32(baseOffset + (int)binData.Position + 4);                                                       //update offset
                        binData.Seek((storageFlags == StorageFlags.noFlags ? uncompressedSize : compressedSize) + 8, SeekOrigin.Current); //skip texture and width + height values
                    }
                    else
                    {
                        binData.Seek(20, SeekOrigin.Current);//skip whole rest of mip definition
                    }
                }

                binData.Skip(40);
                binData.WriteInt32(baseOffset + (int)binData.Position + 4);
                export.setBinaryData(binData.ToArray());
            }
        }
Beispiel #2
0
        private static void UpdateME1Offsets(ExportEntry export, int newDataOffset)
        {
            if (export.IsDefaultObject)
            {
                return; //this is not actually instance of that class
            }
            if (export.IsTexture())
            {
                int          baseOffset = newDataOffset + export.propsEnd();
                MemoryStream binData    = new MemoryStream(export.getBinaryData());
                binData.Skip(12);
                binData.WriteInt32(baseOffset + (int)binData.Position + 4);
                for (int i = binData.ReadInt32(); i > 0 && binData.Position < binData.Length; i--)
                {
                    var storageFlags = (StorageFlags)binData.ReadInt32();
                    if (!storageFlags.HasFlag(StorageFlags.externalFile)) //pcc-stored
                    {
                        int uncompressedSize = binData.ReadInt32();
                        int compressedSize   = binData.ReadInt32();
                        binData.WriteInt32(baseOffset + (int)binData.Position + 4);                                                       //update offset
                        binData.Seek((storageFlags == StorageFlags.noFlags ? uncompressedSize : compressedSize) + 8, SeekOrigin.Current); //skip texture and width + height values
                    }
                    else
                    {
                        binData.Seek(20, SeekOrigin.Current);//skip whole rest of mip definition
                    }
                }
                export.setBinaryData(binData.ToArray());
            }
            else if (export.ClassName == "StaticMeshComponent")
            {
                int          baseOffset = newDataOffset + export.propsEnd();
                MemoryStream bin        = new MemoryStream(export.Data);
                bin.JumpTo(export.propsEnd());

                int lodDataCount = bin.ReadInt32();
                for (int i = 0; i < lodDataCount; i++)
                {
                    int shadowMapCount = bin.ReadInt32();
                    bin.Skip(shadowMapCount * 4);
                    int shadowVertCount = bin.ReadInt32();
                    bin.Skip(shadowVertCount * 4);
                    int lightMapType = bin.ReadInt32();
                    if (lightMapType == 0)
                    {
                        continue;
                    }
                    int lightGUIDsCount = bin.ReadInt32();
                    bin.Skip(lightGUIDsCount * 16);
                    switch (lightMapType)
                    {
                    case 1:
                        bin.Skip(4 + 8);
                        int bulkDataSize = bin.ReadInt32();
                        bin.WriteInt32(baseOffset + (int)bin.Position + 4);
                        bin.Skip(bulkDataSize);
                        bin.Skip(12 * 4 + 8);
                        bulkDataSize = bin.ReadInt32();
                        bin.WriteInt32(baseOffset + (int)bin.Position + 4);
                        bin.Skip(bulkDataSize);
                        break;

                    case 2:
                        bin.Skip((16) * 4 + 16);
                        break;
                    }
                }
            }
        }