GZDoom Builder 1.07d:

Added "Test Map from current position" action (default shortcut is Ctrl-F9), which lets you play the game from cursor position, if you are in 2D-Mode, and from camera location if you are in Visual Mode.
Added "Sync camera position between 2D and 3D modes" (found in Preferences -> Interface -> Options), which automatically centers 2D-mode on camera position when you leave Visual Mode, and places camera at cursor position when you toggle from 2D-mode to Visual Mode (unless you have Visual Mode camera thing in your map).
Several improvements in Draw Rectangle and Draw Ellipse modes: added info label with current bevel amount and subdivision level; bevel amount now applied properly when shape size is smaller than it.
This commit is contained in:
MaxED 2012-06-07 01:06:37 +00:00
parent 761b44ca3e
commit b1df216a29
19 changed files with 427 additions and 126 deletions

View file

@ -5,13 +5,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Builder", "Builder.csproj",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuilderModes", "..\Plugins\BuilderModes\BuilderModes.csproj", "{B42D5AA0-F9A6-4234-9C4B-A05B11A64851}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StairSectorBuilder", "..\Plugins\StairSectorBuilder\StairSectorBuilder.csproj", "{3F365121-906B-409D-BB1E-37E0A78056C2}"
ProjectSection(ProjectDependencies) = postProject
{818B3D10-F791-4C3F-9AF5-BB2D0079B63C} = {818B3D10-F791-4C3F-9AF5-BB2D0079B63C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GZDoomEditing", "..\Plugins\GZDoomEditing\GZDoomEditing.csproj", "{760A9BC7-CB73-4C36-858B-994C14996FCD}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -42,26 +35,6 @@ Global
{B42D5AA0-F9A6-4234-9C4B-A05B11A64851}.Release|Mixed Platforms.Build.0 = Release|x86
{B42D5AA0-F9A6-4234-9C4B-A05B11A64851}.Release|x86.ActiveCfg = Release|x86
{B42D5AA0-F9A6-4234-9C4B-A05B11A64851}.Release|x86.Build.0 = Release|x86
{3F365121-906B-409D-BB1E-37E0A78056C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3F365121-906B-409D-BB1E-37E0A78056C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3F365121-906B-409D-BB1E-37E0A78056C2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{3F365121-906B-409D-BB1E-37E0A78056C2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{3F365121-906B-409D-BB1E-37E0A78056C2}.Debug|x86.ActiveCfg = Debug|Any CPU
{3F365121-906B-409D-BB1E-37E0A78056C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3F365121-906B-409D-BB1E-37E0A78056C2}.Release|Any CPU.Build.0 = Release|Any CPU
{3F365121-906B-409D-BB1E-37E0A78056C2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{3F365121-906B-409D-BB1E-37E0A78056C2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{3F365121-906B-409D-BB1E-37E0A78056C2}.Release|x86.ActiveCfg = Release|Any CPU
{760A9BC7-CB73-4C36-858B-994C14996FCD}.Debug|Any CPU.ActiveCfg = Debug|x86
{760A9BC7-CB73-4C36-858B-994C14996FCD}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{760A9BC7-CB73-4C36-858B-994C14996FCD}.Debug|Mixed Platforms.Build.0 = Debug|x86
{760A9BC7-CB73-4C36-858B-994C14996FCD}.Debug|x86.ActiveCfg = Debug|x86
{760A9BC7-CB73-4C36-858B-994C14996FCD}.Debug|x86.Build.0 = Debug|x86
{760A9BC7-CB73-4C36-858B-994C14996FCD}.Release|Any CPU.ActiveCfg = Release|x86
{760A9BC7-CB73-4C36-858B-994C14996FCD}.Release|Mixed Platforms.ActiveCfg = Release|x86
{760A9BC7-CB73-4C36-858B-994C14996FCD}.Release|Mixed Platforms.Build.0 = Release|x86
{760A9BC7-CB73-4C36-858B-994C14996FCD}.Release|x86.ActiveCfg = Release|x86
{760A9BC7-CB73-4C36-858B-994C14996FCD}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View file

@ -102,9 +102,11 @@ namespace CodeImp.DoomBuilder.Config
private bool gzAnimateLights;
private bool gzDrawFog;
private bool gzToolbarGZDoom;
private bool gzSynchCameras;
private int gzMaxDynamicLights;
private float gzDynamicLightRadius;
private float gzDynamicLightIntensity;
private bool gzTestFromCurrentPosition;
// These are not stored in the configuration, only used at runtime
private string defaulttexture;
@ -176,6 +178,8 @@ namespace CodeImp.DoomBuilder.Config
public bool GZAnimateLights { get { return gzAnimateLights; } internal set { gzAnimateLights = value; } }
public bool GZDrawFog { get { return gzDrawFog; } internal set { gzDrawFog = value; } }
public bool GZToolbarGZDoom { get { return gzToolbarGZDoom; } internal set { gzToolbarGZDoom = value; } }
public bool GZSynchCameras { get { return gzSynchCameras; } internal set { gzSynchCameras = value; } }
public bool GZTestFromCurrentPosition { get { return gzTestFromCurrentPosition; } internal set { gzTestFromCurrentPosition = value; } }
public int GZMaxDynamicLights { get { return gzMaxDynamicLights; } internal set { gzMaxDynamicLights = value; } }
public float GZDynamicLightRadius { get { return gzDynamicLightRadius; } internal set { gzDynamicLightRadius = value; } }
public float GZDynamicLightIntensity { get { return gzDynamicLightIntensity; } internal set { gzDynamicLightIntensity = value; } }
@ -267,6 +271,7 @@ namespace CodeImp.DoomBuilder.Config
gzAnimateLights = cfg.ReadSetting("gzanimatelights", false);
gzDrawFog = cfg.ReadSetting("gzdrawfog", false);
gzToolbarGZDoom = cfg.ReadSetting("gztoolbargzdoom", true);
gzSynchCameras = cfg.ReadSetting("gzsynchcameras", true);
gzMaxDynamicLights = cfg.ReadSetting("gzmaxdynamiclights", 16);
gzDynamicLightRadius = cfg.ReadSetting("gzdynamiclightradius", 1.0f);
gzDynamicLightIntensity = cfg.ReadSetting("gzdynamiclightintensity", 1.0f);
@ -339,6 +344,8 @@ namespace CodeImp.DoomBuilder.Config
cfg.WriteSetting("gzdrawlights", gzDrawLights);
cfg.WriteSetting("gzanimatelights", gzAnimateLights);
cfg.WriteSetting("gzdrawfog", gzDrawFog);
cfg.WriteSetting("gzsynchcameras", gzSynchCameras);
cfg.WriteSetting("gztoolbargzdoom", gzToolbarGZDoom);
cfg.WriteSetting("gzmaxdynamiclights", gzMaxDynamicLights);
cfg.WriteSetting("gzdynamiclightradius", gzDynamicLightRadius);
cfg.WriteSetting("gzdynamiclightintensity", gzDynamicLightIntensity);

View file

@ -30,6 +30,7 @@ using CodeImp.DoomBuilder.Map;
using CodeImp.DoomBuilder.Rendering;
using CodeImp.DoomBuilder.Actions;
using CodeImp.DoomBuilder.Geometry;
using CodeImp.DoomBuilder.VisualModes;
using System.Drawing;
#endregion
@ -80,6 +81,10 @@ namespace CodeImp.DoomBuilder.Editing
protected bool panning;
private bool autopanenabled;
//mxd. used in "Play From Here" Action
private Thing playerStart;
private Vector3D playerStartPosition;
#endregion
#region ================== Properties
@ -131,6 +136,11 @@ namespace CodeImp.DoomBuilder.Editing
mousebuttons = oldmode.mousebuttons;
mouseinside = oldmode.mouseinside;
mousedragging = oldmode.mousedragging;
} else if (General.Settings.GZSynchCameras && General.Editing.Mode is VisualMode) { //mxd
//center 2d view on camera position in 3d view
Vector2D campos = new Vector2D(General.Map.VisualCamera.Position.x, General.Map.VisualCamera.Position.y);
renderer2d.PositionView(campos.x, campos.y);
}
}
@ -601,6 +611,63 @@ namespace CodeImp.DoomBuilder.Editing
base.OnCancel();
}
//mxd
public override bool OnMapTestBegin() {
if (General.Settings.GZTestFromCurrentPosition) {
if(!mouseinside){
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: mouse is outside editing vindow!");
return false;
}
//find Single Player Start. Should have Type 1 in all games
Thing start = null;
foreach (Thing t in General.Map.Map.Things) {
if (t.Type == 1) {
//store thing and position
start = t;
break;
}
}
if (start == null) {
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: no Player 1 start found!");
return false;
}
//now check if cursor is located inside a sector
Sector s = General.Map.Map.GetSectorByCoordinates(mousemappos);
if(s == null){
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: cursor is not inside sector!");
return false;
}
//41 = player's height in Doom. Is that so in all other games as well?
if (s.CeilHeight - s.FloorHeight < 41) {
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: sector is too low!");
return false;
}
//store initial position
playerStart = start;
playerStartPosition = start.Position;
//everything should be valid, let's move player start here
start.Move(new Vector3D(mousemappos.x, mousemappos.y, s.FloorHeight));
}
return true;
}
public override void OnMapTestEnd() {
if (General.Settings.GZTestFromCurrentPosition) {
//restore position
playerStart.Move(playerStartPosition);
playerStart = null;
}
}
/// <summary>
/// This is called automatically when the Edit button is pressed.
/// (in Doom Builder 1, this was always the right mousebutton)

View file

@ -216,6 +216,10 @@ namespace CodeImp.DoomBuilder.Editing
public virtual void OnMapSetChangeBegin() { }
public virtual void OnMapSetChangeEnd() { }
//mxd. map testing events
public virtual bool OnMapTestBegin() { return true; } //called before test map is launched. Returns false if map launch is impossible
public virtual void OnMapTestEnd() { } //called after game engine is closed
#endregion
}
}

View file

@ -231,7 +231,39 @@ namespace CodeImp.DoomBuilder
[BeginAction("testmap")]
public void Test()
{
General.Settings.GZTestFromCurrentPosition = false; //mxd
bool canTest = true; //mxd
canTest = General.Editing.Mode.OnMapTestBegin(); //mxd
if (!canTest) return; //mxd
//mxd. will that be EVER needed by someone other than me?..
//canTest = General.Plugins.OnMapTestBegin(); //mxd
//if (!canTest) return; //mxd
TestAtSkill(General.Map.ConfigSettings.TestSkill);
General.Editing.Mode.OnMapTestEnd(); //mxd
//General.Plugins.OnMapTestEnd(); //mxd
}
//mxd
[BeginAction("testmapfromview")]
public void TestFromView() {
General.Settings.GZTestFromCurrentPosition = true;
bool canTest = true;
canTest = General.Editing.Mode.OnMapTestBegin();
if (!canTest) return;
//canTest = General.Plugins.OnMapTestBegin();
//if (!canTest) return;
TestAtSkill(General.Map.ConfigSettings.TestSkill);
General.Editing.Mode.OnMapTestEnd();
//General.Plugins.OnMapTestEnd();
General.MainWindow.RedrawDisplay();
}
// This saves the map to a temporary file and launches a test wit hthe given skill

View file

@ -2733,6 +2733,26 @@ namespace CodeImp.DoomBuilder.Map
return new List<Linedef>(lines.Values);
}
//mxd
/// <summary>This returns a sector if given coordinates lie inide one.</summary>
public Sector GetSectorByCoordinates(Vector2D pos) {
Linedef nl;
Sector sector = null;
nl = NearestLinedef(pos);
if (nl != null) {
// Check what side of line we are at
if (nl.SideOfLine(pos) < 0f) {
// Front side
if (nl.Front != null) sector = nl.Front.Sector; else sector = null;
} else {
// Back side
if (nl.Back != null) sector = nl.Back.Sector; else sector = null;
}
}
return sector;
}
/// <summary>This finds the line closest to the specified position.</summary>
public Linedef NearestLinedef(Vector2D pos) { return MapSet.NearestLinedef(linedefs, pos); }

View file

@ -214,7 +214,10 @@ namespace CodeImp.DoomBuilder.Map
// This determines which sector the thing is in and links it
public void DetermineSector()
{
Linedef nl;
//mxd
sector = map.GetSectorByCoordinates(pos);
/*Linedef nl;
// Find the nearest linedef on the map
nl = map.NearestLinedef(pos);
@ -235,7 +238,7 @@ namespace CodeImp.DoomBuilder.Map
else
{
sector = null;
}
}*/
}
// This determines which sector the thing is in and links it

View file

@ -184,6 +184,18 @@ namespace CodeImp.DoomBuilder.Plugins
/// </summary>
public virtual void OnMapSaveEnd(SavePurpose purpose) { }
//mxd
/// <summary>
/// Occurs before test map is launched. Return false if map launch is not desired.
/// </summary>
public virtual bool OnMapTestBegin() { return true; }
//mxd
/// <summary>
/// Occurs after game engine is closed.
/// </summary>
public virtual void OnMapTestEnd() { }
/// <summary>
/// Occurs before the MapSet is changed. This means that the active MapSet will be disposed and changed to a new one.
/// </summary>

View file

@ -302,6 +302,17 @@ namespace CodeImp.DoomBuilder.Plugins
public void OnEditRedrawDisplayEnd() { foreach(Plugin p in plugins) p.Plug.OnEditRedrawDisplayEnd(); }
public void OnPresentDisplayBegin() { foreach(Plugin p in plugins) p.Plug.OnPresentDisplayBegin(); }
//mxd. test map events
public bool OnMapTestBegin() {
bool canLaunch;
foreach (Plugin p in plugins) {
canLaunch = p.Plug.OnMapTestBegin();
if (!canLaunch) return false;
}
return true;
}
public void OnMapTestEnd() { foreach (Plugin p in plugins) p.Plug.OnMapTestEnd(); }
#endregion
}
}

View file

@ -150,6 +150,8 @@ namespace CodeImp.DoomBuilder.Rendering
public int VertexSize { get { return vertexsize; } }
public ViewMode ViewMode { get { return viewmode; } }
public SurfaceManager Surfaces { get { return surfaces; } }
//mxd
public RectangleF Viewport { get { return viewport; } }
#endregion

View file

@ -454,6 +454,18 @@ testmap
allowscroll = false;
}
//mxd
testmapfromview
{
title = "Test Map from current position";
category = "tools";
description = "Starts the game and loads this map for playing. Player start is placed either at cursor position (in 2D-Modes) or at camera position (in Visual Modes).";
allowkeys = true;
allowmouse = false;
allowscroll = false;
default = 131192;
}
thingsfilterssetup
{
title = "Configure Things Filters";

View file

@ -73,6 +73,10 @@ namespace CodeImp.DoomBuilder.VisualModes
//mxd
private List<VisualThing> selectedVisualThings;
private List<VisualSector> selectedVisualSectors;
//used in "Play From Here" Action
private Thing playerStart;
private Vector3D playerStartPosition;
private float playerStartAngle;
// Map
protected VisualBlockMap blockmap;
@ -115,6 +119,34 @@ namespace CodeImp.DoomBuilder.VisualModes
this.visiblethings = new List<VisualThing>(100);
this.processgeometry = true;
this.processthings = true;
//mxd. Synch camera position to cursor position or center of the screen in 2d-mode
if (General.Settings.GZSynchCameras && General.Editing.Mode is ClassicMode) {
ClassicMode oldmode = General.Editing.Mode as ClassicMode;
Vector2D pos2d;
if (oldmode.IsMouseInside)
pos2d = new Vector2D(oldmode.MouseMapPos.x, oldmode.MouseMapPos.y);
else
pos2d = new Vector2D(General.Map.CRenderer2D.Viewport.Left + General.Map.CRenderer2D.Viewport.Width / 2.0f, General.Map.CRenderer2D.Viewport.Top + General.Map.CRenderer2D.Viewport.Height / 2.0f);
//if position is inside sector - adjust camera.z accordingly
Sector sector = General.Map.Map.GetSectorByCoordinates(pos2d);
float posz = 0;
if (sector != null) {
int sectorHeight = sector.CeilHeight - sector.FloorHeight;
if (sectorHeight < 41) {
posz = sector.FloorHeight + sectorHeight / 2;
} else {
posz = sector.FloorHeight + 41; // same as in doom
}
}else{
posz = General.Map.VisualCamera.Position.z;
}
General.Map.VisualCamera.Position = new Vector3D(pos2d.x, pos2d.y, posz);
}
}
// Disposer
@ -227,6 +259,62 @@ namespace CodeImp.DoomBuilder.VisualModes
ResourcesReloaded();
}
//mxd
public override bool OnMapTestBegin() {
if (General.Settings.GZTestFromCurrentPosition) {
//find Single Player Start. Should have Type 1 in all games
Thing start = null;
foreach (Thing t in General.Map.Map.Things) {
if (t.Type == 1) {
//store thing and position
start = t;
break;
}
}
if (start == null) {
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: no Player 1 start found!");
return false;
}
//now check if camera is located inside a sector
Vector3D camPos = General.Map.VisualCamera.Position;
Sector s = General.Map.Map.GetSectorByCoordinates(new Vector2D(camPos.x, camPos.y));
if (s == null) {
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: cursor is not inside sector!");
return false;
}
//41 = player's height in Doom. Is that so in all other games as well?
if (s.CeilHeight - s.FloorHeight < 41) {
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: sector is too low!");
return false;
}
//store initial position
playerStart = start;
playerStartPosition = start.Position;
playerStartAngle = start.Angle;
//everything should be valid, let's move player start here
start.Move(new Vector3D(camPos.x, camPos.y, s.FloorHeight));
start.Rotate(General.Map.VisualCamera.AngleXY - (float)Math.PI);
}
return true;
}
//mxd
public override void OnMapTestEnd() {
if (General.Settings.GZTestFromCurrentPosition) {
//restore position
playerStart.Move(playerStartPosition);
playerStart.Rotate(playerStartAngle);
playerStart = null;
}
}
#endregion
#region ================== Input

View file

@ -115,6 +115,8 @@ namespace CodeImp.DoomBuilder.Windows
this.actiondescription = new System.Windows.Forms.Label();
this.tabcolors = new System.Windows.Forms.TabPage();
this.appearancegroup1 = new System.Windows.Forms.GroupBox();
this.labelDynLightIntensity = new System.Windows.Forms.Label();
this.tbDynLightIntensity = new Dotnetrix.Controls.TrackBar();
this.labelDynLightSize = new System.Windows.Forms.Label();
this.tbDynLightSize = new Dotnetrix.Controls.TrackBar();
this.labelDynLightCount = new System.Windows.Forms.Label();
@ -146,8 +148,7 @@ namespace CodeImp.DoomBuilder.Windows
this.tabpasting = new System.Windows.Forms.TabPage();
this.label16 = new System.Windows.Forms.Label();
this.pasteoptions = new CodeImp.DoomBuilder.Controls.PasteOptionsControl();
this.labelDynLightIntensity = new System.Windows.Forms.Label();
this.tbDynLightIntensity = new Dotnetrix.Controls.TrackBar();
this.cbSynchCameras = new System.Windows.Forms.CheckBox();
label7 = new System.Windows.Forms.Label();
label6 = new System.Windows.Forms.Label();
label5 = new System.Windows.Forms.Label();
@ -175,13 +176,13 @@ namespace CodeImp.DoomBuilder.Windows
this.actioncontrolpanel.SuspendLayout();
this.tabcolors.SuspendLayout();
this.appearancegroup1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.tbDynLightIntensity)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.tbDynLightSize)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.tbDynLightCount)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.imagebrightness)).BeginInit();
this.colorsgroup3.SuspendLayout();
this.panel1.SuspendLayout();
this.tabpasting.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.tbDynLightIntensity)).BeginInit();
this.SuspendLayout();
//
// label7
@ -213,6 +214,7 @@ namespace CodeImp.DoomBuilder.Windows
//
// groupBox1
//
groupBox1.Controls.Add(this.cbSynchCameras);
groupBox1.Controls.Add(this.showtexturesizes);
groupBox1.Controls.Add(this.scriptontop);
groupBox1.Controls.Add(this.zoomfactor);
@ -236,7 +238,7 @@ namespace CodeImp.DoomBuilder.Windows
// showtexturesizes
//
this.showtexturesizes.AutoSize = true;
this.showtexturesizes.Location = new System.Drawing.Point(32, 276);
this.showtexturesizes.Location = new System.Drawing.Point(32, 258);
this.showtexturesizes.Name = "showtexturesizes";
this.showtexturesizes.Size = new System.Drawing.Size(222, 18);
this.showtexturesizes.TabIndex = 41;
@ -246,7 +248,7 @@ namespace CodeImp.DoomBuilder.Windows
// scriptontop
//
this.scriptontop.AutoSize = true;
this.scriptontop.Location = new System.Drawing.Point(32, 248);
this.scriptontop.Location = new System.Drawing.Point(32, 234);
this.scriptontop.Name = "scriptontop";
this.scriptontop.Size = new System.Drawing.Size(237, 18);
this.scriptontop.TabIndex = 40;
@ -256,7 +258,7 @@ namespace CodeImp.DoomBuilder.Windows
// zoomfactor
//
this.zoomfactor.LargeChange = 1;
this.zoomfactor.Location = new System.Drawing.Point(127, 187);
this.zoomfactor.Location = new System.Drawing.Point(127, 181);
this.zoomfactor.Minimum = 1;
this.zoomfactor.Name = "zoomfactor";
this.zoomfactor.Size = new System.Drawing.Size(116, 45);
@ -268,7 +270,7 @@ namespace CodeImp.DoomBuilder.Windows
// zoomfactorlabel
//
this.zoomfactorlabel.AutoSize = true;
this.zoomfactorlabel.Location = new System.Drawing.Point(249, 199);
this.zoomfactorlabel.Location = new System.Drawing.Point(249, 193);
this.zoomfactorlabel.Name = "zoomfactorlabel";
this.zoomfactorlabel.Size = new System.Drawing.Size(29, 14);
this.zoomfactorlabel.TabIndex = 39;
@ -277,7 +279,7 @@ namespace CodeImp.DoomBuilder.Windows
// label19
//
this.label19.AutoSize = true;
this.label19.Location = new System.Drawing.Point(52, 199);
this.label19.Location = new System.Drawing.Point(52, 193);
this.label19.Name = "label19";
this.label19.Size = new System.Drawing.Size(69, 14);
this.label19.TabIndex = 38;
@ -286,7 +288,7 @@ namespace CodeImp.DoomBuilder.Windows
// autoscrollspeed
//
this.autoscrollspeed.LargeChange = 1;
this.autoscrollspeed.Location = new System.Drawing.Point(127, 135);
this.autoscrollspeed.Location = new System.Drawing.Point(127, 129);
this.autoscrollspeed.Maximum = 5;
this.autoscrollspeed.Name = "autoscrollspeed";
this.autoscrollspeed.Size = new System.Drawing.Size(116, 45);
@ -297,7 +299,7 @@ namespace CodeImp.DoomBuilder.Windows
// autoscrollspeedlabel
//
this.autoscrollspeedlabel.AutoSize = true;
this.autoscrollspeedlabel.Location = new System.Drawing.Point(249, 147);
this.autoscrollspeedlabel.Location = new System.Drawing.Point(249, 141);
this.autoscrollspeedlabel.Name = "autoscrollspeedlabel";
this.autoscrollspeedlabel.Size = new System.Drawing.Size(23, 14);
this.autoscrollspeedlabel.TabIndex = 36;
@ -306,7 +308,7 @@ namespace CodeImp.DoomBuilder.Windows
// label15
//
this.label15.AutoSize = true;
this.label15.Location = new System.Drawing.Point(29, 147);
this.label15.Location = new System.Drawing.Point(29, 141);
this.label15.Name = "label15";
this.label15.Size = new System.Drawing.Size(92, 14);
this.label15.TabIndex = 35;
@ -315,7 +317,7 @@ namespace CodeImp.DoomBuilder.Windows
// previewsize
//
this.previewsize.LargeChange = 1;
this.previewsize.Location = new System.Drawing.Point(127, 81);
this.previewsize.Location = new System.Drawing.Point(127, 75);
this.previewsize.Maximum = 5;
this.previewsize.Name = "previewsize";
this.previewsize.Size = new System.Drawing.Size(116, 45);
@ -327,7 +329,7 @@ namespace CodeImp.DoomBuilder.Windows
// previewsizelabel
//
this.previewsizelabel.AutoSize = true;
this.previewsizelabel.Location = new System.Drawing.Point(249, 93);
this.previewsizelabel.Location = new System.Drawing.Point(249, 87);
this.previewsizelabel.Name = "previewsizelabel";
this.previewsizelabel.Size = new System.Drawing.Size(55, 14);
this.previewsizelabel.TabIndex = 33;
@ -336,7 +338,7 @@ namespace CodeImp.DoomBuilder.Windows
// label12
//
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(17, 93);
this.label12.Location = new System.Drawing.Point(17, 87);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(104, 14);
this.label12.TabIndex = 32;
@ -345,7 +347,7 @@ namespace CodeImp.DoomBuilder.Windows
// label14
//
this.label14.AutoSize = true;
this.label14.Location = new System.Drawing.Point(50, 41);
this.label14.Location = new System.Drawing.Point(50, 35);
this.label14.Name = "label14";
this.label14.Size = new System.Drawing.Size(71, 14);
this.label14.TabIndex = 14;
@ -360,7 +362,7 @@ namespace CodeImp.DoomBuilder.Windows
"Brightness Levels",
"Floor Textures",
"Ceiling Textures"});
this.defaultviewmode.Location = new System.Drawing.Point(135, 38);
this.defaultviewmode.Location = new System.Drawing.Point(135, 32);
this.defaultviewmode.Name = "defaultviewmode";
this.defaultviewmode.Size = new System.Drawing.Size(145, 22);
this.defaultviewmode.TabIndex = 0;
@ -395,6 +397,16 @@ namespace CodeImp.DoomBuilder.Windows
label20.Text = "Dynamic light size:";
label20.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
// label21
//
label21.AutoSize = true;
label21.Location = new System.Drawing.Point(55, 174);
label21.Name = "label21";
label21.Size = new System.Drawing.Size(116, 14);
label21.TabIndex = 31;
label21.Text = "Dynamic light intensity:";
label21.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
// keyusedlabel
//
this.keyusedlabel.AutoSize = true;
@ -1183,6 +1195,27 @@ namespace CodeImp.DoomBuilder.Windows
this.appearancegroup1.TabStop = false;
this.appearancegroup1.Text = " Additional Options ";
//
// labelDynLightIntensity
//
this.labelDynLightIntensity.AutoSize = true;
this.labelDynLightIntensity.Location = new System.Drawing.Point(337, 174);
this.labelDynLightIntensity.Name = "labelDynLightIntensity";
this.labelDynLightIntensity.Size = new System.Drawing.Size(22, 14);
this.labelDynLightIntensity.TabIndex = 32;
this.labelDynLightIntensity.Text = "1.0";
//
// tbDynLightIntensity
//
this.tbDynLightIntensity.LargeChange = 1;
this.tbDynLightIntensity.Location = new System.Drawing.Point(176, 161);
this.tbDynLightIntensity.Minimum = 1;
this.tbDynLightIntensity.Name = "tbDynLightIntensity";
this.tbDynLightIntensity.Size = new System.Drawing.Size(154, 45);
this.tbDynLightIntensity.TabIndex = 30;
this.tbDynLightIntensity.TickStyle = System.Windows.Forms.TickStyle.Both;
this.tbDynLightIntensity.Value = 10;
this.tbDynLightIntensity.ValueChanged += new System.EventHandler(this.tbDynLightIntensity_ValueChanged);
//
// labelDynLightSize
//
this.labelDynLightSize.AutoSize = true;
@ -1551,36 +1584,15 @@ namespace CodeImp.DoomBuilder.Windows
this.pasteoptions.Size = new System.Drawing.Size(666, 427);
this.pasteoptions.TabIndex = 0;
//
// label21
// cbSynchCameras
//
label21.AutoSize = true;
label21.Location = new System.Drawing.Point(55, 174);
label21.Name = "label21";
label21.Size = new System.Drawing.Size(116, 14);
label21.TabIndex = 31;
label21.Text = "Dynamic light intensity:";
label21.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
// labelDynLightIntensity
//
this.labelDynLightIntensity.AutoSize = true;
this.labelDynLightIntensity.Location = new System.Drawing.Point(337, 174);
this.labelDynLightIntensity.Name = "labelDynLightIntensity";
this.labelDynLightIntensity.Size = new System.Drawing.Size(22, 14);
this.labelDynLightIntensity.TabIndex = 32;
this.labelDynLightIntensity.Text = "1.0";
//
// tbDynLightIntensity
//
this.tbDynLightIntensity.LargeChange = 1;
this.tbDynLightIntensity.Location = new System.Drawing.Point(176, 161);
this.tbDynLightIntensity.Minimum = 1;
this.tbDynLightIntensity.Name = "tbDynLightIntensity";
this.tbDynLightIntensity.Size = new System.Drawing.Size(154, 45);
this.tbDynLightIntensity.TabIndex = 30;
this.tbDynLightIntensity.TickStyle = System.Windows.Forms.TickStyle.Both;
this.tbDynLightIntensity.Value = 10;
this.tbDynLightIntensity.ValueChanged += new System.EventHandler(this.tbDynLightIntensity_ValueChanged);
this.cbSynchCameras.AutoSize = true;
this.cbSynchCameras.Location = new System.Drawing.Point(32, 282);
this.cbSynchCameras.Name = "cbSynchCameras";
this.cbSynchCameras.Size = new System.Drawing.Size(270, 18);
this.cbSynchCameras.TabIndex = 42;
this.cbSynchCameras.Text = "Synch camera position between 2D and 3D modes";
this.cbSynchCameras.UseVisualStyleBackColor = true;
//
// PreferencesForm
//
@ -1630,6 +1642,7 @@ namespace CodeImp.DoomBuilder.Windows
this.tabcolors.ResumeLayout(false);
this.appearancegroup1.ResumeLayout(false);
this.appearancegroup1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.tbDynLightIntensity)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.tbDynLightSize)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.tbDynLightCount)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.imagebrightness)).EndInit();
@ -1637,7 +1650,6 @@ namespace CodeImp.DoomBuilder.Windows
this.colorsgroup3.PerformLayout();
this.panel1.ResumeLayout(false);
this.tabpasting.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.tbDynLightIntensity)).EndInit();
this.ResumeLayout(false);
}
@ -1755,5 +1767,6 @@ namespace CodeImp.DoomBuilder.Windows
private Dotnetrix.Controls.TrackBar tbDynLightSize;
private System.Windows.Forms.Label labelDynLightIntensity;
private Dotnetrix.Controls.TrackBar tbDynLightIntensity;
private System.Windows.Forms.CheckBox cbSynchCameras;
}
}

View file

@ -93,9 +93,10 @@ namespace CodeImp.DoomBuilder.Windows
toolbar_viewmodes.Checked = General.Settings.ToolbarViewModes;
toolbar_geometry.Checked = General.Settings.ToolbarGeometry;
toolbar_testing.Checked = General.Settings.ToolbarTesting;
showtexturesizes.Checked = General.Settings.ShowTextureSizes;
//mxd
toolbar_gzdoom.Checked = General.Settings.GZToolbarGZDoom;
showtexturesizes.Checked = General.Settings.ShowTextureSizes;
cbSynchCameras.Checked = General.Settings.GZSynchCameras;
tbDynLightCount.Value = General.Settings.GZMaxDynamicLights;
labelDynLightCount.Text = General.Settings.GZMaxDynamicLights.ToString();
tbDynLightSize.Value = (int)(General.Settings.GZDynamicLightRadius * 10);
@ -268,6 +269,8 @@ namespace CodeImp.DoomBuilder.Windows
General.Settings.QualityDisplay = qualitydisplay.Checked;
//mxd
General.Settings.GZSynchCameras = cbSynchCameras.Checked;
General.Settings.GZToolbarGZDoom = toolbar_gzdoom.Checked;
General.Settings.GZMaxDynamicLights = tbDynLightCount.Value;
General.Settings.GZDynamicLightRadius = ((float)tbDynLightSize.Value / 10.0f);
General.Settings.GZDynamicLightIntensity = ((float)tbDynLightIntensity.Value / 10.0f);

View file

@ -266,6 +266,7 @@
<Compile Include="FindReplace\FindThingThingRef.cs" />
<Compile Include="FindReplace\FindThingType.cs" />
<Compile Include="FindReplace\FindVertexNumber.cs" />
<Compile Include="General\HintLabel.cs" />
<Compile Include="General\UndoGroup.cs" />
<Compile Include="Interface\EditSelectionPanel.cs">
<SubType>UserControl</SubType>

View file

@ -35,7 +35,7 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes {
//got shape
int bevelSign = (bevelWidth > 0 ? 1 : -1);
int bevel = Math.Min(Math.Abs(bevelWidth), Math.Min(width, height) / 2) * bevelSign;
currentBevelWidth = Math.Min(Math.Abs(bevelWidth), Math.Min(width, height) / 2) * bevelSign;
Vector2D[] shape = new Vector2D[subdivisions + 1];
@ -43,8 +43,6 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes {
int hw = width / 2;
int hh = height / 2;
if (bevel != bevelWidth) bevelWidth = bevel;
Vector2D center = new Vector2D(pStart.x + hw, pStart.y + hh);
float curAngle = 0;
float angleStep = -(float)Math.PI / subdivisions * 2;
@ -52,8 +50,8 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes {
for (int i = 0; i < subdivisions; i++) {
if (doBevel) {
px = (int)(center.x - (float)Math.Sin(curAngle) * (hw + bevel));
py = (int)(center.y - (float)Math.Cos(curAngle) * (hh + bevel));
px = (int)(center.x - (float)Math.Sin(curAngle) * (hw + currentBevelWidth));
py = (int)(center.y - (float)Math.Cos(curAngle) * (hh + currentBevelWidth));
} else {
px = (int)(center.x - (float)Math.Sin(curAngle) * hw);
py = (int)(center.y - (float)Math.Cos(curAngle) * hh);
@ -67,6 +65,10 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes {
return shape;
}
protected override string getHintText() {
return "BVL: "+bevelWidth+"; VERTS: "+subdivisions;
}
//ACTIONS
override protected void increaseSubdivLevel() {
if (subdivisions < maxSubdivisions) {

View file

@ -21,8 +21,9 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes
public class DrawRectangleMode : DrawGeometryMode
{
//private LineLengthLabel hintLabel;
private HintLabel hintLabel;
protected int bevelWidth;
protected int currentBevelWidth;
protected int subdivisions;
protected int maxSubdivisions = 16;
@ -36,8 +37,11 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes
protected int width;
protected int height;
protected PixelColor cornersColor;
public DrawRectangleMode() : base() {
snaptogrid = true;
cornersColor = General.Colors.BrightColors[new Random().Next(General.Colors.BrightColors.Length - 1)];
}
override protected void Update() {
@ -63,25 +67,33 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes
for (int i = 1; i < shape.Length; i++)
renderer.RenderLine(shape[i - 1], shape[i], LINE_THICKNESS, color, true);
//vertices
for (int i = 0; i < shape.Length; i++)
renderer.RenderRectangleFilled(new RectangleF(shape[i].x - vsize, shape[i].y - vsize, vsize * 2.0f, vsize * 2.0f), color, true);
//and labels
Vector2D[] labelCoords = new Vector2D[]{start, new Vector2D(end.x, start.y), end, new Vector2D(start.x, end.y), start};
Vector2D[] labelCoords = new Vector2D[] { start, new Vector2D(end.x, start.y), end, new Vector2D(start.x, end.y), start };
for (int i = 1; i < 5; i++) {
labels[i - 1].Start = labelCoords[i - 1];
labels[i - 1].End = labelCoords[i];
renderer.RenderText(labels[i - 1].TextLabel);
}
//got beveled corners?
if (shape.Length > 5) {
//render hint
/*if (width > 64 * vsize && height > 32 * vsize) {
if (width > 64 * vsize && height > 16 * vsize) {
float vPos = start.y + height / 2.0f;
hintLabel.Start = new Vector2D(start.x, vPos);
hintLabel.End = new Vector2D(end.x, vPos);
renderer.RenderText(hintLabel.TextLabel); //todo: extend LieLengthLabel class
}*/
hintLabel.Text = getHintText();
renderer.RenderText(hintLabel.TextLabel);
}
// Render vertices
for (int i = 0; i < shape.Length; i++)
renderer.RenderRectangleFilled(new RectangleF(shape[i].x - vsize, shape[i].y - vsize, vsize * 2.0f, vsize * 2.0f), color, true);
//and shape corners
for (int i = 0; i < 4; i++)
renderer.RenderRectangleFilled(new RectangleF(labelCoords[i].x - vsize, labelCoords[i].y - vsize, vsize * 2.0f, vsize * 2.0f), cornersColor, true);
}
} else {
// Render vertex at cursor
renderer.RenderRectangleFilled(new RectangleF(curp.pos.x - vsize, curp.pos.y - vsize, vsize * 2.0f, vsize * 2.0f), color, true);
@ -97,37 +109,39 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes
protected virtual Vector2D[] getShape(Vector2D pStart, Vector2D pEnd) {
//no shape
if (pEnd.x == pStart.x && pEnd.y == pStart.y)
if (pEnd.x == pStart.x && pEnd.y == pStart.y) {
currentBevelWidth = 0;
return new Vector2D[0];
}
//no corners
if (bevelWidth == 0)
if (bevelWidth == 0) {
currentBevelWidth = 0;
return new Vector2D[] { pStart, new Vector2D((int)pEnd.x, (int)pStart.y), pEnd, new Vector2D((int)pStart.x, (int)pEnd.y), pStart };
}
//got corners
bool reverse = false;
int bevel = Math.Min(Math.Abs(bevelWidth), Math.Min(width, height) / 2);
currentBevelWidth = Math.Min(Math.Abs(bevelWidth), Math.Min(width, height) / 2);
if (subdivisions > 0 && bevelWidth < 0) {
bevel *= -1;
if (bevelWidth < 0) {
currentBevelWidth *= -1;
reverse = true;
}
if (bevel != bevelWidth) bevelWidth = bevel;
List<Vector2D> l_points = new List<Vector2D>();
//top-left corner
l_points.AddRange(getCornerPoints(pStart, bevel, bevel, !reverse));
l_points.AddRange(getCornerPoints(pStart, currentBevelWidth, currentBevelWidth, !reverse));
//top-right corner
l_points.AddRange(getCornerPoints(new Vector2D(pEnd.x, pStart.y), -bevel, bevel, reverse));
l_points.AddRange(getCornerPoints(new Vector2D(pEnd.x, pStart.y), -currentBevelWidth, currentBevelWidth, reverse));
//bottom-right corner
l_points.AddRange(getCornerPoints(pEnd, -bevel, -bevel, !reverse));
l_points.AddRange(getCornerPoints(pEnd, -currentBevelWidth, -currentBevelWidth, !reverse));
//bottom-left corner
l_points.AddRange(getCornerPoints(new Vector2D(pStart.x, pEnd.y), bevel, -bevel, reverse));
l_points.AddRange(getCornerPoints(new Vector2D(pStart.x, pEnd.y), currentBevelWidth, -currentBevelWidth, reverse));
//closing point
l_points.Add(l_points[0]);
@ -139,15 +153,6 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes
private Vector2D[] getCornerPoints(Vector2D startPoint, int bevel_width, int bevel_height, bool reverse) {
Vector2D[] points;
if (subdivisions == 0) {
points = new Vector2D[2];
points[0] = new Vector2D(startPoint.x, startPoint.y + bevel_height);
points[1] = new Vector2D(startPoint.x + bevel_width, startPoint.y);
if (!reverse) Array.Reverse(points);
return points;
}
Vector2D center = (bevelWidth > 0 ? new Vector2D(startPoint.x + bevel_width, startPoint.y + bevel_height) : startPoint);
float curAngle = (float)Math.PI;
@ -164,6 +169,10 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes
return points;
}
protected virtual string getHintText() {
return "BVL: " + bevelWidth + "; SUB: " + subdivisions;
}
//update top-left and bottom-right points, which define drawing shape
private void updateReferencePoints(DrawnVertex p1, DrawnVertex p2) {
if (p1.pos.x < p2.pos.x) {
@ -200,7 +209,7 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes
if (points.Count == 1) { //add point and labels
labels.AddRange(new LineLengthLabel[] { new LineLengthLabel(), new LineLengthLabel(), new LineLengthLabel(), new LineLengthLabel() });
//hintLabel = new LineLengthLabel();
hintLabel = new HintLabel();
Update();
} else if (points[0].pos == points[1].pos) { //nothing is drawn
points = new List<DrawnVertex>();
@ -298,14 +307,18 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes
[BeginAction("increasebevel")]
protected virtual void increaseBevel() {
if (currentBevelWidth == bevelWidth || bevelWidth < 0) {
bevelWidth += General.Map.Grid.GridSize;
Update();
}
}
[BeginAction("decreasebevel")]
protected virtual void decreaseBevel() {
if (currentBevelWidth == bevelWidth || bevelWidth > 0) {
bevelWidth -= General.Map.Grid.GridSize;
Update();
}
}
}
}

View file

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using CodeImp.DoomBuilder.Rendering;
using CodeImp.DoomBuilder.Geometry;
namespace CodeImp.DoomBuilder.BuilderModes
{
public class HintLabel : LineLengthLabel
{
private const int TEXT_CAPACITY = 32;
private const float TEXT_SCALE = 10f;
private string text = "";
public string Text {
get {
return text;
}
set {
text = value;
Update();
}
}
public HintLabel() : base() {
label.Color = General.Colors.BrightColors[new Random().Next(General.Colors.BrightColors.Length - 1)];
}
protected override void Update() {
Vector2D delta = end - start;
float length = delta.GetLength();
label.Text = text;
label.Rectangle = new RectangleF(start.x + delta.x * 0.5f, start.y + delta.y * 0.5f, 0f, 0f);
}
}
}

View file

@ -48,9 +48,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Variables
private TextLabel label;
private Vector2D start;
private Vector2D end;
protected TextLabel label;
protected Vector2D start;
protected Vector2D end;
#endregion
@ -80,7 +80,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
}
// Initialization
private void Initialize()
protected virtual void Initialize()
{
label = new TextLabel(TEXT_CAPACITY);
label.AlignX = TextAlignmentX.Center;
@ -102,7 +102,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Methods
// This updates the text
private void Update()
protected virtual void Update()
{
Vector2D delta = end - start;
float length = delta.GetLength();