diff --git a/Source/Core/VisualModes/VisualGeometry.cs b/Source/Core/VisualModes/VisualGeometry.cs index 348ce5d6..1a45d4ed 100644 --- a/Source/Core/VisualModes/VisualGeometry.cs +++ b/Source/Core/VisualModes/VisualGeometry.cs @@ -155,6 +155,7 @@ namespace CodeImp.DoomBuilder.VisualModes triangles = vertices.Length / 3; CalculateNormals(); //mxd + PerformAutoSelection(); //mxd } else { @@ -266,6 +267,9 @@ namespace CodeImp.DoomBuilder.VisualModes return false; } + //mxd + protected abstract void PerformAutoSelection(); + #endregion } diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs index 84a02257..ea763683 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs @@ -67,7 +67,8 @@ namespace CodeImp.DoomBuilder.BuilderModes private int prevoffsety; // want to calculate with delta offsets to prevent // inaccuracy in the dragging. - private static List updateList; //mxd + private static List updatelist; //mxd + protected bool performautoselection; //mxd #endregion @@ -98,6 +99,19 @@ namespace CodeImp.DoomBuilder.BuilderModes protected abstract void UpdateSkyRenderFlag(); //mxd public virtual void SelectNeighbours(bool select, bool withSameTexture, bool withSameHeight) { } //mxd + //mxd + override protected void PerformAutoSelection() + { + if(!performautoselection) return; + if(Triangles > 0) + { + this.selected = true; + mode.AddSelectedObject(this); + } + + performautoselection = false; + } + // This swaps triangles so that the plane faces the other way protected static void SwapTriangleVertices(WorldVertex[] verts) { @@ -774,12 +788,12 @@ namespace CodeImp.DoomBuilder.BuilderModes { //mxd List sectors = mode.GetSelectedSectors(); - updateList = new List(); + updatelist = new List(); foreach(Sector s in sectors) { if(mode.VisualSectorExists(s)) - updateList.Add((BaseVisualSector)mode.GetVisualSector(s)); + updatelist.Add((BaseVisualSector)mode.GetVisualSector(s)); } General.Interface.OnEditFormValuesChanged += Interface_OnEditFormValuesChanged; //mxd @@ -788,8 +802,8 @@ namespace CodeImp.DoomBuilder.BuilderModes mode.StopRealtimeInterfaceUpdate(SelectionType.Sectors); //mxd General.Interface.OnEditFormValuesChanged -= Interface_OnEditFormValuesChanged; //mxd - updateList.Clear(); //mxd - updateList = null; //mxd + updatelist.Clear(); //mxd + updatelist = null; //mxd if(result == DialogResult.OK) mode.RebuildElementData(); //mxd } @@ -798,7 +812,7 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd private void Interface_OnEditFormValuesChanged(object sender, EventArgs e) { - foreach(BaseVisualSector vs in updateList) vs.UpdateSectorGeometry(true); + foreach(BaseVisualSector vs in updatelist) vs.UpdateSectorGeometry(true); } // Sector height change diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs index 96b453e8..c0450c52 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs @@ -61,7 +61,8 @@ namespace CodeImp.DoomBuilder.BuilderModes private int prevoffsetx; // We have to provide delta offsets, but I don't private int prevoffsety; // want to calculate with delta offsets to prevent // inaccuracy in the dragging. - private static List updateList; //mxd + private static List updatelist; //mxd + private bool performautoselection; //mxd // Undo/redo private int undoticket; @@ -84,19 +85,36 @@ namespace CodeImp.DoomBuilder.BuilderModes this.deltaz = new Vector3D(0.0f, 0.0f, 1.0f); this.deltaxy = (sd.Line.End.Position - sd.Line.Start.Position) * sd.Line.LengthInv; if(!sd.IsFront) this.deltaxy = -this.deltaxy; - - //mxd - if(mode.UseSelectionFromClassicMode && sd.Line.Selected) - { - this.selected = true; - mode.AddSelectedObject(this); - } + this.performautoselection = (mode.UseSelectionFromClassicMode && sd.Line.Selected); //mxd } #endregion #region ================== Methods + //mxd + override protected void PerformAutoSelection() + { + if(!performautoselection) return; + if(Triangles > 0) + { + dragstartanglexy = General.Map.VisualCamera.AngleXY; + dragstartanglez = General.Map.VisualCamera.AngleZ; + dragorigin = pickintersect; + + Point texoffset = GetTextureOffset(); + startoffsetx = texoffset.X; + startoffsety = texoffset.Y; + prevoffsetx = texoffset.X; + prevoffsety = texoffset.Y; + + this.selected = true; + mode.AddSelectedObject(this); + } + + performautoselection = false; + } + // This sets the renderstyle from linedef information and returns the alpha value or the vertices protected byte SetLinedefRenderstyle(bool solidasmask) { @@ -1164,10 +1182,12 @@ namespace CodeImp.DoomBuilder.BuilderModes dragstartanglexy = General.Map.VisualCamera.AngleXY; dragstartanglez = General.Map.VisualCamera.AngleZ; dragorigin = pickintersect; - startoffsetx = GetTextureOffset().X; - startoffsety = GetTextureOffset().Y; - prevoffsetx = GetTextureOffset().X; - prevoffsety = GetTextureOffset().Y; + + Point texoffset = GetTextureOffset(); //mxd + startoffsetx = texoffset.X; + startoffsety = texoffset.Y; + prevoffsetx = texoffset.X; + prevoffsety = texoffset.Y; } // Select button released @@ -1203,13 +1223,13 @@ namespace CodeImp.DoomBuilder.BuilderModes if(General.Interface.IsActiveWindow) { List linedefs = mode.GetSelectedLinedefs(); - updateList = new List(); //mxd + updatelist = new List(); //mxd foreach(Linedef l in linedefs) { if(l.Front != null && mode.VisualSectorExists(l.Front.Sector)) - updateList.Add((BaseVisualSector)mode.GetVisualSector(l.Front.Sector)); + updatelist.Add((BaseVisualSector)mode.GetVisualSector(l.Front.Sector)); if(l.Back != null && mode.VisualSectorExists(l.Back.Sector)) - updateList.Add((BaseVisualSector)mode.GetVisualSector(l.Back.Sector)); + updatelist.Add((BaseVisualSector)mode.GetVisualSector(l.Back.Sector)); } General.Interface.OnEditFormValuesChanged += Interface_OnEditFormValuesChanged; @@ -1218,8 +1238,8 @@ namespace CodeImp.DoomBuilder.BuilderModes mode.StopRealtimeInterfaceUpdate(SelectionType.Linedefs); General.Interface.OnEditFormValuesChanged -= Interface_OnEditFormValuesChanged; - updateList.Clear(); - updateList = null; + updatelist.Clear(); + updatelist = null; //mxd. Effects may need updating... if(result == DialogResult.OK) mode.RebuildElementData(); @@ -1229,7 +1249,7 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd private void Interface_OnEditFormValuesChanged(object sender, EventArgs e) { - foreach(BaseVisualSector vs in updateList) vs.UpdateSectorGeometry(false); + foreach(BaseVisualSector vs in updatelist) vs.UpdateSectorGeometry(false); } // Mouse moves diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs index e6ebb9d5..1a2720c1 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs @@ -1610,20 +1610,20 @@ namespace CodeImp.DoomBuilder.BuilderModes List objs = new List(); foreach(IVisualEventReceiver i in selectedobjects) { - if((i is BaseVisualGeometrySector) && includesectors) objs.Add(i); - else if((i is BaseVisualGeometrySidedef) && includesidedefs) objs.Add(i); - else if((i is BaseVisualThing) && includethings) objs.Add(i); - else if((i is BaseVisualVertex) && includevertices) objs.Add(i);//mxd + if(includesectors && (i is BaseVisualGeometrySector) /*&& ((BaseVisualGeometrySector)i).Triangles > 0*/) objs.Add(i); + else if(includesidedefs && (i is BaseVisualGeometrySidedef) /*&& ((BaseVisualGeometrySidedef)i).Triangles > 0*/) objs.Add(i); + else if(includethings && (i is BaseVisualThing)) objs.Add(i); + else if(includevertices && (i is BaseVisualVertex)) objs.Add(i); //mxd } // Add highlight? if(selectedobjects.Count == 0) { IVisualEventReceiver i = (target.picked as IVisualEventReceiver); - if((i is BaseVisualGeometrySector) && includesectors) objs.Add(i); - else if((i is BaseVisualGeometrySidedef) && includesidedefs) objs.Add(i); - else if((i is BaseVisualThing) && includethings) objs.Add(i); - else if((i is BaseVisualVertex) && includevertices) objs.Add(i);//mxd + if(includesectors && (i is BaseVisualGeometrySector) /*&& ((BaseVisualGeometrySector)i).Triangles > 0*/) objs.Add(i); + else if(includesidedefs && (i is BaseVisualGeometrySidedef) /*&& ((BaseVisualGeometrySidedef)i).Triangles > 0*/) objs.Add(i); + else if(includethings && (i is BaseVisualThing)) objs.Add(i); + else if(includevertices && (i is BaseVisualVertex)) objs.Add(i); //mxd } return objs; diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs index d6c5ebca..718d53e3 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs @@ -40,7 +40,7 @@ namespace CodeImp.DoomBuilder.BuilderModes #region ================== Variables - public bool innerSide; //mxd + private bool innerside; //mxd #endregion @@ -56,13 +56,7 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd geometrytype = VisualGeometryType.CEILING; partname = "ceiling"; - - //mxd - if(mode.UseSelectionFromClassicMode && vs != null && vs.Sector.Selected && (General.Map.ViewMode == ViewMode.CeilingTextures || General.Map.ViewMode == ViewMode.Normal)) - { - this.selected = true; - mode.AddSelectedObject(this); - } + performautoselection = mode.UseSelectionFromClassicMode && vs != null && vs.Sector.Selected && (General.Map.ViewMode == ViewMode.CeilingTextures || General.Map.ViewMode == ViewMode.Normal); // We have no destructor GC.SuppressFinalize(this); @@ -71,15 +65,15 @@ namespace CodeImp.DoomBuilder.BuilderModes // This builds the geometry. Returns false when no geometry created. public override bool Setup(SectorLevel level, Effect3DFloor extrafloor) { - return Setup(level, extrafloor, innerSide); + return Setup(level, extrafloor, innerside); } //mxd - public bool Setup(SectorLevel level, Effect3DFloor extrafloor, bool innerSide) + public bool Setup(SectorLevel level, Effect3DFloor extrafloor, bool innerside) { Sector s = level.sector; Vector2D texscale; - this.innerSide = innerSide; //mxd + this.innerside = innerside; //mxd base.Setup(level, extrafloor); @@ -169,7 +163,7 @@ namespace CodeImp.DoomBuilder.BuilderModes // The sector triangulation created clockwise triangles that // are right up for the floor. For the ceiling we must flip // the triangles upside down. - if(extrafloor == null || extrafloor.VavoomType || innerSide) + if(extrafloor == null || extrafloor.VavoomType || innerside) SwapTriangleVertices(verts); // Determine render pass @@ -457,7 +451,7 @@ namespace CodeImp.DoomBuilder.BuilderModes public override bool PickFastReject(Vector3D from, Vector3D to, Vector3D dir) { // Check if our ray starts at the correct side of the plane - if((innerSide && level.plane.Distance(from) < 0.0f) || (!innerSide && level.plane.Distance(from) > 0.0f)) //mxd + if((innerside && level.plane.Distance(from) < 0.0f) || (!innerside && level.plane.Distance(from) > 0.0f)) //mxd //if(level.plane.Distance(from) > 0.0f) { // Calculate the intersection diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs index 4ae95cfa..f87149ee 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs @@ -40,7 +40,7 @@ namespace CodeImp.DoomBuilder.BuilderModes #region ================== Variables - private bool innerSide; //mxd + private bool innerside; //mxd #endregion @@ -56,14 +56,7 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd geometrytype = VisualGeometryType.FLOOR; partname = "floor"; - - //mxd - if(mode.UseSelectionFromClassicMode && vs != null && vs.Sector.Selected - && (General.Map.ViewMode == ViewMode.FloorTextures || General.Map.ViewMode == ViewMode.Normal)) - { - this.selected = true; - mode.AddSelectedObject(this); - } + performautoselection = mode.UseSelectionFromClassicMode && vs != null && vs.Sector.Selected && (General.Map.ViewMode == ViewMode.FloorTextures || General.Map.ViewMode == ViewMode.Normal); // We have no destructor GC.SuppressFinalize(this); @@ -72,15 +65,15 @@ namespace CodeImp.DoomBuilder.BuilderModes // This builds the geometry. Returns false when no geometry created. public override bool Setup(SectorLevel level, Effect3DFloor extrafloor) { - return Setup(level, extrafloor, innerSide); + return Setup(level, extrafloor, innerside); } //mxd - public bool Setup(SectorLevel level, Effect3DFloor extrafloor, bool innerSide) + public bool Setup(SectorLevel level, Effect3DFloor extrafloor, bool innerside) { Sector s = level.sector; Vector2D texscale; - this.innerSide = innerSide; + this.innerside = innerside; base.Setup(level, extrafloor); @@ -171,7 +164,7 @@ namespace CodeImp.DoomBuilder.BuilderModes // The sector triangulation created clockwise triangles that // are right up for the floor. For the ceiling we must flip // the triangles upside down. - if((extrafloor != null) && !extrafloor.VavoomType && !innerSide) + if((extrafloor != null) && !extrafloor.VavoomType && !innerside) SwapTriangleVertices(verts); // Determine render pass @@ -411,7 +404,7 @@ namespace CodeImp.DoomBuilder.BuilderModes public override bool PickFastReject(Vector3D from, Vector3D to, Vector3D dir) { // Check if our ray starts at the correct side of the plane - if((!innerSide && level.plane.Distance(from) > 0.0f) || (innerSide && level.plane.Distance(from) < 0.0f)) + if((!innerside && level.plane.Distance(from) > 0.0f) || (innerside && level.plane.Distance(from) < 0.0f)) { // Calculate the intersection if(level.plane.GetIntersection(from, to, ref pickrayu))