immersive2/package.json
Michael Mainguy 970f6fc78a Fix label positioning, add billboard mode, fix XR entry shift, and fix config system
Label Positioning Fixes:
- Fix labels accounting for mesh scaling using maximumWorld coordinates
- Labels now properly positioned on scaled objects (spheres, boxes, etc.)
- Restore world→local coordinate transformation in updateLabelPosition

Billboard Mode Implementation:
- Add configurable label rendering modes: fixed, billboard, dynamic, distance-based
- Implement billboard mode (labels always face camera using BILLBOARDMODE_Y)
- Add label rendering mode to AppConfig with default 'billboard'
- Add UI selector in ConfigModal for label rendering mode
- Observable pattern updates all existing labels when mode changes

XR Entry Positioning Fix:
- Synchronize desktop camera position to platform before entering XR
- Transfer camera world position and rotation to prevent scene shift
- Reset physics velocity on XR entry to prevent drift
- Add debug logging for position synchronization

Config System Architecture Fix:
- Create singleton appConfigInstance to ensure single source of truth
- Update DiagramObject to use singleton instead of creating instances
- Update DiagramManager to use singleton
- Fix ConfigModal to update AppConfig directly (was only updating legacy config)
- ConfigModal now triggers Observable notifications via appConfigInstance setters
- Maintain legacy config for backward compatibility
- Fixes issue where label rendering mode changes didn't take effect

Files Modified:
- src/diagram/diagramObject.ts - Label positioning, billboard mode, singleton config
- src/diagram/diagramManager.ts - Use singleton config
- src/util/appConfig.ts - Add labelRenderingMode, export singleton
- src/util/appConfigType.ts - Add LabelRenderingMode type
- src/react/pages/configModal.tsx - Update AppConfig directly, add label mode UI
- src/util/functions/groundMeshObserver.ts - Add camera position sync on XR entry
- public/api/user/features - Update test config
- package.json - Version bump

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 08:52:04 -06:00

72 lines
2.0 KiB
JSON

{
"name": "immersive",
"private": true,
"version": "0.0.8-28",
"type": "module",
"license": "MIT",
"engines": {
"node": ">=18.0.0"
},
"scripts": {
"dev": "vite",
"test": "vitest",
"build": "node versionBump.js && vite build",
"preview": "vite preview",
"socket": "node server/server.js",
"serve": "node server.js",
"serverBuild": "cd server && tsc",
"havok": "cp ./node_modules/@babylonjs/havok/lib/esm/HavokPhysics.wasm ./node_modules/.vite/deps"
},
"dependencies": {
"@auth0/auth0-react": "^2.2.4",
"@babylonjs/core": "^8.16.2",
"@babylonjs/gui": "^8.16.2",
"@babylonjs/havok": "1.3.4",
"@babylonjs/inspector": "^8.16.2",
"@babylonjs/loaders": "^8.16.2",
"@babylonjs/materials": "^8.16.2",
"@babylonjs/serializers": "^8.16.2",
"@emotion/react": "^11.13.0",
"@mantine/core": "^7.17.8",
"@mantine/form": "^7.17.8",
"@mantine/hooks": "^7.17.8",
"@giphy/react-components": "^9.6.0",
"@giphy/js-fetch-api": "^5.6.0",
"@maptiler/client": "1.8.1",
"@picovoice/cobra-web": "^2.0.3",
"@picovoice/eagle-web": "^1.0.0",
"@picovoice/web-voice-processor": "^4.0.9",
"@types/node": "^18.14.0",
"@types/react": "^18.2.72",
"@types/react-dom": "^18.2.22",
"axios": "^1.10.0",
"canvas-hypertxt": "1.0.3",
"events": "^3.3.0",
"hash-wasm": "4.11.0",
"hls.js": "^1.1.4",
"js-crypto-aes": "1.0.6",
"loglevel": "^1.9.1",
"meaningful-string": "^1.4.0",
"peer-lite": "2.0.2",
"use-pouchdb": "^2.0.2",
"pouchdb": "^8.0.1",
"pouchdb-find": "^8.0.1",
"query-string": "^8.1.0",
"react-router-dom": "^6.26.1",
"@tabler/icons-react": "^3.14.0",
"recordrtc": "^5.6.0",
"rfc4648": "^1.5.3",
"round": "^2.0.1",
"uint8-to-b64": "^1.0.2",
"uuid": "^9.0.1",
"websocket": "^1.0.34",
"websocket-ts": "^2.1.5"
},
"devDependencies": {
"@types/dom-to-image": "^2.6.7",
"typescript": "^4.9.5",
"vite": "^5.2.9",
"vite-plugin-cp": "^1.0.0",
"vitest": "^1.4.0"
}
}