@react-three/fiber 8.0.0-alpha-09 → 8.0.0-beta-03
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/CHANGELOG.md +97 -0
- package/dist/declarations/src/core/events.d.ts +63 -59
- package/dist/declarations/src/core/hooks.d.ts +21 -29
- package/dist/declarations/src/core/loop.d.ts +12 -12
- package/dist/declarations/src/core/renderer.d.ts +50 -51
- package/dist/declarations/src/core/store.d.ts +117 -106
- package/dist/declarations/src/core/utils.d.ts +50 -27
- package/dist/declarations/src/index.d.ts +8 -7
- package/dist/declarations/src/native/Canvas.d.ts +16 -0
- package/dist/declarations/src/native/events.d.ts +6 -0
- package/dist/declarations/src/native/hooks.d.ts +9 -0
- package/dist/declarations/src/native/index.d.ts +36 -0
- package/dist/declarations/src/native.d.ts +8 -0
- package/dist/declarations/src/three-types.d.ts +309 -319
- package/dist/declarations/src/web/Canvas.d.ts +13 -13
- package/dist/declarations/src/web/events.d.ts +5 -5
- package/dist/declarations/src/web/index.d.ts +33 -30
- package/dist/hooks-15c12e3e.esm.js +1539 -0
- package/dist/hooks-6526f63c.cjs.dev.js +1589 -0
- package/dist/hooks-7b7e01e6.cjs.prod.js +1589 -0
- package/dist/react-three-fiber.cjs.dev.js +261 -1596
- package/dist/react-three-fiber.cjs.prod.js +261 -1596
- package/dist/react-three-fiber.esm.js +222 -1554
- package/native/dist/react-three-fiber-native.cjs.d.ts +1 -0
- package/native/dist/react-three-fiber-native.cjs.dev.js +589 -0
- package/native/dist/react-three-fiber-native.cjs.js +7 -0
- package/native/dist/react-three-fiber-native.cjs.prod.js +589 -0
- package/native/dist/react-three-fiber-native.esm.js +537 -0
- package/native/package.json +5 -0
- package/package.json +18 -8
- package/readme.md +10 -10
- package/__mocks__/react-use-measure/index.ts +0 -22
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../dist/declarations/src/native";
|
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var hooks = require('../../dist/hooks-6526f63c.cjs.dev.js');
|
|
6
|
+
var _extends = require('@babel/runtime/helpers/extends');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
var THREE = require('three');
|
|
9
|
+
var reactNative = require('react-native');
|
|
10
|
+
var expoGl = require('expo-gl');
|
|
11
|
+
var constants = require('react-reconciler/constants');
|
|
12
|
+
var Pressability = require('react-native/Libraries/Pressability/Pressability');
|
|
13
|
+
var expoAsset = require('expo-asset');
|
|
14
|
+
var expoFileSystem = require('expo-file-system');
|
|
15
|
+
var base64Arraybuffer = require('base64-arraybuffer');
|
|
16
|
+
var suspendReact = require('suspend-react');
|
|
17
|
+
require('react-reconciler');
|
|
18
|
+
require('scheduler');
|
|
19
|
+
require('zustand');
|
|
20
|
+
|
|
21
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
|
|
22
|
+
|
|
23
|
+
function _interopNamespace(e) {
|
|
24
|
+
if (e && e.__esModule) return e;
|
|
25
|
+
var n = Object.create(null);
|
|
26
|
+
if (e) {
|
|
27
|
+
Object.keys(e).forEach(function (k) {
|
|
28
|
+
if (k !== 'default') {
|
|
29
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
30
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () {
|
|
33
|
+
return e[k];
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
n['default'] = e;
|
|
40
|
+
return Object.freeze(n);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
44
|
+
var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
|
|
45
|
+
var Pressability__default = /*#__PURE__*/_interopDefault(Pressability);
|
|
46
|
+
|
|
47
|
+
// @ts-ignore
|
|
48
|
+
const EVENTS = {
|
|
49
|
+
PRESS: 'onPress',
|
|
50
|
+
PRESSIN: 'onPressIn',
|
|
51
|
+
PRESSOUT: 'onPressOut',
|
|
52
|
+
LONGPRESS: 'onLongPress',
|
|
53
|
+
HOVERIN: 'onHoverIn',
|
|
54
|
+
HOVEROUT: 'onHoverOut',
|
|
55
|
+
PRESSMOVE: 'onPressMove'
|
|
56
|
+
};
|
|
57
|
+
const DOM_EVENTS = {
|
|
58
|
+
[EVENTS.PRESS]: 'onClick',
|
|
59
|
+
[EVENTS.PRESSIN]: 'onPointerDown',
|
|
60
|
+
[EVENTS.PRESSOUT]: 'onPointerUp',
|
|
61
|
+
[EVENTS.LONGPRESS]: 'onDoubleClick',
|
|
62
|
+
[EVENTS.HOVERIN]: 'onPointerOver',
|
|
63
|
+
[EVENTS.HOVEROUT]: 'onPointerOut',
|
|
64
|
+
[EVENTS.PRESSMOVE]: 'onPointerMove'
|
|
65
|
+
}; // https://github.com/facebook/react/tree/main/packages/react-reconciler#getcurrenteventpriority
|
|
66
|
+
// Gives React a clue as to how import the current interaction is
|
|
67
|
+
|
|
68
|
+
function getEventPriority() {
|
|
69
|
+
var _window, _window$event;
|
|
70
|
+
|
|
71
|
+
let name = (_window = window) == null ? void 0 : (_window$event = _window.event) == null ? void 0 : _window$event.type;
|
|
72
|
+
|
|
73
|
+
switch (name) {
|
|
74
|
+
case EVENTS.PRESS:
|
|
75
|
+
case EVENTS.PRESSIN:
|
|
76
|
+
case EVENTS.PRESSOUT:
|
|
77
|
+
case EVENTS.LONGPRESS:
|
|
78
|
+
return constants.DiscreteEventPriority;
|
|
79
|
+
|
|
80
|
+
case EVENTS.HOVERIN:
|
|
81
|
+
case EVENTS.HOVEROUT:
|
|
82
|
+
case EVENTS.PRESSMOVE:
|
|
83
|
+
return constants.ContinuousEventPriority;
|
|
84
|
+
|
|
85
|
+
default:
|
|
86
|
+
return constants.DefaultEventPriority;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function createTouchEvents(store) {
|
|
90
|
+
const {
|
|
91
|
+
handlePointer
|
|
92
|
+
} = hooks.createEvents(store);
|
|
93
|
+
|
|
94
|
+
const handleTouch = (event, name) => {
|
|
95
|
+
event.persist() // Apply offset
|
|
96
|
+
;
|
|
97
|
+
event.nativeEvent.offsetX = event.nativeEvent.pageX;
|
|
98
|
+
event.nativeEvent.offsetY = event.nativeEvent.pageY; // Emulate DOM event
|
|
99
|
+
|
|
100
|
+
const callback = handlePointer(DOM_EVENTS[name]);
|
|
101
|
+
return callback(event.nativeEvent);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
connected: false,
|
|
106
|
+
handlers: Object.values(EVENTS).reduce((acc, name) => ({ ...acc,
|
|
107
|
+
[name]: event => handleTouch(event, name)
|
|
108
|
+
}), {}),
|
|
109
|
+
connect: () => {
|
|
110
|
+
const {
|
|
111
|
+
set,
|
|
112
|
+
events
|
|
113
|
+
} = store.getState();
|
|
114
|
+
events.disconnect == null ? void 0 : events.disconnect();
|
|
115
|
+
const manager = new Pressability__default['default'](events == null ? void 0 : events.handlers);
|
|
116
|
+
set(state => ({
|
|
117
|
+
events: { ...state.events,
|
|
118
|
+
connected: manager
|
|
119
|
+
}
|
|
120
|
+
}));
|
|
121
|
+
},
|
|
122
|
+
disconnect: () => {
|
|
123
|
+
const {
|
|
124
|
+
set,
|
|
125
|
+
events
|
|
126
|
+
} = store.getState();
|
|
127
|
+
|
|
128
|
+
if (events.connected) {
|
|
129
|
+
events.connected.reset();
|
|
130
|
+
set(state => ({
|
|
131
|
+
events: { ...state.events,
|
|
132
|
+
connected: false
|
|
133
|
+
}
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Generates an asset based on input type.
|
|
142
|
+
*/
|
|
143
|
+
|
|
144
|
+
const getAsset = input => {
|
|
145
|
+
if (input instanceof expoAsset.Asset) return input;
|
|
146
|
+
|
|
147
|
+
switch (typeof input) {
|
|
148
|
+
case 'string':
|
|
149
|
+
return expoAsset.Asset.fromURI(input);
|
|
150
|
+
|
|
151
|
+
case 'number':
|
|
152
|
+
return expoAsset.Asset.fromModule(input);
|
|
153
|
+
|
|
154
|
+
default:
|
|
155
|
+
throw 'Invalid asset! Must be a URI or module.';
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* Downloads from a local URI and decodes into an ArrayBuffer.
|
|
160
|
+
*/
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
const toBuffer = async localUri => expoFileSystem.readAsStringAsync(localUri, {
|
|
164
|
+
encoding: 'base64'
|
|
165
|
+
}).then(base64Arraybuffer.decode);
|
|
166
|
+
|
|
167
|
+
function loadingFn(extensions, onProgress) {
|
|
168
|
+
return function (Proto, ...input) {
|
|
169
|
+
// Construct new loader and run extensions
|
|
170
|
+
const loader = new Proto();
|
|
171
|
+
if (extensions) extensions(loader); // Go through the urls and load them
|
|
172
|
+
|
|
173
|
+
return Promise.all(input.map(entry => new Promise(async (res, reject) => {
|
|
174
|
+
// Construct URL
|
|
175
|
+
const url = typeof entry === 'string' ? loader.path + entry : entry; // There's no Image in native, so we create & pass a data texture instead
|
|
176
|
+
|
|
177
|
+
if (loader instanceof THREE__namespace.TextureLoader) {
|
|
178
|
+
const asset = await getAsset(url).downloadAsync();
|
|
179
|
+
const texture = new THREE__namespace.Texture();
|
|
180
|
+
texture.isDataTexture = true;
|
|
181
|
+
texture.image = {
|
|
182
|
+
data: asset,
|
|
183
|
+
width: asset.width,
|
|
184
|
+
height: asset.height
|
|
185
|
+
};
|
|
186
|
+
texture.needsUpdate = true;
|
|
187
|
+
return res(texture);
|
|
188
|
+
} // Do similar for CubeTextures
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
if (loader instanceof THREE__namespace.CubeTextureLoader) {
|
|
192
|
+
const texture = new THREE__namespace.CubeTexture();
|
|
193
|
+
texture.isDataTexture = true;
|
|
194
|
+
texture.images = await Promise.all(url.map(async src => {
|
|
195
|
+
const asset = await getAsset(src).downloadAsync();
|
|
196
|
+
return {
|
|
197
|
+
data: asset,
|
|
198
|
+
width: asset.width,
|
|
199
|
+
height: asset.height
|
|
200
|
+
};
|
|
201
|
+
}));
|
|
202
|
+
texture.needsUpdate = true;
|
|
203
|
+
return res(texture);
|
|
204
|
+
} // If asset is external and not an Image, load it
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
if (url.startsWith != null && url.startsWith('http') && Proto.prototype.hasOwnProperty('load')) {
|
|
208
|
+
return loader.load(entry, data => {
|
|
209
|
+
if (data.scene) Object.assign(data, hooks.buildGraph(data.scene));
|
|
210
|
+
res(data);
|
|
211
|
+
}, onProgress, error => reject(`Could not load ${url}: ${error.message}`));
|
|
212
|
+
} // Otherwise, create a localUri and a file buffer
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
const {
|
|
216
|
+
localUri
|
|
217
|
+
} = await getAsset(url).downloadAsync();
|
|
218
|
+
const arrayBuffer = await toBuffer(localUri); // Parse it
|
|
219
|
+
|
|
220
|
+
const parsed = loader.parse == null ? void 0 : loader.parse(arrayBuffer, undefined, data => {
|
|
221
|
+
if (data.scene) Object.assign(data, hooks.buildGraph(data.scene));
|
|
222
|
+
res(data);
|
|
223
|
+
}, error => reject(`Could not load ${url}: ${error.message}`)); // Respect synchronous parsers which don't have callbacks
|
|
224
|
+
|
|
225
|
+
if (parsed) return res(parsed);
|
|
226
|
+
})));
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function useLoader(Proto, input, extensions, onProgress) {
|
|
231
|
+
// Use suspense to load async assets
|
|
232
|
+
const keys = Array.isArray(input) ? input : [input];
|
|
233
|
+
const results = suspendReact.suspend(loadingFn(extensions, onProgress), [Proto, ...keys], {
|
|
234
|
+
equal: hooks.is.equ
|
|
235
|
+
}); // Return the object/s
|
|
236
|
+
|
|
237
|
+
return Array.isArray(input) ? results : results[0];
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
useLoader.preload = function (Proto, input, extensions) {
|
|
241
|
+
const keys = Array.isArray(input) ? input : [input];
|
|
242
|
+
return suspendReact.preload(loadingFn(extensions), [Proto, ...keys]);
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
useLoader.clear = function (Proto, input) {
|
|
246
|
+
const keys = Array.isArray(input) ? input : [input];
|
|
247
|
+
return suspendReact.clear([Proto, ...keys]);
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
const roots = new Map();
|
|
251
|
+
const {
|
|
252
|
+
invalidate,
|
|
253
|
+
advance
|
|
254
|
+
} = hooks.createLoop(roots);
|
|
255
|
+
const {
|
|
256
|
+
reconciler,
|
|
257
|
+
applyProps
|
|
258
|
+
} = hooks.createRenderer(roots, getEventPriority);
|
|
259
|
+
|
|
260
|
+
const createRendererInstance = (gl, context) => {
|
|
261
|
+
// Create canvas shim
|
|
262
|
+
const canvas = {
|
|
263
|
+
width: context.drawingBufferWidth,
|
|
264
|
+
height: context.drawingBufferHeight,
|
|
265
|
+
style: {},
|
|
266
|
+
addEventListener: () => {},
|
|
267
|
+
removeEventListener: () => {},
|
|
268
|
+
clientHeight: context.drawingBufferHeight
|
|
269
|
+
}; // If a renderer is specified, return it
|
|
270
|
+
|
|
271
|
+
const customRenderer = typeof gl === 'function' ? gl(canvas, context) : gl;
|
|
272
|
+
if (hooks.isRenderer(customRenderer)) return customRenderer; // Create renderer and pass our canvas and its context
|
|
273
|
+
|
|
274
|
+
const renderer = new THREE__namespace.WebGLRenderer({
|
|
275
|
+
powerPreference: 'high-performance',
|
|
276
|
+
antialias: true,
|
|
277
|
+
alpha: true,
|
|
278
|
+
...gl,
|
|
279
|
+
canvas,
|
|
280
|
+
context
|
|
281
|
+
}); // Set color management
|
|
282
|
+
|
|
283
|
+
renderer.outputEncoding = THREE__namespace.sRGBEncoding;
|
|
284
|
+
renderer.toneMapping = THREE__namespace.ACESFilmicToneMapping; // Set GL props
|
|
285
|
+
|
|
286
|
+
if (gl) applyProps(renderer, gl); // Bind render to RN bridge
|
|
287
|
+
|
|
288
|
+
if (context.endFrameEXP) {
|
|
289
|
+
const renderFrame = renderer.render.bind(renderer);
|
|
290
|
+
|
|
291
|
+
renderer.render = (scene, camera) => {
|
|
292
|
+
renderFrame(scene, camera);
|
|
293
|
+
context.endFrameEXP();
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return renderer;
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
function createRoot(context, config) {
|
|
301
|
+
return {
|
|
302
|
+
render: element => {
|
|
303
|
+
var _store;
|
|
304
|
+
|
|
305
|
+
let {
|
|
306
|
+
gl,
|
|
307
|
+
size = {
|
|
308
|
+
width: 0,
|
|
309
|
+
height: 0
|
|
310
|
+
},
|
|
311
|
+
events,
|
|
312
|
+
onCreated,
|
|
313
|
+
...props
|
|
314
|
+
} = config || {};
|
|
315
|
+
let root = roots.get(context);
|
|
316
|
+
let fiber = root == null ? void 0 : root.fiber;
|
|
317
|
+
let store = root == null ? void 0 : root.store;
|
|
318
|
+
let state = (_store = store) == null ? void 0 : _store.getState();
|
|
319
|
+
|
|
320
|
+
if (fiber && state) {
|
|
321
|
+
// When a root was found, see if any fundamental props must be changed or exchanged
|
|
322
|
+
// Check size
|
|
323
|
+
if (state.size.width !== size.width || state.size.height !== size.height) state.setSize(size.width, size.height); // Check frameloop
|
|
324
|
+
|
|
325
|
+
if (state.frameloop !== props.frameloop) state.setFrameloop(props.frameloop); // For some props we want to reset the entire root
|
|
326
|
+
// Changes to the color-space
|
|
327
|
+
|
|
328
|
+
const linearChanged = props.linear !== state.internal.lastProps.linear;
|
|
329
|
+
|
|
330
|
+
if (linearChanged) {
|
|
331
|
+
unmountComponentAtNode(context);
|
|
332
|
+
fiber = undefined;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (!fiber) {
|
|
337
|
+
// If no root has been found, make one
|
|
338
|
+
// Create gl
|
|
339
|
+
const glRenderer = createRendererInstance(gl, context); // Create store
|
|
340
|
+
|
|
341
|
+
store = hooks.createStore(applyProps, invalidate, advance, {
|
|
342
|
+
gl: glRenderer,
|
|
343
|
+
size,
|
|
344
|
+
...props,
|
|
345
|
+
// expo-gl can only render at native dpr/resolution
|
|
346
|
+
// https://github.com/expo/expo-three/issues/39
|
|
347
|
+
dpr: reactNative.PixelRatio.get()
|
|
348
|
+
});
|
|
349
|
+
const state = store.getState(); // Create renderer
|
|
350
|
+
|
|
351
|
+
fiber = reconciler.createContainer(store, constants.ConcurrentRoot, false, null); // Map it
|
|
352
|
+
|
|
353
|
+
roots.set(context, {
|
|
354
|
+
fiber,
|
|
355
|
+
store
|
|
356
|
+
}); // Store event manager internally and connect it
|
|
357
|
+
|
|
358
|
+
if (events) {
|
|
359
|
+
var _state$get$events$con, _state$get$events;
|
|
360
|
+
|
|
361
|
+
state.set({
|
|
362
|
+
events: events(store)
|
|
363
|
+
});
|
|
364
|
+
(_state$get$events$con = (_state$get$events = state.get().events).connect) == null ? void 0 : _state$get$events$con.call(_state$get$events, context);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
if (store && fiber) {
|
|
369
|
+
reconciler.updateContainer( /*#__PURE__*/React__namespace.createElement(Provider, {
|
|
370
|
+
store: store,
|
|
371
|
+
element: element,
|
|
372
|
+
onCreated: onCreated
|
|
373
|
+
}), fiber, null, () => undefined);
|
|
374
|
+
return store;
|
|
375
|
+
} else {
|
|
376
|
+
throw 'Error creating root!';
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
unmount: () => unmountComponentAtNode(context)
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
function render(element, context, config = {}) {
|
|
384
|
+
console.warn('R3F.render is no longer supported in React 18. Use createRoot instead!');
|
|
385
|
+
return createRoot(context, config).render(element);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
function Provider({
|
|
389
|
+
store,
|
|
390
|
+
element,
|
|
391
|
+
onCreated
|
|
392
|
+
}) {
|
|
393
|
+
React__namespace.useEffect(() => {
|
|
394
|
+
const state = store.getState(); // Flag the canvas active, rendering will now begin
|
|
395
|
+
|
|
396
|
+
state.set(state => ({
|
|
397
|
+
internal: { ...state.internal,
|
|
398
|
+
active: true
|
|
399
|
+
}
|
|
400
|
+
})); // Notifiy that init is completed, the scene graph exists, but nothing has yet rendered
|
|
401
|
+
|
|
402
|
+
if (onCreated) onCreated(state); // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
403
|
+
}, []);
|
|
404
|
+
return /*#__PURE__*/React__namespace.createElement(hooks.context.Provider, {
|
|
405
|
+
value: store
|
|
406
|
+
}, element);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
function unmountComponentAtNode(context, callback) {
|
|
410
|
+
const root = roots.get(context);
|
|
411
|
+
const fiber = root == null ? void 0 : root.fiber;
|
|
412
|
+
|
|
413
|
+
if (fiber) {
|
|
414
|
+
const state = root == null ? void 0 : root.store.getState();
|
|
415
|
+
if (state) state.internal.active = false;
|
|
416
|
+
reconciler.updateContainer(null, fiber, null, () => {
|
|
417
|
+
if (state) {
|
|
418
|
+
setTimeout(() => {
|
|
419
|
+
try {
|
|
420
|
+
var _state$gl, _state$gl$renderLists, _state$gl2;
|
|
421
|
+
|
|
422
|
+
state.events.disconnect == null ? void 0 : state.events.disconnect();
|
|
423
|
+
(_state$gl = state.gl) == null ? void 0 : (_state$gl$renderLists = _state$gl.renderLists) == null ? void 0 : _state$gl$renderLists.dispose == null ? void 0 : _state$gl$renderLists.dispose();
|
|
424
|
+
(_state$gl2 = state.gl) == null ? void 0 : _state$gl2.forceContextLoss == null ? void 0 : _state$gl2.forceContextLoss();
|
|
425
|
+
hooks.dispose(state);
|
|
426
|
+
roots.delete(context);
|
|
427
|
+
if (callback) callback(context);
|
|
428
|
+
} catch (e) {
|
|
429
|
+
/* ... */
|
|
430
|
+
}
|
|
431
|
+
}, 500);
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
const act = React__namespace.unstable_act;
|
|
438
|
+
|
|
439
|
+
function createPortal(children, container) {
|
|
440
|
+
return reconciler.createPortal(children, container, null, null);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
reconciler.injectIntoDevTools({
|
|
444
|
+
bundleType: process.env.NODE_ENV === 'production' ? 0 : 1,
|
|
445
|
+
rendererPackageName: '@react-three/fiber',
|
|
446
|
+
version: '18.0.0'
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
const CANVAS_PROPS = ['gl', 'events', 'shadows', 'linear', 'flat', 'orthographic', 'frameloop', 'performance', 'clock', 'raycaster', 'camera', 'onPointerMissed', 'onCreated'];
|
|
450
|
+
|
|
451
|
+
function Block({
|
|
452
|
+
set
|
|
453
|
+
}) {
|
|
454
|
+
React__namespace.useLayoutEffect(() => {
|
|
455
|
+
set(new Promise(() => null));
|
|
456
|
+
return () => set(false);
|
|
457
|
+
}, [set]);
|
|
458
|
+
return null;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
class ErrorBoundary extends React__namespace.Component {
|
|
462
|
+
constructor(...args) {
|
|
463
|
+
super(...args);
|
|
464
|
+
this.state = {
|
|
465
|
+
error: false
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
componentDidCatch(error) {
|
|
470
|
+
this.props.set(error);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
render() {
|
|
474
|
+
return this.state.error ? null : this.props.children;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
ErrorBoundary.getDerivedStateFromError = () => ({
|
|
480
|
+
error: true
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
|
|
484
|
+
children,
|
|
485
|
+
fallback,
|
|
486
|
+
style,
|
|
487
|
+
events,
|
|
488
|
+
nativeRef_EXPERIMENTAL,
|
|
489
|
+
onContextCreate,
|
|
490
|
+
...props
|
|
491
|
+
}, forwardedRef) => {
|
|
492
|
+
// Create a known catalogue of Threejs-native elements
|
|
493
|
+
// This will include the entire THREE namespace by default, users can extend
|
|
494
|
+
// their own elements by using the createRoot API instead
|
|
495
|
+
React__namespace.useMemo(() => hooks.extend(THREE__namespace), []);
|
|
496
|
+
const [{
|
|
497
|
+
width,
|
|
498
|
+
height
|
|
499
|
+
}, setSize] = React__namespace.useState({
|
|
500
|
+
width: 0,
|
|
501
|
+
height: 0
|
|
502
|
+
});
|
|
503
|
+
const [context, setContext] = React__namespace.useState(null);
|
|
504
|
+
const [bind, setBind] = React__namespace.useState();
|
|
505
|
+
const canvasProps = hooks.pick(props, CANVAS_PROPS);
|
|
506
|
+
const viewProps = hooks.omit(props, CANVAS_PROPS);
|
|
507
|
+
const [block, setBlock] = React__namespace.useState(false);
|
|
508
|
+
const [error, setError] = React__namespace.useState(false); // Suspend this component if block is a promise (2nd run)
|
|
509
|
+
|
|
510
|
+
if (block) throw block; // Throw exception outwards if anything within canvas throws
|
|
511
|
+
|
|
512
|
+
if (error) throw error;
|
|
513
|
+
const onLayout = React__namespace.useCallback(e => {
|
|
514
|
+
const {
|
|
515
|
+
width,
|
|
516
|
+
height
|
|
517
|
+
} = e.nativeEvent.layout;
|
|
518
|
+
setSize({
|
|
519
|
+
width,
|
|
520
|
+
height
|
|
521
|
+
});
|
|
522
|
+
}, []);
|
|
523
|
+
|
|
524
|
+
if (width > 0 && height > 0 && context) {
|
|
525
|
+
const store = createRoot(context, { ...canvasProps,
|
|
526
|
+
size: {
|
|
527
|
+
width,
|
|
528
|
+
height
|
|
529
|
+
},
|
|
530
|
+
events: events || createTouchEvents
|
|
531
|
+
}).render( /*#__PURE__*/React__namespace.createElement(ErrorBoundary, {
|
|
532
|
+
set: setError
|
|
533
|
+
}, /*#__PURE__*/React__namespace.createElement(React__namespace.Suspense, {
|
|
534
|
+
fallback: /*#__PURE__*/React__namespace.createElement(Block, {
|
|
535
|
+
set: setBlock
|
|
536
|
+
})
|
|
537
|
+
}, children)));
|
|
538
|
+
const state = store.getState();
|
|
539
|
+
setBind(state.events.connected.getEventHandlers());
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
React__namespace.useEffect(() => {
|
|
543
|
+
return () => unmountComponentAtNode(context);
|
|
544
|
+
}, [context]);
|
|
545
|
+
return /*#__PURE__*/React__namespace.createElement(reactNative.View, _extends({}, viewProps, {
|
|
546
|
+
ref: forwardedRef,
|
|
547
|
+
onLayout: onLayout,
|
|
548
|
+
style: {
|
|
549
|
+
flex: 1,
|
|
550
|
+
...style
|
|
551
|
+
}
|
|
552
|
+
}, bind), width > 0 && /*#__PURE__*/React__namespace.createElement(expoGl.GLView, {
|
|
553
|
+
nativeRef_EXPERIMENTAL: ref => {
|
|
554
|
+
if (nativeRef_EXPERIMENTAL && !nativeRef_EXPERIMENTAL.current) {
|
|
555
|
+
nativeRef_EXPERIMENTAL.current = ref;
|
|
556
|
+
}
|
|
557
|
+
},
|
|
558
|
+
onContextCreate: async gl => {
|
|
559
|
+
await (onContextCreate == null ? void 0 : onContextCreate(gl));
|
|
560
|
+
setContext(gl);
|
|
561
|
+
},
|
|
562
|
+
style: reactNative.StyleSheet.absoluteFill
|
|
563
|
+
}));
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
exports.ReactThreeFiber = hooks.threeTypes;
|
|
567
|
+
exports.addAfterEffect = hooks.addAfterEffect;
|
|
568
|
+
exports.addEffect = hooks.addEffect;
|
|
569
|
+
exports.addTail = hooks.addTail;
|
|
570
|
+
exports.context = hooks.context;
|
|
571
|
+
exports.dispose = hooks.dispose;
|
|
572
|
+
exports.extend = hooks.extend;
|
|
573
|
+
exports.useFrame = hooks.useFrame;
|
|
574
|
+
exports.useGraph = hooks.useGraph;
|
|
575
|
+
exports.useStore = hooks.useStore;
|
|
576
|
+
exports.useThree = hooks.useThree;
|
|
577
|
+
exports.Canvas = Canvas;
|
|
578
|
+
exports._roots = roots;
|
|
579
|
+
exports.act = act;
|
|
580
|
+
exports.advance = advance;
|
|
581
|
+
exports.applyProps = applyProps;
|
|
582
|
+
exports.createPortal = createPortal;
|
|
583
|
+
exports.createRoot = createRoot;
|
|
584
|
+
exports.events = createTouchEvents;
|
|
585
|
+
exports.invalidate = invalidate;
|
|
586
|
+
exports.reconciler = reconciler;
|
|
587
|
+
exports.render = render;
|
|
588
|
+
exports.unmountComponentAtNode = unmountComponentAtNode;
|
|
589
|
+
exports.useLoader = useLoader;
|