@react-three/fiber 8.0.16 → 8.0.17

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # @react-three/fiber
2
2
 
3
+ ## 8.0.17
4
+
5
+ ### Patch Changes
6
+
7
+ - 9e3369e: fix dom resize, improve native tree shaking
8
+
3
9
  ## 8.0.16
4
10
 
5
11
  ### Patch Changes
@@ -0,0 +1 @@
1
+ export declare function polyfills(): (() => void) | undefined;
@@ -6,7 +6,6 @@ var index = require('./index-f3176a33.cjs.dev.js');
6
6
  var _extends = require('@babel/runtime/helpers/extends');
7
7
  var React = require('react');
8
8
  var THREE = require('three');
9
- var mergeRefs = require('react-merge-refs');
10
9
  var useMeasure = require('react-use-measure');
11
10
  require('react-reconciler/constants');
12
11
  require('zustand');
@@ -36,7 +35,6 @@ function _interopNamespace(e) {
36
35
 
37
36
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
38
37
  var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
39
- var mergeRefs__default = /*#__PURE__*/_interopDefault(mergeRefs);
40
38
  var useMeasure__default = /*#__PURE__*/_interopDefault(useMeasure);
41
39
 
42
40
  const DOM_EVENTS = {
@@ -158,8 +156,9 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
158
156
  ...resize
159
157
  });
160
158
  const canvasRef = React__namespace.useRef(null);
161
- const meshRef = React__namespace.useRef(null);
159
+ const divRef = React__namespace.useRef(null);
162
160
  const [canvas, setCanvas] = React__namespace.useState(null);
161
+ React__namespace.useImperativeHandle(forwardedRef, () => canvasRef.current);
163
162
  const handlePointerMissed = index.useMutableCallback(onPointerMissed);
164
163
  const [block, setBlock] = React__namespace.useState(false);
165
164
  const [error, setError] = React__namespace.useState(false); // Suspend this component if block is a promise (2nd run)
@@ -191,7 +190,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
191
190
  // Pass mutable reference to onPointerMissed so it's free to update
192
191
  onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
193
192
  onCreated: state => {
194
- state.events.connect == null ? void 0 : state.events.connect(meshRef.current);
193
+ state.events.connect == null ? void 0 : state.events.connect(divRef.current);
195
194
  onCreated == null ? void 0 : onCreated(state);
196
195
  }
197
196
  });
@@ -211,7 +210,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
211
210
  if (canvas) return () => index.unmountComponentAtNode(canvas);
212
211
  }, [canvas]);
213
212
  return /*#__PURE__*/React__namespace.createElement("div", _extends({
214
- ref: mergeRefs__default["default"]([meshRef, containerRef]),
213
+ ref: divRef,
215
214
  style: {
216
215
  position: 'relative',
217
216
  width: '100%',
@@ -219,12 +218,18 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
219
218
  overflow: 'hidden',
220
219
  ...style
221
220
  }
222
- }, props), /*#__PURE__*/React__namespace.createElement("canvas", {
223
- ref: mergeRefs__default["default"]([canvasRef, forwardedRef]),
221
+ }, props), /*#__PURE__*/React__namespace.createElement("div", {
222
+ ref: containerRef,
223
+ style: {
224
+ width: '100%',
225
+ height: '100%'
226
+ }
227
+ }, /*#__PURE__*/React__namespace.createElement("canvas", {
228
+ ref: canvasRef,
224
229
  style: {
225
230
  display: 'block'
226
231
  }
227
- }, fallback));
232
+ }, fallback)));
228
233
  });
229
234
 
230
235
  exports.ReactThreeFiber = index.threeTypes;
@@ -6,7 +6,6 @@ var index = require('./index-4e1c76e5.cjs.prod.js');
6
6
  var _extends = require('@babel/runtime/helpers/extends');
7
7
  var React = require('react');
8
8
  var THREE = require('three');
9
- var mergeRefs = require('react-merge-refs');
10
9
  var useMeasure = require('react-use-measure');
11
10
  require('react-reconciler/constants');
12
11
  require('zustand');
@@ -36,7 +35,6 @@ function _interopNamespace(e) {
36
35
 
37
36
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
38
37
  var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
39
- var mergeRefs__default = /*#__PURE__*/_interopDefault(mergeRefs);
40
38
  var useMeasure__default = /*#__PURE__*/_interopDefault(useMeasure);
41
39
 
42
40
  const DOM_EVENTS = {
@@ -158,8 +156,9 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
158
156
  ...resize
159
157
  });
160
158
  const canvasRef = React__namespace.useRef(null);
161
- const meshRef = React__namespace.useRef(null);
159
+ const divRef = React__namespace.useRef(null);
162
160
  const [canvas, setCanvas] = React__namespace.useState(null);
161
+ React__namespace.useImperativeHandle(forwardedRef, () => canvasRef.current);
163
162
  const handlePointerMissed = index.useMutableCallback(onPointerMissed);
164
163
  const [block, setBlock] = React__namespace.useState(false);
165
164
  const [error, setError] = React__namespace.useState(false); // Suspend this component if block is a promise (2nd run)
@@ -191,7 +190,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
191
190
  // Pass mutable reference to onPointerMissed so it's free to update
192
191
  onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
193
192
  onCreated: state => {
194
- state.events.connect == null ? void 0 : state.events.connect(meshRef.current);
193
+ state.events.connect == null ? void 0 : state.events.connect(divRef.current);
195
194
  onCreated == null ? void 0 : onCreated(state);
196
195
  }
197
196
  });
@@ -211,7 +210,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
211
210
  if (canvas) return () => index.unmountComponentAtNode(canvas);
212
211
  }, [canvas]);
213
212
  return /*#__PURE__*/React__namespace.createElement("div", _extends({
214
- ref: mergeRefs__default["default"]([meshRef, containerRef]),
213
+ ref: divRef,
215
214
  style: {
216
215
  position: 'relative',
217
216
  width: '100%',
@@ -219,12 +218,18 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
219
218
  overflow: 'hidden',
220
219
  ...style
221
220
  }
222
- }, props), /*#__PURE__*/React__namespace.createElement("canvas", {
223
- ref: mergeRefs__default["default"]([canvasRef, forwardedRef]),
221
+ }, props), /*#__PURE__*/React__namespace.createElement("div", {
222
+ ref: containerRef,
223
+ style: {
224
+ width: '100%',
225
+ height: '100%'
226
+ }
227
+ }, /*#__PURE__*/React__namespace.createElement("canvas", {
228
+ ref: canvasRef,
224
229
  style: {
225
230
  display: 'block'
226
231
  }
227
- }, fallback));
232
+ }, fallback)));
228
233
  });
229
234
 
230
235
  exports.ReactThreeFiber = index.threeTypes;
@@ -3,7 +3,6 @@ export { t as ReactThreeFiber, s as _roots, q as act, n as addAfterEffect, m as
3
3
  import _extends from '@babel/runtime/helpers/esm/extends';
4
4
  import * as React from 'react';
5
5
  import * as THREE from 'three';
6
- import mergeRefs from 'react-merge-refs';
7
6
  import useMeasure from 'react-use-measure';
8
7
  import 'react-reconciler/constants';
9
8
  import 'zustand';
@@ -130,8 +129,9 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
130
129
  ...resize
131
130
  });
132
131
  const canvasRef = React.useRef(null);
133
- const meshRef = React.useRef(null);
132
+ const divRef = React.useRef(null);
134
133
  const [canvas, setCanvas] = React.useState(null);
134
+ React.useImperativeHandle(forwardedRef, () => canvasRef.current);
135
135
  const handlePointerMissed = useMutableCallback(onPointerMissed);
136
136
  const [block, setBlock] = React.useState(false);
137
137
  const [error, setError] = React.useState(false); // Suspend this component if block is a promise (2nd run)
@@ -163,7 +163,7 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
163
163
  // Pass mutable reference to onPointerMissed so it's free to update
164
164
  onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
165
165
  onCreated: state => {
166
- state.events.connect == null ? void 0 : state.events.connect(meshRef.current);
166
+ state.events.connect == null ? void 0 : state.events.connect(divRef.current);
167
167
  onCreated == null ? void 0 : onCreated(state);
168
168
  }
169
169
  });
@@ -183,7 +183,7 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
183
183
  if (canvas) return () => unmountComponentAtNode(canvas);
184
184
  }, [canvas]);
185
185
  return /*#__PURE__*/React.createElement("div", _extends({
186
- ref: mergeRefs([meshRef, containerRef]),
186
+ ref: divRef,
187
187
  style: {
188
188
  position: 'relative',
189
189
  width: '100%',
@@ -191,12 +191,18 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
191
191
  overflow: 'hidden',
192
192
  ...style
193
193
  }
194
- }, props), /*#__PURE__*/React.createElement("canvas", {
195
- ref: mergeRefs([canvasRef, forwardedRef]),
194
+ }, props), /*#__PURE__*/React.createElement("div", {
195
+ ref: containerRef,
196
+ style: {
197
+ width: '100%',
198
+ height: '100%'
199
+ }
200
+ }, /*#__PURE__*/React.createElement("canvas", {
201
+ ref: canvasRef,
196
202
  style: {
197
203
  display: 'block'
198
204
  }
199
- }, fallback));
205
+ }, fallback)));
200
206
  });
201
207
 
202
208
  export { Canvas, createPointerEvents as events };
@@ -2,12 +2,10 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var THREE = require('three');
6
- var expoAsset = require('expo-asset');
7
5
  var index = require('../../dist/index-f3176a33.cjs.dev.js');
8
6
  var _extends = require('@babel/runtime/helpers/extends');
9
7
  var React = require('react');
10
- var mergeRefs = require('react-merge-refs');
8
+ var THREE = require('three');
11
9
  var reactNative = require('react-native');
12
10
  var expoGl = require('expo-gl');
13
11
  var Pressability = require('react-native/Libraries/Pressability/Pressability');
@@ -37,9 +35,8 @@ function _interopNamespace(e) {
37
35
  return Object.freeze(n);
38
36
  }
39
37
 
40
- var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
41
38
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
42
- var mergeRefs__default = /*#__PURE__*/_interopDefault(mergeRefs);
39
+ var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
43
40
  var Pressability__default = /*#__PURE__*/_interopDefault(Pressability);
44
41
 
45
42
  const EVENTS = {
@@ -125,6 +122,114 @@ function createTouchEvents(store) {
125
122
  };
126
123
  }
127
124
 
125
+ // Check if expo-asset is installed (available with expo modules)
126
+ let expAsset;
127
+
128
+ try {
129
+ var _require;
130
+
131
+ expAsset = (_require = require('expo-asset')) == null ? void 0 : _require.Asset;
132
+ } catch (_) {}
133
+ /**
134
+ * Generates an asset based on input type.
135
+ */
136
+
137
+
138
+ function getAsset(input) {
139
+ switch (typeof input) {
140
+ case 'string':
141
+ return expAsset.fromURI(input);
142
+
143
+ case 'number':
144
+ return expAsset.fromModule(input);
145
+
146
+ default:
147
+ throw 'Invalid asset! Must be a URI or module.';
148
+ }
149
+ }
150
+
151
+ let injected = false;
152
+ function polyfills() {
153
+ if (!expAsset || injected) return;
154
+ injected = true; // Don't pre-process urls, let expo-asset generate an absolute URL
155
+
156
+ const extractUrlBase = THREE__namespace.LoaderUtils.extractUrlBase.bind(THREE__namespace.LoaderUtils);
157
+
158
+ THREE__namespace.LoaderUtils.extractUrlBase = url => typeof url === 'string' ? extractUrlBase(url) : './'; // There's no Image in native, so create a data texture instead
159
+
160
+
161
+ const prevTextureLoad = THREE__namespace.TextureLoader.prototype.load;
162
+
163
+ THREE__namespace.TextureLoader.prototype.load = function load(url, onLoad, onProgress, onError) {
164
+ const texture = new THREE__namespace.Texture(); // @ts-ignore
165
+
166
+ texture.isDataTexture = true;
167
+ getAsset(url).downloadAsync().then(asset => {
168
+ texture.image = {
169
+ data: asset,
170
+ width: asset.width,
171
+ height: asset.height
172
+ };
173
+ texture.flipY = true;
174
+ texture.unpackAlignment = 1;
175
+ texture.needsUpdate = true;
176
+ onLoad == null ? void 0 : onLoad(texture);
177
+ }).catch(onError);
178
+ return texture;
179
+ }; // Fetches assets via XMLHttpRequest
180
+
181
+
182
+ const prevFileLoad = THREE__namespace.FileLoader.prototype.load;
183
+
184
+ THREE__namespace.FileLoader.prototype.load = function (url, onLoad, onProgress, onError) {
185
+ if (this.path) url = this.path + url;
186
+ const request = new XMLHttpRequest();
187
+ getAsset(url).downloadAsync().then(asset => {
188
+ request.open('GET', asset.uri, true);
189
+ request.addEventListener('load', event => {
190
+ if (request.status === 200) {
191
+ onLoad == null ? void 0 : onLoad(request.response);
192
+ this.manager.itemEnd(url);
193
+ } else {
194
+ onError == null ? void 0 : onError(event);
195
+ this.manager.itemError(url);
196
+ this.manager.itemEnd(url);
197
+ }
198
+ }, false);
199
+ request.addEventListener('progress', event => {
200
+ onProgress == null ? void 0 : onProgress(event);
201
+ }, false);
202
+ request.addEventListener('error', event => {
203
+ onError == null ? void 0 : onError(event);
204
+ this.manager.itemError(url);
205
+ this.manager.itemEnd(url);
206
+ }, false);
207
+ request.addEventListener('abort', event => {
208
+ onError == null ? void 0 : onError(event);
209
+ this.manager.itemError(url);
210
+ this.manager.itemEnd(url);
211
+ }, false);
212
+ if (this.responseType) request.responseType = this.responseType;
213
+ if (this.withCredentials) request.withCredentials = this.withCredentials;
214
+
215
+ for (const header in this.requestHeader) {
216
+ request.setRequestHeader(header, this.requestHeader[header]);
217
+ }
218
+
219
+ request.send(null);
220
+ this.manager.itemStart(url);
221
+ });
222
+ return request;
223
+ }; // Cleanup function
224
+
225
+
226
+ return () => {
227
+ THREE__namespace.LoaderUtils.extractUrlBase = extractUrlBase;
228
+ THREE__namespace.TextureLoader.prototype.load = prevTextureLoad;
229
+ THREE__namespace.FileLoader.prototype.load = prevFileLoad;
230
+ };
231
+ }
232
+
128
233
  /**
129
234
  * A native canvas which accepts threejs elements as children.
130
235
  * @see https://docs.pmnd.rs/react-three-fiber/api/canvas
@@ -160,6 +265,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
160
265
  });
161
266
  const [canvas, setCanvas] = React__namespace.useState(null);
162
267
  const [bind, setBind] = React__namespace.useState();
268
+ React__namespace.useImperativeHandle(forwardedRef, () => viewRef.current);
163
269
  const handlePointerMissed = index.useMutableCallback(onPointerMissed);
164
270
  const [block, setBlock] = React__namespace.useState(false);
165
271
  const [error, setError] = React__namespace.useState(false); // Suspend this component if block is a promise (2nd run)
@@ -168,7 +274,9 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
168
274
 
169
275
  if (error) throw error;
170
276
  const viewRef = React__namespace.useRef(null);
171
- const root = React__namespace.useRef(null);
277
+ const root = React__namespace.useRef(null); // Inject and cleanup RN polyfills if able
278
+
279
+ React__namespace.useLayoutEffect(() => polyfills(), []);
172
280
  const onLayout = React__namespace.useCallback(e => {
173
281
  const {
174
282
  width,
@@ -247,7 +355,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
247
355
  }
248
356
  }, [canvas]);
249
357
  return /*#__PURE__*/React__namespace.createElement(reactNative.View, _extends({}, props, {
250
- ref: mergeRefs__default["default"]([viewRef, forwardedRef]),
358
+ ref: viewRef,
251
359
  onLayout: onLayout,
252
360
  style: {
253
361
  flex: 1,
@@ -259,89 +367,6 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
259
367
  }));
260
368
  });
261
369
 
262
- /**
263
- * Generates an asset based on input type.
264
- */
265
-
266
- const getAsset = input => {
267
- if (input instanceof expoAsset.Asset) return input;
268
-
269
- switch (typeof input) {
270
- case 'string':
271
- return expoAsset.Asset.fromURI(input);
272
-
273
- case 'number':
274
- return expoAsset.Asset.fromModule(input);
275
-
276
- default:
277
- throw 'Invalid asset! Must be a URI or module.';
278
- }
279
- }; // Don't pre-process urls, let expo-asset generate an absolute URL
280
-
281
-
282
- const extractUrlBase = THREE__namespace.LoaderUtils.extractUrlBase.bind(THREE__namespace.LoaderUtils);
283
-
284
- THREE__namespace.LoaderUtils.extractUrlBase = url => typeof url === 'string' ? extractUrlBase(url) : './'; // There's no Image in native, so create a data texture instead
285
-
286
-
287
- THREE__namespace.TextureLoader.prototype.load = function load(url, onLoad, onProgress, onError) {
288
- const texture = new THREE__namespace.Texture(); // @ts-ignore
289
-
290
- texture.isDataTexture = true;
291
- getAsset(url).downloadAsync().then(asset => {
292
- texture.image = {
293
- data: asset,
294
- width: asset.width,
295
- height: asset.height
296
- };
297
- texture.needsUpdate = true;
298
- onLoad == null ? void 0 : onLoad(texture);
299
- }).catch(onError);
300
- return texture;
301
- }; // Fetches assets via XMLHttpRequest
302
-
303
-
304
- THREE__namespace.FileLoader.prototype.load = function (url, onLoad, onProgress, onError) {
305
- if (this.path) url = this.path + url;
306
- const request = new XMLHttpRequest();
307
- getAsset(url).downloadAsync().then(asset => {
308
- request.open('GET', asset.uri, true);
309
- request.addEventListener('load', event => {
310
- if (request.status === 200) {
311
- onLoad == null ? void 0 : onLoad(request.response);
312
- this.manager.itemEnd(url);
313
- } else {
314
- onError == null ? void 0 : onError(event);
315
- this.manager.itemError(url);
316
- this.manager.itemEnd(url);
317
- }
318
- }, false);
319
- request.addEventListener('progress', event => {
320
- onProgress == null ? void 0 : onProgress(event);
321
- }, false);
322
- request.addEventListener('error', event => {
323
- onError == null ? void 0 : onError(event);
324
- this.manager.itemError(url);
325
- this.manager.itemEnd(url);
326
- }, false);
327
- request.addEventListener('abort', event => {
328
- onError == null ? void 0 : onError(event);
329
- this.manager.itemError(url);
330
- this.manager.itemEnd(url);
331
- }, false);
332
- if (this.responseType) request.responseType = this.responseType;
333
- if (this.withCredentials) request.withCredentials = this.withCredentials;
334
-
335
- for (const header in this.requestHeader) {
336
- request.setRequestHeader(header, this.requestHeader[header]);
337
- }
338
-
339
- request.send(null);
340
- this.manager.itemStart(url);
341
- });
342
- return request;
343
- };
344
-
345
370
  exports.ReactThreeFiber = index.threeTypes;
346
371
  exports._roots = index.roots;
347
372
  exports.act = index.act;
@@ -2,12 +2,10 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var THREE = require('three');
6
- var expoAsset = require('expo-asset');
7
5
  var index = require('../../dist/index-4e1c76e5.cjs.prod.js');
8
6
  var _extends = require('@babel/runtime/helpers/extends');
9
7
  var React = require('react');
10
- var mergeRefs = require('react-merge-refs');
8
+ var THREE = require('three');
11
9
  var reactNative = require('react-native');
12
10
  var expoGl = require('expo-gl');
13
11
  var Pressability = require('react-native/Libraries/Pressability/Pressability');
@@ -37,9 +35,8 @@ function _interopNamespace(e) {
37
35
  return Object.freeze(n);
38
36
  }
39
37
 
40
- var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
41
38
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
42
- var mergeRefs__default = /*#__PURE__*/_interopDefault(mergeRefs);
39
+ var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
43
40
  var Pressability__default = /*#__PURE__*/_interopDefault(Pressability);
44
41
 
45
42
  const EVENTS = {
@@ -125,6 +122,114 @@ function createTouchEvents(store) {
125
122
  };
126
123
  }
127
124
 
125
+ // Check if expo-asset is installed (available with expo modules)
126
+ let expAsset;
127
+
128
+ try {
129
+ var _require;
130
+
131
+ expAsset = (_require = require('expo-asset')) == null ? void 0 : _require.Asset;
132
+ } catch (_) {}
133
+ /**
134
+ * Generates an asset based on input type.
135
+ */
136
+
137
+
138
+ function getAsset(input) {
139
+ switch (typeof input) {
140
+ case 'string':
141
+ return expAsset.fromURI(input);
142
+
143
+ case 'number':
144
+ return expAsset.fromModule(input);
145
+
146
+ default:
147
+ throw 'Invalid asset! Must be a URI or module.';
148
+ }
149
+ }
150
+
151
+ let injected = false;
152
+ function polyfills() {
153
+ if (!expAsset || injected) return;
154
+ injected = true; // Don't pre-process urls, let expo-asset generate an absolute URL
155
+
156
+ const extractUrlBase = THREE__namespace.LoaderUtils.extractUrlBase.bind(THREE__namespace.LoaderUtils);
157
+
158
+ THREE__namespace.LoaderUtils.extractUrlBase = url => typeof url === 'string' ? extractUrlBase(url) : './'; // There's no Image in native, so create a data texture instead
159
+
160
+
161
+ const prevTextureLoad = THREE__namespace.TextureLoader.prototype.load;
162
+
163
+ THREE__namespace.TextureLoader.prototype.load = function load(url, onLoad, onProgress, onError) {
164
+ const texture = new THREE__namespace.Texture(); // @ts-ignore
165
+
166
+ texture.isDataTexture = true;
167
+ getAsset(url).downloadAsync().then(asset => {
168
+ texture.image = {
169
+ data: asset,
170
+ width: asset.width,
171
+ height: asset.height
172
+ };
173
+ texture.flipY = true;
174
+ texture.unpackAlignment = 1;
175
+ texture.needsUpdate = true;
176
+ onLoad == null ? void 0 : onLoad(texture);
177
+ }).catch(onError);
178
+ return texture;
179
+ }; // Fetches assets via XMLHttpRequest
180
+
181
+
182
+ const prevFileLoad = THREE__namespace.FileLoader.prototype.load;
183
+
184
+ THREE__namespace.FileLoader.prototype.load = function (url, onLoad, onProgress, onError) {
185
+ if (this.path) url = this.path + url;
186
+ const request = new XMLHttpRequest();
187
+ getAsset(url).downloadAsync().then(asset => {
188
+ request.open('GET', asset.uri, true);
189
+ request.addEventListener('load', event => {
190
+ if (request.status === 200) {
191
+ onLoad == null ? void 0 : onLoad(request.response);
192
+ this.manager.itemEnd(url);
193
+ } else {
194
+ onError == null ? void 0 : onError(event);
195
+ this.manager.itemError(url);
196
+ this.manager.itemEnd(url);
197
+ }
198
+ }, false);
199
+ request.addEventListener('progress', event => {
200
+ onProgress == null ? void 0 : onProgress(event);
201
+ }, false);
202
+ request.addEventListener('error', event => {
203
+ onError == null ? void 0 : onError(event);
204
+ this.manager.itemError(url);
205
+ this.manager.itemEnd(url);
206
+ }, false);
207
+ request.addEventListener('abort', event => {
208
+ onError == null ? void 0 : onError(event);
209
+ this.manager.itemError(url);
210
+ this.manager.itemEnd(url);
211
+ }, false);
212
+ if (this.responseType) request.responseType = this.responseType;
213
+ if (this.withCredentials) request.withCredentials = this.withCredentials;
214
+
215
+ for (const header in this.requestHeader) {
216
+ request.setRequestHeader(header, this.requestHeader[header]);
217
+ }
218
+
219
+ request.send(null);
220
+ this.manager.itemStart(url);
221
+ });
222
+ return request;
223
+ }; // Cleanup function
224
+
225
+
226
+ return () => {
227
+ THREE__namespace.LoaderUtils.extractUrlBase = extractUrlBase;
228
+ THREE__namespace.TextureLoader.prototype.load = prevTextureLoad;
229
+ THREE__namespace.FileLoader.prototype.load = prevFileLoad;
230
+ };
231
+ }
232
+
128
233
  /**
129
234
  * A native canvas which accepts threejs elements as children.
130
235
  * @see https://docs.pmnd.rs/react-three-fiber/api/canvas
@@ -160,6 +265,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
160
265
  });
161
266
  const [canvas, setCanvas] = React__namespace.useState(null);
162
267
  const [bind, setBind] = React__namespace.useState();
268
+ React__namespace.useImperativeHandle(forwardedRef, () => viewRef.current);
163
269
  const handlePointerMissed = index.useMutableCallback(onPointerMissed);
164
270
  const [block, setBlock] = React__namespace.useState(false);
165
271
  const [error, setError] = React__namespace.useState(false); // Suspend this component if block is a promise (2nd run)
@@ -168,7 +274,9 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
168
274
 
169
275
  if (error) throw error;
170
276
  const viewRef = React__namespace.useRef(null);
171
- const root = React__namespace.useRef(null);
277
+ const root = React__namespace.useRef(null); // Inject and cleanup RN polyfills if able
278
+
279
+ React__namespace.useLayoutEffect(() => polyfills(), []);
172
280
  const onLayout = React__namespace.useCallback(e => {
173
281
  const {
174
282
  width,
@@ -247,7 +355,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
247
355
  }
248
356
  }, [canvas]);
249
357
  return /*#__PURE__*/React__namespace.createElement(reactNative.View, _extends({}, props, {
250
- ref: mergeRefs__default["default"]([viewRef, forwardedRef]),
358
+ ref: viewRef,
251
359
  onLayout: onLayout,
252
360
  style: {
253
361
  flex: 1,
@@ -259,89 +367,6 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(({
259
367
  }));
260
368
  });
261
369
 
262
- /**
263
- * Generates an asset based on input type.
264
- */
265
-
266
- const getAsset = input => {
267
- if (input instanceof expoAsset.Asset) return input;
268
-
269
- switch (typeof input) {
270
- case 'string':
271
- return expoAsset.Asset.fromURI(input);
272
-
273
- case 'number':
274
- return expoAsset.Asset.fromModule(input);
275
-
276
- default:
277
- throw 'Invalid asset! Must be a URI or module.';
278
- }
279
- }; // Don't pre-process urls, let expo-asset generate an absolute URL
280
-
281
-
282
- const extractUrlBase = THREE__namespace.LoaderUtils.extractUrlBase.bind(THREE__namespace.LoaderUtils);
283
-
284
- THREE__namespace.LoaderUtils.extractUrlBase = url => typeof url === 'string' ? extractUrlBase(url) : './'; // There's no Image in native, so create a data texture instead
285
-
286
-
287
- THREE__namespace.TextureLoader.prototype.load = function load(url, onLoad, onProgress, onError) {
288
- const texture = new THREE__namespace.Texture(); // @ts-ignore
289
-
290
- texture.isDataTexture = true;
291
- getAsset(url).downloadAsync().then(asset => {
292
- texture.image = {
293
- data: asset,
294
- width: asset.width,
295
- height: asset.height
296
- };
297
- texture.needsUpdate = true;
298
- onLoad == null ? void 0 : onLoad(texture);
299
- }).catch(onError);
300
- return texture;
301
- }; // Fetches assets via XMLHttpRequest
302
-
303
-
304
- THREE__namespace.FileLoader.prototype.load = function (url, onLoad, onProgress, onError) {
305
- if (this.path) url = this.path + url;
306
- const request = new XMLHttpRequest();
307
- getAsset(url).downloadAsync().then(asset => {
308
- request.open('GET', asset.uri, true);
309
- request.addEventListener('load', event => {
310
- if (request.status === 200) {
311
- onLoad == null ? void 0 : onLoad(request.response);
312
- this.manager.itemEnd(url);
313
- } else {
314
- onError == null ? void 0 : onError(event);
315
- this.manager.itemError(url);
316
- this.manager.itemEnd(url);
317
- }
318
- }, false);
319
- request.addEventListener('progress', event => {
320
- onProgress == null ? void 0 : onProgress(event);
321
- }, false);
322
- request.addEventListener('error', event => {
323
- onError == null ? void 0 : onError(event);
324
- this.manager.itemError(url);
325
- this.manager.itemEnd(url);
326
- }, false);
327
- request.addEventListener('abort', event => {
328
- onError == null ? void 0 : onError(event);
329
- this.manager.itemError(url);
330
- this.manager.itemEnd(url);
331
- }, false);
332
- if (this.responseType) request.responseType = this.responseType;
333
- if (this.withCredentials) request.withCredentials = this.withCredentials;
334
-
335
- for (const header in this.requestHeader) {
336
- request.setRequestHeader(header, this.requestHeader[header]);
337
- }
338
-
339
- request.send(null);
340
- this.manager.itemStart(url);
341
- });
342
- return request;
343
- };
344
-
345
370
  exports.ReactThreeFiber = index.threeTypes;
346
371
  exports._roots = index.roots;
347
372
  exports.act = index.act;
@@ -1,10 +1,8 @@
1
- import * as THREE from 'three';
2
- import { Asset } from 'expo-asset';
3
1
  import { c as createEvents, e as extend, u as useMutableCallback, a as createRoot, E as ErrorBoundary, B as Block, d as unmountComponentAtNode } from '../../dist/index-136ca0b0.esm.js';
4
2
  export { t as ReactThreeFiber, s as _roots, q as act, n as addAfterEffect, m as addEffect, o as addTail, l as advance, i as applyProps, f as context, g as createPortal, a as createRoot, j as dispose, e as extend, p as getRootState, k as invalidate, h as reconciler, r as render, d as unmountComponentAtNode, x as useFrame, y as useGraph, z as useLoader, v as useStore, w as useThree } from '../../dist/index-136ca0b0.esm.js';
5
3
  import _extends from '@babel/runtime/helpers/esm/extends';
6
4
  import * as React from 'react';
7
- import mergeRefs from 'react-merge-refs';
5
+ import * as THREE from 'three';
8
6
  import { PixelRatio, View, StyleSheet } from 'react-native';
9
7
  import { GLView } from 'expo-gl';
10
8
  import Pressability from 'react-native/Libraries/Pressability/Pressability';
@@ -97,6 +95,114 @@ function createTouchEvents(store) {
97
95
  };
98
96
  }
99
97
 
98
+ // Check if expo-asset is installed (available with expo modules)
99
+ let expAsset;
100
+
101
+ try {
102
+ var _require;
103
+
104
+ expAsset = (_require = require('expo-asset')) == null ? void 0 : _require.Asset;
105
+ } catch (_) {}
106
+ /**
107
+ * Generates an asset based on input type.
108
+ */
109
+
110
+
111
+ function getAsset(input) {
112
+ switch (typeof input) {
113
+ case 'string':
114
+ return expAsset.fromURI(input);
115
+
116
+ case 'number':
117
+ return expAsset.fromModule(input);
118
+
119
+ default:
120
+ throw 'Invalid asset! Must be a URI or module.';
121
+ }
122
+ }
123
+
124
+ let injected = false;
125
+ function polyfills() {
126
+ if (!expAsset || injected) return;
127
+ injected = true; // Don't pre-process urls, let expo-asset generate an absolute URL
128
+
129
+ const extractUrlBase = THREE.LoaderUtils.extractUrlBase.bind(THREE.LoaderUtils);
130
+
131
+ THREE.LoaderUtils.extractUrlBase = url => typeof url === 'string' ? extractUrlBase(url) : './'; // There's no Image in native, so create a data texture instead
132
+
133
+
134
+ const prevTextureLoad = THREE.TextureLoader.prototype.load;
135
+
136
+ THREE.TextureLoader.prototype.load = function load(url, onLoad, onProgress, onError) {
137
+ const texture = new THREE.Texture(); // @ts-ignore
138
+
139
+ texture.isDataTexture = true;
140
+ getAsset(url).downloadAsync().then(asset => {
141
+ texture.image = {
142
+ data: asset,
143
+ width: asset.width,
144
+ height: asset.height
145
+ };
146
+ texture.flipY = true;
147
+ texture.unpackAlignment = 1;
148
+ texture.needsUpdate = true;
149
+ onLoad == null ? void 0 : onLoad(texture);
150
+ }).catch(onError);
151
+ return texture;
152
+ }; // Fetches assets via XMLHttpRequest
153
+
154
+
155
+ const prevFileLoad = THREE.FileLoader.prototype.load;
156
+
157
+ THREE.FileLoader.prototype.load = function (url, onLoad, onProgress, onError) {
158
+ if (this.path) url = this.path + url;
159
+ const request = new XMLHttpRequest();
160
+ getAsset(url).downloadAsync().then(asset => {
161
+ request.open('GET', asset.uri, true);
162
+ request.addEventListener('load', event => {
163
+ if (request.status === 200) {
164
+ onLoad == null ? void 0 : onLoad(request.response);
165
+ this.manager.itemEnd(url);
166
+ } else {
167
+ onError == null ? void 0 : onError(event);
168
+ this.manager.itemError(url);
169
+ this.manager.itemEnd(url);
170
+ }
171
+ }, false);
172
+ request.addEventListener('progress', event => {
173
+ onProgress == null ? void 0 : onProgress(event);
174
+ }, false);
175
+ request.addEventListener('error', event => {
176
+ onError == null ? void 0 : onError(event);
177
+ this.manager.itemError(url);
178
+ this.manager.itemEnd(url);
179
+ }, false);
180
+ request.addEventListener('abort', event => {
181
+ onError == null ? void 0 : onError(event);
182
+ this.manager.itemError(url);
183
+ this.manager.itemEnd(url);
184
+ }, false);
185
+ if (this.responseType) request.responseType = this.responseType;
186
+ if (this.withCredentials) request.withCredentials = this.withCredentials;
187
+
188
+ for (const header in this.requestHeader) {
189
+ request.setRequestHeader(header, this.requestHeader[header]);
190
+ }
191
+
192
+ request.send(null);
193
+ this.manager.itemStart(url);
194
+ });
195
+ return request;
196
+ }; // Cleanup function
197
+
198
+
199
+ return () => {
200
+ THREE.LoaderUtils.extractUrlBase = extractUrlBase;
201
+ THREE.TextureLoader.prototype.load = prevTextureLoad;
202
+ THREE.FileLoader.prototype.load = prevFileLoad;
203
+ };
204
+ }
205
+
100
206
  /**
101
207
  * A native canvas which accepts threejs elements as children.
102
208
  * @see https://docs.pmnd.rs/react-three-fiber/api/canvas
@@ -132,6 +238,7 @@ const Canvas = /*#__PURE__*/React.forwardRef(({
132
238
  });
133
239
  const [canvas, setCanvas] = React.useState(null);
134
240
  const [bind, setBind] = React.useState();
241
+ React.useImperativeHandle(forwardedRef, () => viewRef.current);
135
242
  const handlePointerMissed = useMutableCallback(onPointerMissed);
136
243
  const [block, setBlock] = React.useState(false);
137
244
  const [error, setError] = React.useState(false); // Suspend this component if block is a promise (2nd run)
@@ -140,7 +247,9 @@ const Canvas = /*#__PURE__*/React.forwardRef(({
140
247
 
141
248
  if (error) throw error;
142
249
  const viewRef = React.useRef(null);
143
- const root = React.useRef(null);
250
+ const root = React.useRef(null); // Inject and cleanup RN polyfills if able
251
+
252
+ React.useLayoutEffect(() => polyfills(), []);
144
253
  const onLayout = React.useCallback(e => {
145
254
  const {
146
255
  width,
@@ -219,7 +328,7 @@ const Canvas = /*#__PURE__*/React.forwardRef(({
219
328
  }
220
329
  }, [canvas]);
221
330
  return /*#__PURE__*/React.createElement(View, _extends({}, props, {
222
- ref: mergeRefs([viewRef, forwardedRef]),
331
+ ref: viewRef,
223
332
  onLayout: onLayout,
224
333
  style: {
225
334
  flex: 1,
@@ -231,87 +340,4 @@ const Canvas = /*#__PURE__*/React.forwardRef(({
231
340
  }));
232
341
  });
233
342
 
234
- /**
235
- * Generates an asset based on input type.
236
- */
237
-
238
- const getAsset = input => {
239
- if (input instanceof Asset) return input;
240
-
241
- switch (typeof input) {
242
- case 'string':
243
- return Asset.fromURI(input);
244
-
245
- case 'number':
246
- return Asset.fromModule(input);
247
-
248
- default:
249
- throw 'Invalid asset! Must be a URI or module.';
250
- }
251
- }; // Don't pre-process urls, let expo-asset generate an absolute URL
252
-
253
-
254
- const extractUrlBase = THREE.LoaderUtils.extractUrlBase.bind(THREE.LoaderUtils);
255
-
256
- THREE.LoaderUtils.extractUrlBase = url => typeof url === 'string' ? extractUrlBase(url) : './'; // There's no Image in native, so create a data texture instead
257
-
258
-
259
- THREE.TextureLoader.prototype.load = function load(url, onLoad, onProgress, onError) {
260
- const texture = new THREE.Texture(); // @ts-ignore
261
-
262
- texture.isDataTexture = true;
263
- getAsset(url).downloadAsync().then(asset => {
264
- texture.image = {
265
- data: asset,
266
- width: asset.width,
267
- height: asset.height
268
- };
269
- texture.needsUpdate = true;
270
- onLoad == null ? void 0 : onLoad(texture);
271
- }).catch(onError);
272
- return texture;
273
- }; // Fetches assets via XMLHttpRequest
274
-
275
-
276
- THREE.FileLoader.prototype.load = function (url, onLoad, onProgress, onError) {
277
- if (this.path) url = this.path + url;
278
- const request = new XMLHttpRequest();
279
- getAsset(url).downloadAsync().then(asset => {
280
- request.open('GET', asset.uri, true);
281
- request.addEventListener('load', event => {
282
- if (request.status === 200) {
283
- onLoad == null ? void 0 : onLoad(request.response);
284
- this.manager.itemEnd(url);
285
- } else {
286
- onError == null ? void 0 : onError(event);
287
- this.manager.itemError(url);
288
- this.manager.itemEnd(url);
289
- }
290
- }, false);
291
- request.addEventListener('progress', event => {
292
- onProgress == null ? void 0 : onProgress(event);
293
- }, false);
294
- request.addEventListener('error', event => {
295
- onError == null ? void 0 : onError(event);
296
- this.manager.itemError(url);
297
- this.manager.itemEnd(url);
298
- }, false);
299
- request.addEventListener('abort', event => {
300
- onError == null ? void 0 : onError(event);
301
- this.manager.itemError(url);
302
- this.manager.itemEnd(url);
303
- }, false);
304
- if (this.responseType) request.responseType = this.responseType;
305
- if (this.withCredentials) request.withCredentials = this.withCredentials;
306
-
307
- for (const header in this.requestHeader) {
308
- request.setRequestHeader(header, this.requestHeader[header]);
309
- }
310
-
311
- request.send(null);
312
- this.manager.itemStart(url);
313
- });
314
- return request;
315
- };
316
-
317
343
  export { Canvas, createTouchEvents as events };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/fiber",
3
- "version": "8.0.16",
3
+ "version": "8.0.17",
4
4
  "description": "A React renderer for Threejs",
5
5
  "keywords": [
6
6
  "react",
@@ -44,7 +44,6 @@
44
44
  "dependencies": {
45
45
  "@babel/runtime": "^7.17.8",
46
46
  "@types/react-reconciler": "^0.26.7",
47
- "react-merge-refs": "^1.1.0",
48
47
  "react-reconciler": "^0.27.0",
49
48
  "react-use-measure": "^2.1.1",
50
49
  "scheduler": "^0.21.0",