lunchboxjs 0.1.4013 → 0.1.4016
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/README.md +14 -0
- package/dist/.DS_Store +0 -0
- package/dist/lunchboxjs.js +152 -110
- package/dist/lunchboxjs.min.js +1 -1
- package/dist/lunchboxjs.module.js +152 -111
- package/package.json +10 -5
- package/src/.DS_Store +0 -0
- package/src/components/LunchboxWrapper/LunchboxWrapper.ts +36 -3
- package/src/components/LunchboxWrapper/prepCanvas.ts +2 -2
- package/src/components/catalogue.ts +1 -1
- package/src/core/.DS_Store +0 -0
- package/src/core/createNode.ts +5 -1
- package/src/core/ensure.ts +4 -10
- package/src/core/instantiateThreeObject/processProps.ts +23 -6
- package/src/core/interaction/input.ts +1 -1
- package/src/core/interaction/setupAutoRaycaster.ts +12 -2
- package/src/core/update.ts +29 -3
- package/src/index.ts +12 -40
- package/src/nodeOps/remove.ts +0 -1
- package/src/types.ts +4 -0
package/README.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
1
|
Custom Vue 3 renderer for ThreeJS.
|
|
2
2
|
|
|
3
|
+
## Full Docs
|
|
4
|
+
|
|
3
5
|
[Docs](//docs.lunchboxjs.com)
|
|
6
|
+
|
|
7
|
+
## Local Dev
|
|
8
|
+
|
|
9
|
+
`npm run dev` to run dev server. From there, edit source code in `/src/...` and examples in `/demo/...` to build and test features.
|
|
10
|
+
|
|
11
|
+
### Creating Examples
|
|
12
|
+
|
|
13
|
+
Run `npm run demo:create` to create a new demo.
|
|
14
|
+
|
|
15
|
+
## Docs Dev
|
|
16
|
+
|
|
17
|
+
`npm run docs:dev` to run docs dev. Docs exist as a Vitepress site in the `/docs` folder.
|
package/dist/.DS_Store
ADDED
|
Binary file
|
package/dist/lunchboxjs.js
CHANGED
|
@@ -87,6 +87,8 @@
|
|
|
87
87
|
});
|
|
88
88
|
};
|
|
89
89
|
|
|
90
|
+
// TODO:
|
|
91
|
+
// Continue r3f prop - what else (besides camera fov) makes r3f look good?
|
|
90
92
|
/** fixed & fill styling for container */
|
|
91
93
|
const fillStyle = (position) => {
|
|
92
94
|
return {
|
|
@@ -111,11 +113,13 @@
|
|
|
111
113
|
dpr: Number,
|
|
112
114
|
ortho: Boolean,
|
|
113
115
|
orthographic: Boolean,
|
|
116
|
+
r3f: Boolean,
|
|
114
117
|
rendererArguments: Object,
|
|
115
118
|
rendererProperties: Object,
|
|
116
119
|
shadow: [Boolean, Object],
|
|
117
120
|
transparent: Boolean,
|
|
118
121
|
zoom: Number,
|
|
122
|
+
updateSource: Object,
|
|
119
123
|
},
|
|
120
124
|
setup(props, context) {
|
|
121
125
|
const canvas = vue.ref();
|
|
@@ -125,6 +129,10 @@
|
|
|
125
129
|
let renderer;
|
|
126
130
|
let camera;
|
|
127
131
|
let scene;
|
|
132
|
+
// https://threejs.org/docs/index.html#manual/en/introduction/Color-management
|
|
133
|
+
if (props.r3f && THREE__namespace?.ColorManagement) {
|
|
134
|
+
THREE__namespace.ColorManagement.legacyMode = false;
|
|
135
|
+
}
|
|
128
136
|
// MOUNT
|
|
129
137
|
// ====================
|
|
130
138
|
vue.onMounted(() => {
|
|
@@ -145,6 +153,9 @@
|
|
|
145
153
|
alpha: props.transparent,
|
|
146
154
|
antialias: true,
|
|
147
155
|
canvas: canvas.value.domElement,
|
|
156
|
+
powerPreference: !!props.r3f
|
|
157
|
+
? 'high-performance'
|
|
158
|
+
: 'default',
|
|
148
159
|
...(props.rendererArguments ?? {}),
|
|
149
160
|
};
|
|
150
161
|
// create new renderer
|
|
@@ -158,6 +169,15 @@
|
|
|
158
169
|
// we've initialized the renderer, so anything depending on it can execute now
|
|
159
170
|
rendererReady.value = true;
|
|
160
171
|
const rendererAsWebGlRenderer = ensureRenderer;
|
|
172
|
+
// apply r3f settings if desired
|
|
173
|
+
if (props.r3f) {
|
|
174
|
+
if (rendererAsWebGlRenderer.value.instance) {
|
|
175
|
+
rendererAsWebGlRenderer.value.instance.outputEncoding =
|
|
176
|
+
THREE__namespace.sRGBEncoding;
|
|
177
|
+
rendererAsWebGlRenderer.value.instance.toneMapping =
|
|
178
|
+
THREE__namespace.ACESFilmicToneMapping;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
161
181
|
// update render sugar
|
|
162
182
|
const sugar = {
|
|
163
183
|
shadow: props.shadow,
|
|
@@ -205,7 +225,12 @@
|
|
|
205
225
|
else {
|
|
206
226
|
ensuredCamera.value = createNode({
|
|
207
227
|
props: {
|
|
208
|
-
args: props.cameraArgs ?? [
|
|
228
|
+
args: props.cameraArgs ?? [
|
|
229
|
+
props.r3f ? 75 : 45,
|
|
230
|
+
0.5625,
|
|
231
|
+
1,
|
|
232
|
+
1000,
|
|
233
|
+
],
|
|
209
234
|
},
|
|
210
235
|
type: 'PerspectiveCamera',
|
|
211
236
|
uuid: fallbackCameraUuid,
|
|
@@ -238,7 +263,7 @@
|
|
|
238
263
|
scene = ensuredScene.value;
|
|
239
264
|
// set background color
|
|
240
265
|
if (scene && scene.instance && props.background) {
|
|
241
|
-
scene.instance.background = new
|
|
266
|
+
scene.instance.background = new THREE__namespace.Color(props.background);
|
|
242
267
|
}
|
|
243
268
|
// MISC PROPERTIES
|
|
244
269
|
// ====================
|
|
@@ -274,12 +299,14 @@
|
|
|
274
299
|
camera: camera.instance,
|
|
275
300
|
renderer: renderer.instance,
|
|
276
301
|
scene: scene.instance,
|
|
302
|
+
updateSource: props.updateSource,
|
|
277
303
|
});
|
|
278
304
|
});
|
|
279
305
|
// UNMOUNT
|
|
280
306
|
// ====================
|
|
281
307
|
vue.onBeforeUnmount(() => {
|
|
282
308
|
cancelUpdate();
|
|
309
|
+
cancelUpdateSource();
|
|
283
310
|
});
|
|
284
311
|
// RENDER FUNCTION
|
|
285
312
|
// ====================
|
|
@@ -544,76 +571,6 @@
|
|
|
544
571
|
return node.isLunchboxRootNode;
|
|
545
572
|
};
|
|
546
573
|
|
|
547
|
-
/** Create a new Lunchbox comment node. */
|
|
548
|
-
function createCommentNode(options = {}) {
|
|
549
|
-
const defaults = {
|
|
550
|
-
text: options.text ?? '',
|
|
551
|
-
};
|
|
552
|
-
return new MiniDom.RendererCommentNode({
|
|
553
|
-
...defaults,
|
|
554
|
-
...options,
|
|
555
|
-
metaType: 'commentMeta',
|
|
556
|
-
});
|
|
557
|
-
}
|
|
558
|
-
/** Create a new DOM node. */
|
|
559
|
-
function createDomNode(options = {}) {
|
|
560
|
-
const domElement = document.createElement(options.type ?? '');
|
|
561
|
-
const defaults = {
|
|
562
|
-
domElement,
|
|
563
|
-
};
|
|
564
|
-
const node = new MiniDom.RendererDomNode({
|
|
565
|
-
...defaults,
|
|
566
|
-
...options,
|
|
567
|
-
metaType: 'domMeta',
|
|
568
|
-
});
|
|
569
|
-
return node;
|
|
570
|
-
}
|
|
571
|
-
/** Create a new Lunchbox text node. */
|
|
572
|
-
function createTextNode(options = {}) {
|
|
573
|
-
const defaults = {
|
|
574
|
-
text: options.text ?? '',
|
|
575
|
-
};
|
|
576
|
-
return new MiniDom.RendererTextNode({
|
|
577
|
-
...options,
|
|
578
|
-
...defaults,
|
|
579
|
-
metaType: 'textMeta',
|
|
580
|
-
});
|
|
581
|
-
}
|
|
582
|
-
/** Create a new Lunchbox standard node. */
|
|
583
|
-
function createNode(options = {}, props = {}) {
|
|
584
|
-
const defaults = {
|
|
585
|
-
attached: options.attached ?? [],
|
|
586
|
-
attachedArray: options.attachedArray ?? {},
|
|
587
|
-
instance: options.instance ?? null,
|
|
588
|
-
};
|
|
589
|
-
const node = new MiniDom.RendererStandardNode({
|
|
590
|
-
...options,
|
|
591
|
-
...defaults,
|
|
592
|
-
metaType: 'standardMeta',
|
|
593
|
-
});
|
|
594
|
-
if (node.type && !isLunchboxRootNode(node) && !node.instance) {
|
|
595
|
-
// if (node.type.includes('Camera')) {
|
|
596
|
-
// console.log(node.type, {
|
|
597
|
-
// ...node.props,
|
|
598
|
-
// ...props,
|
|
599
|
-
// })
|
|
600
|
-
// console.trace()
|
|
601
|
-
// }
|
|
602
|
-
node.instance = instantiateThreeObject({
|
|
603
|
-
...node,
|
|
604
|
-
props: {
|
|
605
|
-
...node.props,
|
|
606
|
-
...props,
|
|
607
|
-
},
|
|
608
|
-
});
|
|
609
|
-
}
|
|
610
|
-
if (node.type === 'scene') {
|
|
611
|
-
// manually set scene override
|
|
612
|
-
ensuredScene.value = node;
|
|
613
|
-
}
|
|
614
|
-
return node;
|
|
615
|
-
}
|
|
616
|
-
|
|
617
574
|
const interactables = [];
|
|
618
575
|
const addInteractable = (target) => {
|
|
619
576
|
interactables.push(target);
|
|
@@ -695,6 +652,7 @@
|
|
|
695
652
|
let mouseUpListener;
|
|
696
653
|
const mousePos = vue.ref({ x: Infinity, y: Infinity });
|
|
697
654
|
let autoRaycasterEventsInitialized = false;
|
|
655
|
+
let frameID$1;
|
|
698
656
|
const setupAutoRaycaster = (node) => {
|
|
699
657
|
const instance = node.instance;
|
|
700
658
|
if (!instance)
|
|
@@ -727,8 +685,14 @@
|
|
|
727
685
|
renderer.instance.domElement.addEventListener('mousedown', mouseDownListener);
|
|
728
686
|
renderer.instance.domElement.addEventListener('mouseup', mouseUpListener);
|
|
729
687
|
// TODO: add touch events
|
|
730
|
-
//
|
|
731
|
-
|
|
688
|
+
// process mouse events asynchronously, whenever the mouse state changes
|
|
689
|
+
vue.watch(() => [inputActive.value, mousePos.value.x, mousePos.value.y], () => {
|
|
690
|
+
if (frameID$1)
|
|
691
|
+
cancelAnimationFrame(frameID$1);
|
|
692
|
+
frameID$1 = requestAnimationFrame(() => {
|
|
693
|
+
autoRaycasterBeforeRender();
|
|
694
|
+
});
|
|
695
|
+
});
|
|
732
696
|
// mark complete
|
|
733
697
|
autoRaycasterEventsInitialized = true;
|
|
734
698
|
// cancel setup watcher
|
|
@@ -939,17 +903,10 @@
|
|
|
939
903
|
overrides[pascalType] = val;
|
|
940
904
|
},
|
|
941
905
|
});
|
|
942
|
-
// export const ensuredCamera = buildEnsured<THREE.Camera>(
|
|
943
|
-
// ['PerspectiveCamera', 'OrthographicCamera'],
|
|
944
|
-
// fallbackCameraUuid,
|
|
945
|
-
// {
|
|
946
|
-
// args: [45, 0.5625, 1, 1000],
|
|
947
|
-
// }
|
|
948
|
-
// )
|
|
949
906
|
// ENSURE RENDERER
|
|
950
907
|
// ====================
|
|
951
908
|
const fallbackRendererUuid = 'FALLBACK_RENDERER';
|
|
952
|
-
const
|
|
909
|
+
const ensuredRenderer = buildEnsured(
|
|
953
910
|
// TODO: ensure support for css/svg renderers
|
|
954
911
|
['WebGLRenderer'], //, 'CSS2DRenderer', 'CSS3DRenderer', 'SVGRenderer'],
|
|
955
912
|
fallbackRendererUuid, {});
|
|
@@ -958,7 +915,7 @@
|
|
|
958
915
|
const rendererReady = vue.ref(false);
|
|
959
916
|
const ensureRenderer = vue.computed({
|
|
960
917
|
get() {
|
|
961
|
-
return (rendererReady.value ?
|
|
918
|
+
return (rendererReady.value ? ensuredRenderer.value : null);
|
|
962
919
|
},
|
|
963
920
|
set(val) {
|
|
964
921
|
const t = val.type ?? '';
|
|
@@ -975,6 +932,80 @@
|
|
|
975
932
|
// `unknown` is intentional here - we need to typecast the node since Raycaster isn't an Object3D
|
|
976
933
|
const ensuredRaycaster = buildEnsured('Raycaster', autoRaycasterUuid, {}, (node) => setupAutoRaycaster(node));
|
|
977
934
|
|
|
935
|
+
/** Create a new Lunchbox comment node. */
|
|
936
|
+
function createCommentNode(options = {}) {
|
|
937
|
+
const defaults = {
|
|
938
|
+
text: options.text ?? '',
|
|
939
|
+
};
|
|
940
|
+
return new MiniDom.RendererCommentNode({
|
|
941
|
+
...defaults,
|
|
942
|
+
...options,
|
|
943
|
+
metaType: 'commentMeta',
|
|
944
|
+
});
|
|
945
|
+
}
|
|
946
|
+
/** Create a new DOM node. */
|
|
947
|
+
function createDomNode(options = {}) {
|
|
948
|
+
const domElement = document.createElement(options.type ?? '');
|
|
949
|
+
const defaults = {
|
|
950
|
+
domElement,
|
|
951
|
+
};
|
|
952
|
+
const node = new MiniDom.RendererDomNode({
|
|
953
|
+
...defaults,
|
|
954
|
+
...options,
|
|
955
|
+
metaType: 'domMeta',
|
|
956
|
+
});
|
|
957
|
+
return node;
|
|
958
|
+
}
|
|
959
|
+
/** Create a new Lunchbox text node. */
|
|
960
|
+
function createTextNode(options = {}) {
|
|
961
|
+
const defaults = {
|
|
962
|
+
text: options.text ?? '',
|
|
963
|
+
};
|
|
964
|
+
return new MiniDom.RendererTextNode({
|
|
965
|
+
...options,
|
|
966
|
+
...defaults,
|
|
967
|
+
metaType: 'textMeta',
|
|
968
|
+
});
|
|
969
|
+
}
|
|
970
|
+
/** Create a new Lunchbox standard node. */
|
|
971
|
+
function createNode(options = {}, props = {}) {
|
|
972
|
+
const defaults = {
|
|
973
|
+
attached: options.attached ?? [],
|
|
974
|
+
attachedArray: options.attachedArray ?? {},
|
|
975
|
+
instance: options.instance ?? null,
|
|
976
|
+
};
|
|
977
|
+
const node = new MiniDom.RendererStandardNode({
|
|
978
|
+
...options,
|
|
979
|
+
...defaults,
|
|
980
|
+
metaType: 'standardMeta',
|
|
981
|
+
});
|
|
982
|
+
if (node.type && !isLunchboxRootNode(node) && !node.instance) {
|
|
983
|
+
// if (node.type.includes('Camera')) {
|
|
984
|
+
// console.log(node.type, {
|
|
985
|
+
// ...node.props,
|
|
986
|
+
// ...props,
|
|
987
|
+
// })
|
|
988
|
+
// console.trace()
|
|
989
|
+
// }
|
|
990
|
+
node.instance = instantiateThreeObject({
|
|
991
|
+
...node,
|
|
992
|
+
props: {
|
|
993
|
+
...node.props,
|
|
994
|
+
...props,
|
|
995
|
+
},
|
|
996
|
+
});
|
|
997
|
+
}
|
|
998
|
+
// TODO: these manual overrides are a bit brittle - replace?
|
|
999
|
+
if (node.type?.toLowerCase() === 'scene') {
|
|
1000
|
+
// manually set scene override
|
|
1001
|
+
ensuredScene.value = node;
|
|
1002
|
+
}
|
|
1003
|
+
else if (node.type?.toLowerCase().endsWith('camera')) {
|
|
1004
|
+
ensuredCamera.value = node;
|
|
1005
|
+
}
|
|
1006
|
+
return node;
|
|
1007
|
+
}
|
|
1008
|
+
|
|
978
1009
|
const createComponent = (tag) => vue.defineComponent({
|
|
979
1010
|
inheritAttrs: false,
|
|
980
1011
|
name: tag,
|
|
@@ -990,7 +1021,7 @@
|
|
|
990
1021
|
};
|
|
991
1022
|
|
|
992
1023
|
/** Process props into either themselves or the $attached value */
|
|
993
|
-
function processProp({ node, prop }) {
|
|
1024
|
+
function processProp({ node, prop, }) {
|
|
994
1025
|
// return $attachedArray value if needed
|
|
995
1026
|
if (typeof prop === 'string' && prop.startsWith('$attachedArray')) {
|
|
996
1027
|
return node.attachedArray[prop.replace('$attachedArray.', '')];
|
|
@@ -1002,10 +1033,12 @@
|
|
|
1002
1033
|
// otherwise, return plain value
|
|
1003
1034
|
return prop;
|
|
1004
1035
|
}
|
|
1005
|
-
function processPropAsArray({ node, prop }) {
|
|
1036
|
+
function processPropAsArray({ node, prop, }) {
|
|
1006
1037
|
const isAttachedArray = typeof prop === 'string' && prop.startsWith('$attachedArray');
|
|
1007
1038
|
const output = processProp({ node, prop });
|
|
1008
|
-
return Array.isArray(output) && isAttachedArray
|
|
1039
|
+
return Array.isArray(output) && isAttachedArray
|
|
1040
|
+
? output
|
|
1041
|
+
: [output];
|
|
1009
1042
|
}
|
|
1010
1043
|
|
|
1011
1044
|
function instantiateThreeObject(node) {
|
|
@@ -1304,16 +1337,34 @@
|
|
|
1304
1337
|
};
|
|
1305
1338
|
|
|
1306
1339
|
let frameID;
|
|
1340
|
+
let watchStopHandle;
|
|
1307
1341
|
const beforeRender = [];
|
|
1308
1342
|
const afterRender = [];
|
|
1309
|
-
const
|
|
1310
|
-
|
|
1343
|
+
const requestUpdate = (opts) => {
|
|
1344
|
+
cancelUpdate();
|
|
1311
1345
|
frameID = requestAnimationFrame(() => update({
|
|
1312
1346
|
app: opts.app,
|
|
1313
1347
|
renderer: ensureRenderer.value?.instance,
|
|
1314
1348
|
scene: ensuredScene.value.instance,
|
|
1315
1349
|
camera: ensuredCamera.value?.instance,
|
|
1350
|
+
updateSource: opts.updateSource,
|
|
1316
1351
|
}));
|
|
1352
|
+
};
|
|
1353
|
+
const update = (opts) => {
|
|
1354
|
+
if (opts.updateSource) {
|
|
1355
|
+
if (!watchStopHandle) {
|
|
1356
|
+
// request next frame only when state changes
|
|
1357
|
+
watchStopHandle = vue.watch(opts.updateSource, () => {
|
|
1358
|
+
requestUpdate(opts);
|
|
1359
|
+
}, {
|
|
1360
|
+
deep: true,
|
|
1361
|
+
});
|
|
1362
|
+
}
|
|
1363
|
+
}
|
|
1364
|
+
else {
|
|
1365
|
+
// request next frame on a continuous loop
|
|
1366
|
+
requestUpdate(opts);
|
|
1367
|
+
}
|
|
1317
1368
|
// prep options
|
|
1318
1369
|
const { app, renderer, scene, camera } = opts;
|
|
1319
1370
|
// BEFORE RENDER
|
|
@@ -1376,6 +1427,10 @@
|
|
|
1376
1427
|
if (frameID)
|
|
1377
1428
|
cancelAnimationFrame(frameID);
|
|
1378
1429
|
};
|
|
1430
|
+
const cancelUpdateSource = () => {
|
|
1431
|
+
if (watchStopHandle)
|
|
1432
|
+
watchStopHandle();
|
|
1433
|
+
};
|
|
1379
1434
|
|
|
1380
1435
|
/** Update a single prop on a given node. */
|
|
1381
1436
|
function updateObjectProp({ node, key, value, }) {
|
|
@@ -1731,46 +1786,31 @@
|
|
|
1731
1786
|
/** The current camera. Often easier to use `useCamera` instead of this. */
|
|
1732
1787
|
const camera = vue.computed(() => ensuredCamera.value?.instance ?? null);
|
|
1733
1788
|
/** Run a function using the current camera when it's present. */
|
|
1734
|
-
function useCamera(callback
|
|
1735
|
-
|
|
1736
|
-
destroy = vue.watch(camera, (newVal) => {
|
|
1789
|
+
function useCamera(callback) {
|
|
1790
|
+
return vue.watch(camera, (newVal) => {
|
|
1737
1791
|
if (!newVal)
|
|
1738
1792
|
return;
|
|
1739
|
-
// TODO: better fix than `any`?
|
|
1740
1793
|
callback(newVal);
|
|
1741
|
-
if (once) {
|
|
1742
|
-
destroy?.();
|
|
1743
|
-
}
|
|
1744
1794
|
}, { immediate: true });
|
|
1745
1795
|
}
|
|
1746
1796
|
/** The current renderer. Often easier to use `useRenderer` instead of this. */
|
|
1747
1797
|
const renderer = vue.computed(() => ensureRenderer.value?.instance ?? null);
|
|
1748
1798
|
/** Run a function using the current renderer when it's present. */
|
|
1749
|
-
function useRenderer(callback
|
|
1750
|
-
|
|
1751
|
-
destroy = vue.watch(renderer, (newVal) => {
|
|
1799
|
+
function useRenderer(callback) {
|
|
1800
|
+
return vue.watch(renderer, (newVal) => {
|
|
1752
1801
|
if (!newVal)
|
|
1753
1802
|
return;
|
|
1754
|
-
// TODO: better fix than `any`?
|
|
1755
1803
|
callback(newVal);
|
|
1756
|
-
if (once) {
|
|
1757
|
-
destroy?.();
|
|
1758
|
-
}
|
|
1759
1804
|
}, { immediate: true });
|
|
1760
1805
|
}
|
|
1761
1806
|
/** The current scene. Often easier to use `useScene` instead of this. */
|
|
1762
1807
|
const scene = vue.computed(() => ensuredScene.value.instance);
|
|
1763
1808
|
/** Run a function using the current scene when it's present. */
|
|
1764
|
-
function useScene(callback
|
|
1765
|
-
|
|
1766
|
-
destroy = vue.watch(scene, (newVal) => {
|
|
1809
|
+
function useScene(callback) {
|
|
1810
|
+
return vue.watch(scene, (newVal) => {
|
|
1767
1811
|
if (!newVal)
|
|
1768
1812
|
return;
|
|
1769
|
-
// TODO: better fix than `any`?
|
|
1770
1813
|
callback(newVal);
|
|
1771
|
-
if (once) {
|
|
1772
|
-
destroy?.();
|
|
1773
|
-
}
|
|
1774
1814
|
}, { immediate: true });
|
|
1775
1815
|
}
|
|
1776
1816
|
// CUSTOM RENDER SUPPORT
|
|
@@ -1799,12 +1839,14 @@
|
|
|
1799
1839
|
app = vue.createRenderer(nodeOps).createApp(root);
|
|
1800
1840
|
// register all components
|
|
1801
1841
|
Object.keys(components).forEach((key) => {
|
|
1802
|
-
app
|
|
1842
|
+
app?.component(key, components[key]);
|
|
1803
1843
|
});
|
|
1804
1844
|
// update mount function to match Lunchbox.Node
|
|
1805
1845
|
const { mount } = app;
|
|
1806
1846
|
app.mount = (root, ...args) => {
|
|
1847
|
+
// find DOM element to use as app root
|
|
1807
1848
|
const domElement = (typeof root === 'string' ? document.querySelector(root) : root);
|
|
1849
|
+
// create or find root node
|
|
1808
1850
|
const rootNode = ensureRootNode({
|
|
1809
1851
|
domElement,
|
|
1810
1852
|
isLunchboxRootNode: true,
|
package/dist/lunchboxjs.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vue"),require("three"),require("lodash")):"function"==typeof define&&define.amd?define(["exports","vue","three","lodash"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).LunchboxRenderer={},e.vue,e.three,e.lodash)}(this,(function(e,t,n,r){"use strict";function o(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}var a=o(n);const s=[],i=(e,n)=>{const r=I.value?.instance,o=z.value.instance,a=F.value;if(!r?.domElement||!o||!a)return;const s=(e=e??window.innerWidth)/(n=n??window.innerHeight);if("perspectivecamera"===a.type?.toLowerCase()){const e=a.instance;e.aspect=s,e.updateProjectionMatrix()}else if("orthographiccamera"===a.type?.toLowerCase()){const t=a.instance,r=n/e;t.top=10*r,t.bottom=10*-r,t.right=10,t.left=-10,t.updateProjectionMatrix()}else console.log("TODO: non-ortho or perspective camera");r.setSize(e,n),o&&a.instance&&r.render(t.toRaw(o),t.toRaw(a.instance))},c=e=>({position:e,top:0,right:0,bottom:0,left:0,width:"100%",height:"100%"}),d={name:"Lunchbox",props:{background:String,cameraArgs:Array,cameraLook:Array,cameraLookAt:Array,cameraPosition:Array,dpr:Number,ortho:Boolean,orthographic:Boolean,rendererArguments:Object,rendererProperties:Object,shadow:[Boolean,Object],transparent:Boolean,zoom:Number},setup(e,o){const a=t.ref(),s=t.ref(!0),d=t.ref(e.dpr??-1),u=t.ref();let l,p,m;return t.onMounted((()=>{if(!a.value)throw new Error("missing canvas");if(l=G(["WebGLRenderer"]),l)s.value=!1,W.value=!0;else{const t={alpha:e.transparent,antialias:!0,canvas:a.value.domElement,...e.rendererArguments??{}};I.value=v({type:"WebGLRenderer",uuid:$,props:{args:[t]}}),W.value=!0;const n=I,o={shadow:e.shadow};n.value.instance&&o?.shadow&&(n.value.instance.shadowMap.enabled=!0,"object"==typeof o.shadow&&(n.value.instance.shadowMap.type=o.shadow.type)),e.rendererProperties&&Object.keys(e.rendererProperties).forEach((t=>{r.set(n.value,t,e.rendererProperties[t])})),l=n.value}if(p=G(["PerspectiveCamera","OrthographicCamera"]),p?D.value=!0:(e.ortho||e.orthographic?F.value=v({props:{args:e.cameraArgs??[]},type:"OrthographicCamera",uuid:k}):F.value=v({props:{args:e.cameraArgs??[45,.5625,1,1e3]},type:"PerspectiveCamera",uuid:k}),D.value=!0,p=F.value),!p.instance)throw new Error("Error creating camera.");if(p&&e.cameraPosition&&p.instance.position.set(...e.cameraPosition),p&&(e.cameraLookAt||e.cameraLook)){const t=e.cameraLookAt||e.cameraLook;p.instance.lookAt(...t)}if(p&&void 0!==e.zoom&&(p.instance.zoom=e.zoom),m=z.value,m&&m.instance&&e.background&&(m.instance.background=new n.Color(e.background)),-1===d.value&&(d.value=window.devicePixelRatio),!l?.instance)throw new Error("missing renderer");l.instance.setPixelRatio(d.value),he.dpr.value=d.value,((e,t,n)=>{const r=e.value?.domElement;if(!r)throw new Error("missing container");i();const o=new ResizeObserver((([e])=>{i()}));r&&o.observe(r),n((()=>{t&&o.unobserve(t)}))})(u,l.instance.domElement,t.onBeforeUnmount);const o=t.getCurrentInstance().appContext.app;for(let e of te)e({app:o,camera:p.instance,renderer:l.instance,scene:m.instance});ae({app:o,camera:p.instance,renderer:l.instance,scene:m.instance})})),t.onBeforeUnmount((()=>{ie()})),()=>[o.slots.default?.()??null,t.h("div",{style:c("absolute"),ref:u},[s.value?t.h("canvas",{style:c("fixed"),class:"lunchbox-canvas",ref:a}):null])]}},u={},l=["canvas","div","LunchboxWrapper"],p={...["mesh","instancedMesh","scene","sprite","object3D","instancedBufferGeometry","bufferGeometry","boxBufferGeometry","circleBufferGeometry","coneBufferGeometry","cylinderBufferGeometry","dodecahedronBufferGeometry","extrudeBufferGeometry","icosahedronBufferGeometry","latheBufferGeometry","octahedronBufferGeometry","parametricBufferGeometry","planeBufferGeometry","polyhedronBufferGeometry","ringBufferGeometry","shapeBufferGeometry","sphereBufferGeometry","tetrahedronBufferGeometry","textBufferGeometry","torusBufferGeometry","torusKnotBufferGeometry","tubeBufferGeometry","wireframeGeometry","parametricGeometry","tetrahedronGeometry","octahedronGeometry","icosahedronGeometry","dodecahedronGeometry","polyhedronGeometry","tubeGeometry","torusKnotGeometry","torusGeometry","sphereGeometry","ringGeometry","planeGeometry","latheGeometry","shapeGeometry","extrudeGeometry","edgesGeometry","coneGeometry","cylinderGeometry","circleGeometry","boxGeometry","material","shadowMaterial","spriteMaterial","rawShaderMaterial","shaderMaterial","pointsMaterial","meshPhysicalMaterial","meshStandardMaterial","meshPhongMaterial","meshToonMaterial","meshNormalMaterial","meshLambertMaterial","meshDepthMaterial","meshDistanceMaterial","meshBasicMaterial","meshMatcapMaterial","lineDashedMaterial","lineBasicMaterial","light","spotLightShadow","spotLight","pointLight","rectAreaLight","hemisphereLight","directionalLightShadow","directionalLight","ambientLight","lightShadow","ambientLightProbe","hemisphereLightProbe","lightProbe","texture","videoTexture","dataTexture","dataTexture3D","compressedTexture","cubeTexture","canvasTexture","depthTexture","textureLoader","group","catmullRomCurve3","points","cameraHelper","camera","perspectiveCamera","orthographicCamera","cubeCamera","arrayCamera","webGLRenderer"].map((e=>t.defineComponent({inheritAttrs:!1,name:e,setup:(n,r)=>()=>t.h(e,r.attrs,r.slots?.default?.()||[])}))).reduce(((e,t)=>(e[t.name]=t,e)),{}),Lunchbox:d};const m=e=>e?.$el&&e?.$el?.hasOwnProperty?.("instance"),h=e=>{if("domMeta"===e?.metaType)return!0;const t="string"==typeof e?e:e?.type;return l.includes(t??"")},f=e=>"standardMeta"===e?.metaType,y=e=>e.isLunchboxRootNode;function v(e={},t={}){const n={attached:e.attached??[],attachedArray:e.attachedArray??{},instance:e.instance??null},r=new J.RendererStandardNode({...e,...n,metaType:"standardMeta"});return!r.type||y(r)||r.instance||(r.instance=function(e){if(!e.type)return null;const t=e.type[0].toUpperCase()+e.type.slice(1),n=u[e.type]||a[t];if(!n)throw`${t} is not part of the THREE namespace! Did you forget to extend? import {extend} from 'lunchbox'; extend({app, YourComponent, ...})`;const r=(e.props.args??[]).map((t=>function({node:e,prop:t}){const n="string"==typeof t&&t.startsWith("$attachedArray"),r=function({node:e,prop:t}){if("string"==typeof t&&t.startsWith("$attachedArray"))return e.attachedArray[t.replace("$attachedArray.","")];if("string"==typeof t&&t.startsWith("$attached"))return e.attached[t.replace("$attached.","")];return t}({node:e,prop:t});return Array.isArray(r)&&n?r:[r]}({node:e,prop:t})));let o=[];r.forEach((e=>{o=o.concat(e)}));return new n(...o)}({...r,props:{...r.props,...t}})),"scene"===r.type&&(z.value=r),r}const g=[],b=t.ref(!1);function x({node:e,key:n,value:r}){var o;if(e.eventListeners[n]||(e.eventListeners[n]=[]),e.eventListenerRemoveFunctions[n]||(e.eventListenerRemoveFunctions[n]=[]),e.eventListeners[n].push(r),R.includes(n)&&(K.value,e.instance&&!g.includes(e)&&(o=e,g.push(o),e.eventListenerRemoveFunctions[n].push((()=>(e=>{const t=g.indexOf(e);-1!==t&&g.splice(t,1)})(e))))),"onClick"===n||"onPointerDown"===n||"onPointerUp"===n){const r=t.watch((()=>b.value),(t=>{const r=P.map((e=>e.element)).findIndex((t=>t.instance&&t.instance.uuid===e.instance?.uuid));-1!==r&&((!t||"onClick"!==n&&"onPointerDown"!==n)&&(t||"onPointerUp"!==n)||e.eventListeners[n].forEach((e=>{e({intersection:P[r].intersection})})))}));e.eventListenerRemoveFunctions[n].push(r)}return e}const R=["onClick","onPointerUp","onPointerDown","onPointerOver","onPointerOut","onPointerEnter","onPointerLeave","onPointerMove"];let w,A,C;const E=t.ref({x:1/0,y:1/0});let L=!1;let P=[];const M=()=>{const e=K.value?.instance,t=F.value?.instance;if(!e||!t)return;e.setFromCamera(he.mousePos.value,t);const n=e.intersectObjects(g.map((e=>e.instance)));let r=[],o=[],a=[];r=P.map((e=>e.intersection)),n?.forEach((e=>{const t=P.findIndex((t=>t.intersection.object===e.object));if(-1===t){const t=g.find((t=>t.instance?.uuid===e.object.uuid));t&&o.push({element:t,intersection:e})}else{const t=g.find((t=>t.instance?.uuid===e.object.uuid));t&&a.push({element:t,intersection:e})}const n=r.findIndex((t=>t.object.uuid===e.object.uuid));-1!==n&&r.splice(n,1)}));const s=r.map((e=>({element:g.find((t=>t.instance?.uuid===e.object.uuid)),intersection:e})));o.forEach((({element:e,intersection:t})=>{N({element:e,eventKeys:["onPointerEnter"],intersection:t})})),a.forEach((({element:e,intersection:t})=>{N({element:e,eventKeys:["onPointerOver","onPointerMove"],intersection:t})})),s.forEach((({element:e,intersection:t})=>{N({element:e,eventKeys:["onPointerLeave","onPointerOut"],intersection:t})})),P=[].concat(o,a)},N=({element:e,eventKeys:t,intersection:n})=>{e&&t.forEach((t=>{e.eventListeners[t]&&e.eventListeners[t].forEach((e=>{e({intersection:n})}))}))};function B(t={}){return e.lunchboxTree||(e.lunchboxTree=new J.RendererRootNode(t)),e.lunchboxTree}function G(e){Array.isArray(e)||(e=[e]);for(let t of e)if(O[t])return O[t];for(let n of e){const e=T[n]||s.find((e=>e.type?.toLowerCase()===n.toLowerCase()));if(!(t=e,"RendererNode"!==t?.minidomType||!1!==e.props["is-default"]&&!1!=!e.props.isDefault))return null;if(e){const t=e;return T[n]=t,t}}var t;return null}e.lunchboxTree=void 0;const T=t.reactive({}),O=t.reactive({});function j(e,n,r={},o=null){Array.isArray(e)||(e=[e]);for(let t of e)T[t]||(T[t]=null),O[t]||(O[t]=null);return t.computed({get(){const t=G(e);if(t)return t;const a=B(),s=v({type:e[0],uuid:n,props:r});return a.addChild(s),T[e[0]]=s,o&&o(s),s},set(e){const t=e.type??"",n=t[0].toUpperCase()+t.slice(1);O[n]=e}})}const k="FALLBACK_CAMERA",S=j(["PerspectiveCamera","OrthographicCamera"],k,{args:[45,.5625,1,1e3]}),D=t.ref(!1),F=t.computed({get:()=>D.value?S.value:null,set(e){const t=e.type??"",n=t[0].toUpperCase()+t.slice(1);O[n]=e}}),$="FALLBACK_RENDERER",U=j(["WebGLRenderer"],$,{}),W=t.ref(!1),I=t.computed({get:()=>W.value?U.value:null,set(e){const t=e.type??"",n=t[0].toUpperCase()+t.slice(1);O[n]=e}}),z=j("Scene","FALLBACK_SCENE"),K=j("Raycaster","AUTO_RAYCASTER",{},(e=>(e=>{if(!e.instance)return;let n=null;n=t.watch((()=>I.value),(e=>{e?.instance&&(L||(w=t=>{const n=(e.instance.domElement.width??1)/he.dpr.value,r=(e.instance.domElement.height??1)/he.dpr.value;E.value.x=t.offsetX/n*2-1,E.value.y=-t.offsetY/r*2+1},A=()=>b.value=!0,C=()=>b.value=!1,e.instance.domElement.addEventListener("mousemove",w),e.instance.domElement.addEventListener("mousedown",A),e.instance.domElement.addEventListener("mouseup",C),se(M),L=!0),n&&n())}),{immediate:!0})})(e))),_=e=>t.defineComponent({inheritAttrs:!1,name:e,render(){return t.h(e,this.$attrs,this.$slots?.default?.()||[])}});var V,q=new Uint8Array(16);function H(){if(!V&&!(V="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return V(q)}var Y=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function X(e){return"string"==typeof e&&Y.test(e)}for(var J,Q=[],Z=0;Z<256;++Z)Q.push((Z+256).toString(16).substr(1));function ee(e,t,n){var r=(e=e||{}).random||(e.rng||H)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(var o=0;o<16;++o)t[n+o]=r[o];return t}return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(Q[e[t+0]]+Q[e[t+1]]+Q[e[t+2]]+Q[e[t+3]]+"-"+Q[e[t+4]]+Q[e[t+5]]+"-"+Q[e[t+6]]+Q[e[t+7]]+"-"+Q[e[t+8]]+Q[e[t+9]]+"-"+Q[e[t+10]]+Q[e[t+11]]+Q[e[t+12]]+Q[e[t+13]]+Q[e[t+14]]+Q[e[t+15]]).toLowerCase();if(!X(n))throw TypeError("Stringified UUID is invalid");return n}(r)}!function(e){e.BaseNode=class{constructor(e={},t){this.parentNode=e?.parentNode??t??null,this.minidomType="MinidomBaseNode",this.uuid=e?.uuid??ee(),s.push(this)}uuid;parentNode;get nextSibling(){if(!this.parentNode)return null;const e=this.parentNode.children.findIndex((e=>e.uuid===this.uuid));return-1!==e&&e<this.parentNode.children.length-1?this.parentNode.children[e+1]:null}insertBefore(e,t){e.removeAsChildFromAnyParents(),e.parentNode=this;const n=this.children.findIndex((e=>e.uuid===t?.uuid));-1!==n?this.children.splice(n,0,e):this.children.push(e)}removeChild(e){const t=this.children.findIndex((t=>t?.uuid===e?.uuid));-1!==t&&this.children.splice(t,1)}children=[];addChild(e){return e&&(e.removeAsChildFromAnyParents(),e.parentNode=this,this.insertBefore(e,null)),this}getPath(){const e=[];let t=this;for(;t;)e.unshift(t),t=t.parentNode;return e}drop(){this.parentNode=null,this.removeAsChildFromAnyParents()}walk(e){const t=[this,...this.children],n=[];let r=!0;for(;t.length&&r;){const o=t.shift();if(o){if(n.includes(o))continue;n.push(o),t.push(...o.children.filter((e=>!n.includes(e)))),r=e(o)}else r=!1}}minidomType;removeAsChildFromAnyParents(){s.forEach((e=>e.removeChild(this)))}};class t extends e.BaseNode{constructor(e={},t){super(e,t),this.minidomType="RendererNode",this.eventListeners={},this.eventListenerRemoveFunctions={},this.name=e.name??"",this.metaType=e.metaType??"standardMeta",this.props=e.props??[],this.type=e.type??""}eventListeners;eventListenerRemoveFunctions;name;metaType;props;type;drop(){super.drop(),Object.keys(this.eventListenerRemoveFunctions).forEach((e=>{this.eventListenerRemoveFunctions[e].forEach((e=>e()))}))}}e.RendererBaseNode=t;class n extends e.RendererBaseNode{constructor(e={},t){super(e,t),this.domElement=e.domElement??document.createElement("div")}domElement;isLunchboxRootNode=!0}e.RendererRootNode=n;class r extends e.RendererBaseNode{constructor(e={},t){super(e,t),this.text=e.text??""}text}e.RendererCommentNode=r;class o extends e.RendererBaseNode{constructor(e={},t){super(e,t),this.domElement=e.domElement??document.createElement("div")}domElement}e.RendererDomNode=o;class a extends e.RendererBaseNode{constructor(e={},t){super(e,t),this.text=e.text??""}text}e.RendererTextNode=a;class i extends e.RendererBaseNode{constructor(e={},t){super(e,t),this.attached=e.attached??[],this.attachedArray=e.attachedArray??{},this.instance=e.instance??null}attached;attachedArray;instance}e.RendererStandardNode=i}(J||(J={}));(new J.RendererRootNode).minidomType="RootNode";const te=[];let ne;const re=[],oe=[],ae=e=>{ne=requestAnimationFrame((()=>ae({app:e.app,renderer:I.value?.instance,scene:z.value.instance,camera:F.value?.instance})));const{app:n,renderer:r,scene:o,camera:a}=e;re.forEach((t=>{t&&t(e)})),r&&o&&a&&(n.customRender?n.customRender(e):r.render(t.toRaw(o),t.toRaw(a))),oe.forEach((t=>{t&&t(e)}))},se=(e,t=1/0)=>{t===1/0?re.push(e):re.splice(t,0,e)},ie=()=>{ne&&cancelAnimationFrame(ne)};const ce={x:"position.x",y:"position.y",z:"position.z"},de=["","parameters"],ue=["args","attach","attachArray","is.default","isDefault","key","onAdded","ref","src"],le=["geometry","material"];function pe(e,t,n,r){const o=r??e.instance,a=t.instance;e.props.attach===n&&(t.attached={[n]:o,...t.attached||{}},a[n]=r??e.instance),e.props.attachArray===n&&(t.attachedArray[e.props.attachArray]||(t.attachedArray[e.props.attachArray]=[]),t.attachedArray[e.props.attachArray].push(o),a[n]=[a[n]])}const me={createElement:(e,t,n,r)=>{const o={type:e};r&&(o.props=r);if(h(e)){const e=function(e={}){const t={domElement:document.createElement(e.type??"")};return new J.RendererDomNode({...t,...e,metaType:"domMeta"})}(o);return e}const a=v(o);return le.forEach((t=>{e.toLowerCase().endsWith(t)&&(a.props.attach=t)})),a},createText:e=>function(e={}){const t={text:e.text??""};return new J.RendererTextNode({...e,...t,metaType:"textMeta"})}({text:e}),createComment:e=>function(e={}){const t={text:e.text??""};return new J.RendererCommentNode({...t,...e,metaType:"commentMeta"})}({text:e}),insert:(e,t,n)=>{let r=t??B();if(r.insertBefore(e,n),"commentMeta"!==e.metaType&&"textMeta"!==e.metaType&&(h(e)&&(h(t)||y(t))&&t.domElement.appendChild(e.domElement),f(e))){let n=r.metaType;if("textMeta"===n||"commentMeta"===n){const e=r.getPath();for(let t=e.length-1;t>=0;t--)if("textMeta"!==e[t].metaType&&"commentMeta"!==e[t].metaType){r=e[t];break}}if("standardMeta"===e.metaType&&"scene"!==e.type&&y(r)){const t=z.value;t.instance&&e&&t.addChild(e),e.instance&&e.instance.isObject3D&&t.instance&&t!==e&&t.instance.add(e.instance)}else f(e)&&e.instance?.isObject3D&&f(r)&&r.instance?.isObject3D&&r.instance?.add?.(e.instance);if(e?.props?.attach&&f(t)&&t?.instance){e.type?.toLowerCase().endsWith("loader")&&e.props.src&&(e.props.attach||e.props.attachArray)?function(e,t){const n=e.instance;if(t.attached=t.attached||{},t.attachedArray=t.attachedArray||{},!e.props.attach)return;if("textureloader"===e.type?.toLowerCase()){const r=n.load(e.props.src);pe(e,t,e.props.attach,r)}else n.load(e.props.src,(n=>{pe(e,t,e.props.attach,n)}),null,(e=>{throw new Error(e)}))}(e,t):pe(e,t,e.props.attach)}e.props?.onAdded&&e.props.onAdded({instance:e.instance})}},nextSibling(e){const t=e.nextSibling;return t||null},parentNode(e){const t=e.parentNode;return t||null},patchProp(e,t,n,o){h(e)?"style"===t?Object.keys(o).forEach((t=>{e.domElement.style[t]=o[t]})):e.domElement.setAttribute(t,o):y(e)||t.startsWith("$")||function({node:e,key:t,value:n}){if((e=>["onClick","onContextMenu","onDoubleClick","onPointerUp","onPointerDown","onPointerOver","onPointerOut","onPointerEnter","onPointerLeave","onPointerMove","onWheel"].includes(e))(t))return x({node:e,key:t,value:n});const o=t.replace(/-/g,"."),a=ce[o]||o;if(ue.includes(t)||ue.includes(a))return e;if(!f(e))return e;if("string"==typeof n&&n.startsWith("$attached")){const t=n.replace("$attached.","");n=r.get(e.attached,t,null)}const s=e.instance;if(!s)return e;let i;for(let e=0;e<de.length&&!i;e++){const t=[de[e],a].filter(Boolean).join(".");i=i=r.get(s,t)}if(i&&r.isNumber(n)&&i.setScalar)i.setScalar(n);else if(i&&i.set){const e=Array.isArray(n)?n:[n];s[a].set(...e)}else"function"==typeof i?i.bind(e.instance)(...n):void 0!==r.get(s,a,void 0)?r.set(s,a,""===n||n):console.log(`No property ${a} found on ${s}`);const c=s?.texture?.type||s?.type;if("string"==typeof c){const e=c.toLowerCase();switch(!0){case e.includes("material"):s.needsUpdate=!0;break;case e.includes("camera")&&s.updateProjectionMatrix:s.updateProjectionMatrix()}}}({node:e,key:t,value:o})},remove:e=>{if(!e)return;const t=Object.keys(O),n=[];e.walk((e=>(n.push(e),!0))),n.forEach((e=>{const n=t.find((t=>O[t]?.uuid===e.uuid));if(n&&(O[n]=null),f(e)){e.instance?.removeFromParent?.();const t="scene"!==e.type&&e.instance?.dispose;t&&t.bind(e.instance)(),e.instance=null}e.drop();const r=s.findIndex((t=>t.uuid===e.uuid));-1!==r&&s.splice(r,1)}))},setElementText(){},setText(){}},he={dpr:t.ref(1),inputActive:b,mousePos:E},fe=t.computed((()=>F.value?.instance??null));const ye=t.computed((()=>I.value?.instance??null));const ve=t.computed((()=>z.value.instance));let ge=null,be=null;e.camera=fe,e.clearCustomRender=()=>{ge?ge.clearCustomRender():be=null},e.createApp=e=>{ge=t.createRenderer(me).createApp(e),Object.keys(p).forEach((e=>{ge.component(e,p[e])}));const{mount:n}=ge;return ge.mount=(e,...t)=>{const r=B({domElement:"string"==typeof e?document.querySelector(e):e,isLunchboxRootNode:!0,name:"root",metaType:"rootMeta",type:"root",uuid:"LUNCHBOX_ROOT"});ge.rootNode=r;return n(r,...t)},ge.extend=e=>((({app:e,...t})=>{Object.keys(t).forEach((n=>{e.component(n,_(n)),u[n]=t[n]}))})({app:ge,...e}),ge),ge.setCustomRender=e=>{ge.customRender=e},be&&(ge.setCustomRender(be),be=null),ge.clearCustomRender=()=>{ge.customRender=null},ge},e.find=function(e){return e=t.isRef(e)?e.value:e,f(e)?e?.instance:m(e)?e?.$el?.instance:t.isVNode(e)?e.el?.instance:null},e.globals=he,e.offAfterRender=e=>{if(isFinite(e))oe.splice(e,1);else{const t=oe.findIndex((t=>t==e));oe.splice(t,1)}},e.offBeforeRender=e=>{if(isFinite(e))re.splice(e,1);else{const t=re.findIndex((t=>t==e));re.splice(t,1)}},e.onAfterRender=(e,t=1/0)=>{t===1/0?oe.push(e):oe.splice(t,0,e)},e.onBeforeRender=se,e.onStart=(e,t=1/0)=>{t===1/0?te.push(e):te.splice(t,0,e)},e.renderer=ye,e.scene=ve,e.setCustomRender=e=>{ge?ge.setCustomRender(e):be=e},e.useCamera=function(e,n=!0){let r;r=t.watch(fe,(t=>{t&&(e(t),n&&r?.())}),{immediate:!0})},e.useRenderer=function(e,n=!0){let r;r=t.watch(ye,(t=>{t&&(e(t),n&&r?.())}),{immediate:!0})},e.useScene=function(e,n=!0){let r;r=t.watch(ve,(t=>{t&&(e(t),n&&r?.())}),{immediate:!0})},Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vue"),require("three"),require("lodash")):"function"==typeof define&&define.amd?define(["exports","vue","three","lodash"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).LunchboxRenderer={},e.vue,e.three,e.lodash)}(this,(function(e,t,n,r){"use strict";function o(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}var a=o(n);const s=[],i=(e,n)=>{const r=I.value?.instance,o=z.value.instance,a=D.value;if(!r?.domElement||!o||!a)return;const s=(e=e??window.innerWidth)/(n=n??window.innerHeight);if("perspectivecamera"===a.type?.toLowerCase()){const e=a.instance;e.aspect=s,e.updateProjectionMatrix()}else if("orthographiccamera"===a.type?.toLowerCase()){const t=a.instance,r=n/e;t.top=10*r,t.bottom=10*-r,t.right=10,t.left=-10,t.updateProjectionMatrix()}else console.log("TODO: non-ortho or perspective camera");r.setSize(e,n),o&&a.instance&&r.render(t.toRaw(o),t.toRaw(a.instance))},c=e=>({position:e,top:0,right:0,bottom:0,left:0,width:"100%",height:"100%"}),u={name:"Lunchbox",props:{background:String,cameraArgs:Array,cameraLook:Array,cameraLookAt:Array,cameraPosition:Array,dpr:Number,ortho:Boolean,orthographic:Boolean,r3f:Boolean,rendererArguments:Object,rendererProperties:Object,shadow:[Boolean,Object],transparent:Boolean,zoom:Number,updateSource:Object},setup(e,n){const o=t.ref(),s=t.ref(!0),u=t.ref(e.dpr??-1),d=t.ref();let l,p,m;return e.r3f&&a?.ColorManagement&&(a.ColorManagement.legacyMode=!1),t.onMounted((()=>{if(!o.value)throw new Error("missing canvas");if(l=G(["WebGLRenderer"]),l)s.value=!1,W.value=!0;else{const t={alpha:e.transparent,antialias:!0,canvas:o.value.domElement,powerPreference:e.r3f?"high-performance":"default",...e.rendererArguments??{}};I.value=_({type:"WebGLRenderer",uuid:$,props:{args:[t]}}),W.value=!0;const n=I;e.r3f&&n.value.instance&&(n.value.instance.outputEncoding=a.sRGBEncoding,n.value.instance.toneMapping=a.ACESFilmicToneMapping);const s={shadow:e.shadow};n.value.instance&&s?.shadow&&(n.value.instance.shadowMap.enabled=!0,"object"==typeof s.shadow&&(n.value.instance.shadowMap.type=s.shadow.type)),e.rendererProperties&&Object.keys(e.rendererProperties).forEach((t=>{r.set(n.value,t,e.rendererProperties[t])})),l=n.value}if(p=G(["PerspectiveCamera","OrthographicCamera"]),p?F.value=!0:(e.ortho||e.orthographic?D.value=_({props:{args:e.cameraArgs??[]},type:"OrthographicCamera",uuid:k}):D.value=_({props:{args:e.cameraArgs??[e.r3f?75:45,.5625,1,1e3]},type:"PerspectiveCamera",uuid:k}),F.value=!0,p=D.value),!p.instance)throw new Error("Error creating camera.");if(p&&e.cameraPosition&&p.instance.position.set(...e.cameraPosition),p&&(e.cameraLookAt||e.cameraLook)){const t=e.cameraLookAt||e.cameraLook;p.instance.lookAt(...t)}if(p&&void 0!==e.zoom&&(p.instance.zoom=e.zoom),m=z.value,m&&m.instance&&e.background&&(m.instance.background=new a.Color(e.background)),-1===u.value&&(u.value=window.devicePixelRatio),!l?.instance)throw new Error("missing renderer");l.instance.setPixelRatio(u.value),ve.dpr.value=u.value,((e,t,n)=>{const r=e.value?.domElement;if(!r)throw new Error("missing container");i();const o=new ResizeObserver((([e])=>{i()}));r&&o.observe(r),n((()=>{t&&o.unobserve(t)}))})(d,l.instance.domElement,t.onBeforeUnmount);const n=t.getCurrentInstance().appContext.app;for(let e of ne)e({app:n,camera:p.instance,renderer:l.instance,scene:m.instance});ce({app:n,camera:p.instance,renderer:l.instance,scene:m.instance,updateSource:e.updateSource})})),t.onBeforeUnmount((()=>{ue(),de()})),()=>[n.slots.default?.()??null,t.h("div",{style:c("absolute"),ref:d},[s.value?t.h("canvas",{style:c("fixed"),class:"lunchbox-canvas",ref:o}):null])]}},d={},l=["canvas","div","LunchboxWrapper"],p={...["mesh","instancedMesh","scene","sprite","object3D","instancedBufferGeometry","bufferGeometry","boxBufferGeometry","circleBufferGeometry","coneBufferGeometry","cylinderBufferGeometry","dodecahedronBufferGeometry","extrudeBufferGeometry","icosahedronBufferGeometry","latheBufferGeometry","octahedronBufferGeometry","parametricBufferGeometry","planeBufferGeometry","polyhedronBufferGeometry","ringBufferGeometry","shapeBufferGeometry","sphereBufferGeometry","tetrahedronBufferGeometry","textBufferGeometry","torusBufferGeometry","torusKnotBufferGeometry","tubeBufferGeometry","wireframeGeometry","parametricGeometry","tetrahedronGeometry","octahedronGeometry","icosahedronGeometry","dodecahedronGeometry","polyhedronGeometry","tubeGeometry","torusKnotGeometry","torusGeometry","sphereGeometry","ringGeometry","planeGeometry","latheGeometry","shapeGeometry","extrudeGeometry","edgesGeometry","coneGeometry","cylinderGeometry","circleGeometry","boxGeometry","material","shadowMaterial","spriteMaterial","rawShaderMaterial","shaderMaterial","pointsMaterial","meshPhysicalMaterial","meshStandardMaterial","meshPhongMaterial","meshToonMaterial","meshNormalMaterial","meshLambertMaterial","meshDepthMaterial","meshDistanceMaterial","meshBasicMaterial","meshMatcapMaterial","lineDashedMaterial","lineBasicMaterial","light","spotLightShadow","spotLight","pointLight","rectAreaLight","hemisphereLight","directionalLightShadow","directionalLight","ambientLight","lightShadow","ambientLightProbe","hemisphereLightProbe","lightProbe","texture","videoTexture","dataTexture","dataTexture3D","compressedTexture","cubeTexture","canvasTexture","depthTexture","textureLoader","group","catmullRomCurve3","points","cameraHelper","camera","perspectiveCamera","orthographicCamera","cubeCamera","arrayCamera","webGLRenderer"].map((e=>t.defineComponent({inheritAttrs:!1,name:e,setup:(n,r)=>()=>t.h(e,r.attrs,r.slots?.default?.()||[])}))).reduce(((e,t)=>(e[t.name]=t,e)),{}),Lunchbox:u};const m=e=>e?.$el&&e?.$el?.hasOwnProperty?.("instance"),h=e=>{if("domMeta"===e?.metaType)return!0;const t="string"==typeof e?e:e?.type;return l.includes(t??"")},f=e=>"standardMeta"===e?.metaType,y=e=>e.isLunchboxRootNode,v=[],g=t.ref(!1);function b({node:e,key:n,value:r}){var o;if(e.eventListeners[n]||(e.eventListeners[n]=[]),e.eventListenerRemoveFunctions[n]||(e.eventListenerRemoveFunctions[n]=[]),e.eventListeners[n].push(r),x.includes(n)&&(K.value,e.instance&&!v.includes(e)&&(o=e,v.push(o),e.eventListenerRemoveFunctions[n].push((()=>(e=>{const t=v.indexOf(e);-1!==t&&v.splice(t,1)})(e))))),"onClick"===n||"onPointerDown"===n||"onPointerUp"===n){const r=t.watch((()=>g.value),(t=>{const r=P.map((e=>e.element)).findIndex((t=>t.instance&&t.instance.uuid===e.instance?.uuid));-1!==r&&((!t||"onClick"!==n&&"onPointerDown"!==n)&&(t||"onPointerUp"!==n)||e.eventListeners[n].forEach((e=>{e({intersection:P[r].intersection})})))}));e.eventListenerRemoveFunctions[n].push(r)}return e}const x=["onClick","onPointerUp","onPointerDown","onPointerOver","onPointerOut","onPointerEnter","onPointerLeave","onPointerMove"];let w,R,A;const C=t.ref({x:1/0,y:1/0});let E,L=!1;let P=[];const M=()=>{const e=K.value?.instance,t=D.value?.instance;if(!e||!t)return;e.setFromCamera(ve.mousePos.value,t);const n=e.intersectObjects(v.map((e=>e.instance)));let r=[],o=[],a=[];r=P.map((e=>e.intersection)),n?.forEach((e=>{if(-1===P.findIndex((t=>t.intersection.object===e.object))){const t=v.find((t=>t.instance?.uuid===e.object.uuid));t&&o.push({element:t,intersection:e})}else{const t=v.find((t=>t.instance?.uuid===e.object.uuid));t&&a.push({element:t,intersection:e})}const t=r.findIndex((t=>t.object.uuid===e.object.uuid));-1!==t&&r.splice(t,1)}));const s=r.map((e=>({element:v.find((t=>t.instance?.uuid===e.object.uuid)),intersection:e})));o.forEach((({element:e,intersection:t})=>{B({element:e,eventKeys:["onPointerEnter"],intersection:t})})),a.forEach((({element:e,intersection:t})=>{B({element:e,eventKeys:["onPointerOver","onPointerMove"],intersection:t})})),s.forEach((({element:e,intersection:t})=>{B({element:e,eventKeys:["onPointerLeave","onPointerOut"],intersection:t})})),P=[].concat(o,a)},B=({element:e,eventKeys:t,intersection:n})=>{e&&t.forEach((t=>{e.eventListeners[t]&&e.eventListeners[t].forEach((e=>{e({intersection:n})}))}))};function N(t={}){return e.lunchboxTree||(e.lunchboxTree=new Q.RendererRootNode(t)),e.lunchboxTree}function G(e){Array.isArray(e)||(e=[e]);for(let t of e)if(O[t])return O[t];for(let n of e){const e=T[n]||s.find((e=>e.type?.toLowerCase()===n.toLowerCase()));if(!(t=e,"RendererNode"!==t?.minidomType||!1!==e.props["is-default"]&&!1!=!e.props.isDefault))return null;if(e){const t=e;return T[n]=t,t}}var t;return null}e.lunchboxTree=void 0;const T=t.reactive({}),O=t.reactive({});function j(e,n,r={},o=null){Array.isArray(e)||(e=[e]);for(let t of e)T[t]||(T[t]=null),O[t]||(O[t]=null);return t.computed({get(){const t=G(e);if(t)return t;const a=N(),s=_({type:e[0],uuid:n,props:r});return a.addChild(s),T[e[0]]=s,o&&o(s),s},set(e){const t=e.type??"",n=t[0].toUpperCase()+t.slice(1);O[n]=e}})}const k="FALLBACK_CAMERA",S=j(["PerspectiveCamera","OrthographicCamera"],k,{args:[45,.5625,1,1e3]}),F=t.ref(!1),D=t.computed({get:()=>F.value?S.value:null,set(e){const t=e.type??"",n=t[0].toUpperCase()+t.slice(1);O[n]=e}}),$="FALLBACK_RENDERER",U=j(["WebGLRenderer"],$,{}),W=t.ref(!1),I=t.computed({get:()=>W.value?U.value:null,set(e){const t=e.type??"",n=t[0].toUpperCase()+t.slice(1);O[n]=e}}),z=j("Scene","FALLBACK_SCENE"),K=j("Raycaster","AUTO_RAYCASTER",{},(e=>(e=>{if(!e.instance)return;let n=null;n=t.watch((()=>I.value),(e=>{e?.instance&&(L||(w=t=>{const n=(e.instance.domElement.width??1)/ve.dpr.value,r=(e.instance.domElement.height??1)/ve.dpr.value;C.value.x=t.offsetX/n*2-1,C.value.y=-t.offsetY/r*2+1},R=()=>g.value=!0,A=()=>g.value=!1,e.instance.domElement.addEventListener("mousemove",w),e.instance.domElement.addEventListener("mousedown",R),e.instance.domElement.addEventListener("mouseup",A),t.watch((()=>[g.value,C.value.x,C.value.y]),(()=>{E&&cancelAnimationFrame(E),E=requestAnimationFrame((()=>{M()}))})),L=!0),n&&n())}),{immediate:!0})})(e)));function _(e={},t={}){const n={attached:e.attached??[],attachedArray:e.attachedArray??{},instance:e.instance??null},r=new Q.RendererStandardNode({...e,...n,metaType:"standardMeta"});return!r.type||y(r)||r.instance||(r.instance=function(e){if(!e.type)return null;const t=e.type[0].toUpperCase()+e.type.slice(1),n=d[e.type]||a[t];if(!n)throw`${t} is not part of the THREE namespace! Did you forget to extend? import {extend} from 'lunchbox'; extend({app, YourComponent, ...})`;const r=(e.props.args??[]).map((t=>function({node:e,prop:t}){const n="string"==typeof t&&t.startsWith("$attachedArray"),r=function({node:e,prop:t}){if("string"==typeof t&&t.startsWith("$attachedArray"))return e.attachedArray[t.replace("$attachedArray.","")];if("string"==typeof t&&t.startsWith("$attached"))return e.attached[t.replace("$attached.","")];return t}({node:e,prop:t});return Array.isArray(r)&&n?r:[r]}({node:e,prop:t})));let o=[];r.forEach((e=>{o=o.concat(e)}));return new n(...o)}({...r,props:{...r.props,...t}})),"scene"===r.type?.toLowerCase()?z.value=r:r.type?.toLowerCase().endsWith("camera")&&(D.value=r),r}const q=e=>t.defineComponent({inheritAttrs:!1,name:e,render(){return t.h(e,this.$attrs,this.$slots?.default?.()||[])}});var V,H=new Uint8Array(16);function Y(){if(!V&&!(V="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return V(H)}var X=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function J(e){return"string"==typeof e&&X.test(e)}for(var Q,Z=[],ee=0;ee<256;++ee)Z.push((ee+256).toString(16).substr(1));function te(e,t,n){var r=(e=e||{}).random||(e.rng||Y)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(var o=0;o<16;++o)t[n+o]=r[o];return t}return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(Z[e[t+0]]+Z[e[t+1]]+Z[e[t+2]]+Z[e[t+3]]+"-"+Z[e[t+4]]+Z[e[t+5]]+"-"+Z[e[t+6]]+Z[e[t+7]]+"-"+Z[e[t+8]]+Z[e[t+9]]+"-"+Z[e[t+10]]+Z[e[t+11]]+Z[e[t+12]]+Z[e[t+13]]+Z[e[t+14]]+Z[e[t+15]]).toLowerCase();if(!J(n))throw TypeError("Stringified UUID is invalid");return n}(r)}!function(e){e.BaseNode=class{constructor(e={},t){this.parentNode=e?.parentNode??t??null,this.minidomType="MinidomBaseNode",this.uuid=e?.uuid??te(),s.push(this)}uuid;parentNode;get nextSibling(){if(!this.parentNode)return null;const e=this.parentNode.children.findIndex((e=>e.uuid===this.uuid));return-1!==e&&e<this.parentNode.children.length-1?this.parentNode.children[e+1]:null}insertBefore(e,t){e.removeAsChildFromAnyParents(),e.parentNode=this;const n=this.children.findIndex((e=>e.uuid===t?.uuid));-1!==n?this.children.splice(n,0,e):this.children.push(e)}removeChild(e){const t=this.children.findIndex((t=>t?.uuid===e?.uuid));-1!==t&&this.children.splice(t,1)}children=[];addChild(e){return e&&(e.removeAsChildFromAnyParents(),e.parentNode=this,this.insertBefore(e,null)),this}getPath(){const e=[];let t=this;for(;t;)e.unshift(t),t=t.parentNode;return e}drop(){this.parentNode=null,this.removeAsChildFromAnyParents()}walk(e){const t=[this,...this.children],n=[];let r=!0;for(;t.length&&r;){const o=t.shift();if(o){if(n.includes(o))continue;n.push(o),t.push(...o.children.filter((e=>!n.includes(e)))),r=e(o)}else r=!1}}minidomType;removeAsChildFromAnyParents(){s.forEach((e=>e.removeChild(this)))}};class t extends e.BaseNode{constructor(e={},t){super(e,t),this.minidomType="RendererNode",this.eventListeners={},this.eventListenerRemoveFunctions={},this.name=e.name??"",this.metaType=e.metaType??"standardMeta",this.props=e.props??[],this.type=e.type??""}eventListeners;eventListenerRemoveFunctions;name;metaType;props;type;drop(){super.drop(),Object.keys(this.eventListenerRemoveFunctions).forEach((e=>{this.eventListenerRemoveFunctions[e].forEach((e=>e()))}))}}e.RendererBaseNode=t;class n extends e.RendererBaseNode{constructor(e={},t){super(e,t),this.domElement=e.domElement??document.createElement("div")}domElement;isLunchboxRootNode=!0}e.RendererRootNode=n;class r extends e.RendererBaseNode{constructor(e={},t){super(e,t),this.text=e.text??""}text}e.RendererCommentNode=r;class o extends e.RendererBaseNode{constructor(e={},t){super(e,t),this.domElement=e.domElement??document.createElement("div")}domElement}e.RendererDomNode=o;class a extends e.RendererBaseNode{constructor(e={},t){super(e,t),this.text=e.text??""}text}e.RendererTextNode=a;class i extends e.RendererBaseNode{constructor(e={},t){super(e,t),this.attached=e.attached??[],this.attachedArray=e.attachedArray??{},this.instance=e.instance??null}attached;attachedArray;instance}e.RendererStandardNode=i}(Q||(Q={}));(new Q.RendererRootNode).minidomType="RootNode";const ne=[];let re,oe;const ae=[],se=[],ie=e=>{ue(),re=requestAnimationFrame((()=>ce({app:e.app,renderer:I.value?.instance,scene:z.value.instance,camera:D.value?.instance,updateSource:e.updateSource})))},ce=e=>{e.updateSource?oe||(oe=t.watch(e.updateSource,(()=>{ie(e)}),{deep:!0})):ie(e);const{app:n,renderer:r,scene:o,camera:a}=e;ae.forEach((t=>{t&&t(e)})),r&&o&&a&&(n.customRender?n.customRender(e):r.render(t.toRaw(o),t.toRaw(a))),se.forEach((t=>{t&&t(e)}))},ue=()=>{re&&cancelAnimationFrame(re)},de=()=>{oe&&oe()};const le={x:"position.x",y:"position.y",z:"position.z"},pe=["","parameters"],me=["args","attach","attachArray","is.default","isDefault","key","onAdded","ref","src"],he=["geometry","material"];function fe(e,t,n,r){const o=r??e.instance,a=t.instance;e.props.attach===n&&(t.attached={[n]:o,...t.attached||{}},a[n]=r??e.instance),e.props.attachArray===n&&(t.attachedArray[e.props.attachArray]||(t.attachedArray[e.props.attachArray]=[]),t.attachedArray[e.props.attachArray].push(o),a[n]=[a[n]])}const ye={createElement:(e,t,n,r)=>{const o={type:e};r&&(o.props=r);if(h(e)){const e=function(e={}){const t={domElement:document.createElement(e.type??"")};return new Q.RendererDomNode({...t,...e,metaType:"domMeta"})}(o);return e}const a=_(o);return he.forEach((t=>{e.toLowerCase().endsWith(t)&&(a.props.attach=t)})),a},createText:e=>function(e={}){const t={text:e.text??""};return new Q.RendererTextNode({...e,...t,metaType:"textMeta"})}({text:e}),createComment:e=>function(e={}){const t={text:e.text??""};return new Q.RendererCommentNode({...t,...e,metaType:"commentMeta"})}({text:e}),insert:(e,t,n)=>{let r=t??N();if(r.insertBefore(e,n),"commentMeta"!==e.metaType&&"textMeta"!==e.metaType&&(h(e)&&(h(t)||y(t))&&t.domElement.appendChild(e.domElement),f(e))){let n=r.metaType;if("textMeta"===n||"commentMeta"===n){const e=r.getPath();for(let t=e.length-1;t>=0;t--)if("textMeta"!==e[t].metaType&&"commentMeta"!==e[t].metaType){r=e[t];break}}if("standardMeta"===e.metaType&&"scene"!==e.type&&y(r)){const t=z.value;t.instance&&e&&t.addChild(e),e.instance&&e.instance.isObject3D&&t.instance&&t!==e&&t.instance.add(e.instance)}else f(e)&&e.instance?.isObject3D&&f(r)&&r.instance?.isObject3D&&r.instance?.add?.(e.instance);if(e?.props?.attach&&f(t)&&t?.instance){e.type?.toLowerCase().endsWith("loader")&&e.props.src&&(e.props.attach||e.props.attachArray)?function(e,t){const n=e.instance;if(t.attached=t.attached||{},t.attachedArray=t.attachedArray||{},!e.props.attach)return;if("textureloader"===e.type?.toLowerCase()){const r=n.load(e.props.src);fe(e,t,e.props.attach,r)}else n.load(e.props.src,(n=>{fe(e,t,e.props.attach,n)}),null,(e=>{throw new Error(e)}))}(e,t):fe(e,t,e.props.attach)}e.props?.onAdded&&e.props.onAdded({instance:e.instance})}},nextSibling(e){const t=e.nextSibling;return t||null},parentNode(e){const t=e.parentNode;return t||null},patchProp(e,t,n,o){h(e)?"style"===t?Object.keys(o).forEach((t=>{e.domElement.style[t]=o[t]})):e.domElement.setAttribute(t,o):y(e)||t.startsWith("$")||function({node:e,key:t,value:n}){if((e=>["onClick","onContextMenu","onDoubleClick","onPointerUp","onPointerDown","onPointerOver","onPointerOut","onPointerEnter","onPointerLeave","onPointerMove","onWheel"].includes(e))(t))return b({node:e,key:t,value:n});const o=t.replace(/-/g,"."),a=le[o]||o;if(me.includes(t)||me.includes(a))return e;if(!f(e))return e;if("string"==typeof n&&n.startsWith("$attached")){const t=n.replace("$attached.","");n=r.get(e.attached,t,null)}const s=e.instance;if(!s)return e;let i;for(let e=0;e<pe.length&&!i;e++){const t=[pe[e],a].filter(Boolean).join(".");i=i=r.get(s,t)}if(i&&r.isNumber(n)&&i.setScalar)i.setScalar(n);else if(i&&i.set){const e=Array.isArray(n)?n:[n];s[a].set(...e)}else"function"==typeof i?i.bind(e.instance)(...n):void 0!==r.get(s,a,void 0)?r.set(s,a,""===n||n):console.log(`No property ${a} found on ${s}`);const c=s?.texture?.type||s?.type;if("string"==typeof c){const e=c.toLowerCase();switch(!0){case e.includes("material"):s.needsUpdate=!0;break;case e.includes("camera")&&s.updateProjectionMatrix:s.updateProjectionMatrix()}}}({node:e,key:t,value:o})},remove:e=>{if(!e)return;const t=Object.keys(O),n=[];e.walk((e=>(n.push(e),!0))),n.forEach((e=>{const n=t.find((t=>O[t]?.uuid===e.uuid));if(n&&(O[n]=null),f(e)){e.instance?.removeFromParent?.();const t="scene"!==e.type&&e.instance?.dispose;t&&t.bind(e.instance)(),e.instance=null}e.drop();const r=s.findIndex((t=>t.uuid===e.uuid));-1!==r&&s.splice(r,1)}))},setElementText(){},setText(){}},ve={dpr:t.ref(1),inputActive:g,mousePos:C},ge=t.computed((()=>D.value?.instance??null));const be=t.computed((()=>I.value?.instance??null));const xe=t.computed((()=>z.value.instance));let we=null,Re=null;e.camera=ge,e.clearCustomRender=()=>{we?we.clearCustomRender():Re=null},e.createApp=e=>{we=t.createRenderer(ye).createApp(e),Object.keys(p).forEach((e=>{we?.component(e,p[e])}));const{mount:n}=we;return we.mount=(e,...t)=>{const r=N({domElement:"string"==typeof e?document.querySelector(e):e,isLunchboxRootNode:!0,name:"root",metaType:"rootMeta",type:"root",uuid:"LUNCHBOX_ROOT"});we.rootNode=r;return n(r,...t)},we.extend=e=>((({app:e,...t})=>{Object.keys(t).forEach((n=>{e.component(n,q(n)),d[n]=t[n]}))})({app:we,...e}),we),we.setCustomRender=e=>{we.customRender=e},Re&&(we.setCustomRender(Re),Re=null),we.clearCustomRender=()=>{we.customRender=null},we},e.find=function(e){return e=t.isRef(e)?e.value:e,f(e)?e?.instance:m(e)?e?.$el?.instance:t.isVNode(e)?e.el?.instance:null},e.globals=ve,e.offAfterRender=e=>{if(isFinite(e))se.splice(e,1);else{const t=se.findIndex((t=>t==e));se.splice(t,1)}},e.offBeforeRender=e=>{if(isFinite(e))ae.splice(e,1);else{const t=ae.findIndex((t=>t==e));ae.splice(t,1)}},e.onAfterRender=(e,t=1/0)=>{t===1/0?se.push(e):se.splice(t,0,e)},e.onBeforeRender=(e,t=1/0)=>{t===1/0?ae.push(e):ae.splice(t,0,e)},e.onStart=(e,t=1/0)=>{t===1/0?ne.push(e):ne.splice(t,0,e)},e.renderer=be,e.scene=xe,e.setCustomRender=e=>{we?we.setCustomRender(e):Re=e},e.useCamera=function(e){return t.watch(ge,(t=>{t&&e(t)}),{immediate:!0})},e.useRenderer=function(e){return t.watch(be,(t=>{t&&e(t)}),{immediate:!0})},e.useScene=function(e){return t.watch(xe,(t=>{t&&e(t)}),{immediate:!0})},Object.defineProperty(e,"__esModule",{value:!0})}));
|