From 8f297df2332ce51bcc1ce70b01feedbe9f87fc81 Mon Sep 17 00:00:00 2001
From: izawartka <59137928+izawartka@users.noreply.github.com>
Date: Mon, 30 Jun 2025 21:09:16 +0200
Subject: [PATCH] Attached signs rendering
+Added rendering of signs attached to signals. If a sign is attached to a signal, attachedAs is set in the sign's def and signal has SignalElements, the sign is no longer rendered on the Signs layer but appears on the signal pole (ifextended signal rendering is enabled)
+Added definitions and icons for signal signs W1 and W18
*Extracted sign attaching logic into attachSign function
---
public/assets/signal_signs/w1.svg | 7 ++++++
public/assets/signal_signs/w18.svg | 7 ++++++
.../map/object-renderers/SignRenderer.js | 1 +
src/model/attach-signs.js | 23 ++++++++++++++-----
src/model/defs/defined-signal-signs.js | 20 ++++++++++++----
src/model/defs/defined-signs.js | 12 ++++++----
src/model/track-objects/sign.js | 1 +
src/model/vector3.js | 4 ++++
8 files changed, 60 insertions(+), 15 deletions(-)
create mode 100644 public/assets/signal_signs/w1.svg
create mode 100644 public/assets/signal_signs/w18.svg
diff --git a/public/assets/signal_signs/w1.svg b/public/assets/signal_signs/w1.svg
new file mode 100644
index 0000000..e3042ff
--- /dev/null
+++ b/public/assets/signal_signs/w1.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/public/assets/signal_signs/w18.svg b/public/assets/signal_signs/w18.svg
new file mode 100644
index 0000000..e641492
--- /dev/null
+++ b/public/assets/signal_signs/w18.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/components/map/object-renderers/SignRenderer.js b/src/components/map/object-renderers/SignRenderer.js
index e922805..12a6f32 100644
--- a/src/components/map/object-renderers/SignRenderer.js
+++ b/src/components/map/object-renderers/SignRenderer.js
@@ -3,6 +3,7 @@ import { ReactSVG } from 'react-svg'
export default function SignRenderer(props) {
const { object } = props;
if(!object.def) return null;
+ if(object.attached_skip_rendering) return null;
const [x, y] = object.pos.toSVGCoords();
diff --git a/src/model/attach-signs.js b/src/model/attach-signs.js
index 1d6a2bc..bf31bc9 100644
--- a/src/model/attach-signs.js
+++ b/src/model/attach-signs.js
@@ -43,6 +43,22 @@ function getGridCellPositions(pos, scenery, gridSize, maxDist) {
return positions;
}
+function attach(sign, signal) {
+ if(Constants.parser.logAttachedSigns) {
+ const distance = sign.pos.distanceExcludeY(signal.pos);
+ console.log(`Attaching sign ${sign.name} (${sign.id}) to signal ${signal.name} (${signal.id}) at distance ${distance.toFixed(2)} m`);
+ }
+
+ sign.attached_to = signal;
+ signal.attached_signs.push(sign);
+
+ const attachAs = sign.def?.attachAs || null;
+ if(!attachAs || !signal.signal_elements) return;
+
+ sign.attached_skip_rendering = true;
+ signal.signal_elements.signs[attachAs] = true;
+}
+
export function attachSigns(scenery) {
const maxDistSq = Constants.parser.attachSignsMaxDistanceZ ** 2 + Constants.parser.attachSignsMaxDistanceX ** 2;
const maxDist = Math.sqrt(maxDistSq);
@@ -89,11 +105,6 @@ export function attachSigns(scenery) {
if(!closestSignal) continue;
- if(Constants.parser.logAttachedSigns) {
- console.log(`Attaching sign ${trackObject.name} (${trackObject.id}) to signal ${closestSignal.name} (${closestSignal.id}) at distance ${Math.sqrt(closestDistanceSq).toFixed(2)} m`);
- }
-
- trackObject.attached_to = closestSignal;
- closestSignal.attached_signs.push(trackObject);
+ attach(trackObject, closestSignal);
}
}
\ No newline at end of file
diff --git a/src/model/defs/defined-signal-signs.js b/src/model/defs/defined-signal-signs.js
index adc3623..927967a 100644
--- a/src/model/defs/defined-signal-signs.js
+++ b/src/model/defs/defined-signal-signs.js
@@ -1,8 +1,13 @@
const DefinedSignalSigns = {
- "w24": {
- "regex": /^(?:wsk_)?w24(?:\D)?.*$/,
- "name": "W24",
- "icon": "w24.svg",
+ "w1": {
+ "regex": /^(?:wsk_)?w1(?:\D)?.*$/,
+ "name": "W1",
+ "icon": "w1.svg",
+ },
+ "w18": {
+ "regex": /^(?:wsk_)?w18(?:\D)?.*$/,
+ "name": "W18",
+ "icon": "w18.svg",
},
"w19": {
"regex": /^(?:wsk_)?w19(?:\D)?.*$/,
@@ -13,7 +18,12 @@ const DefinedSignalSigns = {
"regex": /^(?:wsk_)?w20(?:\D)?.*$/,
"name": "W20",
"icon": "w20.svg",
- }
+ },
+ "w24": {
+ "regex": /^(?:wsk_)?w24(?:\D)?.*$/,
+ "name": "W24",
+ "icon": "w24.svg",
+ },
};
export default DefinedSignalSigns;
diff --git a/src/model/defs/defined-signs.js b/src/model/defs/defined-signs.js
index 1f362db..31caf3d 100644
--- a/src/model/defs/defined-signs.js
+++ b/src/model/defs/defined-signs.js
@@ -190,22 +190,26 @@ const DefinedSigns = {
"w18": {
"name": "W18",
"icon": "w18.svg",
- "offsetY": 3.89
+ "offsetY": 3.89,
+ "attachAs": "w18",
},
"w19": {
"name": "W19",
"icon": "w19.svg",
- "offsetY": 3.89
+ "offsetY": 3.89,
+ "attachAs": "w19"
},
"w20": {
"name": "W20",
"icon": "w20.svg",
- "offsetY": 3.89
+ "offsetY": 3.89,
+ "attachAs": "w20"
},
"w1": {
"name": "W1",
"icon": "w1.svg",
- "offsetY": 3.89
+ "offsetY": 3.89,
+ "attachAs": "w1"
},
"latarnia_w4": {alias: "w4"},
"w4": {
diff --git a/src/model/track-objects/sign.js b/src/model/track-objects/sign.js
index be497e0..dbdad31 100644
--- a/src/model/track-objects/sign.js
+++ b/src/model/track-objects/sign.js
@@ -8,6 +8,7 @@ export default class Sign extends TrackObject {
data;
def;
attached_to = null;
+ attached_skip_rendering = false;
constructor(id, prefab_name, pos, rot, track_id, name, data) {
super(id, prefab_name, pos, rot, track_id, name);
diff --git a/src/model/vector3.js b/src/model/vector3.js
index 1f56871..1cdf9f7 100644
--- a/src/model/vector3.js
+++ b/src/model/vector3.js
@@ -124,6 +124,10 @@ export default class Vector3 {
return Math.sqrt(this.distanceSq(other));
}
+ distanceExcludeY(other) {
+ return Math.sqrt(this.distanceSqExcludeY(other));
+ }
+
mannhattanDistance(other) {
return Math.abs(this.x - other.x) + Math.abs(this.y - other.y) + Math.abs(this.z - other.z);
}