Skip to content
Snippets Groups Projects
Commit b104e88a authored by MaxED's avatar MaxED
Browse files

Visual Mode, UDMF: "Auto-align Textures Y" action now takes surface peg type into account.

Visual Mode, UDMF: "Auto-align Textures Y" action now applies vertical scale of first (highlighted) surface to the rest of aligned surfaces.
Linedef Edit Form, UDMF: lower sidedef texture offsets were never displayed.
Some more changes in auto texture alignment of newly drawn lines.
BuilderEffects plugin should compile now.
parent 60682dab
No related branches found
No related tags found
No related merge requests found
......@@ -818,7 +818,7 @@ namespace CodeImp.DoomBuilder.Map
nsd.Marked = front.Marked;
// Make texture offset adjustments
if(nsd.OffsetX != 0 || !General.Map.UDMF) //mxd
if(!General.Map.UDMF) //mxd
nsd.OffsetX += (int)Vector2D.Distance(this.start.Position, this.end.Position);
}
......@@ -833,7 +833,7 @@ namespace CodeImp.DoomBuilder.Map
// Make texture offset adjustments
//mxd
int distance = (int)Vector2D.Distance(nl.start.Position, nl.end.Position);
if(back.OffsetX != 0 || General.Map.UDMF)
if(General.Map.UDMF)
if(distance != 0) applyTextureOffsetUDMF(back, distance);
else
back.OffsetX += distance;
......
......@@ -324,8 +324,8 @@ namespace CodeImp.DoomBuilder.Windows
if(frontOffsetTopY.Text != getUDMFTextureOffset(l.Front.Fields, "offsety_top").ToString()) frontOffsetTopY.Text = "";
if(frontOffsetMidX.Text != getUDMFTextureOffset(l.Front.Fields, "offsetx_mid").ToString()) frontOffsetMidX.Text = "";
if(frontOffsetMidY.Text != getUDMFTextureOffset(l.Front.Fields, "offsety_mid").ToString()) frontOffsetMidY.Text = "";
if(frontOffsetLowX.Text != getUDMFTextureOffset(l.Front.Fields, "offsetx_bottom ").ToString()) frontOffsetLowX.Text = "";
if(frontOffsetLowY.Text != getUDMFTextureOffset(l.Front.Fields, "offsety_bottom ").ToString()) frontOffsetLowY.Text = "";
if(frontOffsetLowX.Text != getUDMFTextureOffset(l.Front.Fields, "offsetx_bottom").ToString()) frontOffsetLowX.Text = "";
if(frontOffsetLowY.Text != getUDMFTextureOffset(l.Front.Fields, "offsety_bottom").ToString()) frontOffsetLowY.Text = "";
}
if (frontoffsetx.Text != l.Front.OffsetX.ToString()) frontoffsetx.Text = "";
......@@ -349,8 +349,8 @@ namespace CodeImp.DoomBuilder.Windows
if(backOffsetTopY.Text != getUDMFTextureOffset(l.Back.Fields, "offsety_top").ToString()) backOffsetTopY.Text = "";
if(backOffsetMidX.Text != getUDMFTextureOffset(l.Back.Fields, "offsetx_mid").ToString()) backOffsetMidX.Text = "";
if(backOffsetMidY.Text != getUDMFTextureOffset(l.Back.Fields, "offsety_mid").ToString()) backOffsetMidY.Text = "";
if(backOffsetLowX.Text != getUDMFTextureOffset(l.Back.Fields, "offsetx_bottom ").ToString()) backOffsetLowX.Text = "";
if(backOffsetLowY.Text != getUDMFTextureOffset(l.Back.Fields, "offsety_bottom ").ToString()) backOffsetLowY.Text = "";
if(backOffsetLowX.Text != getUDMFTextureOffset(l.Back.Fields, "offsetx_bottom").ToString()) backOffsetLowX.Text = "";
if(backOffsetLowY.Text != getUDMFTextureOffset(l.Back.Fields, "offsety_bottom").ToString()) backOffsetLowY.Text = "";
}
if (backoffsetx.Text != l.Back.OffsetX.ToString()) backoffsetx.Text = "";
......@@ -421,8 +421,7 @@ namespace CodeImp.DoomBuilder.Windows
//mxd
private float getUDMFTextureOffset(UniFields fields, string key) {
if (fields != null && fields.ContainsKey(key))
return (float)fields[key].Value;
if(fields != null) return fields.GetValue(key, 0f);
return 0;
}
......
......@@ -55,7 +55,6 @@
</ItemGroup>
<ItemGroup>
<Compile Include="BuilderPlug.cs" />
<Compile Include="ClassicModes\ArrayDuplicateMode.cs" />
<Compile Include="Controls\NumericUpDownEx.cs">
<SubType>Component</SubType>
</Compile>
......
......@@ -108,6 +108,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
public Sidedef controlSide; //mxd
public float offsetx;
public float scaleY; //mxd
// When this is true, the previous sidedef was on the left of
// this one and the texture X offset of this sidedef can be set
......@@ -2448,11 +2449,11 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Add sidedefs forward (connected to the right vertex)
v = j.sidedef.IsFront ? j.sidedef.Line.End : j.sidedef.Line.Start;
AddSidedefsForAlignment(todo, v, true, forwardoffset, texture.LongName, false);
AddSidedefsForAlignment(todo, v, true, forwardoffset, 1.0f, texture.LongName, false);
// Add sidedefs backward (connected to the left vertex)
v = j.sidedef.IsFront ? j.sidedef.Line.Start : j.sidedef.Line.End;
AddSidedefsForAlignment(todo, v, false, backwardoffset, texture.LongName, false);
AddSidedefsForAlignment(todo, v, false, backwardoffset, 1.0f, texture.LongName, false);
} else {
Vertex v;
int forwardoffset;
......@@ -2479,11 +2480,11 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Add sidedefs backward (connected to the left vertex)
v = j.sidedef.IsFront ? j.sidedef.Line.Start : j.sidedef.Line.End;
AddSidedefsForAlignment(todo, v, false, backwardoffset, texture.LongName, false);
AddSidedefsForAlignment(todo, v, false, backwardoffset, 1.0f, texture.LongName, false);
// Add sidedefs forward (connected to the right vertex)
v = j.sidedef.IsFront ? j.sidedef.Line.End : j.sidedef.Line.Start;
AddSidedefsForAlignment(todo, v, true, forwardoffset, texture.LongName, false);
AddSidedefsForAlignment(todo, v, true, forwardoffset, 1.0f, texture.LongName, false);
}
}
}
......@@ -2510,13 +2511,13 @@ namespace CodeImp.DoomBuilder.BuilderModes
float ystartalign = start.OffsetY;
switch(part) {
case SidedefPart.Upper:
ystartalign += start.Fields.GetValue("offsety_top", 0.0f);
ystartalign += getTopOffsetY(start, start.Fields.GetValue("offsety_top", 0.0f), false);//mxd
break;
case SidedefPart.Middle:
ystartalign += start.Fields.GetValue("offsety_mid", 0.0f);
break; //mxd
ystartalign += getMiddleOffsetY(start, start.Fields.GetValue("offsety_mid", 0.0f), false);//mxd
break;
case SidedefPart.Lower:
ystartalign += start.Fields.GetValue("offsety_bottom", 0.0f);
ystartalign += getBottomOffsetY(start, start.Fields.GetValue("offsety_bottom", 0.0f), false);//mxd
break;
}
......@@ -2530,7 +2531,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
break;
case SidedefPart.Middle:
first.offsetx += start.Fields.GetValue("offsetx_mid", 0.0f);
break; //mxd
break;
case SidedefPart.Lower:
first.offsetx += start.Fields.GetValue("offsetx_bottom", 0.0f);
break;
......@@ -2551,6 +2552,19 @@ namespace CodeImp.DoomBuilder.BuilderModes
first.controlSide = start;
}
//mxd. scaleY
switch(part) {
case SidedefPart.Upper:
first.scaleY = start.Fields.GetValue("scaley_top", 1.0f);
break;
case SidedefPart.Middle:
first.scaleY = start.Fields.GetValue("scaley_mid", 1.0f);
break;
case SidedefPart.Lower:
first.scaleY = start.Fields.GetValue("scaley_bottom", 1.0f);
break;
}
todo.Push(first);
// Continue until nothing more to align
......@@ -2574,6 +2588,24 @@ namespace CodeImp.DoomBuilder.BuilderModes
else if(matchmid)
offsetscalex = j.sidedef.Fields.GetValue("scalex_mid", 1.0f);
//mxd. Apply scaleY
j.sidedef.Fields.BeforeFieldsChange();
if(j.scaleY == 1.0f) {
if(matchtop && j.sidedef.Fields.GetValue("scaley_top", 1.0f) != 1.0f)
j.sidedef.Fields.Remove("scaley_top");
else if(matchmid && j.sidedef.Fields.GetValue("scaley_mid", 1.0f) != 1.0f)
j.sidedef.Fields.Remove("scaley_mid");
else if(matchbottom && j.sidedef.Fields.GetValue("scaley_bottom", 1.0f) != 1.0f)
j.sidedef.Fields.Remove("scaley_bottom");
} else {
if(matchtop && j.sidedef.Fields.GetValue("scaley_top", 1.0f) != j.scaleY)
j.sidedef.Fields["scaley_top"] = new UniValue(UniversalType.Float, j.scaleY);
if(matchmid && j.sidedef.Fields.GetValue("scaley_mid", 1.0f) != j.scaleY)
j.sidedef.Fields["scaley_mid"] = new UniValue(UniversalType.Float, j.scaleY);
if(matchbottom && j.sidedef.Fields.GetValue("scaley_bottom", 1.0f) != j.scaleY)
j.sidedef.Fields["scaley_bottom"] = new UniValue(UniversalType.Float, j.scaleY);
}
if(j.forward) {
// Apply alignment
if(alignx) {
......@@ -2591,22 +2623,20 @@ namespace CodeImp.DoomBuilder.BuilderModes
}
if(aligny) {
float offset = ((float)(start.Sector.CeilHeight - j.sidedef.Sector.CeilHeight) / scaley) + ystartalign;
offset %= (float)texture.Height;
offset -= j.sidedef.OffsetY;
j.sidedef.Fields.BeforeFieldsChange();
if(matchtop)
j.sidedef.Fields["offsety_top"] = new UniValue(UniversalType.Float, offset);
j.sidedef.Fields["offsety_top"] = new UniValue(UniversalType.Float, getTopOffsetY(j.sidedef, offset, true) % (float)texture.Height); //mxd
if(matchbottom)
j.sidedef.Fields["offsety_bottom"] = new UniValue(UniversalType.Float, offset);
j.sidedef.Fields["offsety_bottom"] = new UniValue(UniversalType.Float, getBottomOffsetY(j.sidedef, offset, true) % (float)texture.Height); //mxd
if(matchmid) {
//mxd. Side is part of a 3D floor?
if(j.sidedef.Index != j.controlSide.Index) {
offset = ((float)(start.Sector.CeilHeight - j.controlSide.Sector.CeilHeight) / scaley) + ystartalign;
offset %= (float)texture.Height;
offset -= j.sidedef.OffsetY;
}
j.sidedef.Fields["offsety_mid"] = new UniValue(UniversalType.Float, offset);
j.sidedef.Fields["offsety_mid"] = new UniValue(UniversalType.Float, getMiddleOffsetY(j.sidedef, offset, true) % (float)texture.Height);//mxd
}
}
forwardoffset = j.offsetx + (int)Math.Round(j.sidedef.Line.Length / scalex * offsetscalex);
......@@ -2617,11 +2647,11 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Add sidedefs backward (connected to the left vertex)
v = j.sidedef.IsFront ? j.sidedef.Line.Start : j.sidedef.Line.End;
AddSidedefsForAlignment(todo, v, false, backwardoffset, texture.LongName, true);
AddSidedefsForAlignment(todo, v, false, backwardoffset, j.scaleY, texture.LongName, true);
// Add sidedefs forward (connected to the right vertex)
v = j.sidedef.IsFront ? j.sidedef.Line.End : j.sidedef.Line.Start;
AddSidedefsForAlignment(todo, v, true, forwardoffset, texture.LongName, true);
AddSidedefsForAlignment(todo, v, true, forwardoffset, j.scaleY, texture.LongName, true);
} else {
// Apply alignment
if(alignx) {
......@@ -2639,22 +2669,20 @@ namespace CodeImp.DoomBuilder.BuilderModes
}
if(aligny) {
float offset = ((float)(start.Sector.CeilHeight - j.sidedef.Sector.CeilHeight) / scaley) + ystartalign;
offset %= (float)texture.Height;
offset -= j.sidedef.OffsetY;
j.sidedef.Fields.BeforeFieldsChange();
if(matchtop)
j.sidedef.Fields["offsety_top"] = new UniValue(UniversalType.Float, offset);
j.sidedef.Fields["offsety_top"] = new UniValue(UniversalType.Float, getTopOffsetY(j.sidedef, offset, true) % (float)texture.Height); //mxd
if(matchbottom)
j.sidedef.Fields["offsety_bottom"] = new UniValue(UniversalType.Float, offset);
j.sidedef.Fields["offsety_bottom"] = new UniValue(UniversalType.Float, getBottomOffsetY(j.sidedef, offset, true) % (float)texture.Height); //mxd
if(matchmid) {
//mxd. Side is part of a 3D floor?
if(j.sidedef.Index != j.controlSide.Index) {
offset = ((float)(start.Sector.CeilHeight - j.controlSide.Sector.CeilHeight) / scaley) + ystartalign;
offset %= (float)texture.Height;
offset -= j.sidedef.OffsetY;
}
j.sidedef.Fields["offsety_mid"] = new UniValue(UniversalType.Float, offset);
j.sidedef.Fields["offsety_mid"] = new UniValue(UniversalType.Float, getMiddleOffsetY(j.sidedef, offset, true) % (float)texture.Height); //mxd
}
}
forwardoffset = j.offsetx;
......@@ -2665,17 +2693,17 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Add sidedefs forward (connected to the right vertex)
v = j.sidedef.IsFront ? j.sidedef.Line.End : j.sidedef.Line.Start;
AddSidedefsForAlignment(todo, v, true, forwardoffset, texture.LongName, true);
AddSidedefsForAlignment(todo, v, true, forwardoffset, j.scaleY, texture.LongName, true);
// Add sidedefs backward (connected to the left vertex)
v = j.sidedef.IsFront ? j.sidedef.Line.Start : j.sidedef.Line.End;
AddSidedefsForAlignment(todo, v, false, backwardoffset, texture.LongName, true);
AddSidedefsForAlignment(todo, v, false, backwardoffset, j.scaleY, texture.LongName, true);
}
}
}
// This adds the matching, unmarked sidedefs from a vertex for texture alignment
private void AddSidedefsForAlignment(Stack<SidedefAlignJob> stack, Vertex v, bool forward, float offsetx, long texturelongname, bool udmf) {
private void AddSidedefsForAlignment(Stack<SidedefAlignJob> stack, Vertex v, bool forward, float offsetx, float scaleY, long texturelongname, bool udmf) {
foreach(Linedef ld in v.Linedefs) {
Sidedef side1 = forward ? ld.Front : ld.Back;
Sidedef side2 = forward ? ld.Back : ld.Front;
......@@ -2687,8 +2715,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
SidedefAlignJob nj = new SidedefAlignJob();
nj.forward = forward;
nj.offsetx = offsetx;
nj.scaleY = scaleY; //mxd
nj.sidedef = side1;
nj.controlSide = s;
nj.controlSide = s; //mxd
stack.Push(nj);
break;
}
......@@ -2701,8 +2730,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
SidedefAlignJob nj = new SidedefAlignJob();
nj.forward = forward;
nj.offsetx = offsetx;
nj.scaleY = scaleY; //mxd
nj.sidedef = side2;
nj.controlSide = s;
nj.controlSide = s; //mxd
stack.Push(nj);
break;
}
......@@ -2711,6 +2741,45 @@ namespace CodeImp.DoomBuilder.BuilderModes
}
}
//mxd. This converts offsetY from/to "normalized" offset for given upper wall
private float getTopOffsetY(Sidedef side, float offset, bool fromNormalized) {
if(side.Line.IsFlagSet(General.Map.Config.UpperUnpeggedFlag) || side.Other == null || side.Other.Sector == null)
return offset;
//if we don't have UpperUnpegged flag, normalize offset
float scale = side.Fields.GetValue("scaley_top", 1.0f);
float surfaceHeight = (side.Sector.CeilHeight - side.Other.Sector.CeilHeight) * scale;
if(fromNormalized) return (float)Math.Round(offset + surfaceHeight);
return (float)Math.Round(offset - surfaceHeight);
}
//mxd. This converts offsetY from/to "normalized" offset for given middle wall
private float getMiddleOffsetY(Sidedef side, float offset, bool fromNormalized) {
if(!side.Line.IsFlagSet(General.Map.Config.LowerUnpeggedFlag) || side.Sector == null)
return offset;
//if we have LowerUnpegged flag, normalize offset
float scale = side.Fields.GetValue("scaley_mid", 1.0f);
float surfaceHeight = (side.Sector.CeilHeight - side.Sector.FloorHeight) * scale;
if(fromNormalized) return (float)Math.Round(offset + surfaceHeight);
return (float)Math.Round(offset - surfaceHeight);
}
//mxd. This converts offsetY from/to "normalized" offset for given lower wall
private float getBottomOffsetY(Sidedef side, float offset, bool fromNormalized) {
if(side.Line.IsFlagSet(General.Map.Config.LowerUnpeggedFlag) || side.Other == null || side.Other.Sector == null)
return offset;
//if we don't have LowerUnpegged flag, normalize offset
float scale = side.Fields.GetValue("scaley_bottom", 1.0f);
float surfaceHeight = (side.Sector.CeilHeight - (side.Other.Sector.FloorHeight - side.Sector.FloorHeight)) * scale;
if(fromNormalized) return (float)Math.Round(offset + surfaceHeight);
return (float)Math.Round(offset - surfaceHeight);
}
//mxd
private List<Sidedef> getControlSides(Sidedef side, bool udmf) {
if(side.Other == null) return new List<Sidedef>() { side };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment