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