diff --git a/Source/Core/Config/ProgramConfiguration.cs b/Source/Core/Config/ProgramConfiguration.cs index 8d7bb019..839cd548 100755 --- a/Source/Core/Config/ProgramConfiguration.cs +++ b/Source/Core/Config/ProgramConfiguration.cs @@ -98,6 +98,8 @@ namespace CodeImp.DoomBuilder.Config private bool showfps; private int[] colordialogcustomcolors; private bool autolaunchontest; + private bool parallelizedlinedefplotting; + private bool parallelizedvertexplotting; //mxd. Script editor settings private string scriptfontname; @@ -214,6 +216,8 @@ namespace CodeImp.DoomBuilder.Config public bool ShowFPS { get { return showfps; } internal set { showfps = value; } } public int[] ColorDialogCustomColors { get { return colordialogcustomcolors; } internal set { colordialogcustomcolors = value; } } public bool AutoLaunchOnTest { get { return autolaunchontest; } internal set { autolaunchontest = value; } } + public bool ParallelizedLinedefPlotting { get { return parallelizedlinedefplotting; } internal set { parallelizedlinedefplotting = value; } } + public bool ParallelizedVertexPlotting { get { return parallelizedvertexplotting; } internal set { parallelizedvertexplotting = value; } } //mxd. Highlight mode public bool UseHighlight @@ -369,6 +373,8 @@ namespace CodeImp.DoomBuilder.Config switchviewmodes = cfg.ReadSetting("switchviewmodes", false); //mxd showfps = cfg.ReadSetting("showfps", false); autolaunchontest = cfg.ReadSetting("autolaunchontest", false); + parallelizedlinedefplotting = cfg.ReadSetting("parallelizedlinedefplotting", true); + parallelizedvertexplotting = cfg.ReadSetting("parallelizedvertexplotting", false); //mxd. Script editor scriptfontname = cfg.ReadSetting("scriptfontname", "Courier New"); diff --git a/Source/Core/Rendering/Renderer2D.cs b/Source/Core/Rendering/Renderer2D.cs index a836a5f7..3ba12766 100755 --- a/Source/Core/Rendering/Renderer2D.cs +++ b/Source/Core/Rendering/Renderer2D.cs @@ -19,7 +19,7 @@ using System; using System.Collections.Generic; using System.Drawing; -using System.Net; +using System.Threading.Tasks; using CodeImp.DoomBuilder.Map; using CodeImp.DoomBuilder.Geometry; using CodeImp.DoomBuilder.Data; @@ -2129,37 +2129,77 @@ namespace CodeImp.DoomBuilder.Rendering // This renders a set of linedefs public void PlotLinedefSet(ICollection linedefs) { - // Go for all linedefs - foreach(Linedef l in linedefs) + // biwa. Code duplication because the performance hit from the overhead of calling PlotLinedef in a loop causes reduced FPS. + // Telling the compiler to agressively inline PlotLinedef seems to mostly alleviate the problem, but I'm not sure how reliable that is + if (General.Settings.ParallelizedLinedefPlotting) { - // Transform vertex coordinates - Vector2D v1 = l.Start.Position.GetTransformed(translatex, translatey, scale, -scale); - Vector2D v2 = l.End.Position.GetTransformed(translatex, translatey, scale, -scale); + // Go for all linedefs + Parallel.ForEach(linedefs, l => + { + // Transform vertex coordinates + Vector2D v1 = l.Start.Position.GetTransformed(translatex, translatey, scale, -scale); + Vector2D v2 = l.End.Position.GetTransformed(translatex, translatey, scale, -scale); - //mxd. Should we bother? - double lengthsq = (v2 - v1).GetLengthSq(); - if(lengthsq < minlinelength) continue; //mxd + //mxd. Should we bother? + double lengthsq = (v2 - v1).GetLengthSq(); + if (lengthsq < minlinelength) return; //mxd - // Determine color - PixelColor c = DetermineLinedefColor(l); + // Determine color + PixelColor c = DetermineLinedefColor(l); - // Draw line. mxd: added 3d-floor indication - if(l.ExtraFloorFlag && General.Settings.GZMarkExtraFloors) - plotter.DrawLine3DFloor((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c, General.Colors.ThreeDFloor); - else - plotter.DrawLineSolid((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c); + // Draw line. mxd: added 3d-floor indication + if (l.ExtraFloorFlag && General.Settings.GZMarkExtraFloors) + plotter.DrawLine3DFloor((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c, General.Colors.ThreeDFloor); + else + plotter.DrawLineSolid((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c); - //mxd. Should we bother? - if(lengthsq < minlinenormallength) continue; //mxd + //mxd. Should we bother? + if (lengthsq < minlinenormallength) return; //mxd - // Calculate normal indicator - double mx = (v2.x - v1.x) * 0.5f; - double my = (v2.y - v1.y) * 0.5f; + // Calculate normal indicator + double mx = (v2.x - v1.x) * 0.5f; + double my = (v2.y - v1.y) * 0.5f; - // Draw normal indicator - plotter.DrawLineSolid((int)(v1.x + mx), TransformY((int)(v1.y + my)), - (int)((v1.x + mx) - (my * l.LengthInv) * linenormalsize), - TransformY((int)((v1.y + my) + (mx * l.LengthInv) * linenormalsize)), ref c); + // Draw normal indicator + plotter.DrawLineSolid((int)(v1.x + mx), TransformY((int)(v1.y + my)), + (int)((v1.x + mx) - (my * l.LengthInv) * linenormalsize), + TransformY((int)((v1.y + my) + (mx * l.LengthInv) * linenormalsize)), ref c); + }); + } + else + { + // Go for all linedefs + foreach (Linedef l in linedefs) + { + // Transform vertex coordinates + Vector2D v1 = l.Start.Position.GetTransformed(translatex, translatey, scale, -scale); + Vector2D v2 = l.End.Position.GetTransformed(translatex, translatey, scale, -scale); + + //mxd. Should we bother? + double lengthsq = (v2 - v1).GetLengthSq(); + if (lengthsq < minlinelength) continue; //mxd + + // Determine color + PixelColor c = DetermineLinedefColor(l); + + // Draw line. mxd: added 3d-floor indication + if (l.ExtraFloorFlag && General.Settings.GZMarkExtraFloors) + plotter.DrawLine3DFloor((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c, General.Colors.ThreeDFloor); + else + plotter.DrawLineSolid((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c); + + //mxd. Should we bother? + if (lengthsq < minlinenormallength) continue; //mxd + + // Calculate normal indicator + double mx = (v2.x - v1.x) * 0.5f; + double my = (v2.y - v1.y) * 0.5f; + + // Draw normal indicator + plotter.DrawLineSolid((int)(v1.x + mx), TransformY((int)(v1.y + my)), + (int)((v1.x + mx) - (my * l.LengthInv) * linenormalsize), + TransformY((int)((v1.y + my) + (mx * l.LengthInv) * linenormalsize)), ref c); + } } } @@ -2199,9 +2239,37 @@ namespace CodeImp.DoomBuilder.Rendering { return; } - - // Go for all vertices - foreach(Vertex v in vertices) PlotVertex(v, DetermineVertexColor(v)); + + // biwa. Code duplication because the performance hit from the overhead of calling PlotLinedef in a loop causes reduced FPS. + // Telling the compiler to agressively inline PlotLinedef seems to mostly alleviate the problem, but I'm not sure how reliable that is + if (General.Settings.ParallelizedVertexPlotting) + { + // Go for all vertices + Parallel.ForEach(vertices, v => + { + // Transform vertex coordinates + Vector2D nv = v.Position.GetTransformed(translatex, translatey, scale, -scale); + + int colorindex = DetermineVertexColor(v); + + // Draw pixel here + plotter.DrawVertexSolid((int)nv.x, TransformY((int)nv.y), vertexsize, ref General.Colors.Colors[colorindex], ref General.Colors.BrightColors[colorindex], ref General.Colors.DarkColors[colorindex]); + }); + } + else + { + // Go for all vertices + foreach (Vertex v in vertices) + { + // Transform vertex coordinates + Vector2D nv = v.Position.GetTransformed(translatex, translatey, scale, -scale); + + int colorindex = DetermineVertexColor(v); + + // Draw pixel here + plotter.DrawVertexSolid((int)nv.x, TransformY((int)nv.y), vertexsize, ref General.Colors.Colors[colorindex], ref General.Colors.BrightColors[colorindex], ref General.Colors.DarkColors[colorindex]); + } + } } #endregion diff --git a/Source/Core/Windows/PreferencesForm.Designer.cs b/Source/Core/Windows/PreferencesForm.Designer.cs index 095dfe9c..787bf2df 100755 --- a/Source/Core/Windows/PreferencesForm.Designer.cs +++ b/Source/Core/Windows/PreferencesForm.Designer.cs @@ -74,6 +74,8 @@ namespace CodeImp.DoomBuilder.Windows this.cbStretchView = new System.Windows.Forms.CheckBox(); this.scriptautoclosebrackets = new System.Windows.Forms.CheckBox(); this.scriptallmanstyle = new System.Windows.Forms.CheckBox(); + this.cbParallelizedLinedefPlotting = new System.Windows.Forms.CheckBox(); + this.cbParallelizedVertexPlotting = new System.Windows.Forms.CheckBox(); this.browseScreenshotsFolderDialog = new System.Windows.Forms.FolderBrowserDialog(); this.apply = new System.Windows.Forms.Button(); this.cancel = new System.Windows.Forms.Button(); @@ -657,7 +659,7 @@ namespace CodeImp.DoomBuilder.Windows // cbMarkExtraFloors // this.cbMarkExtraFloors.AutoSize = true; - this.cbMarkExtraFloors.Location = new System.Drawing.Point(18, 466); + this.cbMarkExtraFloors.Location = new System.Drawing.Point(18, 442); this.cbMarkExtraFloors.Name = "cbMarkExtraFloors"; this.cbMarkExtraFloors.Size = new System.Drawing.Size(175, 17); this.cbMarkExtraFloors.TabIndex = 1; @@ -669,7 +671,7 @@ namespace CodeImp.DoomBuilder.Windows // cbFlatShadeVertices // this.cbFlatShadeVertices.AutoSize = true; - this.cbFlatShadeVertices.Location = new System.Drawing.Point(18, 489); + this.cbFlatShadeVertices.Location = new System.Drawing.Point(18, 465); this.cbFlatShadeVertices.Name = "cbFlatShadeVertices"; this.cbFlatShadeVertices.Size = new System.Drawing.Size(115, 17); this.cbFlatShadeVertices.TabIndex = 1; @@ -703,7 +705,7 @@ namespace CodeImp.DoomBuilder.Windows // cbOldHighlightMode // this.cbOldHighlightMode.AutoSize = true; - this.cbOldHighlightMode.Location = new System.Drawing.Point(229, 443); + this.cbOldHighlightMode.Location = new System.Drawing.Point(229, 419); this.cbOldHighlightMode.Name = "cbOldHighlightMode"; this.cbOldHighlightMode.Size = new System.Drawing.Size(207, 17); this.cbOldHighlightMode.TabIndex = 15; @@ -715,7 +717,7 @@ namespace CodeImp.DoomBuilder.Windows // cbStretchView // this.cbStretchView.AutoSize = true; - this.cbStretchView.Location = new System.Drawing.Point(229, 397); + this.cbStretchView.Location = new System.Drawing.Point(229, 373); this.cbStretchView.Name = "cbStretchView"; this.cbStretchView.Size = new System.Drawing.Size(172, 17); this.cbStretchView.TabIndex = 13; @@ -747,6 +749,29 @@ namespace CodeImp.DoomBuilder.Windows this.toolTip1.SetToolTip(this.scriptallmanstyle, resources.GetString("scriptallmanstyle.ToolTip")); this.scriptallmanstyle.UseVisualStyleBackColor = true; // + // cbParallelizedLinedefPlotting + // + this.cbParallelizedLinedefPlotting.AutoSize = true; + this.cbParallelizedLinedefPlotting.Location = new System.Drawing.Point(229, 465); + this.cbParallelizedLinedefPlotting.Name = "cbParallelizedLinedefPlotting"; + this.cbParallelizedLinedefPlotting.Size = new System.Drawing.Size(150, 17); + this.cbParallelizedLinedefPlotting.TabIndex = 49; + this.cbParallelizedLinedefPlotting.Text = "Parallelized linedef plotting"; + this.toolTip1.SetToolTip(this.cbParallelizedLinedefPlotting, "Parallelizes linedef plotting over all logical CPU cores."); + this.cbParallelizedLinedefPlotting.UseVisualStyleBackColor = true; + // + // cbParallelizedVertexPlotting + // + this.cbParallelizedVertexPlotting.AutoSize = true; + this.cbParallelizedVertexPlotting.Location = new System.Drawing.Point(18, 488); + this.cbParallelizedVertexPlotting.Name = "cbParallelizedVertexPlotting"; + this.cbParallelizedVertexPlotting.Size = new System.Drawing.Size(148, 17); + this.cbParallelizedVertexPlotting.TabIndex = 50; + this.cbParallelizedVertexPlotting.Text = "Parallelized vertex plotting"; + this.toolTip1.SetToolTip(this.cbParallelizedVertexPlotting, "Parallelizes vertex plotting over all logical CPU cores. Can result in vertices c" + + "lose to each other flickering when panning the view"); + this.cbParallelizedVertexPlotting.UseVisualStyleBackColor = true; + // // browseScreenshotsFolderDialog // this.browseScreenshotsFolderDialog.Description = "Select a Folder to Save Screenshots Into"; @@ -1468,6 +1493,8 @@ namespace CodeImp.DoomBuilder.Windows this.appearancegroup1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.appearancegroup1.Controls.Add(this.cbParallelizedVertexPlotting); + this.appearancegroup1.Controls.Add(this.cbParallelizedLinedefPlotting); this.appearancegroup1.Controls.Add(this.activethingsalphalabel); this.appearancegroup1.Controls.Add(this.label31); this.appearancegroup1.Controls.Add(this.cbMarkExtraFloors); @@ -1593,7 +1620,7 @@ namespace CodeImp.DoomBuilder.Windows // cbShowFPS // this.cbShowFPS.AutoSize = true; - this.cbShowFPS.Location = new System.Drawing.Point(229, 466); + this.cbShowFPS.Location = new System.Drawing.Point(229, 442); this.cbShowFPS.Name = "cbShowFPS"; this.cbShowFPS.Size = new System.Drawing.Size(148, 17); this.cbShowFPS.TabIndex = 15; @@ -1612,7 +1639,7 @@ namespace CodeImp.DoomBuilder.Windows // qualitydisplay // this.qualitydisplay.AutoSize = true; - this.qualitydisplay.Location = new System.Drawing.Point(18, 397); + this.qualitydisplay.Location = new System.Drawing.Point(18, 373); this.qualitydisplay.Name = "qualitydisplay"; this.qualitydisplay.Size = new System.Drawing.Size(128, 17); this.qualitydisplay.TabIndex = 10; @@ -1666,7 +1693,7 @@ namespace CodeImp.DoomBuilder.Windows // animatevisualselection // this.animatevisualselection.AutoSize = true; - this.animatevisualselection.Location = new System.Drawing.Point(229, 420); + this.animatevisualselection.Location = new System.Drawing.Point(229, 396); this.animatevisualselection.Name = "animatevisualselection"; this.animatevisualselection.Size = new System.Drawing.Size(190, 17); this.animatevisualselection.TabIndex = 14; @@ -1709,7 +1736,7 @@ namespace CodeImp.DoomBuilder.Windows // visualbilinear // this.visualbilinear.AutoSize = true; - this.visualbilinear.Location = new System.Drawing.Point(18, 443); + this.visualbilinear.Location = new System.Drawing.Point(18, 419); this.visualbilinear.Name = "visualbilinear"; this.visualbilinear.Size = new System.Drawing.Size(171, 17); this.visualbilinear.TabIndex = 12; @@ -1719,7 +1746,7 @@ namespace CodeImp.DoomBuilder.Windows // classicbilinear // this.classicbilinear.AutoSize = true; - this.classicbilinear.Location = new System.Drawing.Point(18, 420); + this.classicbilinear.Location = new System.Drawing.Point(18, 396); this.classicbilinear.Name = "classicbilinear"; this.classicbilinear.Size = new System.Drawing.Size(176, 17); this.classicbilinear.TabIndex = 11; @@ -2848,5 +2875,7 @@ namespace CodeImp.DoomBuilder.Windows private System.Windows.Forms.ListView lvToastActions; private System.Windows.Forms.ColumnHeader title; private System.Windows.Forms.ColumnHeader description; + private System.Windows.Forms.CheckBox cbParallelizedVertexPlotting; + private System.Windows.Forms.CheckBox cbParallelizedLinedefPlotting; } } \ No newline at end of file diff --git a/Source/Core/Windows/PreferencesForm.cs b/Source/Core/Windows/PreferencesForm.cs index 5ee072eb..88cc3b72 100755 --- a/Source/Core/Windows/PreferencesForm.cs +++ b/Source/Core/Windows/PreferencesForm.cs @@ -99,6 +99,8 @@ namespace CodeImp.DoomBuilder.Windows cbShowFPS.Checked = General.Settings.ShowFPS; autolaunchontest.Checked = General.Settings.AutoLaunchOnTest; cbFlatShadeVertices.Checked = General.Settings.FlatShadeVertices; + cbParallelizedLinedefPlotting.Checked = General.Settings.ParallelizedLinedefPlotting; + cbParallelizedVertexPlotting.Checked = General.Settings.ParallelizedVertexPlotting; //mxd locatetexturegroup.Checked = General.Settings.LocateTextureGroup; @@ -360,6 +362,8 @@ namespace CodeImp.DoomBuilder.Windows General.Settings.ShowFPS = cbShowFPS.Checked; General.Settings.AutoLaunchOnTest = autolaunchontest.Checked; General.Settings.FlatShadeVertices = cbFlatShadeVertices.Checked; + General.Settings.ParallelizedLinedefPlotting = cbParallelizedLinedefPlotting.Checked; + General.Settings.ParallelizedVertexPlotting = cbParallelizedVertexPlotting.Checked; // Script settings General.Settings.ScriptFontBold = scriptfontbold.Checked;