From 5e8a9439548d8f97926bf88e09a2f1038878c5aa Mon Sep 17 00:00:00 2001 From: izawartka <59137928+izawartka@users.noreply.github.com> Date: Thu, 31 Jul 2025 22:45:52 +0200 Subject: [PATCH] Added Sign text caching +Added the Sign.text field, assigned when the object is created *Modified SignRenderer to use Sign.text instead of looking for the text on every render *Sign texts are now transferred to Signal Signs when the Sign is assigned to a Signal --- .../map/object-renderers/SignRenderer.js | 26 ++--------------- src/model/attach-signs.js | 2 +- src/model/track-objects/sign.js | 29 +++++++++++++++++++ 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/components/map/object-renderers/SignRenderer.js b/src/components/map/object-renderers/SignRenderer.js index 12a6f32..4e9e53e 100644 --- a/src/components/map/object-renderers/SignRenderer.js +++ b/src/components/map/object-renderers/SignRenderer.js @@ -31,14 +31,8 @@ export default function SignRenderer(props) { function SignTextRenderer(props) { const { object } = props; - - const textSources = !!object.def.text ? Array.isArray(object.def.text) ? object.def.text : [object.def.text] : []; - let text = null; - for(const source of textSources) { - text = getSignText(object, source); - if(text) break; - } - + if(!object.text) return; + const x = object.def.textOffsetX || 0; const y = object.def.textOffsetY || 0; @@ -50,21 +44,7 @@ function SignTextRenderer(props) { textAnchor="middle" dominantBaseline="central" > - {text} + {object.text} ); } - -function getSignText(object, source) { - switch(source) { - case "fun": - return object.def.textFun ? object.def.textFun(object) : null; - case "data": - return object.getPrintableSignData(); - case "static": - return object.def.staticText ?? null; - default: - console.warn(`Unknown sign ${object.id} text source: ${source}`); - return null; - } -} diff --git a/src/model/attach-signs.js b/src/model/attach-signs.js index bf31bc9..1dd0c67 100644 --- a/src/model/attach-signs.js +++ b/src/model/attach-signs.js @@ -56,7 +56,7 @@ function attach(sign, signal) { if(!attachAs || !signal.signal_elements) return; sign.attached_skip_rendering = true; - signal.signal_elements.signs[attachAs] = true; + signal.signal_elements.signs[attachAs] = sign.text ? { text: sign.text } : true; } export function attachSigns(scenery) { diff --git a/src/model/track-objects/sign.js b/src/model/track-objects/sign.js index dbdad31..f077e6e 100644 --- a/src/model/track-objects/sign.js +++ b/src/model/track-objects/sign.js @@ -7,6 +7,7 @@ export default class Sign extends TrackObject { type = "Sign"; data; def; + text = null; attached_to = null; attached_skip_rendering = false; @@ -15,6 +16,7 @@ export default class Sign extends TrackObject { this.data = data || null; this.def = Sign.getDef(name, prefab_name); + this._assignText(); } getPrintableSignData() { @@ -84,4 +86,31 @@ export default class Sign extends TrackObject { return DefinedSigns[key]; } + + _assignText() { + if(!this.def?.text) return; + + const textSources = Array.isArray(this.def.text) ? this.def.text : [this.def.text]; + let text = null; + for(const source of textSources) { + text = Sign.getTextFromSource(this, source); + if(text) break; + } + + this.text = text; + } + + static getTextFromSource(object, source) { + switch(source) { + case "fun": + return object.def.textFun ? object.def.textFun(object) : null; + case "data": + return object.getPrintableSignData(); + case "static": + return object.def.staticText ?? null; + default: + console.warn(`Unknown sign ${object.id} text source: ${source}`); + return null; + } + } } \ No newline at end of file