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

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.
@@ -1,112 +1,19 @@
1
- import { c as createEvents, s as buildGraph, v as is, a as createLoop, b as createRenderer, e as createStore, f as context, g as dispose, i as isRenderer, h as extend, p as pick, o as omit } from '../../dist/hooks-15c12e3e.esm.js';
2
- export { t as ReactThreeFiber, k as addAfterEffect, j as addEffect, l as addTail, f as context, g as dispose, h as extend, n as useFrame, q as useGraph, u as useStore, m as useThree } from '../../dist/hooks-15c12e3e.esm.js';
3
- import _extends from '@babel/runtime/helpers/esm/extends';
4
- import * as React from 'react';
1
+ import { z as buildGraph, A as is, c as createEvents, e as extend, p as pick, o as omit, a as createRoot, u as unmountComponentAtNode } from '../../dist/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, b as useStore, d as useThree } from '../../dist/index-fccd77b0.esm.js';
5
3
  import * as THREE from 'three';
6
- import { PixelRatio, View, StyleSheet } from 'react-native';
7
- import { GLView } from 'expo-gl';
8
- import { DefaultEventPriority, ContinuousEventPriority, DiscreteEventPriority, ConcurrentRoot } from 'react-reconciler/constants';
9
- import Pressability from 'react-native/Libraries/Pressability/Pressability';
10
4
  import { Asset } from 'expo-asset';
11
5
  import { readAsStringAsync } from 'expo-file-system';
12
6
  import { decode } from 'base64-arraybuffer';
13
7
  import { suspend, preload, clear } from 'suspend-react';
8
+ import _extends from '@babel/runtime/helpers/esm/extends';
9
+ import * as React from 'react';
10
+ import { PixelRatio, View, StyleSheet } from 'react-native';
11
+ import { GLView } from 'expo-gl';
12
+ import Pressability from 'react-native/Libraries/Pressability/Pressability';
13
+ import 'react-reconciler/constants';
14
+ import 'zustand';
14
15
  import 'react-reconciler';
15
16
  import 'scheduler';
16
- import 'zustand';
17
-
18
- // @ts-ignore
19
- const EVENTS = {
20
- PRESS: 'onPress',
21
- PRESSIN: 'onPressIn',
22
- PRESSOUT: 'onPressOut',
23
- LONGPRESS: 'onLongPress',
24
- HOVERIN: 'onHoverIn',
25
- HOVEROUT: 'onHoverOut',
26
- PRESSMOVE: 'onPressMove'
27
- };
28
- const DOM_EVENTS = {
29
- [EVENTS.PRESS]: 'onClick',
30
- [EVENTS.PRESSIN]: 'onPointerDown',
31
- [EVENTS.PRESSOUT]: 'onPointerUp',
32
- [EVENTS.LONGPRESS]: 'onDoubleClick',
33
- [EVENTS.HOVERIN]: 'onPointerOver',
34
- [EVENTS.HOVEROUT]: 'onPointerOut',
35
- [EVENTS.PRESSMOVE]: 'onPointerMove'
36
- }; // https://github.com/facebook/react/tree/main/packages/react-reconciler#getcurrenteventpriority
37
- // Gives React a clue as to how import the current interaction is
38
-
39
- function getEventPriority() {
40
- var _window, _window$event;
41
-
42
- let name = (_window = window) == null ? void 0 : (_window$event = _window.event) == null ? void 0 : _window$event.type;
43
-
44
- switch (name) {
45
- case EVENTS.PRESS:
46
- case EVENTS.PRESSIN:
47
- case EVENTS.PRESSOUT:
48
- case EVENTS.LONGPRESS:
49
- return DiscreteEventPriority;
50
-
51
- case EVENTS.HOVERIN:
52
- case EVENTS.HOVEROUT:
53
- case EVENTS.PRESSMOVE:
54
- return ContinuousEventPriority;
55
-
56
- default:
57
- return DefaultEventPriority;
58
- }
59
- }
60
- function createTouchEvents(store) {
61
- const {
62
- handlePointer
63
- } = createEvents(store);
64
-
65
- const handleTouch = (event, name) => {
66
- event.persist() // Apply offset
67
- ;
68
- event.nativeEvent.offsetX = event.nativeEvent.pageX;
69
- event.nativeEvent.offsetY = event.nativeEvent.pageY; // Emulate DOM event
70
-
71
- const callback = handlePointer(DOM_EVENTS[name]);
72
- return callback(event.nativeEvent);
73
- };
74
-
75
- return {
76
- connected: false,
77
- handlers: Object.values(EVENTS).reduce((acc, name) => ({ ...acc,
78
- [name]: event => handleTouch(event, name)
79
- }), {}),
80
- connect: () => {
81
- const {
82
- set,
83
- events
84
- } = store.getState();
85
- events.disconnect == null ? void 0 : events.disconnect();
86
- const manager = new Pressability(events == null ? void 0 : events.handlers);
87
- set(state => ({
88
- events: { ...state.events,
89
- connected: manager
90
- }
91
- }));
92
- },
93
- disconnect: () => {
94
- const {
95
- set,
96
- events
97
- } = store.getState();
98
-
99
- if (events.connected) {
100
- events.connected.reset();
101
- set(state => ({
102
- events: { ...state.events,
103
- connected: false
104
- }
105
- }));
106
- }
107
- }
108
- };
109
- }
110
17
 
111
18
  /**
112
19
  * Generates an asset based on input type.
@@ -218,205 +125,77 @@ useLoader.clear = function (Proto, input) {
218
125
  return clear([Proto, ...keys]);
219
126
  };
220
127
 
221
- const roots = new Map();
222
- const {
223
- invalidate,
224
- advance
225
- } = createLoop(roots);
226
- const {
227
- reconciler,
228
- applyProps
229
- } = createRenderer(roots, getEventPriority);
230
-
231
- const createRendererInstance = (gl, context) => {
232
- // Create canvas shim
233
- const canvas = {
234
- width: context.drawingBufferWidth,
235
- height: context.drawingBufferHeight,
236
- style: {},
237
- addEventListener: () => {},
238
- removeEventListener: () => {},
239
- clientHeight: context.drawingBufferHeight
240
- }; // If a renderer is specified, return it
241
-
242
- const customRenderer = typeof gl === 'function' ? gl(canvas, context) : gl;
243
- if (isRenderer(customRenderer)) return customRenderer; // Create renderer and pass our canvas and its context
244
-
245
- const renderer = new THREE.WebGLRenderer({
246
- powerPreference: 'high-performance',
247
- antialias: true,
248
- alpha: true,
249
- ...gl,
250
- canvas,
251
- context
252
- }); // Set color management
253
-
254
- renderer.outputEncoding = THREE.sRGBEncoding;
255
- renderer.toneMapping = THREE.ACESFilmicToneMapping; // Set GL props
256
-
257
- if (gl) applyProps(renderer, gl); // Bind render to RN bridge
258
-
259
- if (context.endFrameEXP) {
260
- const renderFrame = renderer.render.bind(renderer);
261
-
262
- renderer.render = (scene, camera) => {
263
- renderFrame(scene, camera);
264
- context.endFrameEXP();
265
- };
266
- }
267
-
268
- return renderer;
128
+ const EVENTS = {
129
+ PRESS: 'onPress',
130
+ PRESSIN: 'onPressIn',
131
+ PRESSOUT: 'onPressOut',
132
+ LONGPRESS: 'onLongPress',
133
+ HOVERIN: 'onHoverIn',
134
+ HOVEROUT: 'onHoverOut',
135
+ PRESSMOVE: 'onPressMove'
269
136
  };
137
+ const DOM_EVENTS = {
138
+ [EVENTS.PRESS]: 'onClick',
139
+ [EVENTS.PRESSIN]: 'onPointerDown',
140
+ [EVENTS.PRESSOUT]: 'onPointerUp',
141
+ [EVENTS.LONGPRESS]: 'onDoubleClick',
142
+ [EVENTS.HOVERIN]: 'onPointerOver',
143
+ [EVENTS.HOVEROUT]: 'onPointerOut',
144
+ [EVENTS.PRESSMOVE]: 'onPointerMove'
145
+ };
146
+ function createTouchEvents(store) {
147
+ const {
148
+ handlePointer
149
+ } = createEvents(store);
270
150
 
271
- function createRoot(context, config) {
272
- return {
273
- render: element => {
274
- var _store;
275
-
276
- let {
277
- gl,
278
- size = {
279
- width: 0,
280
- height: 0
281
- },
282
- events,
283
- onCreated,
284
- ...props
285
- } = config || {};
286
- let root = roots.get(context);
287
- let fiber = root == null ? void 0 : root.fiber;
288
- let store = root == null ? void 0 : root.store;
289
- let state = (_store = store) == null ? void 0 : _store.getState();
290
-
291
- if (fiber && state) {
292
- // When a root was found, see if any fundamental props must be changed or exchanged
293
- // Check size
294
- if (state.size.width !== size.width || state.size.height !== size.height) state.setSize(size.width, size.height); // Check frameloop
295
-
296
- if (state.frameloop !== props.frameloop) state.setFrameloop(props.frameloop); // For some props we want to reset the entire root
297
- // Changes to the color-space
298
-
299
- const linearChanged = props.linear !== state.internal.lastProps.linear;
300
-
301
- if (linearChanged) {
302
- unmountComponentAtNode(context);
303
- fiber = undefined;
304
- }
305
- }
306
-
307
- if (!fiber) {
308
- // If no root has been found, make one
309
- // Create gl
310
- const glRenderer = createRendererInstance(gl, context); // Create store
311
-
312
- store = createStore(applyProps, invalidate, advance, {
313
- gl: glRenderer,
314
- size,
315
- ...props,
316
- // expo-gl can only render at native dpr/resolution
317
- // https://github.com/expo/expo-three/issues/39
318
- dpr: PixelRatio.get()
319
- });
320
- const state = store.getState(); // Create renderer
321
-
322
- fiber = reconciler.createContainer(store, ConcurrentRoot, false, null); // Map it
323
-
324
- roots.set(context, {
325
- fiber,
326
- store
327
- }); // Store event manager internally and connect it
328
-
329
- if (events) {
330
- var _state$get$events$con, _state$get$events;
331
-
332
- state.set({
333
- events: events(store)
334
- });
335
- (_state$get$events$con = (_state$get$events = state.get().events).connect) == null ? void 0 : _state$get$events$con.call(_state$get$events, context);
336
- }
337
- }
151
+ const handleTouch = (event, name) => {
152
+ event.persist() // Apply offset
153
+ ;
154
+ event.nativeEvent.offsetX = event.nativeEvent.pageX;
155
+ event.nativeEvent.offsetY = event.nativeEvent.pageY; // Emulate DOM event
338
156
 
339
- if (store && fiber) {
340
- reconciler.updateContainer( /*#__PURE__*/React.createElement(Provider, {
341
- store: store,
342
- element: element,
343
- onCreated: onCreated
344
- }), fiber, null, () => undefined);
345
- return store;
346
- } else {
347
- throw 'Error creating root!';
348
- }
349
- },
350
- unmount: () => unmountComponentAtNode(context)
157
+ const callback = handlePointer(DOM_EVENTS[name]);
158
+ return callback(event.nativeEvent);
351
159
  };
352
- }
353
-
354
- function render(element, context, config = {}) {
355
- console.warn('R3F.render is no longer supported in React 18. Use createRoot instead!');
356
- return createRoot(context, config).render(element);
357
- }
358
-
359
- function Provider({
360
- store,
361
- element,
362
- onCreated
363
- }) {
364
- React.useEffect(() => {
365
- const state = store.getState(); // Flag the canvas active, rendering will now begin
366
160
 
367
- state.set(state => ({
368
- internal: { ...state.internal,
369
- active: true
370
- }
371
- })); // Notifiy that init is completed, the scene graph exists, but nothing has yet rendered
372
-
373
- if (onCreated) onCreated(state); // eslint-disable-next-line react-hooks/exhaustive-deps
374
- }, []);
375
- return /*#__PURE__*/React.createElement(context.Provider, {
376
- value: store
377
- }, element);
378
- }
161
+ return {
162
+ connected: false,
163
+ handlers: Object.values(EVENTS).reduce((acc, name) => ({ ...acc,
164
+ [name]: event => handleTouch(event, name)
165
+ }), {}),
166
+ connect: () => {
167
+ const {
168
+ set,
169
+ events
170
+ } = store.getState();
171
+ events.disconnect == null ? void 0 : events.disconnect();
172
+ const connected = new Pressability(events == null ? void 0 : events.handlers);
173
+ const handlers = connected.getEventHandlers();
174
+ set(state => ({
175
+ events: { ...state.events,
176
+ connected,
177
+ handlers
178
+ }
179
+ }));
180
+ },
181
+ disconnect: () => {
182
+ const {
183
+ set,
184
+ events
185
+ } = store.getState();
379
186
 
380
- function unmountComponentAtNode(context, callback) {
381
- const root = roots.get(context);
382
- const fiber = root == null ? void 0 : root.fiber;
383
-
384
- if (fiber) {
385
- const state = root == null ? void 0 : root.store.getState();
386
- if (state) state.internal.active = false;
387
- reconciler.updateContainer(null, fiber, null, () => {
388
- if (state) {
389
- setTimeout(() => {
390
- try {
391
- var _state$gl, _state$gl$renderLists, _state$gl2;
392
-
393
- state.events.disconnect == null ? void 0 : state.events.disconnect();
394
- (_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();
395
- (_state$gl2 = state.gl) == null ? void 0 : _state$gl2.forceContextLoss == null ? void 0 : _state$gl2.forceContextLoss();
396
- dispose(state);
397
- roots.delete(context);
398
- if (callback) callback(context);
399
- } catch (e) {
400
- /* ... */
187
+ if (events.connected) {
188
+ events.connected.reset();
189
+ set(state => ({
190
+ events: { ...state.events,
191
+ connected: false
401
192
  }
402
- }, 500);
193
+ }));
403
194
  }
404
- });
405
- }
406
- }
407
-
408
- const act = React.unstable_act;
409
-
410
- function createPortal(children, container) {
411
- return reconciler.createPortal(children, container, null, null);
195
+ }
196
+ };
412
197
  }
413
198
 
414
- reconciler.injectIntoDevTools({
415
- bundleType: process.env.NODE_ENV === 'production' ? 0 : 1,
416
- rendererPackageName: '@react-three/fiber',
417
- version: '18.0.0'
418
- });
419
-
420
199
  const CANVAS_PROPS = ['gl', 'events', 'shadows', 'linear', 'flat', 'orthographic', 'frameloop', 'performance', 'clock', 'raycaster', 'camera', 'onPointerMissed', 'onCreated'];
421
200
 
422
201
  function Block({
@@ -456,8 +235,6 @@ const Canvas = /*#__PURE__*/React.forwardRef(({
456
235
  fallback,
457
236
  style,
458
237
  events,
459
- nativeRef_EXPERIMENTAL,
460
- onContextCreate,
461
238
  ...props
462
239
  }, forwardedRef) => {
463
240
  // Create a known catalogue of Threejs-native elements
@@ -471,7 +248,7 @@ const Canvas = /*#__PURE__*/React.forwardRef(({
471
248
  width: 0,
472
249
  height: 0
473
250
  });
474
- const [context, setContext] = React.useState(null);
251
+ const [canvas, setCanvas] = React.useState(null);
475
252
  const [bind, setBind] = React.useState();
476
253
  const canvasProps = pick(props, CANVAS_PROPS);
477
254
  const viewProps = omit(props, CANVAS_PROPS);
@@ -491,14 +268,46 @@ const Canvas = /*#__PURE__*/React.forwardRef(({
491
268
  height
492
269
  });
493
270
  }, []);
271
+ const onContextCreate = React.useCallback(context => {
272
+ const canvasShim = {
273
+ width: context.drawingBufferWidth,
274
+ height: context.drawingBufferHeight,
275
+ style: {},
276
+ addEventListener: () => {},
277
+ removeEventListener: () => {},
278
+ clientHeight: context.drawingBufferHeight,
279
+ getContext: () => context
280
+ };
281
+ setCanvas(canvasShim);
282
+ }, []);
283
+
284
+ if (width > 0 && height > 0 && canvas) {
285
+ // Overwrite onCreated to apply RN bindings
286
+ const onCreated = state => {
287
+ // Bind events after creation
288
+ setBind(state.events.handlers); // Bind render to RN bridge
289
+
290
+ const context = state.gl.getContext();
291
+ const renderFrame = state.gl.render.bind(state.gl);
292
+
293
+ state.gl.render = (scene, camera) => {
294
+ renderFrame(scene, camera);
295
+ context.endFrameEXP();
296
+ };
494
297
 
495
- if (width > 0 && height > 0 && context) {
496
- const store = createRoot(context, { ...canvasProps,
298
+ return canvasProps == null ? void 0 : canvasProps.onCreated == null ? void 0 : canvasProps.onCreated(state);
299
+ };
300
+
301
+ createRoot(canvas, { ...canvasProps,
302
+ // expo-gl can only render at native dpr/resolution
303
+ // https://github.com/expo/expo-three/issues/39
304
+ dpr: PixelRatio.get(),
497
305
  size: {
498
306
  width,
499
307
  height
500
308
  },
501
- events: events || createTouchEvents
309
+ events: events || createTouchEvents,
310
+ onCreated
502
311
  }).render( /*#__PURE__*/React.createElement(ErrorBoundary, {
503
312
  set: setError
504
313
  }, /*#__PURE__*/React.createElement(React.Suspense, {
@@ -506,13 +315,11 @@ const Canvas = /*#__PURE__*/React.forwardRef(({
506
315
  set: setBlock
507
316
  })
508
317
  }, children)));
509
- const state = store.getState();
510
- setBind(state.events.connected.getEventHandlers());
511
318
  }
512
319
 
513
320
  React.useEffect(() => {
514
- return () => unmountComponentAtNode(context);
515
- }, [context]);
321
+ return () => unmountComponentAtNode(canvas);
322
+ }, [canvas]);
516
323
  return /*#__PURE__*/React.createElement(View, _extends({}, viewProps, {
517
324
  ref: forwardedRef,
518
325
  onLayout: onLayout,
@@ -521,17 +328,9 @@ const Canvas = /*#__PURE__*/React.forwardRef(({
521
328
  ...style
522
329
  }
523
330
  }, bind), width > 0 && /*#__PURE__*/React.createElement(GLView, {
524
- nativeRef_EXPERIMENTAL: ref => {
525
- if (nativeRef_EXPERIMENTAL && !nativeRef_EXPERIMENTAL.current) {
526
- nativeRef_EXPERIMENTAL.current = ref;
527
- }
528
- },
529
- onContextCreate: async gl => {
530
- await (onContextCreate == null ? void 0 : onContextCreate(gl));
531
- setContext(gl);
532
- },
331
+ onContextCreate: onContextCreate,
533
332
  style: StyleSheet.absoluteFill
534
333
  }));
535
334
  });
536
335
 
537
- export { Canvas, roots as _roots, act, advance, applyProps, createPortal, createRoot, createTouchEvents as events, invalidate, reconciler, render, unmountComponentAtNode, useLoader };
336
+ export { Canvas, createTouchEvents as events, useLoader };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/fiber",
3
- "version": "8.0.0-beta-03",
3
+ "version": "8.0.0-beta-04",
4
4
  "description": "A React renderer for Threejs",
5
5
  "keywords": [
6
6
  "react",
@@ -47,6 +47,7 @@
47
47
  "expo-asset": "^8.4.3",
48
48
  "expo-file-system": "^13.0.3",
49
49
  "expo-gl": "^11.0.3",
50
+ "expo": "^43.0.1",
50
51
  "react-merge-refs": "^1.1.0",
51
52
  "react-reconciler": "^0.27.0-rc.0",
52
53
  "react-use-measure": "^2.1.1",
@@ -1,36 +0,0 @@
1
- /// <reference types="react-reconciler" />
2
- import * as THREE from 'three';
3
- import * as React from 'react';
4
- import { UseStore } from 'zustand';
5
- import { dispose } from '../core/utils';
6
- import { Renderer, StoreProps, context, RootState, Size } from '../core/store';
7
- import { extend, Root } from '../core/renderer';
8
- import { addEffect, addAfterEffect, addTail } from '../core/loop';
9
- import { createTouchEvents as events } from './events';
10
- import { EventManager } from '../core/events';
11
- import { View } from 'react-native';
12
- import { ExpoWebGLRenderingContext } from 'expo-gl';
13
- export declare type GLContext = ExpoWebGLRenderingContext | WebGLRenderingContext;
14
- declare type Properties<T> = Pick<T, {
15
- [K in keyof T]: T[K] extends (_: any) => any ? never : K;
16
- }[keyof T]>;
17
- declare type GLProps = Renderer | ((canvas: HTMLCanvasElement, context: GLContext) => Renderer) | Partial<Properties<THREE.WebGLRenderer> | THREE.WebGLRendererParameters> | undefined;
18
- declare const roots: Map<GLContext, Root>;
19
- declare const invalidate: (state?: RootState | undefined) => void, advance: (timestamp: number, runGlobalEffects?: boolean, state?: RootState | undefined) => void;
20
- declare const reconciler: import("react-reconciler").Reconciler<unknown, unknown, unknown, unknown, unknown>, applyProps: typeof import("../core/utils").applyProps;
21
- export declare type RenderProps<TView extends View> = Omit<StoreProps, 'gl' | 'events' | 'size' | 'dpr'> & {
22
- gl?: GLProps;
23
- events?: (store: UseStore<RootState>) => EventManager<TView>;
24
- size?: Size;
25
- onCreated?: (state: RootState) => void;
26
- };
27
- declare function createRoot<TView extends View>(context: GLContext, config?: RenderProps<TView>): {
28
- render: (element: React.ReactNode) => UseStore<RootState>;
29
- unmount: () => void;
30
- };
31
- declare function render<TView extends View>(element: React.ReactNode, context: GLContext, config?: RenderProps<TView>): UseStore<RootState>;
32
- declare function unmountComponentAtNode(context: GLContext, callback?: (context: GLContext) => void): void;
33
- declare const act: any;
34
- declare function createPortal(children: React.ReactNode, container: THREE.Object3D): React.ReactNode;
35
- export * from './hooks';
36
- export { context, render, createRoot, unmountComponentAtNode, createPortal, events, reconciler, applyProps, dispose, invalidate, advance, extend, addEffect, addAfterEffect, addTail, act, roots as _roots, };