Renamed Jitter mode to Randomize mode.

Randomize mode: randomized pitch, roll and scale can now be applied to things.
Randomize mode: removed "Relative" option, because results with this option enabled were almost the same as without it.
Classic modes, model rendering: selected models are now rendered using highlight color, so they no longer blend with thing rectangle/circle.
Model rendering, UDMF: scale was applied incorrectly to models with pitch or roll.
Updated documentation.
This commit is contained in:
MaxED 2014-05-03 14:44:59 +00:00
parent 5e205d3b73
commit cf4b2d1935
21 changed files with 1352 additions and 855 deletions

View file

@ -14,12 +14,12 @@
</object>
<div id="gz_title">
<h1>Jitter</h1>
<h1>Randomize</h1>
</div>
<div id="contents">
<p>Jitter can be used to add some randomness to any kind of selection, which can be helpful when you are creating natural (caves) or distorted (CAVES IN HELL!!!) environments. </p>
<p><b>Menu path:</b> Mode -&gt; Jitter.<br />
<p>Randomize mode can be used to add some randomness to any kind of selection, which can be helpful when you are creating natural (caves) or distorted (CAVES IN HELL!!!) environments. </p>
<p><b>Menu path:</b> Mode -&gt; Randomize.<br />
<b>Action category:</b> Transform.<br />
<b>Default key:</b> Ctrl-J.<br />
<table border="0" cellspacing="3" cellpadding="3">
@ -36,12 +36,11 @@
Depending on selection type, different sets of settings can be used:<br />
<br />
When vertices or linedefs are selected in <strong>Vertices</strong> or <strong>Linedefs mode</strong>, or only walls are selected in <strong>Visual mode</strong>, you'll get this:</p>
<p><img src="jitter_verts.jpg" alt="" width="372" height="92" /></p>
<p><img src="jitter_verts.jpg" alt="" /></p>
<p>When sectors are selected in <strong>Sectors mode</strong>, or floors/ceilings are selected in <strong>Visual mode</strong>, you'll get this:</p>
<p><img src="jitter_sectors.jpg" alt="" width="388" height="376" /></p>
<p><img src="jitter_sectors.jpg" alt="" /></p>
<p>When things are selected in <strong>Things</strong> or <strong>Visual mode</strong>, you'll get this:</p>
<p><img src="jitter_things.jpg" alt="" width="372" height="146" /></p>
<p>You can use <img src="jitter_update.jpg" alt="" width="22" height="24" /> button to update random values for a given property.<br />
If you enable the <strong>Relative</strong> option, the property value will be calculated as a percentage of a maximum possible value.</p>
</div>
<p><img src="jitter_things.jpg" alt="" /></p>
<p>You can use <img src="jitter_update.jpg" alt="" width="22" height="24" /> button to update random values for a given property.</p>
</div>
</body>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

View file

@ -93,7 +93,7 @@ Jump to: <a href="#general">General interface</a> |
<li>You can use <a href="all_modes/tagexplorer.html">Tag Explorer plugin</a> to view all tags and actions used in current map.</li>
<li><span class="style1"><strong>[new]</strong></span> You can pick, which properties are pasted by &quot;Paste Properties&quot; action using &quot;Paste Properties Options&quot; window. <input class="spoilerbutton" type="button" onclick="ToggleSpoiler(this);" href="javascript:void(0);" value="Show image"/>
<div style="display: none; margin: 0px; padding: 6px; border: 1px inset;"> <img src="all_modes/paste_properties_options.jpg" alt="" /></div></li>
<li><span class="style1"><strong>[new]</strong></span> You can apply <a href="all_modes/jitter.html">jitter transform</a> to any map element.</li>
<li><span class="style1"><strong>[new]</strong></span> You can apply <a href="all_modes/jitter.html">randomized transformations</a> to any map element.</li>
<li>Image browser shows directory structure of Folder, PK3 and PK7 resources and can filter images by texture type and size. <a href="all_modes/texture_browser.html">More info</a>.</li>
<li><span class="style1"><strong>[new]</strong></span> Most controls of Edit Sector/Linedef/Thing forms now work in realtime (e.g. you can immediately see texture offset/scale/rotation changes while you are changing appropriate values). Action and Tag changes are still applied only after you press &quot;OK&quot; button.</li>
<li><span class="style1"><strong>[new]</strong></span><strong> [UDMF] </strong>All UDMF properties (except &quot;comment&quot;) can be edited using Edit Sector/Linedef/Thing/Vertex forms user interface.</li>

View file

@ -1303,7 +1303,7 @@ namespace CodeImp.DoomBuilder.Rendering
graphics.Shaders.Things2D.BeginPass(2);
Color4 cSel = General.Colors.Selection.ToColorValue();
Color4 cHighlight = General.Colors.Highlight.ToColorValue();
Color4 cWire = General.Colors.ModelWireframe.ToColorValue();
Matrix viewscale = Matrix.Scaling(scale, -scale, 0.0f);
ModelData mde;
@ -1323,16 +1323,18 @@ namespace CodeImp.DoomBuilder.Rendering
if(((screenpos.x + maxSize * modelScale) <= 0.0f) || ((screenpos.x - maxSize * modelScale) >= windowsize.Width) ||
((screenpos.y + maxSize * modelScale) <= 0.0f) || ((screenpos.y - maxSize * modelScale) >= windowsize.Height))
continue;
graphics.Shaders.Things2D.FillColor = t.Selected ? cSel : cWire;
graphics.Shaders.Things2D.FillColor = t.Selected ? cHighlight : cWire;
for(int i = 0; i < mde.Model.Meshes.Count; i++) {
Matrix finalscale = viewscale * Matrix.Scaling(t.ScaleX, t.ScaleX, t.ScaleY);
Matrix modelcale = Matrix.Scaling(t.ScaleX, t.ScaleX, t.ScaleY);
Matrix rotation = Matrix.RotationY(-(t.RollRad - General.Map.Data.ModeldefEntries[t.Type].RollOffset))
* Matrix.RotationX(-(t.PitchRad + General.Map.Data.ModeldefEntries[t.Type].PitchOffset))
* Matrix.RotationZ(t.Angle);
Matrix position = Matrix.Translation(screenpos.x, screenpos.y, 0.0f);
Matrix world = modelcale * rotation * viewscale * position;
graphics.Shaders.Things2D.SetTransformSettings(screenpos, rotation, finalscale);
graphics.Shaders.Things2D.SetTransformSettings(world);
graphics.Shaders.Things2D.ApplySettings();
// Draw

View file

@ -1067,7 +1067,7 @@ namespace CodeImp.DoomBuilder.Rendering
* Matrix.RotationX(-(t.Thing.PitchRad + General.Map.Data.ModeldefEntries[t.Thing.Type].PitchOffset))
* Matrix.RotationZ(t.Thing.Angle);
world = rotation * Matrix.Scaling(sx, sx, sy) * t.Position;
world = Matrix.Scaling(sx, sx, sy) * rotation * t.Position;
ApplyMatrices3D();
//mxd. set variables for fog rendering

View file

@ -115,13 +115,10 @@ namespace CodeImp.DoomBuilder.Rendering
}
//mxd. Used to render models
public void SetTransformSettings(Vector2D position, Matrix rotation, Matrix scale)
public void SetTransformSettings(Matrix world)
{
if (manager.Enabled) {
Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
Matrix m_position = Matrix.Translation(position.x, position.y, 0.0f);
Matrix world = rotation * scale * m_position;
effect.SetValue(transformsettings, Matrix.Multiply(world, view));
}
}

View file

@ -59,7 +59,7 @@
//
// numericUpDown1
//
this.numericUpDown1.Location = new System.Drawing.Point(96, 1);
this.numericUpDown1.Location = new System.Drawing.Point(96, 2);
this.numericUpDown1.Name = "numericUpDown1";
this.numericUpDown1.Size = new System.Drawing.Size(52, 20);
this.numericUpDown1.TabIndex = 8;
@ -67,6 +67,7 @@
//
// labelMaximum
//
this.labelMaximum.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.labelMaximum.AutoSize = true;
this.labelMaximum.Location = new System.Drawing.Point(237, 5);
this.labelMaximum.Name = "labelMaximum";

View file

@ -1,120 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -30,9 +30,6 @@
this.bUpdateTranslation = new System.Windows.Forms.Button();
this.bUpdateCeilingHeight = new System.Windows.Forms.Button();
this.bUpdateFloorHeight = new System.Windows.Forms.Button();
this.cbRelativeFloorHeight = new System.Windows.Forms.CheckBox();
this.cbRelativeCeilHeight = new System.Windows.Forms.CheckBox();
this.cbRelativePos = new System.Windows.Forms.CheckBox();
this.gbUpperTexture = new System.Windows.Forms.GroupBox();
this.textureUpper = new CodeImp.DoomBuilder.Controls.TextureSelectorControl();
this.cbPegTop = new System.Windows.Forms.CheckBox();
@ -105,39 +102,6 @@
this.bUpdateFloorHeight.UseVisualStyleBackColor = true;
this.bUpdateFloorHeight.Click += new System.EventHandler(this.bUpdateFloorHeight_Click);
//
// cbRelativeFloorHeight
//
this.cbRelativeFloorHeight.AutoSize = true;
this.cbRelativeFloorHeight.Location = new System.Drawing.Point(12, 79);
this.cbRelativeFloorHeight.Name = "cbRelativeFloorHeight";
this.cbRelativeFloorHeight.Size = new System.Drawing.Size(64, 18);
this.cbRelativeFloorHeight.TabIndex = 21;
this.cbRelativeFloorHeight.Text = "Relative";
this.cbRelativeFloorHeight.UseVisualStyleBackColor = true;
this.cbRelativeFloorHeight.CheckedChanged += new System.EventHandler(this.cbRelativeFloorHeight_CheckedChanged);
//
// cbRelativeCeilHeight
//
this.cbRelativeCeilHeight.AutoSize = true;
this.cbRelativeCeilHeight.Location = new System.Drawing.Point(12, 49);
this.cbRelativeCeilHeight.Name = "cbRelativeCeilHeight";
this.cbRelativeCeilHeight.Size = new System.Drawing.Size(64, 18);
this.cbRelativeCeilHeight.TabIndex = 22;
this.cbRelativeCeilHeight.Text = "Relative";
this.cbRelativeCeilHeight.UseVisualStyleBackColor = true;
this.cbRelativeCeilHeight.CheckedChanged += new System.EventHandler(this.cbRelativeCeilHeight_CheckedChanged);
//
// cbRelativePos
//
this.cbRelativePos.AutoSize = true;
this.cbRelativePos.Location = new System.Drawing.Point(12, 19);
this.cbRelativePos.Name = "cbRelativePos";
this.cbRelativePos.Size = new System.Drawing.Size(64, 18);
this.cbRelativePos.TabIndex = 23;
this.cbRelativePos.Text = "Relative";
this.cbRelativePos.UseVisualStyleBackColor = true;
this.cbRelativePos.CheckedChanged += new System.EventHandler(this.cbRelativePos_CheckedChanged);
//
// gbUpperTexture
//
this.gbUpperTexture.Controls.Add(this.textureUpper);
@ -152,6 +116,7 @@
// textureUpper
//
this.textureUpper.Location = new System.Drawing.Point(47, 41);
this.textureUpper.MultipleTextures = false;
this.textureUpper.Name = "textureUpper";
this.textureUpper.Required = false;
this.textureUpper.Size = new System.Drawing.Size(83, 112);
@ -173,6 +138,7 @@
// textureLower
//
this.textureLower.Location = new System.Drawing.Point(47, 41);
this.textureLower.MultipleTextures = false;
this.textureLower.Name = "textureLower";
this.textureLower.Required = false;
this.textureLower.Size = new System.Drawing.Size(83, 112);
@ -196,9 +162,9 @@
this.cbUpperTexStyle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbUpperTexStyle.FormattingEnabled = true;
this.cbUpperTexStyle.Items.AddRange(new object[] {
"Don\'t change upper texture",
"Use ceiling texture",
"Pick upper texture"});
"Don\'t change upper texture",
"Use ceiling texture",
"Pick upper texture"});
this.cbUpperTexStyle.Location = new System.Drawing.Point(12, 131);
this.cbUpperTexStyle.Name = "cbUpperTexStyle";
this.cbUpperTexStyle.Size = new System.Drawing.Size(176, 22);
@ -210,9 +176,9 @@
this.cbLowerTexStyle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbLowerTexStyle.FormattingEnabled = true;
this.cbLowerTexStyle.Items.AddRange(new object[] {
"Don\'t change lower texture",
"Use floor texture",
"Pick lower texture"});
"Don\'t change lower texture",
"Use floor texture",
"Pick lower texture"});
this.cbLowerTexStyle.Location = new System.Drawing.Point(195, 131);
this.cbLowerTexStyle.Name = "cbLowerTexStyle";
this.cbLowerTexStyle.Size = new System.Drawing.Size(175, 22);
@ -247,48 +213,48 @@
this.positionJitterAmmount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.positionJitterAmmount.ExtendedLimits = true;
this.positionJitterAmmount.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.positionJitterAmmount.Label = "Position (%):";
this.positionJitterAmmount.Location = new System.Drawing.Point(75, 15);
this.positionJitterAmmount.Label = "Position:";
this.positionJitterAmmount.Location = new System.Drawing.Point(12, 15);
this.positionJitterAmmount.Maximum = 100;
this.positionJitterAmmount.Minimum = 0;
this.positionJitterAmmount.Name = "positionJitterAmmount";
this.positionJitterAmmount.Size = new System.Drawing.Size(266, 22);
this.positionJitterAmmount.Size = new System.Drawing.Size(329, 22);
this.positionJitterAmmount.TabIndex = 18;
this.positionJitterAmmount.Value = 0;
this.positionJitterAmmount.OnValueChanging += new System.EventHandler(this.positionJitterAmmount_OnValueChanging);
//
// ceilingHeightAmmount
//
this.ceilingHeightAmmount.AllowNegative = false;
this.ceilingHeightAmmount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ceilingHeightAmmount.ExtendedLimits = false;
this.ceilingHeightAmmount.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ceilingHeightAmmount.Label = "Ceil. Height (%):";
this.ceilingHeightAmmount.Location = new System.Drawing.Point(75, 45);
this.ceilingHeightAmmount.Maximum = 100;
this.ceilingHeightAmmount.Minimum = 0;
this.ceilingHeightAmmount.Name = "ceilingHeightAmmount";
this.ceilingHeightAmmount.Size = new System.Drawing.Size(266, 22);
this.ceilingHeightAmmount.TabIndex = 19;
this.ceilingHeightAmmount.Value = 0;
this.ceilingHeightAmmount.OnValueChanging += new System.EventHandler(this.ceilingHeightAmmount_OnValueChanging);
//
// floorHeightAmmount
//
this.floorHeightAmmount.AllowNegative = false;
this.floorHeightAmmount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.floorHeightAmmount.ExtendedLimits = false;
this.floorHeightAmmount.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.floorHeightAmmount.Label = "Floor Height (%):";
this.floorHeightAmmount.Location = new System.Drawing.Point(75, 75);
this.floorHeightAmmount.Label = "Floor height:";
this.floorHeightAmmount.Location = new System.Drawing.Point(12, 75);
this.floorHeightAmmount.Maximum = 100;
this.floorHeightAmmount.Minimum = 0;
this.floorHeightAmmount.Name = "floorHeightAmmount";
this.floorHeightAmmount.Size = new System.Drawing.Size(266, 22);
this.floorHeightAmmount.Size = new System.Drawing.Size(329, 22);
this.floorHeightAmmount.TabIndex = 20;
this.floorHeightAmmount.Value = 0;
this.floorHeightAmmount.OnValueChanging += new System.EventHandler(this.floorHeightAmmount_OnValueChanging);
//
// ceilingHeightAmmount
//
this.ceilingHeightAmmount.AllowNegative = false;
this.ceilingHeightAmmount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ceilingHeightAmmount.ExtendedLimits = false;
this.ceilingHeightAmmount.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ceilingHeightAmmount.Label = "Ceil. height:";
this.ceilingHeightAmmount.Location = new System.Drawing.Point(12, 45);
this.ceilingHeightAmmount.Maximum = 100;
this.ceilingHeightAmmount.Minimum = 0;
this.ceilingHeightAmmount.Name = "ceilingHeightAmmount";
this.ceilingHeightAmmount.Size = new System.Drawing.Size(329, 22);
this.ceilingHeightAmmount.TabIndex = 19;
this.ceilingHeightAmmount.Value = 0;
this.ceilingHeightAmmount.OnValueChanging += new System.EventHandler(this.ceilingHeightAmmount_OnValueChanging);
//
// JitterSectorsForm
//
this.AcceptButton = this.bApply;
@ -301,9 +267,6 @@
this.Controls.Add(this.cbLowerTexStyle);
this.Controls.Add(this.cbUpperTexStyle);
this.Controls.Add(this.gbUpperTexture);
this.Controls.Add(this.cbRelativePos);
this.Controls.Add(this.cbRelativeCeilHeight);
this.Controls.Add(this.cbRelativeFloorHeight);
this.Controls.Add(this.floorHeightAmmount);
this.Controls.Add(this.ceilingHeightAmmount);
this.Controls.Add(this.positionJitterAmmount);
@ -339,9 +302,6 @@
private IntControl positionJitterAmmount;
private IntControl ceilingHeightAmmount;
private IntControl floorHeightAmmount;
private System.Windows.Forms.CheckBox cbRelativeFloorHeight;
private System.Windows.Forms.CheckBox cbRelativeCeilHeight;
private System.Windows.Forms.CheckBox cbRelativePos;
private System.Windows.Forms.GroupBox gbUpperTexture;
private CodeImp.DoomBuilder.Controls.TextureSelectorControl textureLower;
private CodeImp.DoomBuilder.Controls.TextureSelectorControl textureUpper;

View file

@ -10,19 +10,16 @@ namespace CodeImp.DoomBuilder.BuilderEffects
{
public partial class JitterSectorsForm : Form
{
private string editingModeName;
private List<VisualSector> visualSectors;
private VertexData[] vertexData;
private List<SectorData> sectorData;
private List<SidedefData> sidedefData;
private int MaxSafeDistance;
private int MaxSafeHeightDistance;
private readonly string editingModeName;
private readonly List<VisualSector> visualSectors;
private readonly VertexData[] vertexData;
private readonly List<SectorData> sectorData;
private readonly List<SidedefData> sidedefData;
private readonly int MaxSafeDistance;
private readonly int MaxSafeHeightDistance;
//settings
private static bool keepExistingSideTextures = true;
private static bool relativeFloorHeight;
private static bool relativeCeilingHeight;
private static bool relativePosition;
private struct VertexData
{
@ -133,7 +130,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
//update window header
this.Text = "Jitter Transform (" + sectors.Count + (sectors.Count > 1 ? " sectors)" : " sector)");
this.Text = "Randomize " + sectors.Count + (sectors.Count > 1 ? " sectors" : " sector");
//store intial properties
//process verts...
@ -236,15 +233,12 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
}
positionJitterAmmount.Maximum = MaxSafeDistance;
floorHeightAmmount.Maximum = MaxSafeHeightDistance;
ceilingHeightAmmount.Maximum = MaxSafeHeightDistance;
//set editing settings
cbKeepExistingTextures.Checked = keepExistingSideTextures;
cbRelativeCeilHeight.Checked = relativeCeilingHeight;
cbRelativeFloorHeight.Checked = relativeFloorHeight;
cbRelativePos.Checked = relativePosition;
cbRelativeCeilHeight_CheckedChanged(this, EventArgs.Empty);
cbRelativeFloorHeight_CheckedChanged(this, EventArgs.Empty);
cbRelativePos_CheckedChanged(this, EventArgs.Empty);
//texture pickers
textureLower.Initialize();
@ -256,29 +250,23 @@ namespace CodeImp.DoomBuilder.BuilderEffects
cbLowerTexStyle.SelectedIndex = 0;
updateTextureSelectors(); //update interface
updateAngles(); //create some random values
//create random values
updateAngles();
updateFloorHeights();
updateCeilingHeights();
//create undo
General.Map.UndoRedo.ClearAllRedos();
General.Map.UndoRedo.CreateUndo("Jitter Transform (" + sectors.Count + " sector" + (sectors.Count > 1 ? "s)" : ")"));
General.Map.UndoRedo.CreateUndo("Randomize " + sectors.Count + (sectors.Count > 1 ? " sectors" : " sector"));
}
//utility
private void applyTranslationJitter(int ammount) {
int curAmmount;
if(relativePosition) {
for(int i = 0; i < vertexData.Length; i++) {
curAmmount = (int)Math.Round(ammount * (vertexData[i].SafeDistance / 100f));
vertexData[i].Vertex.Move(new Vector2D(vertexData[i].InitialPosition.x + (int)(Math.Sin(vertexData[i].JitterAngle) * curAmmount), vertexData[i].InitialPosition.y + (int)(Math.Cos(vertexData[i].JitterAngle) * curAmmount)));
}
} else {
for(int i = 0; i < vertexData.Length; i++) {
curAmmount = ammount > vertexData[i].SafeDistance ? vertexData[i].SafeDistance : ammount;
vertexData[i].Vertex.Move(new Vector2D(vertexData[i].InitialPosition.x + (int)(Math.Sin(vertexData[i].JitterAngle) * curAmmount), vertexData[i].InitialPosition.y + (int)(Math.Cos(vertexData[i].JitterAngle) * curAmmount)));
}
for(int i = 0; i < vertexData.Length; i++) {
curAmmount = ammount > vertexData[i].SafeDistance ? vertexData[i].SafeDistance : ammount;
vertexData[i].Vertex.Move(new Vector2D(vertexData[i].InitialPosition.x + (int)(Math.Sin(vertexData[i].JitterAngle) * curAmmount), vertexData[i].InitialPosition.y + (int)(Math.Cos(vertexData[i].JitterAngle) * curAmmount)));
}
//update view
@ -294,16 +282,9 @@ namespace CodeImp.DoomBuilder.BuilderEffects
private void applyCeilingHeightJitter(int ammount) {
int curAmmount;
if(relativeCeilingHeight) {
for(int i = 0; i < sectorData.Count; i++) {
curAmmount = (int)Math.Round(ammount * (sectorData[i].SafeDistance / 100f));
sectorData[i].Sector.CeilHeight = sectorData[i].InitialCeilingHeight - (int)Math.Floor(curAmmount * sectorData[i].JitterCeilingHeight);
}
} else {
for(int i = 0; i < sectorData.Count; i++) {
curAmmount = ammount > sectorData[i].SafeDistance ? sectorData[i].SafeDistance : ammount;
sectorData[i].Sector.CeilHeight = sectorData[i].InitialCeilingHeight - (int)Math.Floor(curAmmount * sectorData[i].JitterCeilingHeight);
}
for(int i = 0; i < sectorData.Count; i++) {
curAmmount = ammount > sectorData[i].SafeDistance ? sectorData[i].SafeDistance : ammount;
sectorData[i].Sector.CeilHeight = sectorData[i].InitialCeilingHeight - (int)Math.Floor(curAmmount * sectorData[i].JitterCeilingHeight);
}
//update view
@ -319,16 +300,9 @@ namespace CodeImp.DoomBuilder.BuilderEffects
private void applyFloorHeightJitter(int ammount) {
int curAmmount;
if(relativeFloorHeight) {
for(int i = 0; i < sectorData.Count; i++) {
curAmmount = (int)Math.Round(ammount * (sectorData[i].SafeDistance / 100f));
sectorData[i].Sector.FloorHeight = sectorData[i].InitialFloorHeight + (int)Math.Floor(curAmmount * sectorData[i].JitterFloorHeight);
}
} else {
for(int i = 0; i < sectorData.Count; i++) {
curAmmount = ammount > sectorData[i].SafeDistance ? sectorData[i].SafeDistance : ammount;
sectorData[i].Sector.FloorHeight = sectorData[i].InitialFloorHeight + (int)Math.Floor(curAmmount * sectorData[i].JitterFloorHeight);
}
for(int i = 0; i < sectorData.Count; i++) {
curAmmount = ammount > sectorData[i].SafeDistance ? sectorData[i].SafeDistance : ammount;
sectorData[i].Sector.FloorHeight = sectorData[i].InitialFloorHeight + (int)Math.Floor(curAmmount * sectorData[i].JitterFloorHeight);
}
//update view
@ -342,14 +316,9 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
private void updateVisualGeometry() {
foreach(VisualSector vs in visualSectors)
vs.UpdateSectorGeometry(true);
foreach(VisualSector vs in visualSectors)
vs.UpdateSectorData();
foreach(VisualSector vs in visualSectors)
vs.UpdateSectorData();
foreach(VisualSector vs in visualSectors) vs.UpdateSectorGeometry(true);
foreach(VisualSector vs in visualSectors) vs.UpdateSectorData();
foreach(VisualSector vs in visualSectors) vs.UpdateSectorData();
}
private void updateTextureSelectors() {
@ -362,9 +331,9 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
private void updateUpperTextures(int index, bool updateGeometry) {
if(index == -1) {
return;
}else if(index == 0) { //revert
if(index == -1) return;
if(index == 0) { //revert
foreach(SidedefData sd in sidedefData)
setUpperTexture(sd, sd.HighTexture);
} else if(index == 1) { //use ceiling texture
@ -386,9 +355,9 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
private void updateLowerTextures(int index, bool updateGeometry) {
if(index == -1) {
return;
}else if(index == 0) { //revert
if(index == -1) return;
if(index == 0) { //revert
foreach(SidedefData sd in sidedefData)
setLowerTexture(sd, sd.LowTexture);
} else if(index == 1) { //use floor texture
@ -436,31 +405,25 @@ namespace CodeImp.DoomBuilder.BuilderEffects
//jitter generation
private void updateAngles() {
Random rnd = new Random();
for(int i = 0; i < vertexData.Length; i++) {
VertexData vd = vertexData[i];
vd.JitterAngle = (float)(rnd.Next(359) * Math.PI / 180f);
vd.JitterAngle = (float)(General.Random(0, 359) * Math.PI / 180f);
vertexData[i] = vd;
}
}
private void updateFloorHeights() {
Random rnd = new Random();
for(int i = 0; i < sectorData.Count; i++) {
SectorData sd = sectorData[i];
sd.JitterFloorHeight = rnd.Next(-100, 100) / 100f;
sd.JitterFloorHeight = General.Random(-100, 100) / 100f;
sectorData[i] = sd;
}
}
private void updateCeilingHeights() {
Random rnd = new Random();
for(int i = 0; i < sectorData.Count; i++) {
SectorData sd = sectorData[i];
sd.JitterCeilingHeight = rnd.Next(-100, 100) / 100f;
sd.JitterCeilingHeight = General.Random(-100, 100) / 100f;
sectorData[i] = sd;
}
}
@ -475,7 +438,6 @@ namespace CodeImp.DoomBuilder.BuilderEffects
sd.Side.Other.RemoveUnneededTextures(false);
}
//
General.Map.Map.ClearAllSelected();
// Update cached values
@ -485,7 +447,6 @@ namespace CodeImp.DoomBuilder.BuilderEffects
if(editingModeName != "BaseVisualMode")
General.Interface.RedrawDisplay();
//settingsApplied = true;
this.DialogResult = DialogResult.OK;
Close();
}
@ -550,31 +511,6 @@ namespace CodeImp.DoomBuilder.BuilderEffects
applyFloorHeightJitter(floorHeightAmmount.Value);
}
//rel/abs
private void cbRelativePos_CheckedChanged(object sender, EventArgs e) {
positionJitterAmmount.Label = "Position" + (cbRelativePos.Checked ? " (%):" : ":");
relativePosition = cbRelativePos.Checked;
positionJitterAmmount.Maximum = cbRelativePos.Checked ? 100 : MaxSafeDistance;
applyTranslationJitter(positionJitterAmmount.Value);
}
private void cbRelativeCeilHeight_CheckedChanged(object sender, EventArgs e) {
ceilingHeightAmmount.Label = "Ceil. Height" + (cbRelativeCeilHeight.Checked ? " (%):" : ":");
relativeCeilingHeight = cbRelativeCeilHeight.Checked;
ceilingHeightAmmount.Maximum = cbRelativeCeilHeight.Checked ? 100 : MaxSafeHeightDistance;
applyCeilingHeightJitter(ceilingHeightAmmount.Value);
}
private void cbRelativeFloorHeight_CheckedChanged(object sender, EventArgs e) {
floorHeightAmmount.Label = "Floor Height" + (cbRelativeFloorHeight.Checked ? " (%):" : ":");
relativeFloorHeight = cbRelativeFloorHeight.Checked;
floorHeightAmmount.Maximum = cbRelativeFloorHeight.Checked ? 100 : MaxSafeHeightDistance;
applyFloorHeightJitter(floorHeightAmmount.Value);
}
//texture pegging
private void cbPegTop_CheckedChanged(object sender, EventArgs e) {
if(cbPegTop.Checked) { //apply flag

View file

@ -1,120 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -25,22 +25,54 @@
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.components = new System.ComponentModel.Container();
this.bApply = new System.Windows.Forms.Button();
this.bCancel = new System.Windows.Forms.Button();
this.bUpdateTranslation = new System.Windows.Forms.Button();
this.bUpdateAngle = new System.Windows.Forms.Button();
this.bUpdateHeight = new System.Windows.Forms.Button();
this.cbRelativePos = new System.Windows.Forms.CheckBox();
this.cbRelativeHeight = new System.Windows.Forms.CheckBox();
this.positionJitterAmmount = new IntControl();
this.bUpdateAngle = new System.Windows.Forms.Button();
this.rotationJitterAmmount = new IntControl();
this.heightJitterAmmount = new IntControl();
this.bUpdateHeight = new System.Windows.Forms.Button();
this.pitchAmmount = new IntControl();
this.rollAmmount = new IntControl();
this.bUpdatePitch = new System.Windows.Forms.Button();
this.bUpdateRoll = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.cbRelativeRoll = new System.Windows.Forms.CheckBox();
this.cbRelativePitch = new System.Windows.Forms.CheckBox();
this.scalegroup = new System.Windows.Forms.GroupBox();
this.cbNegativeScaleY = new System.Windows.Forms.CheckBox();
this.cbNegativeScaleX = new System.Windows.Forms.CheckBox();
this.cbUniformScale = new System.Windows.Forms.CheckBox();
this.cbRelativeScale = new System.Windows.Forms.CheckBox();
this.bUpdateScaleY = new System.Windows.Forms.Button();
this.maxScaleYLabel = new System.Windows.Forms.Label();
this.maxScaleY = new System.Windows.Forms.NumericUpDown();
this.minScaleYLabel = new System.Windows.Forms.Label();
this.minScaleY = new System.Windows.Forms.NumericUpDown();
this.bUpdateScaleX = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.maxScaleX = new System.Windows.Forms.NumericUpDown();
this.label2 = new System.Windows.Forms.Label();
this.minScaleX = new System.Windows.Forms.NumericUpDown();
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
this.cbNegativeRoll = new System.Windows.Forms.CheckBox();
this.cbNegativePitch = new System.Windows.Forms.CheckBox();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.scalegroup.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.maxScaleY)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.minScaleY)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.maxScaleX)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.minScaleX)).BeginInit();
this.SuspendLayout();
//
// bApply
//
this.bApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bApply.Location = new System.Drawing.Point(282, 96);
this.bApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bApply.Location = new System.Drawing.Point(216, 399);
this.bApply.Name = "bApply";
this.bApply.Size = new System.Drawing.Size(75, 23);
this.bApply.TabIndex = 0;
@ -50,8 +82,8 @@
//
// bCancel
//
this.bCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bCancel.Location = new System.Drawing.Point(201, 96);
this.bCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bCancel.Location = new System.Drawing.Point(135, 399);
this.bCancel.Name = "bCancel";
this.bCancel.Size = new System.Drawing.Size(75, 23);
this.bCancel.TabIndex = 1;
@ -61,63 +93,23 @@
//
// bUpdateTranslation
//
this.bUpdateTranslation.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bUpdateTranslation.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Update;
this.bUpdateTranslation.Location = new System.Drawing.Point(337, 11);
this.bUpdateTranslation.Location = new System.Drawing.Point(247, 18);
this.bUpdateTranslation.Name = "bUpdateTranslation";
this.bUpdateTranslation.Size = new System.Drawing.Size(23, 23);
this.bUpdateTranslation.TabIndex = 5;
this.bUpdateTranslation.UseVisualStyleBackColor = true;
this.bUpdateTranslation.Click += new System.EventHandler(this.bUpdateTranslation_Click);
//
// bUpdateAngle
//
this.bUpdateAngle.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Update;
this.bUpdateAngle.Location = new System.Drawing.Point(337, 67);
this.bUpdateAngle.Name = "bUpdateAngle";
this.bUpdateAngle.Size = new System.Drawing.Size(23, 23);
this.bUpdateAngle.TabIndex = 5;
this.bUpdateAngle.UseVisualStyleBackColor = true;
this.bUpdateAngle.Click += new System.EventHandler(this.bUpdateAngle_Click);
//
// bUpdateHeight
//
this.bUpdateHeight.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Update;
this.bUpdateHeight.Location = new System.Drawing.Point(337, 39);
this.bUpdateHeight.Name = "bUpdateHeight";
this.bUpdateHeight.Size = new System.Drawing.Size(23, 23);
this.bUpdateHeight.TabIndex = 5;
this.bUpdateHeight.UseVisualStyleBackColor = true;
this.bUpdateHeight.Click += new System.EventHandler(this.bUpdateHeight_Click);
//
// cbRelativePos
//
this.cbRelativePos.AutoSize = true;
this.cbRelativePos.Location = new System.Drawing.Point(12, 16);
this.cbRelativePos.Name = "cbRelativePos";
this.cbRelativePos.Size = new System.Drawing.Size(64, 18);
this.cbRelativePos.TabIndex = 11;
this.cbRelativePos.Text = "Relative";
this.cbRelativePos.UseVisualStyleBackColor = true;
this.cbRelativePos.CheckedChanged += new System.EventHandler(this.cbRelativePos_CheckedChanged);
//
// cbRelativeHeight
//
this.cbRelativeHeight.AutoSize = true;
this.cbRelativeHeight.Location = new System.Drawing.Point(12, 44);
this.cbRelativeHeight.Name = "cbRelativeHeight";
this.cbRelativeHeight.Size = new System.Drawing.Size(64, 18);
this.cbRelativeHeight.TabIndex = 12;
this.cbRelativeHeight.Text = "Relative";
this.cbRelativeHeight.UseVisualStyleBackColor = true;
this.cbRelativeHeight.CheckedChanged += new System.EventHandler(this.cbRelativeHeight_CheckedChanged);
//
// positionJitterAmmount
//
this.positionJitterAmmount.AllowNegative = false;
this.positionJitterAmmount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.positionJitterAmmount.ExtendedLimits = true;
this.positionJitterAmmount.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.positionJitterAmmount.Label = "Position (%):";
this.positionJitterAmmount.Location = new System.Drawing.Point(65, 12);
this.positionJitterAmmount.Label = "Position:";
this.positionJitterAmmount.Location = new System.Drawing.Point(-25, 19);
this.positionJitterAmmount.Maximum = 100;
this.positionJitterAmmount.Minimum = 0;
this.positionJitterAmmount.Name = "positionJitterAmmount";
@ -126,13 +118,25 @@
this.positionJitterAmmount.Value = 0;
this.positionJitterAmmount.OnValueChanging += new System.EventHandler(this.positionJitterAmmount_OnValueChanged);
//
// bUpdateAngle
//
this.bUpdateAngle.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bUpdateAngle.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Update;
this.bUpdateAngle.Location = new System.Drawing.Point(247, 18);
this.bUpdateAngle.Name = "bUpdateAngle";
this.bUpdateAngle.Size = new System.Drawing.Size(23, 23);
this.bUpdateAngle.TabIndex = 5;
this.bUpdateAngle.UseVisualStyleBackColor = true;
this.bUpdateAngle.Click += new System.EventHandler(this.bUpdateAngle_Click);
//
// rotationJitterAmmount
//
this.rotationJitterAmmount.AllowNegative = false;
this.rotationJitterAmmount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.rotationJitterAmmount.ExtendedLimits = false;
this.rotationJitterAmmount.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.rotationJitterAmmount.Label = "Angle:";
this.rotationJitterAmmount.Location = new System.Drawing.Point(65, 68);
this.rotationJitterAmmount.Location = new System.Drawing.Point(-25, 19);
this.rotationJitterAmmount.Maximum = 359;
this.rotationJitterAmmount.Minimum = 0;
this.rotationJitterAmmount.Name = "rotationJitterAmmount";
@ -144,10 +148,11 @@
// heightJitterAmmount
//
this.heightJitterAmmount.AllowNegative = false;
this.heightJitterAmmount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.heightJitterAmmount.ExtendedLimits = false;
this.heightJitterAmmount.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.heightJitterAmmount.Label = "Height (%):";
this.heightJitterAmmount.Location = new System.Drawing.Point(65, 40);
this.heightJitterAmmount.Label = "Height:";
this.heightJitterAmmount.Location = new System.Drawing.Point(-25, 47);
this.heightJitterAmmount.Maximum = 100;
this.heightJitterAmmount.Minimum = 0;
this.heightJitterAmmount.Name = "heightJitterAmmount";
@ -156,19 +161,388 @@
this.heightJitterAmmount.Value = 0;
this.heightJitterAmmount.OnValueChanging += new System.EventHandler(this.heightJitterAmmount_OnValueChanging);
//
// bUpdateHeight
//
this.bUpdateHeight.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bUpdateHeight.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Update;
this.bUpdateHeight.Location = new System.Drawing.Point(247, 46);
this.bUpdateHeight.Name = "bUpdateHeight";
this.bUpdateHeight.Size = new System.Drawing.Size(23, 23);
this.bUpdateHeight.TabIndex = 5;
this.bUpdateHeight.UseVisualStyleBackColor = true;
this.bUpdateHeight.Click += new System.EventHandler(this.bUpdateHeight_Click);
//
// pitchAmmount
//
this.pitchAmmount.AllowNegative = false;
this.pitchAmmount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.pitchAmmount.ExtendedLimits = false;
this.pitchAmmount.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.pitchAmmount.Label = "Pitch:";
this.pitchAmmount.Location = new System.Drawing.Point(-25, 47);
this.pitchAmmount.Maximum = 359;
this.pitchAmmount.Minimum = 0;
this.pitchAmmount.Name = "pitchAmmount";
this.pitchAmmount.Size = new System.Drawing.Size(266, 24);
this.pitchAmmount.TabIndex = 13;
this.pitchAmmount.Value = 0;
this.pitchAmmount.OnValueChanging += new System.EventHandler(this.pitchAmmount_OnValueChanging);
//
// rollAmmount
//
this.rollAmmount.AllowNegative = false;
this.rollAmmount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.rollAmmount.ExtendedLimits = false;
this.rollAmmount.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.rollAmmount.Label = "Roll:";
this.rollAmmount.Location = new System.Drawing.Point(-25, 77);
this.rollAmmount.Maximum = 359;
this.rollAmmount.Minimum = 0;
this.rollAmmount.Name = "rollAmmount";
this.rollAmmount.Size = new System.Drawing.Size(266, 24);
this.rollAmmount.TabIndex = 14;
this.rollAmmount.Value = 0;
this.rollAmmount.OnValueChanging += new System.EventHandler(this.rollAmmount_OnValueChanging);
//
// bUpdatePitch
//
this.bUpdatePitch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bUpdatePitch.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Update;
this.bUpdatePitch.Location = new System.Drawing.Point(247, 47);
this.bUpdatePitch.Name = "bUpdatePitch";
this.bUpdatePitch.Size = new System.Drawing.Size(23, 23);
this.bUpdatePitch.TabIndex = 15;
this.bUpdatePitch.UseVisualStyleBackColor = true;
this.bUpdatePitch.Click += new System.EventHandler(this.bUpdatePitch_Click);
//
// bUpdateRoll
//
this.bUpdateRoll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bUpdateRoll.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Update;
this.bUpdateRoll.Location = new System.Drawing.Point(247, 76);
this.bUpdateRoll.Name = "bUpdateRoll";
this.bUpdateRoll.Size = new System.Drawing.Size(23, 23);
this.bUpdateRoll.TabIndex = 16;
this.bUpdateRoll.UseVisualStyleBackColor = true;
this.bUpdateRoll.Click += new System.EventHandler(this.bUpdateRoll_Click);
//
// groupBox1
//
this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBox1.Controls.Add(this.positionJitterAmmount);
this.groupBox1.Controls.Add(this.bUpdateTranslation);
this.groupBox1.Controls.Add(this.bUpdateHeight);
this.groupBox1.Controls.Add(this.heightJitterAmmount);
this.groupBox1.Location = new System.Drawing.Point(12, 12);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(279, 82);
this.groupBox1.TabIndex = 17;
this.groupBox1.TabStop = false;
this.groupBox1.Text = " Position: ";
//
// groupBox2
//
this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBox2.Controls.Add(this.cbNegativeRoll);
this.groupBox2.Controls.Add(this.cbNegativePitch);
this.groupBox2.Controls.Add(this.cbRelativeRoll);
this.groupBox2.Controls.Add(this.cbRelativePitch);
this.groupBox2.Controls.Add(this.rotationJitterAmmount);
this.groupBox2.Controls.Add(this.bUpdateAngle);
this.groupBox2.Controls.Add(this.bUpdateRoll);
this.groupBox2.Controls.Add(this.pitchAmmount);
this.groupBox2.Controls.Add(this.rollAmmount);
this.groupBox2.Controls.Add(this.bUpdatePitch);
this.groupBox2.Location = new System.Drawing.Point(12, 100);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(279, 159);
this.groupBox2.TabIndex = 18;
this.groupBox2.TabStop = false;
this.groupBox2.Text = " Rotation: ";
//
// cbRelativeRoll
//
this.cbRelativeRoll.AutoSize = true;
this.cbRelativeRoll.Location = new System.Drawing.Point(9, 134);
this.cbRelativeRoll.Name = "cbRelativeRoll";
this.cbRelativeRoll.Size = new System.Drawing.Size(119, 18);
this.cbRelativeRoll.TabIndex = 18;
this.cbRelativeRoll.Text = "Relative to initial roll";
this.cbRelativeRoll.UseVisualStyleBackColor = true;
//
// cbRelativePitch
//
this.cbRelativePitch.AutoSize = true;
this.cbRelativePitch.Location = new System.Drawing.Point(9, 110);
this.cbRelativePitch.Name = "cbRelativePitch";
this.cbRelativePitch.Size = new System.Drawing.Size(128, 18);
this.cbRelativePitch.TabIndex = 17;
this.cbRelativePitch.Text = "Relative to initial pitch";
this.cbRelativePitch.UseVisualStyleBackColor = true;
//
// scalegroup
//
this.scalegroup.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.scalegroup.Controls.Add(this.cbNegativeScaleY);
this.scalegroup.Controls.Add(this.cbNegativeScaleX);
this.scalegroup.Controls.Add(this.cbUniformScale);
this.scalegroup.Controls.Add(this.cbRelativeScale);
this.scalegroup.Controls.Add(this.bUpdateScaleY);
this.scalegroup.Controls.Add(this.maxScaleYLabel);
this.scalegroup.Controls.Add(this.maxScaleY);
this.scalegroup.Controls.Add(this.minScaleYLabel);
this.scalegroup.Controls.Add(this.minScaleY);
this.scalegroup.Controls.Add(this.bUpdateScaleX);
this.scalegroup.Controls.Add(this.label3);
this.scalegroup.Controls.Add(this.maxScaleX);
this.scalegroup.Controls.Add(this.label2);
this.scalegroup.Controls.Add(this.minScaleX);
this.scalegroup.Location = new System.Drawing.Point(12, 265);
this.scalegroup.Name = "scalegroup";
this.scalegroup.Size = new System.Drawing.Size(279, 127);
this.scalegroup.TabIndex = 19;
this.scalegroup.TabStop = false;
this.scalegroup.Text = " Scale: ";
//
// cbNegativeScaleY
//
this.cbNegativeScaleY.AutoSize = true;
this.cbNegativeScaleY.Location = new System.Drawing.Point(150, 102);
this.cbNegativeScaleY.Name = "cbNegativeScaleY";
this.cbNegativeScaleY.Size = new System.Drawing.Size(121, 18);
this.cbNegativeScaleY.TabIndex = 25;
this.cbNegativeScaleY.Text = "Use negative height";
this.toolTip.SetToolTip(this.cbNegativeScaleY, "When checked, height scale will be picked from\r\n[-max .. -min] - [min .. max] ran" +
"ge");
this.cbNegativeScaleY.UseVisualStyleBackColor = true;
//
// cbNegativeScaleX
//
this.cbNegativeScaleX.AutoSize = true;
this.cbNegativeScaleX.Location = new System.Drawing.Point(150, 78);
this.cbNegativeScaleX.Name = "cbNegativeScaleX";
this.cbNegativeScaleX.Size = new System.Drawing.Size(119, 18);
this.cbNegativeScaleX.TabIndex = 24;
this.cbNegativeScaleX.Text = "Use negative width";
this.toolTip.SetToolTip(this.cbNegativeScaleX, "When checked, width scale will be picked from\r\n[-max .. -min] - [min .. max] rang" +
"e");
this.cbNegativeScaleX.UseVisualStyleBackColor = true;
//
// cbUniformScale
//
this.cbUniformScale.AutoSize = true;
this.cbUniformScale.Location = new System.Drawing.Point(9, 102);
this.cbUniformScale.Name = "cbUniformScale";
this.cbUniformScale.Size = new System.Drawing.Size(136, 18);
this.cbUniformScale.TabIndex = 23;
this.cbUniformScale.Text = "Same width and height";
this.cbUniformScale.UseVisualStyleBackColor = true;
//
// cbRelativeScale
//
this.cbRelativeScale.AutoSize = true;
this.cbRelativeScale.Location = new System.Drawing.Point(9, 78);
this.cbRelativeScale.Name = "cbRelativeScale";
this.cbRelativeScale.Size = new System.Drawing.Size(131, 18);
this.cbRelativeScale.TabIndex = 13;
this.cbRelativeScale.Text = "Relative to initial scale";
this.cbRelativeScale.UseVisualStyleBackColor = true;
//
// bUpdateScaleY
//
this.bUpdateScaleY.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bUpdateScaleY.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Update;
this.bUpdateScaleY.Location = new System.Drawing.Point(247, 45);
this.bUpdateScaleY.Name = "bUpdateScaleY";
this.bUpdateScaleY.Size = new System.Drawing.Size(23, 23);
this.bUpdateScaleY.TabIndex = 22;
this.bUpdateScaleY.UseVisualStyleBackColor = true;
this.bUpdateScaleY.Click += new System.EventHandler(this.bUpdateScaleY_Click);
//
// maxScaleYLabel
//
this.maxScaleYLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.maxScaleYLabel.AutoSize = true;
this.maxScaleYLabel.Location = new System.Drawing.Point(147, 51);
this.maxScaleYLabel.Name = "maxScaleYLabel";
this.maxScaleYLabel.Size = new System.Drawing.Size(33, 14);
this.maxScaleYLabel.TabIndex = 21;
this.maxScaleYLabel.Text = "max.:";
//
// maxScaleY
//
this.maxScaleY.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.maxScaleY.DecimalPlaces = 2;
this.maxScaleY.Increment = new decimal(new int[] {
1,
0,
0,
65536});
this.maxScaleY.Location = new System.Drawing.Point(186, 48);
this.maxScaleY.Minimum = new decimal(new int[] {
100,
0,
0,
-2147483648});
this.maxScaleY.Name = "maxScaleY";
this.maxScaleY.Size = new System.Drawing.Size(55, 20);
this.maxScaleY.TabIndex = 20;
this.maxScaleY.Value = new decimal(new int[] {
1,
0,
0,
0});
this.maxScaleY.ValueChanged += new System.EventHandler(this.minScaleY_ValueChanged);
//
// minScaleYLabel
//
this.minScaleYLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.minScaleYLabel.AutoSize = true;
this.minScaleYLabel.Location = new System.Drawing.Point(16, 51);
this.minScaleYLabel.Name = "minScaleYLabel";
this.minScaleYLabel.Size = new System.Drawing.Size(62, 14);
this.minScaleYLabel.TabIndex = 19;
this.minScaleYLabel.Text = "Height min.:";
//
// minScaleY
//
this.minScaleY.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.minScaleY.DecimalPlaces = 2;
this.minScaleY.Increment = new decimal(new int[] {
1,
0,
0,
65536});
this.minScaleY.Location = new System.Drawing.Point(84, 48);
this.minScaleY.Minimum = new decimal(new int[] {
100,
0,
0,
-2147483648});
this.minScaleY.Name = "minScaleY";
this.minScaleY.Size = new System.Drawing.Size(55, 20);
this.minScaleY.TabIndex = 18;
this.minScaleY.Value = new decimal(new int[] {
1,
0,
0,
0});
this.minScaleY.ValueChanged += new System.EventHandler(this.minScaleY_ValueChanged);
//
// bUpdateScaleX
//
this.bUpdateScaleX.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bUpdateScaleX.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Update;
this.bUpdateScaleX.Location = new System.Drawing.Point(247, 19);
this.bUpdateScaleX.Name = "bUpdateScaleX";
this.bUpdateScaleX.Size = new System.Drawing.Size(23, 23);
this.bUpdateScaleX.TabIndex = 17;
this.bUpdateScaleX.UseVisualStyleBackColor = true;
this.bUpdateScaleX.Click += new System.EventHandler(this.bUpdateScaleX_Click);
//
// label3
//
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(147, 25);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(33, 14);
this.label3.TabIndex = 4;
this.label3.Text = "max.:";
//
// maxScaleX
//
this.maxScaleX.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.maxScaleX.DecimalPlaces = 2;
this.maxScaleX.Increment = new decimal(new int[] {
1,
0,
0,
65536});
this.maxScaleX.Location = new System.Drawing.Point(186, 22);
this.maxScaleX.Minimum = new decimal(new int[] {
100,
0,
0,
-2147483648});
this.maxScaleX.Name = "maxScaleX";
this.maxScaleX.Size = new System.Drawing.Size(55, 20);
this.maxScaleX.TabIndex = 3;
this.maxScaleX.Value = new decimal(new int[] {
1,
0,
0,
0});
this.maxScaleX.ValueChanged += new System.EventHandler(this.minScaleX_ValueChanged);
//
// label2
//
this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(19, 25);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(59, 14);
this.label2.TabIndex = 2;
this.label2.Text = "Width min.:";
//
// minScaleX
//
this.minScaleX.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.minScaleX.DecimalPlaces = 2;
this.minScaleX.Increment = new decimal(new int[] {
1,
0,
0,
65536});
this.minScaleX.Location = new System.Drawing.Point(84, 22);
this.minScaleX.Minimum = new decimal(new int[] {
100,
0,
0,
-2147483648});
this.minScaleX.Name = "minScaleX";
this.minScaleX.Size = new System.Drawing.Size(55, 20);
this.minScaleX.TabIndex = 1;
this.minScaleX.Value = new decimal(new int[] {
1,
0,
0,
0});
this.minScaleX.ValueChanged += new System.EventHandler(this.minScaleX_ValueChanged);
//
// cbNegativeRoll
//
this.cbNegativeRoll.AutoSize = true;
this.cbNegativeRoll.Location = new System.Drawing.Point(150, 134);
this.cbNegativeRoll.Name = "cbNegativeRoll";
this.cbNegativeRoll.Size = new System.Drawing.Size(106, 18);
this.cbNegativeRoll.TabIndex = 20;
this.cbNegativeRoll.Text = "Use negative roll";
this.toolTip.SetToolTip(this.cbNegativeRoll, "When checked, 50% of the time \r\nnegative roll will be used");
this.cbNegativeRoll.UseVisualStyleBackColor = true;
//
// cbNegativePitch
//
this.cbNegativePitch.AutoSize = true;
this.cbNegativePitch.Location = new System.Drawing.Point(150, 110);
this.cbNegativePitch.Name = "cbNegativePitch";
this.cbNegativePitch.Size = new System.Drawing.Size(115, 18);
this.cbNegativePitch.TabIndex = 19;
this.cbNegativePitch.Text = "Use negative pitch";
this.toolTip.SetToolTip(this.cbNegativePitch, "When checked, 50% of the time \r\nnegative pitch will be used.");
this.cbNegativePitch.UseVisualStyleBackColor = true;
//
// JitterThingsForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(366, 122);
this.Controls.Add(this.cbRelativeHeight);
this.Controls.Add(this.cbRelativePos);
this.Controls.Add(this.rotationJitterAmmount);
this.Controls.Add(this.bUpdateAngle);
this.Controls.Add(this.heightJitterAmmount);
this.Controls.Add(this.bUpdateHeight);
this.Controls.Add(this.bUpdateTranslation);
this.Controls.Add(this.positionJitterAmmount);
this.ClientSize = new System.Drawing.Size(303, 428);
this.Controls.Add(this.scalegroup);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.bCancel);
this.Controls.Add(this.bApply);
this.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
@ -176,10 +550,18 @@
this.Name = "JitterThingsForm";
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "Jitter Settings";
this.Text = "Randomize Things!";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.JitterThingsForm_FormClosing);
this.groupBox1.ResumeLayout(false);
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.scalegroup.ResumeLayout(false);
this.scalegroup.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.maxScaleY)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.minScaleY)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.maxScaleX)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.minScaleX)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
@ -188,12 +570,36 @@
private System.Windows.Forms.Button bApply;
private System.Windows.Forms.Button bCancel;
private System.Windows.Forms.Button bUpdateTranslation;
private IntControl positionJitterAmmount;
private CodeImp.DoomBuilder.BuilderEffects.IntControl positionJitterAmmount;
private System.Windows.Forms.Button bUpdateAngle;
private IntControl rotationJitterAmmount;
private IntControl heightJitterAmmount;
private CodeImp.DoomBuilder.BuilderEffects.IntControl rotationJitterAmmount;
private CodeImp.DoomBuilder.BuilderEffects.IntControl heightJitterAmmount;
private System.Windows.Forms.Button bUpdateHeight;
private System.Windows.Forms.CheckBox cbRelativePos;
private System.Windows.Forms.CheckBox cbRelativeHeight;
private CodeImp.DoomBuilder.BuilderEffects.IntControl pitchAmmount;
private CodeImp.DoomBuilder.BuilderEffects.IntControl rollAmmount;
private System.Windows.Forms.Button bUpdatePitch;
private System.Windows.Forms.Button bUpdateRoll;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.GroupBox scalegroup;
private System.Windows.Forms.NumericUpDown minScaleX;
private System.Windows.Forms.CheckBox cbUniformScale;
private System.Windows.Forms.CheckBox cbRelativeScale;
private System.Windows.Forms.Button bUpdateScaleY;
private System.Windows.Forms.Label maxScaleYLabel;
private System.Windows.Forms.NumericUpDown maxScaleY;
private System.Windows.Forms.Label minScaleYLabel;
private System.Windows.Forms.NumericUpDown minScaleY;
private System.Windows.Forms.Button bUpdateScaleX;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.NumericUpDown maxScaleX;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.CheckBox cbNegativeScaleX;
private System.Windows.Forms.CheckBox cbRelativeRoll;
private System.Windows.Forms.CheckBox cbRelativePitch;
private System.Windows.Forms.CheckBox cbNegativeScaleY;
private System.Windows.Forms.ToolTip toolTip;
private System.Windows.Forms.CheckBox cbNegativeRoll;
private System.Windows.Forms.CheckBox cbNegativePitch;
}
}

View file

@ -1,35 +1,59 @@
using System;
#region Namespaces
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using CodeImp.DoomBuilder.Map;
using CodeImp.DoomBuilder.VisualModes;
using CodeImp.DoomBuilder.Geometry;
#endregion
namespace CodeImp.DoomBuilder.BuilderEffects
{
public partial class JitterThingsForm : Form
{
private string editingModeName;
private List<Thing> selection;
private List<VisualThing> visualSelection;
private List<ThingData> thingData;
private int MaxSafeDistance;
private int MaxSafeHeightDistance;
#region Variables
private static bool relativePosition;
private static bool relativeHeight;
private readonly string editingModeName;
private readonly List<Thing> selection;
private readonly List<VisualThing> visualSelection;
private readonly List<ThingData> thingData;
private readonly int MaxSafeDistance;
private readonly int MaxSafeHeightDistance;
private static bool relativePitch;
private static bool relativeRoll;
private static bool allowNegativePitch;
private static bool allowNegativeRoll;
private static bool relativeScale;
private static bool allowNegativeScaleX;
private static bool allowNegativeScaleY;
private static bool uniformScale;
private struct ThingData {
public Vector3D Position;
public int Angle;
public int Pitch;
public int Roll;
public float ScaleX;
public float ScaleY;
public int SectorHeight;
public int ZOffset;
public int SafeDistance;
public int JitterAngle; //position jitter angle, not Thing angle!
public float JitterRotation; //Thing angle
public int OffsetAngle; //position jitter angle, not Thing angle!
public float JitterRotation;
public float JitterPitch;
public float JitterRoll;
public float JitterScaleX;
public float JitterScaleY;
public float JitterHeight;
}
#endregion
#region Constructor
public JitterThingsForm(string editingModeName) {
this.editingModeName = editingModeName;
this.HelpRequested += JitterThingsForm_HelpRequested;
@ -40,21 +64,32 @@ namespace CodeImp.DoomBuilder.BuilderEffects
heightJitterAmmount.Enabled = General.Map.FormatInterface.HasThingHeight;
bUpdateHeight.Enabled = General.Map.FormatInterface.HasThingHeight;
//disable pitch/roll/scale?
if (!General.Map.UDMF) {
pitchAmmount.Enabled = false;
rollAmmount.Enabled = false;
bUpdatePitch.Enabled = false;
bUpdateRoll.Enabled = false;
scalegroup.Enabled = false;
cbRelativePitch.Enabled = false;
cbRelativeRoll.Enabled = false;
cbNegativePitch.Enabled = false;
cbNegativeRoll.Enabled = false;
}
//get selection
selection = new List<Thing>();
if(editingModeName == "BaseVisualMode") {
visualSelection = ((VisualMode)General.Editing.Mode).GetSelectedVisualThings(false);
foreach(VisualThing t in visualSelection)
selection.Add(t.Thing);
foreach(VisualThing t in visualSelection) selection.Add(t.Thing);
} else {
ICollection<Thing> list = General.Map.Map.GetSelectedThings(true);
foreach(Thing t in list)
selection.Add(t);
foreach(Thing t in list) selection.Add(t);
}
//update window header
this.Text = "Jitter Transform (" + selection.Count + " thing" + (selection.Count > 1 ? "s" : "") + ")";
this.Text = "Randomize " + selection.Count + (selection.Count > 1 ? " things" : " thing");
//store intial properties
thingData = new List<ThingData>();
@ -74,6 +109,10 @@ namespace CodeImp.DoomBuilder.BuilderEffects
if(MaxSafeDistance < d.SafeDistance) MaxSafeDistance = d.SafeDistance;
d.Position = t.Position;
d.Angle = t.AngleDoom;
d.Pitch = t.Pitch;
d.Roll = t.Roll;
d.ScaleX = t.ScaleX;
d.ScaleY = t.ScaleY;
if(General.Map.FormatInterface.HasThingHeight) {
if(t.Sector == null) t.DetermineSector();
@ -87,73 +126,150 @@ namespace CodeImp.DoomBuilder.BuilderEffects
thingData.Add(d);
}
updateAngles();
positionJitterAmmount.Maximum = MaxSafeDistance;
heightJitterAmmount.Maximum = MaxSafeHeightDistance;
updateOffsetAngles();
updateHeights();
updateRotationAngles();
//set editing mode
cbRelativePos.Checked = relativePosition;
cbRelativePos_CheckedChanged(this, EventArgs.Empty);
cbRelativeHeight.Checked = relativeHeight;
cbRelativeHeight_CheckedChanged(this, EventArgs.Empty);
updatePitchAngles();
updateRollAngles();
updateScaleX();
updateScaleY();
//create undo
General.Map.UndoRedo.ClearAllRedos();
General.Map.UndoRedo.CreateUndo("Jitter Transform (" + selection.Count + " thing" + (selection.Count > 1 ? "s)" : ")"));
General.Map.UndoRedo.CreateUndo("Randomize " + selection.Count +(selection.Count > 1 ? " things" : " thing"));
//apply settings
cbRelativeScale.Checked = relativeScale;
cbUniformScale.Checked = uniformScale;
cbNegativeScaleX.Checked = allowNegativeScaleX;
cbNegativeScaleY.Checked = allowNegativeScaleY;
cbRelativePitch.Checked = relativePitch;
cbRelativeRoll.Checked = relativeRoll;
cbNegativePitch.Checked = allowNegativePitch;
cbNegativeRoll.Checked = allowNegativeRoll;
//add event listeners
cbRelativeScale.CheckedChanged += cbRelativeScale_CheckedChanged;
cbUniformScale.CheckedChanged += cbUniformScale_CheckedChanged;
cbNegativeScaleX.CheckedChanged += cbNegativeScaleX_CheckedChanged;
cbNegativeScaleY.CheckedChanged += cbNegativeScaleY_CheckedChanged;
cbRelativePitch.CheckedChanged += cbRelativePitch_CheckedChanged;
cbRelativeRoll.CheckedChanged += cbRelativeRoll_CheckedChanged;
cbNegativePitch.CheckedChanged += cbNegativePitch_CheckedChanged;
cbNegativeRoll.CheckedChanged += cbNegativeRoll_CheckedChanged;
//disable controls if necessary
if (uniformScale) cbUniformScale_CheckedChanged(cbUniformScale, EventArgs.Empty);
//tricky way to actually store undo information...
foreach(Thing t in selection) t.Move(t.Position);
}
//utility
private void applyTranslationJitter(int ammount) {
int curAmmount;
#endregion
if(relativePosition) {
for(int i = 0; i < selection.Count; i++) {
curAmmount = (int)Math.Round(ammount * (thingData[i].SafeDistance / 100f));
selection[i].Move(new Vector2D(thingData[i].Position.x + (int)(Math.Sin(thingData[i].JitterAngle) * curAmmount), thingData[i].Position.y + (int)(Math.Cos(thingData[i].JitterAngle) * curAmmount)));
selection[i].DetermineSector();
}
} else {
for(int i = 0; i < selection.Count; i++) {
curAmmount = ammount > thingData[i].SafeDistance ? thingData[i].SafeDistance : ammount;
selection[i].Move(new Vector2D(thingData[i].Position.x + (int)(Math.Sin(thingData[i].JitterAngle) * curAmmount), thingData[i].Position.y + (int)(Math.Cos(thingData[i].JitterAngle) * curAmmount)));
selection[i].DetermineSector();
}
#region Apply logic
private void applyTranslation(int ammount) {
for(int i = 0; i < selection.Count; i++) {
int curAmmount = ammount > thingData[i].SafeDistance ? thingData[i].SafeDistance : ammount;
selection[i].Move(new Vector2D(thingData[i].Position.x + (int)(Math.Sin(thingData[i].OffsetAngle) * curAmmount), thingData[i].Position.y + (int)(Math.Cos(thingData[i].OffsetAngle) * curAmmount)));
selection[i].DetermineSector();
}
updateGeometry();
}
private void applyRotationJitter(int ammount) {
private void applyRotation(int ammount) {
for(int i = 0; i < selection.Count; i++)
selection[i].Rotate((int)((thingData[i].Angle + ammount * thingData[i].JitterRotation) % 360));
//update view
if(editingModeName == "ThingsMode")
General.Interface.RedrawDisplay();
if(editingModeName == "ThingsMode") General.Interface.RedrawDisplay();
}
private void applyHeightJitter(int ammount) {
int curAmmount;
float a = ammount / 100f;
private void applyPitch(int ammount) {
int p;
if(relativePosition) {
for(int i = 0; i < selection.Count; i++) {
curAmmount = Math.Min(thingData[i].SectorHeight, Math.Max(0, thingData[i].ZOffset + (int)(thingData[i].SectorHeight * a)));
selection[i].Move(selection[i].Position.x, selection[i].Position.y, curAmmount * thingData[i].JitterHeight);
for(int i = 0; i < selection.Count; i++) {
if (cbRelativePitch.Checked) {
p = (int)((thingData[i].Pitch + ammount * thingData[i].JitterPitch) % 360);
} else {
p = (int)((ammount * thingData[i].JitterPitch) % 360);
}
} else {
for(int i = 0; i < selection.Count; i++) {
curAmmount = Math.Min(thingData[i].SectorHeight, Math.Max(0, thingData[i].ZOffset + ammount));
selection[i].Move(selection[i].Position.x, selection[i].Position.y, curAmmount * thingData[i].JitterHeight);
selection[i].SetPitch(p);
}
//update view
if(editingModeName == "ThingsMode") General.Interface.RedrawDisplay();
}
private void applyRoll(int ammount) {
int r;
for (int i = 0; i < selection.Count; i++) {
if (cbRelativeRoll.Checked) {
r = (int)((thingData[i].Roll + ammount * thingData[i].JitterRoll) % 360);
} else {
r = (int)((ammount * thingData[i].JitterRoll) % 360);
}
selection[i].SetRoll(r);
}
//update view
if(editingModeName == "ThingsMode") General.Interface.RedrawDisplay();
}
private void applyHeight(int ammount) {
for(int i = 0; i < selection.Count; i++) {
int curAmmount = Math.Min(thingData[i].SectorHeight, Math.Max(0, thingData[i].ZOffset + ammount));
selection[i].Move(selection[i].Position.x, selection[i].Position.y, curAmmount * thingData[i].JitterHeight);
}
updateGeometry();
}
private void applyScale() {
if(cbUniformScale.Checked) {
applyScale((float)minScaleX.Value, (float)maxScaleX.Value, (float)minScaleX.Value, (float)maxScaleX.Value);
} else {
applyScale((float)minScaleX.Value, (float)maxScaleX.Value, (float)minScaleY.Value, (float)maxScaleY.Value);
}
//update view
if(editingModeName == "ThingsMode") General.Interface.RedrawDisplay();
}
private void applyScale(float minX, float maxX, float minY, float maxY) {
if(minX > maxX) General.Swap(ref minX, ref maxX);
if(minY > maxY) General.Swap(ref minY, ref maxY);
float sx, sy;
float diffX = maxX - minX;
float diffY = maxY - minY;
for(int i = 0; i < selection.Count; i++) {
if (cbRelativeScale.Checked) {
sx = thingData[i].ScaleX + minX + diffX * thingData[i].JitterScaleX;
sy = thingData[i].ScaleY + minY + diffY * thingData[i].JitterScaleY;
} else {
sx = minX + diffX * thingData[i].JitterScaleX;
sy = minY + diffY * thingData[i].JitterScaleY;
}
selection[i].SetScale(sx, sy);
}
}
#endregion
#region Update logic
private void updateGeometry() {
// Update what must be updated
if(editingModeName == "BaseVisualMode") {
@ -171,41 +287,72 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
}
private void updateAngles() {
Random rnd = new Random();
private void updateOffsetAngles() {
for(int i = 0; i < thingData.Count; i++) {
ThingData td = thingData[i];
td.JitterAngle = rnd.Next(359); //(float)(rnd.Next(359) * Math.PI / 180f);
td.OffsetAngle = General.Random(0, 359);
thingData[i] = td;
}
}
private void updateHeights() {
Random rnd = new Random();
for(int i = 0; i < thingData.Count; i++) {
ThingData td = thingData[i];
td.JitterHeight = (rnd.Next(100) / 100f);
td.JitterHeight = (General.Random(0, 100) / 100f);
thingData[i] = td;
}
}
private void updateRotationAngles() {
Random rnd = new Random();
for(int i = 0; i < thingData.Count; i++) {
ThingData td = thingData[i];
td.JitterRotation = (rnd.Next(-100, 100) / 100f);
td.JitterRotation = (General.Random(-100, 100) / 100f);
thingData[i] = td;
}
}
//EVENTS
private void bApply_Click(object sender, EventArgs e) {
foreach(Thing t in selection)
t.DetermineSector();
private void updatePitchAngles() {
int min = (cbNegativePitch.Checked ? -100 : 0);
for(int i = 0; i < thingData.Count; i++) {
ThingData td = thingData[i];
td.JitterPitch = (General.Random(min, 100) / 100f);
thingData[i] = td;
}
}
private void updateRollAngles() {
int min = (cbNegativeRoll.Checked ? -100 : 0);
for(int i = 0; i < thingData.Count; i++) {
ThingData td = thingData[i];
td.JitterRoll = (General.Random(min, 100) / 100f);
thingData[i] = td;
}
}
private void updateScaleX() {
int min = (cbNegativeScaleX.Checked ? -100 : 0);
for(int i = 0; i < thingData.Count; i++) {
ThingData td = thingData[i];
td.JitterScaleX = (General.Random(min, 100) / 100f);
thingData[i] = td;
}
}
private void updateScaleY() {
int min = (cbNegativeScaleY.Checked ? -100 : 0);
for(int i = 0; i < thingData.Count; i++) {
ThingData td = thingData[i];
td.JitterScaleY = (General.Random(min, 100) / 100f);
thingData[i] = td;
}
}
#endregion
#region Events
private void bApply_Click(object sender, EventArgs e) {
foreach(Thing t in selection) t.DetermineSector();
this.DialogResult = DialogResult.OK;
Close();
}
@ -216,55 +363,135 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
private void JitterThingsForm_FormClosing(object sender, FormClosingEventArgs e) {
if(this.DialogResult == DialogResult.Cancel)
General.Map.UndoRedo.WithdrawUndo();//undo changes
if (this.DialogResult == DialogResult.Cancel) {
//undo changes
General.Map.UndoRedo.WithdrawUndo();
} else {
//store settings
relativePitch = cbRelativePitch.Checked;
relativeRoll = cbRelativeRoll.Checked;
relativeScale = cbRelativeScale.Checked;
allowNegativeScaleX = cbNegativeScaleX.Checked;
allowNegativeScaleY = cbNegativeScaleY.Checked;
uniformScale = cbUniformScale.Checked;
allowNegativePitch = cbNegativePitch.Checked;
allowNegativeRoll = cbNegativeRoll.Checked;
}
}
private void positionJitterAmmount_OnValueChanged(object sender, EventArgs e) {
applyTranslationJitter(positionJitterAmmount.Value);
applyTranslation(positionJitterAmmount.Value);
}
private void rotationJitterAmmount_OnValueChanged(object sender, EventArgs e) {
applyRotationJitter(rotationJitterAmmount.Value);
applyRotation(rotationJitterAmmount.Value);
}
private void heightJitterAmmount_OnValueChanging(object sender, EventArgs e) {
applyHeightJitter(heightJitterAmmount.Value);
applyHeight(heightJitterAmmount.Value);
}
//buttons & checkboxes
private void pitchAmmount_OnValueChanging(object sender, EventArgs e) {
applyPitch(pitchAmmount.Value);
}
private void rollAmmount_OnValueChanging(object sender, EventArgs e) {
applyRoll(rollAmmount.Value);
}
private void minScaleX_ValueChanged(object sender, EventArgs e) {
applyScale();
}
private void minScaleY_ValueChanged(object sender, EventArgs e) {
applyScale();
}
#endregion
#region Buttons & checkboxes events
private void bUpdateTranslation_Click(object sender, EventArgs e) {
updateAngles();
applyTranslationJitter(positionJitterAmmount.Value);
updateOffsetAngles();
applyTranslation(positionJitterAmmount.Value);
}
private void bUpdateHeight_Click(object sender, EventArgs e) {
updateHeights();
applyHeightJitter(heightJitterAmmount.Value);
applyHeight(heightJitterAmmount.Value);
}
private void bUpdateAngle_Click(object sender, EventArgs e) {
updateRotationAngles();
applyRotationJitter(rotationJitterAmmount.Value);
applyRotation(rotationJitterAmmount.Value);
}
private void cbRelativeHeight_CheckedChanged(object sender, EventArgs e) {
heightJitterAmmount.Label = "Height" + (cbRelativePos.Checked ? " (%):" : ":");
relativeHeight = cbRelativeHeight.Checked;
heightJitterAmmount.Maximum = relativeHeight ? 100 : MaxSafeHeightDistance;
applyHeightJitter(heightJitterAmmount.Value);
private void bUpdatePitch_Click(object sender, EventArgs e) {
updatePitchAngles();
applyPitch(pitchAmmount.Value);
}
private void cbRelativePos_CheckedChanged(object sender, EventArgs e) {
positionJitterAmmount.Label = "Position" + (cbRelativePos.Checked ? " (%):" : ":");
relativePosition = cbRelativePos.Checked;
positionJitterAmmount.Maximum = relativePosition ? 100 : MaxSafeDistance;
applyTranslationJitter(positionJitterAmmount.Value);
private void bUpdateRoll_Click(object sender, EventArgs e) {
updateRollAngles();
applyRoll(rollAmmount.Value);
}
//HALP!
private void bUpdateScaleX_Click(object sender, EventArgs e) {
updateScaleX();
applyScale();
}
private void bUpdateScaleY_Click(object sender, EventArgs e) {
updateScaleY();
applyScale();
}
private void cbRelativePitch_CheckedChanged(object sender, EventArgs e) {
updatePitchAngles();
applyPitch(pitchAmmount.Value);
}
private void cbRelativeRoll_CheckedChanged(object sender, EventArgs e) {
updateRollAngles();
applyRoll(rollAmmount.Value);
}
private void cbNegativePitch_CheckedChanged(object sender, EventArgs e) {
updatePitchAngles();
applyPitch(pitchAmmount.Value);
}
private void cbNegativeRoll_CheckedChanged(object sender, EventArgs e) {
updateRollAngles();
applyRoll(rollAmmount.Value);
}
private void cbRelativeScale_CheckedChanged(object sender, EventArgs e) {
applyScale();
}
private void cbUniformScale_CheckedChanged(object sender, EventArgs e) {
bUpdateScaleY.Enabled = !cbUniformScale.Checked;
minScaleY.Enabled = !cbUniformScale.Checked;
maxScaleY.Enabled = !cbUniformScale.Checked;
minScaleYLabel.Enabled = !cbUniformScale.Checked;
maxScaleYLabel.Enabled = !cbUniformScale.Checked;
applyScale();
}
private void cbNegativeScaleX_CheckedChanged(object sender, EventArgs e) {
updateScaleX();
applyScale();
}
private void cbNegativeScaleY_CheckedChanged(object sender, EventArgs e) {
updateScaleY();
applyScale();
}
#endregion
//HALP!
private void JitterThingsForm_HelpRequested(object sender, HelpEventArgs hlpevent) {
General.ShowHelp("gzdb/features/all_modes/jitter.html");
hlpevent.Handled = true;

View file

@ -1,120 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View file

@ -28,7 +28,6 @@
this.bCancel = new System.Windows.Forms.Button();
this.bApply = new System.Windows.Forms.Button();
this.bUpdateTranslation = new System.Windows.Forms.Button();
this.cbRelativePos = new System.Windows.Forms.CheckBox();
this.positionJitterAmmount = new IntControl();
this.SuspendLayout();
//
@ -36,7 +35,7 @@
//
this.bCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.bCancel.Location = new System.Drawing.Point(201, 40);
this.bCancel.Location = new System.Drawing.Point(141, 45);
this.bCancel.Name = "bCancel";
this.bCancel.Size = new System.Drawing.Size(75, 23);
this.bCancel.TabIndex = 7;
@ -47,7 +46,7 @@
// bApply
//
this.bApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bApply.Location = new System.Drawing.Point(282, 40);
this.bApply.Location = new System.Drawing.Point(222, 45);
this.bApply.Name = "bApply";
this.bApply.Size = new System.Drawing.Size(75, 23);
this.bApply.TabIndex = 6;
@ -59,32 +58,21 @@
//
this.bUpdateTranslation.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.bUpdateTranslation.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Update;
this.bUpdateTranslation.Location = new System.Drawing.Point(334, 11);
this.bUpdateTranslation.Location = new System.Drawing.Point(274, 11);
this.bUpdateTranslation.Name = "bUpdateTranslation";
this.bUpdateTranslation.Size = new System.Drawing.Size(23, 23);
this.bUpdateTranslation.TabIndex = 8;
this.bUpdateTranslation.UseVisualStyleBackColor = true;
this.bUpdateTranslation.Click += new System.EventHandler(this.bUpdateTranslation_Click);
//
// cbRelativePos
//
this.cbRelativePos.AutoSize = true;
this.cbRelativePos.Location = new System.Drawing.Point(12, 16);
this.cbRelativePos.Name = "cbRelativePos";
this.cbRelativePos.Size = new System.Drawing.Size(64, 18);
this.cbRelativePos.TabIndex = 10;
this.cbRelativePos.Text = "Relative";
this.cbRelativePos.UseVisualStyleBackColor = true;
this.cbRelativePos.CheckedChanged += new System.EventHandler(this.cbRelativePos_CheckedChanged);
//
// positionJitterAmmount
//
this.positionJitterAmmount.AllowNegative = false;
this.positionJitterAmmount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.positionJitterAmmount.ExtendedLimits = true;
this.positionJitterAmmount.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.positionJitterAmmount.Label = "Position (%):";
this.positionJitterAmmount.Location = new System.Drawing.Point(62, 12);
this.positionJitterAmmount.Label = "Position:";
this.positionJitterAmmount.Location = new System.Drawing.Point(2, 12);
this.positionJitterAmmount.Maximum = 100;
this.positionJitterAmmount.Minimum = 0;
this.positionJitterAmmount.Name = "positionJitterAmmount";
@ -99,8 +87,7 @@
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.CancelButton = this.bCancel;
this.ClientSize = new System.Drawing.Size(366, 68);
this.Controls.Add(this.cbRelativePos);
this.ClientSize = new System.Drawing.Size(306, 72);
this.Controls.Add(this.positionJitterAmmount);
this.Controls.Add(this.bUpdateTranslation);
this.Controls.Add(this.bCancel);
@ -113,7 +100,6 @@
this.Text = "Jitter Settings";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.JitterVerticesForm_FormClosing);
this.ResumeLayout(false);
this.PerformLayout();
}
@ -123,6 +109,5 @@
private System.Windows.Forms.Button bCancel;
private System.Windows.Forms.Button bApply;
private IntControl positionJitterAmmount;
private System.Windows.Forms.CheckBox cbRelativePos;
}
}

View file

@ -10,13 +10,11 @@ namespace CodeImp.DoomBuilder.BuilderEffects
{
public partial class JitterVerticesForm : Form
{
private string editingModeName;
private List<Vertex> selection;
private List<VisualSector> visualSectors;
private VertexData[] vertexData;
private int MaxSafeDistance;
private static bool relativePosition;
private readonly string editingModeName;
private readonly List<Vertex> selection;
private readonly List<VisualSector> visualSectors;
private readonly VertexData[] vertexData;
private readonly int MaxSafeDistance;
private struct VertexData
{
@ -56,7 +54,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
//update window header
this.Text = "Jitter Transform (" + linesCount + (linesCount > 1 ? " linedefs" : " linedef") + ")";
this.Text = "Randomize " + linesCount + (linesCount > 1 ? " linedefs" : " linedef");
} else if(editingModeName == "LinedefsMode") {
ICollection<Linedef> list = General.Map.Map.GetSelectedLinedefs(true);
int linesCount = 0;
@ -70,7 +68,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
//update window header
this.Text = "Jitter Transform (" + linesCount + (linesCount > 1 ? " linedefs" : " linedef") + ")";
this.Text = "Randomize " + linesCount + (linesCount > 1 ? " linedefs" : " linedef");
} else {
ICollection<Vertex> list = General.Map.Map.GetSelectedVertices(true);
@ -78,7 +76,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
selection.Add(v);
//update window header
this.Text = "Jitter Transform (" + selection.Count + (selection.Count > 1 ? " vertices" : " vertex") + ")";
this.Text = "Randomize " + selection.Count + (selection.Count > 1 ? " vertices" : " vertex");
}
if(selection.Count == 0) {
@ -89,8 +87,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
Dictionary<Vertex, VertexData> data = new Dictionary<Vertex, VertexData>();
foreach(Vertex v in selection) {
VertexData vd = new VertexData();
vd.Position = v.Position;
VertexData vd = new VertexData {Position = v.Position};
data.Add(v, vd);
}
@ -150,31 +147,22 @@ namespace CodeImp.DoomBuilder.BuilderEffects
MaxSafeDistance = vertexData[i].SafeDistance;
}
updateAngles();
positionJitterAmmount.Maximum = MaxSafeDistance;
//set editing mode
cbRelativePos.Checked = relativePosition;
cbRelativePos_CheckedChanged(this, EventArgs.Empty);
updateAngles();
//create undo
General.Map.UndoRedo.ClearAllRedos();
General.Map.UndoRedo.CreateUndo("Jitter Transform (" + selection.Count + (selection.Count > 1 ? " vertices)" : " vertex)"));
General.Map.UndoRedo.CreateUndo("Randomize " + selection.Count + (selection.Count > 1 ? " vertices" : " vertex"));
}
//utility
private void applyTranslationJitter(int ammount) {
int curAmmount;
if(relativePosition) {
for(int i = 0; i < selection.Count; i++) {
curAmmount = (int)Math.Round(ammount * (vertexData[i].SafeDistance / 100f));
selection[i].Move(new Vector2D(vertexData[i].Position.x + (int)(Math.Sin(vertexData[i].JitterAngle) * curAmmount), vertexData[i].Position.y + (int)(Math.Cos(vertexData[i].JitterAngle) * curAmmount)));
}
} else {
for(int i = 0; i < selection.Count; i++) {
curAmmount = ammount > vertexData[i].SafeDistance ? vertexData[i].SafeDistance : ammount;
selection[i].Move(new Vector2D(vertexData[i].Position.x + (int)(Math.Sin(vertexData[i].JitterAngle) * curAmmount), vertexData[i].Position.y + (int)(Math.Cos(vertexData[i].JitterAngle) * curAmmount)));
}
for(int i = 0; i < selection.Count; i++) {
curAmmount = ammount > vertexData[i].SafeDistance ? vertexData[i].SafeDistance : ammount;
selection[i].Move(new Vector2D(vertexData[i].Position.x + (int)(Math.Sin(vertexData[i].JitterAngle) * curAmmount), vertexData[i].Position.y + (int)(Math.Cos(vertexData[i].JitterAngle) * curAmmount)));
}
//update view
@ -193,11 +181,9 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
private void updateAngles() {
Random rnd = new Random();
for(int i = 0; i < vertexData.Length; i++) {
VertexData vd = vertexData[i];
vd.JitterAngle = (float)(rnd.Next(359) * Math.PI / 180f);
vd.JitterAngle = (float)(General.Random(0, 359) * Math.PI / 180f);
vertexData[i] = vd;
}
}
@ -234,14 +220,6 @@ namespace CodeImp.DoomBuilder.BuilderEffects
applyTranslationJitter(positionJitterAmmount.Value);
}
private void cbRelativePos_CheckedChanged(object sender, EventArgs e) {
positionJitterAmmount.Label = "Position" + (cbRelativePos.Checked ? " (%):" : ":");
relativePosition = cbRelativePos.Checked;
positionJitterAmmount.Maximum = relativePosition ? 100 : MaxSafeDistance;
applyTranslationJitter(positionJitterAmmount.Value);
}
private void JitterVerticesForm_HelpRequested(object sender, HelpEventArgs hlpevent) {
General.ShowHelp("gzdb/features/all_modes/jitter.html");
hlpevent.Handled = true;

View file

@ -1,120 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -27,11 +27,11 @@
private void InitializeComponent() {
this.menuStrip = new System.Windows.Forms.MenuStrip();
this.importStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();
this.jitterItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStrip = new System.Windows.Forms.ToolStrip();
this.jitterButton = new System.Windows.Forms.ToolStripButton();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.jitterItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip.SuspendLayout();
this.toolStrip.SuspendLayout();
this.SuspendLayout();
@ -55,6 +55,15 @@
this.importStripMenuItem.Size = new System.Drawing.Size(55, 20);
this.importStripMenuItem.Text = "Import";
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Terrain;
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(215, 22);
this.toolStripMenuItem1.Tag = "importobjasterrain";
this.toolStripMenuItem1.Text = "Wavefront .obj as Terrain...";
this.toolStripMenuItem1.Click += new System.EventHandler(this.InvokeTaggedAction);
//
// toolStripMenuItem3
//
this.toolStripMenuItem3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -63,6 +72,15 @@
this.toolStripMenuItem3.Size = new System.Drawing.Size(55, 20);
this.toolStripMenuItem3.Text = "Modes";
//
// jitterItem
//
this.jitterItem.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Jitter;
this.jitterItem.Name = "jitterItem";
this.jitterItem.Size = new System.Drawing.Size(152, 22);
this.jitterItem.Tag = "applyjitter";
this.jitterItem.Text = "Randomize";
this.jitterItem.Click += new System.EventHandler(this.InvokeTaggedAction);
//
// toolStrip
//
this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -81,27 +99,9 @@
this.jitterButton.Name = "jitterButton";
this.jitterButton.Size = new System.Drawing.Size(23, 22);
this.jitterButton.Tag = "applyjitter";
this.jitterButton.Text = "Apply Jitter";
this.jitterButton.Text = "Randomize";
this.jitterButton.Click += new System.EventHandler(this.InvokeTaggedAction);
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Terrain;
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(215, 22);
this.toolStripMenuItem1.Tag = "importobjasterrain";
this.toolStripMenuItem1.Text = "Wavefront .obj as Terrain...";
this.toolStripMenuItem1.Click += new System.EventHandler(this.InvokeTaggedAction);
//
// jitterItem
//
this.jitterItem.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Jitter;
this.jitterItem.Name = "jitterItem";
this.jitterItem.Size = new System.Drawing.Size(133, 22);
this.jitterItem.Tag = "applyjitter";
this.jitterItem.Text = "Apply Jitter";
this.jitterItem.Click += new System.EventHandler(this.InvokeTaggedAction);
//
// MenusForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

View file

@ -6,9 +6,9 @@ categories
applyjitter
{
title = "Jitter";
title = "Randomize";
category = "transform";
description = "Applies jitter effect to selection.";
description = "Allows to apply a variety of randomized transformations to the selection.";
allowkeys = true;
allowmouse = false;
allowscroll = false;