From 80861be6ab16d692e4b746cb21f2ae5df5afab66 Mon Sep 17 00:00:00 2001
From: MaxED <j.maxed@gmail.com>
Date: Mon, 22 Feb 2016 15:20:08 +0000
Subject: [PATCH] Added "Fixed Things Scale" setting (available in the View
 menu, as a button on the View toolbar and as the "Toggle Fixed Things Scale"
 action). When enabled, Things will no longer be scaled based on current zoom
 level in Classic modes, instead, thing bounding box will be drawn when
 appropriate (this option mimics DB1 things rendering style). Internal:
 removed some remnants of fixed rendering pipeline from Renderer2D and
 Renderer3D.

---
 Source/Core/Builder.csproj                    |   1 +
 Source/Core/Config/ProgramConfiguration.cs    |   6 +-
 Source/Core/GZBuilder/Geometry/Line3D.cs      |   8 ++
 Source/Core/Map/MapSet.cs                     |   2 +-
 Source/Core/Properties/Resources.Designer.cs  |   9 ++-
 Source/Core/Properties/Resources.resx         |   3 +
 Source/Core/Rendering/IRenderer2D.cs          |   1 +
 Source/Core/Rendering/Renderer2D.cs           |  69 ++++++++++--------
 Source/Core/Rendering/Renderer3D.cs           |   2 -
 Source/Core/Resources/Actions.cfg             |  10 +++
 Source/Core/Resources/FixedThingsScale.png    | Bin 0 -> 1595 bytes
 Source/Core/Windows/MainForm.Designer.cs      |  31 ++++++++
 Source/Core/Windows/MainForm.cs               |  17 +++++
 .../BuilderModes/ClassicModes/ThingsMode.cs   |   2 +-
 14 files changed, 126 insertions(+), 35 deletions(-)
 create mode 100644 Source/Core/Resources/FixedThingsScale.png

diff --git a/Source/Core/Builder.csproj b/Source/Core/Builder.csproj
index 0ba80cbd0..cc46ff2ff 100644
--- a/Source/Core/Builder.csproj
+++ b/Source/Core/Builder.csproj
@@ -1124,6 +1124,7 @@
     <None Include="Resources\GroupRemove.png" />
     <None Include="Resources\GridDecrease.png" />
     <None Include="Resources\GridIncrease.png" />
+    <None Include="Resources\FixedThingsScale.png" />
     <Content Include="Resources\Light.png" />
     <None Include="Resources\Lightbulb.png" />
     <None Include="Resources\LightDisabled.png" />
diff --git a/Source/Core/Config/ProgramConfiguration.cs b/Source/Core/Config/ProgramConfiguration.cs
index f7f8cf88f..8b1282d86 100644
--- a/Source/Core/Config/ProgramConfiguration.cs
+++ b/Source/Core/Config/ProgramConfiguration.cs
@@ -125,7 +125,8 @@ namespace CodeImp.DoomBuilder.Config
 		private bool autoClearSideTextures;
 		private bool storeSelectedEditTab;
 		private bool checkforupdates;
-		private bool rendercomments;
+		private bool rendercomments; //mxd
+		private bool fixedthingsscale; //mxd
 		private bool rendergrid;
 		private bool dynamicgridsize;
 		private int ignoredremoterevision;
@@ -226,6 +227,7 @@ namespace CodeImp.DoomBuilder.Config
 		public bool StoreSelectedEditTab { get { return storeSelectedEditTab; } internal set { storeSelectedEditTab = value; } }
 		internal bool CheckForUpdates { get { return checkforupdates; } set { checkforupdates = value; } } //mxd
 		public bool RenderComments { get { return rendercomments; } internal set { rendercomments = value; } } //mxd
+		public bool FixedThingsScale { get { return fixedthingsscale; } internal set { fixedthingsscale = value; } } //mxd
 		public bool RenderGrid { get { return rendergrid; } internal set { rendergrid = value; } } //mxd
 		public bool DynamicGridSize { get { return dynamicgridsize; } internal set { dynamicgridsize = value; } } //mxd
 		internal int IgnoredRemoteRevision { get { return ignoredremoterevision; } set { ignoredremoterevision = value; } } //mxd
@@ -348,6 +350,7 @@ namespace CodeImp.DoomBuilder.Config
 				storeSelectedEditTab = cfg.ReadSetting("storeselectededittab", true);
 				checkforupdates = cfg.ReadSetting("checkforupdates", true); //mxd
 				rendercomments = cfg.ReadSetting("rendercomments", true); //mxd
+				fixedthingsscale = cfg.ReadSetting("fixedthingsscale", false); //mxd
 				rendergrid = cfg.ReadSetting("rendergrid", true); //mxd
 				dynamicgridsize = cfg.ReadSetting("dynamicgridsize", true); //mxd
 				ignoredremoterevision = cfg.ReadSetting("ignoredremoterevision", 0); //mxd
@@ -454,6 +457,7 @@ namespace CodeImp.DoomBuilder.Config
 			cfg.WriteSetting("storeselectededittab", storeSelectedEditTab);
 			cfg.WriteSetting("checkforupdates", checkforupdates); //mxd
 			cfg.WriteSetting("rendercomments", rendercomments); //mxd
+			cfg.WriteSetting("fixedthingsscale", fixedthingsscale); //mxd
 			cfg.WriteSetting("rendergrid", rendergrid); //mxd
 			cfg.WriteSetting("dynamicgridsize", dynamicgridsize); //mxd
 			cfg.WriteSetting("ignoredremoterevision", ignoredremoterevision); //mxd
diff --git a/Source/Core/GZBuilder/Geometry/Line3D.cs b/Source/Core/GZBuilder/Geometry/Line3D.cs
index 9f8c16d28..3cffa1aa4 100644
--- a/Source/Core/GZBuilder/Geometry/Line3D.cs
+++ b/Source/Core/GZBuilder/Geometry/Line3D.cs
@@ -22,6 +22,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.Geometry
 		{
 			this.Start = start;
 			this.End = end;
+			this.Start2D = start;
+			this.End2D = end;
 			this.Color = General.Colors.InfoLine;
 			this.RenderArrowhead = true;
 		}
@@ -30,6 +32,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.Geometry
 		{
 			this.Start = start;
 			this.End = end;
+			this.Start2D = start;
+			this.End2D = end;
 			this.Color = General.Colors.InfoLine;
 			this.RenderArrowhead = renderArrowhead;
 		}
@@ -38,6 +42,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.Geometry
 		{
 			this.Start = start;
 			this.End = end;
+			this.Start2D = start;
+			this.End2D = end;
 			this.Color = color;
 			this.RenderArrowhead = true;
 		}
@@ -46,6 +52,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.Geometry
 		{
 			this.Start = start;
 			this.End = end;
+			this.Start2D = start;
+			this.End2D = end;
 			this.Color = color;
 			this.RenderArrowhead = renderArrowhead;
 		}
diff --git a/Source/Core/Map/MapSet.cs b/Source/Core/Map/MapSet.cs
index af167f071..0aabb6af5 100644
--- a/Source/Core/Map/MapSet.cs
+++ b/Source/Core/Map/MapSet.cs
@@ -2727,7 +2727,7 @@ namespace CodeImp.DoomBuilder.Map
 			{
 				float px = t.Position.x;
 				float py = t.Position.y;
-				float ts = ((t.FixedSize && General.Map.Renderer2D.Scale > 1.0f) ? t.Size / General.Map.Renderer2D.Scale : t.Size);
+				float ts = (((t.FixedSize || General.Settings.FixedThingsScale) && General.Map.Renderer2D.Scale > 1.0f) ? t.Size / General.Map.Renderer2D.Scale : t.Size);
 
 				//mxd. Within range?
 				if(px < range.Left - ts || px > range.Right + ts || py < range.Top - ts || py > range.Bottom + ts) continue;
diff --git a/Source/Core/Properties/Resources.Designer.cs b/Source/Core/Properties/Resources.Designer.cs
index 6f347c287..987ee0052 100644
--- a/Source/Core/Properties/Resources.Designer.cs
+++ b/Source/Core/Properties/Resources.Designer.cs
@@ -1,7 +1,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:2.0.50727.5485
+//     Runtime Version:2.0.50727.5466
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
@@ -270,6 +270,13 @@ namespace CodeImp.DoomBuilder.Properties {
             }
         }
         
+        internal static System.Drawing.Bitmap FixedThingsScale {
+            get {
+                object obj = ResourceManager.GetObject("FixedThingsScale", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap fog {
             get {
                 object obj = ResourceManager.GetObject("fog", resourceCulture);
diff --git a/Source/Core/Properties/Resources.resx b/Source/Core/Properties/Resources.resx
index 934380dc4..6afe90160 100644
--- a/Source/Core/Properties/Resources.resx
+++ b/Source/Core/Properties/Resources.resx
@@ -562,4 +562,7 @@
   <data name="ScriptProperty" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\ScriptProperty.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="FixedThingsScale" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\FixedThingsScale.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/Source/Core/Rendering/IRenderer2D.cs b/Source/Core/Rendering/IRenderer2D.cs
index 314a89fa5..fc4215210 100644
--- a/Source/Core/Rendering/IRenderer2D.cs
+++ b/Source/Core/Rendering/IRenderer2D.cs
@@ -73,6 +73,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		void RenderRectangleFilled(RectangleF rect, PixelColor c, bool transformrect, ImageData texture);
 		void RenderLine(Vector2D start, Vector2D end, float thickness, PixelColor c, bool transformcoords);
 		void RenderArrows(ICollection<Line3D> line); //mxd
+		void RenderArrows(ICollection<Line3D> line, bool transformcoords); //mxd
 		void RenderText(TextLabel text);
 		void RenderGeometry(FlatVertex[] vertices, ImageData texture, bool transformcoords);
 		void RenderHighlight(FlatVertex[] vertices, int color); //mxd
diff --git a/Source/Core/Rendering/Renderer2D.cs b/Source/Core/Rendering/Renderer2D.cs
index 3d76cd068..fd10e2818 100644
--- a/Source/Core/Rendering/Renderer2D.cs
+++ b/Source/Core/Rendering/Renderer2D.cs
@@ -251,7 +251,6 @@ namespace CodeImp.DoomBuilder.Rendering
 						// BACKGROUND
 						case RendererLayer.Background:
 							if((backimageverts == null) || (General.Map.Grid.Background.Texture == null)) break;
-							graphics.Device.SetTexture(0, General.Map.Grid.Background.Texture);
 							graphics.Shaders.Display2D.Texture1 = General.Map.Grid.Background.Texture;
 							graphics.Shaders.Display2D.SetSettings(1f / windowsize.Width, 1f / windowsize.Height, FSAA_FACTOR, layer.alpha, false);
 							graphics.Shaders.Display2D.BeginPass(aapass);
@@ -262,7 +261,6 @@ namespace CodeImp.DoomBuilder.Rendering
 
 						// GRID
 						case RendererLayer.Grid:
-							graphics.Device.SetTexture(0, backtex);
 							graphics.Shaders.Display2D.Texture1 = backtex;
 							graphics.Shaders.Display2D.SetSettings(1f / backsize.Width, 1f / backsize.Height, FSAA_FACTOR, layer.alpha, false);
 							graphics.Shaders.Display2D.BeginPass(aapass);
@@ -272,7 +270,6 @@ namespace CodeImp.DoomBuilder.Rendering
 
 						// GEOMETRY
 						case RendererLayer.Geometry:
-							graphics.Device.SetTexture(0, plottertex);
 							graphics.Shaders.Display2D.Texture1 = plottertex;
 							graphics.Shaders.Display2D.SetSettings(1f / structsize.Width, 1f / structsize.Height, FSAA_FACTOR, layer.alpha, false);
 							graphics.Shaders.Display2D.BeginPass(aapass);
@@ -282,7 +279,6 @@ namespace CodeImp.DoomBuilder.Rendering
 
 						// THINGS
 						case RendererLayer.Things:
-							graphics.Device.SetTexture(0, thingstex);
 							graphics.Shaders.Display2D.Texture1 = thingstex;
 							graphics.Shaders.Display2D.SetSettings(1f / thingssize.Width, 1f / thingssize.Height, FSAA_FACTOR, layer.alpha, false);
 							graphics.Shaders.Display2D.BeginPass(aapass);
@@ -292,7 +288,6 @@ namespace CodeImp.DoomBuilder.Rendering
 
 						// OVERLAY
 						case RendererLayer.Overlay:
-							graphics.Device.SetTexture(0, overlaytex);
 							graphics.Shaders.Display2D.Texture1 = overlaytex;
 							graphics.Shaders.Display2D.SetSettings(1f / overlaysize.Width, 1f / overlaysize.Height, FSAA_FACTOR, layer.alpha, false);
 							graphics.Shaders.Display2D.BeginPass(aapass);
@@ -302,7 +297,6 @@ namespace CodeImp.DoomBuilder.Rendering
 
 						// SURFACE
 						case RendererLayer.Surface:
-							graphics.Device.SetTexture(0, surfacetex);
 							graphics.Shaders.Display2D.Texture1 = surfacetex;
 							graphics.Shaders.Display2D.SetSettings(1f / overlaysize.Width, 1f / overlaysize.Height, FSAA_FACTOR, layer.alpha, false);
 							graphics.Shaders.Display2D.BeginPass(aapass);
@@ -318,7 +312,6 @@ namespace CodeImp.DoomBuilder.Rendering
 				graphics.Present();
 
 				// Release binds
-				graphics.Device.SetTexture(0, null);
 				graphics.Shaders.Display2D.Texture1 = null;
 				graphics.Device.SetStreamSource(0, null, 0, 0);
 			}
@@ -964,19 +957,21 @@ namespace CodeImp.DoomBuilder.Rendering
 
 		// This makes vertices for a thing
 		// Returns false when not on the screen
-		private bool CreateThingBoxVerts(Thing t, ref FlatVertex[] verts, Dictionary<Thing, Vector2D> thingsByPosition, int offset, PixelColor c)
+		private bool CreateThingBoxVerts(Thing t, ref FlatVertex[] verts, ref List<Line3D> bboxes, Dictionary<Thing, Vector2D> thingsByPosition, int offset, PixelColor c, byte bboxalpha)
 		{
 			if(t.Size * scale < MINIMUM_THING_RADIUS) return false; //mxd. Don't render tiny little things
 
-			// Determine size
-			float circlesize = (t.FixedSize && (scale > 1.0f) ? t.Size /* * THING_CIRCLE_SIZE*/ : t.Size * scale /* * THING_CIRCLE_SIZE*/);
+			// Determine sizes
+			float circlesize = ((t.FixedSize || General.Settings.FixedThingsScale) && (scale > 1.0f) ? t.Size : t.Size * scale);
+			float bboxsize = ((!t.FixedSize && General.Settings.FixedThingsScale) && (scale > 1.0f) ? t.Size * scale : -1); //mxd
+			float screensize = Math.Max(circlesize, bboxsize); //mxd
 			
 			// Transform to screen coordinates
 			Vector2D screenpos = ((Vector2D)t.Position).GetTransformed(translatex, translatey, scale, -scale);
 			
 			// Check if the thing is actually on screen
-			if(((screenpos.x + circlesize) <= 0.0f) || ((screenpos.x - circlesize) >= windowsize.Width) ||
-			   ((screenpos.y + circlesize) <= 0.0f) || ((screenpos.y - circlesize) >= windowsize.Height))
+			if(((screenpos.x + screensize) <= 0.0f) || ((screenpos.x - screensize) >= windowsize.Width) ||
+			   ((screenpos.y + screensize) <= 0.0f) || ((screenpos.y - screensize) >= windowsize.Height))
 				return false;
 
 			// Get integral color
@@ -1014,6 +1009,22 @@ namespace CodeImp.DoomBuilder.Rendering
 			//mxd. Add to list
 			thingsByPosition.Add(t, screenpos);
 
+			//mxd. Add bounding box?
+			if(bboxsize > 0)
+			{
+				PixelColor boxcolor = c.WithAlpha(bboxalpha);
+
+				Vector2D tl = new Vector2D(screenpos.x - bboxsize, screenpos.y - bboxsize);
+				Vector2D tr = new Vector2D(screenpos.x + bboxsize, screenpos.y - bboxsize);
+				Vector2D bl = new Vector2D(screenpos.x - bboxsize, screenpos.y + bboxsize);
+				Vector2D br = new Vector2D(screenpos.x + bboxsize, screenpos.y + bboxsize);
+
+				bboxes.Add(new Line3D(tl, tr, boxcolor, false));
+				bboxes.Add(new Line3D(tr, br, boxcolor, false));
+				bboxes.Add(new Line3D(bl, br, boxcolor, false));
+				bboxes.Add(new Line3D(tl, bl, boxcolor, false));
+			}
+
 			// Done
 			return true;
 		}
@@ -1022,7 +1033,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		private void CreateThingArrowVerts(Thing t, ref FlatVertex[] verts, Vector2D screenpos, int offset) 
 		{
 			// Determine size
-			float arrowsize = (t.FixedSize && (scale > 1.0f) ? t.Size : t.Size * scale) * THING_ARROW_SIZE; //mxd
+			float arrowsize = ((t.FixedSize || General.Settings.FixedThingsScale) && (scale > 1.0f) ? t.Size : t.Size * scale) * THING_ARROW_SIZE; //mxd
 
 			// Setup rotated rect for arrow
 			float sinarrowsize = (float)Math.Sin(t.Angle + Angle2D.PI * 0.25f) * arrowsize;
@@ -1100,6 +1111,7 @@ namespace CodeImp.DoomBuilder.Rendering
 				
 				// Make alpha color
 				Color4 alphacolor = new Color4(alpha, 1.0f, 1.0f, 1.0f);
+				byte bboxalpha = (byte)(alpha * (General.Editing.Mode.GetType().Name == "ThingsMode" ? 128 : 255));
 				
 				// Set renderstates for things rendering
 				graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
@@ -1113,7 +1125,6 @@ namespace CodeImp.DoomBuilder.Rendering
 				graphics.Device.SetStreamSource(0, thingsvertices, 0, FlatVertex.Stride);
 				
 				// Set things texture
-				graphics.Device.SetTexture(0, thingtexture.Texture);
 				graphics.Shaders.Things2D.Texture1 = thingtexture.Texture;
 				SetWorldTransformation(false);
 				graphics.Shaders.Things2D.SetSettings(alpha);
@@ -1125,6 +1136,7 @@ namespace CodeImp.DoomBuilder.Rendering
 				// Determine next lock size
 				int locksize = (things.Count > THING_BUFFER_SIZE) ? THING_BUFFER_SIZE : things.Count;
 				FlatVertex[] verts = new FlatVertex[THING_BUFFER_SIZE * 6];
+				List<Line3D> bboxes = new List<Line3D>(locksize); //mxd
 
 				//mxd
 				Dictionary<int, List<Thing>> thingsByType = new Dictionary<int, List<Thing>>();
@@ -1148,7 +1160,7 @@ namespace CodeImp.DoomBuilder.Rendering
 					
 					// Create vertices
 					PixelColor tc = fixedcolor ? c : DetermineThingColor(t);
-					if(CreateThingBoxVerts(t, ref verts, thingsByPosition, buffercount * 6, tc)) 
+					if(CreateThingBoxVerts(t, ref verts, ref bboxes, thingsByPosition, buffercount * 6, tc, bboxalpha))
 					{
 						buffercount++;
 
@@ -1211,8 +1223,8 @@ namespace CodeImp.DoomBuilder.Rendering
 					}
 					if(sprite.Texture == null) sprite.CreateTexture();
 
-					graphics.Device.SetTexture(0, sprite.Texture);
 					graphics.Shaders.Things2D.Texture1 = sprite.Texture;
+					graphics.Shaders.Things2D.ApplySettings();
 
 					// Determine next lock size
 					locksize = (group.Value.Count > THING_BUFFER_SIZE) ? THING_BUFFER_SIZE : group.Value.Count;
@@ -1223,7 +1235,7 @@ namespace CodeImp.DoomBuilder.Rendering
 					totalcount = 0;
 
 					float spriteWidth, spriteHeight;
-					float spriteScale = (group.Value[0].FixedSize && (scale > 1.0f)) ? 1.0f : scale;
+					float spriteScale = ((group.Value[0].FixedSize || General.Settings.FixedThingsScale) && (scale > 1.0f)) ? 1.0f : scale;
 
 					if(sprite.Width > sprite.Height) 
 					{
@@ -1285,7 +1297,6 @@ namespace CodeImp.DoomBuilder.Rendering
 				graphics.Shaders.Things2D.EndPass();
 
 				//mxd. Render thing arrows
-				graphics.Device.SetTexture(0, thingtexture.Texture);
 				graphics.Shaders.Things2D.Texture1 = thingtexture.Texture;
 				graphics.Shaders.Things2D.BeginPass(0);
 
@@ -1393,6 +1404,9 @@ namespace CodeImp.DoomBuilder.Rendering
 				}
 
 				graphics.Shaders.Things2D.End();
+
+				//mxd. Render thing boxes
+				RenderArrows(bboxes, false);
 			}
 		}
 		
@@ -1501,7 +1515,6 @@ namespace CodeImp.DoomBuilder.Rendering
 				graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
 				graphics.Device.SetRenderState(RenderState.FogEnable, false);
 				graphics.Shaders.Display2D.Texture1 = t;
-				graphics.Device.SetTexture(0, t);
 				SetWorldTransformation(transformcoords);
 				graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
 				
@@ -1558,7 +1571,6 @@ namespace CodeImp.DoomBuilder.Rendering
 				graphics.Shaders.Display2D.Texture1 = graphics.FontTexture;
 				SetWorldTransformation(false);
 				graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, true);
-				graphics.Device.SetTexture(0, graphics.FontTexture);
 				graphics.Device.SetStreamSource(0, text.VertexBuffer, 0, FlatVertex.Stride);
 
 				// Draw
@@ -1621,7 +1633,6 @@ namespace CodeImp.DoomBuilder.Rendering
 			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
 			graphics.Device.SetRenderState(RenderState.FogEnable, false);
 			SetWorldTransformation(false);
-			graphics.Device.SetTexture(0, General.Map.Data.WhiteTexture.Texture);
 			graphics.Shaders.Display2D.Texture1 = General.Map.Data.WhiteTexture.Texture;
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
 			
@@ -1660,7 +1671,6 @@ namespace CodeImp.DoomBuilder.Rendering
 			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
 			graphics.Device.SetRenderState(RenderState.FogEnable, false);
 			SetWorldTransformation(false);
-			graphics.Device.SetTexture(0, General.Map.Data.WhiteTexture.Texture);
 			graphics.Shaders.Display2D.Texture1 = General.Map.Data.WhiteTexture.Texture;
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
 
@@ -1696,7 +1706,6 @@ namespace CodeImp.DoomBuilder.Rendering
 			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
 			graphics.Device.SetRenderState(RenderState.FogEnable, false);
 			SetWorldTransformation(false);
-			graphics.Device.SetTexture(0, texture.Texture);
 			graphics.Shaders.Display2D.Texture1 = texture.Texture;
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
 
@@ -1709,7 +1718,8 @@ namespace CodeImp.DoomBuilder.Rendering
 		}
 
 		//mxd
-		public void RenderArrows(ICollection<Line3D> lines) 
+		public void RenderArrows(ICollection<Line3D> lines) { RenderArrows(lines, true); }
+		public void RenderArrows(ICollection<Line3D> lines, bool transformcoords) 
 		{
 			if(lines.Count == 0) return;
 			int pointscount = 0;
@@ -1717,9 +1727,12 @@ namespace CodeImp.DoomBuilder.Rendering
 			// Translate to screen coords, determine renderability
 			foreach(Line3D line in lines)
 			{
-				// Calculate screen positions
-				line.Start2D = ((Vector2D)line.Start).GetTransformed(translatex, translatey, scale, -scale); //start
-				line.End2D = ((Vector2D)line.End).GetTransformed(translatex, translatey, scale, -scale); //end
+				// Calculate screen positions?
+				if(transformcoords)
+				{
+					line.Start2D = ((Vector2D)line.Start).GetTransformed(translatex, translatey, scale, -scale); //start
+					line.End2D = ((Vector2D)line.End).GetTransformed(translatex, translatey, scale, -scale); //end
+				}
 
 				float maxx = Math.Max(line.Start2D.x, line.End2D.x);
 				float minx = Math.Min(line.Start2D.x, line.End2D.x);
@@ -1798,7 +1811,6 @@ namespace CodeImp.DoomBuilder.Rendering
 			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
 			graphics.Device.SetRenderState(RenderState.FogEnable, false);
 			SetWorldTransformation(false);
-			graphics.Device.SetTexture(0, General.Map.Data.WhiteTexture.Texture);
 			graphics.Shaders.Display2D.Texture1 = General.Map.Data.WhiteTexture.Texture;
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
 
@@ -1854,7 +1866,6 @@ namespace CodeImp.DoomBuilder.Rendering
 			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
 			graphics.Device.SetRenderState(RenderState.FogEnable, false);
 			SetWorldTransformation(false);
-			graphics.Device.SetTexture(0, General.Map.Data.WhiteTexture.Texture);
 			graphics.Shaders.Display2D.Texture1 = General.Map.Data.WhiteTexture.Texture;
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
 
diff --git a/Source/Core/Rendering/Renderer3D.cs b/Source/Core/Rendering/Renderer3D.cs
index 91d0fd218..d368d12e5 100644
--- a/Source/Core/Rendering/Renderer3D.cs
+++ b/Source/Core/Rendering/Renderer3D.cs
@@ -1814,13 +1814,11 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(crosshairbusy)
 			{
 				if(General.Map.Data.CrosshairBusy3D.Texture == null) General.Map.Data.CrosshairBusy3D.CreateTexture();
-				graphics.Device.SetTexture(0, General.Map.Data.CrosshairBusy3D.Texture);
 				graphics.Shaders.Display2D.Texture1 = General.Map.Data.CrosshairBusy3D.Texture;
 			}
 			else
 			{
 				if(General.Map.Data.Crosshair3D.Texture == null) General.Map.Data.Crosshair3D.CreateTexture();
-				graphics.Device.SetTexture(0, General.Map.Data.Crosshair3D.Texture);
 				graphics.Shaders.Display2D.Texture1 = General.Map.Data.Crosshair3D.Texture;
 			}
 			
diff --git a/Source/Core/Resources/Actions.cfg b/Source/Core/Resources/Actions.cfg
index 1e2d752c7..d0577f86a 100644
--- a/Source/Core/Resources/Actions.cfg
+++ b/Source/Core/Resources/Actions.cfg
@@ -1026,6 +1026,16 @@ togglecomments //mxd
 	allowscroll = false;
 }
 
+togglefixedthingsscale //mxd
+{
+	title = "Toggle Fixed Things Scale";
+	category = "view";
+	description = "When enabled, Things will no longer be scaled based on current zoom level in Classic modes.";
+	allowkeys = true;
+	allowmouse = false;
+	allowscroll = false;
+}
+
 togglebrightness //mxd
 {
 	title = "Toggle Full Brightness";
diff --git a/Source/Core/Resources/FixedThingsScale.png b/Source/Core/Resources/FixedThingsScale.png
new file mode 100644
index 0000000000000000000000000000000000000000..b94d1acfa5e05dfa73f72709313f50e6ec602796
GIT binary patch
literal 1595
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+*
zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn
zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU%v{0TQqR!T
z+}y-mN5ROz&{W^RSl`${*T~q)#K6kLNC66zfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj
z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5
zFD<cE0=g99h1>$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;Np<V
zf>iyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$IMft0!ZY(y
z^2>`g!FqgstvvIJOA_;vQ$1a5m4K$`WoD*Wxwsj+xtN)|xLBH*8ydQrIvN_8Ihz_d
zIT|^+8ap|g!t}c2Czs}?=9R$orXcjX;?xUD4!H$Dn_W_iGRsm^+=}vZ6~NxM%Eav!
zC!FR%^`_u<i!)BW`as9%gCZ9xvSC8N6a-?zlP-`0PyDHQz!YBuOxn&Ry|)<{m{xnb
zIEGZ*stJzu2u_r!J6E=Cao#!0<w9o6m%VuQX#Urjc%n|_hyn-KqP!#PR5W%^yzpw%
z?-kumO<htY%0WU?60;^fZM8Ht&G4O@UHtZY&hz!(*A%Br`+D&7;qSHYKYyru|K0A)
z^Q!4hYeGNYi*^zS6j5!}z2@Wmb6Jg>xWXgOCJonyL+(ry*Rn{oZ4{g$nD2IXv(-#K
zHV)~KiOPT9-C3Qyg7f2wj_w8xP4C7ByPkiIbf57qSS#|Zs!Y1+!xeP}n;&0Wd6&Jf
zeD+z33`553KvwNcPMzuIHD3ZBusz+gC`P>Sld))^NU%ld#B2M~dv!~<mivASs=kup
zY@n!ktUJI*rY3%wqEzvsGpn8-`mptz=2oH50}IT2YKw!{N3Y1u+x?_q+O675zRUNW
zXVh4?7+C1^?LTnjYuS;%_iC;^e05S+XX=(X)`+#YR~qXF=ALw3Jm2iK(FU8}eDm1%
zcCd$U{IG+6U9x!M{owu^mzG<#ZGNLXFM7R0{8Y(EE$cJP|2i36#O#xvm5HC?o9le^
z<>{F!H%~Z*i7fZKB_Qz9_;99Ev*60D`9D4;elU0RP`0t{xoYmOxO{Se3S&Tu+w+(E
z8SLi9eK^e~Q53Pphfnd@?B=VXyvOf}S!D4a4%;d}Nkeg~5kH5`|LF}9yk}fR(n1U(
zXC-V~u<W;8SI3Okcjm1O_E8g@CF}g@^^+M&9~MhDyPmy~;dFcN&TB3@|6<N)Zz}l7
zrxo6&vsB?zp-Ro?4j<lsU;1}cCmnpM{%c8^+f25_4zmsRZQl7`<#6QsBb5s~{f~G$
zGzf7!@l?96*vPN0b<_Ih&kK73)+%1@o*R1h?Nis=WhFDXy{vq<J<{8}^+QeH)&%jp
zEA2MC+^Ll|d!?iFs-A`ap1K(cFZa{`xM%jA8L8>l|Fitt@>!peje&n^n4bi%`T|gK
N?&<31vd$@?2>?X0VY&bS

literal 0
HcmV?d00001

diff --git a/Source/Core/Windows/MainForm.Designer.cs b/Source/Core/Windows/MainForm.Designer.cs
index 80a2556ac..5a440216d 100644
--- a/Source/Core/Windows/MainForm.Designer.cs
+++ b/Source/Core/Windows/MainForm.Designer.cs
@@ -181,6 +181,7 @@ namespace CodeImp.DoomBuilder.Windows
 			this.buttonviewceilings = new System.Windows.Forms.ToolStripButton();
 			this.seperatorviews = new System.Windows.Forms.ToolStripSeparator();
 			this.buttontogglecomments = new System.Windows.Forms.ToolStripButton();
+			this.buttontogglefixedthingsscale = new System.Windows.Forms.ToolStripButton();
 			this.buttonsnaptogrid = new System.Windows.Forms.ToolStripButton();
 			this.buttonautomerge = new System.Windows.Forms.ToolStripButton();
 			this.buttonautoclearsidetextures = new System.Windows.Forms.ToolStripButton();
@@ -255,6 +256,7 @@ namespace CodeImp.DoomBuilder.Windows
 			this.flowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();
 			this.modecontrolsloolbar = new System.Windows.Forms.ToolStrip();
 			this.itemtogglecomments = new System.Windows.Forms.ToolStripMenuItem();
+			this.itemtogglefixedthingsscale = new System.Windows.Forms.ToolStripMenuItem();
 			this.itemdynamicgridsize = new System.Windows.Forms.ToolStripMenuItem();
 			toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
 			toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
@@ -738,6 +740,7 @@ namespace CodeImp.DoomBuilder.Windows
             this.itemfullbrightness,
             this.itemtogglegrid,
             this.itemtogglecomments,
+			this.itemtogglefixedthingsscale,
             this.toolStripSeparator4,
             this.menuzoom,
             this.itemgotocoords,
@@ -1243,6 +1246,7 @@ namespace CodeImp.DoomBuilder.Windows
             this.buttonfullbrightness,
             this.buttontogglegrid,
             this.buttontogglecomments,
+			this.buttontogglefixedthingsscale,
             this.separatorfullbrightness,
             this.buttonviewnormal,
             this.buttonviewbrightness,
@@ -1658,6 +1662,19 @@ namespace CodeImp.DoomBuilder.Windows
 			this.buttontogglecomments.Text = "Show Comments";
 			this.buttontogglecomments.Click += new System.EventHandler(this.InvokeTaggedAction);
 			// 
+			// buttontogglefixedthingsscale
+			// 
+			this.buttontogglefixedthingsscale.Checked = true;
+			this.buttontogglefixedthingsscale.CheckState = System.Windows.Forms.CheckState.Checked;
+			this.buttontogglefixedthingsscale.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+			this.buttontogglefixedthingsscale.Image = global::CodeImp.DoomBuilder.Properties.Resources.FixedThingsScale;
+			this.buttontogglefixedthingsscale.ImageTransparentColor = System.Drawing.Color.Magenta;
+			this.buttontogglefixedthingsscale.Name = "buttontogglefixedthingsscale";
+			this.buttontogglefixedthingsscale.Size = new System.Drawing.Size(23, 22);
+			this.buttontogglefixedthingsscale.Tag = "builder_togglefixedthingsscale";
+			this.buttontogglefixedthingsscale.Text = "Fixed Things Scale";
+			this.buttontogglefixedthingsscale.Click += new System.EventHandler(this.InvokeTaggedAction);
+			// 
 			// buttonsnaptogrid
 			// 
 			this.buttonsnaptogrid.Checked = true;
@@ -2429,6 +2446,18 @@ namespace CodeImp.DoomBuilder.Windows
 			this.itemtogglecomments.Text = "Show Comments";
 			this.itemtogglecomments.Click += new System.EventHandler(this.InvokeTaggedAction);
 			// 
+			// itemtogglefixedthingsscale
+			// 
+			this.itemtogglefixedthingsscale.Checked = true;
+			this.itemtogglefixedthingsscale.CheckOnClick = true;
+			this.itemtogglefixedthingsscale.CheckState = System.Windows.Forms.CheckState.Checked;
+			this.itemtogglefixedthingsscale.Image = global::CodeImp.DoomBuilder.Properties.Resources.FixedThingsScale;
+			this.itemtogglefixedthingsscale.Name = "itemtogglefixedthingsscale";
+			this.itemtogglefixedthingsscale.Size = new System.Drawing.Size(215, 22);
+			this.itemtogglefixedthingsscale.Tag = "builder_togglefixedthingsscale";
+			this.itemtogglefixedthingsscale.Text = "Fixed Things Scale";
+			this.itemtogglefixedthingsscale.Click += new System.EventHandler(this.InvokeTaggedAction);
+			// 
 			// itemdynamicgridsize
 			// 
 			this.itemdynamicgridsize.Checked = true;
@@ -2694,6 +2723,7 @@ namespace CodeImp.DoomBuilder.Windows
 		private ToolStripMenuItem item2zoom800;
 		private ToolStripMenuItem itemzoom800;
 		private ToolStripButton buttontogglecomments;
+		private ToolStripButton buttontogglefixedthingsscale;
 		private ToolStripMenuItem itemlinedefcolors;
 		private ToolStripSeparator separatorlinecolors;
 		private ToolStripButton buttonlinededfcolors;
@@ -2704,5 +2734,6 @@ namespace CodeImp.DoomBuilder.Windows
 		private ToolStripButton buttontoggledynamicgrid;
 		private ToolStripMenuItem itemdynamicgridsize;
 		private ToolStripMenuItem itemtogglecomments;
+		private ToolStripMenuItem itemtogglefixedthingsscale;
 	}
 }
\ No newline at end of file
diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs
index c465a5a1b..81074154e 100644
--- a/Source/Core/Windows/MainForm.cs
+++ b/Source/Core/Windows/MainForm.cs
@@ -2021,6 +2021,8 @@ namespace CodeImp.DoomBuilder.Windows
 			buttontogglegrid.Checked = General.Settings.RenderGrid; //mxd
 			buttontogglecomments.Visible = General.Settings.ToolbarViewModes && maploaded && General.Map.UDMF; //mxd
 			buttontogglecomments.Checked = General.Settings.RenderComments; //mxd
+			buttontogglefixedthingsscale.Visible = General.Settings.ToolbarViewModes && maploaded; //mxd
+			buttontogglefixedthingsscale.Checked = General.Settings.FixedThingsScale; //mxd
 			separatorfullbrightness.Visible = General.Settings.ToolbarViewModes && maploaded; //mxd
 			buttonviewbrightness.Visible = General.Settings.ToolbarViewModes && maploaded;
 			buttonviewceilings.Visible = General.Settings.ToolbarViewModes && maploaded;
@@ -2764,6 +2766,19 @@ namespace CodeImp.DoomBuilder.Windows
 			RedrawDisplay();
 		}
 
+		//mxd. Action to toggle fixed things scale
+		[BeginAction("togglefixedthingsscale")]
+		internal void ToggleFixedThingsScale()
+		{
+			buttontogglefixedthingsscale.Checked = !buttontogglefixedthingsscale.Checked;
+			itemtogglefixedthingsscale.Checked = buttontogglefixedthingsscale.Checked;
+			General.Settings.FixedThingsScale = buttontogglefixedthingsscale.Checked;
+			DisplayStatus(StatusType.Action, "Fixed things scale is " + (buttontogglefixedthingsscale.Checked ? "ENABLED" : "DISABLED"));
+
+			// Redraw display to show changes
+			RedrawDisplay();
+		}
+
 		// Action to toggle snap to grid
 		[BeginAction("togglesnap")]
 		internal void ToggleSnapToGrid()
@@ -2864,6 +2879,8 @@ namespace CodeImp.DoomBuilder.Windows
 			itemtoggleinfo.Checked = IsInfoPanelExpanded;
 			itemtogglecomments.Visible = (General.Map != null && General.Map.UDMF); //mxd
 			itemtogglecomments.Checked = General.Settings.RenderComments; //mxd
+			itemtogglefixedthingsscale.Visible = (General.Map != null); //mxd
+			itemtogglefixedthingsscale.Checked = General.Settings.FixedThingsScale; //mxd
 			
 			// View mode items
 			if(General.Map != null)
diff --git a/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs
index bfb39f2fb..ca686ced3 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs
@@ -760,7 +760,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		{
 			if(t.Fields.ContainsKey("comment"))
 			{
-				float size = ((t.FixedSize && renderer.Scale > 1.0f) ? t.Size / renderer.Scale : t.Size);
+				float size = (((t.FixedSize || General.Settings.FixedThingsScale) && renderer.Scale > 1.0f) ? t.Size / renderer.Scale : t.Size);
 				if(size * renderer.Scale < 1.5f) return; // Thing is too small to render
 
 				int iconindex = 0;
-- 
GitLab