mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-22 20:02:48 +00:00
Manual linedef splitting: UDMF texture coordinates were incorrectly interpolated in some cases.
Manual linedef splitting: "Duplicate texture coordinates" and "Reset X coordinate, copy Y coordinate" settings now affect UDMF texture offsets.
This commit is contained in:
parent
e04105dcde
commit
b80bc3f811
9 changed files with 138 additions and 121 deletions
|
@ -22,9 +22,9 @@
|
|||
|
||||
<div id="contents">
|
||||
<p><strong>Q:</strong> I'm getting a ton of "<strong>Unable to find the DECORATE class '[some actor]' to inherit from, while parsing '[some other actor]:[DoomEdNum]'</strong>" warnings. What's wrong?<br />
|
||||
<strong>A:</strong> This happens when a DECORATE actor is inherited from another actor, which is not defined in game configuration. To fix this, add "<strong>(g)zdoom.pk3</strong>" as a map resource. Don't forget to check "Exclude from testing parameters" chekbox while adding it, otherwise (G)ZDoom won't load. (g)zdoom.pk3 can be found in (G)ZDoom folder. </p>
|
||||
<strong>A:</strong> This happens when a DECORATE actor is inherited from another actor, which is not defined in game configuration. To fix this, add "<strong>(g)zdoom.pk3</strong>" as a map resource. Don't forget to check "Exclude from testing parameters" chekbox while adding it, otherwise (G)ZDoom won't load your map. (g)zdoom.pk3 can be found in (G)ZDoom folder. </p>
|
||||
<p><strong>Q:</strong> I'm getting a ton of "<strong>Error in 'GLDEFS' at line [n]: light declaration not found for light '[light name]'</strong>" warnings. What's wrong?<br />
|
||||
<strong>A:</strong> GZDoom Builder doesn't include GLDEFS lights definitions. To get rid of these errors, add "<strong>lights.pk3</strong>" as a map resource. Don't forget to check "Exclude from testing parameters" chekbox while adding it, otherwise GZDoom won't load. lights.pk3 can be found in GZDoom folder. </p>
|
||||
<strong>A:</strong> GZDoom Builder doesn't include GLDEFS lights definitions. To get rid of these errors, add "<strong>lights.pk3</strong>" as a map resource. Don't forget to check "Exclude from testing parameters" chekbox while adding it, otherwise GZDoom won't load your map. lights.pk3 can be found in GZDoom folder. </p>
|
||||
<p><strong>Q:</strong> When I create a new map, I see only Doom-related game configurations. Where are configurations for other games?<br />
|
||||
<strong>A:</strong> Copy "<span class="style1">[EngineName]_[Game][MapType].cfg</span>" and "<span class="style1">Includes</span>" folder from "<span class="style1">[GZDB]\Configurations\Configs for other games\[Game]</span>" to "<span class="style1">[GZDoom Builder]\Configurations\</span>".<br />
|
||||
If you are using Zandronum, you'll also need to copy all files from "<span class="style1">[GZDB]\Configurations\Configs for other games\Zandronum Includes\</span>" to the main "<span class="style1">Includes</span>" folder ("<span class="style1">[GZDB]\Configurations\Includes\</span>") .</p>
|
||||
|
|
|
@ -6,6 +6,10 @@ namespace CodeImp.DoomBuilder.GZBuilder.Tools
|
|||
public static class UDMFTools
|
||||
{
|
||||
//float
|
||||
public static void SetFloat(UniFields fields, string key, float value) {
|
||||
SetFloat(fields, key, value, 0f);
|
||||
}
|
||||
|
||||
public static void SetFloat(UniFields fields, string key, float value, float defaultValue) {
|
||||
if(fields == null) return;
|
||||
|
||||
|
@ -19,12 +23,20 @@ namespace CodeImp.DoomBuilder.GZBuilder.Tools
|
|||
}
|
||||
}
|
||||
|
||||
public static float GetFloat(UniFields fields, string key) {
|
||||
return GetFloat(fields, key, 0f);
|
||||
}
|
||||
|
||||
public static float GetFloat(UniFields fields, string key, float defaultValue) {
|
||||
if(fields == null) return defaultValue;
|
||||
return fields.GetValue(key, defaultValue);
|
||||
}
|
||||
|
||||
//int
|
||||
public static void SetInteger(UniFields fields, string key, int value) {
|
||||
SetInteger(fields, key, value, 0);
|
||||
}
|
||||
|
||||
public static void SetInteger(UniFields fields, string key, int value, int defaultValue) {
|
||||
if(fields == null) return;
|
||||
|
||||
|
@ -38,6 +50,10 @@ namespace CodeImp.DoomBuilder.GZBuilder.Tools
|
|||
}
|
||||
}
|
||||
|
||||
public static int GetInteger(UniFields fields, string key) {
|
||||
return GetInteger(fields, key, 0);
|
||||
}
|
||||
|
||||
public static int GetInteger(UniFields fields, string key, int defaultValue) {
|
||||
if(fields == null) return defaultValue;
|
||||
return fields.GetValue(key, defaultValue);
|
||||
|
|
|
@ -27,6 +27,7 @@ using CodeImp.DoomBuilder.Data;
|
|||
using CodeImp.DoomBuilder.Config;
|
||||
using CodeImp.DoomBuilder.Types;
|
||||
using System.Windows.Forms;
|
||||
using CodeImp.DoomBuilder.GZBuilder.Tools;
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -1494,54 +1495,48 @@ namespace CodeImp.DoomBuilder.Geometry
|
|||
|
||||
foreach(Linedef l in lines) {
|
||||
if(l.Front != null) {
|
||||
if(!l.Front.Fields.ContainsKey("offsetx_mid") && l.Front.MiddleRequired() && l.Front.MiddleTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Front.MiddleTexture)) {
|
||||
if(l.Front.MiddleRequired() && l.Front.MiddleTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Front.MiddleTexture)) {
|
||||
ImageData texture = General.Map.Data.GetFlatImage(l.Front.MiddleTexture);
|
||||
float offset = (int)Math.Round((reversed ? totalLength - curLength - l.Length : curLength)) % texture.Width;
|
||||
|
||||
if(offset > 0)
|
||||
l.Front.Fields.Add("offsetx_mid", new UniValue(UniversalType.Float, offset));
|
||||
if(offset > 0) UDMFTools.SetFloat(l.Front.Fields, "offsetx_mid", offset);
|
||||
}
|
||||
|
||||
if(!l.Front.Fields.ContainsKey("offsetx_top") && l.Front.HighRequired() && l.Front.HighTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Front.HighTexture)) {
|
||||
if(l.Front.HighRequired() && l.Front.HighTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Front.HighTexture)) {
|
||||
ImageData texture = General.Map.Data.GetFlatImage(l.Front.HighTexture);
|
||||
float offset = (int)Math.Round((reversed ? totalLength - curLength - l.Length : curLength)) % texture.Width;
|
||||
|
||||
if(offset > 0)
|
||||
l.Front.Fields.Add("offsetx_top", new UniValue(UniversalType.Float, offset));
|
||||
if(offset > 0) UDMFTools.SetFloat(l.Front.Fields, "offsetx_top", offset);
|
||||
}
|
||||
|
||||
if(!l.Front.Fields.ContainsKey("offsetx_bottom") && l.Front.LowRequired() && l.Front.LowTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Front.LowTexture)) {
|
||||
if(l.Front.LowRequired() && l.Front.LowTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Front.LowTexture)) {
|
||||
ImageData texture = General.Map.Data.GetFlatImage(l.Front.LowTexture);
|
||||
float offset = (int)Math.Round((reversed ? totalLength - curLength - l.Length : curLength)) % texture.Width;
|
||||
|
||||
if(offset > 0)
|
||||
l.Front.Fields.Add("offsetx_bottom", new UniValue(UniversalType.Float, offset));
|
||||
if(offset > 0) UDMFTools.SetFloat(l.Front.Fields, "offsetx_bottom", offset);
|
||||
}
|
||||
}
|
||||
|
||||
if(l.Back != null) {
|
||||
if(!l.Back.Fields.ContainsKey("offsetx_mid") && l.Back.MiddleRequired() && l.Back.MiddleTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Back.MiddleTexture)) {
|
||||
if(l.Back.MiddleRequired() && l.Back.MiddleTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Back.MiddleTexture)) {
|
||||
ImageData texture = General.Map.Data.GetFlatImage(l.Back.MiddleTexture);
|
||||
float offset = (int)Math.Round((reversed ? totalLength - curLength - l.Length : curLength)) % texture.Width;
|
||||
|
||||
if(offset > 0)
|
||||
l.Back.Fields.Add("offsetx_mid", new UniValue(UniversalType.Float, offset));
|
||||
if(offset > 0) UDMFTools.SetFloat(l.Back.Fields, "offsetx_mid", offset);
|
||||
}
|
||||
|
||||
if(!l.Back.Fields.ContainsKey("offsetx_top") && l.Back.HighRequired() && l.Back.HighTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Back.HighTexture)) {
|
||||
if(l.Back.HighRequired() && l.Back.HighTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Back.HighTexture)) {
|
||||
ImageData texture = General.Map.Data.GetFlatImage(l.Back.HighTexture);
|
||||
float offset = (int)Math.Round((reversed ? totalLength - curLength - l.Length : curLength)) % texture.Width;
|
||||
|
||||
if(offset > 0)
|
||||
l.Back.Fields.Add("offsetx_top", new UniValue(UniversalType.Float, offset));
|
||||
if(offset > 0) UDMFTools.SetFloat(l.Back.Fields, "offsetx_top", offset);
|
||||
}
|
||||
|
||||
if(!l.Back.Fields.ContainsKey("offsetx_bottom") && l.Back.LowRequired() && l.Back.LowTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Back.LowTexture)) {
|
||||
if(l.Back.LowRequired() && l.Back.LowTexture.Length > 1 && General.Map.Data.GetFlatExists(l.Back.LowTexture)) {
|
||||
ImageData texture = General.Map.Data.GetFlatImage(l.Back.LowTexture);
|
||||
float offset = (int)Math.Round((reversed ? totalLength - curLength - l.Length : curLength)) % texture.Width;
|
||||
|
||||
if(offset > 0)
|
||||
l.Back.Fields.Add("offsetx_bottom", new UniValue(UniversalType.Float, offset));
|
||||
if(offset > 0) UDMFTools.SetFloat(l.Back.Fields, "offsetx_bottom", offset);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ using System.Drawing;
|
|||
using CodeImp.DoomBuilder.IO;
|
||||
using CodeImp.DoomBuilder.Types;
|
||||
using CodeImp.DoomBuilder.Data;
|
||||
using CodeImp.DoomBuilder.GZBuilder.Tools;
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -835,19 +836,20 @@ namespace CodeImp.DoomBuilder.Map
|
|||
back.CopyPropertiesTo(nsd);
|
||||
nsd.Marked = back.Marked;
|
||||
|
||||
// Make texture offset adjustments
|
||||
//mxd
|
||||
//mxd. Make texture offset adjustments
|
||||
int distance = (int)Vector2D.Distance(nl.start.Position, nl.end.Position);
|
||||
if(General.Map.UDMF)
|
||||
if(distance != 0) applyTextureOffsetUDMF(back, distance);
|
||||
else
|
||||
if(General.Map.UDMF) {
|
||||
if (distance != 0)
|
||||
back.SetUdmfTextureOffsetX(distance);
|
||||
} else {
|
||||
back.OffsetX += distance;
|
||||
}
|
||||
}
|
||||
|
||||
//mxd. Both sides of line are required, so we do it here...
|
||||
if(nl.Front != null && General.Map.UDMF) {
|
||||
int distance = (int)Vector2D.Distance(this.start.Position, this.end.Position);
|
||||
if(distance != 0) applyTextureOffsetUDMF(nl.Front, distance);
|
||||
if(distance != 0) nl.Front.SetUdmfTextureOffsetX(distance);
|
||||
}
|
||||
|
||||
// Return result
|
||||
|
@ -1074,73 +1076,6 @@ namespace CodeImp.DoomBuilder.Map
|
|||
colorPresetIndex = -1;
|
||||
}
|
||||
|
||||
//mxd
|
||||
private void applyTextureOffsetUDMF(Sidedef side, int distance) {
|
||||
float scaleTop = side.Fields.GetValue("scalex_top", 1.0f);
|
||||
float scaleMid = side.Fields.GetValue("scalex_mid", 1.0f);
|
||||
float scaleLow = side.Fields.GetValue("scalex_bottom", 1.0f);
|
||||
|
||||
//top
|
||||
if(side.HighTexture.Length > 1 && General.Map.Data.GetFlatExists(side.HighTexture)) {
|
||||
ImageData texture = General.Map.Data.GetFlatImage(side.HighTexture);
|
||||
|
||||
if(side.Fields.ContainsKey("offsetx_top")) {
|
||||
float value = side.Fields.GetValue("offsetx_top", 0f);
|
||||
float offset = (float)(Math.Round((value + distance) * scaleTop) % texture.Width);
|
||||
|
||||
if(offset != 0)
|
||||
side.Fields["offsetx_top"].Value = offset;
|
||||
else
|
||||
side.Fields.Remove("offsetx_top");
|
||||
} else if(side.HighRequired()) {
|
||||
float offset = (float)(Math.Round(distance * scaleTop) % texture.Width);
|
||||
|
||||
if(offset != 0)
|
||||
side.Fields.Add("offsetx_top", new UniValue(UniversalType.Float, offset));
|
||||
}
|
||||
}
|
||||
|
||||
//middle
|
||||
if(side.MiddleTexture.Length > 1 && General.Map.Data.GetFlatExists(side.MiddleTexture)){
|
||||
ImageData texture = General.Map.Data.GetFlatImage(side.MiddleTexture);
|
||||
|
||||
if(side.Fields.ContainsKey("offsetx_mid")) {
|
||||
float value = side.Fields.GetValue("offsetx_mid", 0f);
|
||||
float offset = (float)(Math.Round((value + distance) * scaleMid) % texture.Width);
|
||||
|
||||
if(offset != 0)
|
||||
side.Fields["offsetx_mid"].Value = offset;
|
||||
else
|
||||
side.Fields.Remove("offsetx_mid");
|
||||
} else if(side.MiddleRequired()) {
|
||||
float offset = (float)(Math.Round(distance * scaleMid) % texture.Width);
|
||||
|
||||
if(offset != 0)
|
||||
side.Fields.Add("offsetx_mid", new UniValue(UniversalType.Float, offset));
|
||||
}
|
||||
}
|
||||
|
||||
//bottom
|
||||
if(side.LowTexture.Length > 1 && General.Map.Data.GetFlatExists(side.LowTexture)){
|
||||
ImageData texture = General.Map.Data.GetFlatImage(side.LowTexture);
|
||||
|
||||
if(side.Fields.ContainsKey("offsetx_bottom")) {
|
||||
float value = side.Fields.GetValue("offsetx_bottom", 0f);
|
||||
float offset = (float)(Math.Round((value + distance) * scaleLow) % texture.Width);
|
||||
|
||||
if(offset != 0)
|
||||
side.Fields["offsetx_bottom"].Value = offset;
|
||||
else
|
||||
side.Fields.Remove("offsetx_bottom");
|
||||
} else if(side.LowRequired()) {
|
||||
float offset = (float)(Math.Round(distance * scaleLow) % texture.Width);
|
||||
|
||||
if(offset != 0)
|
||||
side.Fields.Add("offsetx_bottom", new UniValue(UniversalType.Float, offset));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// String representation
|
||||
public override string ToString()
|
||||
{
|
||||
|
|
|
@ -20,6 +20,8 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using CodeImp.DoomBuilder.IO;
|
||||
using CodeImp.DoomBuilder.Geometry;
|
||||
using CodeImp.DoomBuilder.Data;
|
||||
using CodeImp.DoomBuilder.GZBuilder.Tools;
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -560,6 +562,41 @@ namespace CodeImp.DoomBuilder.Map
|
|||
longtexnamelow = Lump.MakeLongName(name);
|
||||
General.Map.IsChanged = true;
|
||||
}
|
||||
|
||||
// This sets udmf texture offset
|
||||
public void SetUdmfTextureOffsetX(int offset) {
|
||||
this.Fields.BeforeFieldsChange();
|
||||
|
||||
//top
|
||||
if(HighTexture.Length > 1 && General.Map.Data.GetFlatExists(HighTexture)) {
|
||||
ImageData texture = General.Map.Data.GetFlatImage(HighTexture);
|
||||
float scaleTop = Fields.GetValue("scalex_top", 1.0f);
|
||||
|
||||
float value = Fields.GetValue("offsetx_top", 0f);
|
||||
float result = (float)(Math.Round(value + offset * scaleTop) % texture.Width);
|
||||
UDMFTools.SetFloat(Fields, "offsetx_top", result);
|
||||
}
|
||||
|
||||
//middle
|
||||
if(MiddleTexture.Length > 1 && General.Map.Data.GetFlatExists(MiddleTexture)) {
|
||||
ImageData texture = General.Map.Data.GetFlatImage(MiddleTexture);
|
||||
float scaleMid = Fields.GetValue("scalex_mid", 1.0f);
|
||||
|
||||
float value = Fields.GetValue("offsetx_mid", 0f);
|
||||
float result = (float)(Math.Round(value + offset * scaleMid) % texture.Width);
|
||||
UDMFTools.SetFloat(Fields, "offsetx_mid", result);
|
||||
}
|
||||
|
||||
//bottom
|
||||
if(LowTexture.Length > 1 && General.Map.Data.GetFlatExists(LowTexture)) {
|
||||
ImageData texture = General.Map.Data.GetFlatImage(LowTexture);
|
||||
float scaleLow = Fields.GetValue("scalex_bottom", 1.0f);
|
||||
|
||||
float value = Fields.GetValue("offsetx_bottom", 0f);
|
||||
float result = (float)(Math.Round(value + offset * scaleLow) % texture.Width);
|
||||
UDMFTools.SetFloat(Fields, "offsetx_bottom", result);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
|
|
@ -52,9 +52,12 @@ namespace CodeImp.DoomBuilder.Map
|
|||
|
||||
// Copy constructor
|
||||
///<summary></summary>
|
||||
public UniFields(MapElement owner, UniFields copyfrom) : base(copyfrom)
|
||||
public UniFields(MapElement owner, UniFields copyfrom) : base(copyfrom.Count)
|
||||
{
|
||||
this.owner = owner;
|
||||
|
||||
foreach(KeyValuePair<string, UniValue> v in copyfrom) //mxd. No-no-no, David Blaine, I don't want to copy these by reference!
|
||||
this.Add(v.Key, new UniValue(v.Value));
|
||||
}
|
||||
|
||||
/// <summary>Call this before making changes to the fields, or they may not be updated correctly with undo/redo!</summary>
|
||||
|
|
|
@ -109,12 +109,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
// This checks if the view offset/zoom changed and updates the check
|
||||
protected bool CheckViewChanged()
|
||||
{
|
||||
bool viewchanged = false;
|
||||
|
||||
// View changed?
|
||||
if(renderer.OffsetX != lastoffsetx) viewchanged = true;
|
||||
if(renderer.OffsetY != lastoffsety) viewchanged = true;
|
||||
if(renderer.Scale != lastscale) viewchanged = true;
|
||||
bool viewchanged = (renderer.OffsetX != lastoffsetx || renderer.OffsetY != lastoffsety || renderer.Scale != lastscale);
|
||||
|
||||
// Keep view information
|
||||
lastoffsetx = renderer.OffsetX;
|
||||
|
@ -137,8 +133,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
|
||||
DrawnVertex lastp = new DrawnVertex();
|
||||
DrawnVertex curp = GetCurrentPosition();
|
||||
float vsize = ((float)renderer.VertexSize + 1.0f) / renderer.Scale;
|
||||
float vsizeborder = ((float)renderer.VertexSize + 3.0f) / renderer.Scale;
|
||||
float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;
|
||||
|
||||
// The last label's end must go to the mouse cursor
|
||||
if(labels.Count > 0) labels[labels.Count - 1].End = curp.pos;
|
||||
|
@ -175,8 +170,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
for(int i = 0; i < points.Count; i++)
|
||||
{
|
||||
// Determine vertex color
|
||||
if(points[i].stitch) color = stitchcolor;
|
||||
else color = losecolor;
|
||||
color = points[i].stitch ? stitchcolor : losecolor;
|
||||
|
||||
// Render vertex
|
||||
renderer.RenderRectangleFilled(new RectangleF(points[i].pos.x - vsize, points[i].pos.y - vsize, vsize * 2.0f, vsize * 2.0f), color, true);
|
||||
|
@ -184,8 +178,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
}
|
||||
|
||||
// Determine point color
|
||||
if(snaptonearest) color = stitchcolor;
|
||||
else color = losecolor;
|
||||
color = snaptonearest ? stitchcolor : losecolor;
|
||||
|
||||
// Render vertex at cursor
|
||||
renderer.RenderRectangleFilled(new RectangleF(curp.pos.x - vsize, curp.pos.y - vsize, vsize * 2.0f, vsize * 2.0f), color, true);
|
||||
|
|
|
@ -900,7 +900,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
OnMouseMove(e);
|
||||
|
||||
// Redraw screen
|
||||
//General.Map.Renderer2D.UpdateExtraFloorFlag(); //mxd
|
||||
General.Interface.RedrawDisplay();
|
||||
}
|
||||
}
|
||||
|
@ -1119,51 +1118,51 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
Linedef start = General.GetByIndex(orderedselection, 0);
|
||||
Linedef end = General.GetByIndex(orderedselection, orderedselection.Count - 1);
|
||||
|
||||
string lightKey = "light";
|
||||
string lightAbsKey = "lightabsolute";
|
||||
const string lightKey = "light";
|
||||
const string lightAbsKey = "lightabsolute";
|
||||
float startbrightness = float.NaN;
|
||||
float endbrightness = float.NaN;
|
||||
|
||||
//get total brightness of start sidedef(s)
|
||||
if(start.Front != null) {
|
||||
if(start.Front.Fields.GetValue(lightAbsKey, false)) {
|
||||
startbrightness = (float)start.Front.Fields.GetValue(lightKey, 0);
|
||||
startbrightness = start.Front.Fields.GetValue(lightKey, 0);
|
||||
} else {
|
||||
startbrightness = Math.Min(255, Math.Max(0, (float)start.Front.Sector.Brightness + start.Front.Fields.GetValue(lightKey, 0)));
|
||||
}
|
||||
}
|
||||
|
||||
if(start.Back != null) {
|
||||
float b = 0;
|
||||
float b;
|
||||
|
||||
if(start.Back.Fields.GetValue(lightAbsKey, false)) {
|
||||
b = (float)start.Back.Fields.GetValue(lightKey, 0);
|
||||
b = start.Back.Fields.GetValue(lightKey, 0);
|
||||
} else {
|
||||
b = Math.Min(255, Math.Max(0, (float)start.Back.Sector.Brightness + start.Back.Fields.GetValue(lightKey, 0)));
|
||||
}
|
||||
|
||||
startbrightness = (startbrightness == float.NaN ? b : (startbrightness + b) / 2);
|
||||
startbrightness = (float.IsNaN(startbrightness) ? b : (startbrightness + b) / 2);
|
||||
}
|
||||
|
||||
//get total brightness of end sidedef(s)
|
||||
if(end.Front != null) {
|
||||
if(end.Front.Fields.GetValue(lightAbsKey, false)) {
|
||||
endbrightness = (float)end.Front.Fields.GetValue(lightKey, 0);
|
||||
endbrightness = end.Front.Fields.GetValue(lightKey, 0);
|
||||
} else {
|
||||
endbrightness = Math.Min(255, Math.Max(0, (float)end.Front.Sector.Brightness + end.Front.Fields.GetValue(lightKey, 0)));
|
||||
}
|
||||
}
|
||||
|
||||
if(end.Back != null) {
|
||||
float b = 0;
|
||||
float b;
|
||||
|
||||
if(end.Back.Fields.GetValue(lightAbsKey, false)) {
|
||||
b = (float)end.Back.Fields.GetValue(lightKey, 0);
|
||||
b = end.Back.Fields.GetValue(lightKey, 0);
|
||||
} else {
|
||||
b = Math.Min(255, Math.Max(0, (float)end.Back.Sector.Brightness + end.Back.Fields.GetValue(lightKey, 0)));
|
||||
}
|
||||
|
||||
endbrightness = (endbrightness == float.NaN ? b : (endbrightness + b) / 2);
|
||||
endbrightness = (float.IsNaN(endbrightness) ? b : (endbrightness + b) / 2);
|
||||
}
|
||||
|
||||
float delta = endbrightness - startbrightness;
|
||||
|
@ -1171,7 +1170,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
// Go for all sectors in between first and last
|
||||
int index = 0;
|
||||
foreach(Linedef l in orderedselection) {
|
||||
float u = (float)index / (float)(orderedselection.Count - 1);
|
||||
float u = index / (float)(orderedselection.Count - 1);
|
||||
float b = startbrightness + delta * u;
|
||||
|
||||
if(l.Front != null) {
|
||||
|
|
|
@ -38,6 +38,7 @@ using CodeImp.DoomBuilder.GZBuilder.Geometry;
|
|||
using CodeImp.DoomBuilder.Actions;
|
||||
using CodeImp.DoomBuilder.BuilderModes.IO;
|
||||
using CodeImp.DoomBuilder.BuilderModes.Interface;
|
||||
using CodeImp.DoomBuilder.GZBuilder.Tools;
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -567,8 +568,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
}
|
||||
|
||||
//clamp offsetX
|
||||
if(texture != null)
|
||||
newline.Front.OffsetX %= texture.Width;
|
||||
if(texture != null) newline.Front.OffsetX %= texture.Width;
|
||||
}
|
||||
|
||||
if((oldline.Back != null) && (newline.Back != null)) {
|
||||
|
@ -584,8 +584,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
}
|
||||
|
||||
//clamp offsetX
|
||||
if(texture != null)
|
||||
newline.Back.OffsetX %= texture.Width;
|
||||
if(texture != null) newline.Back.OffsetX %= texture.Width;
|
||||
}
|
||||
}
|
||||
// Copy X and Y coordinates
|
||||
|
@ -595,12 +594,34 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
newline.Front.OffsetX = oldline.Front.OffsetX;
|
||||
newline.Front.OffsetY = oldline.Front.OffsetY;
|
||||
|
||||
//mxd. Copy UDMF offsets as well
|
||||
if(General.Map.UDMF) {
|
||||
UDMFTools.SetFloat(newline.Front.Fields, "offsetx_top", oldline.Front.Fields.GetValue("offsetx_top", 0f));
|
||||
UDMFTools.SetFloat(newline.Front.Fields, "offsetx_mid", oldline.Front.Fields.GetValue("offsetx_mid", 0f));
|
||||
UDMFTools.SetFloat(newline.Front.Fields, "offsetx_bottom", oldline.Front.Fields.GetValue("offsetx_bottom", 0f));
|
||||
|
||||
UDMFTools.SetFloat(newline.Front.Fields, "offsety_top", oldline.Front.Fields.GetValue("offsety_top", 0f));
|
||||
UDMFTools.SetFloat(newline.Front.Fields, "offsety_mid", oldline.Front.Fields.GetValue("offsety_mid", 0f));
|
||||
UDMFTools.SetFloat(newline.Front.Fields, "offsety_bottom", oldline.Front.Fields.GetValue("offsety_bottom", 0f));
|
||||
}
|
||||
}
|
||||
|
||||
if((oldline.Back != null) && (newline.Back != null))
|
||||
{
|
||||
newline.Back.OffsetX = oldline.Back.OffsetX;
|
||||
newline.Back.OffsetY = oldline.Back.OffsetY;
|
||||
|
||||
//mxd. Copy UDMF offsets as well
|
||||
if(General.Map.UDMF) {
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsetx_top", oldline.Back.Fields.GetValue("offsetx_top", 0f));
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsetx_mid", oldline.Back.Fields.GetValue("offsetx_mid", 0f));
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsetx_bottom", oldline.Back.Fields.GetValue("offsetx_bottom", 0f));
|
||||
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsety_top", oldline.Back.Fields.GetValue("offsety_top", 0f));
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsety_mid", oldline.Back.Fields.GetValue("offsety_mid", 0f));
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsety_bottom", oldline.Back.Fields.GetValue("offsety_bottom", 0f));
|
||||
}
|
||||
}
|
||||
}
|
||||
// Reset X coordinate, copy Y coordinate
|
||||
|
@ -610,12 +631,30 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
newline.Front.OffsetX = 0;
|
||||
newline.Front.OffsetY = oldline.Front.OffsetY;
|
||||
|
||||
//mxd. Reset UDMF X offset as well
|
||||
if(General.Map.UDMF) {
|
||||
UDMFTools.SetFloat(newline.Front.Fields, "offsetx_top", 0f);
|
||||
UDMFTools.SetFloat(newline.Front.Fields, "offsetx_mid", 0f);
|
||||
UDMFTools.SetFloat(newline.Front.Fields, "offsetx_bottom", 0f);
|
||||
}
|
||||
}
|
||||
|
||||
if((oldline.Back != null) && (newline.Back != null))
|
||||
{
|
||||
newline.Back.OffsetX = 0;
|
||||
newline.Back.OffsetY = oldline.Back.OffsetY;
|
||||
|
||||
//mxd. Reset UDMF X offset and copy Y offset as well
|
||||
if(General.Map.UDMF) {
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsetx_top", 0f);
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsetx_mid", 0f);
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsetx_bottom", 0f);
|
||||
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsety_top", oldline.Back.Fields.GetValue("offsety_top", 0f));
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsety_mid", oldline.Back.Fields.GetValue("offsety_mid", 0f));
|
||||
UDMFTools.SetFloat(newline.Back.Fields, "offsety_bottom", oldline.Back.Fields.GetValue("offsety_bottom", 0f));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue