@react-three/fiber 8.16.8 → 8.17.1

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var index = require('../../dist/index-ca3a789d.cjs.dev.js');
5
+ var events = require('../../dist/events-c54ce65e.cjs.dev.js');
6
6
  var React = require('react');
7
7
  var THREE = require('three');
8
8
  var reactNative = require('react-native');
@@ -15,9 +15,9 @@ var base64Js = require('base64-js');
15
15
  var buffer = require('buffer');
16
16
  require('react-reconciler/constants');
17
17
  require('zustand');
18
+ require('suspend-react');
18
19
  require('react-reconciler');
19
20
  require('scheduler');
20
- require('suspend-react');
21
21
 
22
22
  function _interopNamespace(e) {
23
23
  if (e && e.__esModule) return e;
@@ -41,88 +41,6 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
41
41
  var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
42
42
  var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
43
43
 
44
- /** Default R3F event manager for react-native */
45
- function createTouchEvents(store) {
46
- const {
47
- handlePointer
48
- } = index.createEvents(store);
49
- const handleTouch = (event, name) => {
50
- event.persist()
51
-
52
- // Apply offset
53
- ;
54
- event.nativeEvent.offsetX = event.nativeEvent.locationX;
55
- event.nativeEvent.offsetY = event.nativeEvent.locationY;
56
-
57
- // Emulate DOM event
58
- const callback = handlePointer(name);
59
- callback(event.nativeEvent);
60
- return true;
61
- };
62
- const responder = reactNative.PanResponder.create({
63
- onStartShouldSetPanResponder: () => true,
64
- onMoveShouldSetPanResponder: () => true,
65
- onMoveShouldSetPanResponderCapture: () => true,
66
- onPanResponderTerminationRequest: () => true,
67
- onStartShouldSetPanResponderCapture: e => handleTouch(e, 'onPointerCapture'),
68
- onPanResponderStart: e => handleTouch(e, 'onPointerDown'),
69
- onPanResponderMove: e => handleTouch(e, 'onPointerMove'),
70
- onPanResponderEnd: (e, state) => {
71
- handleTouch(e, 'onPointerUp');
72
- if (Math.hypot(state.dx, state.dy) < 20) handleTouch(e, 'onClick');
73
- },
74
- onPanResponderRelease: e => handleTouch(e, 'onPointerLeave'),
75
- onPanResponderTerminate: e => handleTouch(e, 'onLostPointerCapture'),
76
- onPanResponderReject: e => handleTouch(e, 'onLostPointerCapture')
77
- });
78
- return {
79
- priority: 1,
80
- enabled: true,
81
- compute(event, state, previous) {
82
- // https://github.com/pmndrs/react-three-fiber/pull/782
83
- // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
84
- state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
85
- state.raycaster.setFromCamera(state.pointer, state.camera);
86
- },
87
- connected: undefined,
88
- handlers: responder.panHandlers,
89
- update: () => {
90
- var _internal$lastEvent;
91
- const {
92
- events,
93
- internal
94
- } = store.getState();
95
- if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) {
96
- handlePointer('onPointerMove')(internal.lastEvent.current);
97
- }
98
- },
99
- connect: () => {
100
- const {
101
- set,
102
- events
103
- } = store.getState();
104
- events.disconnect == null ? void 0 : events.disconnect();
105
- set(state => ({
106
- events: {
107
- ...state.events,
108
- connected: true
109
- }
110
- }));
111
- },
112
- disconnect: () => {
113
- const {
114
- set
115
- } = store.getState();
116
- set(state => ({
117
- events: {
118
- ...state.events,
119
- connected: false
120
- }
121
- }));
122
- }
123
- };
124
- }
125
-
126
44
  /**
127
45
  * A native canvas which accepts threejs elements as children.
128
46
  * @see https://docs.pmnd.rs/react-three-fiber/api/canvas
@@ -131,7 +49,7 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
131
49
  children,
132
50
  style,
133
51
  gl,
134
- events = createTouchEvents,
52
+ events: events$1 = events.createPointerEvents,
135
53
  shadows,
136
54
  linear,
137
55
  flat,
@@ -149,7 +67,7 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
149
67
  // Create a known catalogue of Threejs-native elements
150
68
  // This will include the entire THREE namespace by default, users can extend
151
69
  // their own elements by using the createRoot API instead
152
- React__namespace.useMemo(() => index.extend(THREE__namespace), []);
70
+ React__namespace.useMemo(() => events.extend(THREE__namespace), []);
153
71
  const Bridge = itsFine.useContextBridge();
154
72
  const [{
155
73
  width,
@@ -165,7 +83,7 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
165
83
  const [canvas, setCanvas] = React__namespace.useState(null);
166
84
  const [bind, setBind] = React__namespace.useState();
167
85
  React__namespace.useImperativeHandle(forwardedRef, () => viewRef.current);
168
- const handlePointerMissed = index.useMutableCallback(onPointerMissed);
86
+ const handlePointerMissed = events.useMutableCallback(onPointerMissed);
169
87
  const [block, setBlock] = React__namespace.useState(false);
170
88
  const [error, setError] = React__namespace.useState(undefined);
171
89
 
@@ -194,27 +112,91 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
194
112
  // Called on context create or swap
195
113
  // https://github.com/pmndrs/react-three-fiber/pull/2297
196
114
  const onContextCreate = React__namespace.useCallback(context => {
197
- const canvasShim = {
115
+ const listeners = new Map();
116
+ const canvas = {
117
+ style: {},
198
118
  width: context.drawingBufferWidth,
199
119
  height: context.drawingBufferHeight,
200
- style: {},
201
- addEventListener: () => {},
202
- removeEventListener: () => {},
120
+ clientWidth: context.drawingBufferWidth,
203
121
  clientHeight: context.drawingBufferHeight,
204
122
  getContext: (_, {
205
123
  antialias = false
206
124
  }) => {
207
125
  setAntialias(antialias);
208
126
  return context;
127
+ },
128
+ addEventListener(type, listener) {
129
+ let callbacks = listeners.get(type);
130
+ if (!callbacks) {
131
+ callbacks = [];
132
+ listeners.set(type, callbacks);
133
+ }
134
+ callbacks.push(listener);
135
+ },
136
+ removeEventListener(type, listener) {
137
+ const callbacks = listeners.get(type);
138
+ if (callbacks) {
139
+ const index = callbacks.indexOf(listener);
140
+ if (index !== -1) callbacks.splice(index, 1);
141
+ }
142
+ },
143
+ dispatchEvent(event) {
144
+ Object.assign(event, {
145
+ target: this
146
+ });
147
+ const callbacks = listeners.get(event.type);
148
+ if (callbacks) {
149
+ for (const callback of callbacks) {
150
+ callback(event);
151
+ }
152
+ }
153
+ },
154
+ setPointerCapture() {
155
+ // TODO
156
+ },
157
+ releasePointerCapture() {
158
+ // TODO
209
159
  }
210
160
  };
211
- root.current = index.createRoot(canvasShim);
212
- setCanvas(canvasShim);
161
+
162
+ // TODO: this is wrong but necessary to trick controls
163
+ // @ts-ignore
164
+ canvas.ownerDocument = canvas;
165
+ canvas.getRootNode = () => canvas;
166
+ root.current = events.createRoot(canvas);
167
+ setCanvas(canvas);
168
+ function handleTouch(gestureEvent, type) {
169
+ gestureEvent.persist();
170
+ canvas.dispatchEvent(Object.assign(gestureEvent.nativeEvent, {
171
+ type,
172
+ offsetX: gestureEvent.nativeEvent.locationX,
173
+ offsetY: gestureEvent.nativeEvent.locationY,
174
+ pointerType: 'touch'
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);
213
195
  }, []);
214
196
  if (root.current && width > 0 && height > 0) {
215
197
  root.current.configure({
216
198
  gl,
217
- events,
199
+ events: events$1,
218
200
  shadows,
219
201
  linear,
220
202
  flat,
@@ -238,9 +220,6 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
238
220
  onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
239
221
  // Overwrite onCreated to apply RN bindings
240
222
  onCreated: state => {
241
- // Bind events after creation
242
- setBind(state.events.handlers);
243
-
244
223
  // Bind render to RN bridge
245
224
  const context = state.gl.getContext();
246
225
  const renderFrame = state.gl.render.bind(state.gl);
@@ -252,10 +231,10 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
252
231
  }
253
232
  });
254
233
  root.current.render( /*#__PURE__*/jsxRuntime.jsx(Bridge, {
255
- children: /*#__PURE__*/jsxRuntime.jsx(index.ErrorBoundary, {
234
+ children: /*#__PURE__*/jsxRuntime.jsx(events.ErrorBoundary, {
256
235
  set: setError,
257
236
  children: /*#__PURE__*/jsxRuntime.jsx(React__namespace.Suspense, {
258
- fallback: /*#__PURE__*/jsxRuntime.jsx(index.Block, {
237
+ fallback: /*#__PURE__*/jsxRuntime.jsx(events.Block, {
259
238
  set: setBlock
260
239
  }),
261
240
  children: children
@@ -265,22 +244,27 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
265
244
  }
266
245
  React__namespace.useEffect(() => {
267
246
  if (canvas) {
268
- return () => index.unmountComponentAtNode(canvas);
247
+ return () => events.unmountComponentAtNode(canvas);
269
248
  }
270
249
  }, [canvas]);
271
250
  return /*#__PURE__*/jsxRuntime.jsx(reactNative.View, {
272
- ...props,
273
251
  ref: viewRef,
274
252
  onLayout: onLayout,
275
253
  style: {
276
254
  flex: 1,
277
255
  ...style
278
256
  },
279
- ...bind,
280
- children: width > 0 && /*#__PURE__*/jsxRuntime.jsx(expoGl.GLView, {
281
- msaaSamples: antialias ? 4 : 0,
282
- onContextCreate: onContextCreate,
283
- style: reactNative.StyleSheet.absoluteFill
257
+ children: /*#__PURE__*/jsxRuntime.jsx(reactNative.View, {
258
+ ...props,
259
+ style: {
260
+ flex: 1
261
+ },
262
+ children: width > 0 && /*#__PURE__*/jsxRuntime.jsx(expoGl.GLView, {
263
+ ...bind,
264
+ msaaSamples: antialias ? 4 : 0,
265
+ onContextCreate: onContextCreate,
266
+ style: reactNative.StyleSheet.absoluteFill
267
+ })
284
268
  })
285
269
  });
286
270
  });
@@ -298,6 +282,88 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function CanvasWrapper(p
298
282
  });
299
283
  });
300
284
 
285
+ /** Default R3F event manager for react-native */
286
+ function createTouchEvents(store) {
287
+ const {
288
+ handlePointer
289
+ } = events.createEvents(store);
290
+ const handleTouch = (event, name) => {
291
+ event.persist()
292
+
293
+ // Apply offset
294
+ ;
295
+ event.nativeEvent.offsetX = event.nativeEvent.locationX;
296
+ event.nativeEvent.offsetY = event.nativeEvent.locationY;
297
+
298
+ // Emulate DOM event
299
+ const callback = handlePointer(name);
300
+ callback(event.nativeEvent);
301
+ return true;
302
+ };
303
+ const responder = reactNative.PanResponder.create({
304
+ onStartShouldSetPanResponder: () => true,
305
+ onMoveShouldSetPanResponder: () => true,
306
+ onMoveShouldSetPanResponderCapture: () => true,
307
+ onPanResponderTerminationRequest: () => true,
308
+ onStartShouldSetPanResponderCapture: e => handleTouch(e, 'onPointerCapture'),
309
+ onPanResponderStart: e => handleTouch(e, 'onPointerDown'),
310
+ onPanResponderMove: e => handleTouch(e, 'onPointerMove'),
311
+ onPanResponderEnd: (e, state) => {
312
+ handleTouch(e, 'onPointerUp');
313
+ if (Math.hypot(state.dx, state.dy) < 20) handleTouch(e, 'onClick');
314
+ },
315
+ onPanResponderRelease: e => handleTouch(e, 'onPointerLeave'),
316
+ onPanResponderTerminate: e => handleTouch(e, 'onLostPointerCapture'),
317
+ onPanResponderReject: e => handleTouch(e, 'onLostPointerCapture')
318
+ });
319
+ return {
320
+ priority: 1,
321
+ enabled: true,
322
+ compute(event, state, previous) {
323
+ // https://github.com/pmndrs/react-three-fiber/pull/782
324
+ // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
325
+ state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
326
+ state.raycaster.setFromCamera(state.pointer, state.camera);
327
+ },
328
+ connected: undefined,
329
+ handlers: responder.panHandlers,
330
+ update: () => {
331
+ var _internal$lastEvent;
332
+ const {
333
+ events,
334
+ internal
335
+ } = store.getState();
336
+ if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) {
337
+ handlePointer('onPointerMove')(internal.lastEvent.current);
338
+ }
339
+ },
340
+ connect: () => {
341
+ const {
342
+ set,
343
+ events
344
+ } = store.getState();
345
+ events.disconnect == null ? void 0 : events.disconnect();
346
+ set(state => ({
347
+ events: {
348
+ ...state.events,
349
+ connected: true
350
+ }
351
+ }));
352
+ },
353
+ disconnect: () => {
354
+ const {
355
+ set
356
+ } = store.getState();
357
+ set(state => ({
358
+ events: {
359
+ ...state.events,
360
+ connected: false
361
+ }
362
+ }));
363
+ }
364
+ };
365
+ }
366
+
301
367
  // http://stackoverflow.com/questions/105034
302
368
  function uuidv4() {
303
369
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
@@ -459,32 +525,34 @@ function polyfills() {
459
525
 
460
526
  if (reactNative.Platform.OS !== 'web') polyfills();
461
527
 
462
- exports.ReactThreeFiber = index.threeTypes;
463
- exports._roots = index.roots;
464
- exports.act = index.act;
465
- exports.addAfterEffect = index.addAfterEffect;
466
- exports.addEffect = index.addEffect;
467
- exports.addTail = index.addTail;
468
- exports.advance = index.advance;
469
- exports.applyProps = index.applyProps;
470
- exports.buildGraph = index.buildGraph;
471
- exports.context = index.context;
472
- exports.createEvents = index.createEvents;
473
- exports.createPortal = index.createPortal;
474
- exports.createRoot = index.createRoot;
475
- exports.dispose = index.dispose;
476
- exports.extend = index.extend;
477
- exports.flushGlobalEffects = index.flushGlobalEffects;
478
- exports.getRootState = index.getRootState;
479
- exports.invalidate = index.invalidate;
480
- exports.reconciler = index.reconciler;
481
- exports.render = index.render;
482
- exports.unmountComponentAtNode = index.unmountComponentAtNode;
483
- exports.useFrame = index.useFrame;
484
- exports.useGraph = index.useGraph;
485
- exports.useInstanceHandle = index.useInstanceHandle;
486
- exports.useLoader = index.useLoader;
487
- exports.useStore = index.useStore;
488
- exports.useThree = index.useThree;
528
+ exports.ReactThreeFiber = events.threeTypes;
529
+ exports._roots = events.roots;
530
+ exports.act = events.act;
531
+ exports.addAfterEffect = events.addAfterEffect;
532
+ exports.addEffect = events.addEffect;
533
+ exports.addTail = events.addTail;
534
+ exports.advance = events.advance;
535
+ exports.applyProps = events.applyProps;
536
+ exports.buildGraph = events.buildGraph;
537
+ exports.context = events.context;
538
+ exports.createEvents = events.createEvents;
539
+ exports.createPointerEvents = events.createPointerEvents;
540
+ exports.createPortal = events.createPortal;
541
+ exports.createRoot = events.createRoot;
542
+ exports.dispose = events.dispose;
543
+ exports.extend = events.extend;
544
+ exports.flushGlobalEffects = events.flushGlobalEffects;
545
+ exports.flushSync = events.flushSync;
546
+ exports.getRootState = events.getRootState;
547
+ exports.invalidate = events.invalidate;
548
+ exports.reconciler = events.reconciler;
549
+ exports.render = events.render;
550
+ exports.unmountComponentAtNode = events.unmountComponentAtNode;
551
+ exports.useFrame = events.useFrame;
552
+ exports.useGraph = events.useGraph;
553
+ exports.useInstanceHandle = events.useInstanceHandle;
554
+ exports.useLoader = events.useLoader;
555
+ exports.useStore = events.useStore;
556
+ exports.useThree = events.useThree;
489
557
  exports.Canvas = Canvas;
490
558
  exports.events = createTouchEvents;