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); }