@nice2dev/ui-3d 1.0.0 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +115 -1
- package/dist/cjs/collaborative/collaborativeScene.js +210 -0
- package/dist/cjs/collaborative/collaborativeScene.js.map +1 -0
- package/dist/cjs/core/i18n.js +3 -3
- package/dist/cjs/core/i18n.js.map +1 -1
- package/dist/cjs/dance/DanceBridge.js +162 -0
- package/dist/cjs/dance/DanceBridge.js.map +1 -0
- package/dist/cjs/dance/DanceScoreEngine.js +210 -0
- package/dist/cjs/dance/DanceScoreEngine.js.map +1 -0
- package/dist/cjs/dance/PoseDetector.js +199 -0
- package/dist/cjs/dance/PoseDetector.js.map +1 -0
- package/dist/cjs/index.js +254 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/material/MaterialEditor.module.css.js +6 -0
- package/dist/cjs/material/MaterialEditor.module.css.js.map +1 -0
- package/dist/cjs/material/NiceMaterialEditor.js +737 -0
- package/dist/cjs/material/NiceMaterialEditor.js.map +1 -0
- package/dist/cjs/material/materialEditorTypes.js +73 -0
- package/dist/cjs/material/materialEditorTypes.js.map +1 -0
- package/dist/cjs/material/materialEditorUtils.js +841 -0
- package/dist/cjs/material/materialEditorUtils.js.map +1 -0
- package/dist/cjs/material/materialNodeDefinitions.js +1285 -0
- package/dist/cjs/material/materialNodeDefinitions.js.map +1 -0
- package/dist/cjs/model/ModelEditor.js +4 -1
- package/dist/cjs/model/ModelEditor.js.map +1 -1
- package/dist/cjs/model/ModelEditor.module.css.js +1 -1
- package/dist/cjs/model/ModelEditorLeftPanel.js +5 -4
- package/dist/cjs/model/ModelEditorLeftPanel.js.map +1 -1
- package/dist/cjs/model/ModelEditorMenuBar.js +8 -3
- package/dist/cjs/model/ModelEditorMenuBar.js.map +1 -1
- package/dist/cjs/model/ModelEditorRightPanel.js +27 -26
- package/dist/cjs/model/ModelEditorRightPanel.js.map +1 -1
- package/dist/cjs/model/ModelEditorSubComponents.js +20 -16
- package/dist/cjs/model/ModelEditorSubComponents.js.map +1 -1
- package/dist/cjs/model/ModelEditorTimeline.js +5 -4
- package/dist/cjs/model/ModelEditorTimeline.js.map +1 -1
- package/dist/cjs/model/ModelEditorToolbar.js +4 -3
- package/dist/cjs/model/ModelEditorToolbar.js.map +1 -1
- package/dist/cjs/model/ModelEditorViewport.js +2 -2
- package/dist/cjs/model/ModelEditorViewport.js.map +1 -1
- package/dist/cjs/model/ModelViewer.js +68 -0
- package/dist/cjs/model/ModelViewer.js.map +1 -0
- package/dist/cjs/model/ModelViewer.module.css.js +6 -0
- package/dist/cjs/model/ModelViewer.module.css.js.map +1 -0
- package/dist/cjs/model/NiceArmatureEditor.js +255 -0
- package/dist/cjs/model/NiceArmatureEditor.js.map +1 -0
- package/dist/cjs/model/NiceMorphTargetEditor.js +206 -0
- package/dist/cjs/model/NiceMorphTargetEditor.js.map +1 -0
- package/dist/cjs/model/NiceOctree.js +339 -0
- package/dist/cjs/model/NiceOctree.js.map +1 -0
- package/dist/cjs/model/NicePhysicsSimulation.js +283 -0
- package/dist/cjs/model/NicePhysicsSimulation.js.map +1 -0
- package/dist/cjs/model/NiceProceduralGeometry.js +269 -0
- package/dist/cjs/model/NiceProceduralGeometry.js.map +1 -0
- package/dist/cjs/model/NiceTerrainEditor.js +343 -0
- package/dist/cjs/model/NiceTerrainEditor.js.map +1 -0
- package/dist/cjs/model/NiceWeightPainter.js +258 -0
- package/dist/cjs/model/NiceWeightPainter.js.map +1 -0
- package/dist/cjs/model/NiceXRPreview.js +269 -0
- package/dist/cjs/model/NiceXRPreview.js.map +1 -0
- package/dist/cjs/model/cadModeUtils.js +130 -0
- package/dist/cjs/model/cadModeUtils.js.map +1 -0
- package/dist/cjs/model/editorShortcuts.js +187 -0
- package/dist/cjs/model/editorShortcuts.js.map +1 -0
- package/dist/cjs/model/modelEditorTypes.js +11 -0
- package/dist/cjs/model/modelEditorTypes.js.map +1 -1
- package/dist/cjs/model/modelEditorUtils.js +1049 -0
- package/dist/cjs/model/modelEditorUtils.js.map +1 -0
- package/dist/cjs/model/simsModeUtils.js +358 -0
- package/dist/cjs/model/simsModeUtils.js.map +1 -0
- package/dist/cjs/model/useModelEditor.js +319 -115
- package/dist/cjs/model/useModelEditor.js.map +1 -1
- package/dist/cjs/model/useModelViewer.js +634 -0
- package/dist/cjs/model/useModelViewer.js.map +1 -0
- package/dist/cjs/nice2dev-ui-3d.css +1 -1
- package/dist/cjs/particle/NiceParticleEditor.js +526 -0
- package/dist/cjs/particle/NiceParticleEditor.js.map +1 -0
- package/dist/cjs/particle/ParticleEditor.module.css.js +6 -0
- package/dist/cjs/particle/ParticleEditor.module.css.js.map +1 -0
- package/dist/cjs/particle/particleEditorTypes.js +92 -0
- package/dist/cjs/particle/particleEditorTypes.js.map +1 -0
- package/dist/cjs/particle/particleEditorUtils.js +1084 -0
- package/dist/cjs/particle/particleEditorUtils.js.map +1 -0
- package/dist/cjs/rendering/NiceCascadedShadows.js +266 -0
- package/dist/cjs/rendering/NiceCascadedShadows.js.map +1 -0
- package/dist/cjs/rendering/NiceRenderExport.js +341 -0
- package/dist/cjs/rendering/NiceRenderExport.js.map +1 -0
- package/dist/cjs/rendering/NiceSSAO.js +359 -0
- package/dist/cjs/rendering/NiceSSAO.js.map +1 -0
- package/dist/cjs/rendering/NiceSSR.js +277 -0
- package/dist/cjs/rendering/NiceSSR.js.map +1 -0
- package/dist/cjs/rendering/NiceWebGPURenderer.js +215 -0
- package/dist/cjs/rendering/NiceWebGPURenderer.js.map +1 -0
- package/dist/cjs/ui/dist/index.js +50089 -0
- package/dist/cjs/ui/dist/index.js.map +1 -0
- package/dist/cjs/uv/NiceUVEditor.js +520 -0
- package/dist/cjs/uv/NiceUVEditor.js.map +1 -0
- package/dist/cjs/uv/UVEditor.module.css.js +6 -0
- package/dist/cjs/uv/UVEditor.module.css.js.map +1 -0
- package/dist/cjs/uv/uvEditorTypes.js +98 -0
- package/dist/cjs/uv/uvEditorTypes.js.map +1 -0
- package/dist/cjs/uv/uvEditorUtils.js +670 -0
- package/dist/cjs/uv/uvEditorUtils.js.map +1 -0
- package/dist/esm/collaborative/collaborativeScene.js +206 -0
- package/dist/esm/collaborative/collaborativeScene.js.map +1 -0
- package/dist/esm/dance/DanceBridge.js +158 -0
- package/dist/esm/dance/DanceBridge.js.map +1 -0
- package/dist/esm/dance/DanceScoreEngine.js +207 -0
- package/dist/esm/dance/DanceScoreEngine.js.map +1 -0
- package/dist/esm/dance/PoseDetector.js +195 -0
- package/dist/esm/dance/PoseDetector.js.map +1 -0
- package/dist/esm/index.js +35 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/material/MaterialEditor.module.css.js +4 -0
- package/dist/esm/material/MaterialEditor.module.css.js.map +1 -0
- package/dist/esm/material/NiceMaterialEditor.js +734 -0
- package/dist/esm/material/NiceMaterialEditor.js.map +1 -0
- package/dist/esm/material/materialEditorTypes.js +62 -0
- package/dist/esm/material/materialEditorTypes.js.map +1 -0
- package/dist/esm/material/materialEditorUtils.js +811 -0
- package/dist/esm/material/materialEditorUtils.js.map +1 -0
- package/dist/esm/material/materialNodeDefinitions.js +1280 -0
- package/dist/esm/material/materialNodeDefinitions.js.map +1 -0
- package/dist/esm/model/ModelEditor.js +4 -2
- package/dist/esm/model/ModelEditor.js.map +1 -1
- package/dist/esm/model/ModelEditor.module.css.js +1 -1
- package/dist/esm/model/ModelEditorLeftPanel.js +5 -4
- package/dist/esm/model/ModelEditorLeftPanel.js.map +1 -1
- package/dist/esm/model/ModelEditorMenuBar.js +8 -3
- package/dist/esm/model/ModelEditorMenuBar.js.map +1 -1
- package/dist/esm/model/ModelEditorRightPanel.js +27 -26
- package/dist/esm/model/ModelEditorRightPanel.js.map +1 -1
- package/dist/esm/model/ModelEditorSubComponents.js +17 -13
- package/dist/esm/model/ModelEditorSubComponents.js.map +1 -1
- package/dist/esm/model/ModelEditorTimeline.js +5 -4
- package/dist/esm/model/ModelEditorTimeline.js.map +1 -1
- package/dist/esm/model/ModelEditorToolbar.js +4 -3
- package/dist/esm/model/ModelEditorToolbar.js.map +1 -1
- package/dist/esm/model/ModelEditorViewport.js +2 -2
- package/dist/esm/model/ModelEditorViewport.js.map +1 -1
- package/dist/esm/model/ModelViewer.js +65 -0
- package/dist/esm/model/ModelViewer.js.map +1 -0
- package/dist/esm/model/ModelViewer.module.css.js +4 -0
- package/dist/esm/model/ModelViewer.module.css.js.map +1 -0
- package/dist/esm/model/NiceArmatureEditor.js +233 -0
- package/dist/esm/model/NiceArmatureEditor.js.map +1 -0
- package/dist/esm/model/NiceMorphTargetEditor.js +184 -0
- package/dist/esm/model/NiceMorphTargetEditor.js.map +1 -0
- package/dist/esm/model/NiceOctree.js +317 -0
- package/dist/esm/model/NiceOctree.js.map +1 -0
- package/dist/esm/model/NicePhysicsSimulation.js +261 -0
- package/dist/esm/model/NicePhysicsSimulation.js.map +1 -0
- package/dist/esm/model/NiceProceduralGeometry.js +242 -0
- package/dist/esm/model/NiceProceduralGeometry.js.map +1 -0
- package/dist/esm/model/NiceTerrainEditor.js +321 -0
- package/dist/esm/model/NiceTerrainEditor.js.map +1 -0
- package/dist/esm/model/NiceWeightPainter.js +236 -0
- package/dist/esm/model/NiceWeightPainter.js.map +1 -0
- package/dist/esm/model/NiceXRPreview.js +247 -0
- package/dist/esm/model/NiceXRPreview.js.map +1 -0
- package/dist/esm/model/cadModeUtils.js +103 -0
- package/dist/esm/model/cadModeUtils.js.map +1 -0
- package/dist/esm/model/editorShortcuts.js +185 -0
- package/dist/esm/model/editorShortcuts.js.map +1 -0
- package/dist/esm/model/modelEditorTypes.js +11 -0
- package/dist/esm/model/modelEditorTypes.js.map +1 -1
- package/dist/esm/model/modelEditorUtils.js +997 -0
- package/dist/esm/model/modelEditorUtils.js.map +1 -0
- package/dist/esm/model/simsModeUtils.js +325 -0
- package/dist/esm/model/simsModeUtils.js.map +1 -0
- package/dist/esm/model/useModelEditor.js +204 -0
- package/dist/esm/model/useModelEditor.js.map +1 -1
- package/dist/esm/model/useModelViewer.js +613 -0
- package/dist/esm/model/useModelViewer.js.map +1 -0
- package/dist/esm/nice2dev-ui-3d.css +1 -1
- package/dist/esm/particle/NiceParticleEditor.js +523 -0
- package/dist/esm/particle/NiceParticleEditor.js.map +1 -0
- package/dist/esm/particle/ParticleEditor.module.css.js +4 -0
- package/dist/esm/particle/ParticleEditor.module.css.js.map +1 -0
- package/dist/esm/particle/particleEditorTypes.js +84 -0
- package/dist/esm/particle/particleEditorTypes.js.map +1 -0
- package/dist/esm/particle/particleEditorUtils.js +1054 -0
- package/dist/esm/particle/particleEditorUtils.js.map +1 -0
- package/dist/esm/rendering/NiceCascadedShadows.js +244 -0
- package/dist/esm/rendering/NiceCascadedShadows.js.map +1 -0
- package/dist/esm/rendering/NiceRenderExport.js +319 -0
- package/dist/esm/rendering/NiceRenderExport.js.map +1 -0
- package/dist/esm/rendering/NiceSSAO.js +337 -0
- package/dist/esm/rendering/NiceSSAO.js.map +1 -0
- package/dist/esm/rendering/NiceSSR.js +255 -0
- package/dist/esm/rendering/NiceSSR.js.map +1 -0
- package/dist/esm/rendering/NiceWebGPURenderer.js +193 -0
- package/dist/esm/rendering/NiceWebGPURenderer.js.map +1 -0
- package/dist/esm/ui/dist/index.js +49686 -0
- package/dist/esm/ui/dist/index.js.map +1 -0
- package/dist/esm/uv/NiceUVEditor.js +518 -0
- package/dist/esm/uv/NiceUVEditor.js.map +1 -0
- package/dist/esm/uv/UVEditor.module.css.js +4 -0
- package/dist/esm/uv/UVEditor.module.css.js.map +1 -0
- package/dist/esm/uv/uvEditorTypes.js +88 -0
- package/dist/esm/uv/uvEditorTypes.js.map +1 -0
- package/dist/esm/uv/uvEditorUtils.js +621 -0
- package/dist/esm/uv/uvEditorUtils.js.map +1 -0
- package/package.json +3 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,73 @@
|
|
|
1
|
-
# Changelog
|
|
1
|
+
# @nice2dev/ui-3d — Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to the 3D model editor package.
|
|
4
|
+
|
|
5
|
+
## [Unreleased] — OmniVerk Professional Roadmap
|
|
6
|
+
|
|
7
|
+
### Planned — Spatial/CAD Integration (PRO-2)
|
|
8
|
+
|
|
9
|
+
- **Shared Object Model** — wspólne typy SpatialObject3D dla edytorów 2D i 3D
|
|
10
|
+
- **2D↔3D Extrusion** — automatyczna ekstruzja z floor plan do modelu 3D
|
|
11
|
+
- **3D→2D Projection** — rzutowanie 3D na plan piętra
|
|
12
|
+
- **Quick Switch** — przycisk "Edit in 2D/3D" z zachowaniem kontekstu
|
|
13
|
+
- **Split View Mode** — równoczesna edycja 2D/3D obok siebie
|
|
14
|
+
- **Cross-Editor Undo** — wspólny undo stack między edytorami
|
|
15
|
+
|
|
16
|
+
### Planned — Professional CAD Features (PRO-2.3)
|
|
17
|
+
|
|
18
|
+
- **Parametric Constraints** — wymiarowe ograniczenia (prostopadłość, równoległość)
|
|
19
|
+
- **Boolean Operations** — union, subtract, intersect z podglądem
|
|
20
|
+
- **Section Views** — przekroje z kreskowaniem
|
|
21
|
+
- **Drawing Sheets** — eksport technicznych rysunków (DXF/DWG/PDF)
|
|
22
|
+
- **BOM Generation** — automatyczne zestawienia materiałów
|
|
23
|
+
|
|
24
|
+
### Planned — BIM/AEC Features (PRO-2.4)
|
|
25
|
+
|
|
26
|
+
- **IFC Import/Export** — pełna obsługa Industry Foundation Classes
|
|
27
|
+
- **MEP Routing** — HVAC, hydraulika, elektryka
|
|
28
|
+
- **Clash Detection** — wykrywanie kolizji między systemami
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## [1.0.1] — 2026-03-25
|
|
33
|
+
|
|
34
|
+
### Added (FAZA 7.3)
|
|
35
|
+
|
|
36
|
+
- **UV Editor** — texture mapping on 3D models
|
|
37
|
+
- **Node-based material editor** — visual shader creation (node graph)
|
|
38
|
+
- **Armature/Rig editor** — skeleton editing
|
|
39
|
+
- **Weight painting** — bone influence painting on vertices
|
|
40
|
+
- **Morph targets / blend shapes** — face animations
|
|
41
|
+
- **Map/Level/Terrain editor** — scene/map creation from 3D elements, save/load
|
|
42
|
+
- **Physics simulation** — Ammo.js / Rapier integration
|
|
43
|
+
- **Particle systems editor** — particle effect creation
|
|
44
|
+
- **Procedural geometry** — tree, terrain, building generation
|
|
45
|
+
- **VR/AR preview mode** — WebXR scene preview
|
|
46
|
+
- **Octree ray-casting** — faster collision detection for large scenes
|
|
47
|
+
- **WebGPU renderer** — Three.js r170+ WebGPU backend
|
|
48
|
+
- **Real-time shadows** — CSM, PCF soft shadows
|
|
49
|
+
- **Screen-space reflections (SSR)** — screen-space reflections
|
|
50
|
+
- **Ambient occlusion (SSAO/HBAO)** — ambient lighting
|
|
51
|
+
- **Render to PNG/EXR** — render export with transparency
|
|
52
|
+
|
|
53
|
+
### Tests
|
|
54
|
+
|
|
55
|
+
- 89 unit tests in 5 files: sceneGraph CRUD, transformMath, materialEditor, uvEditor, particleEditor
|
|
56
|
+
- E2E tests: wireframe preview, tabs, features, formats
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## [1.0.0] — 2025-06-01
|
|
61
|
+
|
|
62
|
+
Initial production release — Blender-style 3D model editor powered by Three.js.
|
|
63
|
+
|
|
64
|
+
- Scene graph / hierarchy editor
|
|
65
|
+
- Transform gizmos (move, rotate, scale)
|
|
66
|
+
- Material editor (PBR, standard)
|
|
67
|
+
- Import: GLTF, GLB, OBJ, FBX, STL, 3DS
|
|
68
|
+
- Export: GLTF, GLB, OBJ, STL
|
|
69
|
+
- Light presets, environment maps
|
|
70
|
+
- Camera controls (orbit, fly, walk)
|
|
2
71
|
|
|
3
72
|
All notable changes to `@nice2dev/ui-3d` will be documented in this file.
|
|
4
73
|
|
|
@@ -7,6 +76,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
76
|
|
|
8
77
|
---
|
|
9
78
|
|
|
79
|
+
## [1.1.0] — 2026-06-16
|
|
80
|
+
|
|
81
|
+
### 🚀 Major Feature Release
|
|
82
|
+
|
|
83
|
+
CAD mode, Sims-style building mode, dance integration, and full editor decomposition.
|
|
84
|
+
|
|
85
|
+
### New Modes
|
|
86
|
+
|
|
87
|
+
- **CAD Mode** (`cadModeUtils.ts`) — precision engineering mode with snapping, measurement tools, constraints, dimensioning
|
|
88
|
+
- **Sims Building Mode** (`simsModeUtils.ts`) — room-based building with wall placement, floor plans, furniture snapping, grid alignment
|
|
89
|
+
|
|
90
|
+
### Dance Integration (`dance/`)
|
|
91
|
+
|
|
92
|
+
- **DanceBridge** — bridge layer for connecting pose data to 3D animations
|
|
93
|
+
- **DanceScoreEngine** — real-time dance scoring with hit detection and combo tracking
|
|
94
|
+
- **PoseDetector** — webcam-based human pose detection component for dance games
|
|
95
|
+
|
|
96
|
+
### Editor Sub-components
|
|
97
|
+
|
|
98
|
+
- **ModelEditorLeftPanel** — scene hierarchy and asset browser sidebar
|
|
99
|
+
- **ModelEditorMenuBar** — file/edit/view/tools menu bar
|
|
100
|
+
- **ModelEditorRightPanel** — properties inspector panel
|
|
101
|
+
- **ModelEditorSubComponents** — shared editor sub-components
|
|
102
|
+
- **ModelEditorTimeline** — keyframe animation timeline
|
|
103
|
+
- **ModelEditorToolbar** — toolbar with transform and tool selection
|
|
104
|
+
- **ModelEditorViewport** — 3D viewport with gizmos and selection
|
|
105
|
+
- **ModelViewer.module.css / ModelEditor.module.css** — CSS Modules styling
|
|
106
|
+
|
|
107
|
+
### Hooks
|
|
108
|
+
|
|
109
|
+
- `useModelEditor` — hook for editor state management (selection, tools, undo/redo)
|
|
110
|
+
- `useModelViewer` — hook for viewer state (camera, loading, materials)
|
|
111
|
+
|
|
112
|
+
### Utilities
|
|
113
|
+
|
|
114
|
+
- `modelEditorTypes.ts` — TypeScript types for all editor state and operations
|
|
115
|
+
- `modelEditorUtils.ts` — helper utilities (transforms, intersections, serialization)
|
|
116
|
+
- `editorShortcuts.ts` — keyboard shortcut definitions and handler registration
|
|
117
|
+
|
|
118
|
+
### i18n
|
|
119
|
+
|
|
120
|
+
- Added internationalization support (`core/i18n.tsx`) with translatable editor labels
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
10
124
|
## [1.0.0] — 2026-03-17
|
|
11
125
|
|
|
12
126
|
### 🧊 Initial Release
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Collaborative 3D Scene — Multi-user 3D scene editing via Yjs CRDT + WebRTC data channel.
|
|
5
|
+
*
|
|
6
|
+
* Pattern follows collaborativeDiagram.ts / collaborativePresentation.ts:
|
|
7
|
+
* - Yjs document with shared types (YMap, YArray)
|
|
8
|
+
* - Awareness protocol for cursor/selection presence
|
|
9
|
+
* - Provider abstraction (WebRTC, WebSocket, IndexedDB)
|
|
10
|
+
* - UndoManager integration
|
|
11
|
+
*
|
|
12
|
+
* @module @nice2dev/ui-3d/collaborative
|
|
13
|
+
*/
|
|
14
|
+
/* ================================================================
|
|
15
|
+
SYNC HELPERS
|
|
16
|
+
================================================================ */
|
|
17
|
+
/** Convert a Yjs objects map to SharedSceneObject[]. */
|
|
18
|
+
function syncYjsToScene(objectsMap) {
|
|
19
|
+
const json = objectsMap.toJSON();
|
|
20
|
+
return Object.values(json);
|
|
21
|
+
}
|
|
22
|
+
/** Write SharedSceneObject[] into Yjs objects map. */
|
|
23
|
+
function syncSceneToYjs(objects, objectsMap, doc) {
|
|
24
|
+
doc.transact(() => {
|
|
25
|
+
// Remove objects not in the new list
|
|
26
|
+
const newIds = new Set(objects.map((o) => o.id));
|
|
27
|
+
const existing = objectsMap.toJSON();
|
|
28
|
+
for (const key of Object.keys(existing)) {
|
|
29
|
+
if (!newIds.has(key))
|
|
30
|
+
objectsMap.delete(key);
|
|
31
|
+
}
|
|
32
|
+
// Upsert
|
|
33
|
+
for (const obj of objects) {
|
|
34
|
+
objectsMap.set(obj.id, obj);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* useCollaborativeScene — Yjs-powered multi-user 3D scene editing.
|
|
40
|
+
*
|
|
41
|
+
* Usage:
|
|
42
|
+
* ```ts
|
|
43
|
+
* const { state, actions } = useCollaborativeScene({
|
|
44
|
+
* createYDoc: () => new Y.Doc(),
|
|
45
|
+
* createProvider: (doc, cfg) => new WebrtcProvider(cfg.room, doc),
|
|
46
|
+
* createUndoManager: (scope) => new Y.UndoManager(scope),
|
|
47
|
+
* providerConfig: { type: 'webrtc', room: 'scene-1' },
|
|
48
|
+
* user: { id: 'u1', name: 'Alice', color: '#e74c3c' },
|
|
49
|
+
* });
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
function useCollaborativeScene(options) {
|
|
53
|
+
// This follows the exact same architecture as useCollaborativePresentation.
|
|
54
|
+
// Implementation uses React refs for YDoc/provider and useState for reactive state.
|
|
55
|
+
// All mutations go through doc.transact() for atomicity.
|
|
56
|
+
const { createYDoc, createProvider, createUndoManager, providerConfig, user, initialObjects } = options;
|
|
57
|
+
// Lazy-init refs (avoid re-creation on re-render)
|
|
58
|
+
let docRef = null;
|
|
59
|
+
let providerRef = null;
|
|
60
|
+
let undoRef = null;
|
|
61
|
+
// State (would use useState in real React hook — simplified for pure TS export)
|
|
62
|
+
const stateSnapshot = {
|
|
63
|
+
objects: initialObjects !== null && initialObjects !== void 0 ? initialObjects : [],
|
|
64
|
+
collaborators: [],
|
|
65
|
+
collaboratorSelections: new Map(),
|
|
66
|
+
collaboratorTransforming: new Map(),
|
|
67
|
+
collaboratorCameras: new Map(),
|
|
68
|
+
connected: false,
|
|
69
|
+
synced: false,
|
|
70
|
+
};
|
|
71
|
+
function getDoc() {
|
|
72
|
+
if (!docRef)
|
|
73
|
+
docRef = createYDoc();
|
|
74
|
+
return docRef;
|
|
75
|
+
}
|
|
76
|
+
function getObjectsMap() {
|
|
77
|
+
return getDoc().getMap('objects');
|
|
78
|
+
}
|
|
79
|
+
// ── Actions ─────────────────────────────────────────────
|
|
80
|
+
function generateId() {
|
|
81
|
+
return `obj_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
|
|
82
|
+
}
|
|
83
|
+
const actions = {
|
|
84
|
+
addObject(obj) {
|
|
85
|
+
const id = generateId();
|
|
86
|
+
const full = { ...obj, id };
|
|
87
|
+
getDoc().transact(() => {
|
|
88
|
+
getObjectsMap().set(id, full);
|
|
89
|
+
});
|
|
90
|
+
return id;
|
|
91
|
+
},
|
|
92
|
+
updateObject(id, patch) {
|
|
93
|
+
const map = getObjectsMap();
|
|
94
|
+
const existing = map.get(id);
|
|
95
|
+
if (!existing)
|
|
96
|
+
return;
|
|
97
|
+
getDoc().transact(() => {
|
|
98
|
+
map.set(id, { ...existing, ...patch, id });
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
deleteObject(id) {
|
|
102
|
+
getDoc().transact(() => {
|
|
103
|
+
getObjectsMap().delete(id);
|
|
104
|
+
});
|
|
105
|
+
},
|
|
106
|
+
reparentObject(id, newParentId) {
|
|
107
|
+
actions.updateObject(id, { parentId: newParentId });
|
|
108
|
+
},
|
|
109
|
+
setTransform(id, transform) {
|
|
110
|
+
actions.updateObject(id, { transform });
|
|
111
|
+
},
|
|
112
|
+
setVisibility(id, visible) {
|
|
113
|
+
actions.updateObject(id, { visible });
|
|
114
|
+
},
|
|
115
|
+
setMaterial(id, material) {
|
|
116
|
+
actions.updateObject(id, { material });
|
|
117
|
+
},
|
|
118
|
+
setSelectedObjects(ids) {
|
|
119
|
+
providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('selectedObjects', ids);
|
|
120
|
+
},
|
|
121
|
+
setTransformingObject(id) {
|
|
122
|
+
providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('transformingObject', id);
|
|
123
|
+
},
|
|
124
|
+
setCamera(cam) {
|
|
125
|
+
providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('camera', cam);
|
|
126
|
+
},
|
|
127
|
+
undo() {
|
|
128
|
+
undoRef === null || undoRef === void 0 ? void 0 : undoRef.undo();
|
|
129
|
+
},
|
|
130
|
+
redo() {
|
|
131
|
+
undoRef === null || undoRef === void 0 ? void 0 : undoRef.redo();
|
|
132
|
+
},
|
|
133
|
+
get canUndo() {
|
|
134
|
+
var _a;
|
|
135
|
+
return (_a = undoRef === null || undoRef === void 0 ? void 0 : undoRef.canUndo()) !== null && _a !== void 0 ? _a : false;
|
|
136
|
+
},
|
|
137
|
+
get canRedo() {
|
|
138
|
+
var _a;
|
|
139
|
+
return (_a = undoRef === null || undoRef === void 0 ? void 0 : undoRef.canRedo()) !== null && _a !== void 0 ? _a : false;
|
|
140
|
+
},
|
|
141
|
+
async connect() {
|
|
142
|
+
const doc = getDoc();
|
|
143
|
+
const objectsMap = getObjectsMap();
|
|
144
|
+
// Seed initial objects
|
|
145
|
+
if (initialObjects && objectsMap.toJSON() && Object.keys(objectsMap.toJSON()).length === 0) {
|
|
146
|
+
syncSceneToYjs(initialObjects, objectsMap, doc);
|
|
147
|
+
}
|
|
148
|
+
// Create provider
|
|
149
|
+
providerRef = createProvider(doc, providerConfig);
|
|
150
|
+
// Set awareness
|
|
151
|
+
providerRef.awareness.setLocalState({
|
|
152
|
+
user,
|
|
153
|
+
selectedObjects: [],
|
|
154
|
+
transformingObject: null,
|
|
155
|
+
camera: null,
|
|
156
|
+
});
|
|
157
|
+
// Create undo manager
|
|
158
|
+
undoRef = createUndoManager([objectsMap]);
|
|
159
|
+
// Listen for changes
|
|
160
|
+
objectsMap.observe(() => {
|
|
161
|
+
stateSnapshot.objects = syncYjsToScene(objectsMap);
|
|
162
|
+
});
|
|
163
|
+
providerRef.awareness.on('change', () => {
|
|
164
|
+
const states = providerRef.awareness.getStates();
|
|
165
|
+
const collabs = [];
|
|
166
|
+
const selections = new Map();
|
|
167
|
+
const transforming = new Map();
|
|
168
|
+
const cameras = new Map();
|
|
169
|
+
states.forEach((s, clientId) => {
|
|
170
|
+
if (clientId === providerRef.awareness.clientID)
|
|
171
|
+
return;
|
|
172
|
+
const state = s;
|
|
173
|
+
if (state.user)
|
|
174
|
+
collabs.push(state.user);
|
|
175
|
+
if (state.selectedObjects)
|
|
176
|
+
selections.set(clientId, state.selectedObjects);
|
|
177
|
+
if (state.transformingObject !== undefined)
|
|
178
|
+
transforming.set(clientId, state.transformingObject);
|
|
179
|
+
if (state.camera)
|
|
180
|
+
cameras.set(clientId, state.camera);
|
|
181
|
+
});
|
|
182
|
+
stateSnapshot.collaborators = collabs;
|
|
183
|
+
stateSnapshot.collaboratorSelections = selections;
|
|
184
|
+
stateSnapshot.collaboratorTransforming = transforming;
|
|
185
|
+
stateSnapshot.collaboratorCameras = cameras;
|
|
186
|
+
});
|
|
187
|
+
providerRef.on('synced', () => {
|
|
188
|
+
stateSnapshot.synced = true;
|
|
189
|
+
});
|
|
190
|
+
await providerRef.connect();
|
|
191
|
+
stateSnapshot.connected = true;
|
|
192
|
+
},
|
|
193
|
+
disconnect() {
|
|
194
|
+
providerRef === null || providerRef === void 0 ? void 0 : providerRef.disconnect();
|
|
195
|
+
providerRef === null || providerRef === void 0 ? void 0 : providerRef.destroy();
|
|
196
|
+
providerRef = null;
|
|
197
|
+
undoRef = null;
|
|
198
|
+
docRef === null || docRef === void 0 ? void 0 : docRef.destroy();
|
|
199
|
+
docRef = null;
|
|
200
|
+
stateSnapshot.connected = false;
|
|
201
|
+
stateSnapshot.synced = false;
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
return { state: stateSnapshot, actions };
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
exports.syncSceneToYjs = syncSceneToYjs;
|
|
208
|
+
exports.syncYjsToScene = syncYjsToScene;
|
|
209
|
+
exports.useCollaborativeScene = useCollaborativeScene;
|
|
210
|
+
//# sourceMappingURL=collaborativeScene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collaborativeScene.js","sources":["../../../src/collaborative/collaborativeScene.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/cjs/core/i18n.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var
|
|
4
|
+
var Ae = require('react');
|
|
5
5
|
|
|
6
6
|
const fallback = (_key, defaultValue) => defaultValue;
|
|
7
|
-
const NiceI18nContext =
|
|
7
|
+
const NiceI18nContext = Ae.createContext(fallback);
|
|
8
8
|
const NiceI18nProvider = ({ t, children }) => (jsxRuntime.jsx(NiceI18nContext.Provider, { value: t, children: children }));
|
|
9
9
|
function useNiceTranslation() {
|
|
10
|
-
const t =
|
|
10
|
+
const t = Ae.useContext(NiceI18nContext);
|
|
11
11
|
return { t };
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","sources":["../../../src/core/i18n.tsx"],"sourcesContent":[null],"names":["createContext","_jsx","useContext"],"mappings":";;;;;AAqBA,MAAM,QAAQ,GAAoB,CAAC,IAAY,EAAE,YAAoB,KAAK,YAAY;AAEtF,MAAM,eAAe,GAAGA,
|
|
1
|
+
{"version":3,"file":"i18n.js","sources":["../../../src/core/i18n.tsx"],"sourcesContent":[null],"names":["createContext","_jsx","useContext"],"mappings":";;;;;AAqBA,MAAM,QAAQ,GAAoB,CAAC,IAAY,EAAE,YAAoB,KAAK,YAAY;AAEtF,MAAM,eAAe,GAAGA,gBAAa,CAAkB,QAAQ,CAAC;AAOzD,MAAM,gBAAgB,GAAoC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAC/EC,cAAA,CAAC,eAAe,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,CAAC,EAAA,QAAA,EAAG,QAAQ,EAAA,CAA4B;SAG3D,kBAAkB,GAAA;AAChC,IAAA,MAAM,CAAC,GAAGC,aAAU,CAAC,eAAe,CAAC;IACrC,OAAO,EAAE,CAAC,EAAE;AACd;;;;;"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Ae = require('react');
|
|
4
|
+
var DanceScoreEngine = require('./DanceScoreEngine.js');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* DanceBridge — Connects choreography DSL (ui-graphics) ↔ pose detection (ui-3d) ↔ audio sync (ui-audio)
|
|
8
|
+
*
|
|
9
|
+
* Orchestrates a dance session: plays audio, runs reference choreography,
|
|
10
|
+
* captures live poses, and scores accuracy — all in sync.
|
|
11
|
+
*/
|
|
12
|
+
// ── Bridge engine (non-React) ───────────────────────────────────
|
|
13
|
+
class DanceBridge {
|
|
14
|
+
constructor(config, callbacks = {}) {
|
|
15
|
+
this._state = 'idle';
|
|
16
|
+
this.startTime = 0;
|
|
17
|
+
this.pausedAt = 0;
|
|
18
|
+
this.pauseAccum = 0;
|
|
19
|
+
this.nextBeatIdx = 0;
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.callbacks = callbacks;
|
|
22
|
+
this.engine = new DanceScoreEngine.DanceScoreEngine(config.scoreConfig);
|
|
23
|
+
this.engine.loadReference(config.reference);
|
|
24
|
+
const frames = config.reference.frames;
|
|
25
|
+
this.duration = frames.length > 0
|
|
26
|
+
? frames[frames.length - 1].timestamp_sec
|
|
27
|
+
: 0;
|
|
28
|
+
}
|
|
29
|
+
get state() { return this._state; }
|
|
30
|
+
get elapsed() {
|
|
31
|
+
if (this._state === 'idle' || this._state === 'countdown')
|
|
32
|
+
return 0;
|
|
33
|
+
if (this._state === 'paused')
|
|
34
|
+
return (this.pausedAt - this.startTime - this.pauseAccum) / 1000;
|
|
35
|
+
if (this._state === 'finished')
|
|
36
|
+
return this.duration;
|
|
37
|
+
return (performance.now() - this.startTime - this.pauseAccum) / 1000;
|
|
38
|
+
}
|
|
39
|
+
get combo() {
|
|
40
|
+
return this.engine.getResult().combo;
|
|
41
|
+
}
|
|
42
|
+
start() {
|
|
43
|
+
var _a;
|
|
44
|
+
const countdownMs = ((_a = this.config.countdownSec) !== null && _a !== void 0 ? _a : 3) * 1000;
|
|
45
|
+
this.setState('countdown');
|
|
46
|
+
setTimeout(() => {
|
|
47
|
+
this.engine.reset();
|
|
48
|
+
this.startTime = performance.now();
|
|
49
|
+
this.pauseAccum = 0;
|
|
50
|
+
this.nextBeatIdx = 0;
|
|
51
|
+
this.setState('playing');
|
|
52
|
+
}, countdownMs);
|
|
53
|
+
}
|
|
54
|
+
pause() {
|
|
55
|
+
if (this._state !== 'playing')
|
|
56
|
+
return;
|
|
57
|
+
this.pausedAt = performance.now();
|
|
58
|
+
this.setState('paused');
|
|
59
|
+
}
|
|
60
|
+
resume() {
|
|
61
|
+
if (this._state !== 'paused')
|
|
62
|
+
return;
|
|
63
|
+
this.pauseAccum += performance.now() - this.pausedAt;
|
|
64
|
+
this.setState('playing');
|
|
65
|
+
}
|
|
66
|
+
stop() {
|
|
67
|
+
var _a, _b;
|
|
68
|
+
this.setState('finished');
|
|
69
|
+
const result = this.engine.getResult();
|
|
70
|
+
(_b = (_a = this.callbacks).onFinish) === null || _b === void 0 ? void 0 : _b.call(_a, result);
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
feedFrame(frame) {
|
|
74
|
+
var _a, _b, _c, _d, _e, _f;
|
|
75
|
+
if (this._state !== 'playing')
|
|
76
|
+
return null;
|
|
77
|
+
const elapsed = this.elapsed;
|
|
78
|
+
const offset = (_b = (_a = this.config.beatSync) === null || _a === void 0 ? void 0 : _a.offsetSec) !== null && _b !== void 0 ? _b : 0;
|
|
79
|
+
const adjustedFrame = {
|
|
80
|
+
...frame,
|
|
81
|
+
timestamp_sec: elapsed + offset,
|
|
82
|
+
};
|
|
83
|
+
// Check for beats
|
|
84
|
+
this.checkBeats(elapsed);
|
|
85
|
+
// Report progress
|
|
86
|
+
if (this.duration > 0) {
|
|
87
|
+
(_d = (_c = this.callbacks).onProgress) === null || _d === void 0 ? void 0 : _d.call(_c, Math.min(elapsed / this.duration, 1));
|
|
88
|
+
}
|
|
89
|
+
// Score
|
|
90
|
+
const score = this.engine.scoreFrame(adjustedFrame);
|
|
91
|
+
(_f = (_e = this.callbacks).onScore) === null || _f === void 0 ? void 0 : _f.call(_e, score);
|
|
92
|
+
// Auto-finish at end of reference
|
|
93
|
+
if (elapsed >= this.duration) {
|
|
94
|
+
this.stop();
|
|
95
|
+
}
|
|
96
|
+
return score;
|
|
97
|
+
}
|
|
98
|
+
checkBeats(elapsed) {
|
|
99
|
+
var _a, _b, _c;
|
|
100
|
+
const beats = (_a = this.config.beatSync) === null || _a === void 0 ? void 0 : _a.beats;
|
|
101
|
+
if (!beats)
|
|
102
|
+
return;
|
|
103
|
+
while (this.nextBeatIdx < beats.length && beats[this.nextBeatIdx] <= elapsed) {
|
|
104
|
+
(_c = (_b = this.callbacks).onBeat) === null || _c === void 0 ? void 0 : _c.call(_b, this.nextBeatIdx, beats[this.nextBeatIdx]);
|
|
105
|
+
this.nextBeatIdx++;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
setState(state) {
|
|
109
|
+
var _a, _b;
|
|
110
|
+
this._state = state;
|
|
111
|
+
(_b = (_a = this.callbacks).onStateChange) === null || _b === void 0 ? void 0 : _b.call(_a, state);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// ── React hook: useDanceBridge ──────────────────────────────────
|
|
115
|
+
function useDanceBridge(config, callbacks) {
|
|
116
|
+
const bridgeRef = Ae.useRef(null);
|
|
117
|
+
const [state, setState] = Ae.useState('idle');
|
|
118
|
+
const [lastScore, setLastScore] = Ae.useState(null);
|
|
119
|
+
const [result, setResult] = Ae.useState(null);
|
|
120
|
+
const [combo, setCombo] = Ae.useState(0);
|
|
121
|
+
const [progress, setProgress] = Ae.useState(0);
|
|
122
|
+
Ae.useEffect(() => {
|
|
123
|
+
if (!config) {
|
|
124
|
+
bridgeRef.current = null;
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
bridgeRef.current = new DanceBridge(config, {
|
|
128
|
+
...callbacks,
|
|
129
|
+
onStateChange(s) { var _a; setState(s); (_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onStateChange) === null || _a === void 0 ? void 0 : _a.call(callbacks, s); },
|
|
130
|
+
onScore(score) { var _a; setLastScore(score); (_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onScore) === null || _a === void 0 ? void 0 : _a.call(callbacks, score); },
|
|
131
|
+
onFinish(r) { var _a; setResult(r); (_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onFinish) === null || _a === void 0 ? void 0 : _a.call(callbacks, r); },
|
|
132
|
+
onProgress(p) { var _a; setProgress(p); (_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onProgress) === null || _a === void 0 ? void 0 : _a.call(callbacks, p); },
|
|
133
|
+
});
|
|
134
|
+
return () => { bridgeRef.current = null; };
|
|
135
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
136
|
+
}, [config]);
|
|
137
|
+
const start = Ae.useCallback(() => { var _a; (_a = bridgeRef.current) === null || _a === void 0 ? void 0 : _a.start(); }, []);
|
|
138
|
+
const pause = Ae.useCallback(() => { var _a; (_a = bridgeRef.current) === null || _a === void 0 ? void 0 : _a.pause(); }, []);
|
|
139
|
+
const resume = Ae.useCallback(() => { var _a; (_a = bridgeRef.current) === null || _a === void 0 ? void 0 : _a.resume(); }, []);
|
|
140
|
+
const stop = Ae.useCallback(() => { var _a, _b; return (_b = (_a = bridgeRef.current) === null || _a === void 0 ? void 0 : _a.stop()) !== null && _b !== void 0 ? _b : null; }, []);
|
|
141
|
+
const feedFrame = Ae.useCallback((frame) => {
|
|
142
|
+
var _a, _b;
|
|
143
|
+
const score = (_b = (_a = bridgeRef.current) === null || _a === void 0 ? void 0 : _a.feedFrame(frame)) !== null && _b !== void 0 ? _b : null;
|
|
144
|
+
if (bridgeRef.current)
|
|
145
|
+
setCombo(bridgeRef.current.combo);
|
|
146
|
+
return score;
|
|
147
|
+
}, []);
|
|
148
|
+
return { start, pause, resume, stop, feedFrame, state, lastScore, result, combo, progress };
|
|
149
|
+
}
|
|
150
|
+
// ── Utility: Convert @nice2dev/ui-audio RhythmResponse to BeatSync ──
|
|
151
|
+
function rhythmToBeatSync(rhythm, offsetSec = 0) {
|
|
152
|
+
return {
|
|
153
|
+
bpm: rhythm.tempoBpm,
|
|
154
|
+
beats: rhythm.beatsSeconds,
|
|
155
|
+
offsetSec,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
exports.DanceBridge = DanceBridge;
|
|
160
|
+
exports.rhythmToBeatSync = rhythmToBeatSync;
|
|
161
|
+
exports.useDanceBridge = useDanceBridge;
|
|
162
|
+
//# sourceMappingURL=DanceBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DanceBridge.js","sources":["../../../src/dance/DanceBridge.ts"],"sourcesContent":[null],"names":["DanceScoreEngine","useRef","useState","useEffect","useCallback"],"mappings":"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"}
|