From 87bfe9b3327c1227765c2dcaed3d0befd26f461c Mon Sep 17 00:00:00 2001 From: Alexander Whitestone Date: Fri, 10 Apr 2026 19:38:53 +0000 Subject: [PATCH] feat(mnemosyne): add crystal mesh query + highlight/select API for click-to-inspect --- nexus/components/spatial-memory.js | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/nexus/components/spatial-memory.js b/nexus/components/spatial-memory.js index 2fd20d00..02e6e9cd 100644 --- a/nexus/components/spatial-memory.js +++ b/nexus/components/spatial-memory.js @@ -471,9 +471,50 @@ const SpatialMemory = (() => { return results.slice(0, maxResults); } + + // ─── CRYSTAL MESH COLLECTION (for raycasting) ──────── + function getCrystalMeshes() { + return Object.values(_memoryObjects).map(o => o.mesh); + } + + // ─── MEMORY DATA FROM MESH ─────────────────────────── + function getMemoryFromMesh(mesh) { + const entry = Object.values(_memoryObjects).find(o => o.mesh === mesh); + return entry ? { data: entry.data, region: entry.region } : null; + } + + // ─── HIGHLIGHT / SELECT ────────────────────────────── + let _selectedId = null; + let _selectedOriginalEmissive = null; + + function highlightMemory(memId) { + clearHighlight(); + const obj = _memoryObjects[memId]; + if (!obj) return; + _selectedId = memId; + _selectedOriginalEmissive = obj.mesh.material.emissiveIntensity; + obj.mesh.material.emissiveIntensity = 4.0; + obj.mesh.userData.selected = true; + } + + function clearHighlight() { + if (_selectedId && _memoryObjects[_selectedId]) { + const obj = _memoryObjects[_selectedId]; + obj.mesh.material.emissiveIntensity = _selectedOriginalEmissive || (obj.data.strength || 0.7) * 2.5; + obj.mesh.userData.selected = false; + } + _selectedId = null; + _selectedOriginalEmissive = null; + } + + function getSelectedId() { + return _selectedId; + } + return { init, placeMemory, removeMemory, update, getMemoryAtPosition, getRegionAtPosition, getMemoriesInRegion, getAllMemories, + getCrystalMeshes, getMemoryFromMesh, highlightMemory, clearHighlight, getSelectedId, exportIndex, importIndex, searchNearby, REGIONS, saveToStorage, loadFromStorage, clearStorage };