@react-three/fiber 9.4.2 → 10.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.cjs +14832 -0
- package/dist/index.d.cts +3350 -0
- package/dist/index.d.mts +3350 -0
- package/dist/index.d.ts +3350 -0
- package/dist/index.mjs +14747 -0
- package/dist/legacy.cjs +14820 -0
- package/dist/legacy.d.cts +3347 -0
- package/dist/legacy.d.mts +3347 -0
- package/dist/legacy.d.ts +3347 -0
- package/dist/legacy.mjs +14735 -0
- package/dist/webgpu/index.cjs +15274 -0
- package/dist/webgpu/index.d.cts +3470 -0
- package/dist/webgpu/index.d.mts +3470 -0
- package/dist/webgpu/index.d.ts +3470 -0
- package/dist/webgpu/index.mjs +15177 -0
- package/package.json +44 -44
- package/react-reconciler/constants.d.ts +7 -0
- package/react-reconciler/constants.js +9 -0
- package/react-reconciler/index.d.ts +1044 -0
- package/react-reconciler/index.js +224 -0
- package/readme.md +98 -33
- package/CHANGELOG.md +0 -1186
- package/dist/declarations/src/core/events.d.ts +0 -92
- package/dist/declarations/src/core/hooks.d.ts +0 -53
- package/dist/declarations/src/core/index.d.ts +0 -13
- package/dist/declarations/src/core/loop.d.ts +0 -31
- package/dist/declarations/src/core/reconciler.d.ts +0 -50
- package/dist/declarations/src/core/renderer.d.ts +0 -89
- package/dist/declarations/src/core/store.d.ts +0 -130
- package/dist/declarations/src/core/utils.d.ts +0 -191
- package/dist/declarations/src/index.d.ts +0 -6
- package/dist/declarations/src/native/Canvas.d.ts +0 -13
- package/dist/declarations/src/native/events.d.ts +0 -4
- package/dist/declarations/src/native.d.ts +0 -6
- package/dist/declarations/src/three-types.d.ts +0 -68
- package/dist/declarations/src/web/Canvas.d.ts +0 -23
- package/dist/declarations/src/web/events.d.ts +0 -4
- package/dist/events-1eccaf1c.esm.js +0 -2510
- package/dist/events-5c8d1731.cjs.prod.js +0 -2569
- package/dist/events-c80effae.cjs.dev.js +0 -2569
- package/dist/react-three-fiber.cjs.d.ts +0 -2
- package/dist/react-three-fiber.cjs.dev.js +0 -222
- package/dist/react-three-fiber.cjs.js +0 -7
- package/dist/react-three-fiber.cjs.prod.js +0 -222
- package/dist/react-three-fiber.esm.js +0 -167
- package/native/dist/react-three-fiber-native.cjs.d.ts +0 -2
- package/native/dist/react-three-fiber-native.cjs.dev.js +0 -569
- package/native/dist/react-three-fiber-native.cjs.js +0 -7
- package/native/dist/react-three-fiber-native.cjs.prod.js +0 -569
- package/native/dist/react-three-fiber-native.esm.js +0 -517
- package/native/package.json +0 -5
|
@@ -1,569 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var events = require('../../dist/events-c80effae.cjs.dev.js');
|
|
6
|
-
var React = require('react');
|
|
7
|
-
var THREE = require('three');
|
|
8
|
-
var reactNative = require('react-native');
|
|
9
|
-
var expoGl = require('expo-gl');
|
|
10
|
-
var itsFine = require('its-fine');
|
|
11
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
12
|
-
var expoAsset = require('expo-asset');
|
|
13
|
-
var base64Js = require('base64-js');
|
|
14
|
-
var buffer = require('buffer');
|
|
15
|
-
require('react-reconciler/constants');
|
|
16
|
-
require('zustand/traditional');
|
|
17
|
-
require('suspend-react');
|
|
18
|
-
require('react-reconciler');
|
|
19
|
-
require('scheduler');
|
|
20
|
-
|
|
21
|
-
function _interopNamespace(e) {
|
|
22
|
-
if (e && e.__esModule) return e;
|
|
23
|
-
var n = Object.create(null);
|
|
24
|
-
if (e) {
|
|
25
|
-
Object.keys(e).forEach(function (k) {
|
|
26
|
-
if (k !== 'default') {
|
|
27
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
28
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
29
|
-
enumerable: true,
|
|
30
|
-
get: function () { return e[k]; }
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
n["default"] = e;
|
|
36
|
-
return Object.freeze(n);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
40
|
-
var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
|
|
41
|
-
|
|
42
|
-
// TODO: React 19 needs support from react-native
|
|
43
|
-
const _View = reactNative.View;
|
|
44
|
-
function CanvasImpl({
|
|
45
|
-
children,
|
|
46
|
-
style,
|
|
47
|
-
gl,
|
|
48
|
-
events: events$1 = events.createPointerEvents,
|
|
49
|
-
shadows,
|
|
50
|
-
linear,
|
|
51
|
-
flat,
|
|
52
|
-
legacy,
|
|
53
|
-
orthographic,
|
|
54
|
-
frameloop,
|
|
55
|
-
performance,
|
|
56
|
-
raycaster,
|
|
57
|
-
camera,
|
|
58
|
-
scene,
|
|
59
|
-
onPointerMissed,
|
|
60
|
-
onCreated,
|
|
61
|
-
ref,
|
|
62
|
-
pointerEvents,
|
|
63
|
-
...props
|
|
64
|
-
}) {
|
|
65
|
-
// Create a known catalogue of Threejs-native elements
|
|
66
|
-
// This will include the entire THREE namespace by default, users can extend
|
|
67
|
-
// their own elements by using the createRoot API instead
|
|
68
|
-
React__namespace.useMemo(() => events.extend(THREE__namespace), []);
|
|
69
|
-
const Bridge = events.useBridge();
|
|
70
|
-
const [{
|
|
71
|
-
width,
|
|
72
|
-
height,
|
|
73
|
-
top,
|
|
74
|
-
left
|
|
75
|
-
}, setSize] = React__namespace.useState({
|
|
76
|
-
width: 0,
|
|
77
|
-
height: 0,
|
|
78
|
-
top: 0,
|
|
79
|
-
left: 0
|
|
80
|
-
});
|
|
81
|
-
const [canvas, setCanvas] = React__namespace.useState(null);
|
|
82
|
-
const [bind, setBind] = React__namespace.useState();
|
|
83
|
-
React__namespace.useImperativeHandle(ref, () => viewRef.current);
|
|
84
|
-
const handlePointerMissed = events.useMutableCallback(onPointerMissed);
|
|
85
|
-
const [block, setBlock] = React__namespace.useState(false);
|
|
86
|
-
const [error, setError] = React__namespace.useState(undefined);
|
|
87
|
-
|
|
88
|
-
// Suspend this component if block is a promise (2nd run)
|
|
89
|
-
if (block) throw block;
|
|
90
|
-
// Throw exception outwards if anything within canvas throws
|
|
91
|
-
if (error) throw error;
|
|
92
|
-
const viewRef = React__namespace.useRef(null);
|
|
93
|
-
const root = React__namespace.useRef(null);
|
|
94
|
-
const [antialias, setAntialias] = React__namespace.useState(true);
|
|
95
|
-
const onLayout = React__namespace.useCallback(e => {
|
|
96
|
-
const {
|
|
97
|
-
width,
|
|
98
|
-
height,
|
|
99
|
-
x,
|
|
100
|
-
y
|
|
101
|
-
} = e.nativeEvent.layout;
|
|
102
|
-
setSize({
|
|
103
|
-
width,
|
|
104
|
-
height,
|
|
105
|
-
top: y,
|
|
106
|
-
left: x
|
|
107
|
-
});
|
|
108
|
-
}, []);
|
|
109
|
-
|
|
110
|
-
// Called on context create or swap
|
|
111
|
-
// https://github.com/pmndrs/react-three-fiber/pull/2297
|
|
112
|
-
const onContextCreate = React__namespace.useCallback(context => {
|
|
113
|
-
const listeners = new Map();
|
|
114
|
-
const canvas = {
|
|
115
|
-
style: {},
|
|
116
|
-
width: context.drawingBufferWidth,
|
|
117
|
-
height: context.drawingBufferHeight,
|
|
118
|
-
clientWidth: context.drawingBufferWidth,
|
|
119
|
-
clientHeight: context.drawingBufferHeight,
|
|
120
|
-
getContext: (_, {
|
|
121
|
-
antialias = false
|
|
122
|
-
}) => {
|
|
123
|
-
setAntialias(antialias);
|
|
124
|
-
return context;
|
|
125
|
-
},
|
|
126
|
-
addEventListener(type, listener) {
|
|
127
|
-
let callbacks = listeners.get(type);
|
|
128
|
-
if (!callbacks) {
|
|
129
|
-
callbacks = [];
|
|
130
|
-
listeners.set(type, callbacks);
|
|
131
|
-
}
|
|
132
|
-
callbacks.push(listener);
|
|
133
|
-
},
|
|
134
|
-
removeEventListener(type, listener) {
|
|
135
|
-
const callbacks = listeners.get(type);
|
|
136
|
-
if (callbacks) {
|
|
137
|
-
const index = callbacks.indexOf(listener);
|
|
138
|
-
if (index !== -1) callbacks.splice(index, 1);
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
dispatchEvent(event) {
|
|
142
|
-
Object.assign(event, {
|
|
143
|
-
target: this
|
|
144
|
-
});
|
|
145
|
-
const callbacks = listeners.get(event.type);
|
|
146
|
-
if (callbacks) {
|
|
147
|
-
for (const callback of callbacks) {
|
|
148
|
-
callback(event);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
setPointerCapture() {
|
|
153
|
-
// TODO
|
|
154
|
-
},
|
|
155
|
-
releasePointerCapture() {
|
|
156
|
-
// TODO
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
// TODO: this is wrong but necessary to trick controls
|
|
161
|
-
// @ts-ignore
|
|
162
|
-
canvas.ownerDocument = canvas;
|
|
163
|
-
canvas.getRootNode = () => canvas;
|
|
164
|
-
root.current = events.createRoot(canvas);
|
|
165
|
-
setCanvas(canvas);
|
|
166
|
-
function handleTouch(gestureEvent, type) {
|
|
167
|
-
gestureEvent.persist();
|
|
168
|
-
canvas.dispatchEvent(Object.assign(gestureEvent.nativeEvent, {
|
|
169
|
-
type,
|
|
170
|
-
offsetX: gestureEvent.nativeEvent.locationX,
|
|
171
|
-
offsetY: gestureEvent.nativeEvent.locationY,
|
|
172
|
-
pointerType: 'touch',
|
|
173
|
-
pointerId: gestureEvent.nativeEvent.identifier
|
|
174
|
-
}));
|
|
175
|
-
return true;
|
|
176
|
-
}
|
|
177
|
-
const responder = reactNative.PanResponder.create({
|
|
178
|
-
onStartShouldSetPanResponder: () => true,
|
|
179
|
-
onMoveShouldSetPanResponder: () => true,
|
|
180
|
-
onMoveShouldSetPanResponderCapture: () => true,
|
|
181
|
-
onPanResponderTerminationRequest: () => true,
|
|
182
|
-
onStartShouldSetPanResponderCapture: e => handleTouch(e, 'pointercapture'),
|
|
183
|
-
onPanResponderStart: e => handleTouch(e, 'pointerdown'),
|
|
184
|
-
onPanResponderMove: e => handleTouch(e, 'pointermove'),
|
|
185
|
-
onPanResponderEnd: (e, state) => {
|
|
186
|
-
handleTouch(e, 'pointerup');
|
|
187
|
-
if (Math.hypot(state.dx, state.dy) < 20) handleTouch(e, 'click');
|
|
188
|
-
},
|
|
189
|
-
onPanResponderRelease: e => handleTouch(e, 'pointerleave'),
|
|
190
|
-
onPanResponderTerminate: e => handleTouch(e, 'lostpointercapture'),
|
|
191
|
-
onPanResponderReject: e => handleTouch(e, 'lostpointercapture')
|
|
192
|
-
});
|
|
193
|
-
setBind(responder.panHandlers);
|
|
194
|
-
}, []);
|
|
195
|
-
events.useIsomorphicLayoutEffect(() => {
|
|
196
|
-
if (root.current && width > 0 && height > 0) {
|
|
197
|
-
async function run() {
|
|
198
|
-
await root.current.configure({
|
|
199
|
-
gl,
|
|
200
|
-
events: events$1,
|
|
201
|
-
shadows,
|
|
202
|
-
linear,
|
|
203
|
-
flat,
|
|
204
|
-
legacy,
|
|
205
|
-
orthographic,
|
|
206
|
-
frameloop,
|
|
207
|
-
performance,
|
|
208
|
-
raycaster,
|
|
209
|
-
camera,
|
|
210
|
-
scene,
|
|
211
|
-
// expo-gl can only render at native dpr/resolution
|
|
212
|
-
// https://github.com/expo/expo-three/issues/39
|
|
213
|
-
dpr: reactNative.PixelRatio.get(),
|
|
214
|
-
size: {
|
|
215
|
-
width,
|
|
216
|
-
height,
|
|
217
|
-
top,
|
|
218
|
-
left
|
|
219
|
-
},
|
|
220
|
-
// Pass mutable reference to onPointerMissed so it's free to update
|
|
221
|
-
onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
|
|
222
|
-
// Overwrite onCreated to apply RN bindings
|
|
223
|
-
onCreated: state => {
|
|
224
|
-
// Bind render to RN bridge
|
|
225
|
-
const context = state.gl.getContext();
|
|
226
|
-
const renderFrame = state.gl.render.bind(state.gl);
|
|
227
|
-
state.gl.render = (scene, camera) => {
|
|
228
|
-
renderFrame(scene, camera);
|
|
229
|
-
context.endFrameEXP();
|
|
230
|
-
};
|
|
231
|
-
return onCreated == null ? void 0 : onCreated(state);
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
root.current.render( /*#__PURE__*/jsxRuntime.jsx(Bridge, {
|
|
235
|
-
children: /*#__PURE__*/jsxRuntime.jsx(events.ErrorBoundary, {
|
|
236
|
-
set: setError,
|
|
237
|
-
children: /*#__PURE__*/jsxRuntime.jsx(React__namespace.Suspense, {
|
|
238
|
-
fallback: /*#__PURE__*/jsxRuntime.jsx(events.Block, {
|
|
239
|
-
set: setBlock
|
|
240
|
-
}),
|
|
241
|
-
children: children != null ? children : null
|
|
242
|
-
})
|
|
243
|
-
})
|
|
244
|
-
}));
|
|
245
|
-
}
|
|
246
|
-
run();
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
React__namespace.useEffect(() => {
|
|
250
|
-
if (canvas) {
|
|
251
|
-
return () => events.unmountComponentAtNode(canvas);
|
|
252
|
-
}
|
|
253
|
-
}, [canvas]);
|
|
254
|
-
return /*#__PURE__*/jsxRuntime.jsxs(_View, {
|
|
255
|
-
...props,
|
|
256
|
-
ref: viewRef,
|
|
257
|
-
onLayout: onLayout,
|
|
258
|
-
style: {
|
|
259
|
-
flex: 1,
|
|
260
|
-
...style
|
|
261
|
-
},
|
|
262
|
-
children: [width > 0 && /*#__PURE__*/jsxRuntime.jsx(expoGl.GLView, {
|
|
263
|
-
msaaSamples: antialias ? 4 : 0,
|
|
264
|
-
onContextCreate: onContextCreate,
|
|
265
|
-
style: reactNative.StyleSheet.absoluteFill
|
|
266
|
-
}), /*#__PURE__*/jsxRuntime.jsx(_View, {
|
|
267
|
-
style: reactNative.StyleSheet.absoluteFill,
|
|
268
|
-
pointerEvents: pointerEvents,
|
|
269
|
-
...bind
|
|
270
|
-
})]
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
/**
|
|
275
|
-
* A native canvas which accepts threejs elements as children.
|
|
276
|
-
* @see https://docs.pmnd.rs/react-three-fiber/api/canvas
|
|
277
|
-
*/
|
|
278
|
-
function Canvas(props) {
|
|
279
|
-
return /*#__PURE__*/jsxRuntime.jsx(itsFine.FiberProvider, {
|
|
280
|
-
children: /*#__PURE__*/jsxRuntime.jsx(CanvasImpl, {
|
|
281
|
-
...props
|
|
282
|
-
})
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/** Default R3F event manager for react-native */
|
|
287
|
-
function createTouchEvents(store) {
|
|
288
|
-
const {
|
|
289
|
-
handlePointer
|
|
290
|
-
} = events.createEvents(store);
|
|
291
|
-
const handleTouch = (event, name) => {
|
|
292
|
-
event.persist()
|
|
293
|
-
|
|
294
|
-
// Apply offset
|
|
295
|
-
;
|
|
296
|
-
event.nativeEvent.offsetX = event.nativeEvent.locationX;
|
|
297
|
-
event.nativeEvent.offsetY = event.nativeEvent.locationY;
|
|
298
|
-
|
|
299
|
-
// Emulate DOM event
|
|
300
|
-
const callback = handlePointer(name);
|
|
301
|
-
callback(event.nativeEvent);
|
|
302
|
-
return true;
|
|
303
|
-
};
|
|
304
|
-
const responder = reactNative.PanResponder.create({
|
|
305
|
-
onStartShouldSetPanResponder: () => true,
|
|
306
|
-
onMoveShouldSetPanResponder: () => true,
|
|
307
|
-
onMoveShouldSetPanResponderCapture: () => true,
|
|
308
|
-
onPanResponderTerminationRequest: () => true,
|
|
309
|
-
onStartShouldSetPanResponderCapture: e => handleTouch(e, 'onPointerCapture'),
|
|
310
|
-
onPanResponderStart: e => handleTouch(e, 'onPointerDown'),
|
|
311
|
-
onPanResponderMove: e => handleTouch(e, 'onPointerMove'),
|
|
312
|
-
onPanResponderEnd: (e, state) => {
|
|
313
|
-
handleTouch(e, 'onPointerUp');
|
|
314
|
-
if (Math.hypot(state.dx, state.dy) < 20) handleTouch(e, 'onClick');
|
|
315
|
-
},
|
|
316
|
-
onPanResponderRelease: e => handleTouch(e, 'onPointerLeave'),
|
|
317
|
-
onPanResponderTerminate: e => handleTouch(e, 'onLostPointerCapture'),
|
|
318
|
-
onPanResponderReject: e => handleTouch(e, 'onLostPointerCapture')
|
|
319
|
-
});
|
|
320
|
-
return {
|
|
321
|
-
priority: 1,
|
|
322
|
-
enabled: true,
|
|
323
|
-
compute(event, state, previous) {
|
|
324
|
-
// https://github.com/pmndrs/react-three-fiber/pull/782
|
|
325
|
-
// Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
|
|
326
|
-
state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
|
|
327
|
-
state.raycaster.setFromCamera(state.pointer, state.camera);
|
|
328
|
-
},
|
|
329
|
-
connected: undefined,
|
|
330
|
-
handlers: responder.panHandlers,
|
|
331
|
-
update: () => {
|
|
332
|
-
var _internal$lastEvent;
|
|
333
|
-
const {
|
|
334
|
-
events,
|
|
335
|
-
internal
|
|
336
|
-
} = store.getState();
|
|
337
|
-
if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) {
|
|
338
|
-
handlePointer('onPointerMove')(internal.lastEvent.current);
|
|
339
|
-
}
|
|
340
|
-
},
|
|
341
|
-
connect: () => {
|
|
342
|
-
const {
|
|
343
|
-
set,
|
|
344
|
-
events
|
|
345
|
-
} = store.getState();
|
|
346
|
-
events.disconnect == null ? void 0 : events.disconnect();
|
|
347
|
-
set(state => ({
|
|
348
|
-
events: {
|
|
349
|
-
...state.events,
|
|
350
|
-
connected: true
|
|
351
|
-
}
|
|
352
|
-
}));
|
|
353
|
-
},
|
|
354
|
-
disconnect: () => {
|
|
355
|
-
const {
|
|
356
|
-
set
|
|
357
|
-
} = store.getState();
|
|
358
|
-
set(state => ({
|
|
359
|
-
events: {
|
|
360
|
-
...state.events,
|
|
361
|
-
connected: false
|
|
362
|
-
}
|
|
363
|
-
}));
|
|
364
|
-
}
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// Conditionally import expo-file-system/legacy to support Expo 54
|
|
369
|
-
const getFileSystem = () => {
|
|
370
|
-
try {
|
|
371
|
-
return require('expo-file-system/legacy');
|
|
372
|
-
} catch {
|
|
373
|
-
return require('expo-file-system');
|
|
374
|
-
}
|
|
375
|
-
};
|
|
376
|
-
const fs = getFileSystem();
|
|
377
|
-
|
|
378
|
-
// http://stackoverflow.com/questions/105034
|
|
379
|
-
function uuidv4() {
|
|
380
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
|
|
381
|
-
const r = Math.random() * 16 | 0,
|
|
382
|
-
v = c == 'x' ? r : r & 0x3 | 0x8;
|
|
383
|
-
return v.toString(16);
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
async function getAsset(input) {
|
|
387
|
-
if (typeof input === 'string') {
|
|
388
|
-
var _NativeModules$BlobMo;
|
|
389
|
-
// Don't process storage
|
|
390
|
-
if (input.startsWith('file:')) return input;
|
|
391
|
-
|
|
392
|
-
// Unpack Blobs from react-native BlobManager
|
|
393
|
-
// https://github.com/facebook/react-native/issues/22681#issuecomment-523258955
|
|
394
|
-
if (input.startsWith('blob:') || input.startsWith((_NativeModules$BlobMo = reactNative.NativeModules.BlobModule) == null ? void 0 : _NativeModules$BlobMo.BLOB_URI_SCHEME)) {
|
|
395
|
-
const blob = await new Promise((res, rej) => {
|
|
396
|
-
const xhr = new XMLHttpRequest();
|
|
397
|
-
xhr.open('GET', input);
|
|
398
|
-
xhr.responseType = 'blob';
|
|
399
|
-
xhr.onload = () => res(xhr.response);
|
|
400
|
-
xhr.onerror = rej;
|
|
401
|
-
xhr.send();
|
|
402
|
-
});
|
|
403
|
-
const data = await new Promise((res, rej) => {
|
|
404
|
-
const reader = new FileReader();
|
|
405
|
-
reader.onload = () => res(reader.result);
|
|
406
|
-
reader.onerror = rej;
|
|
407
|
-
reader.readAsText(blob);
|
|
408
|
-
});
|
|
409
|
-
input = `data:${blob.type};base64,${data}`;
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
// Create safe URI for JSI serialization
|
|
413
|
-
if (input.startsWith('data:')) {
|
|
414
|
-
const [header, data] = input.split(';base64,');
|
|
415
|
-
const [, type] = header.split('/');
|
|
416
|
-
const uri = fs.cacheDirectory + uuidv4() + `.${type}`;
|
|
417
|
-
await fs.writeAsStringAsync(uri, data, {
|
|
418
|
-
encoding: fs.EncodingType.Base64
|
|
419
|
-
});
|
|
420
|
-
return uri;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
// Download bundler module or external URL
|
|
425
|
-
const asset = await expoAsset.Asset.fromModule(input).downloadAsync();
|
|
426
|
-
let uri = asset.localUri || asset.uri;
|
|
427
|
-
|
|
428
|
-
// Unpack assets in Android Release Mode
|
|
429
|
-
if (!uri.includes(':')) {
|
|
430
|
-
const file = `${fs.cacheDirectory}ExponentAsset-${asset.hash}.${asset.type}`;
|
|
431
|
-
await fs.copyAsync({
|
|
432
|
-
from: uri,
|
|
433
|
-
to: file
|
|
434
|
-
});
|
|
435
|
-
uri = file;
|
|
436
|
-
}
|
|
437
|
-
return uri;
|
|
438
|
-
}
|
|
439
|
-
function polyfills() {
|
|
440
|
-
// Patch Blob for ArrayBuffer and URL if unsupported
|
|
441
|
-
// https://github.com/facebook/react-native/pull/39276
|
|
442
|
-
// https://github.com/pmndrs/react-three-fiber/issues/3058
|
|
443
|
-
if (reactNative.Platform.OS !== 'web') {
|
|
444
|
-
try {
|
|
445
|
-
const blob = new Blob([new ArrayBuffer(4)]);
|
|
446
|
-
const url = URL.createObjectURL(blob);
|
|
447
|
-
URL.revokeObjectURL(url);
|
|
448
|
-
} catch (_) {
|
|
449
|
-
var _BlobManagerModule$de;
|
|
450
|
-
const BlobManagerModule = require('react-native/Libraries/Blob/BlobManager.js');
|
|
451
|
-
const BlobManager = (_BlobManagerModule$de = BlobManagerModule.default) != null ? _BlobManagerModule$de : BlobManagerModule;
|
|
452
|
-
const createObjectURL = URL.createObjectURL;
|
|
453
|
-
URL.createObjectURL = function (blob) {
|
|
454
|
-
if (blob.data._base64) {
|
|
455
|
-
return `data:${blob.type};base64,${blob.data._base64}`;
|
|
456
|
-
}
|
|
457
|
-
return createObjectURL(blob);
|
|
458
|
-
};
|
|
459
|
-
const createFromParts = BlobManager.createFromParts;
|
|
460
|
-
BlobManager.createFromParts = function (parts, options) {
|
|
461
|
-
parts = parts.map(part => {
|
|
462
|
-
if (part instanceof ArrayBuffer || ArrayBuffer.isView(part)) {
|
|
463
|
-
part = base64Js.fromByteArray(new Uint8Array(part));
|
|
464
|
-
}
|
|
465
|
-
return part;
|
|
466
|
-
});
|
|
467
|
-
const blob = createFromParts(parts, options);
|
|
468
|
-
|
|
469
|
-
// Always enable slow but safe path for iOS (previously for Android unauth)
|
|
470
|
-
// https://github.com/pmndrs/react-three-fiber/issues/3075
|
|
471
|
-
// if (!NativeModules.BlobModule?.BLOB_URI_SCHEME) {
|
|
472
|
-
blob.data._base64 = '';
|
|
473
|
-
for (const part of parts) {
|
|
474
|
-
var _data$_base, _data;
|
|
475
|
-
blob.data._base64 += (_data$_base = (_data = part.data) == null ? void 0 : _data._base64) != null ? _data$_base : part;
|
|
476
|
-
}
|
|
477
|
-
// }
|
|
478
|
-
|
|
479
|
-
return blob;
|
|
480
|
-
};
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
// Don't pre-process urls, let expo-asset generate an absolute URL
|
|
485
|
-
const extractUrlBase = THREE__namespace.LoaderUtils.extractUrlBase.bind(THREE__namespace.LoaderUtils);
|
|
486
|
-
THREE__namespace.LoaderUtils.extractUrlBase = url => typeof url === 'string' ? extractUrlBase(url) : './';
|
|
487
|
-
|
|
488
|
-
// There's no Image in native, so create a data texture instead
|
|
489
|
-
THREE__namespace.TextureLoader.prototype.load = function load(url, onLoad, onProgress, onError) {
|
|
490
|
-
if (this.path && typeof url === 'string') url = this.path + url;
|
|
491
|
-
const texture = new THREE__namespace.Texture();
|
|
492
|
-
getAsset(url).then(async uri => {
|
|
493
|
-
// https://github.com/expo/expo-three/pull/266
|
|
494
|
-
const {
|
|
495
|
-
width,
|
|
496
|
-
height
|
|
497
|
-
} = await new Promise((res, rej) => reactNative.Image.getSize(uri, (width, height) => res({
|
|
498
|
-
width,
|
|
499
|
-
height
|
|
500
|
-
}), rej));
|
|
501
|
-
texture.image = {
|
|
502
|
-
// Special case for EXGLImageUtils::loadImage
|
|
503
|
-
data: {
|
|
504
|
-
localUri: uri
|
|
505
|
-
},
|
|
506
|
-
width,
|
|
507
|
-
height
|
|
508
|
-
};
|
|
509
|
-
texture.flipY = true; // Since expo-gl@12.4.0
|
|
510
|
-
texture.needsUpdate = true;
|
|
511
|
-
|
|
512
|
-
// Force non-DOM upload for EXGL texImage2D
|
|
513
|
-
// @ts-expect-error
|
|
514
|
-
texture.isDataTexture = true;
|
|
515
|
-
onLoad == null ? void 0 : onLoad(texture);
|
|
516
|
-
}).catch(onError);
|
|
517
|
-
return texture;
|
|
518
|
-
};
|
|
519
|
-
|
|
520
|
-
// Fetches assets via FS
|
|
521
|
-
THREE__namespace.FileLoader.prototype.load = function load(url, onLoad, onProgress, onError) {
|
|
522
|
-
if (this.path && typeof url === 'string') url = this.path + url;
|
|
523
|
-
this.manager.itemStart(url);
|
|
524
|
-
getAsset(url).then(async uri => {
|
|
525
|
-
const base64 = await fs.readAsStringAsync(uri, {
|
|
526
|
-
encoding: fs.EncodingType.Base64
|
|
527
|
-
});
|
|
528
|
-
const data = buffer.Buffer.from(base64, 'base64');
|
|
529
|
-
onLoad == null ? void 0 : onLoad(data.buffer);
|
|
530
|
-
}).catch(error => {
|
|
531
|
-
onError == null ? void 0 : onError(error);
|
|
532
|
-
this.manager.itemError(url);
|
|
533
|
-
}).finally(() => {
|
|
534
|
-
this.manager.itemEnd(url);
|
|
535
|
-
});
|
|
536
|
-
};
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
if (reactNative.Platform.OS !== 'web') polyfills();
|
|
540
|
-
|
|
541
|
-
exports.ReactThreeFiber = events.threeTypes;
|
|
542
|
-
exports._roots = events._roots;
|
|
543
|
-
exports.act = events.act;
|
|
544
|
-
exports.addAfterEffect = events.addAfterEffect;
|
|
545
|
-
exports.addEffect = events.addEffect;
|
|
546
|
-
exports.addTail = events.addTail;
|
|
547
|
-
exports.advance = events.advance;
|
|
548
|
-
exports.applyProps = events.applyProps;
|
|
549
|
-
exports.buildGraph = events.buildGraph;
|
|
550
|
-
exports.context = events.context;
|
|
551
|
-
exports.createEvents = events.createEvents;
|
|
552
|
-
exports.createPortal = events.createPortal;
|
|
553
|
-
exports.createRoot = events.createRoot;
|
|
554
|
-
exports.dispose = events.dispose;
|
|
555
|
-
exports.extend = events.extend;
|
|
556
|
-
exports.flushGlobalEffects = events.flushGlobalEffects;
|
|
557
|
-
exports.flushSync = events.flushSync;
|
|
558
|
-
exports.getRootState = events.getRootState;
|
|
559
|
-
exports.invalidate = events.invalidate;
|
|
560
|
-
exports.reconciler = events.reconciler;
|
|
561
|
-
exports.unmountComponentAtNode = events.unmountComponentAtNode;
|
|
562
|
-
exports.useFrame = events.useFrame;
|
|
563
|
-
exports.useGraph = events.useGraph;
|
|
564
|
-
exports.useInstanceHandle = events.useInstanceHandle;
|
|
565
|
-
exports.useLoader = events.useLoader;
|
|
566
|
-
exports.useStore = events.useStore;
|
|
567
|
-
exports.useThree = events.useThree;
|
|
568
|
-
exports.Canvas = Canvas;
|
|
569
|
-
exports.events = createTouchEvents;
|