react-three-game 0.0.70 → 0.0.72
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/dist/index.d.ts +9 -5
- package/dist/index.js +5 -2
- package/dist/tools/prefabeditor/EditorTree.js +2 -12
- package/dist/tools/prefabeditor/EditorTreeMenus.js +1 -19
- package/dist/tools/prefabeditor/EditorUI.js +2 -1
- package/dist/tools/prefabeditor/PrefabEditor.d.ts +1 -3
- package/dist/tools/prefabeditor/PrefabEditor.js +23 -42
- package/dist/tools/prefabeditor/PrefabRoot.d.ts +39 -13
- package/dist/tools/prefabeditor/PrefabRoot.js +105 -49
- package/dist/tools/prefabeditor/components/AmbientLightComponent.js +10 -7
- package/dist/tools/prefabeditor/components/CameraComponent.js +11 -15
- package/dist/tools/prefabeditor/components/ClickComponent.js +5 -1
- package/dist/tools/prefabeditor/components/ComponentRegistry.d.ts +15 -1
- package/dist/tools/prefabeditor/components/DirectionalLightComponent.js +127 -53
- package/dist/tools/prefabeditor/components/EnvironmentComponent.js +5 -3
- package/dist/tools/prefabeditor/components/MaterialComponent.js +9 -6
- package/dist/tools/prefabeditor/components/ModelComponent.js +4 -2
- package/dist/tools/prefabeditor/components/PhysicsComponent.js +6 -3
- package/dist/tools/prefabeditor/components/PointLightComponent.d.ts +3 -0
- package/dist/tools/prefabeditor/components/PointLightComponent.js +57 -0
- package/dist/tools/prefabeditor/components/SoundComponent.js +21 -16
- package/dist/tools/prefabeditor/components/SpotLightComponent.js +49 -24
- package/dist/tools/prefabeditor/components/index.js +2 -0
- package/dist/tools/prefabeditor/components/lightUtils.d.ts +13 -0
- package/dist/tools/prefabeditor/components/lightUtils.js +64 -0
- package/dist/tools/prefabeditor/prefab.d.ts +37 -0
- package/dist/tools/prefabeditor/prefab.js +229 -0
- package/dist/tools/prefabeditor/prefabStore.d.ts +3 -16
- package/dist/tools/prefabeditor/prefabStore.js +29 -168
- package/dist/tools/prefabeditor/{sceneApi.d.ts → scene.d.ts} +6 -2
- package/dist/tools/prefabeditor/{sceneApi.js → scene.js} +13 -19
- package/dist/tools/prefabeditor/utils.d.ts +0 -4
- package/dist/tools/prefabeditor/utils.js +0 -37
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -10,15 +10,19 @@ export { useEditorContext } from './tools/prefabeditor/PrefabEditor';
|
|
|
10
10
|
export type { EditorContextType } from './tools/prefabeditor/PrefabEditor';
|
|
11
11
|
export { createPrefabStore, prefabStoreToPrefab, usePrefabStoreApi } from './tools/prefabeditor/prefabStore';
|
|
12
12
|
export type { PrefabStoreApi, PrefabStoreState } from './tools/prefabeditor/prefabStore';
|
|
13
|
-
export { createScene } from './tools/prefabeditor/
|
|
13
|
+
export { createScene } from './tools/prefabeditor/scene';
|
|
14
|
+
export { denormalizePrefab } from './tools/prefabeditor/prefab';
|
|
14
15
|
export { registerComponent } from './tools/prefabeditor/components/ComponentRegistry';
|
|
15
16
|
export { FieldRenderer, FieldGroup, ListEditor, Label, Vector3Input, Vector3Field, NumberField, ColorInput, ColorField, StringInput, StringField, BooleanInput, BooleanField, SelectInput, SelectField, } from './tools/prefabeditor/components/Input';
|
|
16
|
-
export { loadJson, saveJson, exportGLB, exportGLBData, regenerateIds, computeParentWorldMatrix,
|
|
17
|
+
export { loadJson, saveJson, exportGLB, exportGLBData, regenerateIds, computeParentWorldMatrix, } from './tools/prefabeditor/utils';
|
|
17
18
|
export type { ExportGLBOptions } from './tools/prefabeditor/utils';
|
|
19
|
+
export { createModelNode, createImageNode, } from './tools/prefabeditor/prefab';
|
|
18
20
|
export type { PrefabEditorProps, PrefabEditorRef, } from './tools/prefabeditor/PrefabEditor';
|
|
19
|
-
export type { SpawnOptions, Scene, Entity, EntityComponent, EntityData, EntityUpdate, PropertyPath, SceneUpdates, } from './tools/prefabeditor/
|
|
20
|
-
export type { PrefabRootProps,
|
|
21
|
-
export type {
|
|
21
|
+
export type { SpawnOptions, Scene, Entity, EntityComponent, EntityData, EntityUpdate, PropertyPath, SceneUpdates, } from './tools/prefabeditor/scene';
|
|
22
|
+
export type { PrefabRootProps, AssetRuntime } from './tools/prefabeditor/PrefabRoot';
|
|
23
|
+
export type { EntityRuntime, LiveObjectRef, LiveRigidBodyRef } from './tools/prefabeditor/PrefabRoot';
|
|
24
|
+
export { useAssetRuntime, useEntityRuntime, useEntityObjectRef, useEntityRigidBodyRef } from './tools/prefabeditor/PrefabRoot';
|
|
25
|
+
export type { Component, ComponentViewProps } from './tools/prefabeditor/components/ComponentRegistry';
|
|
22
26
|
export type { FieldDefinition, FieldType } from './tools/prefabeditor/components/Input';
|
|
23
27
|
export type { Prefab, GameObject, ComponentData } from './tools/prefabeditor/types';
|
|
24
28
|
export { findComponent, findComponentEntry, hasComponent } from './tools/prefabeditor/types';
|
package/dist/index.js
CHANGED
|
@@ -10,13 +10,16 @@ export { default as PrefabRoot } from './tools/prefabeditor/PrefabRoot';
|
|
|
10
10
|
export { useEditorContext } from './tools/prefabeditor/PrefabEditor';
|
|
11
11
|
// Prefab Editor - Store & Scene API
|
|
12
12
|
export { createPrefabStore, prefabStoreToPrefab, usePrefabStoreApi } from './tools/prefabeditor/prefabStore';
|
|
13
|
-
export { createScene } from './tools/prefabeditor/
|
|
13
|
+
export { createScene } from './tools/prefabeditor/scene';
|
|
14
|
+
export { denormalizePrefab } from './tools/prefabeditor/prefab';
|
|
14
15
|
// Prefab Editor - Component Registry
|
|
15
16
|
export { registerComponent } from './tools/prefabeditor/components/ComponentRegistry';
|
|
16
17
|
// Prefab Editor - Input Components
|
|
17
18
|
export { FieldRenderer, FieldGroup, ListEditor, Label, Vector3Input, Vector3Field, NumberField, ColorInput, ColorField, StringInput, StringField, BooleanInput, BooleanField, SelectInput, SelectField, } from './tools/prefabeditor/components/Input';
|
|
18
19
|
// Prefab Editor - Utils
|
|
19
|
-
export { loadJson, saveJson, exportGLB, exportGLBData, regenerateIds, computeParentWorldMatrix,
|
|
20
|
+
export { loadJson, saveJson, exportGLB, exportGLBData, regenerateIds, computeParentWorldMatrix, } from './tools/prefabeditor/utils';
|
|
21
|
+
export { createModelNode, createImageNode, } from './tools/prefabeditor/prefab';
|
|
22
|
+
export { useAssetRuntime, useEntityRuntime, useEntityObjectRef, useEntityRigidBodyRef } from './tools/prefabeditor/PrefabRoot';
|
|
20
23
|
export { findComponent, findComponentEntry, hasComponent } from './tools/prefabeditor/types';
|
|
21
24
|
// Game Events (physics + custom events)
|
|
22
25
|
export { gameEvents, useGameEvent, getEntityIdFromRigidBody } from './tools/prefabeditor/GameEvents';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { memo, useCallback, useState } from 'react';
|
|
3
|
-
import { getComponentDef } from './components/ComponentRegistry';
|
|
4
3
|
import { base, colors, tree } from './styles';
|
|
5
4
|
import { useEditorContext } from './PrefabEditor';
|
|
6
5
|
import { Dropdown } from './Dropdown';
|
|
7
6
|
import { FileMenu, TreeContextMenu, TreeNodeMenu } from './EditorTreeMenus';
|
|
7
|
+
import { createEmptyNode } from './prefab';
|
|
8
8
|
import { usePrefabChildIds, usePrefabNode, usePrefabRootId, usePrefabStore, usePrefabStoreApi } from './prefabStore';
|
|
9
9
|
export default function EditorTree({ selectedId, setSelectedId, getPrefab, onReplacePrefab, onImportPrefab, onUndo, onRedo, canUndo, canRedo }) {
|
|
10
10
|
const { onFocusNode } = useEditorContext();
|
|
@@ -30,17 +30,7 @@ export default function EditorTree({ selectedId, setSelectedId, getPrefab, onRep
|
|
|
30
30
|
});
|
|
31
31
|
};
|
|
32
32
|
const handleAddChild = (parentId) => {
|
|
33
|
-
|
|
34
|
-
const newNode = {
|
|
35
|
-
id: crypto.randomUUID(),
|
|
36
|
-
name: "New Node",
|
|
37
|
-
components: {
|
|
38
|
-
transform: {
|
|
39
|
-
type: "Transform",
|
|
40
|
-
properties: Object.assign({}, (_a = getComponentDef('Transform')) === null || _a === void 0 ? void 0 : _a.defaultProperties)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
};
|
|
33
|
+
const newNode = createEmptyNode();
|
|
44
34
|
addChild(parentId, newNode);
|
|
45
35
|
setSelectedId(newNode.id);
|
|
46
36
|
};
|
|
@@ -10,28 +10,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
11
|
import { useEffect, useRef, useState } from 'react';
|
|
12
12
|
import { createPortal } from 'react-dom';
|
|
13
|
+
import { createEmptyPrefab } from './prefab';
|
|
13
14
|
import { menu } from './styles';
|
|
14
15
|
import { useEditorContext } from './PrefabEditor';
|
|
15
|
-
import { getComponentDef } from './components/ComponentRegistry';
|
|
16
16
|
import { loadJson, saveJson } from './utils';
|
|
17
|
-
function createEmptyPrefab() {
|
|
18
|
-
var _a;
|
|
19
|
-
return {
|
|
20
|
-
id: crypto.randomUUID(),
|
|
21
|
-
name: 'New Prefab',
|
|
22
|
-
root: {
|
|
23
|
-
id: crypto.randomUUID(),
|
|
24
|
-
name: 'Root',
|
|
25
|
-
components: {
|
|
26
|
-
transform: {
|
|
27
|
-
type: 'Transform',
|
|
28
|
-
properties: Object.assign({}, (_a = getComponentDef('Transform')) === null || _a === void 0 ? void 0 : _a.defaultProperties)
|
|
29
|
-
}
|
|
30
|
-
},
|
|
31
|
-
children: []
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
17
|
function MenuPanel({ children, style, }) {
|
|
36
18
|
return (_jsx("div", { style: Object.assign(Object.assign(Object.assign({}, menu.container), { position: 'static' }), style), onClick: (e) => e.stopPropagation(), children: children }));
|
|
37
19
|
}
|
|
@@ -14,6 +14,7 @@ import { useState } from 'react';
|
|
|
14
14
|
import { hasComponent } from "./types";
|
|
15
15
|
import EditorTree from './EditorTree';
|
|
16
16
|
import { getAllComponentDefs } from './components/ComponentRegistry';
|
|
17
|
+
import { createComponentData } from './prefab';
|
|
17
18
|
import { base, colors, inspector, componentCard } from './styles';
|
|
18
19
|
import { usePrefabStore } from './prefabStore';
|
|
19
20
|
function EditorUI({ selectedId, setSelectedId, getPrefab, onReplacePrefab, onImportPrefab, basePath, onUndo, onRedo, canUndo, canRedo }) {
|
|
@@ -58,7 +59,7 @@ function NodeInspector({ node, updateNode, deleteNode, basePath }) {
|
|
|
58
59
|
return;
|
|
59
60
|
const def = ALL_COMPONENTS[addType];
|
|
60
61
|
if (def) {
|
|
61
|
-
updateNode(n => (Object.assign(Object.assign({}, n), { components: Object.assign(Object.assign({}, n.components), { [addType.toLowerCase()]:
|
|
62
|
+
updateNode(n => (Object.assign(Object.assign({}, n), { components: Object.assign(Object.assign({}, n.components), { [addType.toLowerCase()]: createComponentData(def.name) }) })));
|
|
62
63
|
}
|
|
63
64
|
}, title: "Add Component", children: "+" })] }) }))] });
|
|
64
65
|
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import GameCanvas from "../../shared/GameCanvas";
|
|
2
2
|
import { Object3D, Texture } from "three";
|
|
3
3
|
import { GameObject, Prefab } from "./types";
|
|
4
|
-
import { PrefabRootRef } from "./PrefabRoot";
|
|
5
4
|
import type { ExportGLBOptions } from "./utils";
|
|
6
|
-
import { type Scene, type SpawnOptions } from "./
|
|
5
|
+
import { type Scene, type SpawnOptions } from "./scene";
|
|
7
6
|
export interface PrefabEditorRef {
|
|
8
7
|
screenshot: () => void;
|
|
9
8
|
exportGLB: (options?: ExportGLBOptions) => Promise<ArrayBuffer | undefined>;
|
|
@@ -17,7 +16,6 @@ export interface PrefabEditorRef {
|
|
|
17
16
|
}) => void;
|
|
18
17
|
addModel: (path: string, model: Object3D, options?: SpawnOptions) => GameObject;
|
|
19
18
|
addTexture: (path: string, texture: Texture, options?: SpawnOptions) => GameObject;
|
|
20
|
-
viewRef: React.RefObject<PrefabRootRef | null>;
|
|
21
19
|
}
|
|
22
20
|
export declare enum PrefabEditorMode {
|
|
23
21
|
Edit = "edit",
|
|
@@ -16,10 +16,11 @@ import PrefabRoot from "./PrefabRoot";
|
|
|
16
16
|
import { Physics } from "@react-three/rapier";
|
|
17
17
|
import EditorUI from "./EditorUI";
|
|
18
18
|
import { base, toolbar } from "./styles";
|
|
19
|
-
import {
|
|
19
|
+
import { computeParentWorldMatrix, decompose, exportGLB as exportGLBFile, exportGLBData, focusCameraOnObject, regenerateIds } from "./utils";
|
|
20
20
|
import { loadFiles } from "../dragdrop";
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
21
|
+
import { denormalizePrefab, createImageNode, createModelNode, createNode } from './prefab';
|
|
22
|
+
import { createPrefabStore, PrefabStoreProvider } from "./prefabStore";
|
|
23
|
+
import { createScene } from "./scene";
|
|
23
24
|
export var PrefabEditorMode;
|
|
24
25
|
(function (PrefabEditorMode) {
|
|
25
26
|
PrefabEditorMode["Edit"] = "edit";
|
|
@@ -38,15 +39,7 @@ const HISTORY_DEBOUNCE_MS = 500;
|
|
|
38
39
|
const DEFAULT_PREFAB = {
|
|
39
40
|
id: "prefab-default",
|
|
40
41
|
name: "New Prefab",
|
|
41
|
-
root: {
|
|
42
|
-
id: "root",
|
|
43
|
-
components: {
|
|
44
|
-
transform: {
|
|
45
|
-
type: "Transform",
|
|
46
|
-
properties: { position: [0, 0, 0], rotation: [0, 0, 0], scale: [1, 1, 1] }
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
42
|
+
root: createNode('Root', {}, { id: 'root' })
|
|
50
43
|
};
|
|
51
44
|
const PrefabEditor = forwardRef(({ basePath, initialPrefab, physics = true, mode: initialMode = PrefabEditorMode.Edit, onChange, showUI = true, enableWindowDrop = true, canvasProps, uiPlugins, children }, ref) => {
|
|
52
45
|
const [mode, setMode] = useState(initialMode);
|
|
@@ -66,10 +59,10 @@ const PrefabEditor = forwardRef(({ basePath, initialPrefab, physics = true, mode
|
|
|
66
59
|
const canvasRef = useRef(null);
|
|
67
60
|
const controlsRef = useRef(null);
|
|
68
61
|
const onChangeRef = useRef(onChange);
|
|
69
|
-
const [injectedModels, setInjectedModels] = useState({});
|
|
70
|
-
const [injectedTextures, setInjectedTextures] = useState({});
|
|
71
62
|
const isEditMode = mode === PrefabEditorMode.Edit;
|
|
72
|
-
const getPrefab = useCallback(() =>
|
|
63
|
+
const getPrefab = useCallback(() => denormalizePrefab(prefabStore.getState()), [prefabStore]);
|
|
64
|
+
const getObject = useCallback((nodeId) => { var _a, _b; return (_b = (_a = prefabRootRef.current) === null || _a === void 0 ? void 0 : _a.getObject(nodeId)) !== null && _b !== void 0 ? _b : null; }, []);
|
|
65
|
+
const getRigidBody = useCallback((nodeId) => { var _a, _b; return (_b = (_a = prefabRootRef.current) === null || _a === void 0 ? void 0 : _a.getRigidBody(nodeId)) !== null && _b !== void 0 ? _b : null; }, []);
|
|
73
66
|
onChangeRef.current = onChange;
|
|
74
67
|
const setSelection = useCallback((nodeId) => {
|
|
75
68
|
const nextNode = nodeId ? prefabStore.getState().nodesById[nodeId] : null;
|
|
@@ -101,8 +94,6 @@ const PrefabEditor = forwardRef(({ basePath, initialPrefab, physics = true, mode
|
|
|
101
94
|
setSelectedObject(null);
|
|
102
95
|
if (options === null || options === void 0 ? void 0 : options.resetHistory) {
|
|
103
96
|
setSelectedId(null);
|
|
104
|
-
setInjectedModels({});
|
|
105
|
-
setInjectedTextures({});
|
|
106
97
|
setHistory([prefab]);
|
|
107
98
|
historyIndexRef.current = 0;
|
|
108
99
|
setHistoryIndex(0);
|
|
@@ -124,7 +115,7 @@ const PrefabEditor = forwardRef(({ basePath, initialPrefab, physics = true, mode
|
|
|
124
115
|
return;
|
|
125
116
|
}
|
|
126
117
|
lastRevision = state.revision;
|
|
127
|
-
const nextPrefab =
|
|
118
|
+
const nextPrefab = denormalizePrefab(state);
|
|
128
119
|
const changeOrigin = changeOriginRef.current;
|
|
129
120
|
if (changeOrigin !== "replace-silent") {
|
|
130
121
|
(_a = onChangeRef.current) === null || _a === void 0 ? void 0 : _a.call(onChangeRef, nextPrefab);
|
|
@@ -168,13 +159,12 @@ const PrefabEditor = forwardRef(({ basePath, initialPrefab, physics = true, mode
|
|
|
168
159
|
return () => unsubscribe();
|
|
169
160
|
}, [prefabStore, selectedId]);
|
|
170
161
|
useEffect(() => {
|
|
171
|
-
var _a, _b;
|
|
172
162
|
if (!selectedId) {
|
|
173
163
|
setSelectedObject(null);
|
|
174
164
|
return;
|
|
175
165
|
}
|
|
176
|
-
setSelectedObject(
|
|
177
|
-
}, [selectedId]);
|
|
166
|
+
setSelectedObject(getObject(selectedId));
|
|
167
|
+
}, [getObject, selectedId]);
|
|
178
168
|
const addNode = useCallback((node, options) => {
|
|
179
169
|
var _a;
|
|
180
170
|
const { addChild, rootId } = prefabStore.getState();
|
|
@@ -188,15 +178,17 @@ const PrefabEditor = forwardRef(({ basePath, initialPrefab, physics = true, mode
|
|
|
188
178
|
addNode(regenerateIds(prefab.root), { select: false });
|
|
189
179
|
}, [addNode]);
|
|
190
180
|
const addModel = useCallback((path, model, options) => {
|
|
181
|
+
var _a;
|
|
191
182
|
const node = createModelNode(path, options === null || options === void 0 ? void 0 : options.name);
|
|
192
183
|
addNode(node, options);
|
|
193
|
-
|
|
184
|
+
(_a = prefabRootRef.current) === null || _a === void 0 ? void 0 : _a.addModel(path, model);
|
|
194
185
|
return node;
|
|
195
186
|
}, [addNode]);
|
|
196
187
|
const addTexture = useCallback((path, texture, options) => {
|
|
188
|
+
var _a;
|
|
197
189
|
const node = createImageNode(path, options === null || options === void 0 ? void 0 : options.name);
|
|
198
190
|
addNode(node, options);
|
|
199
|
-
|
|
191
|
+
(_a = prefabRootRef.current) === null || _a === void 0 ? void 0 : _a.addTexture(path, texture);
|
|
200
192
|
return node;
|
|
201
193
|
}, [addNode]);
|
|
202
194
|
const applyHistory = (index) => {
|
|
@@ -265,39 +257,29 @@ const PrefabEditor = forwardRef(({ basePath, initialPrefab, physics = true, mode
|
|
|
265
257
|
return exportGLBData(rootObject);
|
|
266
258
|
}), [clearSelection]);
|
|
267
259
|
const handleFocusNode = useCallback((nodeId) => {
|
|
268
|
-
|
|
269
|
-
const object = (_a = prefabRootRef.current) === null || _a === void 0 ? void 0 : _a.getObject(nodeId);
|
|
260
|
+
const object = getObject(nodeId);
|
|
270
261
|
const controls = controlsRef.current;
|
|
271
262
|
const camera = controls === null || controls === void 0 ? void 0 : controls.object;
|
|
272
263
|
if (!object || !controls || !camera)
|
|
273
264
|
return;
|
|
274
265
|
focusCameraOnObject(object, camera, controls.target, () => { var _a; return (_a = controls.update) === null || _a === void 0 ? void 0 : _a.call(controls); });
|
|
275
|
-
}, []);
|
|
266
|
+
}, [getObject]);
|
|
276
267
|
const scene = useMemo(() => createScene({
|
|
277
268
|
getRootId: () => prefabStore.getState().rootId,
|
|
278
269
|
getNode: (id) => { var _a; return (_a = prefabStore.getState().nodesById[id]) !== null && _a !== void 0 ? _a : null; },
|
|
279
270
|
getChildIds: (id) => { var _a; return (_a = prefabStore.getState().childIdsById[id]) !== null && _a !== void 0 ? _a : []; },
|
|
280
271
|
getParentId: (id) => { var _a; return (_a = prefabStore.getState().parentIdById[id]) !== null && _a !== void 0 ? _a : null; },
|
|
281
|
-
findByName: (name) => {
|
|
282
|
-
var _a;
|
|
283
|
-
const state = prefabStore.getState();
|
|
284
|
-
const normalized = name.toLowerCase();
|
|
285
|
-
for (const [id, node] of Object.entries(state.nodesById)) {
|
|
286
|
-
if (((_a = node.name) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === normalized)
|
|
287
|
-
return id;
|
|
288
|
-
}
|
|
289
|
-
return null;
|
|
290
|
-
},
|
|
291
272
|
updateNode: (id, update) => prefabStore.getState().updateNode(id, update),
|
|
292
273
|
updateNodes: (updates) => prefabStore.getState().updateNodes(Object.entries(updates).map(([id, update]) => ({ id, update }))),
|
|
293
274
|
addNode: (node, options) => addNode(node, options).id,
|
|
294
275
|
removeNode: (id) => prefabStore.getState().deleteNode(id),
|
|
295
|
-
|
|
276
|
+
getObject,
|
|
277
|
+
getRigidBody,
|
|
278
|
+
}), [addNode, getObject, getRigidBody, prefabStore]);
|
|
296
279
|
const handleTransformChange = () => {
|
|
297
|
-
var _a;
|
|
298
280
|
if (!selectedId)
|
|
299
281
|
return;
|
|
300
|
-
const object =
|
|
282
|
+
const object = getObject(selectedId);
|
|
301
283
|
if (!object)
|
|
302
284
|
return;
|
|
303
285
|
const parentWorld = computeParentWorldMatrix(prefabStore.getState(), selectedId);
|
|
@@ -358,10 +340,9 @@ const PrefabEditor = forwardRef(({ basePath, initialPrefab, physics = true, mode
|
|
|
358
340
|
scene,
|
|
359
341
|
load: loadPrefab,
|
|
360
342
|
addModel,
|
|
361
|
-
addTexture
|
|
362
|
-
viewRef: prefabRootRef
|
|
343
|
+
addTexture
|
|
363
344
|
}), [addModel, addTexture, clearSelection, getPrefab, handleExportGLB, handleExportGLBData, handleScreenshot, loadPrefab, scene]);
|
|
364
|
-
const content = (_jsxs(_Fragment, { children: [
|
|
345
|
+
const content = (_jsxs(_Fragment, { children: [isEditMode ? _jsx("gridHelper", { args: [10, 10], position: [0, -1, 0] }) : null, _jsx(PrefabRoot, { ref: prefabRootRef, store: prefabStore, editMode: isEditMode, selectedId: selectedId, onSelect: setSelection, basePath: basePath }), children] }));
|
|
365
346
|
return _jsx(PrefabStoreProvider, { store: prefabStore, children: _jsxs(EditorContext.Provider, { value: {
|
|
366
347
|
mode,
|
|
367
348
|
setMode: updateMode,
|
|
@@ -1,14 +1,49 @@
|
|
|
1
|
-
import { Group, Matrix4, Object3D } from "three";
|
|
1
|
+
import { Group, Matrix4, Object3D, Texture } from "three";
|
|
2
2
|
import { ThreeEvent } from "@react-three/fiber";
|
|
3
3
|
import { GameObject as GameObjectType, Prefab } from "./types";
|
|
4
|
-
import { LoadedModels
|
|
4
|
+
import { LoadedModels } from "../dragdrop";
|
|
5
5
|
import { PrefabStoreApi } from "./prefabStore";
|
|
6
|
+
/** Scene-wide shared services available to component Views inside a PrefabRoot. */
|
|
7
|
+
export interface AssetRuntime {
|
|
8
|
+
/** @internal Used by PhysicsComponent. */
|
|
9
|
+
registerRigidBodyRef: (id: string, rb: any) => void;
|
|
10
|
+
/** Get a loaded model by asset path. */
|
|
11
|
+
getModel: (path: string) => Object3D | null;
|
|
12
|
+
/** Get a loaded texture by asset path. */
|
|
13
|
+
getTexture: (path: string) => Texture | null;
|
|
14
|
+
/** Get a loaded sound buffer by asset path. */
|
|
15
|
+
getSound: (path: string) => AudioBuffer | null;
|
|
16
|
+
/** Get a revision string that changes when loaded assets change (for cache-busting keys). */
|
|
17
|
+
getAssetRevision: () => string;
|
|
18
|
+
}
|
|
19
|
+
export interface EntityRuntime {
|
|
20
|
+
nodeId: string;
|
|
21
|
+
editMode?: boolean;
|
|
22
|
+
isSelected?: boolean;
|
|
23
|
+
getObject: <T extends Object3D = Object3D>() => T | null;
|
|
24
|
+
getRigidBody: <T = any>() => T | null;
|
|
25
|
+
}
|
|
26
|
+
export interface LiveObjectRef<T extends Object3D = Object3D> {
|
|
27
|
+
readonly current: T | null;
|
|
28
|
+
}
|
|
29
|
+
export interface LiveRigidBodyRef<T = any> {
|
|
30
|
+
readonly current: T | null;
|
|
31
|
+
}
|
|
32
|
+
/** Access scene-wide shared services from within a component View. */
|
|
33
|
+
export declare function useAssetRuntime(): AssetRuntime;
|
|
34
|
+
/** Access the current node's runtime from within a component View. */
|
|
35
|
+
export declare function useEntityRuntime(): EntityRuntime;
|
|
36
|
+
/** Read the current component's Object3D through a live ref-like accessor. */
|
|
37
|
+
export declare function useEntityObjectRef<T extends Object3D = Object3D>(): LiveObjectRef<T>;
|
|
38
|
+
/** Read the current component's rigid body through a live ref-like accessor. */
|
|
39
|
+
export declare function useEntityRigidBodyRef<T = any>(): LiveRigidBodyRef<T>;
|
|
6
40
|
export interface PrefabRootRef {
|
|
7
41
|
root: Group | null;
|
|
8
|
-
rigidBodyRefs: Map<string, any>;
|
|
9
42
|
getObject: (nodeId: string) => Object3D | null;
|
|
10
43
|
getRigidBody: (nodeId: string) => any;
|
|
11
|
-
|
|
44
|
+
addModel: (path: string, model: Object3D) => void;
|
|
45
|
+
addTexture: (path: string, texture: Texture) => void;
|
|
46
|
+
addSound: (path: string, sound: AudioBuffer) => void;
|
|
12
47
|
}
|
|
13
48
|
export interface PrefabRootProps {
|
|
14
49
|
editMode?: boolean;
|
|
@@ -17,12 +52,7 @@ export interface PrefabRootProps {
|
|
|
17
52
|
selectedId?: string | null;
|
|
18
53
|
onSelect?: (id: string | null) => void;
|
|
19
54
|
onClick?: (event: ThreeEvent<PointerEvent>, entity: GameObjectType) => void;
|
|
20
|
-
onSelectedObjectChange?: (object: Object3D | null) => void;
|
|
21
|
-
onFocusNode?: (nodeId: string) => void;
|
|
22
55
|
basePath?: string;
|
|
23
|
-
injectedModels?: LoadedModels;
|
|
24
|
-
injectedTextures?: LoadedTextures;
|
|
25
|
-
injectedSounds?: LoadedSounds;
|
|
26
56
|
}
|
|
27
57
|
export declare const PrefabRoot: import("react").ForwardRefExoticComponent<PrefabRootProps & import("react").RefAttributes<PrefabRootRef>>;
|
|
28
58
|
export declare function GameObjectRenderer(props: RendererProps): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -32,11 +62,7 @@ interface RendererProps {
|
|
|
32
62
|
onSelect?: (id: string) => void;
|
|
33
63
|
onClick?: (event: ThreeEvent<PointerEvent>, entity: GameObjectType) => void;
|
|
34
64
|
registerRef: (id: string, obj: Object3D | null) => void;
|
|
35
|
-
registerRigidBodyRef: (id: string, rb: any) => void;
|
|
36
|
-
getRigidBody: (id: string) => any;
|
|
37
65
|
loadedModels: LoadedModels;
|
|
38
|
-
loadedSounds: LoadedSounds;
|
|
39
|
-
loadedTextures: LoadedTextures;
|
|
40
66
|
editMode?: boolean;
|
|
41
67
|
parentMatrix?: Matrix4;
|
|
42
68
|
}
|