@react-three/fiber 9.0.0-beta.1 → 9.0.0-rc.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.
Files changed (27) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/dist/declarations/src/core/events.d.ts +91 -0
  3. package/dist/declarations/src/core/hooks.d.ts +52 -0
  4. package/dist/declarations/src/core/index.d.ts +13 -0
  5. package/dist/declarations/src/core/loop.d.ts +31 -0
  6. package/dist/declarations/src/core/reconciler.d.ts +55 -0
  7. package/dist/declarations/src/core/renderer.d.ts +87 -0
  8. package/dist/declarations/src/core/store.d.ts +130 -0
  9. package/dist/declarations/src/core/utils.d.ts +138 -0
  10. package/dist/declarations/src/index.d.ts +6 -0
  11. package/dist/declarations/src/native/Canvas.d.ts +14 -0
  12. package/dist/declarations/src/native/events.d.ts +4 -0
  13. package/dist/declarations/src/native.d.ts +6 -0
  14. package/dist/declarations/src/three-types.d.ts +62 -0
  15. package/dist/declarations/src/web/Canvas.d.ts +24 -0
  16. package/dist/declarations/src/web/events.d.ts +4 -0
  17. package/dist/declarations/src/web/use-measure.d.ts +34 -0
  18. package/dist/{loop-b00a3b86.esm.js → events-26d2636c.esm.js} +99 -17
  19. package/dist/{loop-dfcc9ca9.cjs.prod.js → events-cb1a9ea0.cjs.prod.js} +99 -16
  20. package/dist/{loop-eb3c7218.cjs.dev.js → events-df578889.cjs.dev.js} +99 -16
  21. package/dist/react-three-fiber.cjs.dev.js +230 -122
  22. package/dist/react-three-fiber.cjs.prod.js +230 -122
  23. package/dist/react-three-fiber.esm.js +193 -84
  24. package/native/dist/react-three-fiber-native.cjs.dev.js +190 -128
  25. package/native/dist/react-three-fiber-native.cjs.prod.js +190 -128
  26. package/native/dist/react-three-fiber-native.esm.js +157 -95
  27. package/package.json +88 -86
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var loop = require('../../dist/loop-dfcc9ca9.cjs.prod.js');
5
+ var events = require('../../dist/events-cb1a9ea0.cjs.prod.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/traditional');
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
- } = loop.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
  // TODO: React 19 needs support from react-native
127
45
  const _View = reactNative.View;
128
46
  /**
@@ -133,7 +51,7 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
133
51
  children,
134
52
  style,
135
53
  gl,
136
- events = createTouchEvents,
54
+ events: events$1 = events.createPointerEvents,
137
55
  shadows,
138
56
  linear,
139
57
  flat,
@@ -151,8 +69,8 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
151
69
  // Create a known catalogue of Threejs-native elements
152
70
  // This will include the entire THREE namespace by default, users can extend
153
71
  // their own elements by using the createRoot API instead
154
- React__namespace.useMemo(() => loop.extend(THREE__namespace), []);
155
- const Bridge = loop.useBridge();
72
+ React__namespace.useMemo(() => events.extend(THREE__namespace), []);
73
+ const Bridge = events.useBridge();
156
74
  const [{
157
75
  width,
158
76
  height,
@@ -167,7 +85,7 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
167
85
  const [canvas, setCanvas] = React__namespace.useState(null);
168
86
  const [bind, setBind] = React__namespace.useState();
169
87
  React__namespace.useImperativeHandle(forwardedRef, () => viewRef.current);
170
- const handlePointerMissed = loop.useMutableCallback(onPointerMissed);
88
+ const handlePointerMissed = events.useMutableCallback(onPointerMissed);
171
89
  const [block, setBlock] = React__namespace.useState(false);
172
90
  const [error, setError] = React__namespace.useState(undefined);
173
91
 
@@ -196,27 +114,92 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
196
114
  // Called on context create or swap
197
115
  // https://github.com/pmndrs/react-three-fiber/pull/2297
198
116
  const onContextCreate = React__namespace.useCallback(context => {
199
- const canvasShim = {
117
+ const listeners = new Map();
118
+ const canvas = {
119
+ style: {},
200
120
  width: context.drawingBufferWidth,
201
121
  height: context.drawingBufferHeight,
202
- style: {},
203
- addEventListener: () => {},
204
- removeEventListener: () => {},
122
+ clientWidth: context.drawingBufferWidth,
205
123
  clientHeight: context.drawingBufferHeight,
206
124
  getContext: (_, {
207
125
  antialias = false
208
126
  }) => {
209
127
  setAntialias(antialias);
210
128
  return context;
129
+ },
130
+ addEventListener(type, listener) {
131
+ let callbacks = listeners.get(type);
132
+ if (!callbacks) {
133
+ callbacks = [];
134
+ listeners.set(type, callbacks);
135
+ }
136
+ callbacks.push(listener);
137
+ },
138
+ removeEventListener(type, listener) {
139
+ const callbacks = listeners.get(type);
140
+ if (callbacks) {
141
+ const index = callbacks.indexOf(listener);
142
+ if (index !== -1) callbacks.splice(index, 1);
143
+ }
144
+ },
145
+ dispatchEvent(event) {
146
+ Object.assign(event, {
147
+ target: this
148
+ });
149
+ const callbacks = listeners.get(event.type);
150
+ if (callbacks) {
151
+ for (const callback of callbacks) {
152
+ callback(event);
153
+ }
154
+ }
155
+ },
156
+ setPointerCapture() {
157
+ // TODO
158
+ },
159
+ releasePointerCapture() {
160
+ // TODO
211
161
  }
212
162
  };
213
- root.current = loop.createRoot(canvasShim);
214
- setCanvas(canvasShim);
163
+
164
+ // TODO: this is wrong but necessary to trick controls
165
+ // @ts-ignore
166
+ canvas.ownerDocument = canvas;
167
+ canvas.getRootNode = () => canvas;
168
+ root.current = events.createRoot(canvas);
169
+ setCanvas(canvas);
170
+ function handleTouch(gestureEvent, type) {
171
+ gestureEvent.persist();
172
+ canvas.dispatchEvent(Object.assign(gestureEvent.nativeEvent, {
173
+ type,
174
+ offsetX: gestureEvent.nativeEvent.locationX,
175
+ offsetY: gestureEvent.nativeEvent.locationY,
176
+ pointerType: 'touch',
177
+ pointerId: gestureEvent.nativeEvent.identifier
178
+ }));
179
+ return true;
180
+ }
181
+ const responder = reactNative.PanResponder.create({
182
+ onStartShouldSetPanResponder: () => true,
183
+ onMoveShouldSetPanResponder: () => true,
184
+ onMoveShouldSetPanResponderCapture: () => true,
185
+ onPanResponderTerminationRequest: () => true,
186
+ onStartShouldSetPanResponderCapture: e => handleTouch(e, 'pointercapture'),
187
+ onPanResponderStart: e => handleTouch(e, 'pointerdown'),
188
+ onPanResponderMove: e => handleTouch(e, 'pointermove'),
189
+ onPanResponderEnd: (e, state) => {
190
+ handleTouch(e, 'pointerup');
191
+ if (Math.hypot(state.dx, state.dy) < 20) handleTouch(e, 'click');
192
+ },
193
+ onPanResponderRelease: e => handleTouch(e, 'pointerleave'),
194
+ onPanResponderTerminate: e => handleTouch(e, 'lostpointercapture'),
195
+ onPanResponderReject: e => handleTouch(e, 'lostpointercapture')
196
+ });
197
+ setBind(responder.panHandlers);
215
198
  }, []);
216
199
  if (root.current && width > 0 && height > 0) {
217
200
  root.current.configure({
218
201
  gl,
219
- events,
202
+ events: events$1,
220
203
  shadows,
221
204
  linear,
222
205
  flat,
@@ -240,9 +223,6 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
240
223
  onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
241
224
  // Overwrite onCreated to apply RN bindings
242
225
  onCreated: state => {
243
- // Bind events after creation
244
- setBind(state.events.handlers);
245
-
246
226
  // Bind render to RN bridge
247
227
  const context = state.gl.getContext();
248
228
  const renderFrame = state.gl.render.bind(state.gl);
@@ -254,10 +234,10 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
254
234
  }
255
235
  });
256
236
  root.current.render( /*#__PURE__*/jsxRuntime.jsx(Bridge, {
257
- children: /*#__PURE__*/jsxRuntime.jsx(loop.ErrorBoundary, {
237
+ children: /*#__PURE__*/jsxRuntime.jsx(events.ErrorBoundary, {
258
238
  set: setError,
259
239
  children: /*#__PURE__*/jsxRuntime.jsx(React__namespace.Suspense, {
260
- fallback: /*#__PURE__*/jsxRuntime.jsx(loop.Block, {
240
+ fallback: /*#__PURE__*/jsxRuntime.jsx(events.Block, {
261
241
  set: setBlock
262
242
  }),
263
243
  children: children
@@ -267,7 +247,7 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(({
267
247
  }
268
248
  React__namespace.useEffect(() => {
269
249
  if (canvas) {
270
- return () => loop.unmountComponentAtNode(canvas);
250
+ return () => events.unmountComponentAtNode(canvas);
271
251
  }
272
252
  }, [canvas]);
273
253
  return /*#__PURE__*/jsxRuntime.jsx(_View, {
@@ -300,6 +280,88 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function CanvasWrapper(p
300
280
  });
301
281
  });
302
282
 
283
+ /** Default R3F event manager for react-native */
284
+ function createTouchEvents(store) {
285
+ const {
286
+ handlePointer
287
+ } = events.createEvents(store);
288
+ const handleTouch = (event, name) => {
289
+ event.persist()
290
+
291
+ // Apply offset
292
+ ;
293
+ event.nativeEvent.offsetX = event.nativeEvent.locationX;
294
+ event.nativeEvent.offsetY = event.nativeEvent.locationY;
295
+
296
+ // Emulate DOM event
297
+ const callback = handlePointer(name);
298
+ callback(event.nativeEvent);
299
+ return true;
300
+ };
301
+ const responder = reactNative.PanResponder.create({
302
+ onStartShouldSetPanResponder: () => true,
303
+ onMoveShouldSetPanResponder: () => true,
304
+ onMoveShouldSetPanResponderCapture: () => true,
305
+ onPanResponderTerminationRequest: () => true,
306
+ onStartShouldSetPanResponderCapture: e => handleTouch(e, 'onPointerCapture'),
307
+ onPanResponderStart: e => handleTouch(e, 'onPointerDown'),
308
+ onPanResponderMove: e => handleTouch(e, 'onPointerMove'),
309
+ onPanResponderEnd: (e, state) => {
310
+ handleTouch(e, 'onPointerUp');
311
+ if (Math.hypot(state.dx, state.dy) < 20) handleTouch(e, 'onClick');
312
+ },
313
+ onPanResponderRelease: e => handleTouch(e, 'onPointerLeave'),
314
+ onPanResponderTerminate: e => handleTouch(e, 'onLostPointerCapture'),
315
+ onPanResponderReject: e => handleTouch(e, 'onLostPointerCapture')
316
+ });
317
+ return {
318
+ priority: 1,
319
+ enabled: true,
320
+ compute(event, state, previous) {
321
+ // https://github.com/pmndrs/react-three-fiber/pull/782
322
+ // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
323
+ state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
324
+ state.raycaster.setFromCamera(state.pointer, state.camera);
325
+ },
326
+ connected: undefined,
327
+ handlers: responder.panHandlers,
328
+ update: () => {
329
+ var _internal$lastEvent;
330
+ const {
331
+ events,
332
+ internal
333
+ } = store.getState();
334
+ if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) {
335
+ handlePointer('onPointerMove')(internal.lastEvent.current);
336
+ }
337
+ },
338
+ connect: () => {
339
+ const {
340
+ set,
341
+ events
342
+ } = store.getState();
343
+ events.disconnect == null ? void 0 : events.disconnect();
344
+ set(state => ({
345
+ events: {
346
+ ...state.events,
347
+ connected: true
348
+ }
349
+ }));
350
+ },
351
+ disconnect: () => {
352
+ const {
353
+ set
354
+ } = store.getState();
355
+ set(state => ({
356
+ events: {
357
+ ...state.events,
358
+ connected: false
359
+ }
360
+ }));
361
+ }
362
+ };
363
+ }
364
+
303
365
  // http://stackoverflow.com/questions/105034
304
366
  function uuidv4() {
305
367
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
@@ -461,32 +523,32 @@ function polyfills() {
461
523
 
462
524
  if (reactNative.Platform.OS !== 'web') polyfills();
463
525
 
464
- exports.ReactThreeFiber = loop.threeTypes;
465
- exports._roots = loop._roots;
466
- exports.act = loop.act;
467
- exports.addAfterEffect = loop.addAfterEffect;
468
- exports.addEffect = loop.addEffect;
469
- exports.addTail = loop.addTail;
470
- exports.advance = loop.advance;
471
- exports.applyProps = loop.applyProps;
472
- exports.buildGraph = loop.buildGraph;
473
- exports.context = loop.context;
474
- exports.createEvents = loop.createEvents;
475
- exports.createPortal = loop.createPortal;
476
- exports.createRoot = loop.createRoot;
477
- exports.dispose = loop.dispose;
478
- exports.extend = loop.extend;
479
- exports.flushGlobalEffects = loop.flushGlobalEffects;
480
- exports.getRootState = loop.getRootState;
481
- exports.invalidate = loop.invalidate;
482
- exports.reconciler = loop.reconciler;
483
- exports.render = loop.render;
484
- exports.unmountComponentAtNode = loop.unmountComponentAtNode;
485
- exports.useFrame = loop.useFrame;
486
- exports.useGraph = loop.useGraph;
487
- exports.useInstanceHandle = loop.useInstanceHandle;
488
- exports.useLoader = loop.useLoader;
489
- exports.useStore = loop.useStore;
490
- exports.useThree = loop.useThree;
526
+ exports.ReactThreeFiber = events.threeTypes;
527
+ exports._roots = events._roots;
528
+ exports.act = events.act;
529
+ exports.addAfterEffect = events.addAfterEffect;
530
+ exports.addEffect = events.addEffect;
531
+ exports.addTail = events.addTail;
532
+ exports.advance = events.advance;
533
+ exports.applyProps = events.applyProps;
534
+ exports.buildGraph = events.buildGraph;
535
+ exports.context = events.context;
536
+ exports.createEvents = events.createEvents;
537
+ exports.createPortal = events.createPortal;
538
+ exports.createRoot = events.createRoot;
539
+ exports.dispose = events.dispose;
540
+ exports.extend = events.extend;
541
+ exports.flushGlobalEffects = events.flushGlobalEffects;
542
+ exports.getRootState = events.getRootState;
543
+ exports.invalidate = events.invalidate;
544
+ exports.reconciler = events.reconciler;
545
+ exports.render = events.render;
546
+ exports.unmountComponentAtNode = events.unmountComponentAtNode;
547
+ exports.useFrame = events.useFrame;
548
+ exports.useGraph = events.useGraph;
549
+ exports.useInstanceHandle = events.useInstanceHandle;
550
+ exports.useLoader = events.useLoader;
551
+ exports.useStore = events.useStore;
552
+ exports.useThree = events.useThree;
491
553
  exports.Canvas = Canvas;
492
554
  exports.events = createTouchEvents;