diff --git a/CodeWalker/Forms/ModelLightForm.Designer.cs b/CodeWalker/Forms/ModelLightForm.Designer.cs index 4822ec1..4562eea 100644 --- a/CodeWalker/Forms/ModelLightForm.Designer.cs +++ b/CodeWalker/Forms/ModelLightForm.Designer.cs @@ -30,6 +30,7 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ModelLightForm)); this.MainSplitContainer = new System.Windows.Forms.SplitContainer(); + this.DuplicateLightButton = new System.Windows.Forms.Button(); this.DeleteLightButton = new System.Windows.Forms.Button(); this.NewLightButton = new System.Windows.Forms.Button(); this.LightsTreeView = new CodeWalker.WinForms.TreeViewFix(); @@ -113,6 +114,7 @@ this.EditMenu = new System.Windows.Forms.ToolStripMenuItem(); this.EditNewLightMenu = new System.Windows.Forms.ToolStripMenuItem(); this.EditDeleteLightMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.EditDuplicateLightMenu = new System.Windows.Forms.ToolStripMenuItem(); this.OptionsMenu = new System.Windows.Forms.ToolStripMenuItem(); this.OptionsShowOutlinesMenu = new System.Windows.Forms.ToolStripMenuItem(); this.MoveMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -148,6 +150,7 @@ // // MainSplitContainer.Panel1 // + this.MainSplitContainer.Panel1.Controls.Add(this.DuplicateLightButton); this.MainSplitContainer.Panel1.Controls.Add(this.DeleteLightButton); this.MainSplitContainer.Panel1.Controls.Add(this.NewLightButton); this.MainSplitContainer.Panel1.Controls.Add(this.LightsTreeView); @@ -155,10 +158,22 @@ // MainSplitContainer.Panel2 // this.MainSplitContainer.Panel2.Controls.Add(this.LightPropertiesPanel); - this.MainSplitContainer.Size = new System.Drawing.Size(733, 523); + this.MainSplitContainer.Panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.MainSplitContainer_Panel2_Paint); + this.MainSplitContainer.Size = new System.Drawing.Size(733, 561); this.MainSplitContainer.SplitterDistance = 184; this.MainSplitContainer.TabIndex = 0; // + // DuplicateLightButton + // + this.DuplicateLightButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.DuplicateLightButton.Location = new System.Drawing.Point(7, 526); + this.DuplicateLightButton.Name = "DuplicateLightButton"; + this.DuplicateLightButton.Size = new System.Drawing.Size(169, 23); + this.DuplicateLightButton.TabIndex = 8; + this.DuplicateLightButton.Text = "Duplicate Light"; + this.DuplicateLightButton.UseVisualStyleBackColor = true; + this.DuplicateLightButton.Click += new System.EventHandler(this.DuplicateLightButton_Click); + // // DeleteLightButton // this.DeleteLightButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); @@ -279,7 +294,7 @@ this.LightPropertiesPanel.Controls.Add(this.label31); this.LightPropertiesPanel.Location = new System.Drawing.Point(4, 3); this.LightPropertiesPanel.Name = "LightPropertiesPanel"; - this.LightPropertiesPanel.Size = new System.Drawing.Size(538, 517); + this.LightPropertiesPanel.Size = new System.Drawing.Size(529, 517); this.LightPropertiesPanel.TabIndex = 1; // // VolumetricFadeDistanceUpDown @@ -1127,7 +1142,8 @@ // this.EditMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.EditNewLightMenu, - this.EditDeleteLightMenu}); + this.EditDeleteLightMenu, + this.EditDuplicateLightMenu}); this.EditMenu.Name = "EditMenu"; this.EditMenu.Size = new System.Drawing.Size(39, 20); this.EditMenu.Text = "Edit"; @@ -1135,7 +1151,7 @@ // EditNewLightMenu // this.EditNewLightMenu.Name = "EditNewLightMenu"; - this.EditNewLightMenu.Size = new System.Drawing.Size(180, 22); + this.EditNewLightMenu.Size = new System.Drawing.Size(154, 22); this.EditNewLightMenu.Text = "New Light"; this.EditNewLightMenu.Click += new System.EventHandler(this.EditNewLightMenu_Click); // @@ -1143,10 +1159,18 @@ // this.EditDeleteLightMenu.Enabled = false; this.EditDeleteLightMenu.Name = "EditDeleteLightMenu"; - this.EditDeleteLightMenu.Size = new System.Drawing.Size(180, 22); + this.EditDeleteLightMenu.Size = new System.Drawing.Size(154, 22); this.EditDeleteLightMenu.Text = "Delete Light"; this.EditDeleteLightMenu.Click += new System.EventHandler(this.EditDeleteLightMenu_Click); // + // EditDuplicateLightMenu + // + this.EditDuplicateLightMenu.Enabled = false; + this.EditDuplicateLightMenu.Name = "EditDuplicateLightMenu"; + this.EditDuplicateLightMenu.Size = new System.Drawing.Size(154, 22); + this.EditDuplicateLightMenu.Text = "Duplicate Light"; + this.EditDuplicateLightMenu.Click += new System.EventHandler(this.EditDuplicateLightMenu_Click); + // // OptionsMenu // this.OptionsMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -1193,7 +1217,7 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(733, 547); + this.ClientSize = new System.Drawing.Size(733, 585); this.Controls.Add(this.MainSplitContainer); this.Controls.Add(this.MainMenu); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); @@ -1291,6 +1315,7 @@ private System.Windows.Forms.ToolStripMenuItem EditMenu; private System.Windows.Forms.ToolStripMenuItem EditNewLightMenu; private System.Windows.Forms.ToolStripMenuItem EditDeleteLightMenu; + private System.Windows.Forms.ToolStripMenuItem EditDuplicateLightMenu; private System.Windows.Forms.ToolStripMenuItem OptionsMenu; private System.Windows.Forms.ToolStripMenuItem OptionsShowOutlinesMenu; private System.Windows.Forms.ToolStripMenuItem MoveMenuItem; @@ -1319,5 +1344,6 @@ private System.Windows.Forms.NumericUpDown FlashinessUpDown; private System.Windows.Forms.Button DeleteLightButton; private System.Windows.Forms.Button NewLightButton; + private System.Windows.Forms.Button DuplicateLightButton; } } \ No newline at end of file diff --git a/CodeWalker/Forms/ModelLightForm.cs b/CodeWalker/Forms/ModelLightForm.cs index 2e3cf19..be0aa12 100644 --- a/CodeWalker/Forms/ModelLightForm.cs +++ b/CodeWalker/Forms/ModelLightForm.cs @@ -111,6 +111,7 @@ namespace CodeWalker.Forms { DeleteLightButton.Enabled = false; EditDeleteLightMenu.Enabled = false; + EditDuplicateLightMenu.Enabled = false; populatingui = true; PositionTextBox.Text = ""; DirectionTextBox.Text = ""; @@ -154,6 +155,7 @@ namespace CodeWalker.Forms { DeleteLightButton.Enabled = true; EditDeleteLightMenu.Enabled = true; + EditDuplicateLightMenu.Enabled = true; populatingui = true; PositionTextBox.Text = FloatUtil.GetVector3String(light.Position); DirectionTextBox.Text = FloatUtil.GetVector3String(light.Direction); @@ -222,6 +224,57 @@ namespace CodeWalker.Forms light.TimeFlags = 14680191; return light; } + private LightAttributes DuplicateLightAttribute() + { + LightAttributes light = new LightAttributes(); + light.Unknown_0h = selectedLight.Unknown_0h; + light.Unknown_4h = selectedLight.Unknown_4h; + light.Position = selectedLight.Position; + light.Unknown_14h = selectedLight.Unknown_14h; + light.ColorR = selectedLight.ColorR; + light.ColorG = selectedLight.ColorG; + light.ColorB = selectedLight.ColorB; + light.Flashiness = selectedLight.Flashiness; + light.Intensity = selectedLight.Intensity; + light.Flags = selectedLight.Flags; + light.BoneId = selectedLight.BoneId; + light.Type = selectedLight.Type; + light.GroupId = selectedLight.GroupId; + light.TimeFlags = selectedLight.TimeFlags; + light.Falloff = selectedLight.Falloff; + light.FalloffExponent = selectedLight.FalloffExponent; + light.CullingPlaneNormal = selectedLight.CullingPlaneNormal; + light.CullingPlaneOffset = selectedLight.CullingPlaneOffset; + light.ShadowBlur = selectedLight.ShadowBlur; + light.Unknown_45h = selectedLight.Unknown_45h; + light.Unknown_46h = selectedLight.Unknown_46h; + light.VolumeIntensity = selectedLight.VolumeIntensity; + light.VolumeSizeScale = selectedLight.VolumeSizeScale; + light.VolumeOuterColorR = selectedLight.VolumeOuterColorR; + light.VolumeOuterColorG = selectedLight.VolumeOuterColorG; + light.VolumeOuterColorB = selectedLight.VolumeOuterColorB; + light.LightHash = selectedLight.LightHash; + light.VolumeOuterIntensity = selectedLight.VolumeOuterIntensity; + light.CoronaSize = selectedLight.CoronaSize; + light.VolumeOuterExponent = selectedLight.VolumeOuterExponent; + light.LightFadeDistance = selectedLight.LightFadeDistance; + light.ShadowFadeDistance = selectedLight.ShadowFadeDistance; + light.SpecularFadeDistance = selectedLight.SpecularFadeDistance; + light.VolumetricFadeDistance = selectedLight.VolumetricFadeDistance; + light.ShadowNearClip = selectedLight.ShadowNearClip; + light.CoronaIntensity = selectedLight.CoronaIntensity; + light.CoronaZBias = selectedLight.CoronaZBias; + light.Direction = selectedLight.Direction; + light.Tangent = selectedLight.Tangent; + light.ConeInnerAngle = selectedLight.ConeInnerAngle; + light.ConeOuterAngle = selectedLight.ConeOuterAngle; + light.Extent = selectedLight.Extent; + light.ProjectedTextureHash = selectedLight.ProjectedTextureHash; + light.Unknown_A4h = selectedLight.Unknown_A4h; + + return light; + } + private void SelectLight(LightAttributes light) { if (light == null) @@ -318,7 +371,7 @@ namespace CodeWalker.Forms private void DeleteLight() { if (selectedLight == null) return; - if(Drawable != null) + if (Drawable != null) { List lights = Drawable.LightAttributes.data_items.ToList(); lights.Remove(selectedLight); @@ -346,6 +399,50 @@ namespace CodeWalker.Forms LoadModels(DrawableDict); } } + + } + + private void DuplicateLight() + { + if (selectedLight == null) return; + selectedLight = DuplicateLightAttribute(); + if (Drawable != null) + { + if (Drawable.LightAttributes == null) Drawable.LightAttributes = new ResourceSimpleList64(); + List lights = Drawable.LightAttributes.data_items?.ToList() ?? new List(); + lights.Add(selectedLight); + Drawable.LightAttributes.data_items = lights.ToArray(); + UpdateLightParams(); + LoadModel(Drawable); + } + else if (FragDrawable != null) + { + if (FragDrawable.OwnerFragment.LightAttributes == null) FragDrawable.OwnerFragment.LightAttributes = new ResourceSimpleList64(); + List lights = FragDrawable.OwnerFragment.LightAttributes.data_items?.ToList() ?? new List(); + lights.Add(selectedLight); + FragDrawable.OwnerFragment.LightAttributes.data_items = lights.ToArray(); + UpdateLightParams(); + LoadModel(FragDrawable); + } + else + { + var n = LightsTreeView.SelectedNode; + if (n != null) + { + var dr = n.Tag as Drawable; + if (dr == null) { dr = n.Parent.Tag as Drawable; } //try parent node tag also + if (dr != null) + { + if (dr.LightAttributes == null) dr.LightAttributes = new ResourceSimpleList64(); + List lights = dr.LightAttributes.data_items?.ToList() ?? new List(); + lights.Add(selectedLight); + dr.LightAttributes.data_items = lights.ToArray(); + UpdateLightParams(); + LoadModels(DrawableDict); + } + } + } + SelectLightTreeNode(selectedLight); } private void UpdateFlagsCheckBoxes() @@ -933,6 +1030,11 @@ namespace CodeWalker.Forms DeleteLight(); } + private void EditDuplicateLightMenu_Click(object sender, EventArgs e) + { + DuplicateLight(); + } + private void OptionsShowOutlinesMenu_Click(object sender, EventArgs e) { OptionsShowOutlinesMenu.Checked = !OptionsShowOutlinesMenu.Checked; @@ -969,5 +1071,15 @@ namespace CodeWalker.Forms { DeleteLight(); } + + private void DuplicateLightButton_Click(object sender, EventArgs e) + { + DuplicateLight(); + } + + private void MainSplitContainer_Panel2_Paint(object sender, PaintEventArgs e) + { + + } } }