From 2df5a71241ad6db436a178ff422a3c96a1a9429b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20P?= Date: Fri, 20 Feb 2026 17:25:06 +0100 Subject: [PATCH] WIP: first reworking based on requirements NOTE: node loading logic not working yet! --- assets/pano/gradient.jpg | Bin 0 -> 37860 bytes config.js | 194 ++++++++++++++++++++++----------------- js/scene.js | 9 +- js/ui.js | 42 ++------- 4 files changed, 125 insertions(+), 120 deletions(-) create mode 100644 assets/pano/gradient.jpg diff --git a/assets/pano/gradient.jpg b/assets/pano/gradient.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41a4e458da7ac90b03ecd266cd02ddf548103bb1 GIT binary patch literal 37860 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 literal 0 HcmV?d00001 diff --git a/config.js b/config.js index 6f439c8..0f612d7 100644 --- a/config.js +++ b/config.js @@ -17,7 +17,7 @@ const theater2Popup = ` export const config = { scene : { initialExposure: 0.7, - autoLP: true, + autoLP: false, }, menu : { //audioBtn1 @@ -44,89 +44,115 @@ export const config = { uri : `${BASE_URI}/scenes/ssgp/`, popup: theater2Popup, coords: [45.4401, 12.3408], - nodes: [ - /* - { - label: 'Struttura principale', - model: 'models/ssgp/Teatro_SSGP_Full_ConSottrazioni.glb', - isMain: true, - }, - */ - { - label: 'Struttura parete di fondo', - model: 'models/ssgp/Teatro_SSGP_Layer_Struttura_parete_di_fondo.glb', - isMain: true, - }, - { - label: 'Ballatoio', - model: 'models/ssgp/Teatro_SSGP_Ballatoio.glb', - }, - { - label: 'Boccascena', - model: 'models/ssgp/Teatro_SSGP_Boccascena.glb', - }, - { - label: 'Fossa orchestra', - model: 'models/ssgp/Teatro_SSGP_Fossa_orchestra.glb', - }, - { - label: 'Graticcia', - model: 'models/ssgp/Teatro_SSGP_Graticcia.glb', - }, - { - label: 'Ordine 1', - model: 'models/ssgp/Teatro_SSGP_Ordine1.glb', - }, - { - label: 'Ordine 2', - model: 'models/ssgp/Teatro_SSGP_Ordine2.glb', - }, - { - label: 'Ordine 3', - model: 'models/ssgp/Teatro_SSGP_Ordine3.glb', - }, - { - label: 'Ordine 4', - model: 'models/ssgp/Teatro_SSGP_Ordine4.glb', - }, - { - label: 'Ordine 5', - model: 'models/ssgp/Teatro_SSGP_Ordine5.glb', - }, - { - label: 'Palcoscenico', - model: 'models/ssgp/Teatro_SSGP_Palcoscenico.glb', - }, - { - label: 'Parapetto scala piani', - model: 'models/ssgp/Teatro_SSGP_parapetto_scala_piani.glb', - }, - { - label: 'Percorsi scale corridoi', - model: 'models/ssgp/Teatro_SSGP_Percorsi_scale_corridoi.glb', - }, - { - label: 'Platea peplano', - model: 'models/ssgp/Teatro_SSGP_Platea_peplano.glb', - }, - { - label: 'Quinte architettoniche fisse', - model: 'models/ssgp/Teatro_SSGP_Layer_quinte_architettoniche_fisse.glb', - }, - { - label: 'Quinte architettoniche mobili', - model: 'models/ssgp/Teatro_SSGP_Layer_quinte_architettoniche_mobili.glb', - }, - { - label: 'Spazio tecnico superiore', - model: 'models/ssgp/Teatro_SSGP_Layer_Spazio_tecnico_sup_soffitta.glb', - }, - { - label: 'Spazio tecnico inferiore', - model: 'models/ssgp/Teatro_SSGP_Spazio_tecnico_inf.glb', - }, - ], - pano: `pano/defsky-grass.jpg`, + nodes: { + groups: [ + { + label: 'Teatro', + layers: [ + { + label: 'Struttura complessiva', + model: 'models/ssgp/Teatro_SSGP_Full_ConSottrazioni.glb', + //isMain: true, + }, + { + label: 'Involucro', + model: 'models/ssgp/Teatro_SSGP_Layer_Struttura_parete_di_fondo.glb', + isMain: true, + opacity: 0.2, + }, + ] + }, + { + label: 'Sala / Auditorium', + layers: [ + { + label: 'Peplano / Platea', + model: 'models/ssgp/Teatro_SSGP_Platea_peplano.glb', + }, + { + label: 'Ordine 1', + model: 'models/ssgp/Teatro_SSGP_Ordine1.glb', + }, + { + label: 'Ordine 2', + model: 'models/ssgp/Teatro_SSGP_Ordine2.glb', + }, + { + label: 'Ordine 3', + model: 'models/ssgp/Teatro_SSGP_Ordine3.glb', + }, + { + label: 'Ordine 4', + model: 'models/ssgp/Teatro_SSGP_Ordine4.glb', + }, + { + label: 'Ordine 5', + model: 'models/ssgp/Teatro_SSGP_Ordine5.glb', + }, + { + label: 'Parapetto', + model: 'models/ssgp/Teatro_SSGP_parapetto_scala_piani.glb', + }, + { + label: 'Percorsi pubblico', + model: 'models/ssgp/Teatro_SSGP_Percorsi_scale_corridoi.glb', + }, + ] + }, + { + label: 'Scena', + layers: [ + { + label: 'Palcoscenico', + model: 'models/ssgp/Teatro_SSGP_Palcoscenico.glb', + }, + { + label: 'Boccascena / Proscenio', + model: 'models/ssgp/Teatro_SSGP_Boccascena.glb', + }, + { + label: 'Quinte architettoniche fisse', + model: 'models/ssgp/Teatro_SSGP_Layer_quinte_architettoniche_fisse.glb', + }, + { + label: 'Quinte architettoniche mobili', + model: 'models/ssgp/Teatro_SSGP_Layer_quinte_architettoniche_mobili.glb', + }, + ] + }, + { + label: 'Spazi tecnici', + layers: [ + { + label: 'Spazio tecnico superiore', + model: 'models/ssgp/Teatro_SSGP_Layer_Spazio_tecnico_sup_soffitta.glb', + }, + { + label: 'Graticcia', + model: 'models/ssgp/Teatro_SSGP_Graticcia.glb', + }, + { + label: 'Ballatoio', + model: 'models/ssgp/Teatro_SSGP_Ballatoio.glb', + }, + { + label: 'Spazio tecnico inferiore', + model: 'models/ssgp/Teatro_SSGP_Spazio_tecnico_inf.glb', + }, + ] + }, + { + label: 'Orchestra', + layers: [ + { + label: 'Fossa orchestra', + model: 'models/ssgp/Teatro_SSGP_Fossa_orchestra.glb', + }, + ] + } + ], + }, + pano: `pano/gradient.jpg`, } ], map : { diff --git a/js/scene.js b/js/scene.js index 3dfea54..a36086e 100644 --- a/js/scene.js +++ b/js/scene.js @@ -62,7 +62,7 @@ Scene.createClippingPlaneMesh = function (boundingSphere) { const planeSize = boundingSphere.radius * 1.5; const mesh = new THREE.Mesh( new THREE.PlaneGeometry(planeSize, planeSize), - new THREE.MeshBasicMaterial({ color: 0xffff00, opacity: 0.1, side: THREE.DoubleSide, transparent: true }) + new THREE.MeshBasicMaterial({ color: 0xffff00, opacity: 0.05, side: THREE.DoubleSide, transparent: true }) ); return mesh; @@ -261,6 +261,12 @@ Scene.loadNodes = function (nodes) { let node = ATON.createSceneNode(n.label); node.load(n.model); node.setRotation(0, 1.5, 0); + + // Apply any transparency before attaching to scene + if (n.opacity) { + node.setMaterial(new THREE.MeshPhongMaterial({transparent: true, opacity: n.opacity, color: '#fff'})); + } + node.attachToRoot(); if (n.isMain) { @@ -269,6 +275,7 @@ Scene.loadNodes = function (nodes) { AppState.clipping.boundingSphere = node.getBound(); } + AppState.nodes.push({id: n.label, active: true}); }); } diff --git a/js/ui.js b/js/ui.js index 0d88fba..eb9dd52 100644 --- a/js/ui.js +++ b/js/ui.js @@ -12,21 +12,21 @@ UI.contentMenuTabs = `
-
-
+
+
`; @@ -166,20 +166,11 @@ UI.toggleSettingsPanel = function(triggerId) { `; - const lightProbeSwitch = document.createElement('div'); - lightProbeSwitch.className = 'form-check form-switch ms-4 mt-2'; - lightProbeSwitch.innerHTML = ` - - - `; - shadowsSwitch.querySelector('input[type="checkbox"').checked = AppState.shadows; ambientOcclSwitch.querySelector('input[type="checkbox"').checked = AppState.ambientOcclusion; - lightProbeSwitch.querySelector('input[type="checkbox"').checked = AppState.lightProbe; ATON.UI.elSidePanel.appendChild(ambientOcclSwitch); ATON.UI.elSidePanel.appendChild(shadowsSwitch); - ATON.UI.elSidePanel.appendChild(lightProbeSwitch); // TODO: move somewhere else... document.querySelector('#aoSwitch').addEventListener( @@ -197,18 +188,6 @@ UI.toggleSettingsPanel = function(triggerId) { AppState.shadows = checked; } ); - // Not working properly? - document.querySelector('#lpSwitch').addEventListener( - 'change', - event => { - const checked = event.target.checked; - ATON.setAutoLP(checked); - //if (!checked) ATON.clearLightProbes(); - AppState.lightProbe = checked; - if (checked) ATON.updateLightProbes(); - console.log('Light probe: ', checked); - } - ); }); } /** @@ -246,19 +225,12 @@ UI.toggleContentMenu = function(triggerId) { btn.addEventListener('click', () => { ATON.UI.setSidePanelRight(); - ATON.UI.showSidePanel({header: 'Contenuti'}); + ATON.UI.showSidePanel({header: 'Menu'}); // Append tabs, then tab panes const tabs = this.domParser.parseFromString(UI.contentMenuTabs, 'text/html'); ATON.UI.elSidePanel.appendChild(tabs.querySelector('#content-tabs')); ATON.UI.elSidePanel.appendChild(tabs.querySelector('.tab-content')); this.buildLayersMenu(AppState.nodes, ATON.UI.elSidePanel.querySelector('#layer')); - - // This is just an example, at the moment... to be revised with config -> markers (scenes) -> menu - if (AppState.sceneHasAudio) { - let btn = this.domParser.parseFromString(UI.audioExample, 'text/html'); - const audio = btn.querySelector('#audio-example'); - ATON.UI.elSidePanel.querySelector('#media').appendChild(audio); - } }); } /**