diff --git a/nexus/components/spatial-memory.js b/nexus/components/spatial-memory.js index 2fd20d00e..02e6e9cdf 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 };