diff --git a/CodeWalker.WinForms/CodeWalker.WinForms.csproj b/CodeWalker.WinForms/CodeWalker.WinForms.csproj index 5071cb7..e599f32 100644 --- a/CodeWalker.WinForms/CodeWalker.WinForms.csproj +++ b/CodeWalker.WinForms/CodeWalker.WinForms.csproj @@ -8,6 +8,8 @@ + + \ No newline at end of file diff --git a/CodeWalker.WinForms/QuaternionBox.Designer.cs b/CodeWalker.WinForms/QuaternionBox.Designer.cs new file mode 100644 index 0000000..104836c --- /dev/null +++ b/CodeWalker.WinForms/QuaternionBox.Designer.cs @@ -0,0 +1,152 @@ + +namespace CodeWalker.WinForms +{ + partial class QuaternionBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.QuaternionTextBox = new System.Windows.Forms.TextBox(); + this.EulerXUpDown = new System.Windows.Forms.NumericUpDown(); + this.EulerYUpDown = new System.Windows.Forms.NumericUpDown(); + this.EulerZUpDown = new System.Windows.Forms.NumericUpDown(); + this.NormalizeButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.EulerXUpDown)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.EulerYUpDown)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.EulerZUpDown)).BeginInit(); + this.SuspendLayout(); + // + // QuaternionTextBox + // + this.QuaternionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.QuaternionTextBox.Location = new System.Drawing.Point(0, 2); + this.QuaternionTextBox.Name = "QuaternionTextBox"; + this.QuaternionTextBox.Size = new System.Drawing.Size(190, 20); + this.QuaternionTextBox.TabIndex = 0; + this.QuaternionTextBox.Text = "0, 0, 0, 1"; + this.QuaternionTextBox.TextChanged += new System.EventHandler(this.QuaternionTextBox_TextChanged); + // + // EulerXUpDown + // + this.EulerXUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.EulerXUpDown.DecimalPlaces = 2; + this.EulerXUpDown.Location = new System.Drawing.Point(196, 2); + this.EulerXUpDown.Maximum = new decimal(new int[] { + 360, + 0, + 0, + 0}); + this.EulerXUpDown.Minimum = new decimal(new int[] { + 360, + 0, + 0, + -2147483648}); + this.EulerXUpDown.Name = "EulerXUpDown"; + this.EulerXUpDown.Size = new System.Drawing.Size(56, 20); + this.EulerXUpDown.TabIndex = 1; + this.EulerXUpDown.ValueChanged += new System.EventHandler(this.EulerXUpDown_ValueChanged); + // + // EulerYUpDown + // + this.EulerYUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.EulerYUpDown.DecimalPlaces = 2; + this.EulerYUpDown.Location = new System.Drawing.Point(258, 2); + this.EulerYUpDown.Maximum = new decimal(new int[] { + 360, + 0, + 0, + 0}); + this.EulerYUpDown.Minimum = new decimal(new int[] { + 360, + 0, + 0, + -2147483648}); + this.EulerYUpDown.Name = "EulerYUpDown"; + this.EulerYUpDown.Size = new System.Drawing.Size(56, 20); + this.EulerYUpDown.TabIndex = 2; + this.EulerYUpDown.ValueChanged += new System.EventHandler(this.EulerYUpDown_ValueChanged); + // + // EulerZUpDown + // + this.EulerZUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.EulerZUpDown.DecimalPlaces = 2; + this.EulerZUpDown.Location = new System.Drawing.Point(320, 2); + this.EulerZUpDown.Maximum = new decimal(new int[] { + 360, + 0, + 0, + 0}); + this.EulerZUpDown.Minimum = new decimal(new int[] { + 360, + 0, + 0, + -2147483648}); + this.EulerZUpDown.Name = "EulerZUpDown"; + this.EulerZUpDown.Size = new System.Drawing.Size(56, 20); + this.EulerZUpDown.TabIndex = 3; + this.EulerZUpDown.ValueChanged += new System.EventHandler(this.EulerZUpDown_ValueChanged); + // + // NormalizeButton + // + this.NormalizeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NormalizeButton.Location = new System.Drawing.Point(382, 0); + this.NormalizeButton.Name = "NormalizeButton"; + this.NormalizeButton.Size = new System.Drawing.Size(68, 23); + this.NormalizeButton.TabIndex = 4; + this.NormalizeButton.Text = "Normalize"; + this.NormalizeButton.UseVisualStyleBackColor = true; + this.NormalizeButton.Click += new System.EventHandler(this.NormalizeButton_Click); + // + // QuaternionBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.NormalizeButton); + this.Controls.Add(this.EulerZUpDown); + this.Controls.Add(this.EulerYUpDown); + this.Controls.Add(this.EulerXUpDown); + this.Controls.Add(this.QuaternionTextBox); + this.Margin = new System.Windows.Forms.Padding(0); + this.Name = "QuaternionBox"; + this.Size = new System.Drawing.Size(450, 24); + ((System.ComponentModel.ISupportInitialize)(this.EulerXUpDown)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.EulerYUpDown)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.EulerZUpDown)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox QuaternionTextBox; + private System.Windows.Forms.NumericUpDown EulerXUpDown; + private System.Windows.Forms.NumericUpDown EulerYUpDown; + private System.Windows.Forms.NumericUpDown EulerZUpDown; + private System.Windows.Forms.Button NormalizeButton; + } +} diff --git a/CodeWalker.WinForms/QuaternionBox.cs b/CodeWalker.WinForms/QuaternionBox.cs new file mode 100644 index 0000000..c75e232 --- /dev/null +++ b/CodeWalker.WinForms/QuaternionBox.cs @@ -0,0 +1,205 @@ +using SharpDX; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace CodeWalker.WinForms +{ + public partial class QuaternionBox : UserControl + { + public QuaternionBox() + { + InitializeComponent(); + } + + + public Quaternion Value + { + get + { + return _Value; + } + set + { + _Value = value; + UpdateFromValue(); + } + } + + private Quaternion _Value = Quaternion.Identity; + private bool suppressEvents = false; + + public event EventHandler ValueChanged; + private void RaiseValueChanged() + { + if (suppressEvents) return; + if (ValueChanged == null) return; + ValueChanged(this, null); + } + + + private void UpdateFromValue() + { + suppressEvents = true; + UpdateTextBox(); + UpdateEulerUpDowns(); + suppressEvents = false; + } + + + private void UpdateFromTextBox() + { + if (suppressEvents) return; + suppressEvents = true; + _Value = ParseQuaternionString(QuaternionTextBox.Text); + UpdateEulerUpDowns(); + suppressEvents = false; + RaiseValueChanged(); + } + + private void UpdateFromEuler() + { + if (suppressEvents) return; + suppressEvents = true; + _Value = GetQuaternion(EulerXUpDown.Value, EulerYUpDown.Value, EulerZUpDown.Value); + UpdateTextBox(); + suppressEvents = false; + RaiseValueChanged(); + } + + private void UpdateTextBox() + { + QuaternionTextBox.Text = GetQuaternionString(_Value); + } + + private void UpdateEulerUpDowns() + { + var e = GetEulerAngles(_Value); + EulerXUpDown.Value = (decimal)e.X; + EulerYUpDown.Value = (decimal)e.Y; + EulerZUpDown.Value = (decimal)e.Z; + } + + private void Normalize() + { + _Value.Normalize(); + UpdateFromValue(); + RaiseValueChanged(); + } + + + + + + + + private static Quaternion ParseQuaternionString(string s) + { + bool tryParseFloat(string str, out float f) + { + if (float.TryParse(str, NumberStyles.Any, CultureInfo.InvariantCulture, out f)) + { + return true; + } + return false; + } + + Quaternion q = Quaternion.Identity; + string[] ss = s.Split(','); + if (ss.Length > 0) + { + tryParseFloat(ss[0].Trim(), out q.X); + } + if (ss.Length > 1) + { + tryParseFloat(ss[1].Trim(), out q.Y); + } + if (ss.Length > 2) + { + tryParseFloat(ss[2].Trim(), out q.Z); + } + if (ss.Length > 3) + { + tryParseFloat(ss[3].Trim(), out q.W); + } + return q; + } + private static string GetQuaternionString(Quaternion q, string d = ", ") + { + var c = CultureInfo.InvariantCulture; + return q.X.ToString(c) + d + q.Y.ToString(c) + d + q.Z.ToString(c) + d + q.W.ToString(c); + } + private static Vector3 GetEulerAngles(Quaternion q) + { + var x = q.X; + var y = q.Y; + var z = q.Z; + var w = q.W; + var xx = x * x; + var yy = y * y; + var zz = z * z; + var ww = w * w; + var ls = xx + yy + zz + ww; + var st = x * w - y * z; + var sv = ls * 0.499f; + var rd = 180.0f / (float)Math.PI; + if (st > sv) + { + return new Vector3(90, (float)Math.Atan2(y, x) * 2.0f * rd, 0); + } + else if (st < -sv) + { + return new Vector3(-90, (float)Math.Atan2(y, x) * -2.0f * rd, 0); + } + else + { + return new Vector3( + (float)Math.Asin(2.0f * st) * rd, + (float)Math.Atan2(2.0f * (y * w + x * z), 1.0f - 2.0f * (xx + yy)) * rd, + (float)Math.Atan2(2.0f * (x * y + z * w), 1.0f - 2.0f * (xx + zz)) * rd + ); + } + } + private static Quaternion GetQuaternion(decimal x, decimal y, decimal z) + { + var deg = new Vector3((float)x, (float)y, (float)z); + var rads = deg * (float)(Math.PI / 180.0); + return Quaternion.RotationYawPitchRoll(rads.Y, rads.X, rads.Z); + } + + + + private void QuaternionTextBox_TextChanged(object sender, EventArgs e) + { + UpdateFromTextBox(); + } + + private void EulerXUpDown_ValueChanged(object sender, EventArgs e) + { + UpdateFromEuler(); + } + + private void EulerYUpDown_ValueChanged(object sender, EventArgs e) + { + UpdateFromEuler(); + } + + private void EulerZUpDown_ValueChanged(object sender, EventArgs e) + { + UpdateFromEuler(); + } + + private void NormalizeButton_Click(object sender, EventArgs e) + { + Normalize(); + } + } + +} diff --git a/CodeWalker.WinForms/QuaternionBox.resx b/CodeWalker.WinForms/QuaternionBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/CodeWalker.WinForms/QuaternionBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CodeWalker/Project/Panels/EditMultiPanel.Designer.cs b/CodeWalker/Project/Panels/EditMultiPanel.Designer.cs index 30e2580..c573014 100644 --- a/CodeWalker/Project/Panels/EditMultiPanel.Designer.cs +++ b/CodeWalker/Project/Panels/EditMultiPanel.Designer.cs @@ -31,12 +31,12 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditMultiPanel)); this.ScaleTextBox = new System.Windows.Forms.TextBox(); this.label23 = new System.Windows.Forms.Label(); - this.RotationTextBox = new System.Windows.Forms.TextBox(); this.PositionTextBox = new System.Windows.Forms.TextBox(); this.label24 = new System.Windows.Forms.Label(); this.label25 = new System.Windows.Forms.Label(); this.ItemsListBox = new System.Windows.Forms.ListBox(); this.label1 = new System.Windows.Forms.Label(); + this.RotationQuatBox = new CodeWalker.WinForms.QuaternionBox(); this.SuspendLayout(); // // ScaleTextBox @@ -58,16 +58,6 @@ this.label23.TabIndex = 17; this.label23.Text = "Scale:"; // - // RotationTextBox - // - this.RotationTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.RotationTextBox.Location = new System.Drawing.Point(75, 38); - this.RotationTextBox.Name = "RotationTextBox"; - this.RotationTextBox.Size = new System.Drawing.Size(478, 20); - this.RotationTextBox.TabIndex = 16; - this.RotationTextBox.TextChanged += new System.EventHandler(this.RotationTextBox_TextChanged); - // // PositionTextBox // this.PositionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) @@ -104,7 +94,7 @@ this.ItemsListBox.Location = new System.Drawing.Point(75, 108); this.ItemsListBox.Name = "ItemsListBox"; this.ItemsListBox.Size = new System.Drawing.Size(202, 355); - this.ItemsListBox.TabIndex = 19; + this.ItemsListBox.TabIndex = 21; this.ItemsListBox.SelectedIndexChanged += new System.EventHandler(this.ItemsListBox_SelectedIndexChanged); // // label1 @@ -116,16 +106,27 @@ this.label1.TabIndex = 20; this.label1.Text = "Items:"; // + // RotationQuatBox + // + this.RotationQuatBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.RotationQuatBox.Location = new System.Drawing.Point(75, 36); + this.RotationQuatBox.Margin = new System.Windows.Forms.Padding(0); + this.RotationQuatBox.Name = "RotationQuatBox"; + this.RotationQuatBox.Size = new System.Drawing.Size(478, 24); + this.RotationQuatBox.TabIndex = 16; + this.RotationQuatBox.ValueChanged += new System.EventHandler(this.RotationQuatBox_ValueChanged); + // // EditMultiPanel // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(565, 505); + this.Controls.Add(this.RotationQuatBox); this.Controls.Add(this.label1); this.Controls.Add(this.ItemsListBox); this.Controls.Add(this.ScaleTextBox); this.Controls.Add(this.label23); - this.Controls.Add(this.RotationTextBox); this.Controls.Add(this.PositionTextBox); this.Controls.Add(this.label24); this.Controls.Add(this.label25); @@ -141,11 +142,11 @@ private System.Windows.Forms.TextBox ScaleTextBox; private System.Windows.Forms.Label label23; - private System.Windows.Forms.TextBox RotationTextBox; private System.Windows.Forms.TextBox PositionTextBox; private System.Windows.Forms.Label label24; private System.Windows.Forms.Label label25; private System.Windows.Forms.ListBox ItemsListBox; private System.Windows.Forms.Label label1; + private WinForms.QuaternionBox RotationQuatBox; } } \ No newline at end of file diff --git a/CodeWalker/Project/Panels/EditMultiPanel.cs b/CodeWalker/Project/Panels/EditMultiPanel.cs index d9c22d0..0e9c203 100644 --- a/CodeWalker/Project/Panels/EditMultiPanel.cs +++ b/CodeWalker/Project/Panels/EditMultiPanel.cs @@ -1,4 +1,5 @@ -using System; +using SharpDX; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -47,7 +48,7 @@ namespace CodeWalker.Project.Panels if (Items == null) { PositionTextBox.Text = string.Empty; - RotationTextBox.Text = string.Empty; + RotationQuatBox.Value = Quaternion.Identity; ScaleTextBox.Text = string.Empty; ItemsListBox.Items.Clear(); } @@ -57,7 +58,7 @@ namespace CodeWalker.Project.Panels PositionTextBox.Text = FloatUtil.GetVector3String(MultiItem.MultipleSelectionCenter); - RotationTextBox.Text = FloatUtil.GetVector4String(MultiItem.MultipleSelectionRotation.ToVector4()); + RotationQuatBox.Value = MultiItem.MultipleSelectionRotation; ScaleTextBox.Text = FloatUtil.GetVector3String(MultiItem.MultipleSelectionScale); ItemsListBox.Items.Clear(); foreach (var item in Items) @@ -90,21 +91,20 @@ namespace CodeWalker.Project.Panels } - private void RotationTextBox_TextChanged(object sender, EventArgs e) + private void RotationQuatBox_ValueChanged(object sender, EventArgs e) { if (Items == null) return; if (populatingui) return; - var v = FloatUtil.ParseVector4String(RotationTextBox.Text); + var q = RotationQuatBox.Value; var wf = ProjectForm.WorldForm; if (wf != null) { wf.BeginInvoke(new Action(() => { - wf.ChangeMultiRotation(Items, v.ToQuaternion(), false); + wf.ChangeMultiRotation(Items, q, false); })); } - } private void ScaleTextBox_TextChanged(object sender, EventArgs e) diff --git a/CodeWalker/Project/Panels/EditScenarioNodePanel.Designer.cs b/CodeWalker/Project/Panels/EditScenarioNodePanel.Designer.cs index 318d7f3..a2f7dd0 100644 --- a/CodeWalker/Project/Panels/EditScenarioNodePanel.Designer.cs +++ b/CodeWalker/Project/Panels/EditScenarioNodePanel.Designer.cs @@ -126,7 +126,6 @@ this.ScenarioEntityPointSpawnTypeHashLabel = new System.Windows.Forms.Label(); this.ScenarioEntityPointSpawnTypeTextBox = new System.Windows.Forms.TextBox(); this.label120 = new System.Windows.Forms.Label(); - this.ScenarioEntityPointRotationTextBox = new System.Windows.Forms.TextBox(); this.label118 = new System.Windows.Forms.Label(); this.ScenarioEntityPointGoToButton = new System.Windows.Forms.Button(); this.ScenarioEntityPointPositionTextBox = new System.Windows.Forms.TextBox(); @@ -224,6 +223,7 @@ this.label154 = new System.Windows.Forms.Label(); this.ScenarioClusterPointTypeComboBox = new System.Windows.Forms.ComboBox(); this.label155 = new System.Windows.Forms.Label(); + this.ScenarioEntityPointRotationQuatBox = new CodeWalker.WinForms.QuaternionBox(); this.ScenarioTabControl.SuspendLayout(); this.ScenarioPointTabPage.SuspendLayout(); this.ScenarioPointOuterPanel.SuspendLayout(); @@ -1012,6 +1012,7 @@ this.ScenarioEntityPointPanel.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.ScenarioEntityPointPanel.Controls.Add(this.ScenarioEntityPointRotationQuatBox); this.ScenarioEntityPointPanel.Controls.Add(this.ScenarioEntityPointNameHashLabel); this.ScenarioEntityPointPanel.Controls.Add(this.ScenarioEntityPointNameTextBox); this.ScenarioEntityPointPanel.Controls.Add(this.ScenarioEntityPointFlagsCheckedListBox); @@ -1047,7 +1048,6 @@ this.ScenarioEntityPointPanel.Controls.Add(this.ScenarioEntityPointSpawnTypeHashLabel); this.ScenarioEntityPointPanel.Controls.Add(this.ScenarioEntityPointSpawnTypeTextBox); this.ScenarioEntityPointPanel.Controls.Add(this.label120); - this.ScenarioEntityPointPanel.Controls.Add(this.ScenarioEntityPointRotationTextBox); this.ScenarioEntityPointPanel.Controls.Add(this.label118); this.ScenarioEntityPointPanel.Controls.Add(this.ScenarioEntityPointGoToButton); this.ScenarioEntityPointPanel.Controls.Add(this.ScenarioEntityPointPositionTextBox); @@ -1437,16 +1437,6 @@ this.label120.TabIndex = 13; this.label120.Text = "Spawn type:"; // - // ScenarioEntityPointRotationTextBox - // - this.ScenarioEntityPointRotationTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ScenarioEntityPointRotationTextBox.Location = new System.Drawing.Point(109, 27); - this.ScenarioEntityPointRotationTextBox.Name = "ScenarioEntityPointRotationTextBox"; - this.ScenarioEntityPointRotationTextBox.Size = new System.Drawing.Size(313, 20); - this.ScenarioEntityPointRotationTextBox.TabIndex = 9; - this.ScenarioEntityPointRotationTextBox.TextChanged += new System.EventHandler(this.ScenarioEntityPointRotationTextBox_TextChanged); - // // label118 // this.label118.AutoSize = true; @@ -2584,6 +2574,17 @@ this.label155.TabIndex = 10; this.label155.Text = "Type:"; // + // ScenarioEntityPointRotationQuatBox + // + this.ScenarioEntityPointRotationQuatBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.ScenarioEntityPointRotationQuatBox.Location = new System.Drawing.Point(109, 25); + this.ScenarioEntityPointRotationQuatBox.Margin = new System.Windows.Forms.Padding(0); + this.ScenarioEntityPointRotationQuatBox.Name = "ScenarioEntityPointRotationQuatBox"; + this.ScenarioEntityPointRotationQuatBox.Size = new System.Drawing.Size(387, 24); + this.ScenarioEntityPointRotationQuatBox.TabIndex = 9; + this.ScenarioEntityPointRotationQuatBox.ValueChanged += new System.EventHandler(this.ScenarioEntityPointRotationQuatBox_ValueChanged); + // // EditScenarioNodePanel // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -2746,7 +2747,6 @@ private System.Windows.Forms.Label ScenarioEntityPointSpawnTypeHashLabel; private System.Windows.Forms.TextBox ScenarioEntityPointSpawnTypeTextBox; private System.Windows.Forms.Label label120; - private System.Windows.Forms.TextBox ScenarioEntityPointRotationTextBox; private System.Windows.Forms.Label label118; private System.Windows.Forms.Button ScenarioEntityPointGoToButton; private System.Windows.Forms.TextBox ScenarioEntityPointPositionTextBox; @@ -2844,5 +2844,6 @@ private System.Windows.Forms.Label label154; private System.Windows.Forms.ComboBox ScenarioClusterPointTypeComboBox; private System.Windows.Forms.Label label155; + private WinForms.QuaternionBox ScenarioEntityPointRotationQuatBox; } } \ No newline at end of file diff --git a/CodeWalker/Project/Panels/EditScenarioNodePanel.cs b/CodeWalker/Project/Panels/EditScenarioNodePanel.cs index 65c9fae..0445b55 100644 --- a/CodeWalker/Project/Panels/EditScenarioNodePanel.cs +++ b/CodeWalker/Project/Panels/EditScenarioNodePanel.cs @@ -327,7 +327,7 @@ namespace CodeWalker.Project.Panels ScenarioEntityPointNameTextBox.Text = ""; ScenarioEntityPointNameHashLabel.Text = "Hash: 0"; ScenarioEntityPointPositionTextBox.Text = ""; - ScenarioEntityPointRotationTextBox.Text = ""; + ScenarioEntityPointRotationQuatBox.Value = Quaternion.Identity; ScenarioEntityPointSpawnTypeTextBox.Text = ""; ScenarioEntityPointSpawnTypeHashLabel.Text = "Hash: 0"; ScenarioEntityPointPedTypeTextBox.Text = ""; @@ -362,7 +362,7 @@ namespace CodeWalker.Project.Panels ScenarioEntityPointNameTextBox.Text = p.NameHash.ToString(); ScenarioEntityPointNameHashLabel.Text = "Hash: " + p.NameHash.Hash.ToString(); ScenarioEntityPointPositionTextBox.Text = FloatUtil.GetVector3String(p.OffsetPosition); - ScenarioEntityPointRotationTextBox.Text = FloatUtil.GetVector4String(p.OffsetRotation); + ScenarioEntityPointRotationQuatBox.Value = p.OffsetRotation.ToQuaternion(); ScenarioEntityPointSpawnTypeTextBox.Text = p.SpawnType.ToString(); ScenarioEntityPointSpawnTypeHashLabel.Text = "Hash: " + p.SpawnType.Hash.ToString(); ScenarioEntityPointPedTypeTextBox.Text = p.PedType.ToString(); @@ -1266,19 +1266,20 @@ namespace CodeWalker.Project.Panels } } - private void ScenarioEntityPointRotationTextBox_TextChanged(object sender, EventArgs e) + private void ScenarioEntityPointRotationQuatBox_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentScenarioNode == null) return; if (CurrentScenarioNode.EntityPoint == null) return; - Vector4 v = FloatUtil.ParseVector4String(ScenarioEntityPointRotationTextBox.Text); + Quaternion q = ScenarioEntityPointRotationQuatBox.Value; + Vector4 v = q.ToVector4(); bool change = false; lock (ProjectForm.ProjectSyncRoot) { if (CurrentScenarioNode.EntityPoint.OffsetRotation != v) { CurrentScenarioNode.EntityPoint.OffsetRotation = v; - CurrentScenarioNode.Orientation = new Quaternion(v); + CurrentScenarioNode.Orientation = q; ProjectForm.SetScenarioHasChanged(true); change = true; } @@ -2394,8 +2395,5 @@ namespace CodeWalker.Project.Panels } } } - - - } } diff --git a/CodeWalker/Project/Panels/EditYbnBoundsPanel.Designer.cs b/CodeWalker/Project/Panels/EditYbnBoundsPanel.Designer.cs index 1f3c761..cf04e88 100644 --- a/CodeWalker/Project/Panels/EditYbnBoundsPanel.Designer.cs +++ b/CodeWalker/Project/Panels/EditYbnBoundsPanel.Designer.cs @@ -77,17 +77,17 @@ this.CenterGeomTextBox = new System.Windows.Forms.TextBox(); this.label17 = new System.Windows.Forms.Label(); this.CompositeFlagsTabPage = new System.Windows.Forms.TabPage(); - this.CompFlags1CheckedListBox = new System.Windows.Forms.CheckedListBox(); - this.label21 = new System.Windows.Forms.Label(); this.label22 = new System.Windows.Forms.Label(); this.CompFlags2CheckedListBox = new System.Windows.Forms.CheckedListBox(); + this.label21 = new System.Windows.Forms.Label(); + this.CompFlags1CheckedListBox = new System.Windows.Forms.CheckedListBox(); this.CompositeXformTabPage = new System.Windows.Forms.TabPage(); this.CompScaleTextBox = new System.Windows.Forms.TextBox(); this.label23 = new System.Windows.Forms.Label(); - this.CompRotationTextBox = new System.Windows.Forms.TextBox(); this.CompPositionTextBox = new System.Windows.Forms.TextBox(); this.label24 = new System.Windows.Forms.Label(); this.label25 = new System.Windows.Forms.Label(); + this.CompRotationQuatBox = new CodeWalker.WinForms.QuaternionBox(); this.BoundsTabControl.SuspendLayout(); this.BoundsTabPage.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.UnkTypeUpDown)).BeginInit(); @@ -632,60 +632,6 @@ this.CompositeFlagsTabPage.Text = "Composite Flags"; this.CompositeFlagsTabPage.UseVisualStyleBackColor = true; // - // CompFlags1CheckedListBox - // - this.CompFlags1CheckedListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.CompFlags1CheckedListBox.CheckOnClick = true; - this.CompFlags1CheckedListBox.FormattingEnabled = true; - this.CompFlags1CheckedListBox.Items.AddRange(new object[] { - "0 - Unknown", - "1 - Map Weapon", - "2 - Map Dynamic", - "3 - Map Animal", - "4 - Map Cover", - "5 - Map Vehicle", - "6 - Vehicle Not BVH", - "7 - Vehicle BVH", - "8 - Vehicle Box", - "9 - Ped", - "10 - Ragdoll", - "11 - Animal", - "12 - Animal Ragdoll", - "13 - Object", - "14 - Object Env Cloth", - "15 - Plant", - "16 - Projectile", - "17 - Explosion", - "18 - Pickup", - "19 - Foliage", - "20 - Forklift Forks", - "21 - Test Weapon", - "22 - Test Camera", - "23 - Test AI", - "24 - Test Script", - "25 - Test Vehicle Wheel", - "26 - Glass", - "27 - Map River", - "28 - Smoke", - "29 - Unsmashed", - "30 - Map Stairs", - "31 - Map Deep Surface"}); - this.CompFlags1CheckedListBox.Location = new System.Drawing.Point(53, 3); - this.CompFlags1CheckedListBox.Name = "CompFlags1CheckedListBox"; - this.CompFlags1CheckedListBox.Size = new System.Drawing.Size(174, 484); - this.CompFlags1CheckedListBox.TabIndex = 32; - this.CompFlags1CheckedListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.CompFlags1CheckedListBox_ItemCheck); - // - // label21 - // - this.label21.AutoSize = true; - this.label21.Location = new System.Drawing.Point(3, 3); - this.label21.Name = "label21"; - this.label21.Size = new System.Drawing.Size(44, 13); - this.label21.TabIndex = 33; - this.label21.Text = "Flags 1:"; - // // label22 // this.label22.AutoSize = true; @@ -740,11 +686,65 @@ this.CompFlags2CheckedListBox.TabIndex = 34; this.CompFlags2CheckedListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.CompFlags2CheckedListBox_ItemCheck); // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(3, 3); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(44, 13); + this.label21.TabIndex = 33; + this.label21.Text = "Flags 1:"; + // + // CompFlags1CheckedListBox + // + this.CompFlags1CheckedListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.CompFlags1CheckedListBox.CheckOnClick = true; + this.CompFlags1CheckedListBox.FormattingEnabled = true; + this.CompFlags1CheckedListBox.Items.AddRange(new object[] { + "0 - Unknown", + "1 - Map Weapon", + "2 - Map Dynamic", + "3 - Map Animal", + "4 - Map Cover", + "5 - Map Vehicle", + "6 - Vehicle Not BVH", + "7 - Vehicle BVH", + "8 - Vehicle Box", + "9 - Ped", + "10 - Ragdoll", + "11 - Animal", + "12 - Animal Ragdoll", + "13 - Object", + "14 - Object Env Cloth", + "15 - Plant", + "16 - Projectile", + "17 - Explosion", + "18 - Pickup", + "19 - Foliage", + "20 - Forklift Forks", + "21 - Test Weapon", + "22 - Test Camera", + "23 - Test AI", + "24 - Test Script", + "25 - Test Vehicle Wheel", + "26 - Glass", + "27 - Map River", + "28 - Smoke", + "29 - Unsmashed", + "30 - Map Stairs", + "31 - Map Deep Surface"}); + this.CompFlags1CheckedListBox.Location = new System.Drawing.Point(53, 3); + this.CompFlags1CheckedListBox.Name = "CompFlags1CheckedListBox"; + this.CompFlags1CheckedListBox.Size = new System.Drawing.Size(174, 484); + this.CompFlags1CheckedListBox.TabIndex = 32; + this.CompFlags1CheckedListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.CompFlags1CheckedListBox_ItemCheck); + // // CompositeXformTabPage // + this.CompositeXformTabPage.Controls.Add(this.CompRotationQuatBox); this.CompositeXformTabPage.Controls.Add(this.CompScaleTextBox); this.CompositeXformTabPage.Controls.Add(this.label23); - this.CompositeXformTabPage.Controls.Add(this.CompRotationTextBox); this.CompositeXformTabPage.Controls.Add(this.CompPositionTextBox); this.CompositeXformTabPage.Controls.Add(this.label24); this.CompositeXformTabPage.Controls.Add(this.label25); @@ -774,16 +774,6 @@ this.label23.TabIndex = 11; this.label23.Text = "Scale:"; // - // CompRotationTextBox - // - this.CompRotationTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompRotationTextBox.Location = new System.Drawing.Point(72, 38); - this.CompRotationTextBox.Name = "CompRotationTextBox"; - this.CompRotationTextBox.Size = new System.Drawing.Size(500, 20); - this.CompRotationTextBox.TabIndex = 10; - this.CompRotationTextBox.TextChanged += new System.EventHandler(this.CompRotationTextBox_TextChanged); - // // CompPositionTextBox // this.CompPositionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) @@ -812,6 +802,17 @@ this.label25.TabIndex = 7; this.label25.Text = "Position:"; // + // CompRotationQuatBox + // + this.CompRotationQuatBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.CompRotationQuatBox.Location = new System.Drawing.Point(72, 36); + this.CompRotationQuatBox.Margin = new System.Windows.Forms.Padding(0); + this.CompRotationQuatBox.Name = "CompRotationQuatBox"; + this.CompRotationQuatBox.Size = new System.Drawing.Size(500, 24); + this.CompRotationQuatBox.TabIndex = 10; + this.CompRotationQuatBox.ValueChanged += new System.EventHandler(this.CompRotationQuatBox_ValueChanged); + // // EditYbnBoundsPanel // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -898,9 +899,9 @@ private System.Windows.Forms.TabPage CompositeXformTabPage; private System.Windows.Forms.TextBox CompScaleTextBox; private System.Windows.Forms.Label label23; - private System.Windows.Forms.TextBox CompRotationTextBox; private System.Windows.Forms.TextBox CompPositionTextBox; private System.Windows.Forms.Label label24; private System.Windows.Forms.Label label25; + private WinForms.QuaternionBox CompRotationQuatBox; } } \ No newline at end of file diff --git a/CodeWalker/Project/Panels/EditYbnBoundsPanel.cs b/CodeWalker/Project/Panels/EditYbnBoundsPanel.cs index 0eb7532..ff67b77 100644 --- a/CodeWalker/Project/Panels/EditYbnBoundsPanel.cs +++ b/CodeWalker/Project/Panels/EditYbnBoundsPanel.cs @@ -1,4 +1,5 @@ using CodeWalker.GameFiles; +using SharpDX; using System; using System.Collections.Generic; using System.ComponentModel; @@ -102,7 +103,7 @@ namespace CodeWalker.Project.Panels SetCheckedListBoxValues(CompFlags1CheckedListBox, 0); SetCheckedListBoxValues(CompFlags2CheckedListBox, 0); CompPositionTextBox.Text = string.Empty; - CompRotationTextBox.Text = string.Empty; + CompRotationQuatBox.Value = Quaternion.Identity; CompScaleTextBox.Text = string.Empty; VertexCountLabel.Text = "0 vertices"; PolyCountLabel.Text = "0 polygons"; @@ -167,7 +168,7 @@ namespace CodeWalker.Project.Panels SetCheckedListBoxValues(CompFlags1CheckedListBox, (uint)b.CompositeFlags1.Flags1); SetCheckedListBoxValues(CompFlags2CheckedListBox, (uint)b.CompositeFlags1.Flags2); CompPositionTextBox.Text = FloatUtil.GetVector3String(b.Position); - CompRotationTextBox.Text = FloatUtil.GetVector4String(b.Orientation.ToVector4()); + CompRotationQuatBox.Value = b.Orientation; CompScaleTextBox.Text = FloatUtil.GetVector3String(b.Scale); } else @@ -177,7 +178,7 @@ namespace CodeWalker.Project.Panels SetCheckedListBoxValues(CompFlags1CheckedListBox, 0); SetCheckedListBoxValues(CompFlags2CheckedListBox, 0); CompPositionTextBox.Text = string.Empty; - CompRotationTextBox.Text = string.Empty; + CompRotationQuatBox.Value = Quaternion.Identity; CompScaleTextBox.Text = string.Empty; } @@ -571,11 +572,11 @@ namespace CodeWalker.Project.Panels } } - private void CompRotationTextBox_TextChanged(object sender, EventArgs e) + private void CompRotationQuatBox_ValueChanged(object sender, EventArgs e) { if (CollisionBounds == null) return; if (populatingui) return; - var q = FloatUtil.ParseVector4String(CompRotationTextBox.Text).ToQuaternion(); + var q = CompRotationQuatBox.Value; lock (ProjectForm.ProjectSyncRoot) { if (CollisionBounds.Orientation != q) diff --git a/CodeWalker/Project/Panels/EditYmapEntityPanel.Designer.cs b/CodeWalker/Project/Panels/EditYmapEntityPanel.Designer.cs index f70cab1..4606cb7 100644 --- a/CodeWalker/Project/Panels/EditYmapEntityPanel.Designer.cs +++ b/CodeWalker/Project/Panels/EditYmapEntityPanel.Designer.cs @@ -31,6 +31,7 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditYmapEntityPanel)); this.EntityTabControl = new System.Windows.Forms.TabControl(); this.EntityGeneralTabPage = new System.Windows.Forms.TabPage(); + this.EntityRotationQuatBox = new CodeWalker.WinForms.QuaternionBox(); this.EntityEditArchetypeButton = new System.Windows.Forms.Button(); this.EntityFlagsCheckedListBox = new System.Windows.Forms.CheckedListBox(); this.label13 = new System.Windows.Forms.Label(); @@ -62,10 +63,8 @@ this.EntityArchetypeTextBox = new System.Windows.Forms.TextBox(); this.label16 = new System.Windows.Forms.Label(); this.EntityPositionTextBox = new System.Windows.Forms.TextBox(); - this.EntityNormalizeRotationButton = new System.Windows.Forms.Button(); this.EntityGoToButton = new System.Windows.Forms.Button(); this.label17 = new System.Windows.Forms.Label(); - this.EntityRotationTextBox = new System.Windows.Forms.TextBox(); this.EntityLodTabPage = new System.Windows.Forms.TabPage(); this.label20 = new System.Windows.Forms.Label(); this.EntityParentIndexTextBox = new System.Windows.Forms.TextBox(); @@ -74,13 +73,12 @@ this.EntityExtensionsTabPage = new System.Windows.Forms.TabPage(); this.label1 = new System.Windows.Forms.Label(); this.EntityPivotTabPage = new System.Windows.Forms.TabPage(); + this.EntityPivotRotationQuatBox = new CodeWalker.WinForms.QuaternionBox(); this.label95 = new System.Windows.Forms.Label(); this.EntityPivotEditCheckBox = new System.Windows.Forms.CheckBox(); this.label93 = new System.Windows.Forms.Label(); this.EntityPivotPositionTextBox = new System.Windows.Forms.TextBox(); - this.EntityPivotRotationNormalizeButton = new System.Windows.Forms.Button(); this.label94 = new System.Windows.Forms.Label(); - this.EntityPivotRotationTextBox = new System.Windows.Forms.TextBox(); this.EntityMiloTabPage = new System.Windows.Forms.TabPage(); this.MiloFlagsTextBox = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); @@ -118,6 +116,7 @@ // // EntityGeneralTabPage // + this.EntityGeneralTabPage.Controls.Add(this.EntityRotationQuatBox); this.EntityGeneralTabPage.Controls.Add(this.EntityEditArchetypeButton); this.EntityGeneralTabPage.Controls.Add(this.EntityFlagsCheckedListBox); this.EntityGeneralTabPage.Controls.Add(this.label13); @@ -149,10 +148,8 @@ this.EntityGeneralTabPage.Controls.Add(this.EntityArchetypeTextBox); this.EntityGeneralTabPage.Controls.Add(this.label16); this.EntityGeneralTabPage.Controls.Add(this.EntityPositionTextBox); - this.EntityGeneralTabPage.Controls.Add(this.EntityNormalizeRotationButton); this.EntityGeneralTabPage.Controls.Add(this.EntityGoToButton); this.EntityGeneralTabPage.Controls.Add(this.label17); - this.EntityGeneralTabPage.Controls.Add(this.EntityRotationTextBox); this.EntityGeneralTabPage.Location = new System.Drawing.Point(4, 22); this.EntityGeneralTabPage.Name = "EntityGeneralTabPage"; this.EntityGeneralTabPage.Padding = new System.Windows.Forms.Padding(3); @@ -161,6 +158,17 @@ this.EntityGeneralTabPage.Text = "General"; this.EntityGeneralTabPage.UseVisualStyleBackColor = true; // + // EntityRotationQuatBox + // + this.EntityRotationQuatBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.EntityRotationQuatBox.Location = new System.Drawing.Point(93, 33); + this.EntityRotationQuatBox.Margin = new System.Windows.Forms.Padding(0); + this.EntityRotationQuatBox.Name = "EntityRotationQuatBox"; + this.EntityRotationQuatBox.Size = new System.Drawing.Size(456, 24); + this.EntityRotationQuatBox.TabIndex = 5; + this.EntityRotationQuatBox.ValueChanged += new System.EventHandler(this.EntityRotationQuatBox_ValueChanged); + // // EntityEditArchetypeButton // this.EntityEditArchetypeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); @@ -185,7 +193,7 @@ "8 - Unk04", "16 - Unk05", "32 - Static entity", - "64 - Object isn't dark at night", + "64 - Object isn\'t dark at night", "128 - Unk08", "256 - Unk09", "512 - Disable embedded light source", @@ -498,17 +506,6 @@ this.EntityPositionTextBox.TabIndex = 2; this.EntityPositionTextBox.TextChanged += new System.EventHandler(this.EntityPositionTextBox_TextChanged); // - // EntityNormalizeRotationButton - // - this.EntityNormalizeRotationButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.EntityNormalizeRotationButton.Location = new System.Drawing.Point(481, 33); - this.EntityNormalizeRotationButton.Name = "EntityNormalizeRotationButton"; - this.EntityNormalizeRotationButton.Size = new System.Drawing.Size(68, 23); - this.EntityNormalizeRotationButton.TabIndex = 6; - this.EntityNormalizeRotationButton.Text = "Normalize"; - this.EntityNormalizeRotationButton.UseVisualStyleBackColor = true; - this.EntityNormalizeRotationButton.Click += new System.EventHandler(this.EntityNormalizeRotationButton_Click); - // // EntityGoToButton // this.EntityGoToButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); @@ -529,16 +526,6 @@ this.label17.TabIndex = 4; this.label17.Text = "Rotation:"; // - // EntityRotationTextBox - // - this.EntityRotationTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.EntityRotationTextBox.Location = new System.Drawing.Point(93, 35); - this.EntityRotationTextBox.Name = "EntityRotationTextBox"; - this.EntityRotationTextBox.Size = new System.Drawing.Size(382, 20); - this.EntityRotationTextBox.TabIndex = 5; - this.EntityRotationTextBox.TextChanged += new System.EventHandler(this.EntityRotationTextBox_TextChanged); - // // EntityLodTabPage // this.EntityLodTabPage.Controls.Add(this.label20); @@ -612,13 +599,12 @@ // // EntityPivotTabPage // + this.EntityPivotTabPage.Controls.Add(this.EntityPivotRotationQuatBox); this.EntityPivotTabPage.Controls.Add(this.label95); this.EntityPivotTabPage.Controls.Add(this.EntityPivotEditCheckBox); this.EntityPivotTabPage.Controls.Add(this.label93); this.EntityPivotTabPage.Controls.Add(this.EntityPivotPositionTextBox); - this.EntityPivotTabPage.Controls.Add(this.EntityPivotRotationNormalizeButton); this.EntityPivotTabPage.Controls.Add(this.label94); - this.EntityPivotTabPage.Controls.Add(this.EntityPivotRotationTextBox); this.EntityPivotTabPage.Location = new System.Drawing.Point(4, 22); this.EntityPivotTabPage.Name = "EntityPivotTabPage"; this.EntityPivotTabPage.Size = new System.Drawing.Size(555, 476); @@ -626,6 +612,17 @@ this.EntityPivotTabPage.Text = "Pivot"; this.EntityPivotTabPage.UseVisualStyleBackColor = true; // + // EntityPivotRotationQuatBox + // + this.EntityPivotRotationQuatBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.EntityPivotRotationQuatBox.Location = new System.Drawing.Point(93, 94); + this.EntityPivotRotationQuatBox.Margin = new System.Windows.Forms.Padding(0); + this.EntityPivotRotationQuatBox.Name = "EntityPivotRotationQuatBox"; + this.EntityPivotRotationQuatBox.Size = new System.Drawing.Size(456, 24); + this.EntityPivotRotationQuatBox.TabIndex = 25; + this.EntityPivotRotationQuatBox.ValueChanged += new System.EventHandler(this.EntityPivotRotationQuatBox_ValueChanged); + // // label95 // this.label95.Location = new System.Drawing.Point(90, 152); @@ -665,17 +662,6 @@ this.EntityPivotPositionTextBox.TabIndex = 22; this.EntityPivotPositionTextBox.TextChanged += new System.EventHandler(this.EntityPivotPositionTextBox_TextChanged); // - // EntityPivotRotationNormalizeButton - // - this.EntityPivotRotationNormalizeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.EntityPivotRotationNormalizeButton.Location = new System.Drawing.Point(481, 94); - this.EntityPivotRotationNormalizeButton.Name = "EntityPivotRotationNormalizeButton"; - this.EntityPivotRotationNormalizeButton.Size = new System.Drawing.Size(68, 23); - this.EntityPivotRotationNormalizeButton.TabIndex = 26; - this.EntityPivotRotationNormalizeButton.Text = "Normalize"; - this.EntityPivotRotationNormalizeButton.UseVisualStyleBackColor = true; - this.EntityPivotRotationNormalizeButton.Click += new System.EventHandler(this.EntityPivotRotationNormalizeButton_Click); - // // label94 // this.label94.AutoSize = true; @@ -685,16 +671,6 @@ this.label94.TabIndex = 24; this.label94.Text = "Rotation:"; // - // EntityPivotRotationTextBox - // - this.EntityPivotRotationTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.EntityPivotRotationTextBox.Location = new System.Drawing.Point(93, 96); - this.EntityPivotRotationTextBox.Name = "EntityPivotRotationTextBox"; - this.EntityPivotRotationTextBox.Size = new System.Drawing.Size(382, 20); - this.EntityPivotRotationTextBox.TabIndex = 25; - this.EntityPivotRotationTextBox.TextChanged += new System.EventHandler(this.EntityPivotRotationTextBox_TextChanged); - // // EntityMiloTabPage // this.EntityMiloTabPage.Controls.Add(this.MiloFlagsTextBox); @@ -862,10 +838,8 @@ private System.Windows.Forms.TextBox EntityArchetypeTextBox; private System.Windows.Forms.Label label16; private System.Windows.Forms.TextBox EntityPositionTextBox; - private System.Windows.Forms.Button EntityNormalizeRotationButton; private System.Windows.Forms.Button EntityGoToButton; private System.Windows.Forms.Label label17; - private System.Windows.Forms.TextBox EntityRotationTextBox; private System.Windows.Forms.TabPage EntityLodTabPage; private System.Windows.Forms.Label label20; private System.Windows.Forms.TextBox EntityParentIndexTextBox; @@ -877,9 +851,7 @@ private System.Windows.Forms.CheckBox EntityPivotEditCheckBox; private System.Windows.Forms.Label label93; private System.Windows.Forms.TextBox EntityPivotPositionTextBox; - private System.Windows.Forms.Button EntityPivotRotationNormalizeButton; private System.Windows.Forms.Label label94; - private System.Windows.Forms.TextBox EntityPivotRotationTextBox; private System.Windows.Forms.Label label1; private System.Windows.Forms.TabPage EntityMiloTabPage; private System.Windows.Forms.CheckedListBox MiloEntitySetsListBox; @@ -893,5 +865,7 @@ private System.Windows.Forms.TextBox MiloFlagsTextBox; private System.Windows.Forms.Label label6; private System.Windows.Forms.Button EntityEditArchetypeButton; + private WinForms.QuaternionBox EntityRotationQuatBox; + private WinForms.QuaternionBox EntityPivotRotationQuatBox; } } \ No newline at end of file diff --git a/CodeWalker/Project/Panels/EditYmapEntityPanel.cs b/CodeWalker/Project/Panels/EditYmapEntityPanel.cs index e9b2d33..9ee66df 100644 --- a/CodeWalker/Project/Panels/EditYmapEntityPanel.cs +++ b/CodeWalker/Project/Panels/EditYmapEntityPanel.cs @@ -67,7 +67,7 @@ namespace CodeWalker.Project.Panels EntityFlagsTextBox.Text = string.Empty; EntityGuidTextBox.Text = string.Empty; EntityPositionTextBox.Text = string.Empty; - EntityRotationTextBox.Text = string.Empty; + EntityRotationQuatBox.Value = Quaternion.Identity; EntityScaleXYTextBox.Text = string.Empty; EntityScaleZTextBox.Text = string.Empty; EntityParentIndexTextBox.Text = string.Empty; @@ -81,7 +81,7 @@ namespace CodeWalker.Project.Panels EntityTintValueTextBox.Text = string.Empty; EntityPivotEditCheckBox.Checked = false; EntityPivotPositionTextBox.Text = string.Empty; - EntityPivotRotationTextBox.Text = string.Empty; + EntityPivotRotationQuatBox.Value = Quaternion.Identity; foreach (int i in EntityFlagsCheckedListBox.CheckedIndices) { EntityFlagsCheckedListBox.SetItemCheckState(i, CheckState.Unchecked); @@ -100,7 +100,7 @@ namespace CodeWalker.Project.Panels EntityFlagsTextBox.Text = e.flags.ToString(); EntityGuidTextBox.Text = e.guid.ToString(); EntityPositionTextBox.Text = FloatUtil.GetVector3String(e.position); - EntityRotationTextBox.Text = FloatUtil.GetVector4String(e.rotation); + EntityRotationQuatBox.Value = new Quaternion(e.rotation); EntityScaleXYTextBox.Text = FloatUtil.ToString(e.scaleXY); EntityScaleZTextBox.Text = FloatUtil.ToString(e.scaleZ); EntityParentIndexTextBox.Text = e.parentIndex.ToString(); @@ -113,7 +113,7 @@ namespace CodeWalker.Project.Panels EntityArtificialAOTextBox.Text = e.artificialAmbientOcclusion.ToString(); EntityTintValueTextBox.Text = e.tintValue.ToString(); EntityPivotPositionTextBox.Text = FloatUtil.GetVector3String(CurrentEntity.PivotPosition); - EntityPivotRotationTextBox.Text = FloatUtil.GetVector4String(new Vector4(po.X, po.Y, po.Z, po.W)); + EntityPivotRotationQuatBox.Value = po; for (int i = 0; i < EntityFlagsCheckedListBox.Items.Count; i++) { var cv = ((e.flags & (1u << i)) > 0); @@ -394,16 +394,16 @@ namespace CodeWalker.Project.Panels } } - private void EntityRotationTextBox_TextChanged(object sender, EventArgs e) + private void EntityRotationQuatBox_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentEntity == null) return; - Vector4 v = FloatUtil.ParseVector4String(EntityRotationTextBox.Text); + Quaternion q = EntityRotationQuatBox.Value; + Vector4 v = q.ToVector4(); lock (ProjectForm.ProjectSyncRoot) { if (CurrentEntity._CEntityDef.rotation != v) { - Quaternion q = v.ToQuaternion(); var wf = ProjectForm.WorldForm; if (CurrentEntity.MloParent != null) @@ -643,13 +643,6 @@ namespace CodeWalker.Project.Panels ProjectForm.WorldForm.GoToPosition(CurrentEntity.Position, Vector3.One * CurrentEntity.BSRadius); } - private void EntityNormalizeRotationButton_Click(object sender, EventArgs e) - { - Vector4 v = FloatUtil.ParseVector4String(EntityRotationTextBox.Text); - Quaternion q = Quaternion.Normalize(new Quaternion(v)); - EntityRotationTextBox.Text = FloatUtil.GetVector4String(new Vector4(q.X, q.Y, q.Z, q.W)); - } - private void EntityAddToProjectButton_Click(object sender, EventArgs e) { ProjectForm.SetProjectItem(CurrentEntity); @@ -696,12 +689,11 @@ namespace CodeWalker.Project.Panels } } - private void EntityPivotRotationTextBox_TextChanged(object sender, EventArgs e) + private void EntityPivotRotationQuatBox_ValueChanged(object sender, EventArgs e) { if (populatingui) return; if (CurrentEntity == null) return; - Vector4 v = FloatUtil.ParseVector4String(EntityPivotRotationTextBox.Text); - Quaternion q = new Quaternion(v); + Quaternion q = EntityPivotRotationQuatBox.Value; lock (ProjectForm.ProjectSyncRoot) { if (CurrentEntity.PivotOrientation != q) @@ -721,13 +713,7 @@ namespace CodeWalker.Project.Panels } } } - } - private void EntityPivotRotationNormalizeButton_Click(object sender, EventArgs e) - { - Vector4 v = FloatUtil.ParseVector4String(EntityPivotRotationTextBox.Text); - Quaternion q = Quaternion.Normalize(new Quaternion(v)); - EntityPivotRotationTextBox.Text = FloatUtil.GetVector4String(new Vector4(q.X, q.Y, q.Z, q.W)); } private void MiloGroupIDTextBox_TextChanged(object sender, EventArgs e)