diff --git a/src/components/SceneryManager.js b/src/components/SceneryManager.js index adf2ce8..b9605a1 100644 --- a/src/components/SceneryManager.js +++ b/src/components/SceneryManager.js @@ -38,6 +38,16 @@ export default function SceneryManager(props) { } }, [myFetch]); + const updateViewAfterSceneryLoaded = useCallback((scenery) => { + const mainSignalBox = scenery.getMainSignalBox(); + if(mainSignalBox) { + const sbPos = mainSignalBox.pos.toSVGCoords(); + const sbRot = -mainSignalBox.getFinalRotation(); + setCamera(...sbPos, sbRot, Constants.map.zoomDefault); + } + else setCamera(0, 0, 0, Constants.map.zoomDefault); + }, [setCamera]); + const loadCustomScenery = useCallback((file) => { return new Promise((resolve, reject) => { let alreadyLoading; @@ -66,13 +76,7 @@ export default function SceneryManager(props) { let loadingError = null; try { scenery = SceneryParser.fromText(e.target?.result); - const mainSignalBox = scenery.signalBoxes?.[0]; - if(mainSignalBox) { - const sbPos = mainSignalBox.pos.toSVGCoords(); - const sbRot = -mainSignalBox.getFinalRotation(); - setCamera(...sbPos, sbRot, Constants.map.zoomDefault); - } - else setCamera(0, 0, 0, Constants.map.zoomDefault); + updateViewAfterSceneryLoaded(scenery); } catch (error) { scenery = null; loadingError = error; @@ -85,7 +89,7 @@ export default function SceneryManager(props) { resolve(scenery); } }); - }, [setCamera]); + }, [updateViewAfterSceneryLoaded]); const loadScenery = useCallback(async (sceneryName) => { let file; diff --git a/src/model/scenery.js b/src/model/scenery.js index 1d1d321..4461278 100644 --- a/src/model/scenery.js +++ b/src/model/scenery.js @@ -58,6 +58,14 @@ export default class Scenery }); } + getMainSignalBox() { + if(this.signalBoxes.length === 0) return null; + + const mainSignalBoxName = this.objects.special?.SceneryInfo?.['main_signalbox']; + const foundMainSignalBox = this.signalBoxes.find(sb => sb.name === mainSignalBoxName); + return foundMainSignalBox || this.signalBoxes[0]; + } + _applyCategory(category) { if(!this.objects[category]) return;