@nice2dev/ui-3d 1.3.15 → 1.3.17
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 +13 -0
- package/dist/cjs/collaborative/collaborativeScene.js +160 -206
- package/dist/cjs/core/editorAsk.js +51 -41
- package/dist/cjs/core/i18n.js +13 -14
- package/dist/cjs/core/threeCompat.js +29 -42
- package/dist/cjs/dance/DanceBridge.js +148 -177
- package/dist/cjs/dance/DanceScoreEngine.js +209 -221
- package/dist/cjs/dance/PoseDetector.js +302 -275
- package/dist/cjs/index.js +110 -113
- package/dist/cjs/material/MaterialEditor.module.css.js +242 -5
- package/dist/cjs/material/NiceMaterialEditor.js +1213 -757
- package/dist/cjs/material/materialEditorTypes.js +35 -49
- package/dist/cjs/material/materialEditorUtils.js +684 -747
- package/dist/cjs/material/materialNodeDefinitions.js +1411 -1459
- package/dist/cjs/model/ModelEditor.js +90 -40
- package/dist/cjs/model/ModelEditor.module.css.js +257 -5
- package/dist/cjs/model/ModelEditorLeftPanel.js +126 -47
- package/dist/cjs/model/ModelEditorMenuBar.js +359 -32
- package/dist/cjs/model/ModelEditorRightPanel.js +647 -131
- package/dist/cjs/model/ModelEditorSubComponents.js +277 -112
- package/dist/cjs/model/ModelEditorTimeline.js +232 -34
- package/dist/cjs/model/ModelEditorToolbar.js +170 -14
- package/dist/cjs/model/ModelEditorViewport.js +231 -39
- package/dist/cjs/model/ModelViewer.js +388 -63
- package/dist/cjs/model/ModelViewer.module.css.js +77 -5
- package/dist/cjs/model/NiceArmatureEditor.js +473 -274
- package/dist/cjs/model/NiceMorphTargetEditor.js +333 -227
- package/dist/cjs/model/NiceOctree.js +372 -320
- package/dist/cjs/model/NicePhysicsSimulation.js +528 -298
- package/dist/cjs/model/NiceProceduralGeometry.js +673 -300
- package/dist/cjs/model/NiceTerrainEditor.js +595 -385
- package/dist/cjs/model/NiceWeightPainter.js +384 -261
- package/dist/cjs/model/NiceXRPreview.js +385 -308
- package/dist/cjs/model/cadModeUtils.js +103 -106
- package/dist/cjs/model/editorShortcuts.js +171 -194
- package/dist/cjs/model/modelEditorTypes.js +100 -118
- package/dist/cjs/model/modelEditorUtils.js +1061 -1146
- package/dist/cjs/model/simsModeUtils.js +1023 -1053
- package/dist/cjs/model/useModelEditor.js +1977 -1933
- package/dist/cjs/model/useModelViewer.js +633 -665
- package/dist/cjs/nice2dev-ui-3d.css +1 -1
- package/dist/cjs/particle/NiceParticleEditor.js +1186 -571
- package/dist/cjs/particle/ParticleEditor.module.css.js +122 -5
- package/dist/cjs/particle/particleEditorTypes.js +62 -70
- package/dist/cjs/particle/particleEditorUtils.js +998 -1013
- package/dist/cjs/rendering/NiceCascadedShadows.js +381 -259
- package/dist/cjs/rendering/NiceRenderExport.js +424 -337
- package/dist/cjs/rendering/NiceSSAO.js +454 -337
- package/dist/cjs/rendering/NiceSSR.js +387 -261
- package/dist/cjs/rendering/NiceWebGPURenderer.js +359 -230
- package/dist/cjs/uv/NiceUVEditor.js +787 -550
- package/dist/cjs/uv/UVEditor.module.css.js +53 -5
- package/dist/cjs/uv/uvEditorTypes.js +59 -76
- package/dist/cjs/uv/uvEditorUtils.js +501 -575
- package/dist/esm/collaborative/collaborativeScene.js +163 -205
- package/dist/esm/core/editorAsk.js +53 -40
- package/dist/esm/core/i18n.js +15 -13
- package/dist/esm/core/threeCompat.js +18 -26
- package/dist/esm/dance/DanceBridge.js +151 -176
- package/dist/esm/dance/DanceScoreEngine.js +211 -220
- package/dist/esm/dance/PoseDetector.js +304 -274
- package/dist/esm/index.js +258 -36
- package/dist/esm/material/MaterialEditor.module.css.js +242 -3
- package/dist/esm/material/NiceMaterialEditor.js +1215 -756
- package/dist/esm/material/materialEditorTypes.js +45 -48
- package/dist/esm/material/materialEditorUtils.js +713 -746
- package/dist/esm/material/materialNodeDefinitions.js +1415 -1458
- package/dist/esm/model/ModelEditor.js +91 -39
- package/dist/esm/model/ModelEditor.module.css.js +257 -3
- package/dist/esm/model/ModelEditorLeftPanel.js +126 -45
- package/dist/esm/model/ModelEditorMenuBar.js +359 -30
- package/dist/esm/model/ModelEditorRightPanel.js +634 -114
- package/dist/esm/model/ModelEditorSubComponents.js +265 -94
- package/dist/esm/model/ModelEditorTimeline.js +232 -32
- package/dist/esm/model/ModelEditorToolbar.js +170 -12
- package/dist/esm/model/ModelEditorViewport.js +231 -37
- package/dist/esm/model/ModelViewer.js +389 -62
- package/dist/esm/model/ModelViewer.module.css.js +77 -3
- package/dist/esm/model/NiceArmatureEditor.js +462 -258
- package/dist/esm/model/NiceMorphTargetEditor.js +322 -211
- package/dist/esm/model/NiceOctree.js +361 -304
- package/dist/esm/model/NicePhysicsSimulation.js +517 -282
- package/dist/esm/model/NiceProceduralGeometry.js +667 -284
- package/dist/esm/model/NiceTerrainEditor.js +584 -369
- package/dist/esm/model/NiceWeightPainter.js +373 -245
- package/dist/esm/model/NiceXRPreview.js +374 -292
- package/dist/esm/model/cadModeUtils.js +95 -88
- package/dist/esm/model/editorShortcuts.js +172 -193
- package/dist/esm/model/modelEditorTypes.js +90 -100
- package/dist/esm/model/modelEditorUtils.js +1056 -1128
- package/dist/esm/model/simsModeUtils.js +1021 -1035
- package/dist/esm/model/useModelEditor.js +1946 -1920
- package/dist/esm/model/useModelViewer.js +619 -647
- package/dist/esm/nice2dev-ui-3d.css +1 -1
- package/dist/esm/particle/NiceParticleEditor.js +1188 -570
- package/dist/esm/particle/ParticleEditor.module.css.js +122 -3
- package/dist/esm/particle/particleEditorTypes.js +69 -69
- package/dist/esm/particle/particleEditorUtils.js +1027 -1012
- package/dist/esm/rendering/NiceCascadedShadows.js +370 -243
- package/dist/esm/rendering/NiceRenderExport.js +413 -321
- package/dist/esm/rendering/NiceSSAO.js +450 -328
- package/dist/esm/rendering/NiceSSR.js +383 -252
- package/dist/esm/rendering/NiceWebGPURenderer.js +326 -214
- package/dist/esm/uv/NiceUVEditor.js +788 -549
- package/dist/esm/uv/UVEditor.module.css.js +53 -3
- package/dist/esm/uv/uvEditorTypes.js +68 -75
- package/dist/esm/uv/uvEditorUtils.js +515 -557
- package/package.json +7 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @nice2dev/ui-3d — Changelog
|
|
2
2
|
|
|
3
|
+
## 1.3.17
|
|
4
|
+
|
|
5
|
+
No changes in this release.
|
|
6
|
+
|
|
7
|
+
## 1.3.16
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- dd48c3d: Built with Vite instead of rollup (the dependency audit allows no advisories, and rollup's node-resolve plugin
|
|
12
|
+
pulls one with no fixed release). The published files are the same — a module per source file in `dist/esm` and
|
|
13
|
+
`dist/cjs`, the same entries, the same stylesheet names — with esbuild's `/* @__PURE__ */` marks on JSX calls,
|
|
14
|
+
which help an app's tree-shaking.
|
|
15
|
+
|
|
3
16
|
## 1.3.15
|
|
4
17
|
|
|
5
18
|
No changes in this release.
|
|
@@ -1,217 +1,171 @@
|
|
|
1
|
-
|
|
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[]. */
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
18
3
|
function syncYjsToScene(objectsMap) {
|
|
19
|
-
|
|
20
|
-
|
|
4
|
+
const json = objectsMap.toJSON();
|
|
5
|
+
return Object.values(json);
|
|
21
6
|
}
|
|
22
|
-
/** Write SharedSceneObject[] into Yjs objects map. */
|
|
23
7
|
function syncSceneToYjs(objects, objectsMap, doc) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
});
|
|
8
|
+
doc.transact(() => {
|
|
9
|
+
const newIds = new Set(objects.map((o) => o.id));
|
|
10
|
+
const existing = objectsMap.toJSON();
|
|
11
|
+
for (const key of Object.keys(existing)) {
|
|
12
|
+
if (!newIds.has(key)) {
|
|
13
|
+
objectsMap.delete(key);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
for (const obj of objects) {
|
|
17
|
+
objectsMap.set(obj.id, obj);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
38
20
|
}
|
|
39
|
-
/**
|
|
40
|
-
* useCollaborativeScene — Yjs-powered multi-user 3D scene editing.
|
|
41
|
-
*
|
|
42
|
-
* Usage:
|
|
43
|
-
* ```ts
|
|
44
|
-
* const { state, actions } = useCollaborativeScene({
|
|
45
|
-
* createYDoc: () => new Y.Doc(),
|
|
46
|
-
* createProvider: (doc, cfg) => new WebrtcProvider(cfg.room, doc),
|
|
47
|
-
* createUndoManager: (scope) => new Y.UndoManager(scope),
|
|
48
|
-
* providerConfig: { type: 'webrtc', room: 'scene-1' },
|
|
49
|
-
* user: { id: 'u1', name: 'Alice', color: 'var(--nice-danger, #e74c3c)' },
|
|
50
|
-
* });
|
|
51
|
-
* ```
|
|
52
|
-
*/
|
|
53
21
|
function useCollaborativeScene(options) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
synced: false,
|
|
71
|
-
};
|
|
72
|
-
function getDoc() {
|
|
73
|
-
if (!docRef) {
|
|
74
|
-
docRef = createYDoc();
|
|
75
|
-
}
|
|
76
|
-
return docRef;
|
|
77
|
-
}
|
|
78
|
-
function getObjectsMap() {
|
|
79
|
-
return getDoc().getMap('objects');
|
|
22
|
+
const { createYDoc, createProvider, createUndoManager, providerConfig, user, initialObjects } = options;
|
|
23
|
+
let docRef = null;
|
|
24
|
+
let providerRef = null;
|
|
25
|
+
let undoRef = null;
|
|
26
|
+
const stateSnapshot = {
|
|
27
|
+
objects: initialObjects ?? [],
|
|
28
|
+
collaborators: [],
|
|
29
|
+
collaboratorSelections: /* @__PURE__ */ new Map(),
|
|
30
|
+
collaboratorTransforming: /* @__PURE__ */ new Map(),
|
|
31
|
+
collaboratorCameras: /* @__PURE__ */ new Map(),
|
|
32
|
+
connected: false,
|
|
33
|
+
synced: false
|
|
34
|
+
};
|
|
35
|
+
function getDoc() {
|
|
36
|
+
if (!docRef) {
|
|
37
|
+
docRef = createYDoc();
|
|
80
38
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
39
|
+
return docRef;
|
|
40
|
+
}
|
|
41
|
+
function getObjectsMap() {
|
|
42
|
+
return getDoc().getMap("objects");
|
|
43
|
+
}
|
|
44
|
+
function generateId() {
|
|
45
|
+
return `obj_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
|
|
46
|
+
}
|
|
47
|
+
const actions = {
|
|
48
|
+
addObject(obj) {
|
|
49
|
+
const id = generateId();
|
|
50
|
+
const full = { ...obj, id };
|
|
51
|
+
getDoc().transact(() => {
|
|
52
|
+
getObjectsMap().set(id, full);
|
|
53
|
+
});
|
|
54
|
+
return id;
|
|
55
|
+
},
|
|
56
|
+
updateObject(id, patch) {
|
|
57
|
+
const map = getObjectsMap();
|
|
58
|
+
const existing = map.get(id);
|
|
59
|
+
if (!existing) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
getDoc().transact(() => {
|
|
63
|
+
map.set(id, { ...existing, ...patch, id });
|
|
64
|
+
});
|
|
65
|
+
},
|
|
66
|
+
deleteObject(id) {
|
|
67
|
+
getDoc().transact(() => {
|
|
68
|
+
getObjectsMap().delete(id);
|
|
69
|
+
});
|
|
70
|
+
},
|
|
71
|
+
reparentObject(id, newParentId) {
|
|
72
|
+
actions.updateObject(id, { parentId: newParentId });
|
|
73
|
+
},
|
|
74
|
+
setTransform(id, transform) {
|
|
75
|
+
actions.updateObject(id, { transform });
|
|
76
|
+
},
|
|
77
|
+
setVisibility(id, visible) {
|
|
78
|
+
actions.updateObject(id, { visible });
|
|
79
|
+
},
|
|
80
|
+
setMaterial(id, material) {
|
|
81
|
+
actions.updateObject(id, { material });
|
|
82
|
+
},
|
|
83
|
+
setSelectedObjects(ids) {
|
|
84
|
+
providerRef?.awareness.setLocalStateField("selectedObjects", ids);
|
|
85
|
+
},
|
|
86
|
+
setTransformingObject(id) {
|
|
87
|
+
providerRef?.awareness.setLocalStateField("transformingObject", id);
|
|
88
|
+
},
|
|
89
|
+
setCamera(cam) {
|
|
90
|
+
providerRef?.awareness.setLocalStateField("camera", cam);
|
|
91
|
+
},
|
|
92
|
+
undo() {
|
|
93
|
+
undoRef?.undo();
|
|
94
|
+
},
|
|
95
|
+
redo() {
|
|
96
|
+
undoRef?.redo();
|
|
97
|
+
},
|
|
98
|
+
get canUndo() {
|
|
99
|
+
return undoRef?.canUndo() ?? false;
|
|
100
|
+
},
|
|
101
|
+
get canRedo() {
|
|
102
|
+
return undoRef?.canRedo() ?? false;
|
|
103
|
+
},
|
|
104
|
+
async connect() {
|
|
105
|
+
const doc = getDoc();
|
|
106
|
+
const objectsMap = getObjectsMap();
|
|
107
|
+
if (initialObjects && objectsMap.toJSON() && Object.keys(objectsMap.toJSON()).length === 0) {
|
|
108
|
+
syncSceneToYjs(initialObjects, objectsMap, doc);
|
|
109
|
+
}
|
|
110
|
+
providerRef = createProvider(doc, providerConfig);
|
|
111
|
+
providerRef.awareness.setLocalState({
|
|
112
|
+
user,
|
|
113
|
+
selectedObjects: [],
|
|
114
|
+
transformingObject: null,
|
|
115
|
+
camera: null
|
|
116
|
+
});
|
|
117
|
+
undoRef = createUndoManager([objectsMap]);
|
|
118
|
+
objectsMap.observe(() => {
|
|
119
|
+
stateSnapshot.objects = syncYjsToScene(objectsMap);
|
|
120
|
+
});
|
|
121
|
+
providerRef.awareness.on("change", () => {
|
|
122
|
+
const states = providerRef.awareness.getStates();
|
|
123
|
+
const collabs = [];
|
|
124
|
+
const selections = /* @__PURE__ */ new Map();
|
|
125
|
+
const transforming = /* @__PURE__ */ new Map();
|
|
126
|
+
const cameras = /* @__PURE__ */ new Map();
|
|
127
|
+
states.forEach((s, clientId) => {
|
|
128
|
+
if (clientId === providerRef.awareness.clientID) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const state = s;
|
|
132
|
+
if (state.user) {
|
|
133
|
+
collabs.push(state.user);
|
|
134
|
+
}
|
|
135
|
+
if (state.selectedObjects) {
|
|
136
|
+
selections.set(clientId, state.selectedObjects);
|
|
137
|
+
}
|
|
138
|
+
if (state.transformingObject !== void 0) {
|
|
139
|
+
transforming.set(clientId, state.transformingObject);
|
|
140
|
+
}
|
|
141
|
+
if (state.camera) {
|
|
142
|
+
cameras.set(clientId, state.camera);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
stateSnapshot.collaborators = collabs;
|
|
146
|
+
stateSnapshot.collaboratorSelections = selections;
|
|
147
|
+
stateSnapshot.collaboratorTransforming = transforming;
|
|
148
|
+
stateSnapshot.collaboratorCameras = cameras;
|
|
149
|
+
});
|
|
150
|
+
providerRef.on("synced", () => {
|
|
151
|
+
stateSnapshot.synced = true;
|
|
152
|
+
});
|
|
153
|
+
await providerRef.connect();
|
|
154
|
+
stateSnapshot.connected = true;
|
|
155
|
+
},
|
|
156
|
+
disconnect() {
|
|
157
|
+
providerRef?.disconnect();
|
|
158
|
+
providerRef?.destroy();
|
|
159
|
+
providerRef = null;
|
|
160
|
+
undoRef = null;
|
|
161
|
+
docRef?.destroy();
|
|
162
|
+
docRef = null;
|
|
163
|
+
stateSnapshot.connected = false;
|
|
164
|
+
stateSnapshot.synced = false;
|
|
84
165
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const id = generateId();
|
|
88
|
-
const full = { ...obj, id };
|
|
89
|
-
getDoc().transact(() => {
|
|
90
|
-
getObjectsMap().set(id, full);
|
|
91
|
-
});
|
|
92
|
-
return id;
|
|
93
|
-
},
|
|
94
|
-
updateObject(id, patch) {
|
|
95
|
-
const map = getObjectsMap();
|
|
96
|
-
const existing = map.get(id);
|
|
97
|
-
if (!existing) {
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
getDoc().transact(() => {
|
|
101
|
-
map.set(id, { ...existing, ...patch, id });
|
|
102
|
-
});
|
|
103
|
-
},
|
|
104
|
-
deleteObject(id) {
|
|
105
|
-
getDoc().transact(() => {
|
|
106
|
-
getObjectsMap().delete(id);
|
|
107
|
-
});
|
|
108
|
-
},
|
|
109
|
-
reparentObject(id, newParentId) {
|
|
110
|
-
actions.updateObject(id, { parentId: newParentId });
|
|
111
|
-
},
|
|
112
|
-
setTransform(id, transform) {
|
|
113
|
-
actions.updateObject(id, { transform });
|
|
114
|
-
},
|
|
115
|
-
setVisibility(id, visible) {
|
|
116
|
-
actions.updateObject(id, { visible });
|
|
117
|
-
},
|
|
118
|
-
setMaterial(id, material) {
|
|
119
|
-
actions.updateObject(id, { material });
|
|
120
|
-
},
|
|
121
|
-
setSelectedObjects(ids) {
|
|
122
|
-
providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('selectedObjects', ids);
|
|
123
|
-
},
|
|
124
|
-
setTransformingObject(id) {
|
|
125
|
-
providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('transformingObject', id);
|
|
126
|
-
},
|
|
127
|
-
setCamera(cam) {
|
|
128
|
-
providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('camera', cam);
|
|
129
|
-
},
|
|
130
|
-
undo() {
|
|
131
|
-
undoRef === null || undoRef === void 0 ? void 0 : undoRef.undo();
|
|
132
|
-
},
|
|
133
|
-
redo() {
|
|
134
|
-
undoRef === null || undoRef === void 0 ? void 0 : undoRef.redo();
|
|
135
|
-
},
|
|
136
|
-
get canUndo() {
|
|
137
|
-
var _a;
|
|
138
|
-
return (_a = undoRef === null || undoRef === void 0 ? void 0 : undoRef.canUndo()) !== null && _a !== void 0 ? _a : false;
|
|
139
|
-
},
|
|
140
|
-
get canRedo() {
|
|
141
|
-
var _a;
|
|
142
|
-
return (_a = undoRef === null || undoRef === void 0 ? void 0 : undoRef.canRedo()) !== null && _a !== void 0 ? _a : false;
|
|
143
|
-
},
|
|
144
|
-
async connect() {
|
|
145
|
-
const doc = getDoc();
|
|
146
|
-
const objectsMap = getObjectsMap();
|
|
147
|
-
// Seed initial objects
|
|
148
|
-
if (initialObjects && objectsMap.toJSON() && Object.keys(objectsMap.toJSON()).length === 0) {
|
|
149
|
-
syncSceneToYjs(initialObjects, objectsMap, doc);
|
|
150
|
-
}
|
|
151
|
-
// Create provider
|
|
152
|
-
providerRef = createProvider(doc, providerConfig);
|
|
153
|
-
// Set awareness
|
|
154
|
-
providerRef.awareness.setLocalState({
|
|
155
|
-
user,
|
|
156
|
-
selectedObjects: [],
|
|
157
|
-
transformingObject: null,
|
|
158
|
-
camera: null,
|
|
159
|
-
});
|
|
160
|
-
// Create undo manager
|
|
161
|
-
undoRef = createUndoManager([objectsMap]);
|
|
162
|
-
// Listen for changes
|
|
163
|
-
objectsMap.observe(() => {
|
|
164
|
-
stateSnapshot.objects = syncYjsToScene(objectsMap);
|
|
165
|
-
});
|
|
166
|
-
providerRef.awareness.on('change', () => {
|
|
167
|
-
const states = providerRef.awareness.getStates();
|
|
168
|
-
const collabs = [];
|
|
169
|
-
const selections = new Map();
|
|
170
|
-
const transforming = new Map();
|
|
171
|
-
const cameras = new Map();
|
|
172
|
-
states.forEach((s, clientId) => {
|
|
173
|
-
if (clientId === providerRef.awareness.clientID) {
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
const state = s;
|
|
177
|
-
if (state.user) {
|
|
178
|
-
collabs.push(state.user);
|
|
179
|
-
}
|
|
180
|
-
if (state.selectedObjects) {
|
|
181
|
-
selections.set(clientId, state.selectedObjects);
|
|
182
|
-
}
|
|
183
|
-
if (state.transformingObject !== undefined) {
|
|
184
|
-
transforming.set(clientId, state.transformingObject);
|
|
185
|
-
}
|
|
186
|
-
if (state.camera) {
|
|
187
|
-
cameras.set(clientId, state.camera);
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
stateSnapshot.collaborators = collabs;
|
|
191
|
-
stateSnapshot.collaboratorSelections = selections;
|
|
192
|
-
stateSnapshot.collaboratorTransforming = transforming;
|
|
193
|
-
stateSnapshot.collaboratorCameras = cameras;
|
|
194
|
-
});
|
|
195
|
-
providerRef.on('synced', () => {
|
|
196
|
-
stateSnapshot.synced = true;
|
|
197
|
-
});
|
|
198
|
-
await providerRef.connect();
|
|
199
|
-
stateSnapshot.connected = true;
|
|
200
|
-
},
|
|
201
|
-
disconnect() {
|
|
202
|
-
providerRef === null || providerRef === void 0 ? void 0 : providerRef.disconnect();
|
|
203
|
-
providerRef === null || providerRef === void 0 ? void 0 : providerRef.destroy();
|
|
204
|
-
providerRef = null;
|
|
205
|
-
undoRef = null;
|
|
206
|
-
docRef === null || docRef === void 0 ? void 0 : docRef.destroy();
|
|
207
|
-
docRef = null;
|
|
208
|
-
stateSnapshot.connected = false;
|
|
209
|
-
stateSnapshot.synced = false;
|
|
210
|
-
},
|
|
211
|
-
};
|
|
212
|
-
return { state: stateSnapshot, actions };
|
|
166
|
+
};
|
|
167
|
+
return { state: stateSnapshot, actions };
|
|
213
168
|
}
|
|
214
|
-
|
|
215
169
|
exports.syncSceneToYjs = syncSceneToYjs;
|
|
216
170
|
exports.syncYjsToScene = syncYjsToScene;
|
|
217
171
|
exports.useCollaborativeScene = useCollaborativeScene;
|
|
@@ -1,48 +1,58 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* The library's dialogs in place of `window.prompt` / `window.confirm` for the editor hooks,
|
|
9
|
-
* which hold state but render nothing: `ask` resolves with the answer (`null` when cancelled)
|
|
10
|
-
* and `pendingAsk` is the open question, for the editor component to pass to
|
|
11
|
-
* {@link EditorAskDialog}. One question at a time: a new one settles the open one as cancelled.
|
|
12
|
-
*/
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const ui = require("@nice2dev/ui");
|
|
5
|
+
const React = require("react");
|
|
13
6
|
function useEditorAsk() {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}),
|
|
34
|
-
|
|
7
|
+
const [pendingAsk, setPendingAsk] = React.useState(null);
|
|
8
|
+
const pendingRef = React.useRef(null);
|
|
9
|
+
const ask = React.useCallback(
|
|
10
|
+
(kind, text, defaultValue) => new Promise((resolve) => {
|
|
11
|
+
pendingRef.current?.answer(null);
|
|
12
|
+
const next = {
|
|
13
|
+
kind,
|
|
14
|
+
text,
|
|
15
|
+
defaultValue,
|
|
16
|
+
answer: (value) => {
|
|
17
|
+
if (pendingRef.current === next) {
|
|
18
|
+
pendingRef.current = null;
|
|
19
|
+
setPendingAsk(null);
|
|
20
|
+
}
|
|
21
|
+
resolve(value);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
pendingRef.current = next;
|
|
25
|
+
setPendingAsk(next);
|
|
26
|
+
}),
|
|
27
|
+
[]
|
|
28
|
+
);
|
|
29
|
+
return { pendingAsk, ask };
|
|
35
30
|
}
|
|
36
|
-
/** Shows the question {@link useEditorAsk} is waiting on, if any. */
|
|
37
31
|
const EditorAskDialog = ({ ask }) => {
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
if (!ask) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
if (ask.kind === "confirm") {
|
|
36
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
37
|
+
ui.NiceConfirmDialog,
|
|
38
|
+
{
|
|
39
|
+
visible: true,
|
|
40
|
+
message: ask.text,
|
|
41
|
+
onAccept: () => ask.answer(""),
|
|
42
|
+
onReject: () => ask.answer(null)
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
47
|
+
ui.NicePromptDialog,
|
|
48
|
+
{
|
|
49
|
+
open: true,
|
|
50
|
+
title: ask.text,
|
|
51
|
+
defaultValue: ask.defaultValue,
|
|
52
|
+
onSubmit: (value) => ask.answer(value),
|
|
53
|
+
onCancel: () => ask.answer(null)
|
|
40
54
|
}
|
|
41
|
-
|
|
42
|
-
return (jsxRuntime.jsx(ui.NiceConfirmDialog, { visible: true, message: ask.text, onAccept: () => ask.answer(''), onReject: () => ask.answer(null) }));
|
|
43
|
-
}
|
|
44
|
-
return (jsxRuntime.jsx(ui.NicePromptDialog, { open: true, title: ask.text, defaultValue: ask.defaultValue, onSubmit: (value) => ask.answer(value), onCancel: () => ask.answer(null) }));
|
|
55
|
+
);
|
|
45
56
|
};
|
|
46
|
-
|
|
47
57
|
exports.EditorAskDialog = EditorAskDialog;
|
|
48
58
|
exports.useEditorAsk = useEditorAsk;
|
package/dist/cjs/core/i18n.js
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
/** `null` outside this package's provider: the global translator applies. */
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const ui = require("@nice2dev/ui");
|
|
5
|
+
const React = require("react");
|
|
8
6
|
const NiceI18nContext = /* @__PURE__ */ React.createContext(null);
|
|
9
|
-
|
|
10
|
-
const NiceI18nProvider = ({ t, children }) => (jsxRuntime.jsx(NiceI18nContext.Provider, { value: t, children: children }));
|
|
7
|
+
const NiceI18nProvider = ({ t, children }) => /* @__PURE__ */ jsxRuntime.jsx(NiceI18nContext.Provider, { value: t, children });
|
|
11
8
|
function useNiceTranslation() {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
const own = React.useContext(NiceI18nContext);
|
|
10
|
+
const { t: global } = ui.useNiceTranslation();
|
|
11
|
+
const t = React.useMemo(
|
|
12
|
+
() => own ?? ((key, defaultValue) => global(key, defaultValue)),
|
|
13
|
+
[own, global]
|
|
14
|
+
);
|
|
15
|
+
return { t };
|
|
16
16
|
}
|
|
17
|
-
|
|
18
17
|
exports.NiceI18nProvider = NiceI18nProvider;
|
|
19
18
|
exports.useNiceTranslation = useNiceTranslation;
|
|
@@ -1,52 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const THREE = require("three");
|
|
5
4
|
function _interopNamespaceDefault(e) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
});
|
|
15
|
-
}
|
|
5
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
6
|
+
if (e) {
|
|
7
|
+
for (const k in e) {
|
|
8
|
+
if (k !== "default") {
|
|
9
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
10
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: () => e[k]
|
|
16
13
|
});
|
|
14
|
+
}
|
|
17
15
|
}
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
}
|
|
17
|
+
n.default = e;
|
|
18
|
+
return Object.freeze(n);
|
|
20
19
|
}
|
|
21
|
-
|
|
22
|
-
var THREE__namespace = /*#__PURE__*/_interopNamespaceDefault(THREE);
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* three.js r183 deprecated `Clock` (for `Timer`) and folds `PCFSoftShadowMap` into
|
|
26
|
-
* `PCFShadowMap`; both log a console warning there. The peer range starts at r150, which has
|
|
27
|
-
* neither `Timer` in its core nor the softer `PCFShadowMap`, so the choice follows the revision.
|
|
28
|
-
*/
|
|
20
|
+
const THREE__namespace = /* @__PURE__ */ _interopNamespaceDefault(THREE);
|
|
29
21
|
const REVISION = Number.parseInt(THREE__namespace.REVISION, 10);
|
|
30
22
|
const MODERN = REVISION >= 183;
|
|
31
|
-
|
|
32
|
-
const SOFT_SHADOW_MAP = MODERN
|
|
33
|
-
? THREE__namespace.PCFShadowMap
|
|
34
|
-
: THREE__namespace.PCFSoftShadowMap;
|
|
35
|
-
/** `Timer` where three has deprecated `Clock`, `Clock` before. */
|
|
23
|
+
const SOFT_SHADOW_MAP = MODERN ? THREE__namespace.PCFShadowMap : THREE__namespace.PCFSoftShadowMap;
|
|
36
24
|
function createFrameClock() {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
25
|
+
const TimerCtor = THREE__namespace.Timer;
|
|
26
|
+
if (MODERN && TimerCtor) {
|
|
27
|
+
const timer = new TimerCtor();
|
|
28
|
+
return {
|
|
29
|
+
getDelta: () => {
|
|
30
|
+
timer.update();
|
|
31
|
+
return timer.getDelta();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const clock = new THREE__namespace.Clock();
|
|
36
|
+
return { getDelta: () => clock.getDelta() };
|
|
49
37
|
}
|
|
50
|
-
|
|
51
38
|
exports.SOFT_SHADOW_MAP = SOFT_SHADOW_MAP;
|
|
52
39
|
exports.createFrameClock = createFrameClock;
|