mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-11-22 15:02:54 +08:00
Added Save method to YftFile
This commit is contained in:
parent
f0128223ef
commit
43f6acda7a
@ -45,6 +45,13 @@ namespace CodeWalker.GameFiles
|
||||
Loaded = true;
|
||||
}
|
||||
|
||||
public byte[] Save()
|
||||
{
|
||||
byte[] data = ResourceBuilder.Build(Fragment, 162); //yft is type/version 162...
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -181,6 +181,7 @@ namespace CodeWalker.GameFiles
|
||||
//TestYbns();
|
||||
//TestYdrs();
|
||||
//TestYdds();
|
||||
//TestYfts();
|
||||
//TestYmaps();
|
||||
//TestPlacements();
|
||||
//TestDrawables();
|
||||
@ -3183,6 +3184,60 @@ namespace CodeWalker.GameFiles
|
||||
if (errorfiles.Count > 0)
|
||||
{ }
|
||||
}
|
||||
public void TestYfts()
|
||||
{
|
||||
var errorfiles = new List<RpfEntry>();
|
||||
foreach (RpfFile file in AllRpfs)
|
||||
{
|
||||
foreach (RpfEntry entry in file.AllEntries)
|
||||
{
|
||||
//try
|
||||
{
|
||||
if (entry.NameLower.EndsWith(".yft"))
|
||||
{
|
||||
UpdateStatus(string.Format(entry.Path));
|
||||
YftFile yft = null;
|
||||
try
|
||||
{
|
||||
yft = RpfMan.GetFile<YftFile>(entry);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
UpdateStatus("Error! " + ex.ToString());
|
||||
errorfiles.Add(entry);
|
||||
}
|
||||
if ((yft != null) && (yft.Fragment != null))
|
||||
{
|
||||
var fentry = entry as RpfFileEntry;
|
||||
if (fentry == null)
|
||||
{ continue; } //shouldn't happen
|
||||
|
||||
var bytes = yft.Save();
|
||||
|
||||
|
||||
string origlen = TextUtil.GetBytesReadable(fentry.FileSize);
|
||||
string bytelen = TextUtil.GetBytesReadable(bytes.Length);
|
||||
|
||||
var yft2 = new YftFile();
|
||||
RpfFile.LoadResourceFile(yft2, bytes, 162);
|
||||
|
||||
if (yft2.Fragment == null)
|
||||
{ continue; }
|
||||
if (yft2.Fragment.Drawable?.AllModels?.Length != yft.Fragment.Drawable?.AllModels?.Length)
|
||||
{ continue; }
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
//catch (Exception ex)
|
||||
//{
|
||||
// UpdateStatus("Error! " + ex.ToString());
|
||||
//}
|
||||
}
|
||||
}
|
||||
if (errorfiles.Count > 0)
|
||||
{ }
|
||||
}
|
||||
public void TestYmaps()
|
||||
{
|
||||
foreach (RpfFile file in AllRpfs)
|
||||
|
@ -102,8 +102,6 @@ namespace CodeWalker.GameFiles
|
||||
public uint Unknown_108h { get; set; } // 0x00000000
|
||||
public uint Unknown_10Ch { get; set; } // 0x00000000
|
||||
public ResourceSimpleList64_s<LightAttributes_s> LightAttributes { get; set; }
|
||||
//public ResourceSimpleList64Ptr LightAttributesPtr { get; set; }
|
||||
//public LightAttributes_s[] LightAttributes { get; set; }
|
||||
public ulong Unknown_120h_Pointer { get; set; }
|
||||
public uint Unknown_128h { get; set; } // 0x00000000
|
||||
public uint Unknown_12Ch { get; set; } // 0x00000000
|
||||
@ -119,6 +117,9 @@ namespace CodeWalker.GameFiles
|
||||
public FragDrawable Drawable2 { get; set; }
|
||||
public FragUnknown_F_003 Unknown_120h_Data { get; set; }
|
||||
|
||||
|
||||
private string_r NameBlock = null; //only used for saving
|
||||
|
||||
/// <summary>
|
||||
/// Reads the data-block from a stream.
|
||||
/// </summary>
|
||||
@ -275,7 +276,7 @@ namespace CodeWalker.GameFiles
|
||||
this.Unknown_28h_Pointer = (ulong)(this.Unknown_28h_Data != null ? this.Unknown_28h_Data.FilePosition : 0);
|
||||
this.Unknown_30h_Pointer = (ulong)(this.Unknown_30h_Data != null ? this.Unknown_30h_Data.FilePosition : 0);
|
||||
this.Count0 = (uint)(this.Unknown_28h_Data != null ? this.Unknown_28h_Data.Count : 0);
|
||||
////this.NamePointer = (ulong)(this.Name != null ? this.Name.Position : 0); //TODO: fix!!!
|
||||
this.NamePointer = (ulong)(this.NameBlock != null ? this.NameBlock.FilePosition : 0);
|
||||
this.Unknown_A8h_Pointer = (ulong)(this.Unknown_A8h_Data != null ? this.Unknown_A8h_Data.FilePosition : 0);
|
||||
this.Count3 = (byte)(this.Unknown_E0h_Data != null ? this.Unknown_E0h_Data.Count : 0);
|
||||
this.Unknown_E0h_Pointer = (ulong)(this.Unknown_E0h_Data != null ? this.Unknown_E0h_Data.FilePosition : 0);
|
||||
@ -354,7 +355,11 @@ namespace CodeWalker.GameFiles
|
||||
if (Drawable != null) list.Add(Drawable);
|
||||
if (Unknown_28h_Data != null) list.Add(Unknown_28h_Data);
|
||||
if (Unknown_30h_Data != null) list.Add(Unknown_30h_Data);
|
||||
//if (Name != null) list.Add(Name); //TODO: fix!
|
||||
if (Name != null)
|
||||
{
|
||||
NameBlock = (string_r)Name;
|
||||
list.Add(NameBlock);
|
||||
}
|
||||
if (Unknown_A8h_Data != null) list.Add(Unknown_A8h_Data);
|
||||
if (Unknown_E0h_Data != null) list.Add(Unknown_E0h_Data);
|
||||
if (PhysicsLODGroup != null) list.Add(PhysicsLODGroup);
|
||||
@ -401,9 +406,9 @@ namespace CodeWalker.GameFiles
|
||||
public uint Unknown_54h { get; set; } // 0x00000000
|
||||
public uint Unknown_58h { get; set; } // 0x00000000
|
||||
public uint Unknown_5Ch { get; set; } // 0x00000000
|
||||
public ulong pxxxxx_2 { get; set; }
|
||||
public ushort cntxx51a { get; set; }
|
||||
public ushort cntxx51b { get; set; }
|
||||
public ulong UnknownPointer { get; set; }
|
||||
public ushort UnknownCount1 { get; set; }
|
||||
public ushort UnknownCount2 { get; set; }
|
||||
public uint Unknown_6Ch { get; set; } // 0x00000000
|
||||
public uint Unknown_70h { get; set; } // 0x00000000
|
||||
public uint Unknown_74h { get; set; } // 0x00000000
|
||||
@ -414,7 +419,12 @@ namespace CodeWalker.GameFiles
|
||||
public FragClothInstanceTuning InstanceTuning { get; set; }
|
||||
public FragDrawable Drawable { get; set; }
|
||||
public FragClothController Controller { get; set; }
|
||||
public uint[] pxxxxx_2data { get; set; }
|
||||
public uint[] UnknownData { get; set; }
|
||||
|
||||
|
||||
|
||||
private ResourceSystemStructBlock<uint> UnknownDataBlock = null;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Reads the data-block from a stream.
|
||||
@ -443,9 +453,9 @@ namespace CodeWalker.GameFiles
|
||||
this.Unknown_54h = reader.ReadUInt32();
|
||||
this.Unknown_58h = reader.ReadUInt32();
|
||||
this.Unknown_5Ch = reader.ReadUInt32();
|
||||
this.pxxxxx_2 = reader.ReadUInt64();
|
||||
this.cntxx51a = reader.ReadUInt16();
|
||||
this.cntxx51b = reader.ReadUInt16();
|
||||
this.UnknownPointer = reader.ReadUInt64();
|
||||
this.UnknownCount1 = reader.ReadUInt16();
|
||||
this.UnknownCount2 = reader.ReadUInt16();
|
||||
this.Unknown_6Ch = reader.ReadUInt32();
|
||||
this.Unknown_70h = reader.ReadUInt32();
|
||||
this.Unknown_74h = reader.ReadUInt32();
|
||||
@ -467,11 +477,7 @@ namespace CodeWalker.GameFiles
|
||||
this.Controller = reader.ReadBlockAt<FragClothController>(
|
||||
this.ControllerPointer // offset
|
||||
);
|
||||
//this.pxxxxx_2data = reader.ReadBlockAt<ResourceSimpleArray<uint_r>>(
|
||||
// this.pxxxxx_2, // offset
|
||||
// this.cntxx51a
|
||||
//);
|
||||
this.pxxxxx_2data = reader.ReadUintsAt(this.pxxxxx_2, this.cntxx51a);
|
||||
this.UnknownData = reader.ReadUintsAt(this.UnknownPointer, this.UnknownCount1);
|
||||
|
||||
}
|
||||
|
||||
@ -484,8 +490,9 @@ namespace CodeWalker.GameFiles
|
||||
this.InstanceTuningPointer = (ulong)(this.InstanceTuning != null ? this.InstanceTuning.FilePosition : 0);
|
||||
this.DrawablePointer = (ulong)(this.Drawable != null ? this.Drawable.FilePosition : 0);
|
||||
this.ControllerPointer = (ulong)(this.Controller != null ? this.Controller.FilePosition : 0);
|
||||
//this.pxxxxx_2 = (ulong)(this.pxxxxx_2data != null ? this.pxxxxx_2data.Position : 0); //TODO: fix
|
||||
//this.cntxx51a = (ushort)(this.pxxxxx_2data != null ? this.pxxxxx_2data.Count : 0);
|
||||
this.UnknownPointer = (ulong)(this.UnknownDataBlock != null ? this.UnknownDataBlock.FilePosition : 0);
|
||||
this.UnknownCount1 = (ushort)(this.UnknownDataBlock != null ? this.UnknownDataBlock.ItemCount : 0);
|
||||
this.UnknownCount2 = this.UnknownCount1;
|
||||
|
||||
// write structure data
|
||||
writer.Write(this.VFT);
|
||||
@ -509,9 +516,9 @@ namespace CodeWalker.GameFiles
|
||||
writer.Write(this.Unknown_54h);
|
||||
writer.Write(this.Unknown_58h);
|
||||
writer.Write(this.Unknown_5Ch);
|
||||
writer.Write(this.pxxxxx_2);
|
||||
writer.Write(this.cntxx51a);
|
||||
writer.Write(this.cntxx51b);
|
||||
writer.Write(this.UnknownPointer);
|
||||
writer.Write(this.UnknownCount1);
|
||||
writer.Write(this.UnknownCount2);
|
||||
writer.Write(this.Unknown_6Ch);
|
||||
writer.Write(this.Unknown_70h);
|
||||
writer.Write(this.Unknown_74h);
|
||||
@ -528,7 +535,11 @@ namespace CodeWalker.GameFiles
|
||||
if (InstanceTuning != null) list.Add(InstanceTuning);
|
||||
if (Drawable != null) list.Add(Drawable);
|
||||
if (Controller != null) list.Add(Controller);
|
||||
//if (pxxxxx_2data != null) list.Add(pxxxxx_2data); //TODO: fix
|
||||
if (UnknownData != null)
|
||||
{
|
||||
UnknownDataBlock = new ResourceSystemStructBlock<uint>(UnknownData);
|
||||
list.Add(UnknownDataBlock);
|
||||
}
|
||||
return list.ToArray();
|
||||
}
|
||||
}
|
||||
@ -1714,9 +1725,7 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
// reference data
|
||||
public Bounds Bound { get; set; }
|
||||
//public ResourceSimpleArray<ulong_r> Unknown_F8h_Data { get; set; }
|
||||
public ulong[] Unknown_F8h_Data { get; set; }
|
||||
//public ResourceSimpleArray<Matrix4_r> Unknown_108h_Data { get; set; }
|
||||
public Matrix[] Unknown_108h_Data { get; set; }
|
||||
public string Name { get; set; }
|
||||
|
||||
@ -1724,6 +1733,11 @@ namespace CodeWalker.GameFiles
|
||||
public FragCloth OwnerFragmentCloth { get; set; }
|
||||
public FragPhysTypeChild OwnerFragmentPhys { get; set; }
|
||||
|
||||
|
||||
private ResourceSystemStructBlock<ulong> Unknown_F8h_DataBlock = null; //used for saving only
|
||||
private ResourceSystemStructBlock<Matrix> Unknown_108h_DataBlock = null;
|
||||
private string_r NameBlock = null;
|
||||
|
||||
/// <summary>
|
||||
/// Reads the data-block from a stream.
|
||||
/// </summary>
|
||||
@ -1762,18 +1776,8 @@ namespace CodeWalker.GameFiles
|
||||
this.Bound = reader.ReadBlockAt<Bounds>(
|
||||
this.BoundPointer // offset
|
||||
);
|
||||
//this.Unknown_F8h_Data = reader.ReadBlockAt<ResourceSimpleArray<ulong_r>>(
|
||||
// this.Unknown_F8h_Pointer, // offset
|
||||
// this.Count1
|
||||
//);
|
||||
this.Unknown_F8h_Data = reader.ReadUlongsAt(this.Unknown_0F8h_Pointer, this.Count1);
|
||||
|
||||
//this.Unknown_108h_Data = reader.ReadBlockAt<ResourceSimpleArray<Matrix4_r>>(
|
||||
// this.Unknown_108h_Pointer, // offset
|
||||
// this.Count2
|
||||
//);
|
||||
this.Unknown_108h_Data = reader.ReadStructsAt<Matrix>(this.Unknown_108h_Pointer, this.Count2);
|
||||
|
||||
this.Name = reader.ReadStringAt(//BlockAt<string_r>(
|
||||
this.NamePointer // offset
|
||||
);
|
||||
@ -1788,16 +1792,16 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
// update structure data
|
||||
this.BoundPointer = (ulong)(this.Bound != null ? this.Bound.FilePosition : 0);
|
||||
//this.Unknown_F8h_Pointer = (ulong)(this.Unknown_F8h_Data != null ? this.Unknown_F8h_Data.Position : 0); //TODO: fix
|
||||
//this.c1qqq = (ushort)(this.pxx2data != null ? this.pxx2data.Count : 0);
|
||||
//this.c2qqq = (ushort)(this.pxx3data != null ? this.pxx3data.Count : 0);
|
||||
//this.Unknown_108h_Pointer = (ulong)(this.Unknown_108h_Data != null ? this.Unknown_108h_Data.Position : 0);
|
||||
//this.NamePointer = (ulong)(this.Name != null ? this.Name.Position : 0); //TODO: fix
|
||||
this.Unknown_0F8h_Pointer = (ulong)(this.Unknown_F8h_DataBlock != null ? this.Unknown_F8h_DataBlock.FilePosition : 0);
|
||||
this.Count1 = (ushort)(this.Unknown_F8h_DataBlock != null ? this.Unknown_F8h_DataBlock.ItemCount : 0);
|
||||
this.Count2 = (ushort)(this.Unknown_108h_DataBlock != null ? this.Unknown_108h_DataBlock.ItemCount : 0);
|
||||
this.Unknown_108h_Pointer = (ulong)(this.Unknown_108h_DataBlock != null ? this.Unknown_108h_DataBlock.FilePosition : 0);
|
||||
this.NamePointer = (ulong)(this.NameBlock != null ? this.NameBlock.FilePosition : 0);
|
||||
|
||||
// write structure data
|
||||
writer.Write(this.Unknown_0A8h);
|
||||
writer.Write(this.Unknown_0ACh);
|
||||
//writer.WriteBlock(this.Unknown_0B0h); //TODO: fix!
|
||||
writer.Write(this.Unknown_0B0h);
|
||||
writer.Write(this.BoundPointer);
|
||||
writer.Write(this.Unknown_0F8h_Pointer);
|
||||
writer.Write(this.Count1);
|
||||
@ -1829,9 +1833,21 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
var list = new List<IResourceBlock>(base.GetReferences());
|
||||
if (Bound != null) list.Add(Bound);
|
||||
//if (Unknown_F8h_Data != null) list.Add(Unknown_F8h_Data); //TODO: fix
|
||||
//if (Unknown_108h_Data != null) list.Add(Unknown_108h_Data);
|
||||
//if (Name != null) list.Add(Name); //TODO: fix
|
||||
if (Unknown_F8h_Data != null)
|
||||
{
|
||||
Unknown_F8h_DataBlock = new ResourceSystemStructBlock<ulong>(Unknown_F8h_Data);
|
||||
list.Add(Unknown_F8h_DataBlock);
|
||||
}
|
||||
if (Unknown_108h_Data != null)
|
||||
{
|
||||
Unknown_108h_DataBlock = new ResourceSystemStructBlock<Matrix>(Unknown_108h_Data);
|
||||
list.Add(Unknown_108h_DataBlock);
|
||||
}
|
||||
if (Name != null)
|
||||
{
|
||||
NameBlock = (string_r)Name;
|
||||
list.Add(NameBlock);
|
||||
}
|
||||
return list.ToArray();
|
||||
}
|
||||
}
|
||||
@ -1840,7 +1856,7 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
public override long BlockLength
|
||||
{
|
||||
get { return 32 + Data.Length; }
|
||||
get { return 32 + ((Data?.Length ?? 0) * 48); }
|
||||
}
|
||||
|
||||
// structure data
|
||||
@ -1848,8 +1864,8 @@ namespace CodeWalker.GameFiles
|
||||
public uint Unknown_04h { get; set; } // 0x00000000
|
||||
public uint Unknown_08h { get; set; } // 0x00000000
|
||||
public uint Unknown_0Ch { get; set; } // 0x00000000
|
||||
public byte cnt1 { get; set; }
|
||||
public byte cnt2 { get; set; }
|
||||
public byte DataCount1 { get; set; }
|
||||
public byte DataCount2 { get; set; }
|
||||
public ushort Unknown_12h { get; set; }
|
||||
public uint Unknown_14h { get; set; } // 0x00000000
|
||||
public uint Unknown_18h { get; set; } // 0x00000000
|
||||
@ -1866,16 +1882,13 @@ namespace CodeWalker.GameFiles
|
||||
this.Unknown_04h = reader.ReadUInt32();
|
||||
this.Unknown_08h = reader.ReadUInt32();
|
||||
this.Unknown_0Ch = reader.ReadUInt32();
|
||||
this.cnt1 = reader.ReadByte();
|
||||
this.cnt2 = reader.ReadByte();
|
||||
this.DataCount1 = reader.ReadByte();
|
||||
this.DataCount2 = reader.ReadByte();
|
||||
this.Unknown_12h = reader.ReadUInt16();
|
||||
this.Unknown_14h = reader.ReadUInt32();
|
||||
this.Unknown_18h = reader.ReadUInt32();
|
||||
this.Unknown_1Ch = reader.ReadUInt32();
|
||||
//this.Data = reader.ReadBlock<ResourceSimpleArray<Matrix3_r>>(
|
||||
// cnt1
|
||||
// );
|
||||
this.Data = reader.ReadStructsAt<Matrix3_s>((ulong)reader.Position, cnt1);
|
||||
this.Data = reader.ReadStructs<Matrix3_s>(DataCount1);
|
||||
|
||||
}
|
||||
|
||||
@ -1889,21 +1902,15 @@ namespace CodeWalker.GameFiles
|
||||
writer.Write(this.Unknown_04h);
|
||||
writer.Write(this.Unknown_08h);
|
||||
writer.Write(this.Unknown_0Ch);
|
||||
writer.Write(this.cnt1);
|
||||
writer.Write(this.cnt2);
|
||||
writer.Write(this.DataCount1);
|
||||
writer.Write(this.DataCount2);
|
||||
writer.Write(this.Unknown_12h);
|
||||
writer.Write(this.Unknown_14h);
|
||||
writer.Write(this.Unknown_18h);
|
||||
writer.Write(this.Unknown_1Ch);
|
||||
//writer.WriteBlock(this.Data); //TODO: fix
|
||||
writer.WriteStructs(Data);
|
||||
}
|
||||
|
||||
public override Tuple<long, IResourceBlock>[] GetParts()
|
||||
{
|
||||
return new Tuple<long, IResourceBlock>[] {
|
||||
//new Tuple<long, IResourceBlock>(32, Data) //TODO: FIX
|
||||
};
|
||||
}
|
||||
}
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))] public class FragUnknown_F_006 : ResourceSystemBlock
|
||||
{
|
||||
@ -2018,15 +2025,14 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
public override long BlockLength
|
||||
{
|
||||
get { return 16 + Data.Length; }
|
||||
get { return 16 + (Data?.Length ?? 0); }
|
||||
}
|
||||
|
||||
// structure data
|
||||
public uint Unknown_0h { get; set; } // 0x56475748
|
||||
public uint Unknown_4h { get; set; }
|
||||
public uint cnt1 { get; set; }
|
||||
public uint TotalLength { get; set; }
|
||||
public uint Unknown_Ch { get; set; }
|
||||
//public ResourceSimpleArray<byte_r> Data { get; set; }
|
||||
public byte[] Data { get; set; }
|
||||
|
||||
/// <summary>
|
||||
@ -2037,13 +2043,9 @@ namespace CodeWalker.GameFiles
|
||||
// read structure data
|
||||
this.Unknown_0h = reader.ReadUInt32();
|
||||
this.Unknown_4h = reader.ReadUInt32();
|
||||
this.cnt1 = reader.ReadUInt32();
|
||||
this.TotalLength = reader.ReadUInt32();
|
||||
this.Unknown_Ch = reader.ReadUInt32();
|
||||
//this.Data = reader.ReadBlock<ResourceSimpleArray<byte_r>>(
|
||||
// cnt1 - 16
|
||||
// );
|
||||
this.Data = reader.ReadBytesAt((ulong)this.FilePosition, cnt1 - 16);
|
||||
|
||||
this.Data = reader.ReadBytes((int)TotalLength - 16);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -2051,20 +2053,16 @@ namespace CodeWalker.GameFiles
|
||||
/// </summary>
|
||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||
{
|
||||
TotalLength = (uint)(Data?.Length ?? 0) + 16;
|
||||
|
||||
// write structure data
|
||||
writer.Write(this.Unknown_0h);
|
||||
writer.Write(this.Unknown_4h);
|
||||
writer.Write(this.cnt1);
|
||||
writer.Write(this.TotalLength);
|
||||
writer.Write(this.Unknown_Ch);
|
||||
//writer.WriteBlock(this.Data); //TODO: FIX!!
|
||||
writer.Write(Data);
|
||||
}
|
||||
|
||||
public override Tuple<long, IResourceBlock>[] GetParts()
|
||||
{
|
||||
return new Tuple<long, IResourceBlock>[] {
|
||||
//new Tuple<long, IResourceBlock>(16, Data)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))] public class FragPhysicsLODGroup : ResourceSystemBlock
|
||||
@ -2220,6 +2218,13 @@ namespace CodeWalker.GameFiles
|
||||
public byte[] Unknown_110h_Data { get; set; }
|
||||
|
||||
|
||||
private ResourceSystemStructBlock<uint> Unknown_28h_DataBlock = null; //used only for saving
|
||||
private ResourceSystemStructBlock<Vector4> InertiaTensorsBlock = null;
|
||||
private ResourceSystemStructBlock<Vector4> Unknown_F8h_DataBlock = null;
|
||||
private ResourceSystemStructBlock<byte> Unknown_108h_DataBlock = null;
|
||||
private ResourceSystemStructBlock<byte> Unknown_110h_DataBlock = null;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Reads the data-block from a stream.
|
||||
/// </summary>
|
||||
@ -2273,10 +2278,6 @@ namespace CodeWalker.GameFiles
|
||||
this.ArticulatedBodyType = reader.ReadBlockAt<FragPhysArticulatedBodyType>(
|
||||
this.ArticulatedBodyTypePointer // offset
|
||||
);
|
||||
//this.Unknown_28h_Data = reader.ReadBlockAt<ResourceSimpleArray<uint_r>>(
|
||||
// this.Unknown_28h_Pointer, // offset
|
||||
// this.ChildrenCount
|
||||
//);
|
||||
this.Unknown_28h_Data = reader.ReadUintsAt(this.Unknown_28h_Pointer, this.ChildrenCount);
|
||||
|
||||
this.GroupNames = reader.ReadBlockAt<ResourcePointerArray64_s<FragPhysNameStruct_s>>(
|
||||
@ -2300,30 +2301,11 @@ namespace CodeWalker.GameFiles
|
||||
this.Bound = reader.ReadBlockAt<Bounds>(
|
||||
this.BoundPointer // offset
|
||||
);
|
||||
//this.Unknown_F0h_Data = reader.ReadBlockAt<ResourceSimpleArray<Vector4_r>>(
|
||||
// this.Unknown_F0h_Pointer, // offset
|
||||
// this.ChildrenCount
|
||||
//);
|
||||
//this.Unknown_F8h_Data = reader.ReadBlockAt<ResourceSimpleArray<Vector4_r>>(
|
||||
// this.Unknown_F8h_Pointer, // offset
|
||||
// this.ChildrenCount
|
||||
//);
|
||||
this.InertiaTensors = reader.ReadStructsAt<Vector4>(this.InertiaTensorsPointer, this.ChildrenCount);
|
||||
this.Unknown_F8h_Data = reader.ReadStructsAt<Vector4>(this.Unknown_F8h_Pointer, this.ChildrenCount);
|
||||
|
||||
|
||||
this.FragTransforms = reader.ReadBlockAt<FragPhysUnknown_F_002>(
|
||||
this.FragTransformsPointer // offset
|
||||
);
|
||||
//this.Unknown_108h_Data = reader.ReadBlockAt<ResourceSimpleArray<byte_r>>(
|
||||
// this.Unknown_108h_Pointer, // offset
|
||||
// this.Count1
|
||||
//);
|
||||
//this.Unknown_110h_Data = reader.ReadBlockAt<ResourceSimpleArray<byte_r>>(
|
||||
// this.Unknown_110h_Pointer, // offset
|
||||
// this.Count2
|
||||
//);
|
||||
|
||||
this.Unknown_108h_Data = reader.ReadBytesAt(this.Unknown_108h_Pointer, this.Count1);
|
||||
this.Unknown_110h_Data = reader.ReadBytesAt(this.Unknown_110h_Pointer, this.Count2);
|
||||
|
||||
@ -2356,23 +2338,24 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
// update structure data
|
||||
this.ArticulatedBodyTypePointer = (ulong)(this.ArticulatedBodyType != null ? this.ArticulatedBodyType.FilePosition : 0);
|
||||
//this.Unknown_28h_Pointer = (ulong)(this.Unknown_28h_Data != null ? this.Unknown_28h_Data.Position : 0); //TODO: fix
|
||||
this.Unknown_28h_Pointer = (ulong)(this.Unknown_28h_DataBlock != null ? this.Unknown_28h_DataBlock.FilePosition : 0);
|
||||
this.GroupNamesPointer = (ulong)(this.GroupNames != null ? this.GroupNames.FilePosition : 0);
|
||||
this.GroupsPointer = (ulong)(this.Groups != null ? this.Groups.FilePosition : 0);
|
||||
this.ChildrenPointer = (ulong)(this.Children != null ? this.Children.FilePosition : 0);
|
||||
this.Archetype1Pointer = (ulong)(this.Archetype1 != null ? this.Archetype1.FilePosition : 0);
|
||||
this.Archetype2Pointer = (ulong)(this.Archetype2 != null ? this.Archetype2.FilePosition : 0);
|
||||
this.BoundPointer = (ulong)(this.Bound != null ? this.Bound.FilePosition : 0);
|
||||
//this.Unknown_F0h_Pointer = (ulong)(this.Unknown_F0h_Data != null ? this.Unknown_F0h_Data.Position : 0);
|
||||
//this.Unknown_F8h_Pointer = (ulong)(this.Unknown_F8h_Data != null ? this.Unknown_F8h_Data.Position : 0);
|
||||
this.InertiaTensorsPointer = (ulong)(this.InertiaTensorsBlock != null ? this.InertiaTensorsBlock.FilePosition : 0);
|
||||
this.Unknown_F8h_Pointer = (ulong)(this.Unknown_F8h_DataBlock != null ? this.Unknown_F8h_DataBlock.FilePosition : 0);
|
||||
this.FragTransformsPointer = (ulong)(this.FragTransforms != null ? this.FragTransforms.FilePosition : 0);
|
||||
//this.Unknown_108h_Pointer = (ulong)(this.Unknown_108h_Data != null ? this.Unknown_108h_Data.Position : 0);
|
||||
//this.Unknown_110h_Pointer = (ulong)(this.Unknown_110h_Data != null ? this.Unknown_110h_Data.Position : 0);
|
||||
this.Unknown_108h_Pointer = (ulong)(this.Unknown_108h_DataBlock != null ? this.Unknown_108h_DataBlock.FilePosition : 0);
|
||||
this.Unknown_110h_Pointer = (ulong)(this.Unknown_110h_DataBlock != null ? this.Unknown_110h_DataBlock.FilePosition : 0);
|
||||
|
||||
this.Count1 = (byte)(this.Unknown_108h_DataBlock != null ? this.Unknown_108h_DataBlock.ItemCount : 0);
|
||||
this.Count2 = (byte)(this.Unknown_110h_DataBlock != null ? this.Unknown_110h_DataBlock.ItemCount : 0);
|
||||
this.GroupsCount = (byte)(this.Groups != null ? this.Groups.Count : 0);
|
||||
this.ChildrenCount = (byte)(this.Children != null ? this.Children.Count : 0);
|
||||
|
||||
//this.vvv1 = (byte)(this.pxxxxx_2data != null ? this.pxxxxx_2data.Count : 0);
|
||||
//this.vvv2 = (byte)(this.pxxxxx_3data != null ? this.pxxxxx_3data.Count : 0);
|
||||
//this.GroupsCount = (byte)(this.Groups != null ? this.Groups.Count : 0);
|
||||
//this.ChildrenCount = (byte)(this.p1data != null ? this.p1data.Count : 0);
|
||||
|
||||
// write structure data
|
||||
writer.Write(this.VFT);
|
||||
@ -2385,15 +2368,15 @@ namespace CodeWalker.GameFiles
|
||||
writer.Write(this.Unknown_1Ch);
|
||||
writer.Write(this.ArticulatedBodyTypePointer);
|
||||
writer.Write(this.Unknown_28h_Pointer);
|
||||
//writer.WriteBlock(this.Unknown_30h); //TODO: fix this!
|
||||
//writer.WriteBlock(this.Unknown_40h);
|
||||
//writer.WriteBlock(this.Unknown_50h);
|
||||
//writer.WriteBlock(this.Unknown_60h);
|
||||
//writer.WriteBlock(this.Unknown_70h);
|
||||
//writer.WriteBlock(this.Unknown_80h);
|
||||
//writer.WriteBlock(this.Unknown_90h);
|
||||
//writer.WriteBlock(this.Unknown_A0h);
|
||||
//writer.WriteBlock(this.Unknown_B0h);
|
||||
writer.Write(this.Unknown_30h);
|
||||
writer.Write(this.Unknown_40h);
|
||||
writer.Write(this.Unknown_50h);
|
||||
writer.Write(this.Unknown_60h);
|
||||
writer.Write(this.Unknown_70h);
|
||||
writer.Write(this.Unknown_80h);
|
||||
writer.Write(this.Unknown_90h);
|
||||
writer.Write(this.Unknown_A0h);
|
||||
writer.Write(this.Unknown_B0h);
|
||||
writer.Write(this.GroupNamesPointer);
|
||||
writer.Write(this.GroupsPointer);
|
||||
writer.Write(this.ChildrenPointer);
|
||||
@ -2426,17 +2409,37 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
var list = new List<IResourceBlock>();
|
||||
if (ArticulatedBodyType != null) list.Add(ArticulatedBodyType);
|
||||
//if (Unknown_28h_Data != null) list.Add(Unknown_28h_Data); //TODO: fix
|
||||
if (Unknown_28h_Data != null)
|
||||
{
|
||||
Unknown_28h_DataBlock = new ResourceSystemStructBlock<uint>(Unknown_28h_Data);
|
||||
list.Add(Unknown_28h_DataBlock);
|
||||
}
|
||||
if (Groups != null) list.Add(Groups);
|
||||
if (Children != null) list.Add(Children);
|
||||
if (Archetype1 != null) list.Add(Archetype1);
|
||||
if (Archetype2 != null) list.Add(Archetype2);
|
||||
if (Bound != null) list.Add(Bound);
|
||||
//if (Unknown_F0h_Data != null) list.Add(Unknown_F0h_Data);
|
||||
//if (Unknown_F8h_Data != null) list.Add(Unknown_F8h_Data);
|
||||
if (InertiaTensors != null)
|
||||
{
|
||||
InertiaTensorsBlock = new ResourceSystemStructBlock<Vector4>(InertiaTensors);
|
||||
list.Add(InertiaTensorsBlock);
|
||||
}
|
||||
if (Unknown_F8h_Data != null)
|
||||
{
|
||||
Unknown_F8h_DataBlock = new ResourceSystemStructBlock<Vector4>(Unknown_F8h_Data);
|
||||
list.Add(Unknown_F8h_DataBlock);
|
||||
}
|
||||
if (FragTransforms != null) list.Add(FragTransforms);
|
||||
//if (Unknown_108h_Data != null) list.Add(Unknown_108h_Data);
|
||||
//if (Unknown_110h_Data != null) list.Add(Unknown_110h_Data);
|
||||
if (Unknown_108h_Data != null)
|
||||
{
|
||||
Unknown_108h_DataBlock = new ResourceSystemStructBlock<byte>(Unknown_108h_Data);
|
||||
list.Add(Unknown_108h_DataBlock);
|
||||
}
|
||||
if (Unknown_110h_Data != null)
|
||||
{
|
||||
Unknown_110h_DataBlock = new ResourceSystemStructBlock<byte>(Unknown_110h_Data);
|
||||
list.Add(Unknown_110h_DataBlock);
|
||||
}
|
||||
if (GroupNames != null) list.Add(GroupNames);
|
||||
return list.ToArray();
|
||||
}
|
||||
@ -2481,8 +2484,8 @@ namespace CodeWalker.GameFiles
|
||||
public uint Unknown_70h { get; set; }
|
||||
public uint Unknown_74h { get; set; }
|
||||
public ulong JointTypesPointer { get; set; }
|
||||
public ulong p2 { get; set; }
|
||||
public byte c1 { get; set; }
|
||||
public ulong UnknownPointer { get; set; }
|
||||
public byte UnknownCount { get; set; }
|
||||
public byte JointTypesCount { get; set; }
|
||||
public ushort Unknown_8Ah { get; set; }
|
||||
public uint Unknown_8Ch { get; set; }
|
||||
@ -2497,7 +2500,12 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
// reference data
|
||||
public ResourcePointerArray64<FragPhysJointType> JointTypes { get; set; }
|
||||
public Vector4[] p2data { get; set; }
|
||||
public Vector4[] UnknownData { get; set; }
|
||||
|
||||
|
||||
|
||||
private ResourceSystemStructBlock<Vector4> UnknownDataBlock = null;//only used for saving
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Reads the data-block from a stream.
|
||||
@ -2536,8 +2544,8 @@ namespace CodeWalker.GameFiles
|
||||
this.Unknown_70h = reader.ReadUInt32();
|
||||
this.Unknown_74h = reader.ReadUInt32();
|
||||
this.JointTypesPointer = reader.ReadUInt64();
|
||||
this.p2 = reader.ReadUInt64();
|
||||
this.c1 = reader.ReadByte();
|
||||
this.UnknownPointer = reader.ReadUInt64();
|
||||
this.UnknownCount = reader.ReadByte();
|
||||
this.JointTypesCount = reader.ReadByte();
|
||||
this.Unknown_8Ah = reader.ReadUInt16();
|
||||
this.Unknown_8Ch = reader.ReadUInt32();
|
||||
@ -2555,11 +2563,7 @@ namespace CodeWalker.GameFiles
|
||||
this.JointTypesPointer, // offset
|
||||
this.JointTypesCount
|
||||
);
|
||||
//this.p2data = reader.ReadBlockAt<ResourceSimpleArray<Vector4_r>>(
|
||||
// this.p2, // offset
|
||||
// this.c1
|
||||
//);
|
||||
this.p2data = reader.ReadStructsAt<Vector4>(this.p2, this.c1);
|
||||
this.UnknownData = reader.ReadStructsAt<Vector4>(this.UnknownPointer, this.UnknownCount);
|
||||
|
||||
}
|
||||
|
||||
@ -2570,9 +2574,9 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
// update structure data
|
||||
this.JointTypesPointer = (ulong)(this.JointTypes != null ? this.JointTypes.FilePosition : 0);
|
||||
//this.p2 = (ulong)(this.p2data != null ? this.p2data.Position : 0); //TODO:fix
|
||||
////this.c1 = (byte)(this.p2data != null ? this.p2data.Count : 0);
|
||||
////this.c2 = (byte)(this.p1data != null ? this.p1data.Count : 0);
|
||||
this.UnknownPointer = (ulong)(this.UnknownDataBlock != null ? this.UnknownDataBlock.FilePosition : 0);
|
||||
this.UnknownCount = (byte)(this.UnknownDataBlock != null ? this.UnknownDataBlock.ItemCount : 0);
|
||||
this.JointTypesCount = (byte)(this.JointTypes != null ? this.JointTypes.Count : 0);
|
||||
|
||||
// write structure data
|
||||
writer.Write(this.VFT);
|
||||
@ -2606,8 +2610,8 @@ namespace CodeWalker.GameFiles
|
||||
writer.Write(this.Unknown_70h);
|
||||
writer.Write(this.Unknown_74h);
|
||||
writer.Write(this.JointTypesPointer);
|
||||
writer.Write(this.p2);
|
||||
writer.Write(this.c1);
|
||||
writer.Write(this.UnknownPointer);
|
||||
writer.Write(this.UnknownCount);
|
||||
writer.Write(this.JointTypesCount);
|
||||
writer.Write(this.Unknown_8Ah);
|
||||
writer.Write(this.Unknown_8Ch);
|
||||
@ -2628,7 +2632,11 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
var list = new List<IResourceBlock>();
|
||||
if (JointTypes != null) list.Add(JointTypes);
|
||||
//if (p2data != null) list.Add(p2data); //TODO: fix
|
||||
if (UnknownData != null)
|
||||
{
|
||||
UnknownDataBlock = new ResourceSystemStructBlock<Vector4>(UnknownData);
|
||||
list.Add(UnknownDataBlock);
|
||||
}
|
||||
return list.ToArray();
|
||||
}
|
||||
}
|
||||
@ -2743,8 +2751,8 @@ namespace CodeWalker.GameFiles
|
||||
public uint Unknown_9Ch { get; set; }
|
||||
public uint Unknown_A0h { get; set; }
|
||||
public uint Unknown_A4h { get; set; }
|
||||
public uint Unknown_A8h { get; set; } // 0x4CBEBC20
|
||||
public uint Unknown_ACh { get; set; } // 0xCCBEBC20
|
||||
public uint Unknown_A8h { get; set; } // 0x4CBEBC20 (float: 1.0E8)
|
||||
public uint Unknown_ACh { get; set; } // 0xCCBEBC20 (float:-1.0E8)
|
||||
|
||||
/// <summary>
|
||||
/// Reads the data-block from a stream.
|
||||
@ -3028,7 +3036,7 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
public override long BlockLength
|
||||
{
|
||||
get { return 32 + Data.Length; }
|
||||
get { return 32 + ((Data?.Length ?? 0) * 64); }
|
||||
}
|
||||
|
||||
// structure data
|
||||
@ -3036,11 +3044,10 @@ namespace CodeWalker.GameFiles
|
||||
public uint Unknown_04h { get; set; } // 0x00000001
|
||||
public uint Unknown_08h { get; set; } // 0x00000000
|
||||
public uint Unknown_0Ch { get; set; } // 0x00000000
|
||||
public uint cnt { get; set; }
|
||||
public uint DataCount { get; set; }
|
||||
public uint Unknown_14h { get; set; } // 0x00000000
|
||||
public uint Unknown_18h { get; set; } // 0x00000000
|
||||
public uint Unknown_1Ch { get; set; } // 0x00000000
|
||||
//public ResourceSimpleArray<Matrix4_r> Data { get; set; }
|
||||
public Matrix[] Data { get; set; }
|
||||
|
||||
/// <summary>
|
||||
@ -3053,14 +3060,11 @@ namespace CodeWalker.GameFiles
|
||||
this.Unknown_04h = reader.ReadUInt32();
|
||||
this.Unknown_08h = reader.ReadUInt32();
|
||||
this.Unknown_0Ch = reader.ReadUInt32();
|
||||
this.cnt = reader.ReadUInt32();
|
||||
this.DataCount = reader.ReadUInt32();
|
||||
this.Unknown_14h = reader.ReadUInt32();
|
||||
this.Unknown_18h = reader.ReadUInt32();
|
||||
this.Unknown_1Ch = reader.ReadUInt32();
|
||||
//this.Data = reader.ReadBlock<ResourceSimpleArray<Matrix4_r>>(
|
||||
// cnt
|
||||
// );
|
||||
this.Data = reader.ReadStructsAt<Matrix>((ulong)reader.Position, cnt);
|
||||
this.Data = reader.ReadStructsAt<Matrix>((ulong)reader.Position, DataCount);
|
||||
|
||||
}
|
||||
|
||||
@ -3069,24 +3073,20 @@ namespace CodeWalker.GameFiles
|
||||
/// </summary>
|
||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||
{
|
||||
DataCount = (uint)(Data?.Length ?? 0);
|
||||
|
||||
// write structure data
|
||||
writer.Write(this.VFT);
|
||||
writer.Write(this.Unknown_04h);
|
||||
writer.Write(this.Unknown_08h);
|
||||
writer.Write(this.Unknown_0Ch);
|
||||
writer.Write(this.cnt);
|
||||
writer.Write(this.DataCount);
|
||||
writer.Write(this.Unknown_14h);
|
||||
writer.Write(this.Unknown_18h);
|
||||
writer.Write(this.Unknown_1Ch);
|
||||
//writer.WriteBlock(this.Data); //TODO: fix
|
||||
writer.WriteStructs(Data);
|
||||
}
|
||||
|
||||
public override Tuple<long, IResourceBlock>[] GetParts()
|
||||
{
|
||||
return new Tuple<long, IResourceBlock>[] {
|
||||
//new Tuple<long, IResourceBlock>(32, Data) //TODO: fix
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))] public class FragPhysArchetype : ResourceSystemBlock
|
||||
@ -3132,6 +3132,10 @@ namespace CodeWalker.GameFiles
|
||||
public string Name { get; set; }
|
||||
public Bounds Bound { get; set; }
|
||||
|
||||
|
||||
private string_r NameBlock = null;//used only when saving
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Reads the data-block from a stream.
|
||||
/// </summary>
|
||||
@ -3184,7 +3188,7 @@ namespace CodeWalker.GameFiles
|
||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||
{
|
||||
// update structure data
|
||||
//this.NamePointer = (ulong)(this.Name != null ? this.Name.Position : 0); //TODO:fix
|
||||
this.NamePointer = (ulong)(this.NameBlock != null ? this.NameBlock.FilePosition : 0);
|
||||
this.BoundPointer = (ulong)(this.Bound != null ? this.Bound.FilePosition : 0);
|
||||
|
||||
// write structure data
|
||||
@ -3210,14 +3214,14 @@ namespace CodeWalker.GameFiles
|
||||
writer.Write(this.Unknown_54h);
|
||||
writer.Write(this.Unknown_58h);
|
||||
writer.Write(this.Unknown_5Ch);
|
||||
//writer.WriteBlock(this.Unknown_60h); //TODO: fix!
|
||||
//writer.WriteBlock(this.Unknown_70h);
|
||||
//writer.WriteBlock(this.Unknown_80h);
|
||||
//writer.WriteBlock(this.Unknown_90h);
|
||||
//writer.WriteBlock(this.Unknown_A0h);
|
||||
//writer.WriteBlock(this.Unknown_B0h);
|
||||
//writer.WriteBlock(this.Unknown_C0h);
|
||||
//writer.WriteBlock(this.Unknown_D0h);
|
||||
writer.Write(this.Unknown_60h);
|
||||
writer.Write(this.Unknown_70h);
|
||||
writer.Write(this.Unknown_80h);
|
||||
writer.Write(this.Unknown_90h);
|
||||
writer.Write(this.Unknown_A0h);
|
||||
writer.Write(this.Unknown_B0h);
|
||||
writer.Write(this.Unknown_C0h);
|
||||
writer.Write(this.Unknown_D0h);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -3226,7 +3230,11 @@ namespace CodeWalker.GameFiles
|
||||
public override IResourceBlock[] GetReferences()
|
||||
{
|
||||
var list = new List<IResourceBlock>();
|
||||
//if (Name != null) list.Add(Name); //TODO: fix!
|
||||
if (Name != null)
|
||||
{
|
||||
NameBlock = (string_r)Name;
|
||||
list.Add(NameBlock);
|
||||
}
|
||||
if (Bound != null) list.Add(Bound);
|
||||
return list.ToArray();
|
||||
}
|
||||
@ -3586,11 +3594,9 @@ namespace CodeWalker.GameFiles
|
||||
public byte Unknown_4Chb { get; set; }
|
||||
public byte Unknown_4Chc { get; set; }
|
||||
public byte Unknown_4Chd { get; set; }
|
||||
//public uint Unknown_4Ch { get; set; }
|
||||
public byte Unknown_50ha { get; set; }
|
||||
public byte Unknown_50hb { get; set; }//0xFF
|
||||
public ushort Unknown_50hc { get; set; }//0
|
||||
//public uint Unknown_50h { get; set; }
|
||||
public float Unknown_54h { get; set; }
|
||||
public float Unknown_58h { get; set; }
|
||||
public float Unknown_5Ch { get; set; }
|
||||
|
@ -513,7 +513,14 @@ namespace CodeWalker.GameFiles
|
||||
Marshal.FreeHGlobal(ptr);
|
||||
Write(arr);
|
||||
}
|
||||
|
||||
public void WriteStructs<T>(T[] val) where T : struct
|
||||
{
|
||||
if (val == null) return;
|
||||
foreach (var v in val)
|
||||
{
|
||||
WriteStruct(v);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user