@encorejs/r3f 1.0.0

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 (73) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +104 -0
  3. package/dist/drei/OrthographicCamera.d.ts +13 -0
  4. package/dist/drei/OrthographicCamera.d.ts.map +1 -0
  5. package/dist/drei/PerspectiveCamera.d.ts +13 -0
  6. package/dist/drei/PerspectiveCamera.d.ts.map +1 -0
  7. package/dist/drei/index.d.ts +3 -0
  8. package/dist/drei/index.d.ts.map +1 -0
  9. package/dist/extension/InfiniteGridHelper/index.d.ts +12 -0
  10. package/dist/extension/InfiniteGridHelper/index.d.ts.map +1 -0
  11. package/dist/extension/components/DragDetector.d.ts +8 -0
  12. package/dist/extension/components/DragDetector.d.ts.map +1 -0
  13. package/dist/extension/components/EditableProxy.d.ts +9 -0
  14. package/dist/extension/components/EditableProxy.d.ts.map +1 -0
  15. package/dist/extension/components/OrbitControls/OrbitControlsImpl.d.ts +69 -0
  16. package/dist/extension/components/OrbitControls/OrbitControlsImpl.d.ts.map +1 -0
  17. package/dist/extension/components/OrbitControls/index.d.ts +23 -0
  18. package/dist/extension/components/OrbitControls/index.d.ts.map +1 -0
  19. package/dist/extension/components/ProxyManager.d.ts +9 -0
  20. package/dist/extension/components/ProxyManager.d.ts.map +1 -0
  21. package/dist/extension/components/ReferenceWindow/ReferenceWindow.d.ts +10 -0
  22. package/dist/extension/components/ReferenceWindow/ReferenceWindow.d.ts.map +1 -0
  23. package/dist/extension/components/ReferenceWindow/noiseImage.d.ts +3 -0
  24. package/dist/extension/components/ReferenceWindow/noiseImage.d.ts.map +1 -0
  25. package/dist/extension/components/SnapshotEditor.d.ts +6 -0
  26. package/dist/extension/components/SnapshotEditor.d.ts.map +1 -0
  27. package/dist/extension/components/TransformControls.d.ts +23 -0
  28. package/dist/extension/components/TransformControls.d.ts.map +1 -0
  29. package/dist/extension/components/useRefAndState.d.ts +18 -0
  30. package/dist/extension/components/useRefAndState.d.ts.map +1 -0
  31. package/dist/extension/components/useSelected.d.ts +3 -0
  32. package/dist/extension/components/useSelected.d.ts.map +1 -0
  33. package/dist/extension/components/useSnapshotEditorCamera.d.ts +9 -0
  34. package/dist/extension/components/useSnapshotEditorCamera.d.ts.map +1 -0
  35. package/dist/extension/editorStuff.d.ts +18 -0
  36. package/dist/extension/editorStuff.d.ts.map +1 -0
  37. package/dist/extension/icons.d.ts +13 -0
  38. package/dist/extension/icons.d.ts.map +1 -0
  39. package/dist/extension/index.d.ts +4 -0
  40. package/dist/extension/index.d.ts.map +1 -0
  41. package/dist/extension/index.esm.js +33733 -0
  42. package/dist/extension/index.esm.js.map +7 -0
  43. package/dist/extension/index.js +33701 -0
  44. package/dist/extension/index.js.map +7 -0
  45. package/dist/extension/useExtensionStore.d.ts +3 -0
  46. package/dist/extension/useExtensionStore.d.ts.map +1 -0
  47. package/dist/index.d.ts +8 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.esm.js +782 -0
  50. package/dist/index.esm.js.map +7 -0
  51. package/dist/index.js +780 -0
  52. package/dist/index.js.map +7 -0
  53. package/dist/main/RafDriverProvider.d.ts +10 -0
  54. package/dist/main/RafDriverProvider.d.ts.map +1 -0
  55. package/dist/main/RefreshSnapshot.d.ts +19 -0
  56. package/dist/main/RefreshSnapshot.d.ts.map +1 -0
  57. package/dist/main/SheetProvider.d.ts +10 -0
  58. package/dist/main/SheetProvider.d.ts.map +1 -0
  59. package/dist/main/defaultEditableFactoryConfig.d.ts +579 -0
  60. package/dist/main/defaultEditableFactoryConfig.d.ts.map +1 -0
  61. package/dist/main/editable.d.ts +118 -0
  62. package/dist/main/editable.d.ts.map +1 -0
  63. package/dist/main/editableFactoryConfigUtils.d.ts +59 -0
  64. package/dist/main/editableFactoryConfigUtils.d.ts.map +1 -0
  65. package/dist/main/store.d.ts +46 -0
  66. package/dist/main/store.d.ts.map +1 -0
  67. package/dist/main/useInvalidate.d.ts +2 -0
  68. package/dist/main/useInvalidate.d.ts.map +1 -0
  69. package/dist/main/utils.d.ts +4 -0
  70. package/dist/main/utils.d.ts.map +1 -0
  71. package/dist/types.d.ts +3 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/package.json +86 -0
package/dist/index.js ADDED
@@ -0,0 +1,780 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __objRest = (source, exclude) => {
26
+ var target = {};
27
+ for (var prop in source)
28
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
29
+ target[prop] = source[prop];
30
+ if (source != null && __getOwnPropSymbols)
31
+ for (var prop of __getOwnPropSymbols(source)) {
32
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
33
+ target[prop] = source[prop];
34
+ }
35
+ return target;
36
+ };
37
+ var __commonJS = (cb, mod) => function __require() {
38
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
39
+ };
40
+ var __export = (target, all) => {
41
+ for (var name in all)
42
+ __defProp(target, name, { get: all[name], enumerable: true });
43
+ };
44
+ var __copyProps = (to, from, except, desc) => {
45
+ if (from && typeof from === "object" || typeof from === "function") {
46
+ for (let key of __getOwnPropNames(from))
47
+ if (!__hasOwnProp.call(to, key) && key !== except)
48
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
49
+ }
50
+ return to;
51
+ };
52
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
53
+ // If the importer is in node compatibility mode or this is not an ESM
54
+ // file that has been converted to a CommonJS file using a Babel-
55
+ // compatible transform (i.e. "__esModule" has not been set), then set
56
+ // "default" to the CommonJS "module.exports" for node compatibility.
57
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
58
+ mod
59
+ ));
60
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
61
+
62
+ // ../../node_modules/zustand/vanilla.js
63
+ var require_vanilla = __commonJS({
64
+ "../../node_modules/zustand/vanilla.js"(exports) {
65
+ "use strict";
66
+ Object.defineProperty(exports, "__esModule", { value: true });
67
+ function create2(createState) {
68
+ var state;
69
+ var listeners = /* @__PURE__ */ new Set();
70
+ var setState = function setState2(partial, replace) {
71
+ var nextState = typeof partial === "function" ? partial(state) : partial;
72
+ if (nextState !== state) {
73
+ var _previousState = state;
74
+ state = replace ? nextState : Object.assign({}, state, nextState);
75
+ listeners.forEach(function(listener) {
76
+ return listener(state, _previousState);
77
+ });
78
+ }
79
+ };
80
+ var getState = function getState2() {
81
+ return state;
82
+ };
83
+ var subscribeWithSelector = function subscribeWithSelector2(listener, selector, equalityFn) {
84
+ if (selector === void 0) {
85
+ selector = getState;
86
+ }
87
+ if (equalityFn === void 0) {
88
+ equalityFn = Object.is;
89
+ }
90
+ var currentSlice = selector(state);
91
+ function listenerToAdd() {
92
+ var nextSlice = selector(state);
93
+ if (!equalityFn(currentSlice, nextSlice)) {
94
+ var _previousSlice = currentSlice;
95
+ listener(currentSlice = nextSlice, _previousSlice);
96
+ }
97
+ }
98
+ listeners.add(listenerToAdd);
99
+ return function() {
100
+ return listeners.delete(listenerToAdd);
101
+ };
102
+ };
103
+ var subscribe = function subscribe2(listener, selector, equalityFn) {
104
+ if (selector || equalityFn) {
105
+ return subscribeWithSelector(listener, selector, equalityFn);
106
+ }
107
+ listeners.add(listener);
108
+ return function() {
109
+ return listeners.delete(listener);
110
+ };
111
+ };
112
+ var destroy = function destroy2() {
113
+ return listeners.clear();
114
+ };
115
+ var api = {
116
+ setState,
117
+ getState,
118
+ subscribe,
119
+ destroy
120
+ };
121
+ state = createState(setState, getState, api);
122
+ return api;
123
+ }
124
+ exports.default = create2;
125
+ }
126
+ });
127
+
128
+ // src/index.ts
129
+ var src_exports = {};
130
+ __export(src_exports, {
131
+ OrthographicCamera: () => OrthographicCamera,
132
+ PerspectiveCamera: () => PerspectiveCamera,
133
+ RafDriverProvider: () => RafDriverProvider_default,
134
+ RefreshSnapshot: () => RefreshSnapshot_default,
135
+ SheetProvider: () => SheetProvider_default,
136
+ ____private_editorStore: () => editorStore,
137
+ __private_allRegisteredObjects: () => allRegisteredObjects,
138
+ __private_makeStoreKey: () => makeStoreKey,
139
+ editable: () => editable_default,
140
+ refreshSnapshot: () => refreshSnapshot,
141
+ useCurrentRafDriver: () => useCurrentRafDriver,
142
+ useCurrentSheet: () => useCurrentSheet
143
+ });
144
+ module.exports = __toCommonJS(src_exports);
145
+
146
+ // src/main/editable.tsx
147
+ var import_react3 = require("react");
148
+ var import_react4 = __toESM(require("react"));
149
+
150
+ // src/main/store.ts
151
+ var import_vanilla = __toESM(require_vanilla());
152
+ var import_three = require("three");
153
+ var allRegisteredObjects = /* @__PURE__ */ new WeakSet();
154
+ var config = (set, get) => {
155
+ return {
156
+ sheet: null,
157
+ editorObject: null,
158
+ scene: null,
159
+ gl: null,
160
+ helpersRoot: new import_three.Group(),
161
+ editables: {},
162
+ canvasName: "default",
163
+ sceneSnapshot: null,
164
+ editablesSnapshot: null,
165
+ initialEditorCamera: {},
166
+ init: (scene, gl) => {
167
+ set({
168
+ scene,
169
+ gl
170
+ });
171
+ get().createSnapshot();
172
+ },
173
+ addEditable: (theatreKey, editable2) => {
174
+ set((state) => ({
175
+ editables: __spreadProps(__spreadValues({}, state.editables), {
176
+ [theatreKey]: editable2
177
+ })
178
+ }));
179
+ },
180
+ removeEditable: (theatreKey) => {
181
+ set((state) => {
182
+ const editables = __spreadValues({}, state.editables);
183
+ delete editables[theatreKey];
184
+ return {
185
+ editables
186
+ };
187
+ });
188
+ },
189
+ createSnapshot: () => {
190
+ set((state) => {
191
+ var _a, _b;
192
+ return {
193
+ sceneSnapshot: (_b = (_a = state.scene) == null ? void 0 : _a.clone()) != null ? _b : null,
194
+ editablesSnapshot: state.editables
195
+ };
196
+ });
197
+ },
198
+ setSnapshotProxyObject: (proxyObject, theatreKey) => {
199
+ set((state) => ({
200
+ editablesSnapshot: __spreadProps(__spreadValues({}, state.editablesSnapshot), {
201
+ [theatreKey]: __spreadProps(__spreadValues({}, state.editablesSnapshot[theatreKey]), {
202
+ proxyObject
203
+ })
204
+ })
205
+ }));
206
+ }
207
+ };
208
+ };
209
+ var editorStore = (0, import_vanilla.default)(config);
210
+ var bindToCanvas = ({ gl, scene }) => {
211
+ const init = editorStore.getState().init;
212
+ init(scene, gl);
213
+ };
214
+
215
+ // ../../node_modules/react-merge-refs/dist/index.mjs
216
+ function o(f) {
217
+ return (r) => {
218
+ f.forEach((n) => {
219
+ typeof n == "function" ? n(r) : n != null && (n.current = r);
220
+ });
221
+ };
222
+ }
223
+
224
+ // src/main/useInvalidate.ts
225
+ var import_fiber = require("@react-three/fiber");
226
+ function useInvalidate() {
227
+ return (0, import_fiber.useThree)(({ invalidate }) => invalidate);
228
+ }
229
+
230
+ // src/main/SheetProvider.tsx
231
+ var import_react = __toESM(require("react"));
232
+ var import_fiber2 = require("@react-three/fiber");
233
+ var ctx = (0, import_react.createContext)(void 0);
234
+ var useWrapperContext = () => {
235
+ const val = (0, import_react.useContext)(ctx);
236
+ if (!val) {
237
+ throw new Error(
238
+ `No sheet found. You need to add a <SheetProvider> higher up in the tree. https://docs.theatrejs.com/r3f.html#sheetprovider`
239
+ );
240
+ }
241
+ return val;
242
+ };
243
+ var useCurrentSheet = () => {
244
+ return useWrapperContext().sheet;
245
+ };
246
+ var SheetProvider = ({ sheet, children }) => {
247
+ const { scene, gl } = (0, import_fiber2.useThree)((s) => ({ scene: s.scene, gl: s.gl }));
248
+ (0, import_react.useEffect)(() => {
249
+ if (!sheet || sheet.type !== "Theatre_Sheet_PublicAPI") {
250
+ throw new Error(`sheet in <Wrapper sheet={sheet}> has an invalid value`);
251
+ }
252
+ }, [sheet]);
253
+ (0, import_react.useLayoutEffect)(() => {
254
+ bindToCanvas({ gl, scene });
255
+ }, [scene, gl]);
256
+ return /* @__PURE__ */ import_react.default.createElement(ctx.Provider, { value: { sheet } }, children);
257
+ };
258
+ var SheetProvider_default = SheetProvider;
259
+
260
+ // src/main/editableFactoryConfigUtils.ts
261
+ var import_core = require("@encorejs/core");
262
+ var import_core2 = require("@encorejs/core");
263
+ var import_three2 = require("three");
264
+ function isNumber(value) {
265
+ return typeof value === "number" && isFinite(value);
266
+ }
267
+ function isVectorObject(value) {
268
+ return ["x", "y", "z"].every((axis) => isNumber(value[axis]));
269
+ }
270
+ var createVector = (components) => {
271
+ return components ? { x: components[0], y: components[1], z: components[2] } : {
272
+ x: 0,
273
+ y: 0,
274
+ z: 0
275
+ };
276
+ };
277
+ var createVectorPropConfig = (key, defaultValue = createVector(), { nudgeMultiplier = 0.01 } = {}) => ({
278
+ parse: (props) => {
279
+ const propValue = props[key];
280
+ const vector = !propValue ? defaultValue : (
281
+ // if prop is an array
282
+ Array.isArray(propValue) ? createVector(propValue) : (
283
+ // if prop is a scalar
284
+ isNumber(propValue) ? {
285
+ x: propValue,
286
+ y: propValue,
287
+ z: propValue
288
+ } : (
289
+ // if prop is a threejs Vector3
290
+ isVectorObject(propValue) ? {
291
+ x: propValue.x,
292
+ y: propValue.y,
293
+ z: propValue.z
294
+ } : (
295
+ // show a warning and return defaultValue
296
+ (import_core.notify.warning(
297
+ `Invalid value for vector prop "${key}"`,
298
+ `Couldn't make sense of \`${key}={${JSON.stringify(
299
+ propValue
300
+ )}}\`, falling back to \`${key}={${JSON.stringify([
301
+ defaultValue.x,
302
+ defaultValue.y,
303
+ defaultValue.z
304
+ ])}}\`.
305
+
306
+ To fix this, make sure the prop is set to either a number, an array of numbers, or a three.js Vector3 object.`
307
+ ), defaultValue)
308
+ )
309
+ )
310
+ )
311
+ );
312
+ ["x", "y", "z"].forEach((axis) => {
313
+ if (props[`${key}-${axis}`])
314
+ vector[axis] = props[`${key}-${axis}`];
315
+ });
316
+ return vector;
317
+ },
318
+ apply: (value, object) => {
319
+ object[key].set(value.x, value.y, value.z);
320
+ },
321
+ type: {
322
+ [key]: {
323
+ x: import_core2.types.number(defaultValue.x, { nudgeMultiplier }),
324
+ y: import_core2.types.number(defaultValue.y, { nudgeMultiplier }),
325
+ z: import_core2.types.number(defaultValue.z, { nudgeMultiplier })
326
+ }
327
+ }
328
+ });
329
+ var createNumberPropConfig = (key, defaultValue = 0, { nudgeMultiplier = 0.01 } = {}) => ({
330
+ parse: (props) => {
331
+ var _a;
332
+ return (_a = props[key]) != null ? _a : defaultValue;
333
+ },
334
+ apply: (value, object) => {
335
+ object[key] = value;
336
+ },
337
+ type: {
338
+ [key]: import_core2.types.number(defaultValue, { nudgeMultiplier })
339
+ }
340
+ });
341
+ var createColorPropConfig = (key, defaultValue = new import_three2.Color(0, 0, 0)) => ({
342
+ parse: (props) => {
343
+ var _a;
344
+ return __spreadProps(__spreadValues({}, (_a = props[key]) != null ? _a : defaultValue), { a: 1 });
345
+ },
346
+ apply: (value, object) => {
347
+ object[key].setRGB(value.r, value.g, value.b);
348
+ },
349
+ type: {
350
+ [key]: import_core2.types.rgba(__spreadProps(__spreadValues({}, defaultValue), { a: 1 }))
351
+ }
352
+ });
353
+ var extendObjectProps = (objectConfig, extension) => __spreadProps(__spreadValues({}, objectConfig), {
354
+ props: __spreadValues(__spreadValues({}, objectConfig.props), extension)
355
+ });
356
+
357
+ // src/main/defaultEditableFactoryConfig.ts
358
+ var import_three3 = require("three");
359
+ var baseObjectConfig = {
360
+ props: {
361
+ position: createVectorPropConfig("position"),
362
+ rotation: createVectorPropConfig("rotation"),
363
+ scale: createVectorPropConfig("scale", createVector([1, 1, 1]))
364
+ },
365
+ useTransformControls: true,
366
+ icon: "cube",
367
+ createHelper: (object) => new import_three3.BoxHelper(object, selectionColor)
368
+ };
369
+ var baseLightConfig = __spreadProps(__spreadValues({}, extendObjectProps(baseObjectConfig, {
370
+ intensity: createNumberPropConfig("intensity", 1),
371
+ distance: createNumberPropConfig("distance"),
372
+ decay: createNumberPropConfig("decay"),
373
+ color: createColorPropConfig("color", new import_three3.Color("white"))
374
+ })), {
375
+ dimensionless: true
376
+ });
377
+ var baseCameraConfig = __spreadProps(__spreadValues({}, extendObjectProps(baseObjectConfig, {
378
+ near: createNumberPropConfig("near", 0.1, { nudgeMultiplier: 0.1 }),
379
+ far: createNumberPropConfig("far", 2e3, { nudgeMultiplier: 0.1 })
380
+ })), {
381
+ updateObject: (camera) => {
382
+ camera.updateProjectionMatrix();
383
+ },
384
+ icon: "camera",
385
+ dimensionless: true,
386
+ createHelper: (camera) => new import_three3.CameraHelper(camera)
387
+ });
388
+ var selectionColor = "#40AAA4";
389
+ var defaultEditableFactoryConfig = {
390
+ group: __spreadProps(__spreadValues({}, baseObjectConfig), {
391
+ icon: "collection",
392
+ createHelper: (object) => new import_three3.BoxHelper(object, selectionColor)
393
+ }),
394
+ mesh: __spreadProps(__spreadValues({}, baseObjectConfig), {
395
+ icon: "cube",
396
+ createHelper: (object) => new import_three3.BoxHelper(object, selectionColor)
397
+ }),
398
+ spotLight: __spreadProps(__spreadValues({}, extendObjectProps(baseLightConfig, {
399
+ angle: createNumberPropConfig("angle", 0, { nudgeMultiplier: 1e-3 }),
400
+ penumbra: createNumberPropConfig("penumbra", 0, { nudgeMultiplier: 1e-3 })
401
+ })), {
402
+ icon: "spotLight",
403
+ createHelper: (light) => new import_three3.SpotLightHelper(light, selectionColor)
404
+ }),
405
+ directionalLight: __spreadProps(__spreadValues({}, extendObjectProps(baseObjectConfig, {
406
+ intensity: createNumberPropConfig("intensity", 1),
407
+ color: createColorPropConfig("color", new import_three3.Color("white"))
408
+ })), {
409
+ icon: "sun",
410
+ dimensionless: true,
411
+ createHelper: (light) => new import_three3.DirectionalLightHelper(light, 1, selectionColor)
412
+ }),
413
+ pointLight: __spreadProps(__spreadValues({}, baseLightConfig), {
414
+ icon: "lightBulb",
415
+ createHelper: (light) => new import_three3.PointLightHelper(light, 1, selectionColor)
416
+ }),
417
+ ambientLight: {
418
+ props: {
419
+ intensity: createNumberPropConfig("intensity", 1),
420
+ color: createColorPropConfig("color", new import_three3.Color("white"))
421
+ },
422
+ useTransformControls: false,
423
+ icon: "lightBulb"
424
+ },
425
+ hemisphereLight: {
426
+ props: {
427
+ intensity: createNumberPropConfig("intensity", 1),
428
+ color: createColorPropConfig("color", new import_three3.Color("white")),
429
+ groundColor: createColorPropConfig("groundColor", new import_three3.Color("white"))
430
+ },
431
+ useTransformControls: false,
432
+ icon: "lightBulb"
433
+ },
434
+ perspectiveCamera: extendObjectProps(baseCameraConfig, {
435
+ fov: createNumberPropConfig("fov", 50, { nudgeMultiplier: 0.1 }),
436
+ zoom: createNumberPropConfig("zoom", 1)
437
+ }),
438
+ orthographicCamera: baseCameraConfig,
439
+ points: baseObjectConfig,
440
+ // R3F v9 renamed the `<line>` intrinsic to `<threeLine>` (avoids clashing
441
+ // with the SVG `<line>` element), so the editable key must follow suit.
442
+ threeLine: baseObjectConfig,
443
+ lineLoop: baseObjectConfig,
444
+ lineSegments: baseObjectConfig,
445
+ fog: {
446
+ props: {
447
+ color: createColorPropConfig("color"),
448
+ near: createNumberPropConfig("near", 1, { nudgeMultiplier: 0.1 }),
449
+ far: createNumberPropConfig("far", 1e3, { nudgeMultiplier: 0.1 })
450
+ },
451
+ useTransformControls: false,
452
+ icon: "cloud"
453
+ }
454
+ };
455
+ var defaultEditableFactoryConfig_default = defaultEditableFactoryConfig;
456
+
457
+ // src/main/utils.ts
458
+ var refreshSnapshot = editorStore.getState().createSnapshot;
459
+ var makeStoreKey = (sheetObjectAddress) => `${sheetObjectAddress.sheetId}:${sheetObjectAddress.sheetInstanceId}:${sheetObjectAddress.objectKey}`;
460
+
461
+ // src/main/editable.tsx
462
+ var import_core3 = require("@encorejs/core");
463
+
464
+ // src/main/RafDriverProvider.tsx
465
+ var import_react2 = __toESM(require("react"));
466
+ var ctx2 = (0, import_react2.createContext)(void 0);
467
+ var useCurrentRafDriver = () => {
468
+ var _a;
469
+ return (_a = (0, import_react2.useContext)(ctx2)) == null ? void 0 : _a.rafDriver;
470
+ };
471
+ var RafDriverProvider = ({ driver, children }) => {
472
+ (0, import_react2.useEffect)(() => {
473
+ if (!driver || driver.type !== "Theatre_RafDriver_PublicAPI") {
474
+ throw new Error(
475
+ `driver in <RafDriverProvider deriver={driver}> has an invalid value`
476
+ );
477
+ }
478
+ }, [driver]);
479
+ return /* @__PURE__ */ import_react2.default.createElement(ctx2.Provider, { value: { rafDriver: driver } }, children);
480
+ };
481
+ var RafDriverProvider_default = RafDriverProvider;
482
+
483
+ // src/main/editable.tsx
484
+ var createEditable = (config2) => {
485
+ const editable2 = (Component, type) => {
486
+ if (Component !== "primitive" && !type) {
487
+ throw new Error(
488
+ `You must provide the type of the component you're creating an editable for. For example: editable(MyComponent, 'mesh').`
489
+ );
490
+ }
491
+ return (0, import_react4.forwardRef)(
492
+ (_a, ref) => {
493
+ var _b = _a, {
494
+ theatreKey,
495
+ visible,
496
+ editableType,
497
+ additionalProps,
498
+ objRef
499
+ } = _b, props = __objRest(_b, [
500
+ "theatreKey",
501
+ "visible",
502
+ "editableType",
503
+ "additionalProps",
504
+ "objRef"
505
+ ]);
506
+ if (typeof theatreKey !== "string") {
507
+ throw new Error(
508
+ `No valid theatreKey was provided to the editable component. theatreKey must be a string. Received: ${theatreKey}`
509
+ );
510
+ }
511
+ if (Component === "primitive" && !editableType) {
512
+ throw new Error(
513
+ `When using the primitive component, you must provide the editableType prop. Received: ${editableType}`
514
+ );
515
+ }
516
+ const actualType = type != null ? type : editableType;
517
+ const objectRef = (0, import_react4.useRef)(void 0);
518
+ const sheet = useCurrentSheet();
519
+ const rafDriver = useCurrentRafDriver();
520
+ const [sheetObject, setSheetObject] = (0, import_react3.useState)(void 0);
521
+ const storeKey = (0, import_react3.useMemo)(
522
+ () => makeStoreKey(__spreadProps(__spreadValues({}, sheet.address), {
523
+ objectKey: theatreKey
524
+ })),
525
+ [sheet, theatreKey]
526
+ );
527
+ const invalidate = useInvalidate();
528
+ (0, import_react4.useEffect)(() => {
529
+ if (Component === "perspectiveCamera" || Component === "orthographicCamera") {
530
+ const dreiComponent = Component.charAt(0).toUpperCase() + Component.slice(1);
531
+ import_core3.notify.warning(
532
+ `Possibly incorrect use of <e.${Component} />`,
533
+ `You seem to have declared the camera "${theatreKey}" simply as \`<e.${Component} ... />\`. This alone won't make r3f use it for rendering.
534
+
535
+ The easiest way to create a custom animatable \`${dreiComponent}\` is to import it from \`@react-three/drei\`, and make it editable.
536
+ \`\`\`
537
+ import {${dreiComponent}} from '@react-three/drei'
538
+
539
+ const EditableCamera =
540
+ editable(${dreiComponent}, '${Component}')
541
+ \`\`\`
542
+ Then you can use it in your JSX like any other editable component. Note the makeDefault prop exposed by drei, which makes r3f use it for rendering.
543
+ \`\`\`
544
+ <EditableCamera
545
+ theatreKey="${theatreKey}"
546
+ makeDefault
547
+ >
548
+ \`\`\`
549
+ `
550
+ );
551
+ }
552
+ }, [Component, theatreKey]);
553
+ (0, import_react4.useLayoutEffect)(() => {
554
+ if (!sheet)
555
+ return;
556
+ if (sheetObject) {
557
+ sheet.object(
558
+ theatreKey,
559
+ Object.assign(
560
+ __spreadValues({}, additionalProps),
561
+ ...Object.values(config2[actualType].props).map(
562
+ // @ts-ignore
563
+ (value) => value.type
564
+ )
565
+ ),
566
+ { reconfigure: true }
567
+ );
568
+ return;
569
+ } else {
570
+ const sheetObject2 = sheet.object(
571
+ theatreKey,
572
+ Object.assign(
573
+ __spreadValues({}, additionalProps),
574
+ ...Object.values(config2[actualType].props).map(
575
+ // @ts-ignore
576
+ (value) => value.type
577
+ )
578
+ )
579
+ );
580
+ allRegisteredObjects.add(sheetObject2);
581
+ setSheetObject(sheetObject2);
582
+ if (objRef)
583
+ typeof objRef === "function" ? objRef(sheetObject2) : objRef.current = sheetObject2;
584
+ editorStore.getState().addEditable(storeKey, {
585
+ type: actualType,
586
+ sheetObject: sheetObject2,
587
+ visibleOnlyInEditor: visible === "editor",
588
+ // @ts-ignore
589
+ objectConfig: config2[actualType]
590
+ });
591
+ }
592
+ }, [sheet, storeKey, additionalProps]);
593
+ (0, import_react4.useLayoutEffect)(() => {
594
+ if (!sheetObject)
595
+ return;
596
+ sheetObject.initialValue = Object.fromEntries(
597
+ // @ts-ignore
598
+ Object.entries(config2[actualType].props).map(
599
+ // @ts-ignore
600
+ ([key, value]) => [key, value.parse(props)]
601
+ )
602
+ );
603
+ }, [
604
+ sheetObject,
605
+ // @ts-ignore
606
+ ...Object.keys(config2[actualType].props).map(
607
+ // @ts-ignore
608
+ (key) => props[key]
609
+ )
610
+ ]);
611
+ (0, import_react4.useLayoutEffect)(() => {
612
+ if (!sheetObject)
613
+ return;
614
+ const object = objectRef.current;
615
+ const setFromTheatre = (newValues) => {
616
+ var _a2, _b2;
617
+ Object.entries(config2[actualType].props).forEach(
618
+ // @ts-ignore
619
+ ([key, value]) => value.apply(newValues[key], object)
620
+ );
621
+ (_b2 = (_a2 = config2[actualType]).updateObject) == null ? void 0 : _b2.call(_a2, object);
622
+ invalidate();
623
+ };
624
+ setFromTheatre(sheetObject.value);
625
+ const unsubscribe = sheetObject.onValuesChange(
626
+ setFromTheatre,
627
+ rafDriver
628
+ );
629
+ return () => {
630
+ unsubscribe();
631
+ sheetObject.sheet.detachObject(theatreKey);
632
+ allRegisteredObjects.delete(sheetObject);
633
+ editorStore.getState().removeEditable(storeKey);
634
+ };
635
+ }, [sheetObject, rafDriver]);
636
+ return (
637
+ // @ts-ignore
638
+ /* @__PURE__ */ import_react4.default.createElement(
639
+ Component,
640
+ __spreadProps(__spreadValues({
641
+ ref: o([objectRef, ref])
642
+ }, props), {
643
+ visible: visible !== "editor" && visible,
644
+ userData: {
645
+ __editable: true,
646
+ __storeKey: storeKey
647
+ }
648
+ })
649
+ )
650
+ );
651
+ }
652
+ );
653
+ };
654
+ const extensions = __spreadProps(__spreadValues({}, Object.fromEntries(
655
+ Object.keys(config2).map((key) => [
656
+ key,
657
+ // @ts-ignore
658
+ editable2(key, key)
659
+ ])
660
+ )), {
661
+ primitive: editable2("primitive", null)
662
+ });
663
+ return Object.assign(editable2, extensions);
664
+ };
665
+ var editable = createEditable(
666
+ defaultEditableFactoryConfig_default
667
+ );
668
+ var editable_default = editable;
669
+
670
+ // src/main/RefreshSnapshot.tsx
671
+ var import_react5 = __toESM(require("react"));
672
+ var RefreshSnapshot = () => {
673
+ (0, import_react5.useEffect)(() => {
674
+ setTimeout(() => {
675
+ refreshSnapshot();
676
+ });
677
+ }, []);
678
+ return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null);
679
+ };
680
+ var RefreshSnapshot_default = RefreshSnapshot;
681
+
682
+ // src/drei/PerspectiveCamera.tsx
683
+ var React5 = __toESM(require("react"));
684
+ var import_fiber3 = require("@react-three/fiber");
685
+ var import_three4 = require("three");
686
+ var PerspectiveCamera = editable_default(
687
+ React5.forwardRef(
688
+ (_a, ref) => {
689
+ var _b = _a, { makeDefault, lookAt } = _b, props = __objRest(_b, ["makeDefault", "lookAt"]);
690
+ const set = (0, import_fiber3.useThree)(({ set: set2 }) => set2);
691
+ const camera = (0, import_fiber3.useThree)(({ camera: camera2 }) => camera2);
692
+ const size = (0, import_fiber3.useThree)(({ size: size2 }) => size2);
693
+ const cameraRef = React5.useRef(null);
694
+ React5.useLayoutEffect(() => {
695
+ if (!props.manual) {
696
+ cameraRef.current.aspect = size.width / size.height;
697
+ }
698
+ }, [size, props]);
699
+ React5.useLayoutEffect(() => {
700
+ cameraRef.current.updateProjectionMatrix();
701
+ });
702
+ React5.useLayoutEffect(() => {
703
+ if (makeDefault) {
704
+ const oldCam = camera;
705
+ set(() => ({ camera: cameraRef.current }));
706
+ return () => set(() => ({ camera: oldCam }));
707
+ }
708
+ }, [cameraRef, makeDefault, set]);
709
+ (0, import_fiber3.useFrame)(() => {
710
+ var _a2;
711
+ if (lookAt && cameraRef.current) {
712
+ cameraRef.current.lookAt(
713
+ Array.isArray(lookAt) ? new import_three4.Vector3(...lookAt) : lookAt.current ? lookAt.current.position : lookAt
714
+ );
715
+ const snapshot = editorStore.getState().editablesSnapshot;
716
+ if (snapshot) {
717
+ (_a2 = snapshot[cameraRef.current.userData.__storeKey].proxyObject) == null ? void 0 : _a2.rotation.copy(cameraRef.current.rotation);
718
+ }
719
+ }
720
+ });
721
+ return /* @__PURE__ */ React5.createElement("perspectiveCamera", __spreadValues({ ref: o([cameraRef, ref]) }, props));
722
+ }
723
+ ),
724
+ "perspectiveCamera"
725
+ );
726
+
727
+ // src/drei/OrthographicCamera.tsx
728
+ var React6 = __toESM(require("react"));
729
+ var import_fiber4 = require("@react-three/fiber");
730
+ var import_three5 = require("three");
731
+ var OrthographicCamera = editable_default(
732
+ React6.forwardRef(
733
+ (_a, ref) => {
734
+ var _b = _a, { makeDefault, lookAt } = _b, props = __objRest(_b, ["makeDefault", "lookAt"]);
735
+ const set = (0, import_fiber4.useThree)(({ set: set2 }) => set2);
736
+ const camera = (0, import_fiber4.useThree)(({ camera: camera2 }) => camera2);
737
+ const size = (0, import_fiber4.useThree)(({ size: size2 }) => size2);
738
+ const cameraRef = React6.useRef(null);
739
+ React6.useLayoutEffect(() => {
740
+ if (!props.manual) {
741
+ cameraRef.current.updateProjectionMatrix();
742
+ }
743
+ }, [size, props]);
744
+ React6.useLayoutEffect(() => {
745
+ cameraRef.current.updateProjectionMatrix();
746
+ });
747
+ React6.useLayoutEffect(() => {
748
+ if (makeDefault) {
749
+ const oldCam = camera;
750
+ set(() => ({ camera: cameraRef.current }));
751
+ return () => set(() => ({ camera: oldCam }));
752
+ }
753
+ }, [cameraRef, makeDefault, set]);
754
+ (0, import_fiber4.useFrame)(() => {
755
+ var _a2;
756
+ if (lookAt && cameraRef.current) {
757
+ cameraRef.current.lookAt(
758
+ Array.isArray(lookAt) ? new import_three5.Vector3(...lookAt) : lookAt.current ? lookAt.current.position : lookAt
759
+ );
760
+ const snapshot = editorStore.getState().editablesSnapshot;
761
+ if (snapshot) {
762
+ (_a2 = snapshot[cameraRef.current.userData.__storeKey].proxyObject) == null ? void 0 : _a2.rotation.copy(cameraRef.current.rotation);
763
+ }
764
+ }
765
+ });
766
+ return /* @__PURE__ */ React6.createElement(
767
+ "orthographicCamera",
768
+ __spreadValues({
769
+ left: size.width / -2,
770
+ right: size.width / 2,
771
+ top: size.height / 2,
772
+ bottom: size.height / -2,
773
+ ref: o([cameraRef, ref])
774
+ }, props)
775
+ );
776
+ }
777
+ ),
778
+ "orthographicCamera"
779
+ );
780
+ //# sourceMappingURL=index.js.map