@react-three/fiber 8.0.0-beta-01 → 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.
@@ -2,18 +2,17 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var hooks = require('./hooks-dd693347.cjs.dev.js');
6
- var THREE = require('three');
7
- var React = require('react');
8
- var constants = require('react-reconciler/constants');
5
+ var index = require('./index-95c17855.cjs.dev.js');
9
6
  var _extends = require('@babel/runtime/helpers/extends');
7
+ var React = require('react');
8
+ var THREE = require('three');
10
9
  var mergeRefs = require('react-merge-refs');
11
10
  var useMeasure = require('react-use-measure');
12
- var pick = require('lodash-es/pick');
13
- var omit = require('lodash-es/omit');
14
- require('react-reconciler');
15
11
  require('suspend-react');
12
+ require('react-reconciler/constants');
16
13
  require('zustand');
14
+ require('react-reconciler');
15
+ require('scheduler');
17
16
 
18
17
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
19
18
 
@@ -26,82 +25,41 @@ function _interopNamespace(e) {
26
25
  var d = Object.getOwnPropertyDescriptor(e, k);
27
26
  Object.defineProperty(n, k, d.get ? d : {
28
27
  enumerable: true,
29
- get: function () { return e[k]; }
28
+ get: function () {
29
+ return e[k];
30
+ }
30
31
  });
31
32
  }
32
33
  });
33
34
  }
34
- n["default"] = e;
35
+ n['default'] = e;
35
36
  return Object.freeze(n);
36
37
  }
37
38
 
38
- var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
39
39
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
40
+ var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
40
41
  var mergeRefs__default = /*#__PURE__*/_interopDefault(mergeRefs);
41
42
  var useMeasure__default = /*#__PURE__*/_interopDefault(useMeasure);
42
- var pick__default = /*#__PURE__*/_interopDefault(pick);
43
- var omit__default = /*#__PURE__*/_interopDefault(omit);
44
-
45
- // @ts-ignore
46
- const CLICK = 'click';
47
- const CONTEXTMENU = 'contextmenu';
48
- const DBLCLICK = 'dblclick';
49
- const POINTERCANCEL = 'pointercancel';
50
- const POINTERDOWN = 'pointerdown';
51
- const POINTERUP = 'pointerup';
52
- const POINTERMOVE = 'pointermove';
53
- const POINTEROUT = 'pointerout';
54
- const POINTEROVER = 'pointerover';
55
- const POINTERENTER = 'pointerenter';
56
- const POINTERLEAVE = 'pointerleave';
57
- const WHEEL = 'wheel'; // https://github.com/facebook/react/tree/main/packages/react-reconciler#getcurrenteventpriority
58
- // Gives React a clue as to how import the current interaction is
59
-
60
- function getEventPriority() {
61
- var _window, _window$event;
62
43
 
63
- let name = (_window = window) == null ? void 0 : (_window$event = _window.event) == null ? void 0 : _window$event.type;
64
-
65
- switch (name) {
66
- case CLICK:
67
- case CONTEXTMENU:
68
- case DBLCLICK:
69
- case POINTERCANCEL:
70
- case POINTERDOWN:
71
- case POINTERUP:
72
- return constants.DiscreteEventPriority;
73
-
74
- case POINTERMOVE:
75
- case POINTEROUT:
76
- case POINTEROVER:
77
- case POINTERENTER:
78
- case POINTERLEAVE:
79
- case WHEEL:
80
- return constants.ContinuousEventPriority;
81
-
82
- default:
83
- return constants.DefaultEventPriority;
84
- }
85
- }
44
+ const DOM_EVENTS = {
45
+ onClick: ['click', false],
46
+ onContextMenu: ['contextmenu', false],
47
+ onDoubleClick: ['dblclick', false],
48
+ onWheel: ['wheel', true],
49
+ onPointerDown: ['pointerdown', true],
50
+ onPointerUp: ['pointerup', true],
51
+ onPointerLeave: ['pointerleave', true],
52
+ onPointerMove: ['pointermove', true],
53
+ onPointerCancel: ['pointercancel', true],
54
+ onLostPointerCapture: ['lostpointercapture', true]
55
+ };
86
56
  function createPointerEvents(store) {
87
57
  const {
88
58
  handlePointer
89
- } = hooks.createEvents(store);
90
- const names = {
91
- onClick: [CLICK, false],
92
- onContextMenu: [CONTEXTMENU, false],
93
- onDoubleClick: [DBLCLICK, false],
94
- onWheel: [WHEEL, true],
95
- onPointerDown: [POINTERDOWN, true],
96
- onPointerUp: [POINTERUP, true],
97
- onPointerLeave: [POINTERLEAVE, true],
98
- onPointerMove: [POINTERMOVE, true],
99
- onPointerCancel: [POINTERCANCEL, true],
100
- onLostPointerCapture: ['lostpointercapture', true]
101
- };
59
+ } = index.createEvents(store);
102
60
  return {
103
61
  connected: false,
104
- handlers: Object.keys(names).reduce((acc, key) => ({ ...acc,
62
+ handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({ ...acc,
105
63
  [key]: handlePointer(key)
106
64
  }), {}),
107
65
  connect: target => {
@@ -118,7 +76,7 @@ function createPointerEvents(store) {
118
76
  }
119
77
  }));
120
78
  Object.entries((_events$handlers = events == null ? void 0 : events.handlers) != null ? _events$handlers : []).forEach(([name, event]) => {
121
- const [eventName, passive] = names[name];
79
+ const [eventName, passive] = DOM_EVENTS[name];
122
80
  target.addEventListener(eventName, event, {
123
81
  passive
124
82
  });
@@ -135,7 +93,7 @@ function createPointerEvents(store) {
135
93
 
136
94
  Object.entries((_events$handlers2 = events.handlers) != null ? _events$handlers2 : []).forEach(([name, event]) => {
137
95
  if (events && events.connected instanceof HTMLElement) {
138
- const [eventName] = names[name];
96
+ const [eventName] = DOM_EVENTS[name];
139
97
  events.connected.removeEventListener(eventName, event);
140
98
  }
141
99
  });
@@ -149,19 +107,15 @@ function createPointerEvents(store) {
149
107
  };
150
108
  }
151
109
 
152
- const CANVAS_PROPS = ['gl', 'events', 'size', 'shadows', 'linear', 'flat', 'orthographic', 'frameloop', 'dpr', 'performance', 'clock', 'raycaster', 'camera', 'onPointerMissed', 'onCreated']; // React currently throws a warning when using useLayoutEffect on the server.
153
- // To get around it, we can conditionally useEffect on the server (no-op) and
154
- // useLayoutEffect in the browser.
155
-
156
- const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React__namespace.useLayoutEffect : React__namespace.useEffect;
110
+ const CANVAS_PROPS = ['gl', 'events', 'shadows', 'linear', 'flat', 'orthographic', 'frameloop', 'dpr', 'performance', 'clock', 'raycaster', 'camera', 'onPointerMissed', 'onCreated'];
157
111
 
158
112
  function Block({
159
113
  set
160
114
  }) {
161
- useIsomorphicLayoutEffect(() => {
115
+ React__namespace.useLayoutEffect(() => {
162
116
  set(new Promise(() => null));
163
117
  return () => set(false);
164
- }, []);
118
+ }, [set]);
165
119
  return null;
166
120
  }
167
121
 
@@ -195,12 +149,14 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
195
149
  events,
196
150
  ...props
197
151
  }, forwardedRef) {
198
- const canvasProps = pick__default["default"](props, CANVAS_PROPS);
199
- const divProps = omit__default["default"](props, CANVAS_PROPS);
152
+ // Create a known catalogue of Threejs-native elements
153
+ // This will include the entire THREE namespace by default, users can extend
154
+ // their own elements by using the createRoot API instead
155
+ React__namespace.useMemo(() => index.extend(THREE__namespace), []);
200
156
  const [containerRef, {
201
157
  width,
202
158
  height
203
- }] = useMeasure__default["default"]({
159
+ }] = useMeasure__default['default']({
204
160
  scroll: true,
205
161
  debounce: {
206
162
  scroll: 50,
@@ -209,34 +165,38 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
209
165
  ...resize
210
166
  });
211
167
  const canvasRef = React__namespace.useRef(null);
168
+ const [canvas, setCanvas] = React__namespace.useState(null);
169
+ const canvasProps = index.pick(props, CANVAS_PROPS);
170
+ const divProps = index.omit(props, CANVAS_PROPS);
212
171
  const [block, setBlock] = React__namespace.useState(false);
213
172
  const [error, setError] = React__namespace.useState(false); // Suspend this component if block is a promise (2nd run)
214
173
 
215
174
  if (block) throw block; // Throw exception outwards if anything within canvas throws
216
175
 
217
- if (error) throw error; // Execute JSX in the reconciler as a layout-effect
176
+ if (error) throw error;
177
+
178
+ if (width > 0 && height > 0 && canvas) {
179
+ index.createRoot(canvas, { ...canvasProps,
180
+ size: {
181
+ width,
182
+ height
183
+ },
184
+ events: events || createPointerEvents
185
+ }).render( /*#__PURE__*/React__namespace.createElement(ErrorBoundary, {
186
+ set: setError
187
+ }, /*#__PURE__*/React__namespace.createElement(React__namespace.Suspense, {
188
+ fallback: /*#__PURE__*/React__namespace.createElement(Block, {
189
+ set: setBlock
190
+ })
191
+ }, children)));
192
+ }
218
193
 
219
- useIsomorphicLayoutEffect(() => {
220
- if (width > 0 && height > 0) {
221
- render( /*#__PURE__*/React__namespace.createElement(ErrorBoundary, {
222
- set: setError
223
- }, /*#__PURE__*/React__namespace.createElement(React__namespace.Suspense, {
224
- fallback: /*#__PURE__*/React__namespace.createElement(Block, {
225
- set: setBlock
226
- })
227
- }, children)), canvasRef.current, { ...canvasProps,
228
- size: {
229
- width,
230
- height
231
- },
232
- events: events || createPointerEvents
233
- });
234
- }
235
- }, [width, height, children, canvasProps]);
236
- React__namespace.useEffect(() => {
237
- const container = canvasRef.current;
238
- return () => unmountComponentAtNode(container);
194
+ React__namespace.useLayoutEffect(() => {
195
+ setCanvas(canvasRef.current);
239
196
  }, []);
197
+ React__namespace.useEffect(() => {
198
+ return () => index.unmountComponentAtNode(canvas);
199
+ }, [canvas]);
240
200
  return /*#__PURE__*/React__namespace.createElement("div", _extends({
241
201
  ref: containerRef,
242
202
  style: {
@@ -247,211 +207,34 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
247
207
  ...style
248
208
  }
249
209
  }, divProps), /*#__PURE__*/React__namespace.createElement("canvas", {
250
- ref: mergeRefs__default["default"]([canvasRef, forwardedRef]),
210
+ ref: mergeRefs__default['default']([canvasRef, forwardedRef]),
251
211
  style: {
252
212
  display: 'block'
253
213
  }
254
214
  }, fallback));
255
215
  });
256
216
 
257
- const roots = new Map();
258
- const {
259
- invalidate,
260
- advance
261
- } = hooks.createLoop(roots);
262
- const {
263
- reconciler,
264
- applyProps
265
- } = hooks.createRenderer(roots, getEventPriority);
266
-
267
- const createRendererInstance = (gl, canvas) => {
268
- const customRenderer = typeof gl === 'function' ? gl(canvas) : gl;
269
- if (hooks.isRenderer(customRenderer)) return customRenderer;
270
- const renderer = new THREE__namespace.WebGLRenderer({
271
- powerPreference: 'high-performance',
272
- canvas: canvas,
273
- antialias: true,
274
- alpha: true,
275
- ...gl
276
- }); // Set color management
277
-
278
- renderer.outputEncoding = THREE__namespace.sRGBEncoding;
279
- renderer.toneMapping = THREE__namespace.ACESFilmicToneMapping; // Set gl props
280
-
281
- if (gl) applyProps(renderer, gl);
282
- return renderer;
283
- };
284
-
285
- function createRoot(canvas, config) {
286
- return {
287
- render: element => render(element, canvas, config),
288
- unmount: () => unmountComponentAtNode(canvas)
289
- };
290
- }
291
-
292
- function render(element, canvas, {
293
- gl,
294
- size,
295
- events,
296
- onCreated,
297
- ...props
298
- } = {}) {
299
- var _store;
300
-
301
- // Allow size to take on container bounds initially
302
- if (!size) {
303
- var _canvas$parentElement, _canvas$parentElement2, _canvas$parentElement3, _canvas$parentElement4;
304
-
305
- size = {
306
- width: (_canvas$parentElement = (_canvas$parentElement2 = canvas.parentElement) == null ? void 0 : _canvas$parentElement2.clientWidth) != null ? _canvas$parentElement : 0,
307
- height: (_canvas$parentElement3 = (_canvas$parentElement4 = canvas.parentElement) == null ? void 0 : _canvas$parentElement4.clientHeight) != null ? _canvas$parentElement3 : 0
308
- };
309
- }
310
-
311
- let root = roots.get(canvas);
312
- let fiber = root == null ? void 0 : root.fiber;
313
- let store = root == null ? void 0 : root.store;
314
- let state = (_store = store) == null ? void 0 : _store.getState();
315
-
316
- if (fiber && state) {
317
- // When a root was found, see if any fundamental props must be changed or exchanged
318
- // Check pixelratio
319
- if (props.dpr !== undefined && state.viewport.dpr !== hooks.calculateDpr(props.dpr)) state.setDpr(props.dpr); // Check size
320
-
321
- if (state.size.width !== size.width || state.size.height !== size.height) state.setSize(size.width, size.height); // For some props we want to reset the entire root
322
- // Changes to the color-space
323
-
324
- const linearChanged = props.linear !== state.internal.lastProps.linear;
325
-
326
- if (linearChanged) {
327
- unmountComponentAtNode(canvas);
328
- fiber = undefined;
329
- }
330
- }
331
-
332
- if (!fiber) {
333
- // If no root has been found, make one
334
- // Create gl
335
- const glRenderer = createRendererInstance(gl, canvas); // Create store
336
-
337
- store = hooks.createStore(applyProps, invalidate, advance, {
338
- gl: glRenderer,
339
- size,
340
- ...props
341
- });
342
- const state = store.getState(); // Create renderer
343
-
344
- fiber = reconciler.createContainer(store, constants.ConcurrentRoot, false, null); // Map it
345
-
346
- roots.set(canvas, {
347
- fiber,
348
- store
349
- }); // Store events internally
350
-
351
- if (events) state.set({
352
- events: events(store)
353
- });
354
- }
355
-
356
- if (store && fiber) {
357
- reconciler.updateContainer( /*#__PURE__*/React__namespace.createElement(Provider, {
358
- store: store,
359
- element: element,
360
- onCreated: onCreated,
361
- target: canvas
362
- }), fiber, null, () => undefined);
363
- return store;
364
- } else {
365
- throw 'Error creating root!';
366
- }
367
- }
368
-
369
- function Provider({
370
- store,
371
- element,
372
- onCreated,
373
- target
374
- }) {
375
- React__namespace.useEffect(() => {
376
- const state = store.getState(); // Flag the canvas active, rendering will now begin
377
-
378
- state.set(state => ({
379
- internal: { ...state.internal,
380
- active: true
381
- }
382
- })); // Connect events
383
-
384
- state.events.connect == null ? void 0 : state.events.connect(target); // Notifiy that init is completed, the scene graph exists, but nothing has yet rendered
385
-
386
- if (onCreated) onCreated(state); // eslint-disable-next-line react-hooks/exhaustive-deps
387
- }, []);
388
- return /*#__PURE__*/React__namespace.createElement(hooks.context.Provider, {
389
- value: store
390
- }, element);
391
- }
392
-
393
- function unmountComponentAtNode(canvas, callback) {
394
- const root = roots.get(canvas);
395
- const fiber = root == null ? void 0 : root.fiber;
396
-
397
- if (fiber) {
398
- const state = root == null ? void 0 : root.store.getState();
399
- if (state) state.internal.active = false;
400
- reconciler.updateContainer(null, fiber, null, () => {
401
- if (state) {
402
- setTimeout(() => {
403
- try {
404
- var _state$gl, _state$gl$renderLists, _state$gl2, _state$gl3;
405
-
406
- state.events.disconnect == null ? void 0 : state.events.disconnect();
407
- (_state$gl = state.gl) == null ? void 0 : (_state$gl$renderLists = _state$gl.renderLists) == null ? void 0 : _state$gl$renderLists.dispose == null ? void 0 : _state$gl$renderLists.dispose();
408
- (_state$gl2 = state.gl) == null ? void 0 : _state$gl2.forceContextLoss == null ? void 0 : _state$gl2.forceContextLoss();
409
- if ((_state$gl3 = state.gl) != null && _state$gl3.xr) state.internal.xr.disconnect();
410
- hooks.dispose(state);
411
- roots.delete(canvas);
412
- if (callback) callback(canvas);
413
- } catch (e) {
414
- /* ... */
415
- }
416
- }, 500);
417
- }
418
- });
419
- }
420
- }
421
-
422
- const act = reconciler.act;
423
-
424
- function createPortal(children, container) {
425
- return reconciler.createPortal(children, container, null, null);
426
- }
427
-
428
- reconciler.injectIntoDevTools({
429
- bundleType: process.env.NODE_ENV === 'production' ? 0 : 1,
430
- rendererPackageName: '@react-three/fiber',
431
- version: '18.0.0'
432
- });
433
-
434
- exports.ReactThreeFiber = hooks.threeTypes;
435
- exports.addAfterEffect = hooks.addAfterEffect;
436
- exports.addEffect = hooks.addEffect;
437
- exports.addTail = hooks.addTail;
438
- exports.context = hooks.context;
439
- exports.dispose = hooks.dispose;
440
- exports.extend = hooks.extend;
441
- exports.useFrame = hooks.useFrame;
442
- exports.useGraph = hooks.useGraph;
443
- exports.useLoader = hooks.useLoader;
444
- exports.useStore = hooks.useStore;
445
- exports.useThree = hooks.useThree;
217
+ exports.ReactThreeFiber = index.threeTypes;
218
+ exports._roots = index.roots;
219
+ exports.act = index.act;
220
+ exports.addAfterEffect = index.addAfterEffect;
221
+ exports.addEffect = index.addEffect;
222
+ exports.addTail = index.addTail;
223
+ exports.advance = index.advance;
224
+ exports.applyProps = index.applyProps;
225
+ exports.context = index.context;
226
+ exports.createPortal = index.createPortal;
227
+ exports.createRoot = index.createRoot;
228
+ exports.dispose = index.dispose;
229
+ exports.extend = index.extend;
230
+ exports.invalidate = index.invalidate;
231
+ exports.reconciler = index.reconciler;
232
+ exports.render = index.render;
233
+ exports.unmountComponentAtNode = index.unmountComponentAtNode;
234
+ exports.useFrame = index.useFrame;
235
+ exports.useGraph = index.useGraph;
236
+ exports.useLoader = index.useLoader;
237
+ exports.useStore = index.useStore;
238
+ exports.useThree = index.useThree;
446
239
  exports.Canvas = Canvas;
447
- exports._roots = roots;
448
- exports.act = act;
449
- exports.advance = advance;
450
- exports.applyProps = applyProps;
451
- exports.createPortal = createPortal;
452
- exports.createRoot = createRoot;
453
240
  exports.events = createPointerEvents;
454
- exports.invalidate = invalidate;
455
- exports.reconciler = reconciler;
456
- exports.render = render;
457
- exports.unmountComponentAtNode = unmountComponentAtNode;