mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-30 07:31:36 +00:00
Visual mode: "Select" action with "with the same textures" / "with the same height" modifiers (Shift/Ctrl + LMB) now works when used on sides of a 3d floor.
Visual mode: "Select" action with "with the same textures" modifier (Shift + LMB) now selects adjacent sidedefs only when their height intersects with the height of the current sidedef. Visual mode: "Select" action with "with the same textures" modifier (Shift + LMB) was not selecting connected one-sided sidedefs when used on a sidedef without a texture. Cosmetic: fixed a couple of action descriptions in BuilderModes' Actions.cfg. Cosmetic: MainForm.UpdateToolStripSeparators was working incorrectly in some cases. Cosmetic: ErrorChecksForm's title was not updated when no errors were found.
This commit is contained in:
parent
3c116da322
commit
5d8e62f887
8 changed files with 232 additions and 76 deletions
|
@ -42,7 +42,6 @@ namespace CodeImp.DoomBuilder.VisualModes
|
||||||
|
|
||||||
// Desired modulate color
|
// Desired modulate color
|
||||||
private PixelColor modulatecolor;
|
private PixelColor modulatecolor;
|
||||||
private Color4 modcolor4;
|
|
||||||
|
|
||||||
// Selected?
|
// Selected?
|
||||||
protected bool selected;
|
protected bool selected;
|
||||||
|
@ -81,7 +80,6 @@ namespace CodeImp.DoomBuilder.VisualModes
|
||||||
internal int VertexOffset { get { return vertexoffset; } set { vertexoffset = value; } }
|
internal int VertexOffset { get { return vertexoffset; } set { vertexoffset = value; } }
|
||||||
internal int Triangles { get { return triangles; } }
|
internal int Triangles { get { return triangles; } }
|
||||||
internal int RenderPassInt { get { return renderpass; } }
|
internal int RenderPassInt { get { return renderpass; } }
|
||||||
internal Color4 ModColor4 { get { return modcolor4; } }
|
|
||||||
|
|
||||||
//mxd
|
//mxd
|
||||||
public Vector3[] BoundingBox { get { return boundingBox; } }
|
public Vector3[] BoundingBox { get { return boundingBox; } }
|
||||||
|
@ -100,7 +98,7 @@ namespace CodeImp.DoomBuilder.VisualModes
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Color to modulate the texture pixels with.
|
/// Color to modulate the texture pixels with.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public PixelColor ModulateColor { get { return modulatecolor; } set { modcolor4 = value.ToColorValue(); modulatecolor = value; } }
|
public PixelColor ModulateColor { get { return modulatecolor; } set { modulatecolor = value; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the VisualSector this geometry has been added to.
|
/// Returns the VisualSector this geometry has been added to.
|
||||||
|
@ -248,7 +246,8 @@ namespace CodeImp.DoomBuilder.VisualModes
|
||||||
}
|
}
|
||||||
|
|
||||||
//mxd
|
//mxd
|
||||||
public enum VisualGeometryType{
|
public enum VisualGeometryType
|
||||||
|
{
|
||||||
FLOOR,
|
FLOOR,
|
||||||
CEILING,
|
CEILING,
|
||||||
WALL_UPPER,
|
WALL_UPPER,
|
||||||
|
|
|
@ -1767,7 +1767,7 @@ namespace CodeImp.DoomBuilder.Windows
|
||||||
{
|
{
|
||||||
if (i is ToolStripSeparator)
|
if (i is ToolStripSeparator)
|
||||||
{
|
{
|
||||||
i.Visible = !(pvi != null && (!pvi.Visible || pvi is ToolStripSeparator));
|
i.Visible = !(pvi == null || (!pvi.Visible || pvi is ToolStripSeparator));
|
||||||
}
|
}
|
||||||
|
|
||||||
pvi = i;
|
pvi = i;
|
||||||
|
|
|
@ -275,6 +275,7 @@
|
||||||
<Compile Include="FindReplace\FindThingType.cs" />
|
<Compile Include="FindReplace\FindThingType.cs" />
|
||||||
<Compile Include="FindReplace\FindVertexNumber.cs" />
|
<Compile Include="FindReplace\FindVertexNumber.cs" />
|
||||||
<Compile Include="General\HintLabel.cs" />
|
<Compile Include="General\HintLabel.cs" />
|
||||||
|
<Compile Include="General\BuilderModesTools.cs" />
|
||||||
<Compile Include="General\UndoGroup.cs" />
|
<Compile Include="General\UndoGroup.cs" />
|
||||||
<Compile Include="Interface\BridgeModeForm.cs">
|
<Compile Include="Interface\BridgeModeForm.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
|
|
73
Source/Plugins/BuilderModes/General/BuilderModesTools.cs
Normal file
73
Source/Plugins/BuilderModes/General/BuilderModesTools.cs
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
#region ================== Namespaces
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Drawing;
|
||||||
|
using CodeImp.DoomBuilder.Map;
|
||||||
|
using CodeImp.DoomBuilder.VisualModes;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
|
{
|
||||||
|
public static class BuilderModesTools
|
||||||
|
{
|
||||||
|
#region ================== Sidedef
|
||||||
|
|
||||||
|
internal static Rectangle GetSidedefPartSize(BaseVisualGeometrySidedef side, VisualGeometryType type)
|
||||||
|
{
|
||||||
|
if(type == VisualGeometryType.WALL_MIDDLE_3D)
|
||||||
|
{
|
||||||
|
Rectangle rect = new Rectangle(0, 0, 1, 0);
|
||||||
|
Linedef cl = side.GetControlLinedef();
|
||||||
|
if(cl.Front != null && cl.Front.Sector != null) {
|
||||||
|
rect.Y = cl.Front.Sector.FloorHeight;
|
||||||
|
rect.Height = cl.Front.GetMiddleHeight();
|
||||||
|
} else {
|
||||||
|
rect.Y = side.Sidedef.Sector.FloorHeight;
|
||||||
|
rect.Height = side.Sidedef.GetMiddleHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetSidedefPartSize(side.Sidedef, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Rectangle GetSidedefPartSize(Sidedef side, VisualGeometryType type)
|
||||||
|
{
|
||||||
|
Rectangle rect = new Rectangle(0, 0, 1, 0);
|
||||||
|
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case VisualGeometryType.WALL_LOWER:
|
||||||
|
rect.Y = side.Sector.FloorHeight;
|
||||||
|
rect.Height = side.GetLowHeight();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VisualGeometryType.WALL_UPPER:
|
||||||
|
if(side.Other != null && side.Other.Sector != null)
|
||||||
|
{
|
||||||
|
rect.Y = side.Other.Sector.CeilHeight;
|
||||||
|
rect.Height = side.GetHighHeight();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rect.Height = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VisualGeometryType.WALL_MIDDLE:
|
||||||
|
rect.Y = side.Sector.FloorHeight;
|
||||||
|
rect.Height = side.GetMiddleHeight();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new NotImplementedException("GetSidedefPartSize: got unsupported geometry type: '" + type + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
|
@ -199,6 +199,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
running = false;
|
running = false;
|
||||||
blockmap.Dispose();
|
blockmap.Dispose();
|
||||||
blockmap = null;
|
blockmap = null;
|
||||||
|
UpdateTitle(); //mxd
|
||||||
|
|
||||||
// When no results found, show "no results" and disable the list
|
// When no results found, show "no results" and disable the list
|
||||||
if(resultslist.Count == 0) {
|
if(resultslist.Count == 0) {
|
||||||
|
|
|
@ -986,7 +986,7 @@ resettexture
|
||||||
{
|
{
|
||||||
title = "Reset Texture Offsets";
|
title = "Reset Texture Offsets";
|
||||||
category = "visual";
|
category = "visual";
|
||||||
description = "Resets the texture offsets on the targeted or selected sidedef to 0, 0.";
|
description = "Resets the texture offsets on the targeted or selected sidedef.";
|
||||||
allowkeys = true;
|
allowkeys = true;
|
||||||
allowmouse = true;
|
allowmouse = true;
|
||||||
allowscroll = true;
|
allowscroll = true;
|
||||||
|
@ -997,7 +997,7 @@ resettextureudmf
|
||||||
{
|
{
|
||||||
title = "Reset Local Texture Offsets (UDMF)";
|
title = "Reset Local Texture Offsets (UDMF)";
|
||||||
category = "visual";
|
category = "visual";
|
||||||
description = "Resets upper/middle/lower texture offsets on the targeted or selected sidedef to 0, 0. Also resets sidedef's scale and floor/ceiling's scale and rotation.";
|
description = "Resets upper/middle/lower texture offsets and scale on the targeted or selected sidedef. Resets texture offsets, rotation and scale on targeted or selected floors/ceilings.";
|
||||||
allowkeys = true;
|
allowkeys = true;
|
||||||
allowmouse = true;
|
allowmouse = true;
|
||||||
allowscroll = true;
|
allowscroll = true;
|
||||||
|
@ -1093,7 +1093,7 @@ pastepropertiesoptions
|
||||||
{
|
{
|
||||||
title = "Paste Properties Options";
|
title = "Paste Properties Options";
|
||||||
category = "edit";
|
category = "edit";
|
||||||
description = "Opens a window, which lets you pick properties for 'Copy Properties' and 'Paste Properties' actions.";
|
description = "Opens a window, which lets you pick which properties to paste using 'Paste Properties' action.";
|
||||||
allowkeys = true;
|
allowkeys = true;
|
||||||
allowmouse = false;
|
allowmouse = false;
|
||||||
allowscroll = false;
|
allowscroll = false;
|
||||||
|
|
|
@ -397,13 +397,20 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
}
|
}
|
||||||
|
|
||||||
//mxd
|
//mxd
|
||||||
protected void selectNeighbours(string texture, bool select, bool withSameTexture, bool withSameHeight) {
|
protected void selectNeighbours(string texture, bool select, bool withSameTexture, bool withSameHeight)
|
||||||
|
{
|
||||||
if(Sidedef.Sector == null || (!withSameTexture && !withSameHeight)) return;
|
if(Sidedef.Sector == null || (!withSameTexture && !withSameHeight)) return;
|
||||||
|
|
||||||
if(select && !selected) {
|
Rectangle rect = BuilderModesTools.GetSidedefPartSize(this, geoType);
|
||||||
|
if(rect.Height == 0) return;
|
||||||
|
|
||||||
|
if(select && !selected)
|
||||||
|
{
|
||||||
selected = true;
|
selected = true;
|
||||||
mode.AddSelectedObject(this);
|
mode.AddSelectedObject(this);
|
||||||
} else if(!select && selected) {
|
}
|
||||||
|
else if(!select && selected)
|
||||||
|
{
|
||||||
selected = false;
|
selected = false;
|
||||||
mode.RemoveSelectedObject(this);
|
mode.RemoveSelectedObject(this);
|
||||||
}
|
}
|
||||||
|
@ -411,43 +418,20 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
//select
|
//select
|
||||||
List<Linedef> connectedLines = new List<Linedef>();
|
List<Linedef> connectedLines = new List<Linedef>();
|
||||||
|
|
||||||
foreach(Linedef line in Sidedef.Line.Start.Linedefs) {
|
foreach(Linedef line in Sidedef.Line.Start.Linedefs)
|
||||||
|
{
|
||||||
if(line.Index == Sidedef.Line.Index) continue;
|
if(line.Index == Sidedef.Line.Index) continue;
|
||||||
connectedLines.Add(line);
|
connectedLines.Add(line);
|
||||||
}
|
}
|
||||||
foreach(Linedef line in Sidedef.Line.End.Linedefs) {
|
foreach(Linedef line in Sidedef.Line.End.Linedefs)
|
||||||
|
{
|
||||||
if(line.Index == Sidedef.Line.Index) continue;
|
if(line.Index == Sidedef.Line.Index) continue;
|
||||||
if(!connectedLines.Contains(line)) connectedLines.Add(line);
|
if(!connectedLines.Contains(line)) connectedLines.Add(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
int floorHeight = 0;
|
// Check connected lines
|
||||||
int ceilingHeight = 0;
|
foreach(Linedef line in connectedLines)
|
||||||
|
{
|
||||||
if (withSameHeight) {
|
|
||||||
bool haveBackSector = Sidedef.Other != null && Sidedef.Other.Sector != null;
|
|
||||||
|
|
||||||
if(geoType == VisualGeometryType.WALL_LOWER) {
|
|
||||||
floorHeight = Sidedef.Sector.FloorHeight;
|
|
||||||
ceilingHeight = (haveBackSector ? Sidedef.Other.Sector.FloorHeight : Sidedef.Sector.CeilHeight);
|
|
||||||
} else if(geoType == VisualGeometryType.WALL_UPPER) {
|
|
||||||
floorHeight = (haveBackSector ? Sidedef.Other.Sector.CeilHeight : Sidedef.Sector.FloorHeight);
|
|
||||||
ceilingHeight = Sidedef.Sector.CeilHeight;
|
|
||||||
} else if(geoType == VisualGeometryType.WALL_MIDDLE) {
|
|
||||||
floorHeight = Sidedef.Sector.FloorHeight;
|
|
||||||
ceilingHeight = Sidedef.Sector.CeilHeight;
|
|
||||||
} else { //should be WALL_MIDDLE_3D
|
|
||||||
Linedef cl = GetControlLinedef();
|
|
||||||
if(cl.Front != null && cl.Front.Sector != null) {
|
|
||||||
floorHeight = cl.Front.Sector.FloorHeight;
|
|
||||||
ceilingHeight = cl.Front.Sector.CeilHeight;
|
|
||||||
} else {
|
|
||||||
floorHeight = Sidedef.Sector.FloorHeight;
|
|
||||||
ceilingHeight = Sidedef.Sector.CeilHeight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach(Linedef line in connectedLines) {
|
|
||||||
bool addFrontTop = false;
|
bool addFrontTop = false;
|
||||||
bool addFrontMiddle = false;
|
bool addFrontMiddle = false;
|
||||||
bool addFrontBottom = false;
|
bool addFrontBottom = false;
|
||||||
|
@ -455,59 +439,150 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
bool addBackMiddle = false;
|
bool addBackMiddle = false;
|
||||||
bool addBackBottom = false;
|
bool addBackBottom = false;
|
||||||
|
|
||||||
if(withSameTexture) {
|
bool lineHasFrontSector = (line.Front != null && line.Front.Sector != null);
|
||||||
if(line.Front != null) {
|
bool lineHasBackSector = (line.Back != null && line.Back.Sector != null);
|
||||||
addFrontTop = (line.Front.HighTexture == texture && line.Front.HighRequired());
|
bool doublesided = (lineHasFrontSector && lineHasBackSector);
|
||||||
addFrontMiddle = (texture != "-" && line.Front.MiddleTexture == texture && line.Front.Sector.CeilHeight > line.Front.Sector.FloorHeight);
|
|
||||||
addFrontBottom = (line.Front.LowTexture == texture && line.Front.LowRequired());
|
List<VisualMiddle3D> extrasides = new List<VisualMiddle3D>();
|
||||||
|
|
||||||
|
// Gather 3d floor sides
|
||||||
|
if (doublesided)
|
||||||
|
{
|
||||||
|
BaseVisualSector s = mode.GetVisualSector(line.Front.Sector) as BaseVisualSector;
|
||||||
|
if (s != null) {
|
||||||
|
extrasides.AddRange(s.GetSidedefParts(line.Front).middle3d.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(line.Back != null) {
|
s = mode.GetVisualSector(line.Back.Sector) as BaseVisualSector;
|
||||||
addBackTop = (line.Back.HighTexture == texture && line.Back.HighRequired());
|
if(s != null) {
|
||||||
addBackMiddle = (texture != "-" && line.Back.MiddleTexture == texture && line.Back.Sector.CeilHeight > line.Back.Sector.FloorHeight);
|
extrasides.AddRange(s.GetSidedefParts(line.Back).middle3d.ToArray());
|
||||||
addBackBottom = (line.Back.LowTexture == texture && line.Back.LowRequired());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(withSameHeight) {
|
// Add regular sides
|
||||||
bool lineHasFrontSector = line.Front != null && line.Front.Sector != null;
|
if(withSameTexture)
|
||||||
bool lineHasBackSector = line.Back != null && line.Back.Sector != null;
|
{
|
||||||
|
if(line.Front != null)
|
||||||
|
{
|
||||||
|
addFrontTop = (line.Front.HighTexture == texture
|
||||||
|
&& line.Front.HighRequired()
|
||||||
|
&& BuilderModesTools.GetSidedefPartSize(line.Front, VisualGeometryType.WALL_UPPER).IntersectsWith(rect));
|
||||||
|
|
||||||
|
addFrontMiddle = (line.Front.MiddleTexture == texture
|
||||||
|
&& line.Front.MiddleRequired()
|
||||||
|
&& line.Front.GetMiddleHeight() > 0
|
||||||
|
&& BuilderModesTools.GetSidedefPartSize(line.Front, VisualGeometryType.WALL_MIDDLE).IntersectsWith(rect));
|
||||||
|
|
||||||
|
addFrontBottom = (line.Front.LowTexture == texture
|
||||||
|
&& line.Front.LowRequired()
|
||||||
|
&& BuilderModesTools.GetSidedefPartSize(line.Front, VisualGeometryType.WALL_LOWER).IntersectsWith(rect));
|
||||||
|
|
||||||
//upper parts match?
|
|
||||||
if((!withSameTexture || addFrontTop) && lineHasFrontSector && line.Front.HighRequired()) {
|
|
||||||
addFrontTop = (line.Front.Sector.CeilHeight == ceilingHeight && line.Back.Sector.CeilHeight == floorHeight);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if((!withSameTexture || addBackTop) && lineHasBackSector && line.Back.HighRequired()) {
|
if(line.Back != null)
|
||||||
addBackTop = (line.Back.Sector.CeilHeight == ceilingHeight && line.Front.Sector.CeilHeight == floorHeight);
|
{
|
||||||
|
addBackTop = (line.Back.HighTexture == texture
|
||||||
|
&& line.Back.HighRequired()
|
||||||
|
&& BuilderModesTools.GetSidedefPartSize(line.Back, VisualGeometryType.WALL_UPPER).IntersectsWith(rect));
|
||||||
|
|
||||||
|
addBackMiddle = (line.Back.MiddleTexture == texture
|
||||||
|
&& line.Back.MiddleRequired()
|
||||||
|
&& line.Back.GetMiddleHeight() > 0
|
||||||
|
&& BuilderModesTools.GetSidedefPartSize(line.Back, VisualGeometryType.WALL_MIDDLE).IntersectsWith(rect));
|
||||||
|
|
||||||
|
addBackBottom = (line.Back.LowTexture == texture
|
||||||
|
&& line.Back.LowRequired()
|
||||||
|
&& BuilderModesTools.GetSidedefPartSize(line.Back, VisualGeometryType.WALL_LOWER).IntersectsWith(rect));
|
||||||
}
|
}
|
||||||
|
|
||||||
//middle parts match?
|
// Add 3d floor sides
|
||||||
if((!withSameTexture || addFrontMiddle) && lineHasFrontSector && line.Front.Sector.CeilHeight > line.Front.Sector.FloorHeight) {
|
List<VisualMiddle3D> filtered = new List<VisualMiddle3D>();
|
||||||
addFrontMiddle = (line.Front.Sector.CeilHeight == ceilingHeight && line.Front.Sector.FloorHeight == floorHeight);
|
foreach(VisualMiddle3D side3d in extrasides)
|
||||||
}
|
{
|
||||||
|
Sidedef controlside = side3d.GetControlLinedef().Front;
|
||||||
if((!withSameTexture || addBackMiddle) && lineHasBackSector && line.Back.Sector.CeilHeight > line.Back.Sector.FloorHeight) {
|
if (controlside.MiddleTexture == texture && BuilderModesTools.GetSidedefPartSize(controlside, VisualGeometryType.WALL_MIDDLE).IntersectsWith(rect))
|
||||||
addBackMiddle = (line.Back.Sector.CeilHeight == ceilingHeight && line.Back.Sector.FloorHeight == floorHeight);
|
{
|
||||||
}
|
filtered.Add(side3d);
|
||||||
|
|
||||||
//lower parts match?
|
|
||||||
if((!withSameTexture || addFrontBottom) && lineHasFrontSector && line.Front.LowRequired()) {
|
|
||||||
addFrontBottom = (line.Back.Sector.FloorHeight == ceilingHeight && line.Front.Sector.FloorHeight == floorHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
if((!withSameTexture || addBackBottom) && lineHasBackSector && line.Back.LowRequired()) {
|
|
||||||
addBackBottom = (line.Front.Sector.FloorHeight == ceilingHeight && line.Back.Sector.FloorHeight == floorHeight);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//select front?
|
extrasides = filtered;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(withSameHeight && rect.Height > 0)
|
||||||
|
{
|
||||||
|
// Upper parts match?
|
||||||
|
if((!withSameTexture || addFrontTop) && doublesided && line.Front.HighRequired())
|
||||||
|
{
|
||||||
|
Rectangle r = BuilderModesTools.GetSidedefPartSize(line.Front, VisualGeometryType.WALL_UPPER);
|
||||||
|
addFrontTop = (rect.Height == r.Height && rect.Y == r.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
if((!withSameTexture || addBackTop) && doublesided && line.Back.HighRequired())
|
||||||
|
{
|
||||||
|
Rectangle r = BuilderModesTools.GetSidedefPartSize(line.Back, VisualGeometryType.WALL_UPPER);
|
||||||
|
addBackTop = (rect.Height == r.Height && rect.Y == r.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Middle parts match?
|
||||||
|
if((!withSameTexture || addFrontMiddle)
|
||||||
|
&& lineHasFrontSector
|
||||||
|
&& (line.Front.MiddleRequired() || line.Front.LongMiddleTexture != MapSet.EmptyLongName) )
|
||||||
|
{
|
||||||
|
Rectangle r = BuilderModesTools.GetSidedefPartSize(line.Front, VisualGeometryType.WALL_MIDDLE);
|
||||||
|
addFrontMiddle = (rect.Height == r.Height && rect.Y == r.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
if((!withSameTexture || addBackMiddle)
|
||||||
|
&& lineHasBackSector
|
||||||
|
&& (line.Back.MiddleRequired() || line.Back.LongMiddleTexture != MapSet.EmptyLongName))
|
||||||
|
{
|
||||||
|
Rectangle r = BuilderModesTools.GetSidedefPartSize(line.Back, VisualGeometryType.WALL_MIDDLE);
|
||||||
|
addBackMiddle = (rect.Height == r.Height && rect.Y == r.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lower parts match?
|
||||||
|
if((!withSameTexture || addFrontBottom) && doublesided && line.Front.LowRequired())
|
||||||
|
{
|
||||||
|
Rectangle r = BuilderModesTools.GetSidedefPartSize(line.Front, VisualGeometryType.WALL_LOWER);
|
||||||
|
addFrontBottom = (rect.Height == r.Height && rect.Y == r.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
if((!withSameTexture || addBackBottom) && doublesided && line.Back.LowRequired())
|
||||||
|
{
|
||||||
|
Rectangle r = BuilderModesTools.GetSidedefPartSize(line.Back, VisualGeometryType.WALL_LOWER);
|
||||||
|
addBackBottom = (rect.Height == r.Height && rect.Y == r.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3d floor parts match?
|
||||||
|
List<VisualMiddle3D> filtered = new List<VisualMiddle3D>();
|
||||||
|
foreach(VisualMiddle3D side3d in extrasides)
|
||||||
|
{
|
||||||
|
Sidedef controlside = side3d.GetControlLinedef().Front;
|
||||||
|
Rectangle r = BuilderModesTools.GetSidedefPartSize(controlside, VisualGeometryType.WALL_MIDDLE);
|
||||||
|
if(rect.Height == r.Height && rect.Y == r.Y)
|
||||||
|
{
|
||||||
|
filtered.Add(side3d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extrasides = filtered;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select front?
|
||||||
if(addFrontTop || addFrontMiddle || addFrontBottom)
|
if(addFrontTop || addFrontMiddle || addFrontBottom)
|
||||||
mode.SelectSideParts(line.Front, addFrontTop, addFrontMiddle, addFrontBottom, select, withSameTexture, withSameHeight);
|
mode.SelectSideParts(line.Front, addFrontTop, addFrontMiddle, addFrontBottom, select, withSameTexture, withSameHeight);
|
||||||
|
|
||||||
//select back?
|
// Select back?
|
||||||
if(addBackTop || addBackMiddle || addBackBottom)
|
if(addBackTop || addBackMiddle || addBackBottom)
|
||||||
mode.SelectSideParts(line.Back, addBackTop, addBackMiddle, addBackBottom, select, withSameTexture, withSameHeight);
|
mode.SelectSideParts(line.Back, addBackTop, addBackMiddle, addBackBottom, select, withSameTexture, withSameHeight);
|
||||||
|
|
||||||
|
// Select 3d floor sides?
|
||||||
|
foreach (VisualMiddle3D side3d in extrasides)
|
||||||
|
{
|
||||||
|
if( (select && !side3d.Selected) || (!select && side3d.Selected) )
|
||||||
|
side3d.SelectNeighbours(select, withSameTexture, withSameHeight);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -356,10 +356,17 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
}
|
}
|
||||||
|
|
||||||
//mxd
|
//mxd
|
||||||
public override Linedef GetControlLinedef() {
|
public override Linedef GetControlLinedef()
|
||||||
|
{
|
||||||
return extrafloor.Linedef;
|
return extrafloor.Linedef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//mxd
|
||||||
|
public override void SelectNeighbours(bool select, bool withSameTexture, bool withSameHeight)
|
||||||
|
{
|
||||||
|
selectNeighbours(extrafloor.Linedef.Front.MiddleTexture, select, withSameTexture, withSameHeight);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue