From 35300aa57a6743a1796554bf28a757aac6fa6830 Mon Sep 17 00:00:00 2001 From: m Date: Sat, 7 Feb 2026 12:19:19 +0100 Subject: [PATCH] Add furniture click events, OrbitControls toggle, and floor change event - Export COLORS for external module access (themes) - Extend _onClick to detect furniture clicks before room clicks, dispatching 'furnitureclick' with catalog/room/mesh details - Add setControlsEnabled(enabled) to toggle OrbitControls - Dispatch 'floorchange' event from showFloor() - Wire up furnitureclick in index.html to show item info --- src/index.html | 5 +++++ src/renderer.js | 26 ++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/index.html b/src/index.html index 0920041..70c9cbe 100644 --- a/src/index.html +++ b/src/index.html @@ -151,6 +151,11 @@ viewer.addEventListener('roomclick', (e) => { selectRoom(e.detail.roomId); }); + + viewer.addEventListener('furnitureclick', (e) => { + const d = e.detail; + document.getElementById('info').textContent = `${d.itemName} — in ${renderer.getRooms().find(r => r.id === d.roomId)?.name || d.roomId}`; + }); diff --git a/src/renderer.js b/src/renderer.js index c7d12ce..2876f09 100644 --- a/src/renderer.js +++ b/src/renderer.js @@ -1,7 +1,7 @@ import * as THREE from 'three'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; -const COLORS = { +export const COLORS = { wall: { exterior: 0xe8e0d4, interior: 0xf5f0eb @@ -151,6 +151,14 @@ export class HouseRenderer { } this._placeFurnitureForFloor(); + + this.container.dispatchEvent(new CustomEvent('floorchange', { + detail: { index, floor } + })); + } + + setControlsEnabled(enabled) { + this.controls.enabled = enabled; } _clearFloor() { @@ -506,9 +514,23 @@ export class HouseRenderer { for (const hit of intersects) { let obj = hit.object; - while (obj && !obj.userData.roomId) { + // Walk up to find furniture or room group + while (obj && !obj.userData.isFurniture && !obj.userData.roomId) { obj = obj.parent; } + if (obj && obj.userData.isFurniture) { + this.container.dispatchEvent(new CustomEvent('furnitureclick', { + detail: { + catalogId: obj.userData.catalogId, + roomId: obj.userData.roomId, + itemName: obj.userData.itemName, + wallMounted: obj.userData.wallMounted, + mesh: obj, + point: hit.point + } + })); + return; + } if (obj && obj.userData.roomId) { this.highlightRoom(obj.userData.roomId); this.container.dispatchEvent(new CustomEvent('roomclick', {