From 187f8379cd691d945181a5e810a1ed6cb251e575 Mon Sep 17 00:00:00 2001 From: dexy Date: Sun, 13 Jan 2019 17:04:32 +1100 Subject: [PATCH] Vehicle viewer progress --- .../GameFiles/FileTypes/YftFile.cs | 4 +- CodeWalker.Core/GameFiles/GameFileCache.cs | 11 +- .../GameFiles/MetaTypes/Archetype.cs | 17 +- CodeWalker.Core/GameFiles/Resources/Frag.cs | 44 +++-- Forms/ModelForm.cs | 47 +++++ Rendering/Renderer.cs | 121 +++++++++++- Vehicles/VehicleForm.Designer.cs | 165 +++++++++++++--- Vehicles/VehicleForm.cs | 178 ++++++++++++++++-- 8 files changed, 515 insertions(+), 72 deletions(-) diff --git a/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs index 5c2d01b..077f84d 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs @@ -37,9 +37,9 @@ namespace CodeWalker.GameFiles { Fragment.Drawable.Owner = this; } - if (Fragment.Unknown_F8h_Data != null) + if (Fragment.Drawable2 != null) { - Fragment.Unknown_F8h_Data.Owner = this; + Fragment.Drawable2.Owner = this; } Loaded = true; diff --git a/CodeWalker.Core/GameFiles/GameFileCache.cs b/CodeWalker.Core/GameFiles/GameFileCache.cs index 95acf3a..7ba8d7a 100644 --- a/CodeWalker.Core/GameFiles/GameFileCache.cs +++ b/CodeWalker.Core/GameFiles/GameFileCache.cs @@ -1373,6 +1373,8 @@ namespace CodeWalker.GameFiles public void InitStringDicts() { string langstr = "american_rel"; //todo: make this variable? + string langstr2 = "americandlc.rpf"; + string langstr3 = "american.rpf"; if (!DoFullStringIndex) { @@ -1395,7 +1397,8 @@ namespace CodeWalker.GameFiles { foreach (var entry in rpf.AllEntries) { - if (entry.NameLower.EndsWith(".gxt2") && entry.Path.Contains(langstr)) + var p = entry.Path; + if (entry.NameLower.EndsWith(".gxt2") && (p.Contains(langstr)|| p.Contains(langstr2)|| p.Contains(langstr3))) { var gxt2 = RpfMan.GetFile(entry); if (gxt2 != null) @@ -2634,6 +2637,12 @@ namespace CodeWalker.GameFiles diffpsos.Add(fentry.Path); } + if (entry.NameLower == "wantedtuning.ymt") + { } + if (entry.NameLower == "popgroups.ymt") + { } + + } } } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/Archetype.cs b/CodeWalker.Core/GameFiles/MetaTypes/Archetype.cs index 03cb437..6ef6a2e 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/Archetype.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/Archetype.cs @@ -654,16 +654,19 @@ namespace CodeWalker.GameFiles var list = new List(); var mloarch = Owner?.Archetype as MloArchetype; - for (uint i = 0; i < mloarch.entitySets.Length; i++) + if (mloarch?.entitySets != null) { - var entset = mloarch.entitySets[i]; - MloInstanceEntitySet instset = null; - EntitySets.TryGetValue(entset._Data.name, out instset); - if (instset != null) + for (uint i = 0; i < mloarch.entitySets.Length; i++) { - if (instset.Visible) + var entset = mloarch.entitySets[i]; + MloInstanceEntitySet instset = null; + EntitySets.TryGetValue(entset._Data.name, out instset); + if (instset != null) { - list.Add(i); + if (instset.Visible) + { + list.Add(i); + } } } } diff --git a/CodeWalker.Core/GameFiles/Resources/Frag.cs b/CodeWalker.Core/GameFiles/Resources/Frag.cs index 61d9e09..a81db3d 100644 --- a/CodeWalker.Core/GameFiles/Resources/Frag.cs +++ b/CodeWalker.Core/GameFiles/Resources/Frag.cs @@ -96,7 +96,7 @@ namespace CodeWalker.GameFiles public uint Unknown_E8h { get; set; } // 0x00000000 public uint Unknown_ECh { get; set; } // 0x00000000 public ulong PhysicsLODGroupPointer { get; set; } - public ulong Unknown_F8h_Pointer { get; set; } + public ulong Drawable2Pointer { get; set; } public uint Unknown_100h { get; set; } // 0x00000000 public uint Unknown_104h { get; set; } // 0x00000000 public uint Unknown_108h { get; set; } // 0x00000000 @@ -116,7 +116,7 @@ namespace CodeWalker.GameFiles public FragUnknown_F_004 Unknown_A8h_Data { get; set; } public ResourcePointerArray64 Unknown_E0h_Data { get; set; } public FragPhysicsLODGroup PhysicsLODGroup { get; set; } - public FragDrawable Unknown_F8h_Data { get; set; } + public FragDrawable Drawable2 { get; set; } public FragUnknown_F_003 Unknown_120h_Data { get; set; } /// @@ -177,7 +177,7 @@ namespace CodeWalker.GameFiles this.Unknown_E8h = reader.ReadUInt32(); this.Unknown_ECh = reader.ReadUInt32(); this.PhysicsLODGroupPointer = reader.ReadUInt64(); - this.Unknown_F8h_Pointer = reader.ReadUInt64(); + this.Drawable2Pointer = reader.ReadUInt64(); this.Unknown_100h = reader.ReadUInt32(); this.Unknown_104h = reader.ReadUInt32(); this.Unknown_108h = reader.ReadUInt32(); @@ -230,12 +230,12 @@ namespace CodeWalker.GameFiles this.PhysicsLODGroup = reader.ReadBlockAt( this.PhysicsLODGroupPointer // offset ); - this.Unknown_F8h_Data = reader.ReadBlockAt( - this.Unknown_F8h_Pointer // offset + this.Drawable2 = reader.ReadBlockAt( + this.Drawable2Pointer // offset ); - if (this.Unknown_F8h_Data != null) + if (this.Drawable2 != null) { - this.Unknown_F8h_Data.OwnerFragment = this; + this.Drawable2.OwnerFragment = this; } this.Unknown_120h_Data = reader.ReadBlockAt( @@ -283,7 +283,7 @@ namespace CodeWalker.GameFiles //this.anotherCount = (byte)(this.pxxxxx_3data != null ? this.pxxxxx_3data.Count : 0); this.Unknown_E0h_Pointer = (ulong)(this.Unknown_E0h_Data != null ? this.Unknown_E0h_Data.FilePosition : 0); this.PhysicsLODGroupPointer = (ulong)(this.PhysicsLODGroup != null ? this.PhysicsLODGroup.FilePosition : 0); - this.Unknown_F8h_Pointer = (ulong)(this.Unknown_F8h_Data != null ? this.Unknown_F8h_Data.FilePosition : 0); + this.Drawable2Pointer = (ulong)(this.Drawable2 != null ? this.Drawable2.FilePosition : 0); //this.cntxx51a = (ushort)(this.pxxxxx_5data != null ? this.pxxxxx_5data.Count : 0); this.Unknown_120h_Pointer = (ulong)(this.Unknown_120h_Data != null ? this.Unknown_120h_Data.FilePosition : 0); @@ -338,7 +338,7 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_E8h); writer.Write(this.Unknown_ECh); writer.Write(this.PhysicsLODGroupPointer); - writer.Write(this.Unknown_F8h_Pointer); + writer.Write(this.Drawable2Pointer); writer.Write(this.Unknown_100h); writer.Write(this.Unknown_104h); writer.Write(this.Unknown_108h); @@ -362,7 +362,7 @@ namespace CodeWalker.GameFiles 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); - if (Unknown_F8h_Data != null) list.Add(Unknown_F8h_Data); + if (Drawable2 != null) list.Add(Drawable2); if (Unknown_120h_Data != null) list.Add(Unknown_120h_Data); return list.ToArray(); } @@ -2451,6 +2451,14 @@ namespace CodeWalker.GameFiles var child = Children.data_items[i]; child.OwnerFragPhysLod = this; child.OwnerFragPhysIndex = i; + + if ((Groups?.data_items != null) && (i < Groups.data_items.Length)) + { + var group = Groups.data_items[i]; + var str = group.Name.ToString().ToLowerInvariant(); + JenkIndex.Ensure(str); + child.GroupNameHash = JenkHash.GenHash(str); + } } } } @@ -3350,7 +3358,8 @@ namespace CodeWalker.GameFiles public uint Unknown_04h { get; set; } // 0x00000001 public float Unknown_08h { get; set; } public float Unknown_0Ch { get; set; } - public float Unknown_10h { get; set; } + public ushort BoneIndex { get; set; } + public ushort BoneTag { get; set; } public uint Unknown_14h { get; set; } // 0x00000000 public uint Unknown_18h { get; set; } // 0x00000000 public uint Unknown_1Ch { get; set; } // 0x00000000 @@ -3417,6 +3426,7 @@ namespace CodeWalker.GameFiles public FragPhysicsLOD OwnerFragPhysLod { get; set; } public int OwnerFragPhysIndex { get; set; } + public MetaHash GroupNameHash { get; set; } /// /// Reads the data-block from a stream. @@ -3428,7 +3438,8 @@ namespace CodeWalker.GameFiles this.Unknown_04h = reader.ReadUInt32(); this.Unknown_08h = reader.ReadSingle(); this.Unknown_0Ch = reader.ReadSingle(); - this.Unknown_10h = reader.ReadSingle(); + this.BoneIndex = reader.ReadUInt16(); + this.BoneTag = reader.ReadUInt16(); this.Unknown_14h = reader.ReadUInt32(); this.Unknown_18h = reader.ReadUInt32(); this.Unknown_1Ch = reader.ReadUInt32(); @@ -3523,7 +3534,8 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_04h); writer.Write(this.Unknown_08h); writer.Write(this.Unknown_0Ch); - writer.Write(this.Unknown_10h); + writer.Write(this.BoneIndex); + writer.Write(this.BoneTag); writer.Write(this.Unknown_14h); writer.Write(this.Unknown_18h); writer.Write(this.Unknown_1Ch); @@ -3593,6 +3605,12 @@ namespace CodeWalker.GameFiles if (EvtSet != null) list.Add(EvtSet); return list.ToArray(); } + + + public override string ToString() + { + return GroupNameHash.ToString(); + } } [TypeConverter(typeof(ExpandableObjectConverter))] public class FragPhysEvtSet : ResourceSystemBlock { diff --git a/Forms/ModelForm.cs b/Forms/ModelForm.cs index d2aa184..745d8c3 100644 --- a/Forms/ModelForm.cs +++ b/Forms/ModelForm.cs @@ -824,6 +824,30 @@ namespace CodeWalker.Forms AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", false); AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", false); //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false); + + var fdrawable = drawable as FragDrawable; + if (fdrawable != null) + { + var plod1 = fdrawable.OwnerFragment?.PhysicsLODGroup?.PhysicsLOD1; + if ((plod1 != null) && (plod1.Children?.data_items != null)) + { + foreach (var child in plod1.Children.data_items) + { + var cdrwbl = child.Drawable1; + if ((cdrwbl != null) && (cdrwbl.AllModels?.Length > 0)) + { + if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel + + var dname = child.GroupNameHash.ToString(); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsHigh, dname + " - High Detail", true); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsMedium, dname + " - Medium Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsLow, dname + " - Low Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsVeryLow, dname + " - Very Low Detail", false); + } + } + } + } + } } private void UpdateModelsUI(FragType frag) @@ -845,6 +869,29 @@ namespace CodeWalker.Forms AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", false); AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", false); //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false); + + var fdrawable = drawable as FragDrawable; + if (fdrawable != null) + { + var plod1 = fdrawable.OwnerFragment?.PhysicsLODGroup?.PhysicsLOD1; + if ((plod1 != null) && (plod1.Children?.data_items != null)) + { + foreach (var child in plod1.Children.data_items) + { + var cdrwbl = child.Drawable1; + if ((cdrwbl != null) && (cdrwbl.AllModels?.Length > 0)) + { + if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel + + var dname = child.GroupNameHash.ToString(); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsHigh, dname + " - High Detail", true); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsMedium, dname + " - Medium Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsLow, dname + " - Low Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsVeryLow, dname + " - Very Low Detail", false); + } + } + } + } } } private void UpdateModelsUI(Dictionary dict) diff --git a/Rendering/Renderer.cs b/Rendering/Renderer.cs index 1eebd58..a7bf58f 100644 --- a/Rendering/Renderer.cs +++ b/Rendering/Renderer.cs @@ -2211,23 +2211,59 @@ namespace CodeWalker.Rendering RenderDrawable(f.Drawable, arch, ent, txdhash); - if (f.Unknown_F8h_Data != null) //cloth + if (f.Drawable2 != null) //cloth { - RenderDrawable(f.Unknown_F8h_Data, arch, ent, txdhash); + RenderDrawable(f.Drawable2, arch, ent, txdhash); } //vehicle wheels... if ((f.PhysicsLODGroup != null) && (f.PhysicsLODGroup.PhysicsLOD1 != null)) { var pl1 = f.PhysicsLODGroup.PhysicsLOD1; - if ((pl1.Children != null) && (pl1.Children.data_items != null)) + //var groupnames = pl1?.GroupNames?.data_items; + var groups = pl1?.Groups?.data_items; + + FragDrawable wheel_f = null; + FragDrawable wheel_r = null; + + if (pl1.Children?.data_items != null) { for (int i = 0; i < pl1.Children.data_items.Length; i++) { var pch = pl1.Children.data_items[i]; + + //var groupname = pch.GroupNameHash; + //if ((pl1.Groups?.data_items != null) && (i < pl1.Groups.data_items.Length)) + //{ + // //var group = pl1.Groups.data_items[i]; + //} + if ((pch.Drawable1 != null) && (pch.Drawable1.AllModels.Length != 0)) { - RenderDrawable(pch.Drawable1, arch, ent, txdhash); + + switch (pch.BoneTag) + { + case 27922: //wheel_lf + case 26418: //wheel_rf + wheel_f = pch.Drawable1; + break; + case 29921: //wheel_lm1 + case 29922: //wheel_lm2 + case 29923: //wheel_lm3 + case 27902: //wheel_lr + case 5857: //wheel_rm1 + case 5858: //wheel_rm2 + case 5859: //wheel_rm3 + case 26398: //wheel_rr + wheel_r = pch.Drawable1; + break; + default: + + RenderDrawable(pch.Drawable1, arch, ent, txdhash); + + break; + } + } else { } @@ -2238,6 +2274,79 @@ namespace CodeWalker.Rendering else { } } + + if ((wheel_f != null) || (wheel_r != null)) + { + for (int i = 0; i < pl1.Children.data_items.Length; i++) + { + var pch = pl1.Children.data_items[i]; + FragDrawable dwbl = pch.Drawable1; + FragDrawable dwblcopy = null; + switch (pch.BoneTag) + { + case 27922: //wheel_lf + case 26418: //wheel_rf + dwblcopy = wheel_f != null ? wheel_f : wheel_r; + break; + case 29921: //wheel_lm1 + case 29922: //wheel_lm2 + case 29923: //wheel_lm3 + case 27902: //wheel_lr + case 5857: //wheel_rm1 + case 5858: //wheel_rm2 + case 5859: //wheel_rm3 + case 26398: //wheel_rr + dwblcopy = wheel_r != null ? wheel_r : wheel_f; + break; + default: + break; + } + //switch (pch.GroupNameHash) + //{ + // case 3311608449: //wheel_lf + // case 1705452237: //wheel_lm1 + // case 1415282742: //wheel_lm2 + // case 3392433122: //wheel_lm3 + // case 133671269: //wheel_rf + // case 2908525601: //wheel_rm1 + // case 2835549038: //wheel_rm2 + // case 4148013026: //wheel_rm3 + // dwblcopy = wheel_f != null ? wheel_f : wheel_r; + // break; + // case 1695736278: //wheel_lr + // case 1670111368: //wheel_rr + // dwblcopy = wheel_r != null ? wheel_r : wheel_f; + // break; + // default: + // break; + //} + + if (dwblcopy != null) + { + if (dwbl != null) + { + if ((dwbl != dwblcopy) && (dwbl.AllModels.Length == 0)) + { + dwbl.Owner = dwblcopy; + dwbl.AllModels = dwblcopy.AllModels; + dwbl.DrawableModelsHigh = dwblcopy.DrawableModelsHigh; + dwbl.DrawableModelsMedium = dwblcopy.DrawableModelsMedium; + dwbl.DrawableModelsLow = dwblcopy.DrawableModelsLow; + dwbl.DrawableModelsVeryLow = dwblcopy.DrawableModelsVeryLow; + dwbl.VertexDecls = dwblcopy.VertexDecls; + } + + RenderDrawable(dwbl, arch, ent, txdhash); + + } + else + { } + } + else + { } + } + } + } } @@ -2321,9 +2430,9 @@ namespace CodeWalker.Rendering if (fd != null) { var frag = fd.OwnerFragment; - if ((frag != null) && (frag.Unknown_F8h_Data != null)) //cloth... + if ((frag != null) && (frag.Drawable2 != null)) //cloth... { - rndbl = TryGetRenderable(arche, frag.Unknown_F8h_Data); + rndbl = TryGetRenderable(arche, frag.Drawable2); if (rndbl != null) { bool res2 = RenderRenderable(rndbl, arche, entity); diff --git a/Vehicles/VehicleForm.Designer.cs b/Vehicles/VehicleForm.Designer.cs index 2bcf081..dd386e6 100644 --- a/Vehicles/VehicleForm.Designer.cs +++ b/Vehicles/VehicleForm.Designer.cs @@ -37,7 +37,11 @@ this.StatsUpdateTimer = new System.Windows.Forms.Timer(this.components); this.ToolsPanel = new System.Windows.Forms.Panel(); this.ToolsTabControl = new System.Windows.Forms.TabControl(); + this.ToolsVehicleTabPage = new System.Windows.Forms.TabPage(); + this.label3 = new System.Windows.Forms.Label(); + this.VehicleModelComboBox = new System.Windows.Forms.ComboBox(); this.ToolsModelsTabPage = new System.Windows.Forms.TabPage(); + this.ModelsTreeView = new CodeWalker.WinForms.TreeViewFix(); this.ToolsTexturesTabPage = new System.Windows.Forms.TabPage(); this.TextureViewerButton = new System.Windows.Forms.Button(); this.TexturesTreeView = new CodeWalker.WinForms.TreeViewFix(); @@ -71,13 +75,18 @@ this.label14 = new System.Windows.Forms.Label(); this.ToolsPanelHideButton = new System.Windows.Forms.Button(); this.ToolsDragPanel = new System.Windows.Forms.Panel(); - this.ModelsTreeView = new CodeWalker.WinForms.TreeViewFix(); this.ToolsPanelShowButton = new System.Windows.Forms.Button(); this.ConsolePanel = new System.Windows.Forms.Panel(); this.ConsoleTextBox = new CodeWalker.WinForms.TextBoxFix(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.VehicleMakeLabel = new System.Windows.Forms.Label(); + this.VehicleNameLabel = new System.Windows.Forms.Label(); + this.VehicleHighDetailCheckBox = new System.Windows.Forms.CheckBox(); this.StatusStrip.SuspendLayout(); this.ToolsPanel.SuspendLayout(); this.ToolsTabControl.SuspendLayout(); + this.ToolsVehicleTabPage.SuspendLayout(); this.ToolsModelsTabPage.SuspendLayout(); this.ToolsTexturesTabPage.SuspendLayout(); this.ToolsDetailsTabPage.SuspendLayout(); @@ -138,7 +147,7 @@ this.ToolsPanel.Controls.Add(this.ToolsDragPanel); this.ToolsPanel.Location = new System.Drawing.Point(12, 12); this.ToolsPanel.Name = "ToolsPanel"; - this.ToolsPanel.Size = new System.Drawing.Size(233, 666); + this.ToolsPanel.Size = new System.Drawing.Size(252, 666); this.ToolsPanel.TabIndex = 3; this.ToolsPanel.Visible = false; // @@ -147,6 +156,7 @@ this.ToolsTabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.ToolsTabControl.Controls.Add(this.ToolsVehicleTabPage); this.ToolsTabControl.Controls.Add(this.ToolsModelsTabPage); this.ToolsTabControl.Controls.Add(this.ToolsTexturesTabPage); this.ToolsTabControl.Controls.Add(this.ToolsDetailsTabPage); @@ -154,20 +164,73 @@ this.ToolsTabControl.Location = new System.Drawing.Point(2, 30); this.ToolsTabControl.Name = "ToolsTabControl"; this.ToolsTabControl.SelectedIndex = 0; - this.ToolsTabControl.Size = new System.Drawing.Size(228, 633); + this.ToolsTabControl.Size = new System.Drawing.Size(247, 633); this.ToolsTabControl.TabIndex = 1; // + // ToolsVehicleTabPage + // + this.ToolsVehicleTabPage.Controls.Add(this.VehicleHighDetailCheckBox); + this.ToolsVehicleTabPage.Controls.Add(this.VehicleNameLabel); + this.ToolsVehicleTabPage.Controls.Add(this.VehicleMakeLabel); + this.ToolsVehicleTabPage.Controls.Add(this.label5); + this.ToolsVehicleTabPage.Controls.Add(this.label4); + this.ToolsVehicleTabPage.Controls.Add(this.label3); + this.ToolsVehicleTabPage.Controls.Add(this.VehicleModelComboBox); + this.ToolsVehicleTabPage.Location = new System.Drawing.Point(4, 22); + this.ToolsVehicleTabPage.Name = "ToolsVehicleTabPage"; + this.ToolsVehicleTabPage.Size = new System.Drawing.Size(239, 607); + this.ToolsVehicleTabPage.TabIndex = 4; + this.ToolsVehicleTabPage.Text = "Vehicle"; + this.ToolsVehicleTabPage.UseVisualStyleBackColor = true; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(3, 11); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(39, 13); + this.label3.TabIndex = 1; + this.label3.Text = "Model:"; + // + // VehicleModelComboBox + // + this.VehicleModelComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.VehicleModelComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.VehicleModelComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.VehicleModelComboBox.FormattingEnabled = true; + this.VehicleModelComboBox.Location = new System.Drawing.Point(54, 8); + this.VehicleModelComboBox.Name = "VehicleModelComboBox"; + this.VehicleModelComboBox.Size = new System.Drawing.Size(182, 21); + this.VehicleModelComboBox.TabIndex = 0; + this.VehicleModelComboBox.TextChanged += new System.EventHandler(this.VehicleModelComboBox_TextChanged); + // // ToolsModelsTabPage // this.ToolsModelsTabPage.Controls.Add(this.ModelsTreeView); this.ToolsModelsTabPage.Location = new System.Drawing.Point(4, 22); this.ToolsModelsTabPage.Name = "ToolsModelsTabPage"; this.ToolsModelsTabPage.Padding = new System.Windows.Forms.Padding(3); - this.ToolsModelsTabPage.Size = new System.Drawing.Size(220, 607); + this.ToolsModelsTabPage.Size = new System.Drawing.Size(239, 607); this.ToolsModelsTabPage.TabIndex = 0; this.ToolsModelsTabPage.Text = "Models"; this.ToolsModelsTabPage.UseVisualStyleBackColor = true; // + // ModelsTreeView + // + this.ModelsTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.ModelsTreeView.CheckBoxes = true; + this.ModelsTreeView.Location = new System.Drawing.Point(0, 3); + this.ModelsTreeView.Name = "ModelsTreeView"; + this.ModelsTreeView.ShowRootLines = false; + this.ModelsTreeView.Size = new System.Drawing.Size(239, 604); + this.ModelsTreeView.TabIndex = 2; + this.ModelsTreeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.ModelsTreeView_AfterCheck); + this.ModelsTreeView.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.ModelsTreeView_NodeMouseDoubleClick); + this.ModelsTreeView.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.ModelsTreeView_KeyPress); + // // ToolsTexturesTabPage // this.ToolsTexturesTabPage.Controls.Add(this.TextureViewerButton); @@ -175,7 +238,7 @@ this.ToolsTexturesTabPage.Location = new System.Drawing.Point(4, 22); this.ToolsTexturesTabPage.Name = "ToolsTexturesTabPage"; this.ToolsTexturesTabPage.Padding = new System.Windows.Forms.Padding(3); - this.ToolsTexturesTabPage.Size = new System.Drawing.Size(220, 607); + this.ToolsTexturesTabPage.Size = new System.Drawing.Size(239, 607); this.ToolsTexturesTabPage.TabIndex = 1; this.ToolsTexturesTabPage.Text = "Textures"; this.ToolsTexturesTabPage.UseVisualStyleBackColor = true; @@ -198,7 +261,7 @@ this.TexturesTreeView.Location = new System.Drawing.Point(0, 34); this.TexturesTreeView.Name = "TexturesTreeView"; this.TexturesTreeView.ShowRootLines = false; - this.TexturesTreeView.Size = new System.Drawing.Size(220, 573); + this.TexturesTreeView.Size = new System.Drawing.Size(239, 573); this.TexturesTreeView.TabIndex = 1; // // ToolsDetailsTabPage @@ -206,7 +269,7 @@ this.ToolsDetailsTabPage.Controls.Add(this.DetailsPropertyGrid); this.ToolsDetailsTabPage.Location = new System.Drawing.Point(4, 22); this.ToolsDetailsTabPage.Name = "ToolsDetailsTabPage"; - this.ToolsDetailsTabPage.Size = new System.Drawing.Size(220, 607); + this.ToolsDetailsTabPage.Size = new System.Drawing.Size(239, 607); this.ToolsDetailsTabPage.TabIndex = 2; this.ToolsDetailsTabPage.Text = "Details"; this.ToolsDetailsTabPage.UseVisualStyleBackColor = true; @@ -221,7 +284,7 @@ this.DetailsPropertyGrid.Name = "DetailsPropertyGrid"; this.DetailsPropertyGrid.PropertySort = System.Windows.Forms.PropertySort.NoSort; this.DetailsPropertyGrid.ReadOnly = true; - this.DetailsPropertyGrid.Size = new System.Drawing.Size(220, 604); + this.DetailsPropertyGrid.Size = new System.Drawing.Size(239, 604); this.DetailsPropertyGrid.TabIndex = 1; this.DetailsPropertyGrid.ToolbarVisible = false; // @@ -254,7 +317,7 @@ this.ToolsOptionsTabPage.Controls.Add(this.label14); this.ToolsOptionsTabPage.Location = new System.Drawing.Point(4, 22); this.ToolsOptionsTabPage.Name = "ToolsOptionsTabPage"; - this.ToolsOptionsTabPage.Size = new System.Drawing.Size(220, 607); + this.ToolsOptionsTabPage.Size = new System.Drawing.Size(239, 607); this.ToolsOptionsTabPage.TabIndex = 3; this.ToolsOptionsTabPage.Text = "Options"; this.ToolsOptionsTabPage.UseVisualStyleBackColor = true; @@ -310,7 +373,7 @@ this.TimeOfDayTrackBar.Location = new System.Drawing.Point(9, 125); this.TimeOfDayTrackBar.Maximum = 1440; this.TimeOfDayTrackBar.Name = "TimeOfDayTrackBar"; - this.TimeOfDayTrackBar.Size = new System.Drawing.Size(203, 45); + this.TimeOfDayTrackBar.Size = new System.Drawing.Size(222, 45); this.TimeOfDayTrackBar.TabIndex = 6; this.TimeOfDayTrackBar.TickFrequency = 60; this.TimeOfDayTrackBar.Value = 720; @@ -570,7 +633,7 @@ this.ToolsDragPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Right))); this.ToolsDragPanel.Cursor = System.Windows.Forms.Cursors.VSplit; - this.ToolsDragPanel.Location = new System.Drawing.Point(230, 0); + this.ToolsDragPanel.Location = new System.Drawing.Point(249, 0); this.ToolsDragPanel.Name = "ToolsDragPanel"; this.ToolsDragPanel.Size = new System.Drawing.Size(4, 666); this.ToolsDragPanel.TabIndex = 17; @@ -578,21 +641,6 @@ this.ToolsDragPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ToolsDragPanel_MouseMove); this.ToolsDragPanel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ToolsDragPanel_MouseUp); // - // ModelsTreeView - // - this.ModelsTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ModelsTreeView.CheckBoxes = true; - this.ModelsTreeView.Location = new System.Drawing.Point(0, 3); - this.ModelsTreeView.Name = "ModelsTreeView"; - this.ModelsTreeView.ShowRootLines = false; - this.ModelsTreeView.Size = new System.Drawing.Size(220, 604); - this.ModelsTreeView.TabIndex = 2; - this.ModelsTreeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.ModelsTreeView_AfterCheck); - this.ModelsTreeView.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.ModelsTreeView_NodeMouseDoubleClick); - this.ModelsTreeView.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.ModelsTreeView_KeyPress); - // // ToolsPanelShowButton // this.ToolsPanelShowButton.Location = new System.Drawing.Point(15, 15); @@ -609,9 +657,9 @@ | System.Windows.Forms.AnchorStyles.Right))); this.ConsolePanel.BackColor = System.Drawing.SystemColors.Control; this.ConsolePanel.Controls.Add(this.ConsoleTextBox); - this.ConsolePanel.Location = new System.Drawing.Point(252, 577); + this.ConsolePanel.Location = new System.Drawing.Point(271, 577); this.ConsolePanel.Name = "ConsolePanel"; - this.ConsolePanel.Size = new System.Drawing.Size(720, 101); + this.ConsolePanel.Size = new System.Drawing.Size(701, 101); this.ConsolePanel.TabIndex = 5; this.ConsolePanel.Visible = false; // @@ -624,9 +672,58 @@ this.ConsoleTextBox.Multiline = true; this.ConsoleTextBox.Name = "ConsoleTextBox"; this.ConsoleTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.ConsoleTextBox.Size = new System.Drawing.Size(714, 95); + this.ConsoleTextBox.Size = new System.Drawing.Size(695, 95); this.ConsoleTextBox.TabIndex = 0; // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(3, 41); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(37, 13); + this.label4.TabIndex = 2; + this.label4.Text = "Make:"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(3, 63); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(38, 13); + this.label5.TabIndex = 3; + this.label5.Text = "Name:"; + // + // VehicleMakeLabel + // + this.VehicleMakeLabel.AutoSize = true; + this.VehicleMakeLabel.Location = new System.Drawing.Point(51, 41); + this.VehicleMakeLabel.Name = "VehicleMakeLabel"; + this.VehicleMakeLabel.Size = new System.Drawing.Size(10, 13); + this.VehicleMakeLabel.TabIndex = 4; + this.VehicleMakeLabel.Text = "-"; + // + // VehicleNameLabel + // + this.VehicleNameLabel.AutoSize = true; + this.VehicleNameLabel.Location = new System.Drawing.Point(51, 63); + this.VehicleNameLabel.Name = "VehicleNameLabel"; + this.VehicleNameLabel.Size = new System.Drawing.Size(10, 13); + this.VehicleNameLabel.TabIndex = 5; + this.VehicleNameLabel.Text = "-"; + // + // VehicleHighDetailCheckBox + // + this.VehicleHighDetailCheckBox.AutoSize = true; + this.VehicleHighDetailCheckBox.Checked = true; + this.VehicleHighDetailCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.VehicleHighDetailCheckBox.Location = new System.Drawing.Point(54, 90); + this.VehicleHighDetailCheckBox.Name = "VehicleHighDetailCheckBox"; + this.VehicleHighDetailCheckBox.Size = new System.Drawing.Size(120, 17); + this.VehicleHighDetailCheckBox.TabIndex = 6; + this.VehicleHighDetailCheckBox.Text = "High detail fragment"; + this.VehicleHighDetailCheckBox.UseVisualStyleBackColor = true; + this.VehicleHighDetailCheckBox.CheckedChanged += new System.EventHandler(this.VehicleHighDetailCheckBox_CheckedChanged); + // // VehicleForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -652,6 +749,8 @@ this.StatusStrip.PerformLayout(); this.ToolsPanel.ResumeLayout(false); this.ToolsTabControl.ResumeLayout(false); + this.ToolsVehicleTabPage.ResumeLayout(false); + this.ToolsVehicleTabPage.PerformLayout(); this.ToolsModelsTabPage.ResumeLayout(false); this.ToolsTexturesTabPage.ResumeLayout(false); this.ToolsDetailsTabPage.ResumeLayout(false); @@ -712,5 +811,13 @@ private System.Windows.Forms.Button ToolsPanelShowButton; private System.Windows.Forms.Panel ConsolePanel; private WinForms.TextBoxFix ConsoleTextBox; + private System.Windows.Forms.TabPage ToolsVehicleTabPage; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ComboBox VehicleModelComboBox; + private System.Windows.Forms.Label VehicleNameLabel; + private System.Windows.Forms.Label VehicleMakeLabel; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.CheckBox VehicleHighDetailCheckBox; } } \ No newline at end of file diff --git a/Vehicles/VehicleForm.cs b/Vehicles/VehicleForm.cs index 0dcd051..1cb8c08 100644 --- a/Vehicles/VehicleForm.cs +++ b/Vehicles/VehicleForm.cs @@ -75,6 +75,13 @@ namespace CodeWalker.Vehicles + MetaHash SelectedVehicleHash = 0;//base vehicle name hash + MetaHash SelectedModelHash = 0;//yft name hash, can be _hi + VehicleInitData SelectedVehicleInit = null; + YftFile SelectedVehicleYft = null; + + + public VehicleForm() @@ -181,18 +188,8 @@ namespace CodeWalker.Vehicles Renderer.SelectedDrawable = null;// SelectedItem.Drawable; - //if (renderworld) - //{ - // RenderWorld(); - //} - //else if (rendermaps) - //{ - // RenderYmaps(); - //} - //else - //{ - // RenderSingleItem(); - //} + RenderVehicle(); + //UpdateMouseHitsFromRenderer(); //RenderSelection(); @@ -292,12 +289,16 @@ namespace CodeWalker.Vehicles GameFileCache.LoadVehicles = true; GameFileCache.LoadArchetypes = false;//to speed things up a little GameFileCache.BuildExtendedJenkIndex = false;//to speed things up a little + GameFileCache.DoFullStringIndex = true;//to get all global text from DLC... GameFileCache.Init(UpdateStatus, LogError); //UpdateDlcListComboBox(gameFileCache.DlcNameList); //EnableCacheDependentUI(); + UpdateGlobalVehiclesUI(); + + LoadWorld(); @@ -580,6 +581,37 @@ namespace CodeWalker.Vehicles } } + + private void UpdateGlobalVehiclesUI() + { + if (InvokeRequired) + { + BeginInvoke(new Action(() => { UpdateGlobalVehiclesUI(); })); + } + else + { + VehicleModelComboBox.Items.Clear(); + + var vehicles = GameFileCache.VehiclesInitDict.Values.ToList(); + vehicles.Sort((a, b) => { return a.modelName.CompareTo(b.modelName); }); + + foreach (var vehicle in vehicles) + { + VehicleModelComboBox.Items.Add(vehicle.modelName); + } + + if (vehicles.Count > 0) + { + VehicleModelComboBox.SelectedIndex = 0; + } + } + + } + + + + + private void UpdateModelsUI(DrawableBase drawable) { DetailsPropertyGrid.SelectedObject = drawable; @@ -597,10 +629,74 @@ namespace CodeWalker.Vehicles AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", false); AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", false); //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false); + + + var fdrawable = drawable as FragDrawable; + if (fdrawable != null) + { + var plod1 = fdrawable.OwnerFragment?.PhysicsLODGroup?.PhysicsLOD1; + if ((plod1 != null) && (plod1.Children?.data_items != null)) + { + foreach (var child in plod1.Children.data_items) + { + var cdrwbl = child.Drawable1; + if ((cdrwbl != null) && (cdrwbl.AllModels?.Length > 0)) + { + if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel + + var dname = child.GroupNameHash.ToString(); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsHigh, dname + " - High Detail", true); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsMedium, dname + " - Medium Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsLow, dname + " - Low Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsVeryLow, dname + " - Very Low Detail", false); + } + } + } + } + } } - public void LoadModel(YftFile yft) + + + public void LoadVehicle() + { + var modelname = VehicleModelComboBox.Text; + var modelnamel = modelname.ToLowerInvariant(); + MetaHash modelhash = JenkHash.GenHash(modelnamel); + MetaHash modelhashhi = JenkHash.GenHash(modelnamel + "_hi"); + bool hidet = VehicleHighDetailCheckBox.Checked; + var yfthash = hidet ? modelhashhi : modelhash; + + VehicleInitData vid = null; + if (GameFileCache.VehiclesInitDict.TryGetValue(modelhash, out vid)) + { + bool vehiclechange = SelectedVehicleHash != modelhash; + SelectedModelHash = yfthash; + SelectedVehicleHash = modelhash; + SelectedVehicleInit = vid; + SelectedVehicleYft = GameFileCache.GetYft(SelectedModelHash); + while (!SelectedVehicleYft.Loaded) + { + Thread.Sleep(20);//kinda hacky + SelectedVehicleYft = GameFileCache.GetYft(SelectedModelHash); + } + LoadModel(SelectedVehicleYft, vehiclechange); + VehicleMakeLabel.Text = GlobalText.TryGetString(JenkHash.GenHash(vid.vehicleMakeName.ToLower())); + VehicleNameLabel.Text = GlobalText.TryGetString(JenkHash.GenHash(vid.gameName.ToLower())); + } + else + { + SelectedModelHash = 0; + SelectedVehicleHash = 0; + SelectedVehicleInit = null; + SelectedVehicleYft = null; + VehicleMakeLabel.Text = "-"; + VehicleNameLabel.Text = "-"; + } + } + + public void LoadModel(YftFile yft, bool movecamera = true) { if (yft == null) return; @@ -608,7 +704,7 @@ namespace CodeWalker.Vehicles //Yft = yft; var dr = yft.Fragment?.Drawable; - if (dr != null) + if (movecamera && (dr != null)) { MoveCameraToView(dr.BoundingCenter, dr.BoundingSphereRadius); } @@ -792,6 +888,44 @@ namespace CodeWalker.Vehicles + private void RenderVehicle() + { + + YftFile yft = GameFileCache.GetYft(SelectedModelHash); + if (yft != null) + { + if (yft.Loaded) + { + if (yft.Fragment != null) + { + var f = yft.Fragment; + + var txdhash = SelectedVehicleHash;// yft.RpfFileEntry?.ShortNameHash ?? 0; + + var namelower = yft.RpfFileEntry?.GetShortNameLower(); + if (namelower?.EndsWith("_hi") ?? false) + { + txdhash = JenkHash.GenHash(namelower.Substring(0, namelower.Length - 3)); + } + + Archetype arch = null;// TryGetArchetype(hash); + + Renderer.RenderFragment(arch, null, f, txdhash); + + //seldrwbl = f.Drawable; + } + } + } + + } + + + + + + + + private void VehicleForm_Load(object sender, EventArgs e) { Init(); @@ -1275,5 +1409,21 @@ namespace CodeWalker.Vehicles // MessageBox.Show("Couldn't find embedded texture dict."); //} } + + + + private void VehicleModelComboBox_TextChanged(object sender, EventArgs e) + { + if (!GameFileCache.IsInited) return; + + LoadVehicle(); + } + + private void VehicleHighDetailCheckBox_CheckedChanged(object sender, EventArgs e) + { + if (!GameFileCache.IsInited) return; + + LoadVehicle(); + } } }