From 465b21d7ac437f6f212157376fe2d111f91379d7 Mon Sep 17 00:00:00 2001 From: dexy Date: Thu, 7 Nov 2019 23:14:39 +1100 Subject: [PATCH] Peds form progress, playing peds animations and loading some textures --- .../GameFiles/FileTypes/YtdFile.cs | 2 + .../GameFiles/MetaTypes/MetaNames.cs | 5 +- .../GameFiles/MetaTypes/MetaTypes.cs | 48 +- .../GameFiles/MetaTypes/PsoTypes.cs | 4 +- CodeWalker.Core/GameFiles/Resources/Clip.cs | 1 + Peds/PedsForm.Designer.cs | 641 ++++++++++-------- Peds/PedsForm.cs | 296 ++++++-- Rendering/Renderable.cs | 58 +- Rendering/Renderer.cs | 27 +- 9 files changed, 687 insertions(+), 395 deletions(-) diff --git a/CodeWalker.Core/GameFiles/FileTypes/YtdFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YtdFile.cs index ff3ce26..6f52cbf 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YtdFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YtdFile.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 YtdFile : GameFile, PackedFile { public TextureDictionary TextureDict { get; set; } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs b/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs index e844e13..82bc49d 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs @@ -3493,6 +3493,7 @@ namespace CodeWalker.GameFiles SpecialAbilityType = 2011786168, DefaultSpawnPreference = 888587604, numAlternatives = 2806194106, + bHasDrawblVariations = 4086467184, CScenarioChainingEdge__eAction = 3609807418, CScenarioChainingEdge__eNavMode = 3971773454, @@ -3553,13 +3554,13 @@ namespace CodeWalker.GameFiles numAvailProps = 2598445407, numAvailTex = 3371516811, ownsCloth = 2828247905, - aComponentData3 = 3796409423, //is this a collision? it's good enough for now! + aComponentData3 = 3796409423, + aDrawblData3 = 1756136273, bHasTexVariations = 1235281004, - //GranularSound dat54.rel FileName hashes from NotGigo engine_accel = 3748922026, exhaust_accel = 598446449, diff --git a/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs b/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs index 3023cdd..d47a930 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs @@ -1018,7 +1018,7 @@ namespace CodeWalker.GameFiles case MetaName.CPedVariationInfo: return new MetaStructureInfo(MetaName.CPedVariationInfo, 4030871161, 768, 112, new MetaStructureEntryInfo_s(MetaName.bHasTexVariations, 0, MetaStructureEntryDataType.Boolean, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)4086467184, 1, MetaStructureEntryDataType.Boolean, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bHasDrawblVariations, 1, MetaStructureEntryDataType.Boolean, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)911147899, 2, MetaStructureEntryDataType.Boolean, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)315291935, 3, MetaStructureEntryDataType.Boolean, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), @@ -1036,7 +1036,7 @@ namespace CodeWalker.GameFiles return new MetaStructureInfo((MetaName)3538495220, 2024084511, 768, 24, new MetaStructureEntryInfo_s(MetaName.numAvailTex, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)1535046754), - new MetaStructureEntryInfo_s((MetaName)1756136273, 8, MetaStructureEntryDataType.Array, 0, 1, 0) + new MetaStructureEntryInfo_s(MetaName.aDrawblData3, 8, MetaStructureEntryDataType.Array, 0, 1, 0) ); case (MetaName)2236980467: return new MetaStructureInfo((MetaName)2236980467, 508935687, 0, 24, @@ -5993,7 +5993,7 @@ namespace CodeWalker.GameFiles public struct CPedVariationInfo : IPsoSwapEnd //112 bytes, Key:4030871161 //COMPONENT PEDS YMT ROOT - in componentpeds .rpf's { public byte bHasTexVariations { get; set; } //0 0: Boolean: 0: bHasTexVariations - public byte Unk_4086467184 { get; set; } //1 1: Boolean: 0: 4086467184 + public byte bHasDrawblVariations { get; set; } //1 1: Boolean: 0: bHasDrawblVariations public byte Unk_911147899 { get; set; } //2 2: Boolean: 0: 911147899 public byte Unk_315291935 { get; set; } //3 3: Boolean: 0: 315291935 public ArrayOfBytes12 Unk_2996560424 { get; set; } //4 4: ArrayOfBytes: 12: 2996560424 @@ -6019,7 +6019,7 @@ namespace CodeWalker.GameFiles public CPedVariationInfo Data { get { return _Data; } } public byte[] ComponentIndices { get; set; } - public MUnk_3538495220[] ComponentVariations { get; set; } + public MUnk_3538495220[] ComponentData3 { get; set; } public MCPedSelectionSet[] SelectionSets { get; set; } public MCComponentInfo[] CompInfos { get; set; } public MCPedPropInfo PropInfo { get; set; } @@ -6040,13 +6040,13 @@ namespace CodeWalker.GameFiles ComponentIndices = data.Unk_2996560424.GetArray(); - var vComponentVariations = MetaTypes.ConvertDataArray(meta, (MetaName)3538495220, _Data.aComponentData3); - if (vComponentVariations != null) + var aComponentData3 = MetaTypes.ConvertDataArray(meta, (MetaName)3538495220, _Data.aComponentData3); + if (aComponentData3 != null) { - ComponentVariations = new MUnk_3538495220[vComponentVariations.Length]; - for (int i = 0; i < vComponentVariations.Length; i++) + ComponentData3 = new MUnk_3538495220[aComponentData3.Length]; + for (int i = 0; i < aComponentData3.Length; i++) { - ComponentVariations[i] = new MUnk_3538495220(meta, vComponentVariations[i], this); + ComponentData3[i] = new MUnk_3538495220(meta, aComponentData3[i], this); } } @@ -6077,14 +6077,14 @@ namespace CodeWalker.GameFiles for (int i = 0; i < 12; i++) //set the component type indices on all the component variants, for them to use { var compInd = ComponentIndices[i]; - if ((compInd > 0) && (compInd < ComponentVariations?.Length)) + if ((compInd > 0) && (compInd < ComponentData3?.Length)) { - var compvar = ComponentVariations[compInd]; + var compvar = ComponentData3[compInd]; compvar.ComponentType = i; - if (compvar.Variations != null) + if (compvar.DrawblData3 != null) { - foreach (var cvp in compvar.Variations) + foreach (var cvp in compvar.DrawblData3) { cvp.ComponentType = i; //cvp.GetDrawableName();//testing @@ -6108,13 +6108,13 @@ namespace CodeWalker.GameFiles } - public MUnk_3538495220 GetVariations(int componentType) + public MUnk_3538495220 GetComponentData(int componentType) { if ((componentType < 0) || (componentType > 11)) return null; if (ComponentIndices == null) return null; var index = ComponentIndices[componentType]; - if (index > ComponentVariations?.Length) return null; - return ComponentVariations[index]; + if (index > ComponentData3?.Length) return null; + return ComponentData3[index]; } } @@ -6125,7 +6125,7 @@ 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_1756136273 { get; set; } //8 8: Array: 0: 1756136273 {0: Structure: 1535046754: 256} + public Array_Structure aDrawblData3 { get; set; } //8 8: Array: 0: aDrawblData3 {0: Structure: 1535046754: 256} } public class MUnk_3538495220 : MetaWrapper { @@ -6135,7 +6135,7 @@ namespace CodeWalker.GameFiles public Unk_3538495220 Data { get { return _Data; } } - public MUnk_1535046754[] Variations { get; set; } + public MUnk_1535046754[] DrawblData3 { get; set; } public int ComponentType { get; set; } = 0; public static string[] ComponentTypeNames { get; } = @@ -6166,13 +6166,13 @@ namespace CodeWalker.GameFiles private void Init(Meta meta) { - var vVariations = MetaTypes.ConvertDataArray(meta, (MetaName)1535046754, _Data.Unk_1756136273); - if (vVariations != null) + var aDrawblData3 = MetaTypes.ConvertDataArray(meta, (MetaName)1535046754, _Data.aDrawblData3); + if (aDrawblData3 != null) { - Variations = new MUnk_1535046754[vVariations.Length]; - for (int i = 0; i < vVariations.Length; i++) + DrawblData3 = new MUnk_1535046754[aDrawblData3.Length]; + for (int i = 0; i < aDrawblData3.Length; i++) { - Variations[i] = new MUnk_1535046754(meta, vVariations[i], this, i); + DrawblData3[i] = new MUnk_1535046754(meta, aDrawblData3[i], this, i); } } } @@ -6192,7 +6192,7 @@ namespace CodeWalker.GameFiles public override string ToString() { string r = (ComponentType < 12) ? ComponentTypeNames[ComponentType] : "error"; - return r + " : " + Variations?.Length.ToString() ?? base.ToString(); + return r + " : " + DrawblData3?.Length.ToString() ?? base.ToString(); } } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs index fd99cc9..5330cbf 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs @@ -13213,7 +13213,7 @@ namespace CodeWalker.GameFiles case MetaName.CPedVariationInfo: return new PsoStructureInfo(MetaName.CPedVariationInfo, 0, 0, 112, new PsoStructureEntryInfo(MetaName.bHasTexVariations, PsoDataType.Bool, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)4086467184, PsoDataType.Bool, 1, 0, 0), + new PsoStructureEntryInfo(MetaName.bHasDrawblVariations, PsoDataType.Bool, 1, 0, 0), new PsoStructureEntryInfo((MetaName)911147899, PsoDataType.Bool, 2, 0, 0), new PsoStructureEntryInfo((MetaName)315291935, PsoDataType.Bool, 3, 0, 0), new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), @@ -13239,7 +13239,7 @@ namespace CodeWalker.GameFiles return new PsoStructureInfo((MetaName)3538495220, 0, 0, 24, new PsoStructureEntryInfo(MetaName.numAvailTex, PsoDataType.UByte, 0, 0, 0), new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1535046754), - new PsoStructureEntryInfo((MetaName)1756136273, PsoDataType.Array, 8, 0, (MetaName)1) + new PsoStructureEntryInfo(MetaName.aDrawblData3, PsoDataType.Array, 8, 0, (MetaName)1) ); case (MetaName)1535046754: return new PsoStructureInfo((MetaName)1535046754, 0, 0, 48, diff --git a/CodeWalker.Core/GameFiles/Resources/Clip.cs b/CodeWalker.Core/GameFiles/Resources/Clip.cs index fa8e4ab..0c2b81f 100644 --- a/CodeWalker.Core/GameFiles/Resources/Clip.cs +++ b/CodeWalker.Core/GameFiles/Resources/Clip.cs @@ -749,6 +749,7 @@ namespace CodeWalker.GameFiles public Vector4 EvaluateVector(int frame) { if (Channels == null) return Vector4.Zero; + if (IsType7Quat) return EvaluateQuaternion(frame).ToVector4(); var v = Vector4.Zero; int c = 0; for (int i = 0; i < Channels.Length; i++) diff --git a/Peds/PedsForm.Designer.cs b/Peds/PedsForm.Designer.cs index e7a0ea4..a54a0a3 100644 --- a/Peds/PedsForm.Designer.cs +++ b/Peds/PedsForm.Designer.cs @@ -76,33 +76,38 @@ this.PedNameComboBox = new System.Windows.Forms.ComboBox(); this.StatsUpdateTimer = new System.Windows.Forms.Timer(this.components); this.ToolsPedTabPage = new System.Windows.Forms.TabPage(); - this.ToolsTabControl = new System.Windows.Forms.TabControl(); - this.ToolsPanel = new System.Windows.Forms.Panel(); - this.label4 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.CompHeadComboBox = new System.Windows.Forms.ComboBox(); - this.label6 = new System.Windows.Forms.Label(); - this.CompBerdComboBox = new System.Windows.Forms.ComboBox(); - this.label7 = new System.Windows.Forms.Label(); - this.CompHairComboBox = new System.Windows.Forms.ComboBox(); - this.label8 = new System.Windows.Forms.Label(); - this.CompUpprComboBox = new System.Windows.Forms.ComboBox(); - this.label9 = new System.Windows.Forms.Label(); - this.CompLowrComboBox = new System.Windows.Forms.ComboBox(); - this.label12 = new System.Windows.Forms.Label(); - this.CompHandComboBox = new System.Windows.Forms.ComboBox(); - this.label13 = new System.Windows.Forms.Label(); - this.CompFeetComboBox = new System.Windows.Forms.ComboBox(); - this.label15 = new System.Windows.Forms.Label(); - this.CompTeefComboBox = new System.Windows.Forms.ComboBox(); - this.label16 = new System.Windows.Forms.Label(); - this.CompAccsComboBox = new System.Windows.Forms.ComboBox(); - this.label17 = new System.Windows.Forms.Label(); - this.CompTaskComboBox = new System.Windows.Forms.ComboBox(); - this.label18 = new System.Windows.Forms.Label(); - this.CompDeclComboBox = new System.Windows.Forms.ComboBox(); this.label20 = new System.Windows.Forms.Label(); this.CompJbibComboBox = new System.Windows.Forms.ComboBox(); + this.label18 = new System.Windows.Forms.Label(); + this.CompDeclComboBox = new System.Windows.Forms.ComboBox(); + this.label17 = new System.Windows.Forms.Label(); + this.CompTaskComboBox = new System.Windows.Forms.ComboBox(); + this.label16 = new System.Windows.Forms.Label(); + this.CompAccsComboBox = new System.Windows.Forms.ComboBox(); + this.label15 = new System.Windows.Forms.Label(); + this.CompTeefComboBox = new System.Windows.Forms.ComboBox(); + this.label13 = new System.Windows.Forms.Label(); + this.CompFeetComboBox = new System.Windows.Forms.ComboBox(); + this.label12 = new System.Windows.Forms.Label(); + this.CompHandComboBox = new System.Windows.Forms.ComboBox(); + this.label9 = new System.Windows.Forms.Label(); + this.CompLowrComboBox = new System.Windows.Forms.ComboBox(); + this.label8 = new System.Windows.Forms.Label(); + this.CompUpprComboBox = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.CompHairComboBox = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.CompBerdComboBox = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.CompHeadComboBox = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.ToolsTabControl = new System.Windows.Forms.TabControl(); + this.ToolsPanel = new System.Windows.Forms.Panel(); + this.label21 = new System.Windows.Forms.Label(); + this.ClipDictComboBox = new System.Windows.Forms.ComboBox(); + this.label22 = new System.Windows.Forms.Label(); + this.ClipComboBox = new System.Windows.Forms.ComboBox(); + this.label23 = new System.Windows.Forms.Label(); this.ConsolePanel.SuspendLayout(); this.ToolsOptionsTabPage.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.TimeOfDayTrackBar)).BeginInit(); @@ -651,6 +656,11 @@ // // ToolsPedTabPage // + this.ToolsPedTabPage.Controls.Add(this.label23); + this.ToolsPedTabPage.Controls.Add(this.label22); + this.ToolsPedTabPage.Controls.Add(this.ClipComboBox); + this.ToolsPedTabPage.Controls.Add(this.label21); + this.ToolsPedTabPage.Controls.Add(this.ClipDictComboBox); this.ToolsPedTabPage.Controls.Add(this.label20); this.ToolsPedTabPage.Controls.Add(this.CompJbibComboBox); this.ToolsPedTabPage.Controls.Add(this.label18); @@ -685,6 +695,279 @@ this.ToolsPedTabPage.Text = "Ped"; this.ToolsPedTabPage.UseVisualStyleBackColor = true; // + // label20 + // + this.label20.AutoSize = true; + this.label20.Location = new System.Drawing.Point(22, 373); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(29, 13); + this.label20.TabIndex = 26; + this.label20.Text = "Jbib:"; + // + // CompJbibComboBox + // + this.CompJbibComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompJbibComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompJbibComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompJbibComboBox.FormattingEnabled = true; + this.CompJbibComboBox.Location = new System.Drawing.Point(54, 370); + this.CompJbibComboBox.Name = "CompJbibComboBox"; + this.CompJbibComboBox.Size = new System.Drawing.Size(182, 21); + this.CompJbibComboBox.TabIndex = 25; + this.CompJbibComboBox.SelectedIndexChanged += new System.EventHandler(this.CompJbibComboBox_SelectedIndexChanged); + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Location = new System.Drawing.Point(19, 346); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(32, 13); + this.label18.TabIndex = 24; + this.label18.Text = "Decl:"; + // + // CompDeclComboBox + // + this.CompDeclComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompDeclComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompDeclComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompDeclComboBox.FormattingEnabled = true; + this.CompDeclComboBox.Location = new System.Drawing.Point(54, 343); + this.CompDeclComboBox.Name = "CompDeclComboBox"; + this.CompDeclComboBox.Size = new System.Drawing.Size(182, 21); + this.CompDeclComboBox.TabIndex = 23; + this.CompDeclComboBox.SelectedIndexChanged += new System.EventHandler(this.CompDeclComboBox_SelectedIndexChanged); + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(17, 319); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(34, 13); + this.label17.TabIndex = 22; + this.label17.Text = "Task:"; + // + // CompTaskComboBox + // + this.CompTaskComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompTaskComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompTaskComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompTaskComboBox.FormattingEnabled = true; + this.CompTaskComboBox.Location = new System.Drawing.Point(54, 316); + this.CompTaskComboBox.Name = "CompTaskComboBox"; + this.CompTaskComboBox.Size = new System.Drawing.Size(182, 21); + this.CompTaskComboBox.TabIndex = 21; + this.CompTaskComboBox.SelectedIndexChanged += new System.EventHandler(this.CompTaskComboBox_SelectedIndexChanged); + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(17, 292); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(34, 13); + this.label16.TabIndex = 20; + this.label16.Text = "Accs:"; + // + // CompAccsComboBox + // + this.CompAccsComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompAccsComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompAccsComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompAccsComboBox.FormattingEnabled = true; + this.CompAccsComboBox.Location = new System.Drawing.Point(54, 289); + this.CompAccsComboBox.Name = "CompAccsComboBox"; + this.CompAccsComboBox.Size = new System.Drawing.Size(182, 21); + this.CompAccsComboBox.TabIndex = 19; + this.CompAccsComboBox.SelectedIndexChanged += new System.EventHandler(this.CompAccsComboBox_SelectedIndexChanged); + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(19, 265); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(32, 13); + this.label15.TabIndex = 18; + this.label15.Text = "Teef:"; + // + // CompTeefComboBox + // + this.CompTeefComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompTeefComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompTeefComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompTeefComboBox.FormattingEnabled = true; + this.CompTeefComboBox.Location = new System.Drawing.Point(54, 262); + this.CompTeefComboBox.Name = "CompTeefComboBox"; + this.CompTeefComboBox.Size = new System.Drawing.Size(182, 21); + this.CompTeefComboBox.TabIndex = 17; + this.CompTeefComboBox.SelectedIndexChanged += new System.EventHandler(this.CompTeefComboBox_SelectedIndexChanged); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(20, 238); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(31, 13); + this.label13.TabIndex = 16; + this.label13.Text = "Feet:"; + // + // CompFeetComboBox + // + this.CompFeetComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompFeetComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompFeetComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompFeetComboBox.FormattingEnabled = true; + this.CompFeetComboBox.Location = new System.Drawing.Point(54, 235); + this.CompFeetComboBox.Name = "CompFeetComboBox"; + this.CompFeetComboBox.Size = new System.Drawing.Size(182, 21); + this.CompFeetComboBox.TabIndex = 15; + this.CompFeetComboBox.SelectedIndexChanged += new System.EventHandler(this.CompFeetComboBox_SelectedIndexChanged); + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(15, 211); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(36, 13); + this.label12.TabIndex = 14; + this.label12.Text = "Hand:"; + // + // CompHandComboBox + // + this.CompHandComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompHandComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompHandComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompHandComboBox.FormattingEnabled = true; + this.CompHandComboBox.Location = new System.Drawing.Point(54, 208); + this.CompHandComboBox.Name = "CompHandComboBox"; + this.CompHandComboBox.Size = new System.Drawing.Size(182, 21); + this.CompHandComboBox.TabIndex = 13; + this.CompHandComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHandComboBox_SelectedIndexChanged); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(18, 184); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(33, 13); + this.label9.TabIndex = 12; + this.label9.Text = "Lowr:"; + // + // CompLowrComboBox + // + this.CompLowrComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompLowrComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompLowrComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompLowrComboBox.FormattingEnabled = true; + this.CompLowrComboBox.Location = new System.Drawing.Point(54, 181); + this.CompLowrComboBox.Name = "CompLowrComboBox"; + this.CompLowrComboBox.Size = new System.Drawing.Size(182, 21); + this.CompLowrComboBox.TabIndex = 11; + this.CompLowrComboBox.SelectedIndexChanged += new System.EventHandler(this.CompLowrComboBox_SelectedIndexChanged); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(18, 157); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(33, 13); + this.label8.TabIndex = 10; + this.label8.Text = "Uppr:"; + // + // CompUpprComboBox + // + this.CompUpprComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompUpprComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompUpprComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompUpprComboBox.FormattingEnabled = true; + this.CompUpprComboBox.Location = new System.Drawing.Point(54, 154); + this.CompUpprComboBox.Name = "CompUpprComboBox"; + this.CompUpprComboBox.Size = new System.Drawing.Size(182, 21); + this.CompUpprComboBox.TabIndex = 9; + this.CompUpprComboBox.SelectedIndexChanged += new System.EventHandler(this.CompUpprComboBox_SelectedIndexChanged); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(22, 130); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(29, 13); + this.label7.TabIndex = 8; + this.label7.Text = "Hair:"; + // + // CompHairComboBox + // + this.CompHairComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompHairComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompHairComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompHairComboBox.FormattingEnabled = true; + this.CompHairComboBox.Location = new System.Drawing.Point(54, 127); + this.CompHairComboBox.Name = "CompHairComboBox"; + this.CompHairComboBox.Size = new System.Drawing.Size(182, 21); + this.CompHairComboBox.TabIndex = 7; + this.CompHairComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHairComboBox_SelectedIndexChanged); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(19, 103); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(32, 13); + this.label6.TabIndex = 6; + this.label6.Text = "Berd:"; + // + // CompBerdComboBox + // + this.CompBerdComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompBerdComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompBerdComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompBerdComboBox.FormattingEnabled = true; + this.CompBerdComboBox.Location = new System.Drawing.Point(54, 100); + this.CompBerdComboBox.Name = "CompBerdComboBox"; + this.CompBerdComboBox.Size = new System.Drawing.Size(182, 21); + this.CompBerdComboBox.TabIndex = 5; + this.CompBerdComboBox.SelectedIndexChanged += new System.EventHandler(this.CompBerdComboBox_SelectedIndexChanged); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(15, 76); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(36, 13); + this.label5.TabIndex = 4; + this.label5.Text = "Head:"; + // + // CompHeadComboBox + // + this.CompHeadComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompHeadComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CompHeadComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CompHeadComboBox.FormattingEnabled = true; + this.CompHeadComboBox.Location = new System.Drawing.Point(54, 73); + this.CompHeadComboBox.Name = "CompHeadComboBox"; + this.CompHeadComboBox.Size = new System.Drawing.Size(182, 21); + this.CompHeadComboBox.TabIndex = 3; + this.CompHeadComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHeadComboBox_SelectedIndexChanged); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(3, 53); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(69, 13); + this.label4.TabIndex = 2; + this.label4.Text = "Components:"; + // // ToolsTabControl // this.ToolsTabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -715,278 +998,59 @@ this.ToolsPanel.TabIndex = 7; this.ToolsPanel.Visible = false; // - // label4 + // label21 // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(3, 53); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(69, 13); - this.label4.TabIndex = 2; - this.label4.Text = "Components:"; + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(2, 445); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(49, 13); + this.label21.TabIndex = 28; + this.label21.Text = "Clip Dict:"; // - // label5 + // ClipDictComboBox // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(12, 76); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(36, 13); - this.label5.TabIndex = 4; - this.label5.Text = "Head:"; - // - // CompHeadComboBox - // - this.CompHeadComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.ClipDictComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.CompHeadComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompHeadComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompHeadComboBox.FormattingEnabled = true; - this.CompHeadComboBox.Location = new System.Drawing.Point(54, 73); - this.CompHeadComboBox.Name = "CompHeadComboBox"; - this.CompHeadComboBox.Size = new System.Drawing.Size(182, 21); - this.CompHeadComboBox.TabIndex = 3; - this.CompHeadComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHeadComboBox_SelectedIndexChanged); + this.ClipDictComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.ClipDictComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource; + this.ClipDictComboBox.FormattingEnabled = true; + this.ClipDictComboBox.Location = new System.Drawing.Point(54, 442); + this.ClipDictComboBox.Name = "ClipDictComboBox"; + this.ClipDictComboBox.Size = new System.Drawing.Size(182, 21); + this.ClipDictComboBox.TabIndex = 27; + this.ClipDictComboBox.TextChanged += new System.EventHandler(this.ClipDictComboBox_TextChanged); // - // label6 + // label22 // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(16, 103); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(32, 13); - this.label6.TabIndex = 6; - this.label6.Text = "Berd:"; + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(24, 472); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(27, 13); + this.label22.TabIndex = 30; + this.label22.Text = "Clip:"; // - // CompBerdComboBox + // ClipComboBox // - this.CompBerdComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.ClipComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.CompBerdComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompBerdComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompBerdComboBox.FormattingEnabled = true; - this.CompBerdComboBox.Location = new System.Drawing.Point(54, 100); - this.CompBerdComboBox.Name = "CompBerdComboBox"; - this.CompBerdComboBox.Size = new System.Drawing.Size(182, 21); - this.CompBerdComboBox.TabIndex = 5; - this.CompBerdComboBox.SelectedIndexChanged += new System.EventHandler(this.CompBerdComboBox_SelectedIndexChanged); + this.ClipComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.ClipComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.ClipComboBox.FormattingEnabled = true; + this.ClipComboBox.Location = new System.Drawing.Point(54, 469); + this.ClipComboBox.Name = "ClipComboBox"; + this.ClipComboBox.Size = new System.Drawing.Size(182, 21); + this.ClipComboBox.TabIndex = 29; + this.ClipComboBox.SelectedIndexChanged += new System.EventHandler(this.ClipComboBox_SelectedIndexChanged); + this.ClipComboBox.TextChanged += new System.EventHandler(this.ClipComboBox_TextChanged); // - // label7 + // label23 // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(19, 130); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(29, 13); - this.label7.TabIndex = 8; - this.label7.Text = "Hair:"; - // - // CompHairComboBox - // - this.CompHairComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompHairComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompHairComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompHairComboBox.FormattingEnabled = true; - this.CompHairComboBox.Location = new System.Drawing.Point(54, 127); - this.CompHairComboBox.Name = "CompHairComboBox"; - this.CompHairComboBox.Size = new System.Drawing.Size(182, 21); - this.CompHairComboBox.TabIndex = 7; - this.CompHairComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHairComboBox_SelectedIndexChanged); - // - // label8 - // - this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(15, 157); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(33, 13); - this.label8.TabIndex = 10; - this.label8.Text = "Uppr:"; - // - // CompUpprComboBox - // - this.CompUpprComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompUpprComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompUpprComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompUpprComboBox.FormattingEnabled = true; - this.CompUpprComboBox.Location = new System.Drawing.Point(54, 154); - this.CompUpprComboBox.Name = "CompUpprComboBox"; - this.CompUpprComboBox.Size = new System.Drawing.Size(182, 21); - this.CompUpprComboBox.TabIndex = 9; - this.CompUpprComboBox.SelectedIndexChanged += new System.EventHandler(this.CompUpprComboBox_SelectedIndexChanged); - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(15, 184); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(33, 13); - this.label9.TabIndex = 12; - this.label9.Text = "Lowr:"; - // - // CompLowrComboBox - // - this.CompLowrComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompLowrComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompLowrComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompLowrComboBox.FormattingEnabled = true; - this.CompLowrComboBox.Location = new System.Drawing.Point(54, 181); - this.CompLowrComboBox.Name = "CompLowrComboBox"; - this.CompLowrComboBox.Size = new System.Drawing.Size(182, 21); - this.CompLowrComboBox.TabIndex = 11; - this.CompLowrComboBox.SelectedIndexChanged += new System.EventHandler(this.CompLowrComboBox_SelectedIndexChanged); - // - // label12 - // - this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(12, 211); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(36, 13); - this.label12.TabIndex = 14; - this.label12.Text = "Hand:"; - // - // CompHandComboBox - // - this.CompHandComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompHandComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompHandComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompHandComboBox.FormattingEnabled = true; - this.CompHandComboBox.Location = new System.Drawing.Point(54, 208); - this.CompHandComboBox.Name = "CompHandComboBox"; - this.CompHandComboBox.Size = new System.Drawing.Size(182, 21); - this.CompHandComboBox.TabIndex = 13; - this.CompHandComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHandComboBox_SelectedIndexChanged); - // - // label13 - // - this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(17, 238); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(31, 13); - this.label13.TabIndex = 16; - this.label13.Text = "Feet:"; - // - // CompFeetComboBox - // - this.CompFeetComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompFeetComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompFeetComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompFeetComboBox.FormattingEnabled = true; - this.CompFeetComboBox.Location = new System.Drawing.Point(54, 235); - this.CompFeetComboBox.Name = "CompFeetComboBox"; - this.CompFeetComboBox.Size = new System.Drawing.Size(182, 21); - this.CompFeetComboBox.TabIndex = 15; - this.CompFeetComboBox.SelectedIndexChanged += new System.EventHandler(this.CompFeetComboBox_SelectedIndexChanged); - // - // label15 - // - this.label15.AutoSize = true; - this.label15.Location = new System.Drawing.Point(16, 265); - this.label15.Name = "label15"; - this.label15.Size = new System.Drawing.Size(32, 13); - this.label15.TabIndex = 18; - this.label15.Text = "Teef:"; - // - // CompTeefComboBox - // - this.CompTeefComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompTeefComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompTeefComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompTeefComboBox.FormattingEnabled = true; - this.CompTeefComboBox.Location = new System.Drawing.Point(54, 262); - this.CompTeefComboBox.Name = "CompTeefComboBox"; - this.CompTeefComboBox.Size = new System.Drawing.Size(182, 21); - this.CompTeefComboBox.TabIndex = 17; - this.CompTeefComboBox.SelectedIndexChanged += new System.EventHandler(this.CompTeefComboBox_SelectedIndexChanged); - // - // label16 - // - this.label16.AutoSize = true; - this.label16.Location = new System.Drawing.Point(14, 292); - this.label16.Name = "label16"; - this.label16.Size = new System.Drawing.Size(34, 13); - this.label16.TabIndex = 20; - this.label16.Text = "Accs:"; - // - // CompAccsComboBox - // - this.CompAccsComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompAccsComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompAccsComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompAccsComboBox.FormattingEnabled = true; - this.CompAccsComboBox.Location = new System.Drawing.Point(54, 289); - this.CompAccsComboBox.Name = "CompAccsComboBox"; - this.CompAccsComboBox.Size = new System.Drawing.Size(182, 21); - this.CompAccsComboBox.TabIndex = 19; - this.CompAccsComboBox.SelectedIndexChanged += new System.EventHandler(this.CompAccsComboBox_SelectedIndexChanged); - // - // label17 - // - this.label17.AutoSize = true; - this.label17.Location = new System.Drawing.Point(14, 319); - this.label17.Name = "label17"; - this.label17.Size = new System.Drawing.Size(34, 13); - this.label17.TabIndex = 22; - this.label17.Text = "Task:"; - // - // CompTaskComboBox - // - this.CompTaskComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompTaskComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompTaskComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompTaskComboBox.FormattingEnabled = true; - this.CompTaskComboBox.Location = new System.Drawing.Point(54, 316); - this.CompTaskComboBox.Name = "CompTaskComboBox"; - this.CompTaskComboBox.Size = new System.Drawing.Size(182, 21); - this.CompTaskComboBox.TabIndex = 21; - this.CompTaskComboBox.SelectedIndexChanged += new System.EventHandler(this.CompTaskComboBox_SelectedIndexChanged); - // - // label18 - // - this.label18.AutoSize = true; - this.label18.Location = new System.Drawing.Point(16, 346); - this.label18.Name = "label18"; - this.label18.Size = new System.Drawing.Size(32, 13); - this.label18.TabIndex = 24; - this.label18.Text = "Decl:"; - // - // CompDeclComboBox - // - this.CompDeclComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompDeclComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompDeclComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompDeclComboBox.FormattingEnabled = true; - this.CompDeclComboBox.Location = new System.Drawing.Point(54, 343); - this.CompDeclComboBox.Name = "CompDeclComboBox"; - this.CompDeclComboBox.Size = new System.Drawing.Size(182, 21); - this.CompDeclComboBox.TabIndex = 23; - this.CompDeclComboBox.SelectedIndexChanged += new System.EventHandler(this.CompDeclComboBox_SelectedIndexChanged); - // - // label20 - // - this.label20.AutoSize = true; - this.label20.Location = new System.Drawing.Point(19, 373); - this.label20.Name = "label20"; - this.label20.Size = new System.Drawing.Size(29, 13); - this.label20.TabIndex = 26; - this.label20.Text = "Jbib:"; - // - // CompJbibComboBox - // - this.CompJbibComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompJbibComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompJbibComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompJbibComboBox.FormattingEnabled = true; - this.CompJbibComboBox.Location = new System.Drawing.Point(54, 370); - this.CompJbibComboBox.Name = "CompJbibComboBox"; - this.CompJbibComboBox.Size = new System.Drawing.Size(182, 21); - this.CompJbibComboBox.TabIndex = 25; - this.CompJbibComboBox.SelectedIndexChanged += new System.EventHandler(this.CompJbibComboBox_SelectedIndexChanged); + this.label23.AutoSize = true; + this.label23.Location = new System.Drawing.Point(3, 422); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(56, 13); + this.label23.TabIndex = 31; + this.label23.Text = "Animation:"; // // PedsForm // @@ -1103,5 +1167,10 @@ private System.Windows.Forms.ComboBox CompJbibComboBox; private System.Windows.Forms.Label label18; private System.Windows.Forms.ComboBox CompDeclComboBox; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.ComboBox ClipComboBox; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.ComboBox ClipDictComboBox; + private System.Windows.Forms.Label label23; } } \ No newline at end of file diff --git a/Peds/PedsForm.cs b/Peds/PedsForm.cs index 4487869..394a75e 100644 --- a/Peds/PedsForm.cs +++ b/Peds/PedsForm.cs @@ -74,12 +74,6 @@ namespace CodeWalker.Peds - string SelectedPedName = string.Empty; - MetaHash SelectedPedHash = 0;//ped name hash - CPedModelInfo__InitData SelectedPedInit = null; //ped init data - YddFile SelectedPedYdd = null; //ped drawables - YftFile SelectedPedYft = null; //ped skeleton YFT - PedFile SelectedPedYmt = null; //ped variation info Drawable SelectedHead = null; Drawable SelectedBerd = null; @@ -94,8 +88,24 @@ namespace CodeWalker.Peds Drawable SelectedDecl = null; Drawable SelectedJbib = null; + [TypeConverter(typeof(ExpandableObjectConverter))] public class PedSelection + { + public string Name { get; set; } = string.Empty; + public MetaHash NameHash { get; set; } = 0;//ped name hash + public CPedModelInfo__InitData InitData { get; set; } = null; //ped init data + public YddFile Ydd { get; set; } = null; //ped drawables + public YtdFile Ytd { get; set; } = null; //ped textures + public YcdFile Ycd { get; set; } = null; //ped animations + public YftFile Yft { get; set; } = null; //ped skeleton YFT + public PedFile Ymt { get; set; } = null; //ped variation info + public Dictionary DrawableFilesDict { get; set; } = null; + public Dictionary TextureFilesDict { get; set; } = null; + public RpfFileEntry[] DrawableFiles { get; set; } = null; + public RpfFileEntry[] TextureFiles { get; set; } = null; + public ClipMapEntry AnimClip { get; set; } = null; + } - + PedSelection SelectedPed = new PedSelection(); @@ -118,9 +128,9 @@ namespace CodeWalker.Peds //Renderer.renderclouds = true; //Renderer.individualcloudfrag = "Contrails"; Renderer.rendermoon = false; - Renderer.renderskeletons = true; - Renderer.SelectionFlagsTestAll = true; - + Renderer.renderskeletons = false; + //Renderer.SelectionFlagsTestAll = true; + Renderer.swaphemisphere = true; } public void InitScene(Device device) @@ -146,8 +156,8 @@ namespace CodeWalker.Peds camera.CurrentDistance = 2.0f; camera.TargetRotation.Y = 0.2f; camera.CurrentRotation.Y = 0.2f; - camera.TargetRotation.X = 0.5f * (float)Math.PI; - camera.CurrentRotation.X = 0.5f * (float)Math.PI; + camera.TargetRotation.X = 1.0f * (float)Math.PI; + camera.CurrentRotation.X = 1.0f * (float)Math.PI; LoadSettings(); @@ -454,8 +464,8 @@ namespace CodeWalker.Peds rad = Math.Max(0.01f, rad*0.1f); camera.FollowEntity.Position = pos; - camera.TargetDistance = rad * 1.6f; - camera.CurrentDistance = rad * 1.6f; + camera.TargetDistance = rad * 1.2f; + camera.CurrentDistance = rad * 1.2f; camera.ZFar = Math.Min(rad * 200.0f, 12000.0f); camera.ZNear = Math.Min(camera.ZFar * 5e-5f, 0.5f); @@ -614,8 +624,23 @@ namespace CodeWalker.Peds } else { - PedNameComboBox.Items.Clear(); + ClipComboBox.Items.Clear(); + ClipDictComboBox.Items.Clear(); + var ycds = GameFileCache.YcdDict.Values.ToList(); + ycds.Sort((a, b) => { return a.Name.CompareTo(b.Name); }); + ClipDictComboBox.AutoCompleteCustomSource.Clear(); + List ycdlist = new List(); + foreach (var ycde in ycds) + { + ycdlist.Add(ycde.GetShortName()); + } + ClipDictComboBox.AutoCompleteCustomSource.AddRange(ycdlist.ToArray()); + ClipDictComboBox.Text = ""; + + + + PedNameComboBox.Items.Clear(); var peds = GameFileCache.PedsInitDict.Values.ToList(); peds.Sort((a, b) => { return a.Name.CompareTo(b.Name); }); foreach (var ped in peds) @@ -624,7 +649,9 @@ namespace CodeWalker.Peds } if (peds.Count > 0) { - PedNameComboBox.SelectedIndex = 0; + var ind = PedNameComboBox.FindString("A_F_M_Beach_01"); // //A_C_Pug + PedNameComboBox.SelectedIndex = Math.Max(ind, 0); + //PedNameComboBox.SelectedIndex = 0; } } @@ -688,12 +715,15 @@ namespace CodeWalker.Peds var pednamel = pedname.ToLowerInvariant(); MetaHash pedhash = JenkHash.GenHash(pednamel); - SelectedPedName = string.Empty; - SelectedPedHash = 0; - SelectedPedInit = null; - SelectedPedYdd = null; - SelectedPedYft = null; - SelectedPedYmt = null; + SelectedPed.Name = string.Empty; + SelectedPed.NameHash = 0; + SelectedPed.InitData = null; + SelectedPed.Ydd = null; + SelectedPed.Ytd = null; + SelectedPed.Ycd = null; + SelectedPed.Yft = null; + SelectedPed.Ymt = null; + SelectedPed.AnimClip = null; ClearCombo(CompHeadComboBox); SelectedHead = null; ClearCombo(CompBerdComboBox); SelectedBerd = null; ClearCombo(CompHairComboBox); SelectedHair = null; @@ -707,51 +737,89 @@ namespace CodeWalker.Peds ClearCombo(CompDeclComboBox); SelectedDecl = null; ClearCombo(CompJbibComboBox); SelectedJbib = null; + DetailsPropertyGrid.SelectedObject = null; + + CPedModelInfo__InitData initdata = null; if (!GameFileCache.PedsInitDict.TryGetValue(pedhash, out initdata)) return; - - bool pedchange = SelectedPedHash != pedhash; - SelectedPedName = pedname; - SelectedPedHash = pedhash; - SelectedPedInit = initdata; - SelectedPedYdd = GameFileCache.GetYdd(pedhash); - SelectedPedYft = GameFileCache.GetYft(pedhash); - GameFileCache.PedVariationsDict?.TryGetValue(pedhash, out SelectedPedYmt); + var ycdhash = JenkHash.GenHash(initdata.ClipDictionaryName.ToLowerInvariant()); - while ((SelectedPedYdd != null) && (!SelectedPedYdd.Loaded)) + bool pedchange = SelectedPed.NameHash != pedhash; + SelectedPed.Name = pedname; + SelectedPed.NameHash = pedhash; + SelectedPed.InitData = initdata; + SelectedPed.Ydd = GameFileCache.GetYdd(pedhash); + SelectedPed.Ytd = GameFileCache.GetYtd(pedhash); + SelectedPed.Ycd = GameFileCache.GetYcd(ycdhash); + SelectedPed.Yft = GameFileCache.GetYft(pedhash); + + PedFile pedFile = null; + GameFileCache.PedVariationsDict?.TryGetValue(pedhash, out pedFile); + SelectedPed.Ymt = pedFile; + + Dictionary peddict = null; + GameFileCache.PedDrawableDicts.TryGetValue(SelectedPed.NameHash, out peddict); + SelectedPed.DrawableFilesDict = peddict; + SelectedPed.DrawableFiles = SelectedPed.DrawableFilesDict?.Values.ToArray(); + GameFileCache.PedTextureDicts.TryGetValue(SelectedPed.NameHash, out peddict); + SelectedPed.TextureFilesDict = peddict; + SelectedPed.TextureFiles = SelectedPed.TextureFilesDict?.Values.ToArray(); + + + while ((SelectedPed.Ydd != null) && (!SelectedPed.Ydd.Loaded)) { Thread.Sleep(20);//kinda hacky - SelectedPedYdd = GameFileCache.GetYdd(SelectedPedHash); + SelectedPed.Ydd = GameFileCache.GetYdd(pedhash); } - while ((SelectedPedYft != null) && (!SelectedPedYft.Loaded)) + while ((SelectedPed.Ytd != null) && (!SelectedPed.Ytd.Loaded)) { Thread.Sleep(20);//kinda hacky - SelectedPedYft = GameFileCache.GetYft(SelectedPedHash); + SelectedPed.Ytd = GameFileCache.GetYtd(pedhash); + } + while ((SelectedPed.Ycd != null) && (!SelectedPed.Ycd.Loaded)) + { + Thread.Sleep(20);//kinda hacky + SelectedPed.Ycd = GameFileCache.GetYcd(ycdhash); + } + while ((SelectedPed.Yft != null) && (!SelectedPed.Yft.Loaded)) + { + Thread.Sleep(20);//kinda hacky + SelectedPed.Yft = GameFileCache.GetYft(pedhash); } - LoadModel(SelectedPedYft, pedchange); + LoadModel(SelectedPed.Yft, pedchange); - var vi = SelectedPedYmt?.VariationInfo; + var vi = SelectedPed.Ymt?.VariationInfo; if (vi != null) { - PopulateCompCombo(CompHeadComboBox, vi.GetVariations(0)); - PopulateCompCombo(CompBerdComboBox, vi.GetVariations(1)); - PopulateCompCombo(CompHairComboBox, vi.GetVariations(2)); - PopulateCompCombo(CompUpprComboBox, vi.GetVariations(3)); - PopulateCompCombo(CompLowrComboBox, vi.GetVariations(4)); - PopulateCompCombo(CompHandComboBox, vi.GetVariations(5)); - PopulateCompCombo(CompFeetComboBox, vi.GetVariations(6)); - PopulateCompCombo(CompTeefComboBox, vi.GetVariations(7)); - PopulateCompCombo(CompAccsComboBox, vi.GetVariations(8)); - PopulateCompCombo(CompTaskComboBox, vi.GetVariations(9)); - PopulateCompCombo(CompDeclComboBox, vi.GetVariations(10)); - PopulateCompCombo(CompJbibComboBox, vi.GetVariations(11)); + PopulateCompCombo(CompHeadComboBox, vi.GetComponentData(0)); + PopulateCompCombo(CompBerdComboBox, vi.GetComponentData(1)); + PopulateCompCombo(CompHairComboBox, vi.GetComponentData(2)); + PopulateCompCombo(CompUpprComboBox, vi.GetComponentData(3)); + PopulateCompCombo(CompLowrComboBox, vi.GetComponentData(4)); + PopulateCompCombo(CompHandComboBox, vi.GetComponentData(5)); + PopulateCompCombo(CompFeetComboBox, vi.GetComponentData(6)); + PopulateCompCombo(CompTeefComboBox, vi.GetComponentData(7)); + PopulateCompCombo(CompAccsComboBox, vi.GetComponentData(8)); + PopulateCompCombo(CompTaskComboBox, vi.GetComponentData(9)); + PopulateCompCombo(CompDeclComboBox, vi.GetComponentData(10)); + PopulateCompCombo(CompJbibComboBox, vi.GetComponentData(11)); } + ClipDictComboBox.Text = SelectedPed.InitData?.ClipDictionaryName ?? ""; + ClipComboBox.Text = "idle"; + MetaHash cliphash = JenkHash.GenHash("idle"); + ClipMapEntry cme = null; + SelectedPed.Ycd?.ClipMap?.TryGetValue(cliphash, out cme); + SelectedPed.AnimClip = cme; + + + DetailsPropertyGrid.SelectedObject = SelectedPed; + } public void LoadModel(YftFile yft, bool movecamera = true) @@ -775,18 +843,19 @@ namespace CodeWalker.Peds private void ClearCombo(ComboBox c) { c.Items.Clear(); + c.Items.Add(""); c.Text = string.Empty; } - private void PopulateCompCombo(ComboBox c, MUnk_3538495220 vars) + private void PopulateCompCombo(ComboBox c, MUnk_3538495220 compData) { - if (vars?.Variations == null) return; - foreach (var item in vars.Variations) + if (compData?.DrawblData3 == null) return; + foreach (var item in compData.DrawblData3) { c.Items.Add(item.GetDrawableName()); } - if (vars.Variations.Length > 0) + if (compData.DrawblData3.Length > 0) { - c.SelectedIndex = 0; + c.SelectedIndex = 1; } } @@ -794,20 +863,21 @@ namespace CodeWalker.Peds private Drawable GetComponentDrawable(string name) { + if (string.IsNullOrEmpty(name)) return null; + var namel = name.ToLowerInvariant(); MetaHash hash = JenkHash.GenHash(namel); Drawable d; - if (SelectedPedYdd?.Dict != null) + if (SelectedPed.Ydd?.Dict != null) { - if (SelectedPedYdd.Dict.TryGetValue(hash, out d)) return d; + if (SelectedPed.Ydd.Dict.TryGetValue(hash, out d)) return d; } - Dictionary peddict = null; - if (GameFileCache.PedDrawableDicts.TryGetValue(SelectedPedHash, out peddict)) + if (SelectedPed.DrawableFilesDict != null) { RpfFileEntry file = null; - if (peddict.TryGetValue(hash, out file)) + if (SelectedPed.DrawableFilesDict.TryGetValue(hash, out file)) { var ydd = GameFileCache.GetFileUncached(file); while ((ydd != null) && (!ydd.Loaded)) @@ -1011,31 +1081,65 @@ namespace CodeWalker.Peds private void RenderPed() { - YftFile yft = SelectedPedYft;// GameFileCache.GetYft(SelectedModelHash); + YftFile yft = SelectedPed.Yft;// GameFileCache.GetYft(SelectedModelHash); if (yft != null) { if (yft.Loaded) { if (yft.Fragment != null) { - var f = yft.Fragment; - - var txdhash = 0u;// SelectedVehicleHash;// yft.RpfFileEntry?.ShortNameHash ?? 0; + //var f = yft.Fragment; + //var txdhash = 0u;// SelectedVehicleHash;// yft.RpfFileEntry?.ShortNameHash ?? 0; //var namelower = yft.RpfFileEntry?.GetShortNameLower(); - - Archetype arch = null;// TryGetArchetype(hash); - - Renderer.RenderFragment(arch, null, f, txdhash); - + //Archetype arch = null;// TryGetArchetype(hash); + //Renderer.RenderFragment(arch, null, f, txdhash); //seldrwbl = f.Drawable; } } - } + + var vi = SelectedPed.Ymt?.VariationInfo; + if (vi != null) + { + RenderPedComponent(SelectedHead, vi.GetComponentData(0)); + RenderPedComponent(SelectedBerd, vi.GetComponentData(1)); + RenderPedComponent(SelectedHair, vi.GetComponentData(2)); + RenderPedComponent(SelectedUppr, vi.GetComponentData(3)); + RenderPedComponent(SelectedLowr, vi.GetComponentData(4)); + RenderPedComponent(SelectedHand, vi.GetComponentData(5)); + RenderPedComponent(SelectedFeet, vi.GetComponentData(6)); + RenderPedComponent(SelectedTeef, vi.GetComponentData(7)); + RenderPedComponent(SelectedAccs, vi.GetComponentData(8)); + RenderPedComponent(SelectedTask, vi.GetComponentData(9)); + RenderPedComponent(SelectedDecl, vi.GetComponentData(10)); + RenderPedComponent(SelectedJbib, vi.GetComponentData(11)); + } + + } + } + private void RenderPedComponent(Drawable drawable, MUnk_3538495220 compData) + { + if (drawable == null) return; + if (compData == null) return; + var td = SelectedPed.Ytd?.TextureDict; + var ac = SelectedPed.AnimClip; + + var skel = SelectedPed.Yft?.Fragment?.Drawable?.Skeleton; + if (skel != null) + { + drawable.Skeleton = skel; + } + + + Renderer.RenderDrawable(drawable, null, null, 0, td, ac); + + + } + @@ -1598,7 +1702,63 @@ namespace CodeWalker.Peds SelectedJbib = GetComponentDrawable(CompJbibComboBox.Text); } + private void ClipDictComboBox_TextChanged(object sender, EventArgs e) + { + + var ycdhash = JenkHash.GenHash(ClipDictComboBox.Text.ToLowerInvariant()); + var ycd = GameFileCache.GetYcd(ycdhash); + while ((ycd != null) && (!ycd.Loaded)) + { + Thread.Sleep(20);//kinda hacky + ycd = GameFileCache.GetYcd(ycdhash); + } + + SelectedPed.Ycd = ycd; + + ClipComboBox.Items.Clear(); + ClipComboBox.Items.Add(""); + + if (ycd?.ClipMapEntries == null) + { + ClipComboBox.SelectedIndex = 0; + SelectedPed.AnimClip = null; + return; + } + + foreach (var cme in ycd.ClipMapEntries) + { + var animclip = cme.Clip as ClipAnimation; + if (animclip != null) + { + ClipComboBox.Items.Add(animclip.ShortName); + continue; + } + var animcliplist = cme.Clip as ClipAnimationList; + if (animcliplist?.Animations?.Data != null) + { + ClipComboBox.Items.Add(animcliplist.ShortName); + continue; + } + } + + } + + private void ClipComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + + var name = ClipComboBox.Text; + + MetaHash cliphash = JenkHash.GenHash(name); + ClipMapEntry cme = null; + SelectedPed.Ycd?.ClipMap?.TryGetValue(cliphash, out cme); + SelectedPed.AnimClip = cme; + } + + private void ClipComboBox_TextChanged(object sender, EventArgs e) + { + ClipComboBox_SelectedIndexChanged(sender, e); + } } } diff --git a/Rendering/Renderable.cs b/Rendering/Renderable.cs index e7e07eb..87999de 100644 --- a/Rendering/Renderable.cs +++ b/Rendering/Renderable.cs @@ -407,8 +407,34 @@ namespace CodeWalker.Rendering } private void UpdateAnim(ClipMapEntry cme) { - var clipanim = cme.Clip as ClipAnimation;//maybe ClipAnimationList? + var clipanim = cme.Clip as ClipAnimation; var anim = clipanim?.Animation; + if (anim != null) + { + UpdateAnim(anim); + } + + var clipanimlist = cme.Clip as ClipAnimationList; + if (clipanimlist?.Animations != null) + { + if (clipanimlist.Animations.Count > 0) + { + UpdateAnim(clipanimlist.Animations[0].Animation); + } + + + ////needs more work to synchronise these... seems to be multi layers, but timings are different + ////sort of represents animations LODs, higher detail stuff like fingers and feet movements in the layers + //foreach (var canim in clipanimlist.Animations) + //{ + // if (canim?.Animation == null) continue; + // UpdateAnim(canim.Animation); + // //break; + //} + } + } + private void UpdateAnim(Animation anim) + { if (anim == null) { return; } if (anim.BoneIds?.data_items == null) @@ -436,6 +462,9 @@ namespace CodeWalker.Rendering if (bones == null) { return; } + Vector4 v0, v1, v; + Quaternion q0, q1, q; + for (int i = 0; i < anim.BoneIds.data_items.Length; i++) { var boneiditem = anim.BoneIds.data_items[i]; @@ -454,19 +483,34 @@ namespace CodeWalker.Rendering switch (track) { case 0: //bone position - var v0 = aseq.EvaluateVector(frame0); - var v1 = aseq.EvaluateVector(frame1); - var v = interpolate ? (v0 * ialpha) + (v1 * falpha) : v0; + v0 = aseq.EvaluateVector(frame0); + v1 = aseq.EvaluateVector(frame1); + v = interpolate ? (v0 * ialpha) + (v1 * falpha) : v0; bone.AnimTranslation = v.XYZ(); break; case 1: //bone orientation - var q0 = new Quaternion(aseq.EvaluateVector(frame0)); - var q1 = new Quaternion(aseq.EvaluateVector(frame1)); - var q = interpolate ? Quaternion.Slerp(q0, q1, falpha) : q0; + q0 = new Quaternion(aseq.EvaluateVector(frame0)); + q1 = new Quaternion(aseq.EvaluateVector(frame1)); + q = interpolate ? Quaternion.Slerp(q0, q1, falpha) : q0; bone.AnimRotation = q; break; case 2: //scale? break; + case 5://vector3... + //v0 = aseq.EvaluateVector(frame0); + //v1 = aseq.EvaluateVector(frame1); + //v = interpolate ? (v0 * ialpha) + (v1 * falpha) : v0; + //bone.AnimScale = v.XYZ(); + break; + case 6://quaternion... + break; + case 134://single float? + case 136: + case 137: + case 138: + case 139: + case 140: + break; default: break; } diff --git a/Rendering/Renderer.cs b/Rendering/Renderer.cs index 30924c5..506efc9 100644 --- a/Rendering/Renderer.cs +++ b/Rendering/Renderer.cs @@ -113,6 +113,8 @@ namespace CodeWalker.Rendering public bool renderhdtextures = true; + public bool swaphemisphere = false;//can be used to get better lighting in model viewers + public MapSelectionMode SelectionMode = MapSelectionMode.Entity; //to assist in rendering embedded collisions properly... @@ -498,6 +500,11 @@ namespace CodeWalker.Rendering moonax = Vector3.Normalize(maxis.Multiply(Vector3.UnitY)); //bool usemoon = false; + if (swaphemisphere) + { + sundir.Y = -sundir.Y; + } + lightdir = sundir; //if (lightdir.Z < -0.5f) lightdir.Z = -lightdir.Z; //make sure the lightsource is always above the horizon... @@ -2488,17 +2495,24 @@ namespace CodeWalker.Rendering return res; } - public bool RenderDrawable(DrawableBase drawable, Archetype arche, YmapEntityDef entity, uint txdHash = 0) + public bool RenderDrawable(DrawableBase drawable, Archetype arche, YmapEntityDef entity, uint txdHash = 0, TextureDictionary txdExtra = null, ClipMapEntry animClip = null) { //enqueue a single drawable for rendering. if (drawable == null) return false; - Renderable rndbl = TryGetRenderable(arche, drawable, txdHash); + Renderable rndbl = TryGetRenderable(arche, drawable, txdHash, txdExtra); if (rndbl == null) return false; + if (animClip != null) + { + rndbl.ClipMapEntry = animClip; + rndbl.ClipDict = animClip.Clip?.Ycd; + rndbl.HasAnims = true; + } + return RenderRenderable(rndbl, arche, entity); } @@ -2784,7 +2798,7 @@ namespace CodeWalker.Rendering - private Renderable TryGetRenderable(Archetype arche, DrawableBase drawable, uint txdHash = 0) + private Renderable TryGetRenderable(Archetype arche, DrawableBase drawable, uint txdHash = 0, TextureDictionary txdExtra = null) { if (drawable == null) return null; //BUG: only last texdict used!! needs to cache textures per archetype........ @@ -2836,7 +2850,8 @@ namespace CodeWalker.Rendering } - var yptTexDict = (drawable.Owner as YptFile)?.PtfxList?.TextureDictionary; + var extraTexDict = (drawable.Owner as YptFile)?.PtfxList?.TextureDictionary; + if (extraTexDict == null) extraTexDict = txdExtra; bool cacheSD = (rndbl.SDtxds == null); bool cacheHD = (renderhdtextures && (rndbl.HDtxds == null)); @@ -2939,9 +2954,9 @@ namespace CodeWalker.Rendering if ((tex != null) && (ttex == null)) { //TextureRef means this RenderableTexture needs to be loaded from texture dict... - if (yptTexDict != null) //for ypt files, first try the embedded tex dict.. + if (extraTexDict != null) //for ypt files, first try the embedded tex dict.. { - dtex = yptTexDict.Lookup(tex.NameHash); + dtex = extraTexDict.Lookup(tex.NameHash); } if (dtex == null) //else //if (texDict != 0)