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.
Files changed (34) hide show
  1. package/dist/index.d.ts +9 -5
  2. package/dist/index.js +5 -2
  3. package/dist/tools/prefabeditor/EditorTree.js +2 -12
  4. package/dist/tools/prefabeditor/EditorTreeMenus.js +1 -19
  5. package/dist/tools/prefabeditor/EditorUI.js +2 -1
  6. package/dist/tools/prefabeditor/PrefabEditor.d.ts +1 -3
  7. package/dist/tools/prefabeditor/PrefabEditor.js +23 -42
  8. package/dist/tools/prefabeditor/PrefabRoot.d.ts +39 -13
  9. package/dist/tools/prefabeditor/PrefabRoot.js +105 -49
  10. package/dist/tools/prefabeditor/components/AmbientLightComponent.js +10 -7
  11. package/dist/tools/prefabeditor/components/CameraComponent.js +11 -15
  12. package/dist/tools/prefabeditor/components/ClickComponent.js +5 -1
  13. package/dist/tools/prefabeditor/components/ComponentRegistry.d.ts +15 -1
  14. package/dist/tools/prefabeditor/components/DirectionalLightComponent.js +127 -53
  15. package/dist/tools/prefabeditor/components/EnvironmentComponent.js +5 -3
  16. package/dist/tools/prefabeditor/components/MaterialComponent.js +9 -6
  17. package/dist/tools/prefabeditor/components/ModelComponent.js +4 -2
  18. package/dist/tools/prefabeditor/components/PhysicsComponent.js +6 -3
  19. package/dist/tools/prefabeditor/components/PointLightComponent.d.ts +3 -0
  20. package/dist/tools/prefabeditor/components/PointLightComponent.js +57 -0
  21. package/dist/tools/prefabeditor/components/SoundComponent.js +21 -16
  22. package/dist/tools/prefabeditor/components/SpotLightComponent.js +49 -24
  23. package/dist/tools/prefabeditor/components/index.js +2 -0
  24. package/dist/tools/prefabeditor/components/lightUtils.d.ts +13 -0
  25. package/dist/tools/prefabeditor/components/lightUtils.js +64 -0
  26. package/dist/tools/prefabeditor/prefab.d.ts +37 -0
  27. package/dist/tools/prefabeditor/prefab.js +229 -0
  28. package/dist/tools/prefabeditor/prefabStore.d.ts +3 -16
  29. package/dist/tools/prefabeditor/prefabStore.js +29 -168
  30. package/dist/tools/prefabeditor/{sceneApi.d.ts → scene.d.ts} +6 -2
  31. package/dist/tools/prefabeditor/{sceneApi.js → scene.js} +13 -19
  32. package/dist/tools/prefabeditor/utils.d.ts +0 -4
  33. package/dist/tools/prefabeditor/utils.js +0 -37
  34. 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/sceneApi';
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, createModelNode, createImageNode, } from './tools/prefabeditor/utils';
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/sceneApi';
20
- export type { PrefabRootProps, PrefabRootRef } from './tools/prefabeditor/PrefabRoot';
21
- export type { Component } from './tools/prefabeditor/components/ComponentRegistry';
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/sceneApi';
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, createModelNode, createImageNode, } from './tools/prefabeditor/utils';
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
- var _a;
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()]: { type: def.name, properties: def.defaultProperties } }) })));
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 "./sceneApi";
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 { createImageNode, createModelNode, computeParentWorldMatrix, decompose, exportGLB as exportGLBFile, exportGLBData, focusCameraOnObject, regenerateIds } from "./utils";
19
+ import { computeParentWorldMatrix, decompose, exportGLB as exportGLBFile, exportGLBData, focusCameraOnObject, regenerateIds } from "./utils";
20
20
  import { loadFiles } from "../dragdrop";
21
- import { createPrefabStore, PrefabStoreProvider, prefabStoreToPrefab } from "./prefabStore";
22
- import { createScene } from "./sceneApi";
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(() => prefabStoreToPrefab(prefabStore.getState()), [prefabStore]);
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 = prefabStoreToPrefab(state);
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((_b = (_a = prefabRootRef.current) === null || _a === void 0 ? void 0 : _a.getObject(selectedId)) !== null && _b !== void 0 ? _b : null);
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
- setInjectedModels(prev => (Object.assign(Object.assign({}, prev), { [path]: model })));
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
- setInjectedTextures(prev => (Object.assign(Object.assign({}, prev), { [path]: texture })));
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
- var _a;
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
- }), [addNode, prefabStore]);
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 = (_a = prefabRootRef.current) === null || _a === void 0 ? void 0 : _a.getObject(selectedId);
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: [_jsx("ambientLight", { intensity: 1.5 }), _jsx("gridHelper", { args: [10, 10], position: [0, -1, 0] }), _jsx(PrefabRoot, { ref: prefabRootRef, store: prefabStore, editMode: isEditMode, selectedId: selectedId, onSelect: setSelection, onSelectedObjectChange: isEditMode ? setSelectedObject : undefined, onFocusNode: isEditMode ? handleFocusNode : undefined, basePath: basePath, injectedModels: injectedModels, injectedTextures: injectedTextures }), 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, LoadedSounds, LoadedTextures } from "../dragdrop";
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
- focusNode: (nodeId: string) => void;
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
  }