mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2026-05-15 00:44:49 +08:00
added grass painting
This commit is contained in:
@@ -138,6 +138,18 @@ namespace CodeWalker.Project.Panels
|
||||
|
||||
}
|
||||
}
|
||||
if (ymap.GrassInstanceBatches != null)
|
||||
{
|
||||
foreach (var batch in ymap.GrassInstanceBatches)
|
||||
{
|
||||
var ytyp = batch.Archetype?.Ytyp;
|
||||
var ytypname = getYtypName(ytyp);
|
||||
if (ytyp != null)
|
||||
{
|
||||
mapdeps[ytypname] = ytyp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sb.AppendLine(" <Item>");
|
||||
sb.AppendLine(" <imapName>" + ymapname + "</imapName>");
|
||||
|
||||
+682
-6
@@ -28,35 +28,711 @@
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditYmapGrassPanel));
|
||||
this.tabControl1 = new System.Windows.Forms.TabControl();
|
||||
this.GrassBatchTab = new System.Windows.Forms.TabPage();
|
||||
this.label17 = new System.Windows.Forms.Label();
|
||||
this.OptmizationThresholdNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.textBox5 = new System.Windows.Forms.TextBox();
|
||||
this.OptimizeBatchButton = new System.Windows.Forms.Button();
|
||||
this.label14 = new System.Windows.Forms.Label();
|
||||
this.textBox4 = new System.Windows.Forms.TextBox();
|
||||
this.label13 = new System.Windows.Forms.Label();
|
||||
this.HashLabel = new System.Windows.Forms.Label();
|
||||
this.ArchetypeNameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label7 = new System.Windows.Forms.Label();
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.label12 = new System.Windows.Forms.Label();
|
||||
this.label11 = new System.Windows.Forms.Label();
|
||||
this.OrientToTerrainNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.ScaleRangeTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label10 = new System.Windows.Forms.Label();
|
||||
this.LodFadeRangeNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.label9 = new System.Windows.Forms.Label();
|
||||
this.LodFadeStartDistanceNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.label6 = new System.Windows.Forms.Label();
|
||||
this.LodDistNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.PositionTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.GrassGoToButton = new System.Windows.Forms.Button();
|
||||
this.GrassDeleteButton = new System.Windows.Forms.Button();
|
||||
this.GrassAddToProjectButton = new System.Windows.Forms.Button();
|
||||
this.BrushTab = new System.Windows.Forms.TabPage();
|
||||
this.label16 = new System.Windows.Forms.Label();
|
||||
this.label8 = new System.Windows.Forms.Label();
|
||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
||||
this.GrassColorLabel = new System.Windows.Forms.Label();
|
||||
this.label15 = new System.Windows.Forms.Label();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.AoNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.PadTextBox = new System.Windows.Forms.TextBox();
|
||||
this.ScaleNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.RandomizeScaleCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.BrushModeCheckBox = new System.Windows.Forms.CheckBox();
|
||||
this.brushSettingsGroupBox = new System.Windows.Forms.GroupBox();
|
||||
this.DensityNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.RadiusNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.label5 = new System.Windows.Forms.Label();
|
||||
this.radiusLabel = new System.Windows.Forms.Label();
|
||||
this.label18 = new System.Windows.Forms.Label();
|
||||
this.OptimizeBatchButtonTooltip = new System.Windows.Forms.ToolTip(this.components);
|
||||
this.tabControl1.SuspendLayout();
|
||||
this.GrassBatchTab.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.OptmizationThresholdNumericUpDown)).BeginInit();
|
||||
this.groupBox1.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.OrientToTerrainNumericUpDown)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.LodFadeRangeNumericUpDown)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.LodFadeStartDistanceNumericUpDown)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.LodDistNumericUpDown)).BeginInit();
|
||||
this.BrushTab.SuspendLayout();
|
||||
this.groupBox2.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.AoNumericUpDown)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ScaleNumericUpDown)).BeginInit();
|
||||
this.brushSettingsGroupBox.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.DensityNumericUpDown)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.RadiusNumericUpDown)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// tabControl1
|
||||
//
|
||||
this.tabControl1.Controls.Add(this.GrassBatchTab);
|
||||
this.tabControl1.Controls.Add(this.BrushTab);
|
||||
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tabControl1.Location = new System.Drawing.Point(0, 0);
|
||||
this.tabControl1.Name = "tabControl1";
|
||||
this.tabControl1.SelectedIndex = 0;
|
||||
this.tabControl1.Size = new System.Drawing.Size(554, 355);
|
||||
this.tabControl1.TabIndex = 37;
|
||||
//
|
||||
// GrassBatchTab
|
||||
//
|
||||
this.GrassBatchTab.Controls.Add(this.label18);
|
||||
this.GrassBatchTab.Controls.Add(this.label17);
|
||||
this.GrassBatchTab.Controls.Add(this.OptmizationThresholdNumericUpDown);
|
||||
this.GrassBatchTab.Controls.Add(this.textBox5);
|
||||
this.GrassBatchTab.Controls.Add(this.OptimizeBatchButton);
|
||||
this.GrassBatchTab.Controls.Add(this.label14);
|
||||
this.GrassBatchTab.Controls.Add(this.textBox4);
|
||||
this.GrassBatchTab.Controls.Add(this.label13);
|
||||
this.GrassBatchTab.Controls.Add(this.HashLabel);
|
||||
this.GrassBatchTab.Controls.Add(this.ArchetypeNameTextBox);
|
||||
this.GrassBatchTab.Controls.Add(this.label7);
|
||||
this.GrassBatchTab.Controls.Add(this.groupBox1);
|
||||
this.GrassBatchTab.Controls.Add(this.PositionTextBox);
|
||||
this.GrassBatchTab.Controls.Add(this.label1);
|
||||
this.GrassBatchTab.Controls.Add(this.GrassGoToButton);
|
||||
this.GrassBatchTab.Controls.Add(this.GrassDeleteButton);
|
||||
this.GrassBatchTab.Controls.Add(this.GrassAddToProjectButton);
|
||||
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(546, 329);
|
||||
this.GrassBatchTab.TabIndex = 0;
|
||||
this.GrassBatchTab.Text = "Grass Batch";
|
||||
this.GrassBatchTab.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label17
|
||||
//
|
||||
this.label17.AutoSize = true;
|
||||
this.label17.Location = new System.Drawing.Point(400, 241);
|
||||
this.label17.Name = "label17";
|
||||
this.label17.Size = new System.Drawing.Size(54, 13);
|
||||
this.label17.TabIndex = 51;
|
||||
this.label17.Text = "Threshold";
|
||||
//
|
||||
// OptmizationThresholdNumericUpDown
|
||||
//
|
||||
this.OptmizationThresholdNumericUpDown.Location = new System.Drawing.Point(460, 236);
|
||||
this.OptmizationThresholdNumericUpDown.Maximum = new decimal(new int[] {
|
||||
999999,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.OptmizationThresholdNumericUpDown.Name = "OptmizationThresholdNumericUpDown";
|
||||
this.OptmizationThresholdNumericUpDown.Size = new System.Drawing.Size(66, 20);
|
||||
this.OptmizationThresholdNumericUpDown.TabIndex = 50;
|
||||
this.OptmizationThresholdNumericUpDown.Value = new decimal(new int[] {
|
||||
5,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
//
|
||||
// textBox5
|
||||
//
|
||||
this.textBox5.Location = new System.Drawing.Point(93, 237);
|
||||
this.textBox5.Name = "textBox5";
|
||||
this.textBox5.ReadOnly = true;
|
||||
this.textBox5.Size = new System.Drawing.Size(282, 20);
|
||||
this.textBox5.TabIndex = 49;
|
||||
this.textBox5.Text = "TODO!";
|
||||
//
|
||||
// OptimizeBatchButton
|
||||
//
|
||||
this.OptimizeBatchButton.Location = new System.Drawing.Point(403, 207);
|
||||
this.OptimizeBatchButton.Name = "OptimizeBatchButton";
|
||||
this.OptimizeBatchButton.Size = new System.Drawing.Size(123, 24);
|
||||
this.OptimizeBatchButton.TabIndex = 50;
|
||||
this.OptimizeBatchButton.Text = "Optimize Batch";
|
||||
this.OptimizeBatchButtonTooltip.SetToolTip(this.OptimizeBatchButton, "Will split your batch into multiple different batches based on the threshold. If " +
|
||||
"your threshold is 5.0 then each batch will have a size of 5.0 meters.");
|
||||
this.OptimizeBatchButton.UseVisualStyleBackColor = true;
|
||||
this.OptimizeBatchButton.Click += new System.EventHandler(this.OptimizeBatchButton_Click);
|
||||
//
|
||||
// label14
|
||||
//
|
||||
this.label14.AutoSize = true;
|
||||
this.label14.Location = new System.Drawing.Point(22, 240);
|
||||
this.label14.Name = "label14";
|
||||
this.label14.Size = new System.Drawing.Size(68, 13);
|
||||
this.label14.TabIndex = 48;
|
||||
this.label14.Text = "Extents Max:";
|
||||
//
|
||||
// textBox4
|
||||
//
|
||||
this.textBox4.Location = new System.Drawing.Point(93, 210);
|
||||
this.textBox4.Name = "textBox4";
|
||||
this.textBox4.ReadOnly = true;
|
||||
this.textBox4.Size = new System.Drawing.Size(282, 20);
|
||||
this.textBox4.TabIndex = 47;
|
||||
this.textBox4.Text = "TODO!";
|
||||
//
|
||||
// label13
|
||||
//
|
||||
this.label13.AutoSize = true;
|
||||
this.label13.Location = new System.Drawing.Point(22, 213);
|
||||
this.label13.Name = "label13";
|
||||
this.label13.Size = new System.Drawing.Size(65, 13);
|
||||
this.label13.TabIndex = 46;
|
||||
this.label13.Text = "Extents Min:";
|
||||
//
|
||||
// HashLabel
|
||||
//
|
||||
this.HashLabel.AutoSize = true;
|
||||
this.HashLabel.Location = new System.Drawing.Point(211, 16);
|
||||
this.HashLabel.Name = "HashLabel";
|
||||
this.HashLabel.Size = new System.Drawing.Size(35, 13);
|
||||
this.HashLabel.TabIndex = 45;
|
||||
this.HashLabel.Text = "Hash:";
|
||||
//
|
||||
// ArchetypeNameTextBox
|
||||
//
|
||||
this.ArchetypeNameTextBox.Location = new System.Drawing.Point(61, 13);
|
||||
this.ArchetypeNameTextBox.Name = "ArchetypeNameTextBox";
|
||||
this.ArchetypeNameTextBox.Size = new System.Drawing.Size(144, 20);
|
||||
this.ArchetypeNameTextBox.TabIndex = 44;
|
||||
this.ArchetypeNameTextBox.TextChanged += new System.EventHandler(this.ArchetypeNameTextBox_TextChanged);
|
||||
//
|
||||
// label7
|
||||
//
|
||||
this.label7.AutoSize = true;
|
||||
this.label7.Location = new System.Drawing.Point(11, 16);
|
||||
this.label7.Name = "label7";
|
||||
this.label7.Size = new System.Drawing.Size(35, 13);
|
||||
this.label7.TabIndex = 43;
|
||||
this.label7.Text = "Name";
|
||||
//
|
||||
// groupBox1
|
||||
//
|
||||
this.groupBox1.Controls.Add(this.label12);
|
||||
this.groupBox1.Controls.Add(this.label11);
|
||||
this.groupBox1.Controls.Add(this.OrientToTerrainNumericUpDown);
|
||||
this.groupBox1.Controls.Add(this.ScaleRangeTextBox);
|
||||
this.groupBox1.Controls.Add(this.label10);
|
||||
this.groupBox1.Controls.Add(this.LodFadeRangeNumericUpDown);
|
||||
this.groupBox1.Controls.Add(this.label9);
|
||||
this.groupBox1.Controls.Add(this.LodFadeStartDistanceNumericUpDown);
|
||||
this.groupBox1.Controls.Add(this.label6);
|
||||
this.groupBox1.Controls.Add(this.LodDistNumericUpDown);
|
||||
this.groupBox1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.groupBox1.Location = new System.Drawing.Point(14, 67);
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.Size = new System.Drawing.Size(384, 132);
|
||||
this.groupBox1.TabIndex = 42;
|
||||
this.groupBox1.TabStop = false;
|
||||
this.groupBox1.Text = "Batch";
|
||||
//
|
||||
// label12
|
||||
//
|
||||
this.label12.AutoSize = true;
|
||||
this.label12.Location = new System.Drawing.Point(197, 24);
|
||||
this.label12.Name = "label12";
|
||||
this.label12.Size = new System.Drawing.Size(69, 13);
|
||||
this.label12.TabIndex = 47;
|
||||
this.label12.Text = "Scale Range";
|
||||
//
|
||||
// label11
|
||||
//
|
||||
this.label11.AutoSize = true;
|
||||
this.label11.Location = new System.Drawing.Point(8, 102);
|
||||
this.label11.Name = "label11";
|
||||
this.label11.Size = new System.Drawing.Size(87, 13);
|
||||
this.label11.TabIndex = 7;
|
||||
this.label11.Text = "Orient To Terrain";
|
||||
//
|
||||
// OrientToTerrainNumericUpDown
|
||||
//
|
||||
this.OrientToTerrainNumericUpDown.DecimalPlaces = 1;
|
||||
this.OrientToTerrainNumericUpDown.Location = new System.Drawing.Point(121, 100);
|
||||
this.OrientToTerrainNumericUpDown.Maximum = new decimal(new int[] {
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.OrientToTerrainNumericUpDown.Name = "OrientToTerrainNumericUpDown";
|
||||
this.OrientToTerrainNumericUpDown.Size = new System.Drawing.Size(61, 20);
|
||||
this.OrientToTerrainNumericUpDown.TabIndex = 6;
|
||||
this.OrientToTerrainNumericUpDown.ValueChanged += new System.EventHandler(this.OrientToTerrainNumericUpDown_ValueChanged);
|
||||
//
|
||||
// ScaleRangeTextBox
|
||||
//
|
||||
this.ScaleRangeTextBox.Location = new System.Drawing.Point(270, 21);
|
||||
this.ScaleRangeTextBox.Name = "ScaleRangeTextBox";
|
||||
this.ScaleRangeTextBox.Size = new System.Drawing.Size(104, 20);
|
||||
this.ScaleRangeTextBox.TabIndex = 46;
|
||||
this.ScaleRangeTextBox.TextChanged += new System.EventHandler(this.ScaleRangeTextBox_TextChanged);
|
||||
//
|
||||
// label10
|
||||
//
|
||||
this.label10.AutoSize = true;
|
||||
this.label10.Location = new System.Drawing.Point(8, 76);
|
||||
this.label10.Name = "label10";
|
||||
this.label10.Size = new System.Drawing.Size(107, 13);
|
||||
this.label10.TabIndex = 5;
|
||||
this.label10.Text = "Lod Inst Fade Range";
|
||||
//
|
||||
// LodFadeRangeNumericUpDown
|
||||
//
|
||||
this.LodFadeRangeNumericUpDown.DecimalPlaces = 4;
|
||||
this.LodFadeRangeNumericUpDown.Increment = new decimal(new int[] {
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
65536});
|
||||
this.LodFadeRangeNumericUpDown.Location = new System.Drawing.Point(121, 74);
|
||||
this.LodFadeRangeNumericUpDown.Maximum = new decimal(new int[] {
|
||||
99999,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.LodFadeRangeNumericUpDown.Name = "LodFadeRangeNumericUpDown";
|
||||
this.LodFadeRangeNumericUpDown.Size = new System.Drawing.Size(61, 20);
|
||||
this.LodFadeRangeNumericUpDown.TabIndex = 4;
|
||||
this.LodFadeRangeNumericUpDown.ValueChanged += new System.EventHandler(this.LodFadeRangeNumericUpDown_ValueChanged);
|
||||
//
|
||||
// label9
|
||||
//
|
||||
this.label9.AutoSize = true;
|
||||
this.label9.Location = new System.Drawing.Point(8, 50);
|
||||
this.label9.Name = "label9";
|
||||
this.label9.Size = new System.Drawing.Size(98, 13);
|
||||
this.label9.TabIndex = 3;
|
||||
this.label9.Text = "Lod Fade Start Dist";
|
||||
//
|
||||
// LodFadeStartDistanceNumericUpDown
|
||||
//
|
||||
this.LodFadeStartDistanceNumericUpDown.DecimalPlaces = 4;
|
||||
this.LodFadeStartDistanceNumericUpDown.Location = new System.Drawing.Point(121, 48);
|
||||
this.LodFadeStartDistanceNumericUpDown.Maximum = new decimal(new int[] {
|
||||
99999,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.LodFadeStartDistanceNumericUpDown.Name = "LodFadeStartDistanceNumericUpDown";
|
||||
this.LodFadeStartDistanceNumericUpDown.Size = new System.Drawing.Size(61, 20);
|
||||
this.LodFadeStartDistanceNumericUpDown.TabIndex = 2;
|
||||
this.LodFadeStartDistanceNumericUpDown.ValueChanged += new System.EventHandler(this.LodFadeStartDistanceNumericUpDown_ValueChanged);
|
||||
//
|
||||
// label6
|
||||
//
|
||||
this.label6.AutoSize = true;
|
||||
this.label6.Location = new System.Drawing.Point(8, 24);
|
||||
this.label6.Name = "label6";
|
||||
this.label6.Size = new System.Drawing.Size(39, 13);
|
||||
this.label6.TabIndex = 1;
|
||||
this.label6.Text = "lodDist";
|
||||
//
|
||||
// LodDistNumericUpDown
|
||||
//
|
||||
this.LodDistNumericUpDown.Location = new System.Drawing.Point(121, 22);
|
||||
this.LodDistNumericUpDown.Maximum = new decimal(new int[] {
|
||||
99999,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.LodDistNumericUpDown.Name = "LodDistNumericUpDown";
|
||||
this.LodDistNumericUpDown.Size = new System.Drawing.Size(61, 20);
|
||||
this.LodDistNumericUpDown.TabIndex = 0;
|
||||
this.LodDistNumericUpDown.ValueChanged += new System.EventHandler(this.LodDistNumericUpDown_ValueChanged);
|
||||
//
|
||||
// PositionTextBox
|
||||
//
|
||||
this.PositionTextBox.Location = new System.Drawing.Point(61, 40);
|
||||
this.PositionTextBox.Name = "PositionTextBox";
|
||||
this.PositionTextBox.ReadOnly = true;
|
||||
this.PositionTextBox.Size = new System.Drawing.Size(185, 20);
|
||||
this.PositionTextBox.TabIndex = 41;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(52, 52);
|
||||
this.label1.Location = new System.Drawing.Point(11, 43);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(105, 13);
|
||||
this.label1.TabIndex = 0;
|
||||
this.label1.Text = "Grass editing TODO!";
|
||||
this.label1.Size = new System.Drawing.Size(44, 13);
|
||||
this.label1.TabIndex = 40;
|
||||
this.label1.Text = "Position";
|
||||
//
|
||||
// GrassGoToButton
|
||||
//
|
||||
this.GrassGoToButton.Location = new System.Drawing.Point(252, 38);
|
||||
this.GrassGoToButton.Name = "GrassGoToButton";
|
||||
this.GrassGoToButton.Size = new System.Drawing.Size(56, 23);
|
||||
this.GrassGoToButton.TabIndex = 39;
|
||||
this.GrassGoToButton.Text = "Go To";
|
||||
this.GrassGoToButton.UseVisualStyleBackColor = true;
|
||||
this.GrassGoToButton.Click += new System.EventHandler(this.GrassGoToButton_Click);
|
||||
//
|
||||
// GrassDeleteButton
|
||||
//
|
||||
this.GrassDeleteButton.Location = new System.Drawing.Point(278, 298);
|
||||
this.GrassDeleteButton.Name = "GrassDeleteButton";
|
||||
this.GrassDeleteButton.Size = new System.Drawing.Size(95, 23);
|
||||
this.GrassDeleteButton.TabIndex = 38;
|
||||
this.GrassDeleteButton.Text = "Delete Batch";
|
||||
this.GrassDeleteButton.UseVisualStyleBackColor = true;
|
||||
this.GrassDeleteButton.Click += new System.EventHandler(this.GrassDeleteButton_Click);
|
||||
//
|
||||
// GrassAddToProjectButton
|
||||
//
|
||||
this.GrassAddToProjectButton.Location = new System.Drawing.Point(180, 298);
|
||||
this.GrassAddToProjectButton.Name = "GrassAddToProjectButton";
|
||||
this.GrassAddToProjectButton.Size = new System.Drawing.Size(95, 23);
|
||||
this.GrassAddToProjectButton.TabIndex = 37;
|
||||
this.GrassAddToProjectButton.Text = "Add to Project";
|
||||
this.GrassAddToProjectButton.UseVisualStyleBackColor = true;
|
||||
this.GrassAddToProjectButton.Click += new System.EventHandler(this.GrassAddToProjectButton_Click);
|
||||
//
|
||||
// BrushTab
|
||||
//
|
||||
this.BrushTab.Controls.Add(this.label16);
|
||||
this.BrushTab.Controls.Add(this.label8);
|
||||
this.BrushTab.Controls.Add(this.groupBox2);
|
||||
this.BrushTab.Controls.Add(this.BrushModeCheckBox);
|
||||
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(546, 329);
|
||||
this.BrushTab.TabIndex = 1;
|
||||
this.BrushTab.Text = " Brush";
|
||||
this.BrushTab.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label16
|
||||
//
|
||||
this.label16.AutoSize = true;
|
||||
this.label16.Location = new System.Drawing.Point(9, 224);
|
||||
this.label16.Name = "label16";
|
||||
this.label16.Size = new System.Drawing.Size(114, 13);
|
||||
this.label16.TabIndex = 40;
|
||||
this.label16.Text = "SHIFT + CTRL - Erase";
|
||||
//
|
||||
// label8
|
||||
//
|
||||
this.label8.AutoSize = true;
|
||||
this.label8.Location = new System.Drawing.Point(9, 202);
|
||||
this.label8.Name = "label8";
|
||||
this.label8.Size = new System.Drawing.Size(68, 13);
|
||||
this.label8.TabIndex = 21;
|
||||
this.label8.Text = "CTRL - Paint";
|
||||
//
|
||||
// groupBox2
|
||||
//
|
||||
this.groupBox2.Controls.Add(this.GrassColorLabel);
|
||||
this.groupBox2.Controls.Add(this.label15);
|
||||
this.groupBox2.Controls.Add(this.label4);
|
||||
this.groupBox2.Controls.Add(this.AoNumericUpDown);
|
||||
this.groupBox2.Controls.Add(this.PadTextBox);
|
||||
this.groupBox2.Controls.Add(this.ScaleNumericUpDown);
|
||||
this.groupBox2.Controls.Add(this.label2);
|
||||
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(259, 3);
|
||||
this.groupBox2.Name = "groupBox2";
|
||||
this.groupBox2.Size = new System.Drawing.Size(279, 153);
|
||||
this.groupBox2.TabIndex = 39;
|
||||
this.groupBox2.TabStop = false;
|
||||
this.groupBox2.Text = "Instance Settings";
|
||||
//
|
||||
// GrassColorLabel
|
||||
//
|
||||
this.GrassColorLabel.BackColor = System.Drawing.Color.White;
|
||||
this.GrassColorLabel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.GrassColorLabel.Location = new System.Drawing.Point(50, 22);
|
||||
this.GrassColorLabel.Name = "GrassColorLabel";
|
||||
this.GrassColorLabel.Size = new System.Drawing.Size(119, 21);
|
||||
this.GrassColorLabel.TabIndex = 12;
|
||||
this.GrassColorLabel.Click += new System.EventHandler(this.GrassColorLabel_Click);
|
||||
//
|
||||
// label15
|
||||
//
|
||||
this.label15.AutoSize = true;
|
||||
this.label15.Location = new System.Drawing.Point(9, 106);
|
||||
this.label15.Name = "label15";
|
||||
this.label15.Size = new System.Drawing.Size(26, 13);
|
||||
this.label15.TabIndex = 46;
|
||||
this.label15.Text = "Pad";
|
||||
//
|
||||
// label4
|
||||
//
|
||||
this.label4.AutoSize = true;
|
||||
this.label4.Location = new System.Drawing.Point(9, 79);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(34, 13);
|
||||
this.label4.TabIndex = 16;
|
||||
this.label4.Text = "Scale";
|
||||
//
|
||||
// AoNumericUpDown
|
||||
//
|
||||
this.AoNumericUpDown.Location = new System.Drawing.Point(50, 51);
|
||||
this.AoNumericUpDown.Maximum = new decimal(new int[] {
|
||||
255,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.AoNumericUpDown.Name = "AoNumericUpDown";
|
||||
this.AoNumericUpDown.Size = new System.Drawing.Size(120, 20);
|
||||
this.AoNumericUpDown.TabIndex = 15;
|
||||
this.AoNumericUpDown.Value = new decimal(new int[] {
|
||||
255,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
//
|
||||
// PadTextBox
|
||||
//
|
||||
this.PadTextBox.Location = new System.Drawing.Point(49, 103);
|
||||
this.PadTextBox.Name = "PadTextBox";
|
||||
this.PadTextBox.Size = new System.Drawing.Size(120, 20);
|
||||
this.PadTextBox.TabIndex = 45;
|
||||
this.PadTextBox.Text = "0, 0, 0";
|
||||
//
|
||||
// ScaleNumericUpDown
|
||||
//
|
||||
this.ScaleNumericUpDown.Location = new System.Drawing.Point(49, 77);
|
||||
this.ScaleNumericUpDown.Maximum = new decimal(new int[] {
|
||||
255,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.ScaleNumericUpDown.Name = "ScaleNumericUpDown";
|
||||
this.ScaleNumericUpDown.Size = new System.Drawing.Size(120, 20);
|
||||
this.ScaleNumericUpDown.TabIndex = 17;
|
||||
this.ScaleNumericUpDown.Value = new decimal(new int[] {
|
||||
255,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(9, 53);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(20, 13);
|
||||
this.label2.TabIndex = 14;
|
||||
this.label2.Text = "Ao";
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(9, 26);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(31, 13);
|
||||
this.label3.TabIndex = 13;
|
||||
this.label3.Text = "Color";
|
||||
//
|
||||
// RandomizeScaleCheckBox
|
||||
//
|
||||
this.RandomizeScaleCheckBox.AutoSize = true;
|
||||
this.RandomizeScaleCheckBox.Location = new System.Drawing.Point(176, 79);
|
||||
this.RandomizeScaleCheckBox.Name = "RandomizeScaleCheckBox";
|
||||
this.RandomizeScaleCheckBox.Size = new System.Drawing.Size(79, 17);
|
||||
this.RandomizeScaleCheckBox.TabIndex = 18;
|
||||
this.RandomizeScaleCheckBox.Text = "Randomize";
|
||||
this.RandomizeScaleCheckBox.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// BrushModeCheckBox
|
||||
//
|
||||
this.BrushModeCheckBox.AutoSize = true;
|
||||
this.BrushModeCheckBox.Location = new System.Drawing.Point(8, 174);
|
||||
this.BrushModeCheckBox.Name = "BrushModeCheckBox";
|
||||
this.BrushModeCheckBox.Size = new System.Drawing.Size(83, 17);
|
||||
this.BrushModeCheckBox.TabIndex = 39;
|
||||
this.BrushModeCheckBox.Text = "Brush Mode";
|
||||
this.BrushModeCheckBox.UseVisualStyleBackColor = true;
|
||||
this.BrushModeCheckBox.CheckedChanged += new System.EventHandler(this.BrushModeCheckBox_CheckedChanged);
|
||||
//
|
||||
// brushSettingsGroupBox
|
||||
//
|
||||
this.brushSettingsGroupBox.Controls.Add(this.DensityNumericUpDown);
|
||||
this.brushSettingsGroupBox.Controls.Add(this.RadiusNumericUpDown);
|
||||
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.Name = "brushSettingsGroupBox";
|
||||
this.brushSettingsGroupBox.Size = new System.Drawing.Size(245, 153);
|
||||
this.brushSettingsGroupBox.TabIndex = 38;
|
||||
this.brushSettingsGroupBox.TabStop = false;
|
||||
this.brushSettingsGroupBox.Text = "Brush Settings";
|
||||
//
|
||||
// DensityNumericUpDown
|
||||
//
|
||||
this.DensityNumericUpDown.Location = new System.Drawing.Point(109, 57);
|
||||
this.DensityNumericUpDown.Maximum = new decimal(new int[] {
|
||||
128,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.DensityNumericUpDown.Name = "DensityNumericUpDown";
|
||||
this.DensityNumericUpDown.Size = new System.Drawing.Size(120, 20);
|
||||
this.DensityNumericUpDown.TabIndex = 20;
|
||||
this.DensityNumericUpDown.Value = new decimal(new int[] {
|
||||
28,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
//
|
||||
// RadiusNumericUpDown
|
||||
//
|
||||
this.RadiusNumericUpDown.DecimalPlaces = 2;
|
||||
this.RadiusNumericUpDown.Increment = new decimal(new int[] {
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
131072});
|
||||
this.RadiusNumericUpDown.Location = new System.Drawing.Point(109, 31);
|
||||
this.RadiusNumericUpDown.Name = "RadiusNumericUpDown";
|
||||
this.RadiusNumericUpDown.Size = new System.Drawing.Size(120, 20);
|
||||
this.RadiusNumericUpDown.TabIndex = 11;
|
||||
this.RadiusNumericUpDown.Value = new decimal(new int[] {
|
||||
5,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
//
|
||||
// label5
|
||||
//
|
||||
this.label5.AutoSize = true;
|
||||
this.label5.Location = new System.Drawing.Point(21, 59);
|
||||
this.label5.Name = "label5";
|
||||
this.label5.Size = new System.Drawing.Size(42, 13);
|
||||
this.label5.TabIndex = 19;
|
||||
this.label5.Text = "Density";
|
||||
//
|
||||
// radiusLabel
|
||||
//
|
||||
this.radiusLabel.AutoSize = true;
|
||||
this.radiusLabel.Location = new System.Drawing.Point(21, 33);
|
||||
this.radiusLabel.Name = "radiusLabel";
|
||||
this.radiusLabel.Size = new System.Drawing.Size(40, 13);
|
||||
this.radiusLabel.TabIndex = 10;
|
||||
this.radiusLabel.Text = "Radius";
|
||||
//
|
||||
// label18
|
||||
//
|
||||
this.label18.Location = new System.Drawing.Point(400, 259);
|
||||
this.label18.Name = "label18";
|
||||
this.label18.Size = new System.Drawing.Size(126, 53);
|
||||
this.label18.TabIndex = 52;
|
||||
this.label18.Text = "* The higher the threshold, the larger each batch will be when they are split.";
|
||||
//
|
||||
// EditYmapGrassPanel
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(554, 355);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Controls.Add(this.tabControl1);
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Name = "EditYmapGrassPanel";
|
||||
this.Text = "Grass Batch";
|
||||
this.tabControl1.ResumeLayout(false);
|
||||
this.GrassBatchTab.ResumeLayout(false);
|
||||
this.GrassBatchTab.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.OptmizationThresholdNumericUpDown)).EndInit();
|
||||
this.groupBox1.ResumeLayout(false);
|
||||
this.groupBox1.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.OrientToTerrainNumericUpDown)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.LodFadeRangeNumericUpDown)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.LodFadeStartDistanceNumericUpDown)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.LodDistNumericUpDown)).EndInit();
|
||||
this.BrushTab.ResumeLayout(false);
|
||||
this.BrushTab.PerformLayout();
|
||||
this.groupBox2.ResumeLayout(false);
|
||||
this.groupBox2.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.AoNumericUpDown)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ScaleNumericUpDown)).EndInit();
|
||||
this.brushSettingsGroupBox.ResumeLayout(false);
|
||||
this.brushSettingsGroupBox.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.DensityNumericUpDown)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.RadiusNumericUpDown)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TabControl tabControl1;
|
||||
private System.Windows.Forms.TabPage GrassBatchTab;
|
||||
private System.Windows.Forms.TextBox PositionTextBox;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.Button GrassGoToButton;
|
||||
private System.Windows.Forms.Button GrassDeleteButton;
|
||||
private System.Windows.Forms.Button GrassAddToProjectButton;
|
||||
private System.Windows.Forms.TabPage BrushTab;
|
||||
private System.Windows.Forms.GroupBox brushSettingsGroupBox;
|
||||
private System.Windows.Forms.NumericUpDown RadiusNumericUpDown;
|
||||
private System.Windows.Forms.Label radiusLabel;
|
||||
private System.Windows.Forms.NumericUpDown DensityNumericUpDown;
|
||||
private System.Windows.Forms.Label label5;
|
||||
private System.Windows.Forms.CheckBox BrushModeCheckBox;
|
||||
private System.Windows.Forms.GroupBox groupBox1;
|
||||
private System.Windows.Forms.NumericUpDown LodDistNumericUpDown;
|
||||
private System.Windows.Forms.Label label6;
|
||||
private System.Windows.Forms.TextBox ArchetypeNameTextBox;
|
||||
private System.Windows.Forms.Label label7;
|
||||
private System.Windows.Forms.Label HashLabel;
|
||||
private System.Windows.Forms.Label label9;
|
||||
private System.Windows.Forms.NumericUpDown LodFadeStartDistanceNumericUpDown;
|
||||
private System.Windows.Forms.Label label10;
|
||||
private System.Windows.Forms.NumericUpDown LodFadeRangeNumericUpDown;
|
||||
private System.Windows.Forms.Label label11;
|
||||
private System.Windows.Forms.NumericUpDown OrientToTerrainNumericUpDown;
|
||||
private System.Windows.Forms.TextBox textBox4;
|
||||
private System.Windows.Forms.Label label13;
|
||||
private System.Windows.Forms.Label label12;
|
||||
private System.Windows.Forms.TextBox ScaleRangeTextBox;
|
||||
private System.Windows.Forms.TextBox textBox5;
|
||||
private System.Windows.Forms.Label label14;
|
||||
private System.Windows.Forms.GroupBox groupBox2;
|
||||
private System.Windows.Forms.Label label15;
|
||||
private System.Windows.Forms.TextBox PadTextBox;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.Label GrassColorLabel;
|
||||
private System.Windows.Forms.CheckBox RandomizeScaleCheckBox;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.NumericUpDown ScaleNumericUpDown;
|
||||
private System.Windows.Forms.NumericUpDown AoNumericUpDown;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private System.Windows.Forms.Label label16;
|
||||
private System.Windows.Forms.Label label8;
|
||||
private System.Windows.Forms.Button OptimizeBatchButton;
|
||||
private System.Windows.Forms.Label label17;
|
||||
private System.Windows.Forms.NumericUpDown OptmizationThresholdNumericUpDown;
|
||||
private System.Windows.Forms.Label label18;
|
||||
private System.Windows.Forms.ToolTip OptimizeBatchButtonTooltip;
|
||||
}
|
||||
}
|
||||
@@ -1,22 +1,27 @@
|
||||
using CodeWalker.GameFiles;
|
||||
using System;
|
||||
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 CodeWalker.GameFiles;
|
||||
using CodeWalker.Utils;
|
||||
using CodeWalker.World;
|
||||
using SharpDX;
|
||||
|
||||
// THINGS TODO
|
||||
// - COMPLETED -- Better gizmo for grass brush (like a circle with a little line in the middle sticking upwards)
|
||||
// - COMPLETED -- Remove grass instances using CTRL + SHIFT + LMB
|
||||
|
||||
// - 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?)
|
||||
|
||||
// As far as everything else goes, the brush works just fine. No issues so far besides the UpdateGraphics() method. (causes flicker sometimes)
|
||||
|
||||
|
||||
namespace CodeWalker.Project.Panels
|
||||
{
|
||||
public partial class EditYmapGrassPanel : ProjectPanel
|
||||
{
|
||||
public ProjectForm ProjectForm;
|
||||
public YmapGrassInstanceBatch CurrentBatch { get; set; }
|
||||
|
||||
//private bool populatingui = false;
|
||||
|
||||
public EditYmapGrassPanel(ProjectForm owner)
|
||||
{
|
||||
@@ -24,12 +29,41 @@ namespace CodeWalker.Project.Panels
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public YmapGrassInstanceBatch CurrentBatch { get; set; }
|
||||
|
||||
#region Form
|
||||
|
||||
public void SetBatch(YmapGrassInstanceBatch batch)
|
||||
{
|
||||
CurrentBatch = batch;
|
||||
Tag = batch;
|
||||
LoadGrassBatch();
|
||||
UpdateFormTitle();
|
||||
UpdateControls();
|
||||
}
|
||||
|
||||
private void UpdateControls()
|
||||
{
|
||||
if (ProjectForm?.CurrentProjectFile == null) return;
|
||||
if (ProjectForm.GrassBatchExistsInProject(CurrentBatch))
|
||||
{
|
||||
GrassAddToProjectButton.Enabled = false;
|
||||
GrassDeleteButton.Enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
GrassAddToProjectButton.Enabled = true;
|
||||
GrassDeleteButton.Enabled = false;
|
||||
}
|
||||
|
||||
ArchetypeNameTextBox.Text = CurrentBatch.Batch.archetypeName.ToString();
|
||||
PositionTextBox.Text = FloatUtil.GetVector3String(CurrentBatch.Position);
|
||||
LodDistNumericUpDown.Value = CurrentBatch.Batch.lodDist;
|
||||
LodFadeRangeNumericUpDown.Value = (decimal) CurrentBatch.Batch.LodInstFadeRange;
|
||||
LodFadeStartDistanceNumericUpDown.Value = (decimal) CurrentBatch.Batch.LodFadeStartDist;
|
||||
ScaleRangeTextBox.Text = FloatUtil.GetVector3String(CurrentBatch.Batch.ScaleRange);
|
||||
OrientToTerrainNumericUpDown.Value = (decimal)CurrentBatch.Batch.OrientToTerrain;
|
||||
OptmizationThresholdNumericUpDown.Value = 15;
|
||||
BrushModeCheckBox.Checked = CurrentBatch.BrushEnabled;
|
||||
}
|
||||
|
||||
private void UpdateFormTitle()
|
||||
@@ -37,11 +71,228 @@ namespace CodeWalker.Project.Panels
|
||||
Text = CurrentBatch?.Batch.archetypeName.ToString() ?? "Grass Batch";
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
|
||||
private void LoadGrassBatch()
|
||||
#region BrushSettings
|
||||
|
||||
private void GrassGoToButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (CurrentBatch == null) return;
|
||||
ProjectForm.WorldForm?.GoToPosition(CurrentBatch.Position, CurrentBatch.AABBMax - CurrentBatch.AABBMin);
|
||||
}
|
||||
|
||||
private void GrassAddToProjectButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
ProjectForm.SetProjectItem(CurrentBatch);
|
||||
ProjectForm.AddGrassBatchToProject();
|
||||
}
|
||||
|
||||
private void GrassDeleteButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
ProjectForm.SetProjectItem(CurrentBatch);
|
||||
var ymap = CurrentBatch?.Ymap;
|
||||
if (!ProjectForm.DeleteGrassBatch()) return;
|
||||
|
||||
ymap?.CalcExtents(); // Recalculate the extents after deleting the grass batch.
|
||||
ProjectForm.WorldForm.SelectItem();
|
||||
}
|
||||
|
||||
private void GrassColorLabel_Click(object sender, EventArgs e)
|
||||
{
|
||||
var colDiag = new ColorDialog {Color = GrassColorLabel.BackColor};
|
||||
if (colDiag.ShowDialog(this) == DialogResult.OK)
|
||||
GrassColorLabel.BackColor = colDiag.Color;
|
||||
}
|
||||
|
||||
private void BrushModeCheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (CurrentBatch == null) return;
|
||||
CurrentBatch.BrushEnabled = BrushModeCheckBox.Checked;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Batch Settings
|
||||
|
||||
private void ArchetypeNameTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
var archetypeHash = JenkHash.GenHash(ArchetypeNameTextBox.Text);
|
||||
var archetype = ProjectForm.GameFileCache.GetArchetype(archetypeHash);
|
||||
if (archetype == null)
|
||||
{
|
||||
HashLabel.Text = $@"Hash: {archetypeHash} (invalid)";
|
||||
return;
|
||||
}
|
||||
CurrentBatch.Archetype = archetype;
|
||||
var b = CurrentBatch.Batch;
|
||||
b.archetypeName = archetypeHash;
|
||||
CurrentBatch.Batch = b;
|
||||
ProjectForm.WorldForm.UpdateGrassBatchGraphics(CurrentBatch);
|
||||
HashLabel.Text = $@"Hash: {archetypeHash}";
|
||||
UpdateFormTitle();
|
||||
CurrentBatch.HasChanged = true;
|
||||
ProjectForm.SetGrassBatchHasChanged(false);
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
}
|
||||
|
||||
private void LodDistNumericUpDown_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
var batch = CurrentBatch.Batch;
|
||||
batch.lodDist = (uint) LodDistNumericUpDown.Value;
|
||||
CurrentBatch.Batch = batch;
|
||||
ProjectForm.WorldForm.UpdateGrassBatchGraphics(CurrentBatch);
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
}
|
||||
|
||||
private void LodFadeStartDistanceNumericUpDown_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
var batch = CurrentBatch.Batch;
|
||||
batch.LodFadeStartDist = (float) LodFadeStartDistanceNumericUpDown.Value;
|
||||
CurrentBatch.Batch = batch;
|
||||
ProjectForm.WorldForm.UpdateGrassBatchGraphics(CurrentBatch);
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
}
|
||||
|
||||
private void LodFadeRangeNumericUpDown_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
var batch = CurrentBatch.Batch;
|
||||
batch.LodInstFadeRange = (float) LodFadeRangeNumericUpDown.Value;
|
||||
CurrentBatch.Batch = batch;
|
||||
ProjectForm.WorldForm.UpdateGrassBatchGraphics(CurrentBatch);
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
}
|
||||
|
||||
private void OrientToTerrainNumericUpDown_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
var batch = CurrentBatch.Batch;
|
||||
batch.OrientToTerrain = (float) OrientToTerrainNumericUpDown.Value;
|
||||
CurrentBatch.Batch = batch;
|
||||
ProjectForm.WorldForm.UpdateGrassBatchGraphics(CurrentBatch);
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
}
|
||||
|
||||
private void ScaleRangeTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
var batch = CurrentBatch.Batch;
|
||||
var v = FloatUtil.ParseVector3String(ScaleRangeTextBox.Text);
|
||||
batch.ScaleRange = v;
|
||||
CurrentBatch.Batch = batch;
|
||||
ProjectForm.WorldForm.UpdateGrassBatchGraphics(CurrentBatch);
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
}
|
||||
|
||||
private void OptimizeBatchButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (CurrentBatch.Instances == null || CurrentBatch.Instances.Length <= 0) return;
|
||||
lock (ProjectForm.WorldForm.RenderSyncRoot)
|
||||
{
|
||||
var newBatches = CurrentBatch?.OptimizeInstances(CurrentBatch, (float)OptmizationThresholdNumericUpDown.Value);
|
||||
if (newBatches == null || newBatches.Length <= 0) return;
|
||||
|
||||
// Remove our batch from the ymap
|
||||
CurrentBatch.Ymap.RemoveGrassBatch(CurrentBatch);
|
||||
foreach (var batch in newBatches)
|
||||
{
|
||||
var b = batch.Batch;
|
||||
b.lodDist = CurrentBatch.Batch.lodDist;
|
||||
b.LodInstFadeRange = CurrentBatch.Batch.LodInstFadeRange;
|
||||
b.LodFadeStartDist = CurrentBatch.Batch.LodFadeStartDist;
|
||||
b.ScaleRange = CurrentBatch.Batch.ScaleRange;
|
||||
b.OrientToTerrain = CurrentBatch.Batch.OrientToTerrain;
|
||||
b.archetypeName = CurrentBatch.Batch.archetypeName;
|
||||
batch.Batch = b;
|
||||
batch.Archetype = CurrentBatch.Archetype;
|
||||
batch.UpdateInstanceCount();
|
||||
ProjectForm.NewGrassBatch(batch);
|
||||
}
|
||||
CurrentBatch.Ymap.CalcExtents();
|
||||
CurrentBatch.Ymap.Save();
|
||||
|
||||
// TODO: Select the last grass batch in the new list on the project explorer.
|
||||
ProjectForm.ProjectExplorer.TrySelectGrassBatchTreeNode(CurrentBatch.Ymap.GrassInstanceBatches[0]);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#region Publics
|
||||
|
||||
public void CreateInstancesAtMouse(SpaceRayIntersectResult mouseRay)
|
||||
{
|
||||
var wf = ProjectForm.WorldForm;
|
||||
if (wf == null) return;
|
||||
|
||||
lock (wf.RenderSyncRoot)
|
||||
{
|
||||
CurrentBatch.CreateInstancesAtMouse(
|
||||
CurrentBatch,
|
||||
mouseRay,
|
||||
(float) RadiusNumericUpDown.Value,
|
||||
(int) DensityNumericUpDown.Value,
|
||||
SpawnRayFunc,
|
||||
new Color(GrassColorLabel.BackColor.R, GrassColorLabel.BackColor.G, GrassColorLabel.BackColor.B),
|
||||
(int) AoNumericUpDown.Value,
|
||||
(int) ScaleNumericUpDown.Value,
|
||||
FloatUtil.ParseVector3String(PadTextBox.Text),
|
||||
RandomizeScaleCheckBox.Checked
|
||||
);
|
||||
wf.UpdateGrassBatchGraphics(CurrentBatch);
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
private SpaceRayIntersectResult SpawnRayFunc(Vector3 spawnPos)
|
||||
{
|
||||
var res = ProjectForm.WorldForm.Raycast(new Ray(spawnPos, -Vector3.UnitZ));
|
||||
|
||||
//if (res.HitBounds != null) // shouldn't happen but just in case..
|
||||
//{
|
||||
// var mat = BoundsMaterialTypes.GetMaterial(res.HitBounds.MaterialIndex);
|
||||
// if (mat.Name != "DEFAULT")
|
||||
// {
|
||||
// var c = mat.Colour;
|
||||
// }
|
||||
//}
|
||||
return res;
|
||||
}
|
||||
|
||||
private void BatchChanged()
|
||||
{
|
||||
UpdateControls();
|
||||
CurrentBatch.UpdateInstanceCount();
|
||||
CurrentBatch.HasChanged = true;
|
||||
ProjectForm.SetGrassBatchHasChanged(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -117,6 +117,9 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="OptimizeBatchButtonTooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
|
||||
@@ -641,6 +641,20 @@ namespace CodeWalker.Project.Panels
|
||||
}
|
||||
}
|
||||
}
|
||||
public void SetGrassBatchHasChanged(YmapGrassInstanceBatch batch, bool changed)
|
||||
{
|
||||
if (ProjectTreeView.Nodes.Count > 0)
|
||||
{
|
||||
var gbnode = FindGrassTreeNode(batch);
|
||||
if (gbnode == null) return;
|
||||
string changestr = changed ? "*" : "";
|
||||
if (gbnode.Tag == batch)
|
||||
{
|
||||
string name = batch.ToString();
|
||||
gbnode.Text = changestr + name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -698,6 +712,21 @@ namespace CodeWalker.Project.Panels
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public TreeNode FindGrassTreeNode(YmapGrassInstanceBatch batch)
|
||||
{
|
||||
if (batch == null) return null;
|
||||
TreeNode ymapnode = FindYmapTreeNode(batch.Ymap);
|
||||
if (ymapnode == null) return null;
|
||||
var batchnode = GetChildTreeNode(ymapnode, "GrassBatches");
|
||||
if (batchnode == null) return null;
|
||||
for (int i = 0; i < batchnode.Nodes.Count; i++)
|
||||
{
|
||||
TreeNode grassnode = batchnode.Nodes[i];
|
||||
if (grassnode.Tag == batch) return grassnode;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public TreeNode FindYndTreeNode(YndFile ynd)
|
||||
{
|
||||
if (ProjectTreeView.Nodes.Count <= 0) return null;
|
||||
@@ -930,6 +959,21 @@ namespace CodeWalker.Project.Panels
|
||||
}
|
||||
}
|
||||
}
|
||||
public void TrySelectGrassBatchTreeNode(YmapGrassInstanceBatch grassBatch)
|
||||
{
|
||||
TreeNode grassNode = FindGrassTreeNode(grassBatch);
|
||||
if (grassNode != null)
|
||||
{
|
||||
if (ProjectTreeView.SelectedNode == grassNode)
|
||||
{
|
||||
OnItemSelected?.Invoke(grassNode);
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectTreeView.SelectedNode = grassNode;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void TrySelectPathNodeTreeNode(YndNode node)
|
||||
{
|
||||
TreeNode tnode = FindPathNodeTreeNode(node);
|
||||
@@ -1240,6 +1284,16 @@ namespace CodeWalker.Project.Panels
|
||||
tn.Parent.Nodes.Remove(tn);
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveGrassBatchTreeNode(YmapGrassInstanceBatch batch)
|
||||
{
|
||||
var tn = FindGrassTreeNode(batch);
|
||||
if ((tn != null) && (tn.Parent != null))
|
||||
{
|
||||
tn.Parent.Text = "Grass Batches (" + batch.Ymap.GrassInstanceBatches.Length.ToString() + ")";
|
||||
tn.Parent.Nodes.Remove(tn);
|
||||
}
|
||||
}
|
||||
public void RemovePathNodeTreeNode(YndNode node)
|
||||
{
|
||||
var tn = FindPathNodeTreeNode(node);
|
||||
|
||||
Generated
+513
-502
File diff suppressed because it is too large
Load Diff
+179
-3
@@ -104,7 +104,6 @@ namespace CodeWalker.Project
|
||||
RpfMan = GameFileCache.RpfMan;
|
||||
})).Start();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void UpdateStatus(string text)
|
||||
@@ -1270,6 +1269,10 @@ namespace CodeWalker.Project
|
||||
{
|
||||
ProjectExplorer?.TrySelectCarGenTreeNode(CurrentCarGen);
|
||||
}
|
||||
else if (CurrentGrassBatch != null)
|
||||
{
|
||||
ProjectExplorer?.TrySelectGrassBatchTreeNode(CurrentGrassBatch);
|
||||
}
|
||||
}
|
||||
public void RemoveYmapFromProject()
|
||||
{
|
||||
@@ -1435,6 +1438,155 @@ namespace CodeWalker.Project
|
||||
return CurrentEntity == ent;
|
||||
}
|
||||
|
||||
public void NewGrassBatch(YmapGrassInstanceBatch copy = null)
|
||||
{
|
||||
if (CurrentYmapFile == null) return;
|
||||
|
||||
rage__fwGrassInstanceListDef fwBatch = new rage__fwGrassInstanceListDef();
|
||||
rage__fwGrassInstanceListDef__InstanceData[] instances = new rage__fwGrassInstanceListDef__InstanceData[0];
|
||||
|
||||
if (copy != null)
|
||||
{
|
||||
fwBatch = copy.Batch;
|
||||
instances = copy.Instances;
|
||||
}
|
||||
else
|
||||
{
|
||||
fwBatch.archetypeName = new MetaHash(JenkHash.GenHash("proc_grasses01"));
|
||||
fwBatch.lodDist = 120;
|
||||
fwBatch.LodFadeStartDist = 15;
|
||||
fwBatch.LodInstFadeRange = 0.75f;
|
||||
fwBatch.OrientToTerrain = 1.0f;
|
||||
fwBatch.ScaleRange = new Vector3(0.3f, 0.2f, 0.7f);
|
||||
}
|
||||
|
||||
YmapGrassInstanceBatch batch = new YmapGrassInstanceBatch
|
||||
{
|
||||
AABBMin = fwBatch.BatchAABB.min.XYZ(),
|
||||
AABBMax = fwBatch.BatchAABB.max.XYZ(),
|
||||
Archetype = GameFileCache.GetArchetype(fwBatch.archetypeName),
|
||||
Batch = fwBatch,
|
||||
Instances = instances
|
||||
};
|
||||
|
||||
batch.Position = (batch.AABBMin + batch.AABBMax) * 0.5f;
|
||||
batch.Radius = (batch.AABBMax - batch.AABBMin).Length() * 0.5f;
|
||||
batch.Ymap = CurrentYmapFile;
|
||||
|
||||
if (WorldForm != null)
|
||||
{
|
||||
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
|
||||
{
|
||||
CurrentYmapFile.AddGrassBatch(batch);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentYmapFile.AddGrassBatch(batch);
|
||||
}
|
||||
|
||||
LoadProjectTree();
|
||||
|
||||
ProjectExplorer?.TrySelectGrassBatchTreeNode(batch);
|
||||
CurrentGrassBatch = batch;
|
||||
ShowEditYmapGrassBatchPanel(false);
|
||||
}
|
||||
public void AddGrassBatchToProject()
|
||||
{
|
||||
if (CurrentGrassBatch == null) return;
|
||||
|
||||
CurrentYmapFile = CurrentGrassBatch.Ymap;
|
||||
if (!YmapExistsInProject(CurrentYmapFile))
|
||||
{
|
||||
var grassBatch = CurrentGrassBatch;
|
||||
CurrentYmapFile.HasChanged = true;
|
||||
AddYmapToProject(CurrentYmapFile);
|
||||
|
||||
CurrentGrassBatch = grassBatch; //bug fix for some reason the treeview selects the project node here.
|
||||
CurrentYmapFile = grassBatch.Ymap;
|
||||
ProjectExplorer?.TrySelectGrassBatchTreeNode(grassBatch);
|
||||
}
|
||||
}
|
||||
public bool DeleteGrassBatch()
|
||||
{
|
||||
if (CurrentYmapFile == null) return false;
|
||||
if (CurrentGrassBatch == null) return false;
|
||||
if (CurrentGrassBatch.Ymap != CurrentYmapFile) return false;
|
||||
if (CurrentYmapFile.GrassInstanceBatches == null) return false; //nothing to delete..
|
||||
|
||||
if (MessageBox.Show("Are you sure you want to delete this grass batch?\n" + CurrentGrassBatch.ToString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool res = false;
|
||||
if (WorldForm != null)
|
||||
{
|
||||
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
|
||||
{
|
||||
res = CurrentYmapFile.RemoveGrassBatch(CurrentGrassBatch);
|
||||
//WorldForm.SelectItem(null, null, null);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
res = CurrentYmapFile.RemoveGrassBatch(CurrentGrassBatch);
|
||||
}
|
||||
if (!res)
|
||||
{
|
||||
MessageBox.Show("Unable to delete the grass batch. This shouldn't happen!");
|
||||
}
|
||||
|
||||
var delbatch = CurrentGrassBatch;
|
||||
|
||||
ProjectExplorer?.RemoveGrassBatchTreeNode(CurrentGrassBatch);
|
||||
ProjectExplorer?.SetYmapHasChanged(CurrentYmapFile, true);
|
||||
|
||||
ClosePanel((EditYmapGrassPanel p) => { return p.Tag == delbatch; });
|
||||
|
||||
CurrentGrassBatch = null;
|
||||
|
||||
return true;
|
||||
}
|
||||
public void PaintGrass(SpaceRayIntersectResult mouseRay, bool erase)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (InvokeRequired)
|
||||
{
|
||||
Invoke(new Action(() => { PaintGrass(mouseRay, erase); }));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mouseRay.Hit || !mouseRay.TestComplete) return;
|
||||
if (CurrentGrassBatch == null || (!CurrentGrassBatch.BrushEnabled)) return; // brush isn't enabled right now
|
||||
EditYmapGrassPanel panel = FindPanel<EditYmapGrassPanel>(x => x.CurrentBatch == CurrentGrassBatch);
|
||||
if (panel == null) return; // no panels with this batch
|
||||
|
||||
// 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);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
public bool GrassBatchExistsInProject(YmapGrassInstanceBatch batch)
|
||||
{
|
||||
if (CurrentProjectFile?.YmapFiles == null) return false;
|
||||
if (CurrentProjectFile.YmapFiles.Count <= 0) return false;
|
||||
foreach (var ymapFile in CurrentProjectFile.YmapFiles)
|
||||
{
|
||||
if (ymapFile.GrassInstanceBatches == null) continue;
|
||||
foreach (var b in ymapFile.GrassInstanceBatches)
|
||||
{
|
||||
if (batch == b)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void NewCarGen(YmapCarGen copy = null, bool copyPosition = false)
|
||||
{
|
||||
if (CurrentYmapFile == null) return;
|
||||
@@ -3820,9 +3972,11 @@ namespace CodeWalker.Project
|
||||
for (int i = 0; i < CurrentProjectFile.YmapFiles.Count; i++)
|
||||
{
|
||||
var ymap = CurrentProjectFile.YmapFiles[i];
|
||||
// make sure we're not hiding ymaps that have been added by the end-user.
|
||||
var isnew = ymap.RpfFileEntry.ShortNameHash == 0;
|
||||
if (ymap.Loaded)
|
||||
{
|
||||
ymaps[ymap._CMapData.name] = ymap;
|
||||
ymaps[isnew ? JenkHash.GenHash(ymap.Name) : ymap.RpfFileEntry.ShortNameHash] = ymap;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4026,6 +4180,11 @@ namespace CodeWalker.Project
|
||||
{
|
||||
ProjectExplorer?.TrySelectCarGenTreeNode(cargen);
|
||||
}
|
||||
if (grassbatch != CurrentGrassBatch)
|
||||
{
|
||||
ProjectExplorer?.TrySelectGrassBatchTreeNode(grassbatch);
|
||||
}
|
||||
|
||||
}
|
||||
else if (YndExistsInProject(ynd))
|
||||
{
|
||||
@@ -4699,7 +4858,19 @@ namespace CodeWalker.Project
|
||||
|
||||
PromoteIfPreviewPanelActive();
|
||||
}
|
||||
public void SetGrassBatchHasChanged(bool changed)
|
||||
{
|
||||
if (CurrentGrassBatch == null) return;
|
||||
|
||||
bool changechange = changed != CurrentGrassBatch.HasChanged;
|
||||
if (!changechange) return;
|
||||
|
||||
CurrentGrassBatch.HasChanged = true;
|
||||
|
||||
ProjectExplorer?.SetGrassBatchHasChanged(CurrentGrassBatch, changed);
|
||||
|
||||
PromoteIfPreviewPanelActive();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -4877,6 +5048,7 @@ namespace CodeWalker.Project
|
||||
|
||||
YmapNewEntityMenu.Enabled = enable && inproj;
|
||||
YmapNewCarGenMenu.Enabled = enable && inproj;
|
||||
YmapNewGrassBatchMenu.Enabled = enable && inproj;
|
||||
|
||||
if (CurrentYmapFile != null)
|
||||
{
|
||||
@@ -5103,7 +5275,7 @@ namespace CodeWalker.Project
|
||||
FileSaveItemAsMenu.Text = "Save As...";
|
||||
ToolbarSaveButton.Text = "Save";
|
||||
}
|
||||
|
||||
|
||||
FileSaveItemMenu.Tag = filename;
|
||||
FileSaveItemAsMenu.Tag = filename;
|
||||
|
||||
@@ -5312,6 +5484,10 @@ namespace CodeWalker.Project
|
||||
{
|
||||
NewCarGen();
|
||||
}
|
||||
private void YmapNewGrassBatchMenu_Click(object sender, EventArgs e)
|
||||
{
|
||||
NewGrassBatch();
|
||||
}
|
||||
private void YmapAddToProjectMenu_Click(object sender, EventArgs e)
|
||||
{
|
||||
AddYmapToProject(CurrentYmapFile);
|
||||
|
||||
Reference in New Issue
Block a user