GZDoom Builder 1.09a:

Added drawing modes to Mode menu, so they are much easier to spot now.
Warnings notify panel blinks much more noticeable when there are warnings.
UDMF Controls plugin:
3D-floor surfaces can be edited now.
Relative mode is now enabled by default.
Scale control now works properly in relative mode.
Angle control's angle indicator in now drawn properly when value is changed using numeric control.
This commit is contained in:
MaxED 2012-06-28 20:27:48 +00:00
parent 46642200eb
commit 7c93fad714
28 changed files with 368 additions and 164 deletions

View file

@ -806,6 +806,9 @@
<None Include="Resources\GZDB2.ico" />
<None Include="Resources\fog.png" />
<None Include="Resources\fx.png" />
<Content Include="Resources\DrawEllipseMode.png" />
<Content Include="Resources\DrawLinesMode.png" />
<Content Include="Resources\DrawRectMode.png" />
<Content Include="Resources\Light.png" />
<Content Include="Resources\Light_animate.png" />
<Content Include="Resources\Model.png" />

View file

@ -210,6 +210,16 @@ namespace CodeImp.DoomBuilder.VisualModes
boundingBox = BoundingBoxTools.CalculateBoundingPlane(bbs);
}
}
//mxd. Used to get proper sector from 3d-floors
public virtual Sector GetControlSector() {
return sector.Sector;
}
//mxd. Used to get proper linedef from 3d-floors
public virtual Linedef GetControlLinedef() {
return sidedef.Line;
}
// This compares for sorting by sector
public int CompareTo(VisualGeometry other)
@ -246,12 +256,14 @@ namespace CodeImp.DoomBuilder.VisualModes
#endregion
}
public enum VisualGeometryType:int{
FLOOR = 0,
CEILING = 1,
WALL_UPPER = 2,
WALL_MIDDLE = 3,
WALL_BOTTOM = 4,
UNKNOWN = 5,
//mxd
public enum VisualGeometryType{
FLOOR,
CEILING,
WALL_UPPER,
WALL_MIDDLE,
WALL_MIDDLE_3D,
WALL_BOTTOM,
UNKNOWN,
}
}

View file

@ -73,7 +73,6 @@ namespace CodeImp.DoomBuilder.VisualModes
//mxd
private List<VisualThing> selectedVisualThings;
private List<VisualSector> selectedVisualSectors;
private List<VisualGeometry> selectedSurfaces;
//used in "Play From Here" Action
private Thing playerStart;
private Vector3D playerStartPosition;
@ -170,7 +169,6 @@ namespace CodeImp.DoomBuilder.VisualModes
//mxd
selectedVisualSectors = null;
selectedVisualThings = null;
selectedSurfaces = null;
// Done
base.Dispose();
@ -927,23 +925,21 @@ namespace CodeImp.DoomBuilder.VisualModes
}
/// <summary>
/// mxd. This returns list of selected sectors based on surfaces selected in visual mode
/// mxd. This returns list of surfaces selected in visual mode
/// </summary>
public List<VisualGeometry> GetSelectedSurfaces(bool refreshSelection) {
if (refreshSelection || selectedSurfaces == null) {
selectedSurfaces = new List<VisualGeometry>();
foreach (KeyValuePair<Sector, VisualSector> group in allsectors) {
foreach (VisualGeometry vg in group.Value.AllGeometry) {
if (vg.Selected)
selectedSurfaces.Add(vg);
}
public List<VisualGeometry> GetSelectedSurfaces() {
List<VisualGeometry> selectedSurfaces = new List<VisualGeometry>();
foreach (KeyValuePair<Sector, VisualSector> group in allsectors) {
foreach (VisualGeometry vg in group.Value.AllGeometry) {
if (vg.Selected)
selectedSurfaces.Add(vg);
}
}
//if nothing is selected - try to get hilighted surface
if (selectedSurfaces.Count == 0) {
VisualGeometry vg = getHilightedSurface();
if(vg != null) selectedSurfaces.Add(vg);
}
//if nothing is selected - try to get hilighted surface
if (selectedSurfaces.Count == 0) {
VisualGeometry vg = getHilightedSurface();
if (vg != null) selectedSurfaces.Add(vg);
}
return selectedSurfaces;
}

View file

@ -190,6 +190,7 @@ namespace CodeImp.DoomBuilder.Windows
this.dockerspanel = new CodeImp.DoomBuilder.Controls.DockersControl();
this.dockerscollapser = new System.Windows.Forms.Timer(this.components);
this.warntimer = new System.Windows.Forms.Timer(this.components);
this.separatorDrawodes = new System.Windows.Forms.ToolStripSeparator();
toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator();
@ -724,6 +725,8 @@ namespace CodeImp.DoomBuilder.Windows
//
// menumode
//
this.menumode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.separatorDrawodes});
this.menumode.Name = "menumode";
this.menumode.Size = new System.Drawing.Size(50, 20);
this.menumode.Text = "&Mode";
@ -1317,7 +1320,7 @@ namespace CodeImp.DoomBuilder.Windows
this.statuslabel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.statuslabel.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.statuslabel.Name = "statuslabel";
this.statuslabel.Size = new System.Drawing.Size(309, 18);
this.statuslabel.Size = new System.Drawing.Size(340, 18);
this.statuslabel.Spring = true;
this.statuslabel.Text = "Initializing user interface...";
this.statuslabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
@ -1743,6 +1746,11 @@ namespace CodeImp.DoomBuilder.Windows
this.warntimer.Interval = 500;
this.warntimer.Tick += new System.EventHandler(this.warntimer_Tick);
//
// separatorDrawodes
//
this.separatorDrawodes.Name = "separatorDrawodes";
this.separatorDrawodes.Size = new System.Drawing.Size(149, 6);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
@ -1941,5 +1949,6 @@ namespace CodeImp.DoomBuilder.Windows
private System.Windows.Forms.ToolStripMenuItem itemReloadModedef;
private System.Windows.Forms.ToolStripMenuItem itemReloadGldefs;
private System.Windows.Forms.ToolStripMenuItem itemReloadMapinfo;
private System.Windows.Forms.ToolStripSeparator separatorDrawodes;
}
}

View file

@ -1838,6 +1838,9 @@ namespace CodeImp.DoomBuilder.Windows
case MenuSection.ViewViews: menuview.DropDownItems.Insert(menuview.DropDownItems.IndexOf(seperatorviewviews), menu); break;
case MenuSection.ViewZoom: menuview.DropDownItems.Insert(menuview.DropDownItems.IndexOf(seperatorviewzoom), menu); break;
case MenuSection.ViewScriptEdit: menuview.DropDownItems.Add(menu); break;
//mxd
case MenuSection.ModeDrawModes: menumode.DropDownItems.Insert(menumode.DropDownItems.IndexOf(separatorDrawodes) + 1, menu); break;
case MenuSection.PrefabsInsert: menuprefabs.DropDownItems.Insert(menuprefabs.DropDownItems.IndexOf(seperatorprefabsinsert), menu); break;
case MenuSection.PrefabsCreate: menuprefabs.DropDownItems.Add(menu); break;
case MenuSection.ToolsResources: menutools.DropDownItems.Insert(menutools.DropDownItems.IndexOf(seperatortoolsresources), menu); break;
@ -2688,6 +2691,7 @@ namespace CodeImp.DoomBuilder.Windows
if (warnsLabel.Font.Bold) {
warnsLabel.Font = new Font(warnsLabel.Font, FontStyle.Regular);
warnsLabel.Image = global::CodeImp.DoomBuilder.Properties.Resources.WarningOff;
warnsLabel.BackColor = SystemColors.Control;
}
warntimer.Stop();
warnStatus = false;
@ -2709,8 +2713,10 @@ namespace CodeImp.DoomBuilder.Windows
private void warntimer_Tick(object sender, EventArgs e) {
if (warnStatus) {
warnsLabel.Image = global::CodeImp.DoomBuilder.Properties.Resources.WarningOff;
warnsLabel.BackColor = Color.Red;
} else {
warnsLabel.Image = global::CodeImp.DoomBuilder.Properties.Resources.Warning;
warnsLabel.BackColor = SystemColors.Control;
}
warnStatus = !warnStatus;
}

View file

@ -53,6 +53,7 @@ namespace CodeImp.DoomBuilder.Windows
ViewViews,
ViewZoom,
ViewScriptEdit,
ModeDrawModes, //mxd
PrefabsInsert,
PrefabsCreate,
ToolsResources,

View file

@ -336,6 +336,15 @@
<ItemGroup>
<EmbeddedResource Include="Resources\SnapVerts.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\DrawEllipseMode.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\DrawLinesMode.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\DrawRectMode.png" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View file

@ -25,7 +25,7 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes {
undoName = "Ellipse draw";
shapeName = "ellipse";
subdivisions = minSubdivisions;
subdivisions = minSubdivisions + 2;
}
override protected Vector2D[] getShape(Vector2D pStart, Vector2D pEnd) {

View file

@ -77,6 +77,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
//mxd
private ToolStripMenuItem snapModeMenuItem;
private ToolStripMenuItem drawLinesModeMenuItem;
private ToolStripMenuItem drawRectModeMenuItem;
private ToolStripMenuItem drawEllipseModeMenuItem;
// Settings
private int showvisualthings; // 0 = none, 1 = sprite only, 2 = sprite caged
@ -189,6 +192,31 @@ namespace CodeImp.DoomBuilder.BuilderModes
snapModeMenuItem.Image = CodeImp.DoomBuilder.BuilderModes.Properties.Resources.SnapVerts;
snapModeMenuItem.Enabled = false;
General.Interface.AddMenu(snapModeMenuItem, MenuSection.EditGeometry);
//mxd. add draw modes buttons
//draw ellipse
drawEllipseModeMenuItem = new ToolStripMenuItem("Draw Ellipse");
drawEllipseModeMenuItem.Tag = "drawellipsemode";
drawEllipseModeMenuItem.Click += new EventHandler(InvokeTaggedAction);
drawEllipseModeMenuItem.Image = CodeImp.DoomBuilder.BuilderModes.Properties.Resources.DrawEllipseMode;
drawEllipseModeMenuItem.Enabled = false;
General.Interface.AddMenu(drawEllipseModeMenuItem, MenuSection.ModeDrawModes);
//draw rectangle
drawRectModeMenuItem = new ToolStripMenuItem("Draw Rectangle");
drawRectModeMenuItem.Tag = "drawrectanglemode";
drawRectModeMenuItem.Click += new EventHandler(InvokeTaggedAction);
drawRectModeMenuItem.Image = CodeImp.DoomBuilder.BuilderModes.Properties.Resources.DrawRectMode;
drawRectModeMenuItem.Enabled = false;
General.Interface.AddMenu(drawRectModeMenuItem, MenuSection.ModeDrawModes);
//draw lines
drawLinesModeMenuItem = new ToolStripMenuItem("Draw Lines");
drawLinesModeMenuItem.Tag = "drawlinesmode";
drawLinesModeMenuItem.Click += new EventHandler(InvokeTaggedAction);
drawLinesModeMenuItem.Image = CodeImp.DoomBuilder.BuilderModes.Properties.Resources.DrawLinesMode;
drawLinesModeMenuItem.Enabled = false;
General.Interface.AddMenu(drawLinesModeMenuItem, MenuSection.ModeDrawModes);
}
// Disposer
@ -199,6 +227,13 @@ namespace CodeImp.DoomBuilder.BuilderModes
{
// Clean up
General.Interface.RemoveDocker(undoredodocker);
//mxd
General.Interface.RemoveMenu(snapModeMenuItem);
General.Interface.RemoveMenu(drawLinesModeMenuItem);
General.Interface.RemoveMenu(drawRectModeMenuItem);
General.Interface.RemoveMenu(drawEllipseModeMenuItem);
undoredopanel.Dispose();
menusform.Unregister();
menusform.Dispose();
@ -321,6 +356,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
//mxd
snapModeMenuItem.Enabled = true;
drawLinesModeMenuItem.Enabled = true;
drawRectModeMenuItem.Enabled = true;
drawEllipseModeMenuItem.Enabled = true;
}
// Map opened
@ -332,6 +370,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
//mxd
snapModeMenuItem.Enabled = true;
drawLinesModeMenuItem.Enabled = true;
drawRectModeMenuItem.Enabled = true;
drawEllipseModeMenuItem.Enabled = true;
}
// Map closed
@ -342,6 +383,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
//mxd
snapModeMenuItem.Enabled = false;
drawLinesModeMenuItem.Enabled = false;
drawRectModeMenuItem.Enabled = false;
drawEllipseModeMenuItem.Enabled = false;
}
// Redo performed

View file

@ -102,6 +102,27 @@ namespace CodeImp.DoomBuilder.BuilderModes.Properties {
}
}
internal static System.Drawing.Bitmap DrawEllipseMode {
get {
object obj = ResourceManager.GetObject("DrawEllipseMode", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
internal static System.Drawing.Bitmap DrawLinesMode {
get {
object obj = ResourceManager.GetObject("DrawLinesMode", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
internal static System.Drawing.Bitmap DrawRectMode {
get {
object obj = ResourceManager.GetObject("DrawRectMode", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
internal static System.Drawing.Bitmap FlipSelectionH {
get {
object obj = ResourceManager.GetObject("FlipSelectionH", resourceCulture);

View file

@ -166,4 +166,13 @@
<data name="SnapVerts" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\SnapVerts.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="DrawEllipseMode" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\DrawEllipseMode.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="DrawLinesMode" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\DrawLinesMode.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="DrawRectMode" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\DrawRectMode.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

View file

@ -92,6 +92,7 @@
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "LightColorPicker";
this.HelpRequested += new System.Windows.Forms.HelpEventHandler(this.LightColorPicker_HelpRequested);
this.ResumeLayout(false);
this.PerformLayout();

View file

@ -350,6 +350,11 @@ namespace CodeImp.DoomBuilder.ColorPicker.Windows {
private void onSliderValueChanged(object sender, ColorPickerSliderEventArgs e) {
updateLightPropsFromSliders();
}
private void LightColorPicker_HelpRequested(object sender, HelpEventArgs hlpevent) {
General.ShowHelp("gz_plug_colorpicker.html");
hlpevent.Handled = true;
}
}
struct LightProps {

View file

@ -88,6 +88,7 @@
this.Opacity = 0;
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "SectorColorPicker";
this.HelpRequested += new System.Windows.Forms.HelpEventHandler(this.SectorColorPicker_HelpRequested);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false);

View file

@ -163,5 +163,10 @@ namespace CodeImp.DoomBuilder.ColorPicker.Windows
colorPickerControl1.SetCurrentColor(Color.FromArgb((int)selection[0].Fields[currentColorTag].Value));
}
}
private void SectorColorPicker_HelpRequested(object sender, HelpEventArgs hlpevent) {
General.ShowHelp("gz_plug_colorpicker.html");
hlpevent.Handled = true;
}
}
}

View file

@ -137,6 +137,11 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
mode.ShowTargetInfo();
}
//mxd
public override Sector GetControlSector() {
return level.sector;
}
#endregion

View file

@ -62,7 +62,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
public VisualMiddle3D(BaseVisualMode mode, VisualSector vs, Sidedef s) : base(mode, vs, s)
{
//mxd
geoType = VisualGeometryType.WALL_MIDDLE;
geoType = VisualGeometryType.WALL_MIDDLE_3D;
// We have no destructor
GC.SuppressFinalize(this);
@ -318,6 +318,11 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
float oldy = Sidedef.Fields.GetValue("offsety_mid", 0.0f);
return new Point((int)oldx, (int)oldy);
}
//mxd
public override Linedef GetControlLinedef() {
return extrafloor.Linedef;
}
#endregion
}

View file

@ -70,8 +70,11 @@ namespace CodeImp.DoomBuilder.UDMFControls
return;
}
List<VisualGeometry> selectedSurfaces;
if (General.Editing.Mode.GetType().Name == "BaseVisualMode") {
if (((VisualMode)General.Editing.Mode).GetSelectedSurfaces(true).Count == 0) {
selectedSurfaces = ((VisualMode)General.Editing.Mode).GetSelectedSurfaces();
if (selectedSurfaces.Count == 0) {
General.Interface.DisplayStatus(StatusType.Warning, "Select some surfaces first!");
return;
}
@ -89,6 +92,7 @@ namespace CodeImp.DoomBuilder.UDMFControls
}
form.Location = formLocation;
form.FormClosed += new FormClosedEventHandler(form_FormClosed);
form.Setup(selectedSurfaces);
form.ShowDialog(Form.ActiveForm);
}

View file

@ -23,7 +23,7 @@ namespace CodeImp.DoomBuilder.UDMFControls
//events
public event EventHandler OnAngleChanged;
private float angle;
private float angle; //it's actually 359 minus angle, displayed in control
public float Value {
get {
return (float)nudAngle.Value;
@ -94,7 +94,7 @@ namespace CodeImp.DoomBuilder.UDMFControls
private void nudAngle_ValueChanged(object sender, EventArgs e) {
if (!blockEvents) {
prevAngle = angle;
angle = (int)((NumericUpDown)sender).Value;
angle = General.ClampAngle(359 - (int)((NumericUpDown)sender).Value);
update();
}
}

View file

@ -47,11 +47,6 @@
// nudAngle
//
this.nudAngle.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.nudAngle.Increment = new decimal(new int[] {
15,
0,
0,
0});
this.nudAngle.Location = new System.Drawing.Point(45, 102);
this.nudAngle.Maximum = new decimal(new int[] {
9000,

View file

@ -20,7 +20,9 @@ namespace CodeImp.DoomBuilder.UDMFControls
}
set {
blockEvents = true;
numericUpDown1.Value = (decimal)General.Clamp(value, (float)numericUpDown1.Minimum, (float)numericUpDown1.Maximum);
float val = General.Clamp(value, (float)numericUpDown1.Minimum, (float)numericUpDown1.Maximum);
previousValue = (int)(val * 10f);
numericUpDown1.Value = (decimal)val;
blockEvents = false;
}
}
@ -60,8 +62,8 @@ namespace CodeImp.DoomBuilder.UDMFControls
numericUpDown1.Value = (decimal)General.Clamp((float)numericUpDown1.Value, min, max);
if (doubledLimits) {
numericUpDown1.Minimum = (decimal)(min * 2);
numericUpDown1.Maximum = (decimal)(max * 2);
numericUpDown1.Minimum = (decimal)(min * 10);
numericUpDown1.Maximum = (decimal)(max * 10);
} else {
numericUpDown1.Minimum = (decimal)min;
numericUpDown1.Maximum = (decimal)max;

View file

@ -23,7 +23,9 @@ namespace CodeImp.DoomBuilder.UDMFControls
set
{
blockEvents = true;
numericUpDown1.Value = General.Clamp(value, (int)numericUpDown1.Minimum, (int)numericUpDown1.Maximum);
previousValue = General.Clamp(value, (int)numericUpDown1.Minimum, (int)numericUpDown1.Maximum);
numericUpDown1.Value = previousValue;
blockEvents = false;
}
}

View file

@ -11,22 +11,29 @@ namespace CodeImp.DoomBuilder.UDMFControls
{
public partial class ScaleControl : UserControl
{
private bool linkSliders;
private static bool linkSliders;
public event EventHandler OnValueChanged;
public Vector2D Value {
set {
floatSlider1.Value = value.x;
floatSlider2.Value = value.y;
prevValues = value;
delta = new Vector2D();
}
get {
return new Vector2D(floatSlider1.Value, floatSlider2.Value);
}
}
public Vector2D Delta { get { return new Vector2D(floatSlider1.Delta, floatSlider2.Delta); } }
private Vector2D prevValues;
private Vector2D delta;
public Vector2D Delta { get { return delta; } }
public ScaleControl() {
prevValues = new Vector2D();
delta = new Vector2D();
InitializeComponent();
setLinkButtonIcon(linkSliders);
@ -36,7 +43,7 @@ namespace CodeImp.DoomBuilder.UDMFControls
button1.Click += new EventHandler(button1_Click);
}
private void setLinkButtonIcon(bool link){
private void setLinkButtonIcon(bool link) {
button1.BackgroundImage = link ? Properties.Resources.Chain : Properties.Resources.Chain2;
}
@ -45,15 +52,33 @@ namespace CodeImp.DoomBuilder.UDMFControls
floatSlider2.SetLimits(min, max, true);
}
//events
//events
private void floatSlider1_OnValueChanged(object sender, EventArgs e) {
if (linkSliders) floatSlider2.Value = ((FloatSlider)sender).Value;
float val = ((FloatSlider)sender).Value;
if (linkSliders) {
delta.y = (float)Math.Round(val - floatSlider2.Value, 1);
prevValues.y = floatSlider2.Value;
floatSlider2.Value = val;
}
if (OnValueChanged != null) OnValueChanged(this, EventArgs.Empty);
delta.x = (float)Math.Round(val - prevValues.x, 1);
prevValues.x = val;
}
private void floatSlider2_OnValueChanged(object sender, EventArgs e) {
if (linkSliders) floatSlider1.Value = ((FloatSlider)sender).Value;
float val = ((FloatSlider)sender).Value;
if (linkSliders) {
delta.x = (float)Math.Round(val - floatSlider1.Value, 1);
prevValues.x = floatSlider1.Value;
floatSlider1.Value = val;
}
if (OnValueChanged != null) OnValueChanged(this, EventArgs.Empty);
delta.y = (float)Math.Round(val - prevValues.y, 1);
prevValues.y = val;
}
private void button1_Click(object sender, EventArgs e) {

View file

@ -473,8 +473,11 @@
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Name = "UDMFControlsForm";
this.Opacity = 0;
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "UDMF Controls";
this.HelpRequested += new System.Windows.Forms.HelpEventHandler(this.UDMFControlsForm_HelpRequested);
this.gbRotation.ResumeLayout(false);
this.gbPosition.ResumeLayout(false);
this.gbScale.ResumeLayout(false);

View file

@ -16,24 +16,24 @@ using CodeImp.DoomBuilder.Types;
namespace CodeImp.DoomBuilder.UDMFControls
{
public partial class UDMFControlsForm : DelayedForm {
private List<VisualGeometry> floors;
private List<VisualGeometry> ceilings;
private List<SurfaceProperties> floors;
private List<SurfaceProperties> ceilings;
private List<VisualGeometry> wallsTop;
private List<VisualGeometry> wallsMid;
private List<VisualGeometry> wallsBottom;
private List<SurfaceProperties> wallsTop;
private List<SurfaceProperties> wallsMid;
private List<SurfaceProperties> wallsBottom;
private List<List<VisualGeometry>> walls;
private List<List<VisualGeometry>> ceilingsAndFloors;
private List<List<SurfaceProperties>> walls;
private List<List<SurfaceProperties>> ceilingsAndFloors;
private List<VisualSector> updateList; //list of sectors to update
private List<SurfaceProperties> updateList; //list of sectors to update
private CheckBox[] wallFlags;
private CheckBox[] sectorFlags;
private List<string> renderStyles;
private static bool relativeMode;
private static bool relativeMode = true;
public UDMFControlsForm() {
//capture keys
@ -43,16 +43,16 @@ namespace CodeImp.DoomBuilder.UDMFControls
InitializeComponent();
//create collections
floors = new List<VisualGeometry>();
ceilings = new List<VisualGeometry>();
wallsTop = new List<VisualGeometry>();
wallsMid = new List<VisualGeometry>();
wallsBottom = new List<VisualGeometry>();
floors = new List<SurfaceProperties>();
ceilings = new List<SurfaceProperties>();
wallsTop = new List<SurfaceProperties>();
wallsMid = new List<SurfaceProperties>();
wallsBottom = new List<SurfaceProperties>();
walls = new List<List<VisualGeometry>>() { wallsTop, wallsMid, wallsBottom };
ceilingsAndFloors = new List<List<VisualGeometry>>() { ceilings, floors };
updateList = new List<VisualSector>();
walls = new List<List<SurfaceProperties>>() { wallsTop, wallsMid, wallsBottom };
ceilingsAndFloors = new List<List<SurfaceProperties>>() { ceilings, floors };
updateList = new List<SurfaceProperties>();
wallFlags = new CheckBox[] { cbnodecals, cbnofakecontrast, cbclipmidtex, cbsmoothlighting };
sectorFlags = new CheckBox[] { cbsilent, cbnofallingdamage, cbdropactors, cbnorespawn };
@ -63,17 +63,10 @@ namespace CodeImp.DoomBuilder.UDMFControls
KeyUp += new KeyEventHandler(UDMFControlsForm_KeyUp);
cbRelativeMode.Checked = relativeMode;
setup();
}
//we should be in Visual mode and should have some surfaces selected at this point
private void setup() {
VisualMode vm = (VisualMode)General.Editing.Mode;
//should contain something, otherwise we wouldn't be here
List<VisualGeometry> surfaces = vm.GetSelectedSurfaces(false);
public void Setup(List<VisualGeometry> surfaces) {
//create undo
string rest = surfaces.Count + " surface" + (surfaces.Count > 1 ? "s" : "");
General.Map.UndoRedo.CreateUndo("Edit texture properties of " + rest);
@ -83,58 +76,57 @@ namespace CodeImp.DoomBuilder.UDMFControls
List<UniversalFieldInfo> defaultLinedefFields = General.Map.Config.LinedefFields;
List<UniversalFieldInfo> defaultSectorFields = General.Map.Config.SectorFields;
VisualGeometry firstWall = null;
VisualGeometry firstFloor = null; //or ceiling!
SurfaceProperties firstWall = null;
SurfaceProperties firstFloor = null; //or ceiling!
List<int> sectorIndeces = new List<int>();
List<int> wall3DIndeces = new List<int>();
SurfaceProperties sp;
int walls3dCount = 0;
//sort things
foreach (VisualGeometry vg in surfaces) {
if (sectorIndeces.IndexOf(vg.Sector.Sector.FixedIndex) == -1) {
updateList.Add(vg.Sector);
sectorIndeces.Add(vg.Sector.Sector.FixedIndex);
}
sp = new SurfaceProperties(vg);
updateList.Add(sp);
switch (vg.GeometryType) {
case VisualGeometryType.CEILING:
if (firstFloor == null) firstFloor = vg;
ceilings.Add(vg);
vg.Sector.Sector.Fields.BeforeFieldsChange();
setDefaultUniversalProperties(vg.Sector.Sector.Fields, defaultSectorFields);
if (firstFloor == null) firstFloor = sp;
ceilings.Add(sp);
setDefaultUniversalProperties(sp.Sector.Fields, defaultSectorFields);
break;
case VisualGeometryType.FLOOR:
if (firstFloor == null) firstFloor = vg;
floors.Add(vg);
vg.Sector.Sector.Fields.BeforeFieldsChange();
setDefaultUniversalProperties(vg.Sector.Sector.Fields, defaultSectorFields);
if (firstFloor == null) firstFloor = sp;
floors.Add(sp);
setDefaultUniversalProperties(sp.Sector.Fields, defaultSectorFields);
break;
case VisualGeometryType.WALL_BOTTOM:
if (firstWall == null) firstWall = vg;
wallsBottom.Add(vg);
vg.Sidedef.Fields.BeforeFieldsChange();
vg.Sidedef.Line.Fields.BeforeFieldsChange();
setDefaultUniversalProperties(vg.Sidedef.Fields, defaultSidedefFields);
setDefaultUniversalProperties(vg.Sidedef.Line.Fields, defaultLinedefFields);
if (firstWall == null) firstWall = sp;
wallsBottom.Add(sp);
setDefaultUniversalProperties(sp.Sidedef.Fields, defaultSidedefFields);
setDefaultUniversalProperties(sp.Linedef.Fields, defaultLinedefFields);
break;
case VisualGeometryType.WALL_MIDDLE_3D: //all 3D-walls in a sector are linked to the same sidedef of control sector, so if many are selected, we need only one.
walls3dCount++;
if (wall3DIndeces.IndexOf(vg.Sector.Sector.FixedIndex) != -1)
break;
wall3DIndeces.Add(vg.Sector.Sector.FixedIndex);
goto case VisualGeometryType.WALL_MIDDLE;
case VisualGeometryType.WALL_MIDDLE:
if (firstWall == null) firstWall = vg;
wallsMid.Add(vg);
vg.Sidedef.Fields.BeforeFieldsChange();
vg.Sidedef.Line.Fields.BeforeFieldsChange();
setDefaultUniversalProperties(vg.Sidedef.Fields, defaultSidedefFields);
setDefaultUniversalProperties(vg.Sidedef.Line.Fields, defaultLinedefFields);
if (firstWall == null) firstWall = sp;
wallsMid.Add(sp);
setDefaultUniversalProperties(sp.Sidedef.Fields, defaultSidedefFields);
setDefaultUniversalProperties(sp.Linedef.Fields, defaultLinedefFields);
break;
case VisualGeometryType.WALL_UPPER:
if (firstWall == null) firstWall = vg;
wallsTop.Add(vg);
vg.Sidedef.Fields.BeforeFieldsChange();
vg.Sidedef.Line.Fields.BeforeFieldsChange();
setDefaultUniversalProperties(vg.Sidedef.Fields, defaultSidedefFields);
setDefaultUniversalProperties(vg.Sidedef.Line.Fields, defaultLinedefFields);
if (firstWall == null) firstWall = sp;
wallsTop.Add(sp);
setDefaultUniversalProperties(sp.Sidedef.Fields, defaultSidedefFields);
setDefaultUniversalProperties(sp.Linedef.Fields, defaultLinedefFields);
break;
default: //dbg
@ -154,24 +146,24 @@ namespace CodeImp.DoomBuilder.UDMFControls
//set initial values to controls
if (firstFloor != null) {
//get values
float scaleX = (float)firstFloor.Sector.Sector.Fields[KeyNames.GetScaleX(firstFloor.GeometryType)].Value;
float scaleY = (float)firstFloor.Sector.Sector.Fields[KeyNames.GetScaleY(firstFloor.GeometryType)].Value;
float translateX = (float)firstFloor.Sector.Sector.Fields[KeyNames.GetTranslationX(firstFloor.GeometryType)].Value;
float translateY = (float)firstFloor.Sector.Sector.Fields[KeyNames.GetTranslationY(firstFloor.GeometryType)].Value;
float scaleX = (float)firstFloor.Sector.Fields[KeyNames.GetScaleX(firstFloor.GeometryType)].Value;
float scaleY = (float)firstFloor.Sector.Fields[KeyNames.GetScaleY(firstFloor.GeometryType)].Value;
float translateX = (float)firstFloor.Sector.Fields[KeyNames.GetTranslationX(firstFloor.GeometryType)].Value;
float translateY = (float)firstFloor.Sector.Fields[KeyNames.GetTranslationY(firstFloor.GeometryType)].Value;
//set shared and sector flags
cblightabsolute.Checked = (bool)firstFloor.Sector.Sector.Fields[KeyNames.GetLightAbsolute(firstFloor.GeometryType)].Value;
cblightabsolute.Checked = (bool)firstFloor.Sector.Fields[KeyNames.GetLightAbsolute(firstFloor.GeometryType)].Value;
foreach(CheckBox cb in sectorFlags)
cb.Checked = (bool)firstFloor.Sector.Sector.Fields[(string)cb.Tag].Value;
cb.Checked = (bool)firstFloor.Sector.Fields[(string)cb.Tag].Value;
//set values to controls
scaleControl.Value = new Vector2D(scaleX, scaleY);
positionControl1.Value = new Vector2D(translateX, translateY);
angleControl1.Value = (int)((float)firstFloor.Sector.Sector.Fields[KeyNames.GetRotation(firstFloor.GeometryType)].Value);
sliderBrightness.Value = (int)firstFloor.Sector.Sector.Fields[KeyNames.GetLight(firstFloor.GeometryType)].Value;
nudGravity.Value = (decimal)((float)firstFloor.Sector.Sector.Fields[(string)nudGravity.Tag].Value);
sliderDesaturation.Value = (float)firstFloor.Sector.Sector.Fields[(string)sliderDesaturation.Tag].Value;
angleControl1.Value = (int)((float)firstFloor.Sector.Fields[KeyNames.GetRotation(firstFloor.GeometryType)].Value);
sliderBrightness.Value = (int)firstFloor.Sector.Fields[KeyNames.GetLight(firstFloor.GeometryType)].Value;
nudGravity.Value = (decimal)((float)firstFloor.Sector.Fields[(string)nudGravity.Tag].Value);
sliderDesaturation.Value = (float)firstFloor.Sector.Fields[(string)sliderDesaturation.Tag].Value;
} else {//disable floor/ceiling related controls
gbRotation.Enabled = false;
@ -196,9 +188,15 @@ namespace CodeImp.DoomBuilder.UDMFControls
cblightabsolute.Checked = (bool)firstWall.Sidedef.Fields[KeyNames.GetLightAbsolute(firstWall.GeometryType)].Value;
//set linedef values
sliderAlpha.Value = (float)firstWall.Sidedef.Line.Fields[(string)sliderAlpha.Tag].Value;
string renderStyle = (string)firstWall.Sidedef.Line.Fields[(string)cbRenderStyle.Tag].Value;
sliderAlpha.Value = (float)firstWall.Linedef.Fields[(string)sliderAlpha.Tag].Value;
string renderStyle = (string)firstWall.Linedef.Fields[(string)cbRenderStyle.Tag].Value;
cbRenderStyle.SelectedIndex = renderStyles.IndexOf(renderStyle);
//if we got only 3d-walls selected, disable controls, which don't affect those
if (walls3dCount == wallsMid.Count && wallsTop.Count == 0 && wallsBottom.Count == 0) {
gbAlpha.Enabled = false;
bgBrightness.Enabled = false;
}
}
//set wall flags
@ -240,24 +238,24 @@ namespace CodeImp.DoomBuilder.UDMFControls
List<UniversalFieldInfo> defaultSectorFields = General.Map.Config.SectorFields;
//...from floors/ceilings...
foreach (List<VisualGeometry> list in ceilingsAndFloors) {
foreach (VisualGeometry floor in list)
removeDefaultUniversalProperties(floor.Sector.Sector.Fields, defaultSectorFields);
foreach (List<SurfaceProperties> list in ceilingsAndFloors) {
foreach (SurfaceProperties floor in list)
removeDefaultUniversalProperties(floor.Sector.Fields, defaultSectorFields);
}
//...and walls
foreach (List<VisualGeometry> list in walls) {
foreach (VisualGeometry wall in list) {
foreach (List<SurfaceProperties> list in walls) {
foreach (SurfaceProperties wall in list) {
removeDefaultUniversalProperties(wall.Sidedef.Fields, defaultSidedefFields);
removeDefaultUniversalProperties(wall.Sidedef.Line.Fields, defaultLinedefFields);
removeDefaultUniversalProperties(wall.Linedef.Fields, defaultLinedefFields);
}
}
}
//update view
private void update() {
foreach (VisualSector vs in updateList)
vs.UpdateSectorData();
foreach (SurfaceProperties sp in updateList)
sp.Update();
}
//shared props
@ -273,9 +271,9 @@ namespace CodeImp.DoomBuilder.UDMFControls
//linedef props
private void setLinedefProperty(string propName, object value) {
foreach (List<VisualGeometry> list in walls) {
foreach (VisualGeometry vg in list)
vg.Sidedef.Line.Fields[propName].Value = value;
foreach (List<SurfaceProperties> list in walls) {
foreach (SurfaceProperties vg in list)
vg.Linedef.Fields[propName].Value = value;
}
}
@ -288,8 +286,8 @@ namespace CodeImp.DoomBuilder.UDMFControls
}
//apply value
foreach (List<VisualGeometry> list in walls) {
foreach (VisualGeometry vg in list)
foreach (List<SurfaceProperties> list in walls) {
foreach (SurfaceProperties vg in list)
vg.Sidedef.Fields[propName].Value = value;
}
}
@ -311,12 +309,12 @@ namespace CodeImp.DoomBuilder.UDMFControls
props[i] = propName + props[i];
int index = 0;
//apply values
if (relativeMode) {
float val;
foreach (List<VisualGeometry> list in walls) { //top -> middle -> bottom
foreach (VisualGeometry vg in list) {
foreach (List<SurfaceProperties> list in walls) { //top -> middle -> bottom
foreach (SurfaceProperties vg in list) {
val = (float)vg.Sidedef.Fields[props[index]].Value + value.x;
vg.Sidedef.Fields[props[index]].Value = val;
@ -326,8 +324,8 @@ namespace CodeImp.DoomBuilder.UDMFControls
index += 2;
}
} else {
foreach (List<VisualGeometry> list in walls) { //top -> middle -> bottom
foreach (VisualGeometry vg in list) {
foreach (List<SurfaceProperties> list in walls) { //top -> middle -> bottom
foreach (SurfaceProperties vg in list) {
vg.Sidedef.Fields[props[index]].Value = value.x;
vg.Sidedef.Fields[props[index + 1]].Value = value.y;
}
@ -360,28 +358,28 @@ namespace CodeImp.DoomBuilder.UDMFControls
if (propName == "rotation" && relativeMode) {
float val;
foreach (VisualGeometry vg in floors) {
val = (float)vg.Sector.Sector.Fields[propFloor].Value + (float)value;
vg.Sector.Sector.Fields[propFloor].Value = (object)val;
foreach (SurfaceProperties vg in floors) {
val = (float)vg.Sector.Fields[propFloor].Value + (float)value;
vg.Sector.Fields[propFloor].Value = (object)val;
}
foreach (VisualGeometry vg in ceilings) {
val = (float)vg.Sector.Sector.Fields[propCeiling].Value + (float)value;
vg.Sector.Sector.Fields[propCeiling].Value = (object)val;
foreach (SurfaceProperties vg in ceilings) {
val = (float)vg.Sector.Fields[propCeiling].Value + (float)value;
vg.Sector.Fields[propCeiling].Value = (object)val;
}
} else {
foreach (VisualGeometry vg in floors)
vg.Sector.Sector.Fields[propFloor].Value = value;
foreach (SurfaceProperties vg in floors)
vg.Sector.Fields[propFloor].Value = value;
foreach (VisualGeometry vg in ceilings)
vg.Sector.Sector.Fields[propCeiling].Value = value;
foreach (SurfaceProperties vg in ceilings)
vg.Sector.Fields[propCeiling].Value = value;
}
return;
}
foreach (List<VisualGeometry> list in ceilingsAndFloors) {
foreach (VisualGeometry vg in list)
vg.Sector.Sector.Fields[propName].Value = value;
//apply values
foreach (List<SurfaceProperties> list in ceilingsAndFloors) {
foreach (SurfaceProperties vg in list)
vg.Sector.Fields[propName].Value = value;
}
}
@ -404,26 +402,26 @@ namespace CodeImp.DoomBuilder.UDMFControls
floorNameY = "ypanningfloor";
}
props = new string[] { ceilingNameX, ceilingNameY, floorNameX, floorNameY };
int index = 0;
//apply values
if (relativeMode) {
float val;
foreach (List<VisualGeometry> list in ceilingsAndFloors) { //ceilings -> floors
foreach (VisualGeometry vg in list) {
val = (float)vg.Sector.Sector.Fields[props[index]].Value + value.x;
vg.Sector.Sector.Fields[props[index]].Value = (object)val;
foreach (List<SurfaceProperties> list in ceilingsAndFloors) { //ceilings -> floors
foreach (SurfaceProperties vg in list) {
val = (float)vg.Sector.Fields[props[index]].Value + value.x;
vg.Sector.Fields[props[index]].Value = (object)val;
val = (float)vg.Sector.Sector.Fields[props[index + 1]].Value + value.y;
vg.Sector.Sector.Fields[props[index + 1]].Value = (object)val;
val = (float)vg.Sector.Fields[props[index + 1]].Value + value.y;
vg.Sector.Fields[props[index + 1]].Value = (object)val;
}
index += 2;
}
} else {
foreach (List<VisualGeometry> list in ceilingsAndFloors) { //ceilings -> floors
foreach (VisualGeometry vg in list) {
vg.Sector.Sector.Fields[props[index]].Value = value.x;
vg.Sector.Sector.Fields[props[index + 1]].Value = value.y;
foreach (List<SurfaceProperties> list in ceilingsAndFloors) { //ceilings -> floors
foreach (SurfaceProperties vg in list) {
vg.Sector.Fields[props[index]].Value = value.x;
vg.Sector.Fields[props[index + 1]].Value = value.y;
}
index += 2;
}
@ -447,9 +445,11 @@ namespace CodeImp.DoomBuilder.UDMFControls
setSectorProperty((string)cb.Tag, (object)cb.Checked);
//update sectors
foreach (VisualSector vs in updateList) {
vs.Sector.UpdateNeeded = true;
vs.Sector.UpdateCache();
foreach (SurfaceProperties vs in updateList) {
if (vs.Sector != null) {
vs.Sector.UpdateNeeded = true;
vs.Sector.UpdateCache();
}
}
removeDefaultValues();
@ -536,9 +536,46 @@ namespace CodeImp.DoomBuilder.UDMFControls
private void cbRelativeMode_CheckedChanged(object sender, EventArgs e) {
relativeMode = cbRelativeMode.Checked;
}
private void UDMFControlsForm_HelpRequested(object sender, HelpEventArgs hlpevent) {
General.ShowHelp("gz_plug_udmfcontrols.html");
hlpevent.Handled = true;
}
}
public class KeyNames {
internal class SurfaceProperties {
private Sector sector;
public Sector Sector { get { return sector; } }
private Sidedef sidedef;
public Sidedef Sidedef { get { return sidedef; } }
private Linedef linedef;
public Linedef Linedef { get { return linedef; } }
public VisualGeometryType GeometryType { get { return vg.GeometryType; } }
private VisualGeometry vg;
public SurfaceProperties(VisualGeometry visualGeometry) {
vg = visualGeometry;
if (vg.GeometryType == VisualGeometryType.CEILING || vg.GeometryType == VisualGeometryType.FLOOR) {
sector = vg.GetControlSector();
sector.Fields.BeforeFieldsChange();
} else {
linedef = vg.GetControlLinedef();
sidedef = linedef.Front;
linedef.Fields.BeforeFieldsChange();
sidedef.Fields.BeforeFieldsChange();
}
}
public void Update() {
vg.Sector.UpdateSectorData();
}
}
internal class KeyNames {
//SCALE
public static string GetScaleX(VisualGeometryType type) {
return getScale(type).Replace("$", "x");
@ -562,6 +599,7 @@ namespace CodeImp.DoomBuilder.UDMFControls
return "scale$_top";
break;
case VisualGeometryType.WALL_MIDDLE_3D:
case VisualGeometryType.WALL_MIDDLE:
return "scale$_mid";
break;
@ -596,6 +634,7 @@ namespace CodeImp.DoomBuilder.UDMFControls
return "offset$_top";
break;
case VisualGeometryType.WALL_MIDDLE_3D:
case VisualGeometryType.WALL_MIDDLE:
return "offset$_mid";
break;
@ -634,6 +673,7 @@ namespace CodeImp.DoomBuilder.UDMFControls
case VisualGeometryType.WALL_BOTTOM:
case VisualGeometryType.WALL_MIDDLE:
case VisualGeometryType.WALL_MIDDLE_3D:
case VisualGeometryType.WALL_UPPER:
return "light";
break;
@ -653,6 +693,7 @@ namespace CodeImp.DoomBuilder.UDMFControls
case VisualGeometryType.WALL_BOTTOM:
case VisualGeometryType.WALL_MIDDLE:
case VisualGeometryType.WALL_MIDDLE_3D:
case VisualGeometryType.WALL_UPPER:
return "lightabsolute";
break;