From 4cc780a46173e38c87180be3ea04fe1e44117b6c Mon Sep 17 00:00:00 2001 From: dexy Date: Tue, 5 Nov 2019 20:47:10 +1100 Subject: [PATCH] New MetaNames, Fragments glass windows progress, Renaming some things in Skeleton and Bone --- .../GameFiles/FileTypes/YftFile.cs | 19 +- CodeWalker.Core/GameFiles/GameFileCache.cs | 4 +- .../GameFiles/MetaTypes/MetaNames.cs | 11 +- .../GameFiles/MetaTypes/MetaTypes.cs | 94 +-- .../GameFiles/MetaTypes/PsoTypes.cs | 30 +- .../GameFiles/Resources/Drawable.cs | 105 +-- CodeWalker.Core/GameFiles/Resources/Frag.cs | 683 ++++++++++++------ CodeWalker.Core/World/Scenarios.cs | 2 +- Project/Panels/EditScenarioNodePanel.cs | 50 +- Project/Panels/GenerateLODLightsPanel.cs | 2 +- Project/ProjectForm.cs | 14 +- Rendering/Renderable.cs | 12 +- 12 files changed, 647 insertions(+), 379 deletions(-) diff --git a/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs index aad79f2..d5ed914 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.IO; using System.Linq; using System.Text; @@ -7,6 +8,7 @@ using System.Threading.Tasks; namespace CodeWalker.GameFiles { + [TypeConverter(typeof(ExpandableObjectConverter))] public class YftFile : GameFile, PackedFile { public FragType Fragment { get; set; } @@ -33,13 +35,18 @@ namespace CodeWalker.GameFiles Fragment = rd.ReadBlock(); - if (Fragment.Drawable != null) + if (Fragment != null) { - Fragment.Drawable.Owner = this; - } - if (Fragment.Drawable2 != null) - { - Fragment.Drawable2.Owner = this; + Fragment.Yft = this; + + if (Fragment.Drawable != null) + { + Fragment.Drawable.Owner = this; + } + if (Fragment.Drawable2 != null) + { + Fragment.Drawable2.Owner = this; + } } Loaded = true; diff --git a/CodeWalker.Core/GameFiles/GameFileCache.cs b/CodeWalker.Core/GameFiles/GameFileCache.cs index c6b296e..5051392 100644 --- a/CodeWalker.Core/GameFiles/GameFileCache.cs +++ b/CodeWalker.Core/GameFiles/GameFileCache.cs @@ -3536,9 +3536,9 @@ namespace CodeWalker.GameFiles } } } - if ((yft.Fragment.Unknown_28h_Data != null) && (yft.Fragment.Unknown_28h_Data.data_items != null)) + if ((yft.Fragment.DrawableArray != null) && (yft.Fragment.DrawableArray.data_items != null)) { - foreach (var drawable in yft.Fragment.Unknown_28h_Data.data_items) + foreach (var drawable in yft.Fragment.DrawableArray.data_items) { drawablecount++; foreach (var kvp in drawable.VertexDecls) diff --git a/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs b/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs index b8fc290..b68dd72 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs @@ -3464,11 +3464,14 @@ namespace CodeWalker.GameFiles FloatXYZ = 3805007828, + aPropMetaData = 3902803273, + ePedVarComp = 884254308, + ePropRenderFlags = 4212977111, + CPedPropTexData = 254518642, - - - - + CScenarioChainingEdge__eAction = 3609807418, + CScenarioChainingEdge__eNavMode = 3971773454, + CScenarioChainingEdge__eNavSpeed = 941086046, diff --git a/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs b/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs index 6ecd047..9c1c3f4 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs @@ -411,9 +411,9 @@ namespace CodeWalker.GameFiles return new MetaStructureInfo(MetaName.CScenarioChainingEdge, 2004985940, 256, 8, new MetaStructureEntryInfo_s(MetaName.NodeIndexFrom, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.NodeIndexTo, 2, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.Action, 4, MetaStructureEntryDataType.ByteEnum, 0, 0, (MetaName)3609807418), - new MetaStructureEntryInfo_s(MetaName.NavMode, 5, MetaStructureEntryDataType.ByteEnum, 0, 0, (MetaName)3971773454), - new MetaStructureEntryInfo_s(MetaName.NavSpeed, 6, MetaStructureEntryDataType.ByteEnum, 0, 0, (MetaName)941086046) + new MetaStructureEntryInfo_s(MetaName.Action, 4, MetaStructureEntryDataType.ByteEnum, 0, 0, MetaName.CScenarioChainingEdge__eAction), + new MetaStructureEntryInfo_s(MetaName.NavMode, 5, MetaStructureEntryDataType.ByteEnum, 0, 0, MetaName.CScenarioChainingEdge__eNavMode), + new MetaStructureEntryInfo_s(MetaName.NavSpeed, 6, MetaStructureEntryDataType.ByteEnum, 0, 0, MetaName.CScenarioChainingEdge__eNavSpeed) ); case MetaName.CScenarioChain: return new MetaStructureInfo(MetaName.CScenarioChain, 2751910366, 768, 40, @@ -1011,7 +1011,7 @@ namespace CodeWalker.GameFiles return new MetaStructureInfo(MetaName.CPedPropInfo, 1792487819, 768, 40, new MetaStructureEntryInfo_s((MetaName)2598445407, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedPropMetaData), - new MetaStructureEntryInfo_s((MetaName)3902803273, 8, MetaStructureEntryDataType.Array, 0, 1, 0), + new MetaStructureEntryInfo_s(MetaName.aPropMetaData, 8, MetaStructureEntryDataType.Array, 0, 1, 0), new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CAnchorProps), new MetaStructureEntryInfo_s(MetaName.aAnchors, 24, MetaStructureEntryDataType.Array, 0, 3, 0) ); @@ -1064,7 +1064,7 @@ namespace CodeWalker.GameFiles new MetaStructureEntryInfo_s(MetaName.flags, 28, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.inclusions, 32, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), new MetaStructureEntryInfo_s(MetaName.exclusions, 36, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), - new MetaStructureEntryInfo_s((MetaName)1613922652, 40, MetaStructureEntryDataType.ShortFlags, 0, 16, (MetaName)884254308), + new MetaStructureEntryInfo_s((MetaName)1613922652, 40, MetaStructureEntryDataType.ShortFlags, 0, 16, MetaName.ePedVarComp), new MetaStructureEntryInfo_s((MetaName)2114993291, 42, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)3509540765, 44, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)4196345791, 45, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0) @@ -1074,17 +1074,17 @@ namespace CodeWalker.GameFiles new MetaStructureEntryInfo_s(MetaName.audioId, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.expressionMods, 4, MetaStructureEntryDataType.ArrayOfBytes, 0, 1, (MetaName)5), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)254518642), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedPropTexData), new MetaStructureEntryInfo_s(MetaName.texData, 24, MetaStructureEntryDataType.Array, 0, 3, 0), - new MetaStructureEntryInfo_s(MetaName.renderFlags, 40, MetaStructureEntryDataType.IntFlags1, 0, 3, (MetaName)4212977111), + new MetaStructureEntryInfo_s(MetaName.renderFlags, 40, MetaStructureEntryDataType.IntFlags1, 0, 3, MetaName.ePropRenderFlags), new MetaStructureEntryInfo_s(MetaName.propFlags, 44, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.flags, 48, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.anchorId, 50, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.propId, 51, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)2894625425, 52, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0) ); - case (MetaName)254518642: - return new MetaStructureInfo((MetaName)254518642, 2767296137, 512, 12, + case MetaName.CPedPropTexData: + return new MetaStructureInfo(MetaName.CPedPropTexData, 2767296137, 512, 12, new MetaStructureEntryInfo_s(MetaName.inclusions, 0, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), new MetaStructureEntryInfo_s(MetaName.exclusions, 4, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), new MetaStructureEntryInfo_s(MetaName.texId, 8, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), @@ -1285,20 +1285,20 @@ namespace CodeWalker.GameFiles new MetaEnumEntryInfo_s(MetaName.kOnlySp, 1), new MetaEnumEntryInfo_s(MetaName.kOnlyMp, 2) ); - case (MetaName)3609807418: - return new MetaEnumInfo((MetaName)3609807418, 3326075799, + case MetaName.CScenarioChainingEdge__eAction: + return new MetaEnumInfo(MetaName.CScenarioChainingEdge__eAction, 3326075799, new MetaEnumEntryInfo_s(MetaName.Move, 0), new MetaEnumEntryInfo_s((MetaName)7865678, 1), new MetaEnumEntryInfo_s(MetaName.MoveFollowMaster, 2) ); - case (MetaName)3971773454: - return new MetaEnumInfo((MetaName)3971773454, 3016128742, + case MetaName.CScenarioChainingEdge__eNavMode: + return new MetaEnumInfo(MetaName.CScenarioChainingEdge__eNavMode, 3016128742, new MetaEnumEntryInfo_s(MetaName.Direct, 0), new MetaEnumEntryInfo_s(MetaName.NavMesh, 1), new MetaEnumEntryInfo_s(MetaName.Roads, 2) ); - case (MetaName)941086046: - return new MetaEnumInfo((MetaName)941086046, 1112851290, + case MetaName.CScenarioChainingEdge__eNavSpeed: + return new MetaEnumInfo(MetaName.CScenarioChainingEdge__eNavSpeed, 1112851290, new MetaEnumEntryInfo_s((MetaName)3279574318, 0), new MetaEnumEntryInfo_s((MetaName)2212923970, 1), new MetaEnumEntryInfo_s((MetaName)4022799658, 2), @@ -1363,8 +1363,8 @@ namespace CodeWalker.GameFiles new MetaEnumEntryInfo_s((MetaName)665241531, 0), new MetaEnumEntryInfo_s((MetaName)462992848, 1) ); - case (MetaName)884254308: - return new MetaEnumInfo((MetaName)884254308, 3472084374, + case MetaName.ePedVarComp: + return new MetaEnumInfo(MetaName.ePedVarComp, 3472084374, new MetaEnumEntryInfo_s(MetaName.PV_COMP_INVALID, -1), new MetaEnumEntryInfo_s(MetaName.PV_COMP_HEAD, 0), new MetaEnumEntryInfo_s(MetaName.PV_COMP_BERD, 1), @@ -1380,8 +1380,8 @@ namespace CodeWalker.GameFiles new MetaEnumEntryInfo_s(MetaName.PV_COMP_JBIB, 11), new MetaEnumEntryInfo_s(MetaName.PV_COMP_MAX, 12) ); - case (MetaName)4212977111: - return new MetaEnumInfo((MetaName)4212977111, 1551913633, + case MetaName.ePropRenderFlags: + return new MetaEnumInfo(MetaName.ePropRenderFlags, 1551913633, new MetaEnumEntryInfo_s((MetaName)3757767268, 0), new MetaEnumEntryInfo_s((MetaName)3735238938, 1), new MetaEnumEntryInfo_s((MetaName)3395845123, 2) @@ -2141,7 +2141,7 @@ namespace CodeWalker.GameFiles kOnlyMp = 2, } - public enum Unk_3609807418 //SCENARIO (Path) Edge Action + public enum CScenarioChainingEdge__eAction //SCENARIO (Path) Edge Action : byte //Key:3326075799 { Move = 0, @@ -2149,7 +2149,7 @@ namespace CodeWalker.GameFiles MoveFollowMaster = 2, } - public enum Unk_3971773454 //SCENARIO (Path) Edge nav mode + public enum CScenarioChainingEdge__eNavMode //SCENARIO (Path) Edge nav mode : byte //Key:3016128742 { Direct = 0, @@ -2157,7 +2157,7 @@ namespace CodeWalker.GameFiles Roads = 2, } - public enum Unk_941086046 //SCENARIO (Path) Edge nav speed + public enum CScenarioChainingEdge__eNavSpeed //SCENARIO (Path) Edge nav speed : byte //Key:1112851290 { Unk_00_3279574318 = 0, @@ -2237,7 +2237,7 @@ namespace CodeWalker.GameFiles Unk_462992848 = 1, } - public enum Unk_884254308 //component peds CComponentInfo ped accessory / variations slot + public enum ePedVarComp //component peds CComponentInfo ped accessory / variations slot : short //Key:3472084374 { PV_COMP_INVALID = -1, @@ -2256,7 +2256,7 @@ namespace CodeWalker.GameFiles PV_COMP_MAX = 2048,//12, } - public enum Unk_4212977111 //component peds CPedPropMetaData renderFlags + public enum ePropRenderFlags //component peds CPedPropMetaData renderFlags : int //Key:1551913633 { Unk_3757767268 = 0, @@ -4300,9 +4300,9 @@ namespace CodeWalker.GameFiles if (edges != null) { mb.AddStructureInfo(MetaName.CScenarioChainingEdge); - mb.AddEnumInfo((MetaName)3609807418); - mb.AddEnumInfo((MetaName)3971773454); - mb.AddEnumInfo((MetaName)941086046); + mb.AddEnumInfo(MetaName.CScenarioChainingEdge__eAction); + mb.AddEnumInfo(MetaName.CScenarioChainingEdge__eNavMode); + mb.AddEnumInfo(MetaName.CScenarioChainingEdge__eNavSpeed); pd.Edges = mb.AddItemArrayPtr(MetaName.CScenarioChainingEdge, edges); } if (Paths.Chains != null) @@ -5380,9 +5380,9 @@ namespace CodeWalker.GameFiles { public ushort NodeIndexFrom { get; set; } //0 0: UnsignedShort: 0: NodeIndexFrom//3236798246 public ushort NodeIndexTo { get; set; } //2 2: UnsignedShort: 0: NodeIndexTo//2851806039 - public Unk_3609807418 Action { get; set; } //4 4: ByteEnum: 3609807418: Action - public Unk_3971773454 NavMode { get; set; } //5 5: ByteEnum: 3971773454: NavMode//859022269 - public Unk_941086046 NavSpeed { get; set; } //6 6: ByteEnum: 941086046: NavSpeed//1419316113 + public CScenarioChainingEdge__eAction Action { get; set; } //4 4: ByteEnum: CScenarioChainingEdge__eAction: Action + public CScenarioChainingEdge__eNavMode NavMode { get; set; } //5 5: ByteEnum: CScenarioChainingEdge__eNavMode: NavMode + public CScenarioChainingEdge__eNavSpeed NavSpeed { get; set; } //6 6: ByteEnum: CScenarioChainingEdge__eNavSpeed: NavSpeed public byte Unused0 { get; set; }//7 public override string ToString() @@ -5401,9 +5401,9 @@ namespace CodeWalker.GameFiles public MCScenarioChainingNode NodeTo { get; set; } public ushort NodeIndexFrom { get { return _Data.NodeIndexFrom; } set { _Data.NodeIndexFrom = value; } } public ushort NodeIndexTo { get { return _Data.NodeIndexTo; } set { _Data.NodeIndexTo = value; } } - public Unk_3609807418 Action { get { return _Data.Action; } set { _Data.Action = value; } } - public Unk_3971773454 NavMode { get { return _Data.NavMode; } set { _Data.NavMode = value; } } - public Unk_941086046 NavSpeed { get { return _Data.NavSpeed; } set { _Data.NavSpeed = value; } } + public CScenarioChainingEdge__eAction Action { get { return _Data.Action; } set { _Data.Action = value; } } + public CScenarioChainingEdge__eNavMode NavMode { get { return _Data.NavMode; } set { _Data.NavMode = value; } } + public CScenarioChainingEdge__eNavSpeed NavSpeed { get { return _Data.NavSpeed; } set { _Data.NavSpeed = value; } } public int EdgeIndex { get; set; } @@ -6067,7 +6067,7 @@ namespace CodeWalker.GameFiles public uint flags { get; set; } //28 28: UnsignedInt: 0: flags public int inclusions { get; set; } //32 32: IntFlags2: 0: inclusions//2172318933 public int exclusions { get; set; } //36 36: IntFlags2: 0: exclusions - public Unk_884254308 Unk_1613922652 { get; set; } //40 40: ShortFlags: 884254308: 1613922652 + public ePedVarComp Unk_1613922652 { get; set; } //40 40: ShortFlags: ePedVarComp: 1613922652 public ushort Unk_2114993291 { get; set; } //42 42: UnsignedShort: 0: 2114993291 public byte Unk_3509540765 { get; set; } //44 44: UnsignedByte: 0: 3509540765 public byte Unk_4196345791 { get; set; } //45 45: UnsignedByte: 0: 4196345791 @@ -6080,11 +6080,11 @@ namespace CodeWalker.GameFiles public byte Unused0 { get; set; }//1 public ushort Unused1 { get; set; }//2 public uint Unused2 { get; set; }//4 - public Array_Structure Unk_3902803273 { get; set; } //8 8: Array: 0: 3902803273 {0: Structure: 94549140: 256} - public Array_Structure aAnchors { get; set; } //24 24: Array: 0: aAnchors//162345210 {0: Structure: CAnchorProps//2170383875: 256} + public Array_Structure aPropMetaData { get; set; } //8 8: Array: 0: aPropMetaData {0: Structure: CPedPropMetaData: 256} + public Array_Structure aAnchors { get; set; } //24 24: Array: 0: aAnchors {0: Structure: CAnchorProps: 256} } - public struct CPedPropMetaData //56 bytes, Key:2029738350 //COMPONENT PEDS unknown + public struct CPedPropMetaData //56 bytes, Key:2029738350 //COMPONENT PEDS prop metadata { public MetaHash audioId { get; set; } //0 0: Hash: 0: audioId public ArrayOfBytes5 expressionMods { get; set; } //4 4: ArrayOfBytes: 5: expressionMods//942761829 @@ -6093,25 +6093,25 @@ namespace CodeWalker.GameFiles public uint Unused2 { get; set; }//12 public uint Unused3 { get; set; }//16 public uint Unused4 { get; set; }//20 - public Array_Structure texData { get; set; } //24 24: Array: 0: texData//4088935562 {0: Structure: 254518642: 256} - public Unk_4212977111 renderFlags { get; set; } //40 40: IntFlags1: 4212977111: renderFlags//4239582912 - public uint propFlags { get; set; } //44 44: UnsignedInt: 0: propFlags//1066841901 + public Array_Structure texData { get; set; } //24 24: Array: 0: texData {0: Structure: CPedPropTexData: 256} + public ePropRenderFlags renderFlags { get; set; } //40 40: IntFlags1: ePropRenderFlags: renderFlags + public uint propFlags { get; set; } //44 44: UnsignedInt: 0: propFlags public ushort flags { get; set; } //48 48: UnsignedShort: 0: flags - public byte anchorId { get; set; } //50 50: UnsignedByte: 0: anchorId//2731224028 - public byte propId { get; set; } //51 51: UnsignedByte: 0: propId//3817142252 + public byte anchorId { get; set; } //50 50: UnsignedByte: 0: anchorId + public byte propId { get; set; } //51 51: UnsignedByte: 0: propId public byte Unk_2894625425 { get; set; } //52 52: UnsignedByte: 0: 2894625425 public byte Unused5 { get; set; }//53 public ushort Unused6 { get; set; }//54 } - public struct Unk_254518642 //12 bytes, Key:2767296137 //COMPONENT PEDS (expression?) texData + public struct CPedPropTexData //12 bytes, Key:2767296137 //COMPONENT PEDS prop texData { - public int inclusions { get; set; } //0 0: IntFlags2: 0: inclusions//2172318933 + public int inclusions { get; set; } //0 0: IntFlags2: 0: inclusions public int exclusions { get; set; } //4 4: IntFlags2: 0: exclusions public byte texId { get; set; } //8 8: UnsignedByte: 0: texId - public byte inclusionId { get; set; } //9 9: UnsignedByte: 0: inclusionId//1938349561 - public byte exclusionId { get; set; } //10 10: UnsignedByte: 0: exclusionId//3819522186 - public byte distribution { get; set; } //11 11: UnsignedByte: 0: distribution//914976023 + public byte inclusionId { get; set; } //9 9: UnsignedByte: 0: inclusionId + public byte exclusionId { get; set; } //10 10: UnsignedByte: 0: exclusionId + public byte distribution { get; set; } //11 11: UnsignedByte: 0: distribution } public struct CAnchorProps //24 bytes, Key:403574180 //COMPONENT PEDS CAnchorProps diff --git a/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs index 773f9e5..ba432f3 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs @@ -9023,13 +9023,13 @@ namespace CodeWalker.GameFiles ); case (MetaName)2354064210: return new PsoStructureInfo((MetaName)2354064210, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, (MetaName)884254308), + new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), new PsoStructureEntryInfo(MetaName.DrawableId, PsoDataType.UInt, 12, 0, 0), new PsoStructureEntryInfo(MetaName.DrawableAltId, PsoDataType.UInt, 16, 0, 0) ); case (MetaName)2469984956: return new PsoStructureInfo((MetaName)2469984956, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, (MetaName)884254308), + new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), new PsoStructureEntryInfo(MetaName.DrawableIds, PsoDataType.Array, 16, 0, (MetaName)1) ); @@ -9697,14 +9697,14 @@ namespace CodeWalker.GameFiles ); case (MetaName)3901274641: return new PsoStructureInfo((MetaName)3901274641, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, (MetaName)884254308), + new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), new PsoStructureEntryInfo(MetaName.DrawableId, PsoDataType.UInt, 12, 0, 0), new PsoStructureEntryInfo(MetaName.DrawableAltId, PsoDataType.UInt, 16, 0, 0), new PsoStructureEntryInfo(MetaName.TexId, PsoDataType.UInt, 20, 0, 0) ); case (MetaName)3788247444: return new PsoStructureInfo((MetaName)3788247444, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, (MetaName)884254308), + new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), new PsoStructureEntryInfo(MetaName.DrawableIds, PsoDataType.Array, 16, 0, (MetaName)1) ); @@ -13062,7 +13062,7 @@ namespace CodeWalker.GameFiles ); case (MetaName)3553377863: return new PsoStructureInfo((MetaName)3553377863, 0, 0, 12, - new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 0, 0, (MetaName)884254308), + new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 0, 0, MetaName.ePedVarComp), new PsoStructureEntryInfo(MetaName.DrawableIndex, PsoDataType.SInt, 4, 0, 0), new PsoStructureEntryInfo(MetaName.Restriction, PsoDataType.Enum, 8, 0, (MetaName)2065671281) ); @@ -13207,8 +13207,8 @@ namespace CodeWalker.GameFiles return new PsoStructureInfo(MetaName.CScenarioChainingEdge, 0, 0, 16, new PsoStructureEntryInfo(MetaName.NodeIndexFrom, PsoDataType.UShort, 8, 0, 0), new PsoStructureEntryInfo(MetaName.NodeIndexTo, PsoDataType.UShort, 10, 0, 0), - new PsoStructureEntryInfo(MetaName.NavMode, PsoDataType.Enum, 12, 2, (MetaName)3971773454), - new PsoStructureEntryInfo(MetaName.NavSpeed, PsoDataType.Enum, 13, 2, (MetaName)941086046) + new PsoStructureEntryInfo(MetaName.NavMode, PsoDataType.Enum, 12, 2, MetaName.CScenarioChainingEdge__eNavMode), + new PsoStructureEntryInfo(MetaName.NavSpeed, PsoDataType.Enum, 13, 2, MetaName.CScenarioChainingEdge__eNavSpeed) ); case MetaName.CPedVariationInfo: return new PsoStructureInfo(MetaName.CPedVariationInfo, 0, 0, 112, @@ -13231,7 +13231,7 @@ namespace CodeWalker.GameFiles return new PsoStructureInfo(MetaName.CPedPropInfo, 0, 0, 40, new PsoStructureEntryInfo((MetaName)2598445407, PsoDataType.UByte, 0, 0, 0), new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedPropMetaData), - new PsoStructureEntryInfo((MetaName)3902803273, PsoDataType.Array, 8, 0, (MetaName)1), + new PsoStructureEntryInfo(MetaName.aPropMetaData, PsoDataType.Array, 8, 0, (MetaName)1), new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CAnchorProps), new PsoStructureEntryInfo(MetaName.aAnchors, PsoDataType.Array, 24, 0, (MetaName)3) ); @@ -13267,7 +13267,7 @@ namespace CodeWalker.GameFiles new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 28, 0, 0), new PsoStructureEntryInfo(MetaName.inclusions, PsoDataType.Flags, 32, 0, (MetaName)2101247), new PsoStructureEntryInfo(MetaName.exclusions, PsoDataType.Flags, 36, 0, (MetaName)2101247), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)884254308), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.ePedVarComp), new PsoStructureEntryInfo((MetaName)1613922652, PsoDataType.Flags, 40, 1, (MetaName)1048583), new PsoStructureEntryInfo((MetaName)2114993291, PsoDataType.UShort, 42, 0, 0), new PsoStructureEntryInfo((MetaName)3509540765, PsoDataType.UByte, 44, 0, 0), @@ -15540,8 +15540,8 @@ namespace CodeWalker.GameFiles new PsoEnumEntryInfo((MetaName)3999177563, 1), new PsoEnumEntryInfo((MetaName)3250863043, 2) ); - case (MetaName)884254308: - return new PsoEnumInfo((MetaName)884254308, 1, + case MetaName.ePedVarComp: + return new PsoEnumInfo(MetaName.ePedVarComp, 1, new PsoEnumEntryInfo(MetaName.PV_COMP_INVALID, -1), new PsoEnumEntryInfo(MetaName.PV_COMP_HEAD, 0), new PsoEnumEntryInfo(MetaName.PV_COMP_BERD, 1), @@ -15741,14 +15741,14 @@ namespace CodeWalker.GameFiles new PsoEnumEntryInfo(MetaName.NoSpawn, 1), new PsoEnumEntryInfo(MetaName.StationaryReactions, 2) ); - case (MetaName)3971773454: - return new PsoEnumInfo((MetaName)3971773454, 1, + case MetaName.CScenarioChainingEdge__eNavMode: + return new PsoEnumInfo(MetaName.CScenarioChainingEdge__eNavMode, 1, new PsoEnumEntryInfo(MetaName.Direct, 0), new PsoEnumEntryInfo(MetaName.NavMesh, 1), new PsoEnumEntryInfo(MetaName.Roads, 2) ); - case (MetaName)941086046: - return new PsoEnumInfo((MetaName)941086046, 1, + case MetaName.CScenarioChainingEdge__eNavSpeed: + return new PsoEnumInfo(MetaName.CScenarioChainingEdge__eNavSpeed, 1, new PsoEnumEntryInfo((MetaName)3279574318, 0), new PsoEnumEntryInfo((MetaName)2212923970, 1), new PsoEnumEntryInfo((MetaName)4022799658, 2), diff --git a/CodeWalker.Core/GameFiles/Resources/Drawable.cs b/CodeWalker.Core/GameFiles/Resources/Drawable.cs index f1a7167..487cdab 100644 --- a/CodeWalker.Core/GameFiles/Resources/Drawable.cs +++ b/CodeWalker.Core/GameFiles/Resources/Drawable.cs @@ -513,15 +513,15 @@ namespace CodeWalker.GameFiles public uint Unknown_4h { get; set; } // 0x00000001 public uint Unknown_8h { get; set; } // 0x00000000 public uint Unknown_Ch { get; set; } // 0x00000000 - public ulong Unknown_10h_Pointer { get; set; } + public ulong BoneTagsPointer { get; set; } public ushort Count1 { get; set; } public ushort Count2 { get; set; } - public uint Unknown_1Ch { get; set; } + public FlagsUint Unknown_1Ch { get; set; } public ulong BonesPointer { get; set; } public ulong TransformationsInvertedPointer { get; set; } public ulong TransformationsPointer { get; set; } public ulong ParentIndicesPointer { get; set; } - public ulong Unknown_40h_Pointer { get; set; } + public ulong ChildIndicesPointer { get; set; } public uint Unknown_48h { get; set; } // 0x00000000 public uint Unknown_4Ch { get; set; } // 0x00000000 public MetaHash Unknown_50h { get; set; } @@ -529,25 +529,25 @@ namespace CodeWalker.GameFiles public MetaHash Unknown_58h { get; set; } public ushort Unknown_5Ch { get; set; } // 0x0001 public ushort BonesCount { get; set; } - public ushort Count4 { get; set; } + public ushort ChildIndicesCount { get; set; } public ushort Unknown_62h { get; set; } // 0x0000 public uint Unknown_64h { get; set; } // 0x00000000 public uint Unknown_68h { get; set; } // 0x00000000 public uint Unknown_6Ch { get; set; } // 0x00000000 // reference data - public ResourcePointerArray64 Unknown_10h_Data { get; set; } + public ResourcePointerArray64 BoneTags { get; set; } public ResourceSimpleArray Bones { get; set; } public Matrix[] TransformationsInverted { get; set; } public Matrix[] Transformations { get; set; } public ushort[] ParentIndices { get; set; } - public ushort[] Unknown_40h_Data { get; set; } + public ushort[] ChildIndices { get; set; }//mapping child->parent indices, first child index, then parent private ResourceSystemStructBlock TransformationsInvertedBlock = null;//for saving only private ResourceSystemStructBlock TransformationsBlock = null; private ResourceSystemStructBlock ParentIndicesBlock = null; - private ResourceSystemStructBlock Unknown_40h_DataBlock = null; + private ResourceSystemStructBlock ChildIndicesBlock = null; public Dictionary BonesMap { get; set; }//for convienience finding bones by tag @@ -564,7 +564,7 @@ namespace CodeWalker.GameFiles this.Unknown_4h = reader.ReadUInt32(); this.Unknown_8h = reader.ReadUInt32(); this.Unknown_Ch = reader.ReadUInt32(); - this.Unknown_10h_Pointer = reader.ReadUInt64(); + this.BoneTagsPointer = reader.ReadUInt64(); this.Count1 = reader.ReadUInt16(); this.Count2 = reader.ReadUInt16(); this.Unknown_1Ch = reader.ReadUInt32(); @@ -572,7 +572,7 @@ namespace CodeWalker.GameFiles this.TransformationsInvertedPointer = reader.ReadUInt64(); this.TransformationsPointer = reader.ReadUInt64(); this.ParentIndicesPointer = reader.ReadUInt64(); - this.Unknown_40h_Pointer = reader.ReadUInt64(); + this.ChildIndicesPointer = reader.ReadUInt64(); this.Unknown_48h = reader.ReadUInt32(); this.Unknown_4Ch = reader.ReadUInt32(); this.Unknown_50h = new MetaHash(reader.ReadUInt32()); @@ -580,15 +580,15 @@ namespace CodeWalker.GameFiles this.Unknown_58h = new MetaHash(reader.ReadUInt32()); this.Unknown_5Ch = reader.ReadUInt16(); this.BonesCount = reader.ReadUInt16(); - this.Count4 = reader.ReadUInt16(); + this.ChildIndicesCount = reader.ReadUInt16(); this.Unknown_62h = reader.ReadUInt16(); this.Unknown_64h = reader.ReadUInt32(); this.Unknown_68h = reader.ReadUInt32(); this.Unknown_6Ch = reader.ReadUInt32(); // read reference data - this.Unknown_10h_Data = reader.ReadBlockAt>( - this.Unknown_10h_Pointer, // offset + this.BoneTags = reader.ReadBlockAt>( + this.BoneTagsPointer, // offset this.Count1 ); this.Bones = reader.ReadBlockAt>( @@ -598,7 +598,7 @@ namespace CodeWalker.GameFiles this.TransformationsInverted = reader.ReadStructsAt(this.TransformationsInvertedPointer, this.BonesCount); this.Transformations = reader.ReadStructsAt(this.TransformationsPointer, this.BonesCount); this.ParentIndices = reader.ReadUshortsAt(this.ParentIndicesPointer, this.BonesCount); - this.Unknown_40h_Data = reader.ReadUshortsAt(this.Unknown_40h_Pointer, this.Count4); + this.ChildIndices = reader.ReadUshortsAt(this.ChildIndicesPointer, this.ChildIndicesCount); if ((Bones != null) && (ParentIndices != null)) @@ -621,7 +621,7 @@ namespace CodeWalker.GameFiles for (int i = 0; i < Bones.Count; i++) { var bone = Bones[i]; - BonesMap[bone.Id] = bone; + BonesMap[bone.Tag] = bone; bone.UpdateAnimTransform(); bone.BindTransformInv = (i < TransformationsInverted?.Length) ? TransformationsInverted[i] : Matrix.Invert(bone.AnimTransform); @@ -638,15 +638,15 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data - this.Unknown_10h_Pointer = (ulong)(this.Unknown_10h_Data != null ? this.Unknown_10h_Data.FilePosition : 0); - this.Count1 = (ushort)(this.Unknown_10h_Data != null ? this.Unknown_10h_Data.Count : 0); + this.BoneTagsPointer = (ulong)(this.BoneTags != null ? this.BoneTags.FilePosition : 0); + this.Count1 = (ushort)(this.BoneTags != null ? this.BoneTags.Count : 0); this.BonesPointer = (ulong)(this.Bones != null ? this.Bones.FilePosition : 0); this.TransformationsInvertedPointer = (ulong)(this.TransformationsInvertedBlock != null ? this.TransformationsInvertedBlock.FilePosition : 0); this.TransformationsPointer = (ulong)(this.TransformationsBlock != null ? this.TransformationsBlock.FilePosition : 0); this.ParentIndicesPointer = (ulong)(this.ParentIndicesBlock != null ? this.ParentIndicesBlock.FilePosition : 0); - this.Unknown_40h_Pointer = (ulong)(this.Unknown_40h_DataBlock != null ? this.Unknown_40h_DataBlock.FilePosition : 0); + this.ChildIndicesPointer = (ulong)(this.ChildIndicesBlock != null ? this.ChildIndicesBlock.FilePosition : 0); this.BonesCount = (ushort)(this.Bones != null ? this.Bones.Count : 0); - this.Count4 = (ushort)(this.Unknown_40h_DataBlock != null ? this.Unknown_40h_DataBlock.ItemCount : 0); + this.ChildIndicesCount = (ushort)(this.ChildIndicesBlock != null ? this.ChildIndicesBlock.ItemCount : 0); //this.Count2 = BonesCount;//? @@ -655,7 +655,7 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_4h); writer.Write(this.Unknown_8h); writer.Write(this.Unknown_Ch); - writer.Write(this.Unknown_10h_Pointer); + writer.Write(this.BoneTagsPointer); writer.Write(this.Count1); writer.Write(this.Count2); writer.Write(this.Unknown_1Ch); @@ -663,7 +663,7 @@ namespace CodeWalker.GameFiles writer.Write(this.TransformationsInvertedPointer); writer.Write(this.TransformationsPointer); writer.Write(this.ParentIndicesPointer); - writer.Write(this.Unknown_40h_Pointer); + writer.Write(this.ChildIndicesPointer); writer.Write(this.Unknown_48h); writer.Write(this.Unknown_4Ch); writer.Write(this.Unknown_50h); @@ -671,7 +671,7 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_58h); writer.Write(this.Unknown_5Ch); writer.Write(this.BonesCount); - writer.Write(this.Count4); + writer.Write(this.ChildIndicesCount); writer.Write(this.Unknown_62h); writer.Write(this.Unknown_64h); writer.Write(this.Unknown_68h); @@ -684,7 +684,7 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(); - if (Unknown_10h_Data != null) list.Add(Unknown_10h_Data); + if (BoneTags != null) list.Add(BoneTags); if (Bones != null) list.Add(Bones); if (TransformationsInverted != null) { @@ -701,16 +701,16 @@ namespace CodeWalker.GameFiles ParentIndicesBlock = new ResourceSystemStructBlock(ParentIndices); list.Add(ParentIndicesBlock); } - if (Unknown_40h_Data != null) + if (ChildIndices != null) { - Unknown_40h_DataBlock = new ResourceSystemStructBlock(Unknown_40h_Data); - list.Add(Unknown_40h_DataBlock); + ChildIndicesBlock = new ResourceSystemStructBlock(ChildIndices); + list.Add(ChildIndicesBlock); } return list.ToArray(); } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class Skeleton_Unknown_D_001 : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] public class SkeletonBoneTag : ResourceSystemBlock { public override long BlockLength { @@ -718,12 +718,12 @@ namespace CodeWalker.GameFiles } // structure data - public uint Unknown_0h { get; set; } - public uint Unknown_4h { get; set; } - public ulong Unknown_8h_Pointer { get; set; } + public uint BoneTag { get; set; } + public uint BoneIndex { get; set; } + public ulong LinkedTagPointer { get; set; } // reference data - public Skeleton_Unknown_D_001 p1data { get; set; } + public SkeletonBoneTag LinkedTag { get; set; } //don't know why it's linked here /// /// Reads the data-block from a stream. @@ -731,13 +731,13 @@ namespace CodeWalker.GameFiles public override void Read(ResourceDataReader reader, params object[] parameters) { // read structure data - this.Unknown_0h = reader.ReadUInt32(); - this.Unknown_4h = reader.ReadUInt32(); - this.Unknown_8h_Pointer = reader.ReadUInt64(); + this.BoneTag = reader.ReadUInt32(); + this.BoneIndex = reader.ReadUInt32(); + this.LinkedTagPointer = reader.ReadUInt64(); // read reference data - this.p1data = reader.ReadBlockAt( - this.Unknown_8h_Pointer // offset + this.LinkedTag = reader.ReadBlockAt( + this.LinkedTagPointer // offset ); } @@ -747,12 +747,12 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data - this.Unknown_8h_Pointer = (ulong)(this.p1data != null ? this.p1data.FilePosition : 0); + this.LinkedTagPointer = (ulong)(this.LinkedTag != null ? this.LinkedTag.FilePosition : 0); // write structure data - writer.Write(this.Unknown_0h); - writer.Write(this.Unknown_4h); - writer.Write(this.Unknown_8h_Pointer); + writer.Write(this.BoneTag); + writer.Write(this.BoneIndex); + writer.Write(this.LinkedTagPointer); } /// @@ -761,9 +761,14 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(); - if (p1data != null) list.Add(p1data); + if (LinkedTag != null) list.Add(LinkedTag); return list.ToArray(); } + + public override string ToString() + { + return BoneTag.ToString() + ": " + BoneIndex.ToString(); + } } [TypeConverter(typeof(ExpandableObjectConverter))] public class Bone : ResourceSystemBlock @@ -788,9 +793,9 @@ namespace CodeWalker.GameFiles public uint Unknown_34h { get; set; } // 0x00000000 public ulong NamePointer { get; set; } public ushort Flags { get; set; } - public ushort Unknown_42h { get; set; } - public ushort Id { get; set; } - public ushort Unknown_46h { get; set; } + public ushort Index { get; set; } + public ushort Tag { get; set; } + public ushort Index2 { get; set; }//same as Index? public uint Unknown_48h { get; set; } // 0x00000000 public uint Unknown_4Ch { get; set; } // 0x00000000 @@ -826,9 +831,9 @@ namespace CodeWalker.GameFiles this.Unknown_34h = reader.ReadUInt32(); this.NamePointer = reader.ReadUInt64(); this.Flags = reader.ReadUInt16(); - this.Unknown_42h = reader.ReadUInt16(); - this.Id = reader.ReadUInt16(); - this.Unknown_46h = reader.ReadUInt16(); + this.Index = reader.ReadUInt16(); + this.Tag = reader.ReadUInt16(); + this.Index2 = reader.ReadUInt16(); this.Unknown_48h = reader.ReadUInt32(); this.Unknown_4Ch = reader.ReadUInt32(); @@ -862,9 +867,9 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_34h); writer.Write(this.NamePointer); writer.Write(this.Flags); - writer.Write(this.Unknown_42h); - writer.Write(this.Id); - writer.Write(this.Unknown_46h); + writer.Write(this.Index); + writer.Write(this.Tag); + writer.Write(this.Index2); writer.Write(this.Unknown_48h); writer.Write(this.Unknown_4Ch); } @@ -885,7 +890,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Id.ToString() + ": " + Name; + return Tag.ToString() + ": " + Name; } diff --git a/CodeWalker.Core/GameFiles/Resources/Frag.cs b/CodeWalker.Core/GameFiles/Resources/Frag.cs index 298311a..685c845 100644 --- a/CodeWalker.Core/GameFiles/Resources/Frag.cs +++ b/CodeWalker.Core/GameFiles/Resources/Frag.cs @@ -55,9 +55,9 @@ namespace CodeWalker.GameFiles public float Unknown_28h { get; set; } public float Unknown_2Ch { get; set; } public ulong DrawablePointer { get; set; } - public ulong Unknown_28h_Pointer { get; set; } - public ulong Unknown_30h_Pointer { get; set; } - public uint Count0 { get; set; } + public ulong DrawableArrayPointer { get; set; } + public ulong DrawableArrayNamesPointer { get; set; } + public uint DrawableArrayCount { get; set; } public uint Unknown_4Ch { get; set; } //pointer? public uint Unknown_50h { get; set; } // 0x00000000 public uint Unknown_54h { get; set; } // 0x00000000 @@ -77,7 +77,7 @@ namespace CodeWalker.GameFiles public uint Unknown_9Ch { get; set; } // 0x00000000 public uint Unknown_A0h { get; set; } // 0x00000000 public uint Unknown_A4h { get; set; } // 0x00000000 - public ulong Unknown_A8h_Pointer { get; set; } + public ulong BoneTransformsPointer { get; set; } public uint Unknown_B0h { get; set; } // 0x00000000 public uint Unknown_B4h { get; set; } // 0x00000000 public uint Unknown_B8h { get; set; } @@ -89,10 +89,10 @@ namespace CodeWalker.GameFiles public float Unknown_D0h { get; set; } public float Unknown_D4h { get; set; } public byte Unknown_D8h { get; set; } - public byte Count3 { get; set; } + public byte GlassWindowsCount { get; set; } public ushort Unknown_DAh { get; set; } public uint Unknown_DCh { get; set; } // 0x00000000 - public ulong Unknown_E0h_Pointer { get; set; } + public ulong GlassWindowsPointer { get; set; } public uint Unknown_E8h { get; set; } // 0x00000000 public uint Unknown_ECh { get; set; } // 0x00000000 public ulong PhysicsLODGroupPointer { get; set; } @@ -102,24 +102,27 @@ namespace CodeWalker.GameFiles public uint Unknown_108h { get; set; } // 0x00000000 public uint Unknown_10Ch { get; set; } // 0x00000000 public ResourceSimpleList64_s LightAttributes { get; set; } - public ulong Unknown_120h_Pointer { get; set; } + public ulong VehicleGlassWindowsPointer { get; set; } public uint Unknown_128h { get; set; } // 0x00000000 public uint Unknown_12Ch { get; set; } // 0x00000000 // reference data public FragDrawable Drawable { get; set; } - public ResourcePointerArray64 Unknown_28h_Data { get; set; } - public ResourcePointerArray64 Unknown_30h_Data { get; set; } + public ResourcePointerArray64 DrawableArray { get; set; } + public ResourcePointerArray64 DrawableArrayNames { get; set; } public string Name { get; set; } - public FragUnknown_F_004 Unknown_A8h_Data { get; set; } - public ResourcePointerArray64 Unknown_E0h_Data { get; set; } + public FragBoneTransforms BoneTransforms { get; set; } + public ResourcePointerArray64 GlassWindows { get; set; } public FragPhysicsLODGroup PhysicsLODGroup { get; set; } public FragDrawable Drawable2 { get; set; } - public FragUnknown_F_003 Unknown_120h_Data { get; set; } + public FragVehicleGlassWindows VehicleGlassWindows { get; set; } private string_r NameBlock = null; //only used for saving + public YftFile Yft { get; set; } + + /// /// Reads the data-block from a stream. /// @@ -137,9 +140,9 @@ namespace CodeWalker.GameFiles this.Unknown_28h = reader.ReadSingle(); this.Unknown_2Ch = reader.ReadSingle(); this.DrawablePointer = reader.ReadUInt64(); - this.Unknown_28h_Pointer = reader.ReadUInt64(); - this.Unknown_30h_Pointer = reader.ReadUInt64(); - this.Count0 = reader.ReadUInt32(); + this.DrawableArrayPointer = reader.ReadUInt64(); + this.DrawableArrayNamesPointer = reader.ReadUInt64(); + this.DrawableArrayCount = reader.ReadUInt32(); this.Unknown_4Ch = reader.ReadUInt32(); this.Unknown_50h = reader.ReadUInt32(); this.Unknown_54h = reader.ReadUInt32(); @@ -159,7 +162,7 @@ namespace CodeWalker.GameFiles this.Unknown_9Ch = reader.ReadUInt32(); this.Unknown_A0h = reader.ReadUInt32(); this.Unknown_A4h = reader.ReadUInt32(); - this.Unknown_A8h_Pointer = reader.ReadUInt64(); + this.BoneTransformsPointer = reader.ReadUInt64(); this.Unknown_B0h = reader.ReadUInt32(); this.Unknown_B4h = reader.ReadUInt32(); this.Unknown_B8h = reader.ReadUInt32(); @@ -171,10 +174,10 @@ namespace CodeWalker.GameFiles this.Unknown_D0h = reader.ReadSingle(); this.Unknown_D4h = reader.ReadSingle(); this.Unknown_D8h = reader.ReadByte(); - this.Count3 = reader.ReadByte(); + this.GlassWindowsCount = reader.ReadByte(); this.Unknown_DAh = reader.ReadUInt16(); this.Unknown_DCh = reader.ReadUInt32(); - this.Unknown_E0h_Pointer = reader.ReadUInt64(); + this.GlassWindowsPointer = reader.ReadUInt64(); this.Unknown_E8h = reader.ReadUInt32(); this.Unknown_ECh = reader.ReadUInt32(); this.PhysicsLODGroupPointer = reader.ReadUInt64(); @@ -184,65 +187,49 @@ namespace CodeWalker.GameFiles this.Unknown_108h = reader.ReadUInt32(); this.Unknown_10Ch = reader.ReadUInt32(); this.LightAttributes = reader.ReadBlock>(); - this.Unknown_120h_Pointer = reader.ReadUInt64(); + this.VehicleGlassWindowsPointer = reader.ReadUInt64(); this.Unknown_128h = reader.ReadUInt32(); this.Unknown_12Ch = reader.ReadUInt32(); // read reference data - this.Drawable = reader.ReadBlockAt( - this.DrawablePointer // offset - ); - if (this.Drawable != null) + Drawable = reader.ReadBlockAt(this.DrawablePointer); + if (Drawable != null) { - this.Drawable.OwnerFragment = this; + Drawable.OwnerFragment = this; } - this.Unknown_28h_Data = reader.ReadBlockAt>( - this.Unknown_28h_Pointer, // offset - this.Count0 - ); - if ((this.Unknown_28h_Data != null) && (this.Unknown_28h_Data.data_items != null)) + DrawableArray = reader.ReadBlockAt>(DrawableArrayPointer, DrawableArrayCount); + if ((DrawableArray != null) && (DrawableArray.data_items != null)) { - for (int i = 0; i < this.Unknown_28h_Data.data_items.Length; i++) + for (int i = 0; i < DrawableArray.data_items.Length; i++) { - var drwbl = Unknown_28h_Data.data_items[i]; + var drwbl = DrawableArray.data_items[i]; if (drwbl != null) { drwbl.OwnerFragment = this; } } } - this.Unknown_30h_Data = reader.ReadBlockAt>( - this.Unknown_30h_Pointer, // offset - this.Count0 - ); - this.Name = reader.ReadStringAt(//BlockAt( - this.NamePointer // offset - ); - this.Unknown_A8h_Data = reader.ReadBlockAt( - this.Unknown_A8h_Pointer // offset - ); - this.Unknown_E0h_Data = reader.ReadBlockAt>( - this.Unknown_E0h_Pointer, // offset - this.Count3 - ); - this.PhysicsLODGroup = reader.ReadBlockAt( - this.PhysicsLODGroupPointer // offset - ); - this.Drawable2 = reader.ReadBlockAt( - this.Drawable2Pointer // offset - ); - if (this.Drawable2 != null) + DrawableArrayNames = reader.ReadBlockAt>(DrawableArrayNamesPointer, DrawableArrayCount); + Name = reader.ReadStringAt(NamePointer); + BoneTransforms = reader.ReadBlockAt(BoneTransformsPointer); + GlassWindows = reader.ReadBlockAt>(GlassWindowsPointer, GlassWindowsCount); + PhysicsLODGroup = reader.ReadBlockAt(PhysicsLODGroupPointer); + Drawable2 = reader.ReadBlockAt(Drawable2Pointer); + if (Drawable2 != null) { - this.Drawable2.OwnerFragment = this; + Drawable2.OwnerFragment = this; } - this.Unknown_120h_Data = reader.ReadBlockAt( - this.Unknown_120h_Pointer // offset - ); + VehicleGlassWindows = reader.ReadBlockAt(VehicleGlassWindowsPointer); + if (GlassWindows != null) + { } + if (VehicleGlassWindows != null) + { } + //for vehicle wheels, the shaderGroup in the model seems to be missing, but have to use the main drawable's shaders. if ((Drawable != null) && (PhysicsLODGroup != null) && (PhysicsLODGroup.PhysicsLOD1 != null)) @@ -273,16 +260,16 @@ namespace CodeWalker.GameFiles // update structure data this.DrawablePointer = (ulong)(this.Drawable != null ? this.Drawable.FilePosition : 0); - 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.DrawableArrayPointer = (ulong)(this.DrawableArray != null ? this.DrawableArray.FilePosition : 0); + this.DrawableArrayNamesPointer = (ulong)(this.DrawableArrayNames != null ? this.DrawableArrayNames.FilePosition : 0); + this.DrawableArrayCount = (uint)(this.DrawableArray != null ? this.DrawableArray.Count : 0); 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); + this.BoneTransformsPointer = (ulong)(this.BoneTransforms != null ? this.BoneTransforms.FilePosition : 0); + this.GlassWindowsCount = (byte)(this.GlassWindows != null ? this.GlassWindows.Count : 0); + this.GlassWindowsPointer = (ulong)(this.GlassWindows != null ? this.GlassWindows.FilePosition : 0); this.PhysicsLODGroupPointer = (ulong)(this.PhysicsLODGroup != null ? this.PhysicsLODGroup.FilePosition : 0); this.Drawable2Pointer = (ulong)(this.Drawable2 != null ? this.Drawable2.FilePosition : 0); - this.Unknown_120h_Pointer = (ulong)(this.Unknown_120h_Data != null ? this.Unknown_120h_Data.FilePosition : 0); + this.VehicleGlassWindowsPointer = (ulong)(this.VehicleGlassWindows != null ? this.VehicleGlassWindows.FilePosition : 0); // write structure data writer.Write(this.Unknown_10h); @@ -294,9 +281,9 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_28h); writer.Write(this.Unknown_2Ch); writer.Write(this.DrawablePointer); - writer.Write(this.Unknown_28h_Pointer); - writer.Write(this.Unknown_30h_Pointer); - writer.Write(this.Count0); + writer.Write(this.DrawableArrayPointer); + writer.Write(this.DrawableArrayNamesPointer); + writer.Write(this.DrawableArrayCount); writer.Write(this.Unknown_4Ch); writer.Write(this.Unknown_50h); writer.Write(this.Unknown_54h); @@ -316,7 +303,7 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_9Ch); writer.Write(this.Unknown_A0h); writer.Write(this.Unknown_A4h); - writer.Write(this.Unknown_A8h_Pointer); + writer.Write(this.BoneTransformsPointer); writer.Write(this.Unknown_B0h); writer.Write(this.Unknown_B4h); writer.Write(this.Unknown_B8h); @@ -328,10 +315,10 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_D0h); writer.Write(this.Unknown_D4h); writer.Write(this.Unknown_D8h); - writer.Write(this.Count3); + writer.Write(this.GlassWindowsCount); writer.Write(this.Unknown_DAh); writer.Write(this.Unknown_DCh); - writer.Write(this.Unknown_E0h_Pointer); + writer.Write(this.GlassWindowsPointer); writer.Write(this.Unknown_E8h); writer.Write(this.Unknown_ECh); writer.Write(this.PhysicsLODGroupPointer); @@ -341,7 +328,7 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_108h); writer.Write(this.Unknown_10Ch); writer.WriteBlock(this.LightAttributes); - writer.Write(this.Unknown_120h_Pointer); + writer.Write(this.VehicleGlassWindowsPointer); writer.Write(this.Unknown_128h); writer.Write(this.Unknown_12Ch); } @@ -353,18 +340,18 @@ namespace CodeWalker.GameFiles { var list = new List(base.GetReferences()); 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 (DrawableArray != null) list.Add(DrawableArray); + if (DrawableArrayNames != null) list.Add(DrawableArrayNames); 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 (BoneTransforms != null) list.Add(BoneTransforms); + if (GlassWindows != null) list.Add(GlassWindows); if (PhysicsLODGroup != null) list.Add(PhysicsLODGroup); if (Drawable2 != null) list.Add(Drawable2); - if (Unknown_120h_Data != null) list.Add(Unknown_120h_Data); + if (VehicleGlassWindows != null) list.Add(VehicleGlassWindows); return list.ToArray(); } @@ -1699,13 +1686,13 @@ namespace CodeWalker.GameFiles // structure data public uint Unknown_0A8h { get; set; } public uint Unknown_0ACh { get; set; } - public Matrix Unknown_0B0h { get; set; } + public Matrix FragMatrix { get; set; } //unknown? public ulong BoundPointer { get; set; } - public ulong Unknown_0F8h_Pointer { get; set; } - public ushort Count1 { get; set; } - public ushort Count2 { get; set; } + public ulong FragMatricesIndsPointer { get; set; } + public ushort FragMatricesIndsCount { get; set; } + public ushort FragMatricesCount { get; set; } public uint Unknown_104h { get; set; } // 0x00000000 - public ulong Unknown_108h_Pointer { get; set; } + public ulong FragMatricesPointer { get; set; } public ushort Count3 { get; set; } public ushort Count4 { get; set; } public uint Unknown_114h { get; set; } // 0x00000000 @@ -1725,8 +1712,8 @@ namespace CodeWalker.GameFiles // reference data public Bounds Bound { get; set; } - public ulong[] Unknown_F8h_Data { get; set; } - public Matrix[] Unknown_108h_Data { get; set; } + public ulong[] FragMatricesInds { get; set; } + public Matrix[] FragMatrices { get; set; } public string Name { get; set; } public FragType OwnerFragment { get; set; } //for handy use @@ -1748,13 +1735,13 @@ namespace CodeWalker.GameFiles // read structure data this.Unknown_0A8h = reader.ReadUInt32(); this.Unknown_0ACh = reader.ReadUInt32(); - this.Unknown_0B0h = reader.ReadStruct(); + this.FragMatrix = reader.ReadStruct(); this.BoundPointer = reader.ReadUInt64(); - this.Unknown_0F8h_Pointer = reader.ReadUInt64(); - this.Count1 = reader.ReadUInt16(); - this.Count2 = reader.ReadUInt16(); + this.FragMatricesIndsPointer = reader.ReadUInt64(); + this.FragMatricesIndsCount = reader.ReadUInt16(); + this.FragMatricesCount = reader.ReadUInt16(); this.Unknown_104h = reader.ReadUInt32(); - this.Unknown_108h_Pointer = reader.ReadUInt64(); + this.FragMatricesPointer = reader.ReadUInt64(); this.Count3 = reader.ReadUInt16(); this.Count4 = reader.ReadUInt16(); this.Unknown_114h = reader.ReadUInt32(); @@ -1773,14 +1760,17 @@ namespace CodeWalker.GameFiles this.Unknown_14Ch = reader.ReadUInt32(); // read reference data - this.Bound = reader.ReadBlockAt( - this.BoundPointer // offset - ); - this.Unknown_F8h_Data = reader.ReadUlongsAt(this.Unknown_0F8h_Pointer, this.Count1); - this.Unknown_108h_Data = reader.ReadStructsAt(this.Unknown_108h_Pointer, this.Count2); - this.Name = reader.ReadStringAt(//BlockAt( - this.NamePointer // offset - ); + Bound = reader.ReadBlockAt(BoundPointer); + FragMatricesInds = reader.ReadUlongsAt(FragMatricesIndsPointer, FragMatricesIndsCount); + FragMatrices = reader.ReadStructsAt(FragMatricesPointer, FragMatricesCount); + Name = reader.ReadStringAt(NamePointer); + + if ((Count3 != Count4)&&(Count4!=1)&&(Count3!=0)) + { } + if (FragMatricesInds != null) + { } + if (FragMatrices != null) + { } } /// @@ -1792,22 +1782,22 @@ namespace CodeWalker.GameFiles // update structure data this.BoundPointer = (ulong)(this.Bound != null ? this.Bound.FilePosition : 0); - 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.FragMatricesIndsPointer = (ulong)(this.Unknown_F8h_DataBlock != null ? this.Unknown_F8h_DataBlock.FilePosition : 0); + this.FragMatricesIndsCount = (ushort)(this.Unknown_F8h_DataBlock != null ? this.Unknown_F8h_DataBlock.ItemCount : 0); + this.FragMatricesCount = (ushort)(this.Unknown_108h_DataBlock != null ? this.Unknown_108h_DataBlock.ItemCount : 0); + this.FragMatricesPointer = (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.Write(this.Unknown_0B0h); + writer.Write(this.FragMatrix); writer.Write(this.BoundPointer); - writer.Write(this.Unknown_0F8h_Pointer); - writer.Write(this.Count1); - writer.Write(this.Count2); + writer.Write(this.FragMatricesIndsPointer); + writer.Write(this.FragMatricesIndsCount); + writer.Write(this.FragMatricesCount); writer.Write(this.Unknown_104h); - writer.Write(this.Unknown_108h_Pointer); + writer.Write(this.FragMatricesPointer); writer.Write(this.Count3); writer.Write(this.Count4); writer.Write(this.Unknown_114h); @@ -1833,14 +1823,14 @@ namespace CodeWalker.GameFiles { var list = new List(base.GetReferences()); if (Bound != null) list.Add(Bound); - if (Unknown_F8h_Data != null) + if (FragMatricesInds != null) { - Unknown_F8h_DataBlock = new ResourceSystemStructBlock(Unknown_F8h_Data); + Unknown_F8h_DataBlock = new ResourceSystemStructBlock(FragMatricesInds); list.Add(Unknown_F8h_DataBlock); } - if (Unknown_108h_Data != null) + if (FragMatrices != null) { - Unknown_108h_DataBlock = new ResourceSystemStructBlock(Unknown_108h_Data); + Unknown_108h_DataBlock = new ResourceSystemStructBlock(FragMatrices); list.Add(Unknown_108h_DataBlock); } if (Name != null) @@ -1852,11 +1842,11 @@ namespace CodeWalker.GameFiles } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class FragUnknown_F_004 : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] public class FragBoneTransforms : ResourceSystemBlock { public override long BlockLength { - get { return 32 + ((Data?.Length ?? 0) * 48); } + get { return 32 + ((Items?.Length ?? 0) * 48); } } // structure data @@ -1864,13 +1854,13 @@ 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 DataCount1 { get; set; } - public byte DataCount2 { get; set; } + public byte ItemCount1 { get; set; } + public byte ItemCount2 { get; set; } public ushort Unknown_12h { get; set; } public uint Unknown_14h { get; set; } // 0x00000000 public uint Unknown_18h { get; set; } // 0x00000000 public uint Unknown_1Ch { get; set; } // 0x00000000 - public Matrix3_s[] Data { get; set; } + public Matrix3_s[] Items { get; set; } /// /// Reads the data-block from a stream. @@ -1882,14 +1872,16 @@ namespace CodeWalker.GameFiles this.Unknown_04h = reader.ReadUInt32(); this.Unknown_08h = reader.ReadUInt32(); this.Unknown_0Ch = reader.ReadUInt32(); - this.DataCount1 = reader.ReadByte(); - this.DataCount2 = reader.ReadByte(); + this.ItemCount1 = reader.ReadByte(); + this.ItemCount2 = 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.ReadStructs(DataCount1); + this.Items = reader.ReadStructs(ItemCount1); + if ((Unknown_12h != 0) && (Unknown_12h != 1)) + { } } /// @@ -1902,17 +1894,18 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_04h); writer.Write(this.Unknown_08h); writer.Write(this.Unknown_0Ch); - writer.Write(this.DataCount1); - writer.Write(this.DataCount2); + writer.Write(this.ItemCount1); + writer.Write(this.ItemCount2); writer.Write(this.Unknown_12h); writer.Write(this.Unknown_14h); writer.Write(this.Unknown_18h); writer.Write(this.Unknown_1Ch); - writer.WriteStructs(Data); + writer.WriteStructs(Items); } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class FragUnknown_F_006 : ResourceSystemBlock + + [TypeConverter(typeof(ExpandableObjectConverter))] public class FragGlassWindow : ResourceSystemBlock { public override long BlockLength { @@ -1920,34 +1913,35 @@ namespace CodeWalker.GameFiles } // structure data - public uint Unknown_00h { get; set; } - public uint Unknown_04h { get; set; } - public uint Unknown_08h { get; set; } - public uint Unknown_0Ch { get; set; } // 0x7F800001 - public uint Unknown_10h { get; set; } - public uint Unknown_14h { get; set; } - public uint Unknown_18h { get; set; } - public uint Unknown_1Ch { get; set; } // 0x7F800001 - public uint Unknown_20h { get; set; } - public uint Unknown_24h { get; set; } - public uint Unknown_28h { get; set; } - public uint Unknown_2Ch { get; set; } // 0x7F800001 - public uint Unknown_30h { get; set; } - public uint Unknown_34h { get; set; } - public uint Unknown_38h { get; set; } - public uint Unknown_3Ch { get; set; } - public uint Unknown_40h { get; set; } // 0x000000D9 - public uint Unknown_44h { get; set; } // 0x0500002C - public uint Unknown_48h { get; set; } // 0x55996996 looks like vertex types - public uint Unknown_4Ch { get; set; } // 0x76555555 - public uint Unknown_50h { get; set; } - public uint Unknown_54h { get; set; } - public uint Unknown_58h { get; set; } - public uint Unknown_5Ch { get; set; } - public uint Unknown_60h { get; set; } - public uint Unknown_64h { get; set; } - public uint Unknown_68h { get; set; } - public uint Unknown_6Ch { get; set; } // 0x7F800001 + public Matrix Matrix { get; set; } //column 4 is NaN,NaN,NaN,1 + public uint VertexDeclFlags { get; set; } // 0x000000D9 + public ushort VertexDeclStride { get; set; } // 0x002C + public byte VertexDeclUnk { get; set; } //0x00 + public byte VertexDeclCount { get; set; } //0x05 + public ulong VertexDeclTypes { get; set; } // 0x7655555555996996 + public MetaHash Unknown_50h { get; set; } //looks floaty? flagsy? 0xXXXX0000 + public ushort Unknown_54h { get; set; }//2 + public ushort Flags { get; set; }//512, 768, 1280 etc ... flags + public Vector3 Vector1 { get; set; } + public Vector3 Vector2 { get; set; } // z = 0x7F800001 (NaN) + + + public ulong VertexDeclId //this all equates to VertexTypePNCTT + { + get + { + ulong res = 0; + for (int i = 0; i < 16; i++) + { + if (((VertexDeclFlags >> i) & 1) == 1) + { + res += (VertexDeclTypes & (0xFu << (i * 4))); + } + } + return res; + } + } + public VertexType VertexType { get { return (VertexType)VertexDeclFlags; } } /// /// Reads the data-block from a stream. @@ -1955,34 +1949,22 @@ namespace CodeWalker.GameFiles public override void Read(ResourceDataReader reader, params object[] parameters) { // read structure data - this.Unknown_00h = reader.ReadUInt32(); - this.Unknown_04h = reader.ReadUInt32(); - this.Unknown_08h = reader.ReadUInt32(); - this.Unknown_0Ch = reader.ReadUInt32(); - this.Unknown_10h = reader.ReadUInt32(); - this.Unknown_14h = reader.ReadUInt32(); - this.Unknown_18h = reader.ReadUInt32(); - this.Unknown_1Ch = reader.ReadUInt32(); - this.Unknown_20h = reader.ReadUInt32(); - this.Unknown_24h = reader.ReadUInt32(); - this.Unknown_28h = reader.ReadUInt32(); - this.Unknown_2Ch = reader.ReadUInt32(); - this.Unknown_30h = reader.ReadUInt32(); - this.Unknown_34h = reader.ReadUInt32(); - this.Unknown_38h = reader.ReadUInt32(); - this.Unknown_3Ch = reader.ReadUInt32(); - this.Unknown_40h = reader.ReadUInt32(); - this.Unknown_44h = reader.ReadUInt32(); - this.Unknown_48h = reader.ReadUInt32(); - this.Unknown_4Ch = reader.ReadUInt32(); + this.Matrix = reader.ReadStruct(); + this.VertexDeclFlags = reader.ReadUInt32(); + this.VertexDeclStride = reader.ReadUInt16(); + this.VertexDeclUnk = reader.ReadByte(); + this.VertexDeclCount = reader.ReadByte(); + this.VertexDeclTypes = reader.ReadUInt64(); this.Unknown_50h = reader.ReadUInt32(); - this.Unknown_54h = reader.ReadUInt32(); - this.Unknown_58h = reader.ReadUInt32(); - this.Unknown_5Ch = reader.ReadUInt32(); - this.Unknown_60h = reader.ReadUInt32(); - this.Unknown_64h = reader.ReadUInt32(); - this.Unknown_68h = reader.ReadUInt32(); - this.Unknown_6Ch = reader.ReadUInt32(); + this.Unknown_54h = reader.ReadUInt16(); + this.Flags = reader.ReadUInt16(); + this.Vector1 = reader.ReadStruct(); + this.Vector2 = reader.ReadStruct(); + + if (Unknown_50h != 0) + { } + if (Unknown_54h != 2) + { } } /// @@ -1991,49 +1973,248 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // write structure data - writer.Write(this.Unknown_00h); - writer.Write(this.Unknown_04h); - writer.Write(this.Unknown_08h); - writer.Write(this.Unknown_0Ch); - writer.Write(this.Unknown_10h); - writer.Write(this.Unknown_14h); - writer.Write(this.Unknown_18h); - writer.Write(this.Unknown_1Ch); - writer.Write(this.Unknown_20h); - writer.Write(this.Unknown_24h); - writer.Write(this.Unknown_28h); - writer.Write(this.Unknown_2Ch); - writer.Write(this.Unknown_30h); - writer.Write(this.Unknown_34h); - writer.Write(this.Unknown_38h); - writer.Write(this.Unknown_3Ch); - writer.Write(this.Unknown_40h); - writer.Write(this.Unknown_44h); - writer.Write(this.Unknown_48h); - writer.Write(this.Unknown_4Ch); + writer.Write(this.Matrix); + writer.Write(this.VertexDeclFlags); + writer.Write(this.VertexDeclStride); + writer.Write(this.VertexDeclUnk); + writer.Write(this.VertexDeclCount); + writer.Write(this.VertexDeclTypes); writer.Write(this.Unknown_50h); writer.Write(this.Unknown_54h); - writer.Write(this.Unknown_58h); - writer.Write(this.Unknown_5Ch); - writer.Write(this.Unknown_60h); - writer.Write(this.Unknown_64h); - writer.Write(this.Unknown_68h); - writer.Write(this.Unknown_6Ch); + writer.Write(this.Flags); + writer.Write(this.Vector1); + writer.Write(this.Vector2); } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class FragUnknown_F_003 : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] public class FragVehicleGlassWindows : ResourceSystemBlock { public override long BlockLength { - get { return 16 + (Data?.Length ?? 0); } + get { return TotalLength; } } + [TypeConverter(typeof(ExpandableObjectConverter))] public struct ItemOffsetStruct + { + public uint Item { get; set; } + public uint Offset { get; set; } + public override string ToString() + { + return Item.ToString() + ": " + Offset.ToString(); + } + } + [TypeConverter(typeof(ExpandableObjectConverter))] public class ItemStruct + { + public Matrix UnkMatrix { get; set; } + public uint UnkUint1 { get; set; } = 0x56475743; // "VGWC" vehicle glass window C..? + public ushort ItemID { get; set; } //matches UnkStruct1.Item + public ushort UnkUshort1 { get; set; } + public ushort UnkUshort2 { get; set; } + public ushort ItemDataCount { get; set; }//count of item data arrays + public ushort ItemDataByteLength { get; set; }//total byte length of ItemDatas plus byte length of ItemDataOffsets + public ushort UnkUshort3 { get; set; } + public uint UnkUint2 { get; set; } = 0; //0 + public uint UnkUint3 { get; set; } = 0; //0 + public float UnkFloat0 { get; set; } + public float UnkFloat1 { get; set; } + public ushort UnkUshort4 { get; set; } //0, 1 + public ushort UnkUshort5 { get; set; } //2, 2050 + public float UnkFloat2 { get; set; } + public uint UnkUint4 { get; set; } = 0; //0 + public uint UnkUint5 { get; set; } = 0; //0 + public ushort[] ItemDataOffsets { get; set; }//byte offsets for following array + public ItemDataStruct[] ItemDatas { get; set; } + + public byte[] Leftovers { get; set; }//should just be leftover padding, TODO: getrid of this + + public uint TotalLength + { + get + { + uint bc = 112; + bc += ItemDataCount*2u; + bc += (uint)(Leftovers?.Length??0); + if (ItemDatas != null) + { + foreach (var u in ItemDatas) + { + bc += u.TotalLength; + } + } + return bc; + } + } + + public void Read(ResourceDataReader reader) + { + UnkMatrix = reader.ReadStruct(); + UnkUint1 = reader.ReadUInt32(); //0x56475743 "VGWC" + ItemID = reader.ReadUInt16(); + UnkUshort1 = reader.ReadUInt16(); + UnkUshort2 = reader.ReadUInt16(); + ItemDataCount = reader.ReadUInt16();//count of item data arrays + ItemDataByteLength = reader.ReadUInt16();//total byte length of ItemDatas plus byte length of ItemDataOffsets + UnkUshort3 = reader.ReadUInt16(); + UnkUint2 = reader.ReadUInt32();//0 + UnkUint3 = reader.ReadUInt32();//0 + UnkFloat0 = reader.ReadSingle(); + UnkFloat1 = reader.ReadSingle(); + UnkUshort4 = reader.ReadUInt16();//0, 1 + UnkUshort5 = reader.ReadUInt16();//2, 2050 + UnkFloat2 = reader.ReadSingle(); + UnkUint4 = reader.ReadUInt32();//0 + UnkUint5 = reader.ReadUInt32();//0 + + + if (ItemDataByteLength != 0)//sometimes this is 0 and UnkUshort3>0, which is weird + { + ItemDataOffsets = reader.ReadStructs(ItemDataCount);//byte offsets for following array + + long coffset = 0; + ItemDatas = new ItemDataStruct[ItemDataCount]; + for (int i = 0; i < ItemDataCount; i++) + { + var toffset = ItemDataOffsets[i]; + var cbrem = toffset - coffset; + if (cbrem > 0) + { + var leftovers = reader.ReadBytes((int)cbrem); + if (i > 0) + { + ItemDatas[i - 1].Leftovers = leftovers; + } + else + { } + coffset += cbrem; + } + else if (cbrem < 0) + { } + + var rpos = reader.Position; + var u = new ItemDataStruct(); + u.Read(reader); + ItemDatas[i] = u; + coffset += reader.Position - rpos; + } + + } + else + { } + + + if ((UnkUint2 != 0) || (UnkUint3 != 0) || (UnkUint4 != 0) || (UnkUint5 != 0)) + { } + if ((UnkUshort4 != 0) && (UnkUshort4 != 1)) //1 in carbonrs.yft, policeb.yft, vader.yft + { } + if ((UnkUshort5 != 2) && (UnkUshort5 != 2050)) //2050 in cablecar.yft, submersible2.yft + { } + + } + public void Write(ResourceDataWriter writer) + { + writer.Write(UnkMatrix); + writer.Write(UnkUint1); + writer.Write(ItemID); + writer.Write(UnkUshort1); + writer.Write(UnkUshort2); + writer.Write(ItemDataCount); + writer.Write(ItemDataByteLength); + writer.Write(UnkUshort3); + writer.Write(UnkUint2); + writer.Write(UnkUint3); + writer.Write(UnkFloat0); + writer.Write(UnkFloat1); + writer.Write(UnkUshort4); + writer.Write(UnkUshort5); + writer.Write(UnkFloat2); + writer.Write(UnkUint4); + writer.Write(UnkUint5); + writer.WriteStructs(ItemDataOffsets); + + if (ItemDatas != null) + { + foreach (var ud in ItemDatas) + { + ud.Write(writer); + } + } + + if (Leftovers != null) + { + writer.Write(Leftovers); + } + + } + + public override string ToString() + { + return ItemID.ToString() + ": " + UnkUshort1.ToString() + ": " + UnkUshort2.ToString() + ": " + ItemDataCount.ToString() + ": " + ItemDataByteLength.ToString() + ": " + UnkUshort3.ToString(); + } + } + [TypeConverter(typeof(ExpandableObjectConverter))] public class ItemDataStruct + { + public byte UnkByte0 { get; set; } + public byte UnkByte1 { get; set; } + public byte[] UnkBytes { get; set; } + public byte[] Leftovers { get; set; }//still contains some data. how to read it properly? TODO: getrid of this + + public uint TotalLength + { + get + { + uint bc = 2; + bc += (uint)(UnkBytes?.Length ?? 0); + bc += (uint)(Leftovers?.Length ?? 0); + return bc; + } + } + + public void Read(ResourceDataReader reader) + { + UnkByte0 = reader.ReadByte();//start? + UnkByte1 = reader.ReadByte();//end? + + int n = (UnkByte1 - UnkByte0) + 2; + if (n > 0) + { + UnkBytes = reader.ReadBytes(n); + } + else if (n < 0) + { } + + } + public void Write(ResourceDataWriter writer) + { + writer.Write(UnkByte0); + writer.Write(UnkByte1); + + if (UnkBytes != null) + { + writer.Write(UnkBytes); + } + if (Leftovers != null) + { + writer.Write(Leftovers); + } + } + + public override string ToString() + { + return UnkByte0.ToString() + ": " + UnkByte1.ToString(); + } + } + + // structure data - public uint Unknown_0h { get; set; } // 0x56475748 - public uint Unknown_4h { get; set; } + public uint Unknown_0h { get; set; } = 0x56475748; // "VGWH" ...vehicle glass window H..? + public ushort Unknown_4h { get; set; } = 112;// = length of item headers + public ushort ItemCount { get; set; } public uint TotalLength { get; set; } - public uint Unknown_Ch { get; set; } - public byte[] Data { get; set; } + public ItemOffsetStruct[] ItemOffsets { get; set; } + public uint UnkUint0 { get; set; } = 0; + public ItemStruct[] Items { get; set; } + + public byte[] Leftovers { get; set; } //leftover (unparsed) data, should just be padding. TODO: getrid of this! + /// /// Reads the data-block from a stream. @@ -2041,11 +2222,62 @@ namespace CodeWalker.GameFiles public override void Read(ResourceDataReader reader, params object[] parameters) { // read structure data - this.Unknown_0h = reader.ReadUInt32(); - this.Unknown_4h = reader.ReadUInt32(); - this.TotalLength = reader.ReadUInt32(); - this.Unknown_Ch = reader.ReadUInt32(); - this.Data = reader.ReadBytes((int)TotalLength - 16); + Unknown_0h = reader.ReadUInt32(); // "VGWH" ...vehicle glass window H..? + Unknown_4h = reader.ReadUInt16(); //112 = length of item headers + ItemCount = reader.ReadUInt16(); + TotalLength = reader.ReadUInt32(); + ItemOffsets = reader.ReadStructs(ItemCount + (ItemCount & 1u)); //offsets in here start at just after UnkUint0 + UnkUint0 = reader.ReadUInt32();//0 + + long coffset = 16 + ItemOffsets.Length*8; + + Items = new ItemStruct[ItemCount]; + for (int i = 0; i < ItemCount; i++) + { + var us1 = ItemOffsets[i]; + var cbrem = us1.Offset - coffset; + if (cbrem > 0) + { + var leftovers = reader.ReadBytes((int)cbrem); + if (i > 0) + { + Items[i - 1].Leftovers = leftovers; + } + else + { } + coffset += cbrem; + } + else if (cbrem < 0) + { } + + var rpos = reader.Position; + var u = new ItemStruct(); + u.Read(reader); + Items[i] = u; + coffset += reader.Position - rpos; + } + + var leftover = (int)(TotalLength - coffset); + if (leftover > 0) + { + Leftovers = reader.ReadBytes(leftover); + if (ItemCount > 0) + { + Items[ItemCount - 1].Leftovers = Leftovers; + Leftovers = null;//hackity hack + } + else + { } + } + else if (leftover < 0) + { } + + + if (Unknown_4h != 112) + { } + if (UnkUint0 != 0) + { } + } /// @@ -2053,14 +2285,35 @@ namespace CodeWalker.GameFiles /// public override void Write(ResourceDataWriter writer, params object[] parameters) { - TotalLength = (uint)(Data?.Length ?? 0) + 16; + long bc = 16; + bc += ItemOffsets.Length*8; + foreach (var ud2 in Items) + { + bc += ud2.TotalLength; + } + bc += (uint)(Leftovers?.Length ?? 0); + + TotalLength = (uint)bc; // write structure data writer.Write(this.Unknown_0h); writer.Write(this.Unknown_4h); + writer.Write(this.ItemCount); writer.Write(this.TotalLength); - writer.Write(this.Unknown_Ch); - writer.Write(Data); + + + writer.WriteStructs(ItemOffsets); + writer.Write(UnkUint0); + + foreach (var ud2 in Items) + { + ud2.Write(writer); + } + + if (Leftovers != null) + { + writer.Write(Leftovers); + } } } diff --git a/CodeWalker.Core/World/Scenarios.cs b/CodeWalker.Core/World/Scenarios.cs index db5eefc..04b9bc1 100644 --- a/CodeWalker.Core/World/Scenarios.cs +++ b/CodeWalker.Core/World/Scenarios.cs @@ -492,7 +492,7 @@ namespace CodeWalker.World byte cr2 = (v2.NotFirst) ? (byte)255 : (byte)0; byte cg = 0;// (chain._Data.Unk_1156691834 > 1) ? (byte)255 : (byte)0; //cg = ((v1.Unk1 != 0) || (v2.Unk1 != 0)) ? (byte)255 : (byte)0; - //cg = (edge.Action == Unk_3609807418.Unk_7865678) ? (byte)255 : (byte)0; + //cg = (edge.Action == CScenarioChainingEdge__eAction.Unk_7865678) ? (byte)255 : (byte)0; //cg = ((v1.UnkValTest != 0) || (v2.UnkValTest != 0)) ? (byte)255 : (byte)0; byte cb1 = (byte)(255 - cr1); diff --git a/Project/Panels/EditScenarioNodePanel.cs b/Project/Panels/EditScenarioNodePanel.cs index 2bb49ca..1acd341 100644 --- a/Project/Panels/EditScenarioNodePanel.cs +++ b/Project/Panels/EditScenarioNodePanel.cs @@ -186,32 +186,32 @@ namespace CodeWalker.Project.Panels ScenarioChainEdgeActionComboBox.Items.Clear(); - ScenarioChainEdgeActionComboBox.Items.Add(Unk_3609807418.Move); - ScenarioChainEdgeActionComboBox.Items.Add(Unk_3609807418.Unk_7865678); - ScenarioChainEdgeActionComboBox.Items.Add(Unk_3609807418.MoveFollowMaster); + ScenarioChainEdgeActionComboBox.Items.Add(CScenarioChainingEdge__eAction.Move); + ScenarioChainEdgeActionComboBox.Items.Add(CScenarioChainingEdge__eAction.Unk_7865678); + ScenarioChainEdgeActionComboBox.Items.Add(CScenarioChainingEdge__eAction.MoveFollowMaster); ScenarioChainEdgeNavModeComboBox.Items.Clear(); - ScenarioChainEdgeNavModeComboBox.Items.Add(Unk_3971773454.Direct); - ScenarioChainEdgeNavModeComboBox.Items.Add(Unk_3971773454.NavMesh); - ScenarioChainEdgeNavModeComboBox.Items.Add(Unk_3971773454.Roads); + ScenarioChainEdgeNavModeComboBox.Items.Add(CScenarioChainingEdge__eNavMode.Direct); + ScenarioChainEdgeNavModeComboBox.Items.Add(CScenarioChainingEdge__eNavMode.NavMesh); + ScenarioChainEdgeNavModeComboBox.Items.Add(CScenarioChainingEdge__eNavMode.Roads); ScenarioChainEdgeNavSpeedComboBox.Items.Clear(); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_00_3279574318); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_01_2212923970); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_02_4022799658); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_03_1425672334); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_04_957720931); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_05_3795195414); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_06_2834622009); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_07_1876554076); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_08_698543797); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_09_1544199634); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_10_2725613303); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_11_4033265820); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_12_3054809929); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_13_3911005380); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_14_3717649022); - ScenarioChainEdgeNavSpeedComboBox.Items.Add(Unk_941086046.Unk_15_3356026130); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_00_3279574318); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_01_2212923970); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_02_4022799658); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_03_1425672334); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_04_957720931); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_05_3795195414); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_06_2834622009); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_07_1876554076); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_08_698543797); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_09_1544199634); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_10_2725613303); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_11_4033265820); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_12_3054809929); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_13_3911005380); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_14_3717649022); + ScenarioChainEdgeNavSpeedComboBox.Items.Add(CScenarioChainingEdge__eNavSpeed.Unk_15_3356026130); } @@ -1896,7 +1896,7 @@ namespace CodeWalker.Project.Panels { if (populatingui) return; if (CurrentScenarioChainEdge == null) return; - Unk_3609807418 v = (Unk_3609807418)ScenarioChainEdgeActionComboBox.SelectedItem; + CScenarioChainingEdge__eAction v = (CScenarioChainingEdge__eAction)ScenarioChainEdgeActionComboBox.SelectedItem; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioChainEdge.Action != v) @@ -1911,7 +1911,7 @@ namespace CodeWalker.Project.Panels { if (populatingui) return; if (CurrentScenarioChainEdge == null) return; - Unk_3971773454 v = (Unk_3971773454)ScenarioChainEdgeNavModeComboBox.SelectedItem; + CScenarioChainingEdge__eNavMode v = (CScenarioChainingEdge__eNavMode)ScenarioChainEdgeNavModeComboBox.SelectedItem; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioChainEdge.NavMode != v) @@ -1926,7 +1926,7 @@ namespace CodeWalker.Project.Panels { if (populatingui) return; if (CurrentScenarioChainEdge == null) return; - Unk_941086046 v = (Unk_941086046)ScenarioChainEdgeNavSpeedComboBox.SelectedItem; + CScenarioChainingEdge__eNavSpeed v = (CScenarioChainingEdge__eNavSpeed)ScenarioChainEdgeNavSpeedComboBox.SelectedItem; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioChainEdge.NavSpeed != v) diff --git a/Project/Panels/GenerateLODLightsPanel.cs b/Project/Panels/GenerateLODLightsPanel.cs index 2f0fc84..ece3fb9 100644 --- a/Project/Panels/GenerateLODLightsPanel.cs +++ b/Project/Panels/GenerateLODLightsPanel.cs @@ -154,7 +154,7 @@ namespace CodeWalker.Project.Panels for (int j = 0; j < skeleton.Bones.Data.Count; j++) { var tbone = skeleton.Bones.Data[j]; - if (tbone.Id == la.BoneId) + if (tbone.Tag == la.BoneId) { boneidx = j; bone = tbone; diff --git a/Project/ProjectForm.cs b/Project/ProjectForm.cs index 31129f6..e65d34e 100644 --- a/Project/ProjectForm.cs +++ b/Project/ProjectForm.cs @@ -4263,9 +4263,9 @@ namespace CodeWalker.Project if (vals[0].StartsWith("X")) continue; Vector3 pos = Vector3.Zero; float dir = 0; - var action = Unk_3609807418.Move; - var navMode = Unk_3971773454.Direct; - var navSpeed = Unk_941086046.Unk_00_3279574318; + var action = CScenarioChainingEdge__eAction.Move; + var navMode = CScenarioChainingEdge__eNavMode.Direct; + var navSpeed = CScenarioChainingEdge__eNavSpeed.Unk_00_3279574318; var stype = new ScenarioTypeRef(defaulttype); var modelset = defaultmodelset; var flags = defaultflags; @@ -4284,15 +4284,15 @@ namespace CodeWalker.Project byte nsb = 0; byte.TryParse(vals[4].Trim(), out nsb); if (nsb > 15) nsb = 15; - navSpeed = (Unk_941086046)nsb; + navSpeed = (CScenarioChainingEdge__eNavSpeed)nsb; } if (vals.Length > 5) { switch (vals[5].Trim()) { - case "Direct": navMode = Unk_3971773454.Direct; break; - case "NavMesh": navMode = Unk_3971773454.NavMesh; break; - case "Roads": navMode = Unk_3971773454.Roads; break; + case "Direct": navMode = CScenarioChainingEdge__eNavMode.Direct; break; + case "NavMesh": navMode = CScenarioChainingEdge__eNavMode.NavMesh; break; + case "Roads": navMode = CScenarioChainingEdge__eNavMode.Roads; break; } } if (vals.Length > 6) diff --git a/Rendering/Renderable.cs b/Rendering/Renderable.cs index 40f9cba..1f9e3f3 100644 --- a/Rendering/Renderable.cs +++ b/Rendering/Renderable.cs @@ -165,10 +165,10 @@ namespace CodeWalker.Rendering if (fd != null) { var frag = fd.OwnerFragment; - var pose = frag?.Unknown_A8h_Data; - if ((pose != null) && (pose.Data != null)) //seems to be the default pose + var pose = frag?.BoneTransforms; + if ((pose != null) && (pose.Items != null)) //seems to be the default pose { - var posebonecount = pose.Data.Length; + var posebonecount = pose.Items.Length; if ((modeltransforms == null))// || (modeltransforms.Length != posebonecount)) { modeltransforms = new Matrix[posebonecount]; @@ -177,7 +177,7 @@ namespace CodeWalker.Rendering var maxbonecount = Math.Min(posebonecount, modelbonecount); for (int i = 0; i < maxbonecount; i++) { - var p = pose.Data[i]; + var p = pose.Items[i]; Vector4 r1 = p.Row1; Vector4 r2 = p.Row2; Vector4 r3 = p.Row3; @@ -260,7 +260,7 @@ namespace CodeWalker.Rendering if (bone != null) { if (ModelBoneLinks == null) ModelBoneLinks = new Dictionary(); - ModelBoneLinks[bone.Id] = model; + ModelBoneLinks[bone.Tag] = model; } } @@ -481,7 +481,7 @@ namespace CodeWalker.Rendering //update model's transform from animated bone RenderableModel bmodel = null; - ModelBoneLinks?.TryGetValue(bone.Id, out bmodel); + ModelBoneLinks?.TryGetValue(bone.Tag, out bmodel); if (bmodel == null)