@react-three/fiber 9.0.0-rc.3 → 9.0.0-rc.5

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