diff --git a/CodeWalker/Project/Panels/DeleteGrassPanel.Designer.cs b/CodeWalker/Project/Panels/DeleteGrassPanel.Designer.cs new file mode 100644 index 0000000..3c1eaf4 --- /dev/null +++ b/CodeWalker/Project/Panels/DeleteGrassPanel.Designer.cs @@ -0,0 +1,219 @@ +namespace CodeWalker.Project.Panels +{ + partial class DeleteGrassPanel + { + /// + /// 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 Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.brushModeGroupBox = new System.Windows.Forms.GroupBox(); + this.brushDeleteAnyRadio = new System.Windows.Forms.RadioButton(); + this.brushDeleteYmapRadio = new System.Windows.Forms.RadioButton(); + this.brushDisabledRadio = new System.Windows.Forms.RadioButton(); + this.brushSettingsGroupBox = new System.Windows.Forms.GroupBox(); + this.RadiusNumericUpDown = new System.Windows.Forms.NumericUpDown(); + this.radiusLabel = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.brushDeleteBatchRadio = new System.Windows.Forms.RadioButton(); + this.currentYmapTextBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.brushDeleteProjectRadio = new System.Windows.Forms.RadioButton(); + this.brushModeGroupBox.SuspendLayout(); + this.brushSettingsGroupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.RadiusNumericUpDown)).BeginInit(); + this.SuspendLayout(); + // + // brushModeGroupBox + // + this.brushModeGroupBox.Controls.Add(this.brushDeleteProjectRadio); + this.brushModeGroupBox.Controls.Add(this.brushDeleteBatchRadio); + this.brushModeGroupBox.Controls.Add(this.brushDeleteAnyRadio); + this.brushModeGroupBox.Controls.Add(this.brushDeleteYmapRadio); + this.brushModeGroupBox.Controls.Add(this.brushDisabledRadio); + this.brushModeGroupBox.Location = new System.Drawing.Point(12, 12); + this.brushModeGroupBox.Name = "brushModeGroupBox"; + this.brushModeGroupBox.Size = new System.Drawing.Size(187, 138); + this.brushModeGroupBox.TabIndex = 70; + this.brushModeGroupBox.TabStop = false; + this.brushModeGroupBox.Text = "Delete Grass Brush Mode"; + // + // brushDeleteAnyRadio + // + this.brushDeleteAnyRadio.AutoSize = true; + this.brushDeleteAnyRadio.Location = new System.Drawing.Point(16, 109); + this.brushDeleteAnyRadio.Name = "brushDeleteAnyRadio"; + this.brushDeleteAnyRadio.Size = new System.Drawing.Size(122, 17); + this.brushDeleteAnyRadio.TabIndex = 4; + this.brushDeleteAnyRadio.Text = "Delete In A&ny YMAP"; + this.brushDeleteAnyRadio.UseVisualStyleBackColor = true; + // + // brushDeleteYmapRadio + // + this.brushDeleteYmapRadio.AutoSize = true; + this.brushDeleteYmapRadio.Location = new System.Drawing.Point(16, 65); + this.brushDeleteYmapRadio.Name = "brushDeleteYmapRadio"; + this.brushDeleteYmapRadio.Size = new System.Drawing.Size(124, 17); + this.brushDeleteYmapRadio.TabIndex = 3; + this.brushDeleteYmapRadio.Text = "Delete In This &YMAP"; + this.brushDeleteYmapRadio.UseVisualStyleBackColor = true; + // + // brushDisabledRadio + // + this.brushDisabledRadio.AutoSize = true; + this.brushDisabledRadio.Checked = true; + this.brushDisabledRadio.Location = new System.Drawing.Point(16, 21); + this.brushDisabledRadio.Name = "brushDisabledRadio"; + this.brushDisabledRadio.Size = new System.Drawing.Size(66, 17); + this.brushDisabledRadio.TabIndex = 0; + this.brushDisabledRadio.TabStop = true; + this.brushDisabledRadio.Text = "&Disabled"; + this.brushDisabledRadio.UseVisualStyleBackColor = true; + // + // brushSettingsGroupBox + // + this.brushSettingsGroupBox.Controls.Add(this.RadiusNumericUpDown); + this.brushSettingsGroupBox.Controls.Add(this.radiusLabel); + this.brushSettingsGroupBox.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.brushSettingsGroupBox.Location = new System.Drawing.Point(221, 13); + this.brushSettingsGroupBox.Name = "brushSettingsGroupBox"; + this.brushSettingsGroupBox.Size = new System.Drawing.Size(140, 59); + this.brushSettingsGroupBox.TabIndex = 71; + this.brushSettingsGroupBox.TabStop = false; + this.brushSettingsGroupBox.Text = "Delete Brush Settings"; + // + // RadiusNumericUpDown + // + this.RadiusNumericUpDown.DecimalPlaces = 1; + this.RadiusNumericUpDown.Increment = new decimal(new int[] { + 5, + 0, + 0, + 65536}); + this.RadiusNumericUpDown.Location = new System.Drawing.Point(52, 28); + this.RadiusNumericUpDown.Name = "RadiusNumericUpDown"; + this.RadiusNumericUpDown.Size = new System.Drawing.Size(65, 20); + this.RadiusNumericUpDown.TabIndex = 11; + this.RadiusNumericUpDown.Value = new decimal(new int[] { + 5, + 0, + 0, + 0}); + // + // radiusLabel + // + this.radiusLabel.AutoSize = true; + this.radiusLabel.Location = new System.Drawing.Point(6, 30); + this.radiusLabel.Name = "radiusLabel"; + this.radiusLabel.Size = new System.Drawing.Size(40, 13); + this.radiusLabel.TabIndex = 10; + this.radiusLabel.Text = "Radius"; + // + // label1 + // + this.label1.Location = new System.Drawing.Point(12, 163); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(397, 48); + this.label1.TabIndex = 72; + this.label1.Text = "Hold CTRL to use delete brush. In \"Any YMAP\" mode new YMAPs will be automatically" + + " added to the project."; + // + // brushDeleteBatchRadio + // + this.brushDeleteBatchRadio.AutoSize = true; + this.brushDeleteBatchRadio.Location = new System.Drawing.Point(16, 43); + this.brushDeleteBatchRadio.Name = "brushDeleteBatchRadio"; + this.brushDeleteBatchRadio.Size = new System.Drawing.Size(122, 17); + this.brushDeleteBatchRadio.TabIndex = 5; + this.brushDeleteBatchRadio.Text = "Delete In This &Batch"; + this.brushDeleteBatchRadio.UseVisualStyleBackColor = true; + // + // currentYmapTextBox + // + this.currentYmapTextBox.Enabled = false; + this.currentYmapTextBox.Location = new System.Drawing.Point(221, 118); + this.currentYmapTextBox.Name = "currentYmapTextBox"; + this.currentYmapTextBox.ReadOnly = true; + this.currentYmapTextBox.Size = new System.Drawing.Size(188, 20); + this.currentYmapTextBox.TabIndex = 73; + this.currentYmapTextBox.Visible = false; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(218, 102); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 13); + this.label2.TabIndex = 74; + this.label2.Text = "Current YMAP"; + this.label2.Visible = false; + // + // brushDeleteProjectRadio + // + this.brushDeleteProjectRadio.AutoSize = true; + this.brushDeleteProjectRadio.Location = new System.Drawing.Point(16, 87); + this.brushDeleteProjectRadio.Name = "brushDeleteProjectRadio"; + this.brushDeleteProjectRadio.Size = new System.Drawing.Size(158, 17); + this.brushDeleteProjectRadio.TabIndex = 6; + this.brushDeleteProjectRadio.Text = "Delete In Any &Project YMAP"; + this.brushDeleteProjectRadio.UseVisualStyleBackColor = true; + // + // DeleteGrassPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(430, 228); + this.Controls.Add(this.label2); + this.Controls.Add(this.currentYmapTextBox); + this.Controls.Add(this.label1); + this.Controls.Add(this.brushSettingsGroupBox); + this.Controls.Add(this.brushModeGroupBox); + this.Name = "DeleteGrassPanel"; + this.Text = "Delete Grass Instances"; + this.brushModeGroupBox.ResumeLayout(false); + this.brushModeGroupBox.PerformLayout(); + this.brushSettingsGroupBox.ResumeLayout(false); + this.brushSettingsGroupBox.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.RadiusNumericUpDown)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox brushModeGroupBox; + private System.Windows.Forms.RadioButton brushDeleteAnyRadio; + private System.Windows.Forms.RadioButton brushDeleteYmapRadio; + private System.Windows.Forms.RadioButton brushDisabledRadio; + private System.Windows.Forms.GroupBox brushSettingsGroupBox; + private System.Windows.Forms.NumericUpDown RadiusNumericUpDown; + private System.Windows.Forms.Label radiusLabel; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.RadioButton brushDeleteBatchRadio; + private System.Windows.Forms.TextBox currentYmapTextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.RadioButton brushDeleteProjectRadio; + } +} \ No newline at end of file diff --git a/CodeWalker/Project/Panels/DeleteGrassPanel.cs b/CodeWalker/Project/Panels/DeleteGrassPanel.cs new file mode 100644 index 0000000..f4b788d --- /dev/null +++ b/CodeWalker/Project/Panels/DeleteGrassPanel.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using WeifenLuo.WinFormsUI.Docking; + +namespace CodeWalker.Project.Panels +{ + public partial class DeleteGrassPanel : ProjectPanel + { + internal enum DeleteGrassMode + { + None, + Batch, + Ymap, + Project, + Any + } + + public ProjectForm ProjectForm { get; set; } + public ProjectFile CurrentProjectFile { get; set; } + + public DeleteGrassPanel(ProjectForm projectForm) + { + ProjectForm = projectForm; + InitializeComponent(); + + if (ProjectForm?.WorldForm == null) + { + //could happen in some other startup mode - world form is required for this.. + brushModeGroupBox.Enabled = false; + } + + this.DockStateChanged += onDockStateChanged; + // currentYmapTextBox.DataBindings.Add("Text", ProjectForm, "CurrentYmapName", false, DataSourceUpdateMode.OnPropertyChanged); + + } + + private void onDockStateChanged(object sender, EventArgs e) + { + if(DockState == DockState.Hidden) + { + brushDisabledRadio.Checked = true; + brushDisabledRadio.Focus(); + } + } + + public void SetProject(ProjectFile project) + { + CurrentProjectFile = project; + } + + internal DeleteGrassMode Mode + { + get + { + if (brushDeleteBatchRadio.Checked) return DeleteGrassMode.Batch; + else if (brushDeleteYmapRadio.Checked) return DeleteGrassMode.Ymap; + else if (brushDeleteProjectRadio.Checked) return DeleteGrassMode.Project; + else if (brushDeleteAnyRadio.Checked) return DeleteGrassMode.Any; + else return DeleteGrassMode.None; + } + } + + internal float BrushRadius => (float)RadiusNumericUpDown.Value; + } +} diff --git a/CodeWalker/Project/Panels/DeleteGrassPanel.resx b/CodeWalker/Project/Panels/DeleteGrassPanel.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/CodeWalker/Project/Panels/DeleteGrassPanel.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/EditYmapGrassPanel.Designer.cs b/CodeWalker/Project/Panels/EditYmapGrassPanel.Designer.cs index c281c66..2199b2f 100644 --- a/CodeWalker/Project/Panels/EditYmapGrassPanel.Designer.cs +++ b/CodeWalker/Project/Panels/EditYmapGrassPanel.Designer.cs @@ -77,6 +77,8 @@ this.OptmizationThresholdNumericUpDown = new System.Windows.Forms.NumericUpDown(); this.BrushModeCheckBox = new System.Windows.Forms.CheckBox(); this.label8 = new System.Windows.Forms.Label(); + this.brushModeGroupBox = new System.Windows.Forms.GroupBox(); + this.label16 = new System.Windows.Forms.Label(); this.tabControl1.SuspendLayout(); this.GrassBatchTab.SuspendLayout(); this.groupBox1.SuspendLayout(); @@ -92,6 +94,7 @@ ((System.ComponentModel.ISupportInitialize)(this.DensityNumericUpDown)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.RadiusNumericUpDown)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.OptmizationThresholdNumericUpDown)).BeginInit(); + this.brushModeGroupBox.SuspendLayout(); this.SuspendLayout(); // // tabControl1 @@ -101,7 +104,7 @@ this.tabControl1.Location = new System.Drawing.Point(12, 65); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(486, 181); + this.tabControl1.Size = new System.Drawing.Size(525, 214); this.tabControl1.TabIndex = 37; // // GrassBatchTab @@ -110,7 +113,7 @@ this.GrassBatchTab.Location = new System.Drawing.Point(4, 22); this.GrassBatchTab.Name = "GrassBatchTab"; this.GrassBatchTab.Padding = new System.Windows.Forms.Padding(3); - this.GrassBatchTab.Size = new System.Drawing.Size(478, 155); + this.GrassBatchTab.Size = new System.Drawing.Size(517, 183); this.GrassBatchTab.TabIndex = 0; this.GrassBatchTab.Text = "Grass Batch"; this.GrassBatchTab.UseVisualStyleBackColor = true; @@ -130,7 +133,7 @@ this.groupBox1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.groupBox1.Location = new System.Drawing.Point(12, 6); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(460, 143); + this.groupBox1.Size = new System.Drawing.Size(460, 135); this.groupBox1.TabIndex = 42; this.groupBox1.TabStop = false; this.groupBox1.Text = "Batch"; @@ -250,12 +253,13 @@ // // BrushTab // + this.BrushTab.Controls.Add(this.brushModeGroupBox); this.BrushTab.Controls.Add(this.groupBox2); this.BrushTab.Controls.Add(this.brushSettingsGroupBox); this.BrushTab.Location = new System.Drawing.Point(4, 22); this.BrushTab.Name = "BrushTab"; this.BrushTab.Padding = new System.Windows.Forms.Padding(3); - this.BrushTab.Size = new System.Drawing.Size(478, 155); + this.BrushTab.Size = new System.Drawing.Size(517, 188); this.BrushTab.TabIndex = 1; this.BrushTab.Text = " Brush"; this.BrushTab.UseVisualStyleBackColor = true; @@ -272,9 +276,9 @@ this.groupBox2.Controls.Add(this.label3); this.groupBox2.Controls.Add(this.RandomizeScaleCheckBox); this.groupBox2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.groupBox2.Location = new System.Drawing.Point(191, 3); + this.groupBox2.Location = new System.Drawing.Point(265, 6); this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(281, 146); + this.groupBox2.Size = new System.Drawing.Size(246, 176); this.groupBox2.TabIndex = 39; this.groupBox2.TabStop = false; this.groupBox2.Text = "Instance Settings"; @@ -384,23 +388,23 @@ this.brushSettingsGroupBox.Controls.Add(this.label5); this.brushSettingsGroupBox.Controls.Add(this.radiusLabel); this.brushSettingsGroupBox.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.brushSettingsGroupBox.Location = new System.Drawing.Point(8, 3); + this.brushSettingsGroupBox.Location = new System.Drawing.Point(11, 6); this.brushSettingsGroupBox.Name = "brushSettingsGroupBox"; - this.brushSettingsGroupBox.Size = new System.Drawing.Size(177, 146); + this.brushSettingsGroupBox.Size = new System.Drawing.Size(246, 71); this.brushSettingsGroupBox.TabIndex = 38; this.brushSettingsGroupBox.TabStop = false; this.brushSettingsGroupBox.Text = "Brush Settings"; // // DensityNumericUpDown // - this.DensityNumericUpDown.Location = new System.Drawing.Point(76, 57); + this.DensityNumericUpDown.Location = new System.Drawing.Point(187, 28); this.DensityNumericUpDown.Maximum = new decimal(new int[] { 128, 0, 0, 0}); this.DensityNumericUpDown.Name = "DensityNumericUpDown"; - this.DensityNumericUpDown.Size = new System.Drawing.Size(84, 20); + this.DensityNumericUpDown.Size = new System.Drawing.Size(53, 20); this.DensityNumericUpDown.TabIndex = 20; this.DensityNumericUpDown.Value = new decimal(new int[] { 28, @@ -410,15 +414,15 @@ // // RadiusNumericUpDown // - this.RadiusNumericUpDown.DecimalPlaces = 2; + this.RadiusNumericUpDown.DecimalPlaces = 1; this.RadiusNumericUpDown.Increment = new decimal(new int[] { 1, 0, 0, - 131072}); - this.RadiusNumericUpDown.Location = new System.Drawing.Point(76, 31); + 65536}); + this.RadiusNumericUpDown.Location = new System.Drawing.Point(52, 28); this.RadiusNumericUpDown.Name = "RadiusNumericUpDown"; - this.RadiusNumericUpDown.Size = new System.Drawing.Size(84, 20); + this.RadiusNumericUpDown.Size = new System.Drawing.Size(65, 20); this.RadiusNumericUpDown.TabIndex = 11; this.RadiusNumericUpDown.Value = new decimal(new int[] { 5, @@ -430,7 +434,7 @@ // label5 // this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(21, 59); + this.label5.Location = new System.Drawing.Point(141, 30); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(42, 13); this.label5.TabIndex = 19; @@ -439,7 +443,7 @@ // radiusLabel // this.radiusLabel.AutoSize = true; - this.radiusLabel.Location = new System.Drawing.Point(21, 33); + this.radiusLabel.Location = new System.Drawing.Point(6, 30); this.radiusLabel.Name = "radiusLabel"; this.radiusLabel.Size = new System.Drawing.Size(40, 13); this.radiusLabel.TabIndex = 10; @@ -447,7 +451,7 @@ // // OptimizeBatchButton // - this.OptimizeBatchButton.Location = new System.Drawing.Point(16, 280); + this.OptimizeBatchButton.Location = new System.Drawing.Point(16, 296); this.OptimizeBatchButton.Name = "OptimizeBatchButton"; this.OptimizeBatchButton.Size = new System.Drawing.Size(108, 24); this.OptimizeBatchButton.TabIndex = 70; @@ -461,16 +465,16 @@ // this.ExtentsMinTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.ExtentsMinTextBox.Location = new System.Drawing.Point(84, 319); + this.ExtentsMinTextBox.Location = new System.Drawing.Point(84, 335); this.ExtentsMinTextBox.Name = "ExtentsMinTextBox"; this.ExtentsMinTextBox.ReadOnly = true; - this.ExtentsMinTextBox.Size = new System.Drawing.Size(380, 20); + this.ExtentsMinTextBox.Size = new System.Drawing.Size(449, 20); this.ExtentsMinTextBox.TabIndex = 55; // // label14 // this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(13, 349); + this.label14.Location = new System.Drawing.Point(13, 365); this.label14.Name = "label14"; this.label14.Size = new System.Drawing.Size(68, 13); this.label14.TabIndex = 54; @@ -480,16 +484,16 @@ // this.ExtentsMaxTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.ExtentsMaxTextBox.Location = new System.Drawing.Point(84, 345); + this.ExtentsMaxTextBox.Location = new System.Drawing.Point(84, 361); this.ExtentsMaxTextBox.Name = "ExtentsMaxTextBox"; this.ExtentsMaxTextBox.ReadOnly = true; - this.ExtentsMaxTextBox.Size = new System.Drawing.Size(380, 20); + this.ExtentsMaxTextBox.Size = new System.Drawing.Size(449, 20); this.ExtentsMaxTextBox.TabIndex = 53; // // label13 // this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(13, 322); + this.label13.Location = new System.Drawing.Point(13, 338); this.label13.Name = "label13"; this.label13.Size = new System.Drawing.Size(65, 13); this.label13.TabIndex = 52; @@ -498,7 +502,7 @@ // GrassDeleteButton // this.GrassDeleteButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.GrassDeleteButton.Location = new System.Drawing.Point(257, 397); + this.GrassDeleteButton.Location = new System.Drawing.Point(276, 397); this.GrassDeleteButton.Name = "GrassDeleteButton"; this.GrassDeleteButton.Size = new System.Drawing.Size(95, 23); this.GrassDeleteButton.TabIndex = 51; @@ -509,7 +513,7 @@ // GrassAddToProjectButton // this.GrassAddToProjectButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.GrassAddToProjectButton.Location = new System.Drawing.Point(159, 397); + this.GrassAddToProjectButton.Location = new System.Drawing.Point(178, 397); this.GrassAddToProjectButton.Name = "GrassAddToProjectButton"; this.GrassAddToProjectButton.Size = new System.Drawing.Size(95, 23); this.GrassAddToProjectButton.TabIndex = 50; @@ -550,7 +554,7 @@ this.PositionTextBox.Location = new System.Drawing.Point(66, 39); this.PositionTextBox.Name = "PositionTextBox"; this.PositionTextBox.ReadOnly = true; - this.PositionTextBox.Size = new System.Drawing.Size(275, 20); + this.PositionTextBox.Size = new System.Drawing.Size(314, 20); this.PositionTextBox.TabIndex = 58; // // label1 @@ -565,7 +569,7 @@ // GrassGoToButton // this.GrassGoToButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.GrassGoToButton.Location = new System.Drawing.Point(347, 36); + this.GrassGoToButton.Location = new System.Drawing.Point(386, 36); this.GrassGoToButton.Name = "GrassGoToButton"; this.GrassGoToButton.Size = new System.Drawing.Size(56, 23); this.GrassGoToButton.TabIndex = 56; @@ -576,7 +580,7 @@ // label17 // this.label17.AutoSize = true; - this.label17.Location = new System.Drawing.Point(130, 286); + this.label17.Location = new System.Drawing.Point(130, 302); this.label17.Name = "label17"; this.label17.Size = new System.Drawing.Size(54, 13); this.label17.TabIndex = 71; @@ -584,7 +588,7 @@ // // OptmizationThresholdNumericUpDown // - this.OptmizationThresholdNumericUpDown.Location = new System.Drawing.Point(190, 284); + this.OptmizationThresholdNumericUpDown.Location = new System.Drawing.Point(190, 300); this.OptmizationThresholdNumericUpDown.Maximum = new decimal(new int[] { 999999, 0, @@ -602,7 +606,7 @@ // BrushModeCheckBox // this.BrushModeCheckBox.AutoSize = true; - this.BrushModeCheckBox.Location = new System.Drawing.Point(16, 252); + this.BrushModeCheckBox.Location = new System.Drawing.Point(12, 25); this.BrushModeCheckBox.Name = "BrushModeCheckBox"; this.BrushModeCheckBox.Size = new System.Drawing.Size(83, 17); this.BrushModeCheckBox.TabIndex = 68; @@ -619,17 +623,36 @@ this.label8.TabIndex = 72; this.label8.Text = ".ydr"; this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // brushModeGroupBox + // + this.brushModeGroupBox.Controls.Add(this.label16); + this.brushModeGroupBox.Controls.Add(this.BrushModeCheckBox); + this.brushModeGroupBox.Location = new System.Drawing.Point(8, 83); + this.brushModeGroupBox.Name = "brushModeGroupBox"; + this.brushModeGroupBox.Size = new System.Drawing.Size(249, 99); + this.brushModeGroupBox.TabIndex = 69; + this.brushModeGroupBox.TabStop = false; + this.brushModeGroupBox.Text = "Brush Mode"; + // + // label16 + // + this.label16.Location = new System.Drawing.Point(9, 49); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(231, 40); + this.label16.TabIndex = 69; + this.label16.Text = "Hold CTRL to paint instances in this batch. Hold CTRL+SHIFT to delete in this bat" + + "ch. Open Tools menu for bulk delete option."; // // EditYmapGrassPanel // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(510, 443); + this.ClientSize = new System.Drawing.Size(549, 443); this.Controls.Add(this.label8); this.Controls.Add(this.label17); this.Controls.Add(this.OptmizationThresholdNumericUpDown); this.Controls.Add(this.OptimizeBatchButton); - this.Controls.Add(this.BrushModeCheckBox); this.Controls.Add(this.HashLabel); this.Controls.Add(this.ExtentsMinTextBox); this.Controls.Add(this.ArchetypeNameTextBox); @@ -664,6 +687,8 @@ ((System.ComponentModel.ISupportInitialize)(this.DensityNumericUpDown)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.RadiusNumericUpDown)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.OptmizationThresholdNumericUpDown)).EndInit(); + this.brushModeGroupBox.ResumeLayout(false); + this.brushModeGroupBox.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -718,5 +743,7 @@ private System.Windows.Forms.Button OptimizeBatchButton; private System.Windows.Forms.CheckBox BrushModeCheckBox; private System.Windows.Forms.Label label8; + private System.Windows.Forms.GroupBox brushModeGroupBox; + private System.Windows.Forms.Label label16; } } \ No newline at end of file diff --git a/CodeWalker/Project/Panels/EditYmapGrassPanel.cs b/CodeWalker/Project/Panels/EditYmapGrassPanel.cs index f6a2898..fd5a5f8 100644 --- a/CodeWalker/Project/Panels/EditYmapGrassPanel.cs +++ b/CodeWalker/Project/Panels/EditYmapGrassPanel.cs @@ -9,10 +9,8 @@ using SharpDX; // - COMPLETED -- Optimization feature. // - COMPLETED -- Remove grass instances using CTRL + SHIFT + LMB -// - Better gizmo for grass brush (like a circle with a little line in the middle sticking upwards) // - Maybe some kind of auto coloring system? I've noticed that mostly all grass in GTA inherits it's color from the surface it's on. // - Grass area fill (generate grass on ydr based on colision materials?) -// - Need to have a way to erase instances from other batches in the current batches ymap. // if we optimize our instances, we'd have to go through each batch to erase, this is very monotonous. // BUG @@ -265,27 +263,6 @@ namespace CodeWalker.Project.Panels BatchChanged(); } - public void EraseInstancesAtMouse(SpaceRayIntersectResult mouseRay) - { - var wf = ProjectForm.WorldForm; - if (wf == null) return; - var changed = false; - lock (wf.RenderSyncRoot) - { - if (CurrentBatch.EraseInstancesAtMouse( - CurrentBatch, - mouseRay, - (float) RadiusNumericUpDown.Value - )) - { - wf.UpdateGrassBatchGraphics(CurrentBatch); - changed = true; - } - } - - if (changed) BatchChanged(); - } - #endregion #region Privates @@ -296,7 +273,7 @@ namespace CodeWalker.Project.Panels return res; } - private void BatchChanged() + internal void BatchChanged() { UpdateControls(); CurrentBatch.UpdateInstanceCount(); diff --git a/CodeWalker/Project/ProjectForm.Designer.cs b/CodeWalker/Project/ProjectForm.Designer.cs index 8cf527a..3882513 100644 --- a/CodeWalker/Project/ProjectForm.Designer.cs +++ b/CodeWalker/Project/ProjectForm.Designer.cs @@ -69,6 +69,14 @@ this.ViewThemeBlueMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ViewThemeLightMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ViewThemeDarkMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolsMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolsManifestGeneratorMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolsLODLightsGeneratorMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolsNavMeshGeneratorMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.ToolsImportMenyooXmlMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator31 = new System.Windows.Forms.ToolStripSeparator(); + this.deleteGrassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.YmapMenu = new System.Windows.Forms.ToolStripMenuItem(); this.YmapNameMenu = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); @@ -113,6 +121,22 @@ this.toolStripSeparator26 = new System.Windows.Forms.ToolStripSeparator(); this.YbnAddToProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); this.YbnRemoveFromProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.YdrMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.YdrNameMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.YdrRemoveFromProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.YddMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.YddNameMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.YddRemoveFromProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.YftMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.YftNameMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator30 = new System.Windows.Forms.ToolStripSeparator(); + this.YftRemoveFromProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.YtdMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.YtdNameMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator29 = new System.Windows.Forms.ToolStripSeparator(); + this.YtdRemoveFromProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); this.YndMenu = new System.Windows.Forms.ToolStripMenuItem(); this.YndNameMenu = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); @@ -158,12 +182,6 @@ this.toolStripSeparator24 = new System.Windows.Forms.ToolStripSeparator(); this.AudioAddToProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); this.AudioRemoveFromProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsManifestGeneratorMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsLODLightsGeneratorMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsNavMeshGeneratorMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.ToolsImportMenyooXmlMenu = new System.Windows.Forms.ToolStripMenuItem(); this.OptionsMenu = new System.Windows.Forms.ToolStripMenuItem(); this.OptionsRenderGtavMapMenu = new System.Windows.Forms.ToolStripMenuItem(); this.OptionsRenderProjectItemsMenu = new System.Windows.Forms.ToolStripMenuItem(); @@ -195,22 +213,6 @@ this.ToolbarSaveAllButton = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); this.FolderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog(); - this.YdrMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.YddMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.YftMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.YtdMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.YdrNameMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.YddNameMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.YftNameMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.YtdNameMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator29 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripSeparator30 = new System.Windows.Forms.ToolStripSeparator(); - this.YdrRemoveFromProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.YddRemoveFromProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.YftRemoveFromProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.YtdRemoveFromProjectMenu = new System.Windows.Forms.ToolStripMenuItem(); this.MainMenu.SuspendLayout(); this.MainToolbar.SuspendLayout(); this.SuspendLayout(); @@ -221,6 +223,7 @@ this.FileMenu, this.EditMenu, this.ViewMenu, + this.ToolsMenu, this.YmapMenu, this.YtypMenu, this.YbnMenu, @@ -233,7 +236,6 @@ this.TrainsMenu, this.ScenarioMenu, this.AudioMenu, - this.ToolsMenu, this.OptionsMenu}); this.MainMenu.Location = new System.Drawing.Point(0, 0); this.MainMenu.Name = "MainMenu"; @@ -547,6 +549,65 @@ this.ViewThemeDarkMenu.Text = "Dark"; this.ViewThemeDarkMenu.Click += new System.EventHandler(this.ViewThemeDarkMenu_Click); // + // ToolsMenu + // + this.ToolsMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ToolsManifestGeneratorMenu, + this.ToolsLODLightsGeneratorMenu, + this.ToolsNavMeshGeneratorMenu, + this.toolStripSeparator2, + this.ToolsImportMenyooXmlMenu, + this.toolStripSeparator31, + this.deleteGrassToolStripMenuItem}); + this.ToolsMenu.Name = "ToolsMenu"; + this.ToolsMenu.Size = new System.Drawing.Size(46, 20); + this.ToolsMenu.Text = "Tools"; + // + // ToolsManifestGeneratorMenu + // + this.ToolsManifestGeneratorMenu.Name = "ToolsManifestGeneratorMenu"; + this.ToolsManifestGeneratorMenu.Size = new System.Drawing.Size(196, 22); + this.ToolsManifestGeneratorMenu.Text = "Manifest Generator..."; + this.ToolsManifestGeneratorMenu.Click += new System.EventHandler(this.ToolsManifestGeneratorMenu_Click); + // + // ToolsLODLightsGeneratorMenu + // + this.ToolsLODLightsGeneratorMenu.Name = "ToolsLODLightsGeneratorMenu"; + this.ToolsLODLightsGeneratorMenu.Size = new System.Drawing.Size(196, 22); + this.ToolsLODLightsGeneratorMenu.Text = "LOD Lights Generator..."; + this.ToolsLODLightsGeneratorMenu.Click += new System.EventHandler(this.ToolsLODLightsGeneratorMenu_Click); + // + // ToolsNavMeshGeneratorMenu + // + this.ToolsNavMeshGeneratorMenu.Name = "ToolsNavMeshGeneratorMenu"; + this.ToolsNavMeshGeneratorMenu.Size = new System.Drawing.Size(196, 22); + this.ToolsNavMeshGeneratorMenu.Text = "Nav Mesh Generator..."; + this.ToolsNavMeshGeneratorMenu.Click += new System.EventHandler(this.ToolsNavMeshGeneratorMenu_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(193, 6); + // + // ToolsImportMenyooXmlMenu + // + this.ToolsImportMenyooXmlMenu.Name = "ToolsImportMenyooXmlMenu"; + this.ToolsImportMenyooXmlMenu.Size = new System.Drawing.Size(196, 22); + this.ToolsImportMenyooXmlMenu.Text = "Import Menyoo XML..."; + this.ToolsImportMenyooXmlMenu.Click += new System.EventHandler(this.ToolsImportMenyooXmlMenu_Click); + // + // toolStripSeparator31 + // + this.toolStripSeparator31.Name = "toolStripSeparator31"; + this.toolStripSeparator31.Size = new System.Drawing.Size(193, 6); + // + // deleteGrassToolStripMenuItem + // + this.deleteGrassToolStripMenuItem.Name = "deleteGrassToolStripMenuItem"; + this.deleteGrassToolStripMenuItem.Size = new System.Drawing.Size(196, 22); + this.deleteGrassToolStripMenuItem.Text = "Delete Grass..."; + this.deleteGrassToolStripMenuItem.Click += new System.EventHandler(this.ToolsDeleteGrassMenu_Click); + // // YmapMenu // this.YmapMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -901,6 +962,130 @@ this.YbnRemoveFromProjectMenu.Text = "Remove from Project"; this.YbnRemoveFromProjectMenu.Click += new System.EventHandler(this.YbnRemoveFromProjectMenu_Click); // + // YdrMenu + // + this.YdrMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.YdrNameMenu, + this.toolStripSeparator6, + this.YdrRemoveFromProjectMenu}); + this.YdrMenu.Name = "YdrMenu"; + this.YdrMenu.Size = new System.Drawing.Size(36, 20); + this.YdrMenu.Text = "Ydr"; + this.YdrMenu.Visible = false; + // + // YdrNameMenu + // + this.YdrNameMenu.Enabled = false; + this.YdrNameMenu.Name = "YdrNameMenu"; + this.YdrNameMenu.Size = new System.Drawing.Size(186, 22); + this.YdrNameMenu.Text = "(No .ydr file selected)"; + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + this.toolStripSeparator6.Size = new System.Drawing.Size(183, 6); + // + // YdrRemoveFromProjectMenu + // + this.YdrRemoveFromProjectMenu.Enabled = false; + this.YdrRemoveFromProjectMenu.Name = "YdrRemoveFromProjectMenu"; + this.YdrRemoveFromProjectMenu.Size = new System.Drawing.Size(186, 22); + this.YdrRemoveFromProjectMenu.Text = "Remove from Project"; + this.YdrRemoveFromProjectMenu.Click += new System.EventHandler(this.YdrRemoveFromProjectMenu_Click); + // + // YddMenu + // + this.YddMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.YddNameMenu, + this.toolStripSeparator9, + this.YddRemoveFromProjectMenu}); + this.YddMenu.Name = "YddMenu"; + this.YddMenu.Size = new System.Drawing.Size(39, 20); + this.YddMenu.Text = "Ydd"; + this.YddMenu.Visible = false; + // + // YddNameMenu + // + this.YddNameMenu.Enabled = false; + this.YddNameMenu.Name = "YddNameMenu"; + this.YddNameMenu.Size = new System.Drawing.Size(189, 22); + this.YddNameMenu.Text = "(No .ydd file selected)"; + // + // toolStripSeparator9 + // + this.toolStripSeparator9.Name = "toolStripSeparator9"; + this.toolStripSeparator9.Size = new System.Drawing.Size(186, 6); + // + // YddRemoveFromProjectMenu + // + this.YddRemoveFromProjectMenu.Enabled = false; + this.YddRemoveFromProjectMenu.Name = "YddRemoveFromProjectMenu"; + this.YddRemoveFromProjectMenu.Size = new System.Drawing.Size(189, 22); + this.YddRemoveFromProjectMenu.Text = "Remove from Project"; + this.YddRemoveFromProjectMenu.Click += new System.EventHandler(this.YddRemoveFromProjectMenu_Click); + // + // YftMenu + // + this.YftMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.YftNameMenu, + this.toolStripSeparator30, + this.YftRemoveFromProjectMenu}); + this.YftMenu.Name = "YftMenu"; + this.YftMenu.Size = new System.Drawing.Size(34, 20); + this.YftMenu.Text = "Yft"; + this.YftMenu.Visible = false; + // + // YftNameMenu + // + this.YftNameMenu.Enabled = false; + this.YftNameMenu.Name = "YftNameMenu"; + this.YftNameMenu.Size = new System.Drawing.Size(186, 22); + this.YftNameMenu.Text = "(No .yft file selected)"; + // + // toolStripSeparator30 + // + this.toolStripSeparator30.Name = "toolStripSeparator30"; + this.toolStripSeparator30.Size = new System.Drawing.Size(183, 6); + // + // YftRemoveFromProjectMenu + // + this.YftRemoveFromProjectMenu.Enabled = false; + this.YftRemoveFromProjectMenu.Name = "YftRemoveFromProjectMenu"; + this.YftRemoveFromProjectMenu.Size = new System.Drawing.Size(186, 22); + this.YftRemoveFromProjectMenu.Text = "Remove from Project"; + this.YftRemoveFromProjectMenu.Click += new System.EventHandler(this.YftRemoveFromProjectMenu_Click); + // + // YtdMenu + // + this.YtdMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.YtdNameMenu, + this.toolStripSeparator29, + this.YtdRemoveFromProjectMenu}); + this.YtdMenu.Name = "YtdMenu"; + this.YtdMenu.Size = new System.Drawing.Size(37, 20); + this.YtdMenu.Text = "Ytd"; + this.YtdMenu.Visible = false; + // + // YtdNameMenu + // + this.YtdNameMenu.Enabled = false; + this.YtdNameMenu.Name = "YtdNameMenu"; + this.YtdNameMenu.Size = new System.Drawing.Size(186, 22); + this.YtdNameMenu.Text = "(No .ytd file selected)"; + // + // toolStripSeparator29 + // + this.toolStripSeparator29.Name = "toolStripSeparator29"; + this.toolStripSeparator29.Size = new System.Drawing.Size(183, 6); + // + // YtdRemoveFromProjectMenu + // + this.YtdRemoveFromProjectMenu.Enabled = false; + this.YtdRemoveFromProjectMenu.Name = "YtdRemoveFromProjectMenu"; + this.YtdRemoveFromProjectMenu.Size = new System.Drawing.Size(186, 22); + this.YtdRemoveFromProjectMenu.Text = "Remove from Project"; + this.YtdRemoveFromProjectMenu.Click += new System.EventHandler(this.YtdRemoveFromProjectMenu_Click); + // // YndMenu // this.YndMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -1266,51 +1451,6 @@ this.AudioRemoveFromProjectMenu.Text = "Remove from Project"; this.AudioRemoveFromProjectMenu.Click += new System.EventHandler(this.AudioRemoveFromProjectMenu_Click); // - // ToolsMenu - // - this.ToolsMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolsManifestGeneratorMenu, - this.ToolsLODLightsGeneratorMenu, - this.ToolsNavMeshGeneratorMenu, - this.toolStripSeparator2, - this.ToolsImportMenyooXmlMenu}); - this.ToolsMenu.Name = "ToolsMenu"; - this.ToolsMenu.Size = new System.Drawing.Size(46, 20); - this.ToolsMenu.Text = "Tools"; - // - // ToolsManifestGeneratorMenu - // - this.ToolsManifestGeneratorMenu.Name = "ToolsManifestGeneratorMenu"; - this.ToolsManifestGeneratorMenu.Size = new System.Drawing.Size(196, 22); - this.ToolsManifestGeneratorMenu.Text = "Manifest Generator..."; - this.ToolsManifestGeneratorMenu.Click += new System.EventHandler(this.ToolsManifestGeneratorMenu_Click); - // - // ToolsLODLightsGeneratorMenu - // - this.ToolsLODLightsGeneratorMenu.Name = "ToolsLODLightsGeneratorMenu"; - this.ToolsLODLightsGeneratorMenu.Size = new System.Drawing.Size(196, 22); - this.ToolsLODLightsGeneratorMenu.Text = "LOD Lights Generator..."; - this.ToolsLODLightsGeneratorMenu.Click += new System.EventHandler(this.ToolsLODLightsGeneratorMenu_Click); - // - // ToolsNavMeshGeneratorMenu - // - this.ToolsNavMeshGeneratorMenu.Name = "ToolsNavMeshGeneratorMenu"; - this.ToolsNavMeshGeneratorMenu.Size = new System.Drawing.Size(196, 22); - this.ToolsNavMeshGeneratorMenu.Text = "Nav Mesh Generator..."; - this.ToolsNavMeshGeneratorMenu.Click += new System.EventHandler(this.ToolsNavMeshGeneratorMenu_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(193, 6); - // - // ToolsImportMenyooXmlMenu - // - this.ToolsImportMenyooXmlMenu.Name = "ToolsImportMenyooXmlMenu"; - this.ToolsImportMenyooXmlMenu.Size = new System.Drawing.Size(196, 22); - this.ToolsImportMenyooXmlMenu.Text = "Import Menyoo XML..."; - this.ToolsImportMenyooXmlMenu.Click += new System.EventHandler(this.ToolsImportMenyooXmlMenu_Click); - // // OptionsMenu // this.OptionsMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -1558,130 +1698,6 @@ this.toolStripSeparator5.Name = "toolStripSeparator5"; this.toolStripSeparator5.Size = new System.Drawing.Size(6, 25); // - // YdrMenu - // - this.YdrMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.YdrNameMenu, - this.toolStripSeparator6, - this.YdrRemoveFromProjectMenu}); - this.YdrMenu.Name = "YdrMenu"; - this.YdrMenu.Size = new System.Drawing.Size(36, 20); - this.YdrMenu.Text = "Ydr"; - this.YdrMenu.Visible = false; - // - // YddMenu - // - this.YddMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.YddNameMenu, - this.toolStripSeparator9, - this.YddRemoveFromProjectMenu}); - this.YddMenu.Name = "YddMenu"; - this.YddMenu.Size = new System.Drawing.Size(39, 20); - this.YddMenu.Text = "Ydd"; - this.YddMenu.Visible = false; - // - // YftMenu - // - this.YftMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.YftNameMenu, - this.toolStripSeparator30, - this.YftRemoveFromProjectMenu}); - this.YftMenu.Name = "YftMenu"; - this.YftMenu.Size = new System.Drawing.Size(34, 20); - this.YftMenu.Text = "Yft"; - this.YftMenu.Visible = false; - // - // YtdMenu - // - this.YtdMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.YtdNameMenu, - this.toolStripSeparator29, - this.YtdRemoveFromProjectMenu}); - this.YtdMenu.Name = "YtdMenu"; - this.YtdMenu.Size = new System.Drawing.Size(37, 20); - this.YtdMenu.Text = "Ytd"; - this.YtdMenu.Visible = false; - // - // YdrNameMenu - // - this.YdrNameMenu.Enabled = false; - this.YdrNameMenu.Name = "YdrNameMenu"; - this.YdrNameMenu.Size = new System.Drawing.Size(186, 22); - this.YdrNameMenu.Text = "(No .ydr file selected)"; - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(183, 6); - // - // YddNameMenu - // - this.YddNameMenu.Enabled = false; - this.YddNameMenu.Name = "YddNameMenu"; - this.YddNameMenu.Size = new System.Drawing.Size(189, 22); - this.YddNameMenu.Text = "(No .ydd file selected)"; - // - // toolStripSeparator9 - // - this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(186, 6); - // - // YftNameMenu - // - this.YftNameMenu.Enabled = false; - this.YftNameMenu.Name = "YftNameMenu"; - this.YftNameMenu.Size = new System.Drawing.Size(186, 22); - this.YftNameMenu.Text = "(No .yft file selected)"; - // - // YtdNameMenu - // - this.YtdNameMenu.Enabled = false; - this.YtdNameMenu.Name = "YtdNameMenu"; - this.YtdNameMenu.Size = new System.Drawing.Size(186, 22); - this.YtdNameMenu.Text = "(No .ytd file selected)"; - // - // toolStripSeparator29 - // - this.toolStripSeparator29.Name = "toolStripSeparator29"; - this.toolStripSeparator29.Size = new System.Drawing.Size(183, 6); - // - // toolStripSeparator30 - // - this.toolStripSeparator30.Name = "toolStripSeparator30"; - this.toolStripSeparator30.Size = new System.Drawing.Size(183, 6); - // - // YdrRemoveFromProjectMenu - // - this.YdrRemoveFromProjectMenu.Enabled = false; - this.YdrRemoveFromProjectMenu.Name = "YdrRemoveFromProjectMenu"; - this.YdrRemoveFromProjectMenu.Size = new System.Drawing.Size(186, 22); - this.YdrRemoveFromProjectMenu.Text = "Remove from Project"; - this.YdrRemoveFromProjectMenu.Click += new System.EventHandler(this.YdrRemoveFromProjectMenu_Click); - // - // YddRemoveFromProjectMenu - // - this.YddRemoveFromProjectMenu.Enabled = false; - this.YddRemoveFromProjectMenu.Name = "YddRemoveFromProjectMenu"; - this.YddRemoveFromProjectMenu.Size = new System.Drawing.Size(189, 22); - this.YddRemoveFromProjectMenu.Text = "Remove from Project"; - this.YddRemoveFromProjectMenu.Click += new System.EventHandler(this.YddRemoveFromProjectMenu_Click); - // - // YftRemoveFromProjectMenu - // - this.YftRemoveFromProjectMenu.Enabled = false; - this.YftRemoveFromProjectMenu.Name = "YftRemoveFromProjectMenu"; - this.YftRemoveFromProjectMenu.Size = new System.Drawing.Size(186, 22); - this.YftRemoveFromProjectMenu.Text = "Remove from Project"; - this.YftRemoveFromProjectMenu.Click += new System.EventHandler(this.YftRemoveFromProjectMenu_Click); - // - // YtdRemoveFromProjectMenu - // - this.YtdRemoveFromProjectMenu.Enabled = false; - this.YtdRemoveFromProjectMenu.Name = "YtdRemoveFromProjectMenu"; - this.YtdRemoveFromProjectMenu.Size = new System.Drawing.Size(186, 22); - this.YtdRemoveFromProjectMenu.Text = "Remove from Project"; - this.YtdRemoveFromProjectMenu.Click += new System.EventHandler(this.YtdRemoveFromProjectMenu_Click); - // // ProjectForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -1889,5 +1905,7 @@ private System.Windows.Forms.ToolStripMenuItem YtdNameMenu; private System.Windows.Forms.ToolStripSeparator toolStripSeparator29; private System.Windows.Forms.ToolStripMenuItem YtdRemoveFromProjectMenu; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator31; + private System.Windows.Forms.ToolStripMenuItem deleteGrassToolStripMenuItem; } } \ No newline at end of file diff --git a/CodeWalker/Project/ProjectForm.cs b/CodeWalker/Project/ProjectForm.cs index 9d0160b..8fa6f85 100644 --- a/CodeWalker/Project/ProjectForm.cs +++ b/CodeWalker/Project/ProjectForm.cs @@ -25,7 +25,7 @@ namespace CodeWalker.Project public ThemeBase Theme { get; private set; } public ProjectExplorerPanel ProjectExplorer { get; set; } public ProjectPanel PreviewPanel { get; set; } - + public DeleteGrassPanel DeleteGrassPanel { get; set; } public GameFileCache GameFileCache { get; private set; } public RpfManager RpfMan { get; private set; } @@ -357,6 +357,13 @@ namespace CodeWalker.Project (panel) => { panel.SetProject(CurrentProjectFile); }, //updateFunc (panel) => { return true; }); //findFunc } + public void ShowDeleteGrassPanel(bool promote) + { + ShowPanel(promote, + () => { DeleteGrassPanel = new DeleteGrassPanel(this); return DeleteGrassPanel; }, //createFunc + (panel) => { panel.SetProject(CurrentProjectFile); panel.IsFloat = true; }, //updateFunc + (panel) => { return true; }); //findFunc + } public void ShowGenerateLODLightsPanel(bool promote) { ShowPanel(promote, @@ -1099,20 +1106,19 @@ namespace CodeWalker.Project public bool CanPaintInstances() { - // Possibly future proofing for procedural prop instances - if (CurrentGrassBatch != null) + if ((CurrentGrassBatch != null && CurrentGrassBatch.BrushEnabled) || (DeleteGrassPanel != null && DeleteGrassPanel.Mode != DeleteGrassPanel.DeleteGrassMode.None)) { - if (CurrentGrassBatch.BrushEnabled) - return true; + return true; } - return false; } public float GetInstanceBrushRadius() { - if (CurrentGrassBatch != null) - return CurrentGrassBatch.BrushRadius; - + var mode = (DeleteGrassPanel?.Mode ?? DeleteGrassPanel.DeleteGrassMode.None); + if (mode == DeleteGrassPanel.DeleteGrassMode.None || mode == DeleteGrassPanel.DeleteGrassMode.Batch) + return CurrentGrassBatch?.BrushRadius ?? 0f; + else if (DeleteGrassPanel != null && mode != DeleteGrassPanel.DeleteGrassMode.None) + return DeleteGrassPanel.BrushRadius; return 0f; } @@ -2311,6 +2317,15 @@ namespace CodeWalker.Project return batch; } + public void AddGrassBatchToProject(YmapGrassInstanceBatch batch) + { + var ymap = batch.Ymap; + if (!YmapExistsInProject(ymap)) + { + ymap.HasChanged = true; + AddYmapToProject(ymap); + } + } public void AddGrassBatchToProject() { if (CurrentGrassBatch == null) return; @@ -2373,26 +2388,36 @@ namespace CodeWalker.Project return true; } - public void PaintGrass(SpaceRayIntersectResult mouseRay, bool erase) + public void PaintGrass(SpaceRayIntersectResult mouseRay, InputManager input) { try { if (InvokeRequired) { - Invoke(new Action(() => { PaintGrass(mouseRay, erase); })); + Invoke(new Action(() => { PaintGrass(mouseRay, input); })); return; } if (!mouseRay.Hit || !mouseRay.TestComplete) return; - if (CurrentGrassBatch == null || (!CurrentGrassBatch.BrushEnabled)) return; // brush isn't enabled right now - EditYmapGrassPanel panel = FindPanel(x => x.CurrentBatch == CurrentGrassBatch); - if (panel == null) return; // no panels with this batch + + EditYmapGrassPanel batchPanel = FindPanel(x => x.CurrentBatch == CurrentGrassBatch); + if (batchPanel == null && DeleteGrassPanel == null) return; // no relevant panels // TODO: Maybe move these functions into the batch instead of the grass panel? // although, the panel does have the brush settings. - if (!erase) - panel.CreateInstancesAtMouse(mouseRay); - else panel.EraseInstancesAtMouse(mouseRay); + + var mode = DeleteGrassPanel?.Mode; + + if (CurrentGrassBatch != null && batchPanel != null && (mode == DeleteGrassPanel.DeleteGrassMode.Batch || (CurrentGrassBatch.BrushEnabled && input.ShiftPressed))) + BulkEraseGrassInstancesAtMouse(mouseRay, (y) => y == CurrentYmapFile, (b) => b == CurrentGrassBatch); + else if (CurrentYmapFile != null && mode == DeleteGrassPanel.DeleteGrassMode.Ymap) + BulkEraseGrassInstancesAtMouse(mouseRay, (y) => y == CurrentYmapFile); + else if (mode == DeleteGrassPanel.DeleteGrassMode.Project) + BulkEraseGrassInstancesAtMouse(mouseRay, YmapExistsInProject); + else if (mode == DeleteGrassPanel.DeleteGrassMode.Any) + BulkEraseGrassInstancesAtMouse(mouseRay); + else if (batchPanel != null && CurrentGrassBatch != null && CurrentGrassBatch.BrushEnabled) + batchPanel.CreateInstancesAtMouse(mouseRay); } catch { } } @@ -2400,6 +2425,7 @@ namespace CodeWalker.Project { if (CurrentProjectFile?.YmapFiles == null) return false; if (CurrentProjectFile.YmapFiles.Count <= 0) return false; + if (CurrentProjectFile.YmapFiles.Contains(batch.Ymap)) return true; foreach (var ymapFile in CurrentProjectFile.YmapFiles) { if (ymapFile.GrassInstanceBatches == null) continue; @@ -2412,6 +2438,53 @@ namespace CodeWalker.Project return false; } + public void BulkEraseGrassInstancesAtMouse(SpaceRayIntersectResult mouseRay) => BulkEraseGrassInstancesAtMouse(mouseRay, (y) => true); + public void BulkEraseGrassInstancesAtMouse(SpaceRayIntersectResult mouseRay, Predicate ymapFilter) => BulkEraseGrassInstancesAtMouse(mouseRay, ymapFilter, (b) => true); + public void BulkEraseGrassInstancesAtMouse(SpaceRayIntersectResult mouseRay, Predicate ymapFilter, Predicate batchFilter) + { + if (!mouseRay.Hit) return; + + float radius = DeleteGrassPanel?.BrushRadius ?? 5f; + var mouseSphere = new BoundingSphere(mouseRay.Position, radius); + if (WorldForm == null) return; + lock (WorldForm.RenderSyncRoot) + { + foreach (var ymap in WorldForm.Renderer.VisibleYmaps) + { + if (ymap.GrassInstanceBatches == null) continue; + if (!ymapFilter(ymap)) continue; + + for (int i = 0; i < ymap.GrassInstanceBatches.Length; i++) + { + var gb = ymap.GrassInstanceBatches[i]; + if (!batchFilter(gb)) continue; + + BoundingBox bbox = new BoundingBox(); + MapBox mb = new MapBox(); + mb.BBMin = gb.AABBMin; + mb.BBMax = gb.AABBMax; + mb.Orientation = Quaternion.Identity; + mb.Scale = Vector3.One; + + bbox.Minimum = mb.BBMin; + bbox.Maximum = mb.BBMax; + + // do not continue if mouse position + radius is not in this instance's bounding box + if (!bbox.Intersects(mouseSphere)) continue; + + if (gb.EraseInstancesAtMouse(gb, mouseRay, radius)) + { + WorldForm.UpdateGrassBatchGraphics(gb); + AddGrassBatchToProject(gb); + + var gbp = FindPanel(panel => panel.CurrentBatch == CurrentGrassBatch); + gbp?.BatchChanged(); + } + } + } + } + } + public YmapCarGen NewCarGen(YmapCarGen copy = null, bool copyPosition = false, bool selectNew = true) { if (CurrentYmapFile == null) return null; @@ -9538,7 +9611,10 @@ namespace CodeWalker.Project { ImportMenyooXml(); } - + private void ToolsDeleteGrassMenu_Click(object sender, EventArgs e) + { + ShowDeleteGrassPanel(true); + } private void OptionsRenderGtavMapMenu_Click(object sender, EventArgs e) { OptionsRenderGtavMapMenu.Checked = !OptionsRenderGtavMapMenu.Checked; @@ -9656,6 +9732,5 @@ namespace CodeWalker.Project { SaveAll(); } - } } diff --git a/CodeWalker/WorldForm.cs b/CodeWalker/WorldForm.cs index 3971d75..80bfc4a 100644 --- a/CodeWalker/WorldForm.cs +++ b/CodeWalker/WorldForm.cs @@ -2701,7 +2701,7 @@ namespace CodeWalker } private void UpdateMouseHits(YmapFile ymap) { - //find mouse hits for things like time cycle mods and car generators in ymaps. + //find mouse hits for things like MLOs, time cycle mods, grass batches, and car generators in ymaps. BoundingBox bbox = new BoundingBox(); Ray mray = new Ray(); @@ -6019,7 +6019,7 @@ namespace CodeWalker { if (ProjectForm != null && MouseLButtonDown) { - ProjectForm.PaintGrass(MouseRayCollision, Input.ShiftPressed); + ProjectForm.PaintGrass(MouseRayCollision, Input); } ControlBrushTimer = 0; }