@react-three/fiber 8.0.0-beta-04 → 8.0.0-beta-05

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.
@@ -420,7 +420,7 @@ function createEvents(store) {
420
420
  /** Sets up defaultRaycaster */
421
421
 
422
422
  function prepareRay(event) {
423
- var _raycaster$computeOff;
423
+ var _customOffsets$offset, _customOffsets$offset2, _customOffsets$width, _customOffsets$height;
424
424
 
425
425
  const state = store.getState();
426
426
  const {
@@ -431,14 +431,11 @@ function createEvents(store) {
431
431
  } = state; // https://github.com/pmndrs/react-three-fiber/pull/782
432
432
  // Events trigger outside of canvas when moved
433
433
 
434
- const {
435
- offsetX,
436
- offsetY
437
- } = (_raycaster$computeOff = raycaster.computeOffsets == null ? void 0 : raycaster.computeOffsets(event, state)) != null ? _raycaster$computeOff : event;
438
- const {
439
- width,
440
- height
441
- } = size;
434
+ const customOffsets = raycaster.computeOffsets == null ? void 0 : raycaster.computeOffsets(event, state);
435
+ const offsetX = (_customOffsets$offset = customOffsets == null ? void 0 : customOffsets.offsetX) != null ? _customOffsets$offset : event.offsetX;
436
+ const offsetY = (_customOffsets$offset2 = customOffsets == null ? void 0 : customOffsets.offsetY) != null ? _customOffsets$offset2 : event.offsetY;
437
+ const width = (_customOffsets$width = customOffsets == null ? void 0 : customOffsets.width) != null ? _customOffsets$width : size.width;
438
+ const height = (_customOffsets$height = customOffsets == null ? void 0 : customOffsets.height) != null ? _customOffsets$height : size.height;
442
439
  mouse.set(offsetX / width * 2 - 1, -(offsetY / height) * 2 + 1);
443
440
  raycaster.setFromCamera(mouse, camera);
444
441
  }
@@ -997,10 +994,13 @@ function createRenderer(roots, getEventPriority) {
997
994
 
998
995
  instance.__r3f.objects = [];
999
996
  removeChild(parent, instance);
1000
- appendChild(parent, newInstance) // This evil hack switches the react-internal fiber node
1001
- // https://github.com/facebook/react/issues/14983
1002
- // https://github.com/facebook/react/pull/15021
1003
- ;
997
+ appendChild(parent, newInstance); // Re-bind event handlers
998
+
999
+ if (newInstance.raycast && newInstance.__r3f.eventCount) {
1000
+ const rootState = newInstance.__r3f.root.getState();
1001
+
1002
+ rootState.internal.interaction.push(newInstance);
1003
+ } // This evil hack switches the react-internal fiber node
1004
1004
  [fiber, fiber.alternate].forEach(fiber => {
1005
1005
  if (fiber !== null) {
1006
1006
  fiber.stateNode = newInstance;
@@ -1094,7 +1094,7 @@ function createRenderer(roots, getEventPriority) {
1094
1094
  isPrimaryRenderer: false,
1095
1095
  getCurrentEventPriority: () => getEventPriority ? getEventPriority() : constants.DefaultEventPriority,
1096
1096
  // @ts-ignore
1097
- now: is.fun(performance.now) ? performance.now : is.fun(Date.now) ? Date.now : undefined,
1097
+ now: typeof performance !== 'undefined' && is.fun(performance.now) ? performance.now : is.fun(Date.now) ? Date.now : undefined,
1098
1098
  // @ts-ignore
1099
1099
  scheduleTimeout: is.fun(setTimeout) ? setTimeout : undefined,
1100
1100
  // @ts-ignore
@@ -1255,18 +1255,19 @@ const createStore = (applyProps, invalidate, advance, props) => {
1255
1255
  })); // Handle frame behavior in WebXR
1256
1256
 
1257
1257
 
1258
- const handleXRFrame = timestamp => {
1258
+ const handleXRFrame = (timestamp, frame) => {
1259
1259
  const state = get();
1260
1260
  if (state.frameloop === 'never') return;
1261
- advance(timestamp, true);
1261
+ advance(timestamp, true, state, frame);
1262
1262
  }; // Toggle render switching on session
1263
1263
 
1264
1264
 
1265
1265
  const handleSessionChange = () => {
1266
- gl.xr.enabled = gl.xr.isPresenting;
1267
- gl.setAnimationLoop(gl.xr.isPresenting ? handleXRFrame : null); // If exiting session, request frame
1266
+ gl.xr.enabled = gl.xr.isPresenting; // @ts-expect-error
1267
+ // WebXRManager's signature is incorrect.
1268
+ // See: https://github.com/pmndrs/react-three-fiber/pull/2017#discussion_r790134505
1268
1269
 
1269
- if (!gl.xr.isPresenting) invalidate(get());
1270
+ gl.xr.setAnimationLoop(gl.xr.isPresenting ? handleXRFrame : null);
1270
1271
  }; // WebXR session manager
1271
1272
 
1272
1273
 
@@ -1446,60 +1447,6 @@ const createStore = (applyProps, invalidate, advance, props) => {
1446
1447
  return rootState;
1447
1448
  };
1448
1449
 
1449
- function useStore() {
1450
- const store = React__namespace.useContext(context);
1451
- if (!store) throw `R3F hooks can only be used within the Canvas component!`;
1452
- return store;
1453
- }
1454
- function useThree(selector = state => state, equalityFn) {
1455
- return useStore()(selector, equalityFn);
1456
- }
1457
- function useFrame(callback, renderPriority = 0) {
1458
- const subscribe = useStore().getState().internal.subscribe; // Update ref
1459
-
1460
- const ref = React__namespace.useRef(callback);
1461
- React__namespace.useLayoutEffect(() => void (ref.current = callback), [callback]); // Subscribe on mount, unsubscribe on unmount
1462
-
1463
- React__namespace.useLayoutEffect(() => subscribe(ref, renderPriority), [renderPriority, subscribe]);
1464
- return null;
1465
- }
1466
- function useGraph(object) {
1467
- return React__namespace.useMemo(() => buildGraph(object), [object]);
1468
- }
1469
-
1470
- function loadingFn(extensions, onProgress) {
1471
- return function (Proto, ...input) {
1472
- // Construct new loader and run extensions
1473
- const loader = new Proto();
1474
- if (extensions) extensions(loader); // Go through the urls and load them
1475
-
1476
- return Promise.all(input.map(input => new Promise((res, reject) => loader.load(input, data => {
1477
- if (data.scene) Object.assign(data, buildGraph(data.scene));
1478
- res(data);
1479
- }, onProgress, error => reject(`Could not load ${input}: ${error.message}`)))));
1480
- };
1481
- }
1482
-
1483
- function useLoader(Proto, input, extensions, onProgress) {
1484
- // Use suspense to load async assets
1485
- const keys = Array.isArray(input) ? input : [input];
1486
- const results = suspendReact.suspend(loadingFn(extensions, onProgress), [Proto, ...keys], {
1487
- equal: is.equ
1488
- }); // Return the object/s
1489
-
1490
- return Array.isArray(input) ? results : results[0];
1491
- }
1492
-
1493
- useLoader.preload = function (Proto, input, extensions) {
1494
- const keys = Array.isArray(input) ? input : [input];
1495
- return suspendReact.preload(loadingFn(extensions), [Proto, ...keys]);
1496
- };
1497
-
1498
- useLoader.clear = function (Proto, input) {
1499
- const keys = Array.isArray(input) ? input : [input];
1500
- return suspendReact.clear([Proto, ...keys]);
1501
- };
1502
-
1503
1450
  function createSubs(callback, subs) {
1504
1451
  const index = subs.length;
1505
1452
  subs.push(callback);
@@ -1518,7 +1465,7 @@ function run(effects, timestamp) {
1518
1465
  for (i = 0; i < effects.length; i++) effects[i](timestamp);
1519
1466
  }
1520
1467
 
1521
- function render$1(timestamp, state) {
1468
+ function render$1(timestamp, state, frame) {
1522
1469
  // Run local effects
1523
1470
  let delta = state.clock.getDelta(); // In frameloop='never' mode, clock times are updated using the provided timestamp
1524
1471
 
@@ -1529,7 +1476,7 @@ function render$1(timestamp, state) {
1529
1476
  } // Call subscribers (useFrame)
1530
1477
 
1531
1478
 
1532
- for (i = 0; i < state.internal.subscribers.length; i++) state.internal.subscribers[i].ref.current(state, delta); // Render content
1479
+ for (i = 0; i < state.internal.subscribers.length; i++) state.internal.subscribers[i].ref.current(state, delta, frame); // Render content
1533
1480
 
1534
1481
 
1535
1482
  if (!state.internal.priority && state.gl.render) state.gl.render(state.scene, state.camera); // Decrease frame count
@@ -1580,9 +1527,9 @@ function createLoop(roots) {
1580
1527
  }
1581
1528
  }
1582
1529
 
1583
- function advance(timestamp, runGlobalEffects = true, state) {
1530
+ function advance(timestamp, runGlobalEffects = true, state, frame) {
1584
1531
  if (runGlobalEffects) run(globalEffects, timestamp);
1585
- if (!state) roots.forEach(root => render$1(timestamp, root.store.getState()));else render$1(timestamp, state);
1532
+ if (!state) roots.forEach(root => render$1(timestamp, root.store.getState()));else render$1(timestamp, state, frame);
1586
1533
  if (runGlobalEffects) run(globalAfterEffects, timestamp);
1587
1534
  }
1588
1535
 
@@ -1593,6 +1540,60 @@ function createLoop(roots) {
1593
1540
  };
1594
1541
  }
1595
1542
 
1543
+ function useStore() {
1544
+ const store = React__namespace.useContext(context);
1545
+ if (!store) throw `R3F hooks can only be used within the Canvas component!`;
1546
+ return store;
1547
+ }
1548
+ function useThree(selector = state => state, equalityFn) {
1549
+ return useStore()(selector, equalityFn);
1550
+ }
1551
+ function useFrame(callback, renderPriority = 0) {
1552
+ const subscribe = useStore().getState().internal.subscribe; // Update ref
1553
+
1554
+ const ref = React__namespace.useRef(callback);
1555
+ React__namespace.useLayoutEffect(() => void (ref.current = callback), [callback]); // Subscribe on mount, unsubscribe on unmount
1556
+
1557
+ React__namespace.useLayoutEffect(() => subscribe(ref, renderPriority), [renderPriority, subscribe]);
1558
+ return null;
1559
+ }
1560
+ function useGraph(object) {
1561
+ return React__namespace.useMemo(() => buildGraph(object), [object]);
1562
+ }
1563
+
1564
+ function loadingFn(extensions, onProgress) {
1565
+ return function (Proto, ...input) {
1566
+ // Construct new loader and run extensions
1567
+ const loader = new Proto();
1568
+ if (extensions) extensions(loader); // Go through the urls and load them
1569
+
1570
+ return Promise.all(input.map(input => new Promise((res, reject) => loader.load(input, data => {
1571
+ if (data.scene) Object.assign(data, buildGraph(data.scene));
1572
+ res(data);
1573
+ }, onProgress, error => reject(`Could not load ${input}: ${error.message}`)))));
1574
+ };
1575
+ }
1576
+
1577
+ function useLoader(Proto, input, extensions, onProgress) {
1578
+ // Use suspense to load async assets
1579
+ const keys = Array.isArray(input) ? input : [input];
1580
+ const results = suspendReact.suspend(loadingFn(extensions, onProgress), [Proto, ...keys], {
1581
+ equal: is.equ
1582
+ }); // Return the object/s
1583
+
1584
+ return Array.isArray(input) ? results : results[0];
1585
+ }
1586
+
1587
+ useLoader.preload = function (Proto, input, extensions) {
1588
+ const keys = Array.isArray(input) ? input : [input];
1589
+ return suspendReact.preload(loadingFn(extensions), [Proto, ...keys]);
1590
+ };
1591
+
1592
+ useLoader.clear = function (Proto, input) {
1593
+ const keys = Array.isArray(input) ? input : [input];
1594
+ return suspendReact.clear([Proto, ...keys]);
1595
+ };
1596
+
1596
1597
  const roots = new Map();
1597
1598
  const {
1598
1599
  invalidate,
@@ -1782,7 +1783,6 @@ exports.addEffect = addEffect;
1782
1783
  exports.addTail = addTail;
1783
1784
  exports.advance = advance;
1784
1785
  exports.applyProps = applyProps;
1785
- exports.buildGraph = buildGraph;
1786
1786
  exports.context = context;
1787
1787
  exports.createEvents = createEvents;
1788
1788
  exports.createPortal = createPortal;
@@ -1790,7 +1790,6 @@ exports.createRoot = createRoot;
1790
1790
  exports.dispose = dispose;
1791
1791
  exports.extend = extend;
1792
1792
  exports.invalidate = invalidate;
1793
- exports.is = is;
1794
1793
  exports.omit = omit;
1795
1794
  exports.pick = pick;
1796
1795
  exports.reconciler = reconciler;
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var index = require('./index-ff3eb68b.cjs.dev.js');
5
+ var index = require('./index-95c17855.cjs.dev.js');
6
6
  var _extends = require('@babel/runtime/helpers/extends');
7
7
  var React = require('react');
8
8
  var THREE = require('three');
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var index = require('./index-eb414398.cjs.prod.js');
5
+ var index = require('./index-ff8b5912.cjs.prod.js');
6
6
  var _extends = require('@babel/runtime/helpers/extends');
7
7
  var React = require('react');
8
8
  var THREE = require('three');
@@ -1,5 +1,5 @@
1
- import { c as createEvents, e as extend, p as pick, o as omit, a as createRoot, u as unmountComponentAtNode } from './index-fccd77b0.esm.js';
2
- export { t as ReactThreeFiber, y as _roots, x as act, v as addAfterEffect, s as addEffect, w as addTail, q as advance, l as applyProps, i as context, j as createPortal, a as createRoot, m as dispose, e as extend, n as invalidate, k as reconciler, r as render, u as unmountComponentAtNode, f as useFrame, g as useGraph, h as useLoader, b as useStore, d as useThree } from './index-fccd77b0.esm.js';
1
+ import { c as createEvents, e as extend, p as pick, o as omit, a as createRoot, u as unmountComponentAtNode } from './index-3f4e5f46.esm.js';
2
+ export { t as ReactThreeFiber, q as _roots, n as act, l as addAfterEffect, k as addEffect, m as addTail, j as advance, g as applyProps, b as context, d as createPortal, a as createRoot, h as dispose, e as extend, i as invalidate, f as reconciler, r as render, u as unmountComponentAtNode, w as useFrame, x as useGraph, y as useLoader, s as useStore, v as useThree } from './index-3f4e5f46.esm.js';
3
3
  import _extends from '@babel/runtime/helpers/esm/extends';
4
4
  import * as React from 'react';
5
5
  import * as THREE from 'three';
@@ -2,17 +2,15 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var index = require('../../dist/index-ff3eb68b.cjs.dev.js');
6
5
  var THREE = require('three');
7
6
  var expoAsset = require('expo-asset');
8
- var expoFileSystem = require('expo-file-system');
9
- var base64Arraybuffer = require('base64-arraybuffer');
10
- var suspendReact = require('suspend-react');
7
+ var index = require('../../dist/index-95c17855.cjs.dev.js');
11
8
  var _extends = require('@babel/runtime/helpers/extends');
12
9
  var React = require('react');
13
10
  var reactNative = require('react-native');
14
11
  var expoGl = require('expo-gl');
15
12
  var Pressability = require('react-native/Libraries/Pressability/Pressability');
13
+ require('suspend-react');
16
14
  require('react-reconciler/constants');
17
15
  require('zustand');
18
16
  require('react-reconciler');
@@ -44,116 +42,6 @@ var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
44
42
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
45
43
  var Pressability__default = /*#__PURE__*/_interopDefault(Pressability);
46
44
 
47
- /**
48
- * Generates an asset based on input type.
49
- */
50
-
51
- const getAsset = input => {
52
- if (input instanceof expoAsset.Asset) return input;
53
-
54
- switch (typeof input) {
55
- case 'string':
56
- return expoAsset.Asset.fromURI(input);
57
-
58
- case 'number':
59
- return expoAsset.Asset.fromModule(input);
60
-
61
- default:
62
- throw 'Invalid asset! Must be a URI or module.';
63
- }
64
- };
65
- /**
66
- * Downloads from a local URI and decodes into an ArrayBuffer.
67
- */
68
-
69
-
70
- const toBuffer = async localUri => expoFileSystem.readAsStringAsync(localUri, {
71
- encoding: 'base64'
72
- }).then(base64Arraybuffer.decode);
73
-
74
- function loadingFn(extensions, onProgress) {
75
- return function (Proto, ...input) {
76
- // Construct new loader and run extensions
77
- const loader = new Proto();
78
- if (extensions) extensions(loader); // Go through the urls and load them
79
-
80
- return Promise.all(input.map(entry => new Promise(async (res, reject) => {
81
- // Construct URL
82
- const url = typeof entry === 'string' ? loader.path + entry : entry; // There's no Image in native, so we create & pass a data texture instead
83
-
84
- if (loader instanceof THREE__namespace.TextureLoader) {
85
- const asset = await getAsset(url).downloadAsync();
86
- const texture = new THREE__namespace.Texture();
87
- texture.isDataTexture = true;
88
- texture.image = {
89
- data: asset,
90
- width: asset.width,
91
- height: asset.height
92
- };
93
- texture.needsUpdate = true;
94
- return res(texture);
95
- } // Do similar for CubeTextures
96
-
97
-
98
- if (loader instanceof THREE__namespace.CubeTextureLoader) {
99
- const texture = new THREE__namespace.CubeTexture();
100
- texture.isDataTexture = true;
101
- texture.images = await Promise.all(url.map(async src => {
102
- const asset = await getAsset(src).downloadAsync();
103
- return {
104
- data: asset,
105
- width: asset.width,
106
- height: asset.height
107
- };
108
- }));
109
- texture.needsUpdate = true;
110
- return res(texture);
111
- } // If asset is external and not an Image, load it
112
-
113
-
114
- if (url.startsWith != null && url.startsWith('http') && Proto.prototype.hasOwnProperty('load')) {
115
- return loader.load(entry, data => {
116
- if (data.scene) Object.assign(data, index.buildGraph(data.scene));
117
- res(data);
118
- }, onProgress, error => reject(`Could not load ${url}: ${error.message}`));
119
- } // Otherwise, create a localUri and a file buffer
120
-
121
-
122
- const {
123
- localUri
124
- } = await getAsset(url).downloadAsync();
125
- const arrayBuffer = await toBuffer(localUri); // Parse it
126
-
127
- const parsed = loader.parse == null ? void 0 : loader.parse(arrayBuffer, undefined, data => {
128
- if (data.scene) Object.assign(data, index.buildGraph(data.scene));
129
- res(data);
130
- }, error => reject(`Could not load ${url}: ${error.message}`)); // Respect synchronous parsers which don't have callbacks
131
-
132
- if (parsed) return res(parsed);
133
- })));
134
- };
135
- }
136
-
137
- function useLoader(Proto, input, extensions, onProgress) {
138
- // Use suspense to load async assets
139
- const keys = Array.isArray(input) ? input : [input];
140
- const results = suspendReact.suspend(loadingFn(extensions, onProgress), [Proto, ...keys], {
141
- equal: index.is.equ
142
- }); // Return the object/s
143
-
144
- return Array.isArray(input) ? results : results[0];
145
- }
146
-
147
- useLoader.preload = function (Proto, input, extensions) {
148
- const keys = Array.isArray(input) ? input : [input];
149
- return suspendReact.preload(loadingFn(extensions), [Proto, ...keys]);
150
- };
151
-
152
- useLoader.clear = function (Proto, input) {
153
- const keys = Array.isArray(input) ? input : [input];
154
- return suspendReact.clear([Proto, ...keys]);
155
- };
156
-
157
45
  const EVENTS = {
158
46
  PRESS: 'onPress',
159
47
  PRESSIN: 'onPressIn',
@@ -180,8 +68,8 @@ function createTouchEvents(store) {
180
68
  const handleTouch = (event, name) => {
181
69
  event.persist() // Apply offset
182
70
  ;
183
- event.nativeEvent.offsetX = event.nativeEvent.pageX;
184
- event.nativeEvent.offsetY = event.nativeEvent.pageY; // Emulate DOM event
71
+ event.nativeEvent.offsetX = event.nativeEvent.locationX;
72
+ event.nativeEvent.offsetY = event.nativeEvent.locationY; // Emulate DOM event
185
73
 
186
74
  const callback = handlePointer(DOM_EVENTS[name]);
187
75
  return callback(event.nativeEvent);
@@ -199,13 +87,13 @@ function createTouchEvents(store) {
199
87
  } = store.getState();
200
88
  events.disconnect == null ? void 0 : events.disconnect();
201
89
  const connected = new Pressability__default['default'](events == null ? void 0 : events.handlers);
202
- const handlers = connected.getEventHandlers();
203
90
  set(state => ({
204
91
  events: { ...state.events,
205
- connected,
206
- handlers
92
+ connected
207
93
  }
208
94
  }));
95
+ const handlers = connected.getEventHandlers();
96
+ return handlers;
209
97
  },
210
98
  disconnect: () => {
211
99
  const {
@@ -314,7 +202,8 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
314
202
  // Overwrite onCreated to apply RN bindings
315
203
  const onCreated = state => {
316
204
  // Bind events after creation
317
- setBind(state.events.handlers); // Bind render to RN bridge
205
+ const handlers = state.events.connect == null ? void 0 : state.events.connect(canvas);
206
+ setBind(handlers); // Bind render to RN bridge
318
207
 
319
208
  const context = state.gl.getContext();
320
209
  const renderFrame = state.gl.render.bind(state.gl);
@@ -362,6 +251,87 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
362
251
  }));
363
252
  });
364
253
 
254
+ /**
255
+ * Generates an asset based on input type.
256
+ */
257
+
258
+ const getAsset = input => {
259
+ if (input instanceof expoAsset.Asset) return input;
260
+
261
+ switch (typeof input) {
262
+ case 'string':
263
+ return expoAsset.Asset.fromURI(input);
264
+
265
+ case 'number':
266
+ return expoAsset.Asset.fromModule(input);
267
+
268
+ default:
269
+ throw 'Invalid asset! Must be a URI or module.';
270
+ }
271
+ }; // Don't pre-process urls, let expo-asset generate an absolute URL
272
+
273
+
274
+ THREE__namespace.LoaderUtils.extractUrlBase = () => './'; // There's no Image in native, so create a data texture instead
275
+
276
+
277
+ THREE__namespace.TextureLoader.prototype.load = function load(url, onLoad, onProgress, onError) {
278
+ const texture = new THREE__namespace.Texture(); // @ts-expect-error
279
+
280
+ texture.isDataTexture = true;
281
+ getAsset(url).downloadAsync().then(asset => {
282
+ texture.image = {
283
+ data: asset,
284
+ width: asset.width,
285
+ height: asset.height
286
+ };
287
+ texture.needsUpdate = true;
288
+ onLoad == null ? void 0 : onLoad(texture);
289
+ }).catch(onError);
290
+ return texture;
291
+ }; // Fetches assets via XMLHttpRequest
292
+
293
+
294
+ THREE__namespace.FileLoader.prototype.load = function (url, onLoad, onProgress, onError) {
295
+ if (this.path) url = this.path + url;
296
+ const request = new XMLHttpRequest();
297
+ getAsset(url).downloadAsync().then(asset => {
298
+ request.open('GET', asset.uri, true);
299
+ request.addEventListener('load', event => {
300
+ if (request.status === 200) {
301
+ onLoad == null ? void 0 : onLoad(request.response);
302
+ this.manager.itemEnd(url);
303
+ } else {
304
+ onError == null ? void 0 : onError(event);
305
+ this.manager.itemError(url);
306
+ this.manager.itemEnd(url);
307
+ }
308
+ }, false);
309
+ request.addEventListener('progress', event => {
310
+ onProgress == null ? void 0 : onProgress(event);
311
+ }, false);
312
+ request.addEventListener('error', event => {
313
+ onError == null ? void 0 : onError(event);
314
+ this.manager.itemError(url);
315
+ this.manager.itemEnd(url);
316
+ }, false);
317
+ request.addEventListener('abort', event => {
318
+ onError == null ? void 0 : onError(event);
319
+ this.manager.itemError(url);
320
+ this.manager.itemEnd(url);
321
+ }, false);
322
+ if (this.responseType) request.responseType = this.responseType;
323
+ if (this.withCredentials) request.withCredentials = this.withCredentials;
324
+
325
+ for (const header in this.requestHeader) {
326
+ request.setRequestHeader(header, this.requestHeader[header]);
327
+ }
328
+
329
+ request.send(null);
330
+ this.manager.itemStart(url);
331
+ });
332
+ return request;
333
+ };
334
+
365
335
  exports.ReactThreeFiber = index.threeTypes;
366
336
  exports._roots = index.roots;
367
337
  exports.act = index.act;
@@ -381,8 +351,8 @@ exports.render = index.render;
381
351
  exports.unmountComponentAtNode = index.unmountComponentAtNode;
382
352
  exports.useFrame = index.useFrame;
383
353
  exports.useGraph = index.useGraph;
354
+ exports.useLoader = index.useLoader;
384
355
  exports.useStore = index.useStore;
385
356
  exports.useThree = index.useThree;
386
357
  exports.Canvas = Canvas;
387
358
  exports.events = createTouchEvents;
388
- exports.useLoader = useLoader;