@react-three/fiber 9.0.0-alpha.1 → 9.0.0-alpha.3
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 +962 -444
- package/dist/declarations/src/core/events.d.ts +91 -69
- package/dist/declarations/src/core/hooks.d.ts +53 -24
- package/dist/declarations/src/core/index.d.ts +15 -61
- package/dist/declarations/src/core/loop.d.ts +31 -13
- package/dist/declarations/src/core/reconciler.d.ts +43 -0
- package/dist/declarations/src/core/renderer.d.ts +85 -51
- package/dist/declarations/src/core/stages.d.ts +64 -59
- package/dist/declarations/src/core/store.d.ts +147 -110
- package/dist/declarations/src/core/utils.d.ts +128 -81
- package/dist/declarations/src/index.d.ts +6 -12
- package/dist/declarations/src/native/Canvas.d.ts +14 -8
- package/dist/declarations/src/native/events.d.ts +4 -4
- package/dist/declarations/src/native.d.ts +6 -10
- package/dist/declarations/src/three-types.d.ts +56 -331
- package/dist/declarations/src/web/Canvas.d.ts +24 -9
- package/dist/declarations/src/web/events.d.ts +4 -4
- package/dist/loop-0698c205.cjs.dev.js +2496 -0
- package/dist/loop-a0ef8208.cjs.prod.js +2496 -0
- package/dist/loop-b2aca207.esm.js +2434 -0
- package/dist/react-three-fiber.cjs.d.ts +1 -0
- package/dist/react-three-fiber.cjs.dev.js +139 -100
- package/dist/react-three-fiber.cjs.prod.js +139 -100
- package/dist/react-three-fiber.esm.js +104 -68
- package/native/dist/react-three-fiber-native.cjs.d.ts +1 -0
- package/native/dist/react-three-fiber-native.cjs.dev.js +287 -212
- package/native/dist/react-three-fiber-native.cjs.prod.js +287 -212
- package/native/dist/react-three-fiber-native.esm.js +251 -181
- package/native/package.json +5 -5
- package/package.json +18 -11
- package/readme.md +253 -202
- package/dist/declarations/src/native/polyfills.d.ts +0 -1
- package/dist/index-2e1b7052.cjs.prod.js +0 -2362
- package/dist/index-65e750e4.cjs.dev.js +0 -2362
- package/dist/index-a9c7a6cd.esm.js +0 -2304
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var loop = require('./loop-a0ef8208.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
9
|
var useMeasure = require('react-use-measure');
|
|
10
|
+
var itsFine = require('its-fine');
|
|
10
11
|
require('react-reconciler/constants');
|
|
11
12
|
require('zustand');
|
|
12
13
|
require('react-reconciler');
|
|
@@ -49,64 +50,72 @@ const DOM_EVENTS = {
|
|
|
49
50
|
onPointerCancel: ['pointercancel', true],
|
|
50
51
|
onLostPointerCapture: ['lostpointercapture', true]
|
|
51
52
|
};
|
|
52
|
-
/** Default R3F event manager for web */
|
|
53
53
|
|
|
54
|
+
/** Default R3F event manager for web */
|
|
54
55
|
function createPointerEvents(store) {
|
|
55
56
|
const {
|
|
56
57
|
handlePointer
|
|
57
|
-
} =
|
|
58
|
+
} = loop.createEvents(store);
|
|
58
59
|
return {
|
|
59
60
|
priority: 1,
|
|
60
61
|
enabled: true,
|
|
61
|
-
|
|
62
62
|
compute(event, state, previous) {
|
|
63
63
|
// https://github.com/pmndrs/react-three-fiber/pull/782
|
|
64
64
|
// Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
|
|
65
65
|
state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
|
|
66
66
|
state.raycaster.setFromCamera(state.pointer, state.camera);
|
|
67
67
|
},
|
|
68
|
-
|
|
69
68
|
connected: undefined,
|
|
70
|
-
handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({
|
|
69
|
+
handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({
|
|
70
|
+
...acc,
|
|
71
71
|
[key]: handlePointer(key)
|
|
72
72
|
}), {}),
|
|
73
|
+
update: () => {
|
|
74
|
+
var _internal$lastEvent;
|
|
75
|
+
const {
|
|
76
|
+
events,
|
|
77
|
+
internal
|
|
78
|
+
} = store.getState();
|
|
79
|
+
if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) events.handlers.onPointerMove(internal.lastEvent.current);
|
|
80
|
+
},
|
|
73
81
|
connect: target => {
|
|
74
|
-
var _events$handlers;
|
|
75
|
-
|
|
76
82
|
const {
|
|
77
83
|
set,
|
|
78
84
|
events
|
|
79
85
|
} = store.getState();
|
|
80
86
|
events.disconnect == null ? void 0 : events.disconnect();
|
|
81
87
|
set(state => ({
|
|
82
|
-
events: {
|
|
88
|
+
events: {
|
|
89
|
+
...state.events,
|
|
83
90
|
connected: target
|
|
84
91
|
}
|
|
85
92
|
}));
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
passive
|
|
90
|
-
|
|
91
|
-
|
|
93
|
+
if (events.handlers) {
|
|
94
|
+
for (const name in events.handlers) {
|
|
95
|
+
const event = events.handlers[name];
|
|
96
|
+
const [eventName, passive] = DOM_EVENTS[name];
|
|
97
|
+
target.addEventListener(eventName, event, {
|
|
98
|
+
passive
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
92
102
|
},
|
|
93
103
|
disconnect: () => {
|
|
94
104
|
const {
|
|
95
105
|
set,
|
|
96
106
|
events
|
|
97
107
|
} = store.getState();
|
|
98
|
-
|
|
99
108
|
if (events.connected) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (events && events.connected instanceof HTMLElement) {
|
|
109
|
+
if (events.handlers) {
|
|
110
|
+
for (const name in events.handlers) {
|
|
111
|
+
const event = events.handlers[name];
|
|
104
112
|
const [eventName] = DOM_EVENTS[name];
|
|
105
113
|
events.connected.removeEventListener(eventName, event);
|
|
106
114
|
}
|
|
107
|
-
}
|
|
115
|
+
}
|
|
108
116
|
set(state => ({
|
|
109
|
-
events: {
|
|
117
|
+
events: {
|
|
118
|
+
...state.events,
|
|
110
119
|
connected: undefined
|
|
111
120
|
}
|
|
112
121
|
}));
|
|
@@ -115,17 +124,15 @@ function createPointerEvents(store) {
|
|
|
115
124
|
};
|
|
116
125
|
}
|
|
117
126
|
|
|
118
|
-
|
|
119
|
-
* A DOM canvas which accepts threejs elements as children.
|
|
120
|
-
* @see https://docs.pmnd.rs/react-three-fiber/api/canvas
|
|
121
|
-
*/
|
|
122
|
-
const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
|
|
127
|
+
const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
|
|
123
128
|
children,
|
|
124
129
|
fallback,
|
|
125
130
|
resize,
|
|
126
131
|
style,
|
|
127
132
|
gl,
|
|
128
133
|
events = createPointerEvents,
|
|
134
|
+
eventSource,
|
|
135
|
+
eventPrefix,
|
|
129
136
|
shadows,
|
|
130
137
|
linear,
|
|
131
138
|
flat,
|
|
@@ -136,6 +143,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
|
|
|
136
143
|
performance,
|
|
137
144
|
raycaster,
|
|
138
145
|
camera,
|
|
146
|
+
scene,
|
|
139
147
|
onPointerMissed,
|
|
140
148
|
onCreated,
|
|
141
149
|
stages,
|
|
@@ -144,7 +152,8 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
|
|
|
144
152
|
// Create a known catalogue of Threejs-native elements
|
|
145
153
|
// This will include the entire THREE namespace by default, users can extend
|
|
146
154
|
// their own elements by using the createRoot API instead
|
|
147
|
-
React__namespace.useMemo(() =>
|
|
155
|
+
React__namespace.useMemo(() => loop.extend(THREE__namespace), []);
|
|
156
|
+
const Bridge = loop.useBridge();
|
|
148
157
|
const [containerRef, containerRect] = useMeasure__default["default"]({
|
|
149
158
|
scroll: true,
|
|
150
159
|
debounce: {
|
|
@@ -155,56 +164,72 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
|
|
|
155
164
|
});
|
|
156
165
|
const canvasRef = React__namespace.useRef(null);
|
|
157
166
|
const divRef = React__namespace.useRef(null);
|
|
158
|
-
const [canvas, setCanvas] = React__namespace.useState(null);
|
|
159
167
|
React__namespace.useImperativeHandle(forwardedRef, () => canvasRef.current);
|
|
160
|
-
const handlePointerMissed =
|
|
168
|
+
const handlePointerMissed = loop.useMutableCallback(onPointerMissed);
|
|
161
169
|
const [block, setBlock] = React__namespace.useState(false);
|
|
162
|
-
const [error, setError] = React__namespace.useState(false);
|
|
163
|
-
|
|
164
|
-
if (block) throw block; // Throw exception outwards if anything within canvas throws
|
|
170
|
+
const [error, setError] = React__namespace.useState(false);
|
|
165
171
|
|
|
172
|
+
// Suspend this component if block is a promise (2nd run)
|
|
173
|
+
if (block) throw block;
|
|
174
|
+
// Throw exception outwards if anything within canvas throws
|
|
166
175
|
if (error) throw error;
|
|
167
176
|
const root = React__namespace.useRef(null);
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
if (
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
state
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
177
|
+
loop.useIsomorphicLayoutEffect(() => {
|
|
178
|
+
const canvas = canvasRef.current;
|
|
179
|
+
if (containerRect.width > 0 && containerRect.height > 0 && canvas) {
|
|
180
|
+
if (!root.current) root.current = loop.createRoot(canvas);
|
|
181
|
+
root.current.configure({
|
|
182
|
+
gl,
|
|
183
|
+
scene,
|
|
184
|
+
events,
|
|
185
|
+
shadows,
|
|
186
|
+
linear,
|
|
187
|
+
flat,
|
|
188
|
+
legacy,
|
|
189
|
+
orthographic,
|
|
190
|
+
frameloop,
|
|
191
|
+
dpr,
|
|
192
|
+
performance,
|
|
193
|
+
raycaster,
|
|
194
|
+
camera,
|
|
195
|
+
size: containerRect,
|
|
196
|
+
// Pass mutable reference to onPointerMissed so it's free to update
|
|
197
|
+
onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
|
|
198
|
+
onCreated: state => {
|
|
199
|
+
// Connect to event source
|
|
200
|
+
state.events.connect == null ? void 0 : state.events.connect(eventSource ? loop.isRef(eventSource) ? eventSource.current : eventSource : divRef.current);
|
|
201
|
+
// Set up compute function
|
|
202
|
+
if (eventPrefix) {
|
|
203
|
+
state.setEvents({
|
|
204
|
+
compute: (event, state) => {
|
|
205
|
+
const x = event[eventPrefix + 'X'];
|
|
206
|
+
const y = event[eventPrefix + 'Y'];
|
|
207
|
+
state.pointer.set(x / state.size.width * 2 - 1, -(y / state.size.height) * 2 + 1);
|
|
208
|
+
state.raycaster.setFromCamera(state.pointer, state.camera);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
// Call onCreated callback
|
|
213
|
+
onCreated == null ? void 0 : onCreated(state);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
root.current.render( /*#__PURE__*/React__namespace.createElement(Bridge, null, /*#__PURE__*/React__namespace.createElement(loop.ErrorBoundary, {
|
|
217
|
+
set: setError
|
|
218
|
+
}, /*#__PURE__*/React__namespace.createElement(React__namespace.Suspense, {
|
|
219
|
+
fallback: /*#__PURE__*/React__namespace.createElement(loop.Block, {
|
|
220
|
+
set: setBlock
|
|
221
|
+
})
|
|
222
|
+
}, children))));
|
|
223
|
+
}
|
|
224
|
+
});
|
|
205
225
|
React__namespace.useEffect(() => {
|
|
206
|
-
|
|
207
|
-
|
|
226
|
+
const canvas = canvasRef.current;
|
|
227
|
+
if (canvas) return () => loop.unmountComponentAtNode(canvas);
|
|
228
|
+
}, []);
|
|
229
|
+
|
|
230
|
+
// When the event source is not this div, we need to set pointer-events to none
|
|
231
|
+
// Or else the canvas will block events from reaching the event source
|
|
232
|
+
const pointerEvents = eventSource ? 'none' : 'auto';
|
|
208
233
|
return /*#__PURE__*/React__namespace.createElement("div", _extends({
|
|
209
234
|
ref: divRef,
|
|
210
235
|
style: {
|
|
@@ -212,6 +237,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
|
|
|
212
237
|
width: '100%',
|
|
213
238
|
height: '100%',
|
|
214
239
|
overflow: 'hidden',
|
|
240
|
+
pointerEvents,
|
|
215
241
|
...style
|
|
216
242
|
}
|
|
217
243
|
}, props), /*#__PURE__*/React__namespace.createElement("div", {
|
|
@@ -228,33 +254,46 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
|
|
|
228
254
|
}, fallback)));
|
|
229
255
|
});
|
|
230
256
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
exports.
|
|
242
|
-
exports.
|
|
243
|
-
exports.
|
|
244
|
-
exports.
|
|
245
|
-
exports.
|
|
246
|
-
exports.
|
|
247
|
-
exports.
|
|
248
|
-
exports.
|
|
249
|
-
exports.
|
|
250
|
-
exports.
|
|
251
|
-
exports.
|
|
252
|
-
exports.
|
|
253
|
-
exports.
|
|
254
|
-
exports.
|
|
255
|
-
exports.
|
|
256
|
-
exports.
|
|
257
|
-
exports.
|
|
258
|
-
exports.
|
|
257
|
+
/**
|
|
258
|
+
* A DOM canvas which accepts threejs elements as children.
|
|
259
|
+
* @see https://docs.pmnd.rs/react-three-fiber/api/canvas
|
|
260
|
+
*/
|
|
261
|
+
const Canvas = /*#__PURE__*/React__namespace.forwardRef(function CanvasWrapper(props, ref) {
|
|
262
|
+
return /*#__PURE__*/React__namespace.createElement(itsFine.FiberProvider, null, /*#__PURE__*/React__namespace.createElement(CanvasImpl, _extends({}, props, {
|
|
263
|
+
ref: ref
|
|
264
|
+
})));
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
exports.FixedStage = loop.FixedStage;
|
|
268
|
+
exports.ReactThreeFiber = loop.threeTypes;
|
|
269
|
+
exports.Stage = loop.Stage;
|
|
270
|
+
exports.Stages = loop.Stages;
|
|
271
|
+
exports._roots = loop._roots;
|
|
272
|
+
exports.act = loop.act;
|
|
273
|
+
exports.addAfterEffect = loop.addAfterEffect;
|
|
274
|
+
exports.addEffect = loop.addEffect;
|
|
275
|
+
exports.addTail = loop.addTail;
|
|
276
|
+
exports.advance = loop.advance;
|
|
277
|
+
exports.applyProps = loop.applyProps;
|
|
278
|
+
exports.buildGraph = loop.buildGraph;
|
|
279
|
+
exports.context = loop.context;
|
|
280
|
+
exports.createEvents = loop.createEvents;
|
|
281
|
+
exports.createPortal = loop.createPortal;
|
|
282
|
+
exports.createRoot = loop.createRoot;
|
|
283
|
+
exports.dispose = loop.dispose;
|
|
284
|
+
exports.extend = loop.extend;
|
|
285
|
+
exports.flushGlobalEffects = loop.flushGlobalEffects;
|
|
286
|
+
exports.getRootState = loop.getRootState;
|
|
287
|
+
exports.invalidate = loop.invalidate;
|
|
288
|
+
exports.reconciler = loop.reconciler;
|
|
289
|
+
exports.render = loop.render;
|
|
290
|
+
exports.unmountComponentAtNode = loop.unmountComponentAtNode;
|
|
291
|
+
exports.useFrame = loop.useFrame;
|
|
292
|
+
exports.useGraph = loop.useGraph;
|
|
293
|
+
exports.useInstanceHandle = loop.useInstanceHandle;
|
|
294
|
+
exports.useLoader = loop.useLoader;
|
|
295
|
+
exports.useStore = loop.useStore;
|
|
296
|
+
exports.useThree = loop.useThree;
|
|
297
|
+
exports.useUpdate = loop.useUpdate;
|
|
259
298
|
exports.Canvas = Canvas;
|
|
260
299
|
exports.events = createPointerEvents;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { c as createEvents, e as extend, u as
|
|
2
|
-
export { F as FixedStage, t as ReactThreeFiber, S as Stage,
|
|
1
|
+
import { c as createEvents, e as extend, u as useBridge, a as useMutableCallback, b as useIsomorphicLayoutEffect, d as createRoot, i as isRef, E as ErrorBoundary, B as Block, f as unmountComponentAtNode } from './loop-b2aca207.esm.js';
|
|
2
|
+
export { F as FixedStage, t as ReactThreeFiber, S as Stage, p as Stages, _ as _roots, x as act, j as addAfterEffect, h as addEffect, k as addTail, m as advance, s as applyProps, y as buildGraph, q as context, c as createEvents, o as createPortal, d as createRoot, w as dispose, e as extend, g as flushGlobalEffects, v as getRootState, l as invalidate, r as reconciler, n as render, f as unmountComponentAtNode, D as useFrame, H as useGraph, z as useInstanceHandle, I as useLoader, A as useStore, C as useThree, G as useUpdate } from './loop-b2aca207.esm.js';
|
|
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
6
|
import useMeasure from 'react-use-measure';
|
|
7
|
+
import { FiberProvider } from 'its-fine';
|
|
7
8
|
import 'react-reconciler/constants';
|
|
8
9
|
import 'zustand';
|
|
9
10
|
import 'react-reconciler';
|
|
@@ -22,8 +23,8 @@ const DOM_EVENTS = {
|
|
|
22
23
|
onPointerCancel: ['pointercancel', true],
|
|
23
24
|
onLostPointerCapture: ['lostpointercapture', true]
|
|
24
25
|
};
|
|
25
|
-
/** Default R3F event manager for web */
|
|
26
26
|
|
|
27
|
+
/** Default R3F event manager for web */
|
|
27
28
|
function createPointerEvents(store) {
|
|
28
29
|
const {
|
|
29
30
|
handlePointer
|
|
@@ -31,55 +32,63 @@ function createPointerEvents(store) {
|
|
|
31
32
|
return {
|
|
32
33
|
priority: 1,
|
|
33
34
|
enabled: true,
|
|
34
|
-
|
|
35
35
|
compute(event, state, previous) {
|
|
36
36
|
// https://github.com/pmndrs/react-three-fiber/pull/782
|
|
37
37
|
// Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
|
|
38
38
|
state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
|
|
39
39
|
state.raycaster.setFromCamera(state.pointer, state.camera);
|
|
40
40
|
},
|
|
41
|
-
|
|
42
41
|
connected: undefined,
|
|
43
|
-
handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({
|
|
42
|
+
handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({
|
|
43
|
+
...acc,
|
|
44
44
|
[key]: handlePointer(key)
|
|
45
45
|
}), {}),
|
|
46
|
+
update: () => {
|
|
47
|
+
var _internal$lastEvent;
|
|
48
|
+
const {
|
|
49
|
+
events,
|
|
50
|
+
internal
|
|
51
|
+
} = store.getState();
|
|
52
|
+
if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) events.handlers.onPointerMove(internal.lastEvent.current);
|
|
53
|
+
},
|
|
46
54
|
connect: target => {
|
|
47
|
-
var _events$handlers;
|
|
48
|
-
|
|
49
55
|
const {
|
|
50
56
|
set,
|
|
51
57
|
events
|
|
52
58
|
} = store.getState();
|
|
53
59
|
events.disconnect == null ? void 0 : events.disconnect();
|
|
54
60
|
set(state => ({
|
|
55
|
-
events: {
|
|
61
|
+
events: {
|
|
62
|
+
...state.events,
|
|
56
63
|
connected: target
|
|
57
64
|
}
|
|
58
65
|
}));
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
passive
|
|
63
|
-
|
|
64
|
-
|
|
66
|
+
if (events.handlers) {
|
|
67
|
+
for (const name in events.handlers) {
|
|
68
|
+
const event = events.handlers[name];
|
|
69
|
+
const [eventName, passive] = DOM_EVENTS[name];
|
|
70
|
+
target.addEventListener(eventName, event, {
|
|
71
|
+
passive
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
65
75
|
},
|
|
66
76
|
disconnect: () => {
|
|
67
77
|
const {
|
|
68
78
|
set,
|
|
69
79
|
events
|
|
70
80
|
} = store.getState();
|
|
71
|
-
|
|
72
81
|
if (events.connected) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (events && events.connected instanceof HTMLElement) {
|
|
82
|
+
if (events.handlers) {
|
|
83
|
+
for (const name in events.handlers) {
|
|
84
|
+
const event = events.handlers[name];
|
|
77
85
|
const [eventName] = DOM_EVENTS[name];
|
|
78
86
|
events.connected.removeEventListener(eventName, event);
|
|
79
87
|
}
|
|
80
|
-
}
|
|
88
|
+
}
|
|
81
89
|
set(state => ({
|
|
82
|
-
events: {
|
|
90
|
+
events: {
|
|
91
|
+
...state.events,
|
|
83
92
|
connected: undefined
|
|
84
93
|
}
|
|
85
94
|
}));
|
|
@@ -88,17 +97,15 @@ function createPointerEvents(store) {
|
|
|
88
97
|
};
|
|
89
98
|
}
|
|
90
99
|
|
|
91
|
-
|
|
92
|
-
* A DOM canvas which accepts threejs elements as children.
|
|
93
|
-
* @see https://docs.pmnd.rs/react-three-fiber/api/canvas
|
|
94
|
-
*/
|
|
95
|
-
const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
|
|
100
|
+
const CanvasImpl = /*#__PURE__*/React.forwardRef(function Canvas({
|
|
96
101
|
children,
|
|
97
102
|
fallback,
|
|
98
103
|
resize,
|
|
99
104
|
style,
|
|
100
105
|
gl,
|
|
101
106
|
events = createPointerEvents,
|
|
107
|
+
eventSource,
|
|
108
|
+
eventPrefix,
|
|
102
109
|
shadows,
|
|
103
110
|
linear,
|
|
104
111
|
flat,
|
|
@@ -109,6 +116,7 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
|
|
|
109
116
|
performance,
|
|
110
117
|
raycaster,
|
|
111
118
|
camera,
|
|
119
|
+
scene,
|
|
112
120
|
onPointerMissed,
|
|
113
121
|
onCreated,
|
|
114
122
|
stages,
|
|
@@ -118,6 +126,7 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
|
|
|
118
126
|
// This will include the entire THREE namespace by default, users can extend
|
|
119
127
|
// their own elements by using the createRoot API instead
|
|
120
128
|
React.useMemo(() => extend(THREE), []);
|
|
129
|
+
const Bridge = useBridge();
|
|
121
130
|
const [containerRef, containerRect] = useMeasure({
|
|
122
131
|
scroll: true,
|
|
123
132
|
debounce: {
|
|
@@ -128,56 +137,72 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
|
|
|
128
137
|
});
|
|
129
138
|
const canvasRef = React.useRef(null);
|
|
130
139
|
const divRef = React.useRef(null);
|
|
131
|
-
const [canvas, setCanvas] = React.useState(null);
|
|
132
140
|
React.useImperativeHandle(forwardedRef, () => canvasRef.current);
|
|
133
141
|
const handlePointerMissed = useMutableCallback(onPointerMissed);
|
|
134
142
|
const [block, setBlock] = React.useState(false);
|
|
135
|
-
const [error, setError] = React.useState(false);
|
|
136
|
-
|
|
137
|
-
if (block) throw block; // Throw exception outwards if anything within canvas throws
|
|
143
|
+
const [error, setError] = React.useState(false);
|
|
138
144
|
|
|
145
|
+
// Suspend this component if block is a promise (2nd run)
|
|
146
|
+
if (block) throw block;
|
|
147
|
+
// Throw exception outwards if anything within canvas throws
|
|
139
148
|
if (error) throw error;
|
|
140
149
|
const root = React.useRef(null);
|
|
141
|
-
|
|
142
|
-
if (containerRect.width > 0 && containerRect.height > 0 && canvas) {
|
|
143
|
-
if (!root.current) root.current = createRoot(canvas);
|
|
144
|
-
root.current.configure({
|
|
145
|
-
gl,
|
|
146
|
-
events,
|
|
147
|
-
shadows,
|
|
148
|
-
linear,
|
|
149
|
-
flat,
|
|
150
|
-
legacy,
|
|
151
|
-
orthographic,
|
|
152
|
-
frameloop,
|
|
153
|
-
dpr,
|
|
154
|
-
performance,
|
|
155
|
-
raycaster,
|
|
156
|
-
camera,
|
|
157
|
-
stages,
|
|
158
|
-
size: containerRect,
|
|
159
|
-
// Pass mutable reference to onPointerMissed so it's free to update
|
|
160
|
-
onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
|
|
161
|
-
onCreated: state => {
|
|
162
|
-
state.events.connect == null ? void 0 : state.events.connect(divRef.current);
|
|
163
|
-
onCreated == null ? void 0 : onCreated(state);
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
root.current.render( /*#__PURE__*/React.createElement(ErrorBoundary, {
|
|
167
|
-
set: setError
|
|
168
|
-
}, /*#__PURE__*/React.createElement(React.Suspense, {
|
|
169
|
-
fallback: /*#__PURE__*/React.createElement(Block, {
|
|
170
|
-
set: setBlock
|
|
171
|
-
})
|
|
172
|
-
}, children)));
|
|
173
|
-
}
|
|
174
|
-
|
|
175
150
|
useIsomorphicLayoutEffect(() => {
|
|
176
|
-
|
|
177
|
-
|
|
151
|
+
const canvas = canvasRef.current;
|
|
152
|
+
if (containerRect.width > 0 && containerRect.height > 0 && canvas) {
|
|
153
|
+
if (!root.current) root.current = createRoot(canvas);
|
|
154
|
+
root.current.configure({
|
|
155
|
+
gl,
|
|
156
|
+
scene,
|
|
157
|
+
events,
|
|
158
|
+
shadows,
|
|
159
|
+
linear,
|
|
160
|
+
flat,
|
|
161
|
+
legacy,
|
|
162
|
+
orthographic,
|
|
163
|
+
frameloop,
|
|
164
|
+
dpr,
|
|
165
|
+
performance,
|
|
166
|
+
raycaster,
|
|
167
|
+
camera,
|
|
168
|
+
size: containerRect,
|
|
169
|
+
// Pass mutable reference to onPointerMissed so it's free to update
|
|
170
|
+
onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
|
|
171
|
+
onCreated: state => {
|
|
172
|
+
// Connect to event source
|
|
173
|
+
state.events.connect == null ? void 0 : state.events.connect(eventSource ? isRef(eventSource) ? eventSource.current : eventSource : divRef.current);
|
|
174
|
+
// Set up compute function
|
|
175
|
+
if (eventPrefix) {
|
|
176
|
+
state.setEvents({
|
|
177
|
+
compute: (event, state) => {
|
|
178
|
+
const x = event[eventPrefix + 'X'];
|
|
179
|
+
const y = event[eventPrefix + 'Y'];
|
|
180
|
+
state.pointer.set(x / state.size.width * 2 - 1, -(y / state.size.height) * 2 + 1);
|
|
181
|
+
state.raycaster.setFromCamera(state.pointer, state.camera);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
// Call onCreated callback
|
|
186
|
+
onCreated == null ? void 0 : onCreated(state);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
root.current.render( /*#__PURE__*/React.createElement(Bridge, null, /*#__PURE__*/React.createElement(ErrorBoundary, {
|
|
190
|
+
set: setError
|
|
191
|
+
}, /*#__PURE__*/React.createElement(React.Suspense, {
|
|
192
|
+
fallback: /*#__PURE__*/React.createElement(Block, {
|
|
193
|
+
set: setBlock
|
|
194
|
+
})
|
|
195
|
+
}, children))));
|
|
196
|
+
}
|
|
197
|
+
});
|
|
178
198
|
React.useEffect(() => {
|
|
199
|
+
const canvas = canvasRef.current;
|
|
179
200
|
if (canvas) return () => unmountComponentAtNode(canvas);
|
|
180
|
-
}, [
|
|
201
|
+
}, []);
|
|
202
|
+
|
|
203
|
+
// When the event source is not this div, we need to set pointer-events to none
|
|
204
|
+
// Or else the canvas will block events from reaching the event source
|
|
205
|
+
const pointerEvents = eventSource ? 'none' : 'auto';
|
|
181
206
|
return /*#__PURE__*/React.createElement("div", _extends({
|
|
182
207
|
ref: divRef,
|
|
183
208
|
style: {
|
|
@@ -185,6 +210,7 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
|
|
|
185
210
|
width: '100%',
|
|
186
211
|
height: '100%',
|
|
187
212
|
overflow: 'hidden',
|
|
213
|
+
pointerEvents,
|
|
188
214
|
...style
|
|
189
215
|
}
|
|
190
216
|
}, props), /*#__PURE__*/React.createElement("div", {
|
|
@@ -201,4 +227,14 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
|
|
|
201
227
|
}, fallback)));
|
|
202
228
|
});
|
|
203
229
|
|
|
230
|
+
/**
|
|
231
|
+
* A DOM canvas which accepts threejs elements as children.
|
|
232
|
+
* @see https://docs.pmnd.rs/react-three-fiber/api/canvas
|
|
233
|
+
*/
|
|
234
|
+
const Canvas = /*#__PURE__*/React.forwardRef(function CanvasWrapper(props, ref) {
|
|
235
|
+
return /*#__PURE__*/React.createElement(FiberProvider, null, /*#__PURE__*/React.createElement(CanvasImpl, _extends({}, props, {
|
|
236
|
+
ref: ref
|
|
237
|
+
})));
|
|
238
|
+
});
|
|
239
|
+
|
|
204
240
|
export { Canvas, createPointerEvents as events };
|
|
@@ -1 +1,2 @@
|
|
|
1
1
|
export * from "../../dist/declarations/src/native";
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtdGhyZWUtZmliZXItbmF0aXZlLmNqcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZGlzdC9kZWNsYXJhdGlvbnMvc3JjL25hdGl2ZS5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIn0=
|