@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.
@@ -1,5 +1,5 @@
1
- import { c as createEvents, e as extend, u as useMutableCallback, b as createRoot, E as ErrorBoundary, B as Block, d as unmountComponentAtNode } from '../../dist/index-99983b2d.esm.js';
2
- export { t as ReactThreeFiber, x as _roots, v as act, o as addAfterEffect, n as addEffect, p as addTail, m as advance, j as applyProps, w as buildGraph, f as context, c as createEvents, g as createPortal, b as createRoot, k as dispose, e as extend, q as flushGlobalEffects, s as getRootState, l as invalidate, h as reconciler, r as render, d as unmountComponentAtNode, C as useFrame, D as useGraph, y as useInstanceHandle, F as useLoader, z as useStore, A as useThree } from '../../dist/index-99983b2d.esm.js';
1
+ import { c as createPointerEvents, e as extend, u as useMutableCallback, b as createRoot, E as ErrorBoundary, B as Block, d as unmountComponentAtNode, f as createEvents } from '../../dist/events-3515660a.esm.js';
2
+ export { t as ReactThreeFiber, z as _roots, x as act, p as addAfterEffect, o as addEffect, q as addTail, n as advance, k as applyProps, y as buildGraph, g as context, f as createEvents, c as createPointerEvents, h as createPortal, b as createRoot, l as dispose, e as extend, s as flushGlobalEffects, v as flushSync, w as getRootState, m as invalidate, j as reconciler, r as render, d as unmountComponentAtNode, F as useFrame, G as useGraph, A as useInstanceHandle, H as useLoader, C as useStore, D as useThree } from '../../dist/events-3515660a.esm.js';
3
3
  import * as React from 'react';
4
4
  import * as THREE from 'three';
5
5
  import { PanResponder, PixelRatio, View, StyleSheet, Platform, Image, NativeModules } from 'react-native';
@@ -12,91 +12,9 @@ import { fromByteArray } from 'base64-js';
12
12
  import { Buffer } from 'buffer';
13
13
  import 'react-reconciler/constants';
14
14
  import 'zustand';
15
+ import 'suspend-react';
15
16
  import 'react-reconciler';
16
17
  import 'scheduler';
17
- import 'suspend-react';
18
-
19
- /** Default R3F event manager for react-native */
20
- function createTouchEvents(store) {
21
- const {
22
- handlePointer
23
- } = createEvents(store);
24
- const handleTouch = (event, name) => {
25
- event.persist()
26
-
27
- // Apply offset
28
- ;
29
- event.nativeEvent.offsetX = event.nativeEvent.locationX;
30
- event.nativeEvent.offsetY = event.nativeEvent.locationY;
31
-
32
- // Emulate DOM event
33
- const callback = handlePointer(name);
34
- callback(event.nativeEvent);
35
- return true;
36
- };
37
- const responder = PanResponder.create({
38
- onStartShouldSetPanResponder: () => true,
39
- onMoveShouldSetPanResponder: () => true,
40
- onMoveShouldSetPanResponderCapture: () => true,
41
- onPanResponderTerminationRequest: () => true,
42
- onStartShouldSetPanResponderCapture: e => handleTouch(e, 'onPointerCapture'),
43
- onPanResponderStart: e => handleTouch(e, 'onPointerDown'),
44
- onPanResponderMove: e => handleTouch(e, 'onPointerMove'),
45
- onPanResponderEnd: (e, state) => {
46
- handleTouch(e, 'onPointerUp');
47
- if (Math.hypot(state.dx, state.dy) < 20) handleTouch(e, 'onClick');
48
- },
49
- onPanResponderRelease: e => handleTouch(e, 'onPointerLeave'),
50
- onPanResponderTerminate: e => handleTouch(e, 'onLostPointerCapture'),
51
- onPanResponderReject: e => handleTouch(e, 'onLostPointerCapture')
52
- });
53
- return {
54
- priority: 1,
55
- enabled: true,
56
- compute(event, state, previous) {
57
- // https://github.com/pmndrs/react-three-fiber/pull/782
58
- // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
59
- state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
60
- state.raycaster.setFromCamera(state.pointer, state.camera);
61
- },
62
- connected: undefined,
63
- handlers: responder.panHandlers,
64
- update: () => {
65
- var _internal$lastEvent;
66
- const {
67
- events,
68
- internal
69
- } = store.getState();
70
- if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) {
71
- handlePointer('onPointerMove')(internal.lastEvent.current);
72
- }
73
- },
74
- connect: () => {
75
- const {
76
- set,
77
- events
78
- } = store.getState();
79
- events.disconnect == null ? void 0 : events.disconnect();
80
- set(state => ({
81
- events: {
82
- ...state.events,
83
- connected: true
84
- }
85
- }));
86
- },
87
- disconnect: () => {
88
- const {
89
- set
90
- } = store.getState();
91
- set(state => ({
92
- events: {
93
- ...state.events,
94
- connected: false
95
- }
96
- }));
97
- }
98
- };
99
- }
100
18
 
101
19
  /**
102
20
  * A native canvas which accepts threejs elements as children.
@@ -106,7 +24,7 @@ const CanvasImpl = /*#__PURE__*/React.forwardRef(({
106
24
  children,
107
25
  style,
108
26
  gl,
109
- events = createTouchEvents,
27
+ events = createPointerEvents,
110
28
  shadows,
111
29
  linear,
112
30
  flat,
@@ -169,22 +87,86 @@ const CanvasImpl = /*#__PURE__*/React.forwardRef(({
169
87
  // Called on context create or swap
170
88
  // https://github.com/pmndrs/react-three-fiber/pull/2297
171
89
  const onContextCreate = React.useCallback(context => {
172
- const canvasShim = {
90
+ const listeners = new Map();
91
+ const canvas = {
92
+ style: {},
173
93
  width: context.drawingBufferWidth,
174
94
  height: context.drawingBufferHeight,
175
- style: {},
176
- addEventListener: () => {},
177
- removeEventListener: () => {},
95
+ clientWidth: context.drawingBufferWidth,
178
96
  clientHeight: context.drawingBufferHeight,
179
97
  getContext: (_, {
180
98
  antialias = false
181
99
  }) => {
182
100
  setAntialias(antialias);
183
101
  return context;
102
+ },
103
+ addEventListener(type, listener) {
104
+ let callbacks = listeners.get(type);
105
+ if (!callbacks) {
106
+ callbacks = [];
107
+ listeners.set(type, callbacks);
108
+ }
109
+ callbacks.push(listener);
110
+ },
111
+ removeEventListener(type, listener) {
112
+ const callbacks = listeners.get(type);
113
+ if (callbacks) {
114
+ const index = callbacks.indexOf(listener);
115
+ if (index !== -1) callbacks.splice(index, 1);
116
+ }
117
+ },
118
+ dispatchEvent(event) {
119
+ Object.assign(event, {
120
+ target: this
121
+ });
122
+ const callbacks = listeners.get(event.type);
123
+ if (callbacks) {
124
+ for (const callback of callbacks) {
125
+ callback(event);
126
+ }
127
+ }
128
+ },
129
+ setPointerCapture() {
130
+ // TODO
131
+ },
132
+ releasePointerCapture() {
133
+ // TODO
184
134
  }
185
135
  };
186
- root.current = createRoot(canvasShim);
187
- setCanvas(canvasShim);
136
+
137
+ // TODO: this is wrong but necessary to trick controls
138
+ // @ts-ignore
139
+ canvas.ownerDocument = canvas;
140
+ canvas.getRootNode = () => canvas;
141
+ root.current = createRoot(canvas);
142
+ setCanvas(canvas);
143
+ function handleTouch(gestureEvent, type) {
144
+ gestureEvent.persist();
145
+ canvas.dispatchEvent(Object.assign(gestureEvent.nativeEvent, {
146
+ type,
147
+ offsetX: gestureEvent.nativeEvent.locationX,
148
+ offsetY: gestureEvent.nativeEvent.locationY,
149
+ pointerType: 'touch'
150
+ }));
151
+ return true;
152
+ }
153
+ const responder = PanResponder.create({
154
+ onStartShouldSetPanResponder: () => true,
155
+ onMoveShouldSetPanResponder: () => true,
156
+ onMoveShouldSetPanResponderCapture: () => true,
157
+ onPanResponderTerminationRequest: () => true,
158
+ onStartShouldSetPanResponderCapture: e => handleTouch(e, 'pointercapture'),
159
+ onPanResponderStart: e => handleTouch(e, 'pointerdown'),
160
+ onPanResponderMove: e => handleTouch(e, 'pointermove'),
161
+ onPanResponderEnd: (e, state) => {
162
+ handleTouch(e, 'pointerup');
163
+ if (Math.hypot(state.dx, state.dy) < 20) handleTouch(e, 'click');
164
+ },
165
+ onPanResponderRelease: e => handleTouch(e, 'pointerleave'),
166
+ onPanResponderTerminate: e => handleTouch(e, 'lostpointercapture'),
167
+ onPanResponderReject: e => handleTouch(e, 'lostpointercapture')
168
+ });
169
+ setBind(responder.panHandlers);
188
170
  }, []);
189
171
  if (root.current && width > 0 && height > 0) {
190
172
  root.current.configure({
@@ -213,9 +195,6 @@ const CanvasImpl = /*#__PURE__*/React.forwardRef(({
213
195
  onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
214
196
  // Overwrite onCreated to apply RN bindings
215
197
  onCreated: state => {
216
- // Bind events after creation
217
- setBind(state.events.handlers);
218
-
219
198
  // Bind render to RN bridge
220
199
  const context = state.gl.getContext();
221
200
  const renderFrame = state.gl.render.bind(state.gl);
@@ -244,18 +223,23 @@ const CanvasImpl = /*#__PURE__*/React.forwardRef(({
244
223
  }
245
224
  }, [canvas]);
246
225
  return /*#__PURE__*/jsx(View, {
247
- ...props,
248
226
  ref: viewRef,
249
227
  onLayout: onLayout,
250
228
  style: {
251
229
  flex: 1,
252
230
  ...style
253
231
  },
254
- ...bind,
255
- children: width > 0 && /*#__PURE__*/jsx(GLView, {
256
- msaaSamples: antialias ? 4 : 0,
257
- onContextCreate: onContextCreate,
258
- style: StyleSheet.absoluteFill
232
+ children: /*#__PURE__*/jsx(View, {
233
+ ...props,
234
+ style: {
235
+ flex: 1
236
+ },
237
+ children: width > 0 && /*#__PURE__*/jsx(GLView, {
238
+ ...bind,
239
+ msaaSamples: antialias ? 4 : 0,
240
+ onContextCreate: onContextCreate,
241
+ style: StyleSheet.absoluteFill
242
+ })
259
243
  })
260
244
  });
261
245
  });
@@ -273,6 +257,88 @@ const Canvas = /*#__PURE__*/React.forwardRef(function CanvasWrapper(props, ref)
273
257
  });
274
258
  });
275
259
 
260
+ /** Default R3F event manager for react-native */
261
+ function createTouchEvents(store) {
262
+ const {
263
+ handlePointer
264
+ } = createEvents(store);
265
+ const handleTouch = (event, name) => {
266
+ event.persist()
267
+
268
+ // Apply offset
269
+ ;
270
+ event.nativeEvent.offsetX = event.nativeEvent.locationX;
271
+ event.nativeEvent.offsetY = event.nativeEvent.locationY;
272
+
273
+ // Emulate DOM event
274
+ const callback = handlePointer(name);
275
+ callback(event.nativeEvent);
276
+ return true;
277
+ };
278
+ const responder = PanResponder.create({
279
+ onStartShouldSetPanResponder: () => true,
280
+ onMoveShouldSetPanResponder: () => true,
281
+ onMoveShouldSetPanResponderCapture: () => true,
282
+ onPanResponderTerminationRequest: () => true,
283
+ onStartShouldSetPanResponderCapture: e => handleTouch(e, 'onPointerCapture'),
284
+ onPanResponderStart: e => handleTouch(e, 'onPointerDown'),
285
+ onPanResponderMove: e => handleTouch(e, 'onPointerMove'),
286
+ onPanResponderEnd: (e, state) => {
287
+ handleTouch(e, 'onPointerUp');
288
+ if (Math.hypot(state.dx, state.dy) < 20) handleTouch(e, 'onClick');
289
+ },
290
+ onPanResponderRelease: e => handleTouch(e, 'onPointerLeave'),
291
+ onPanResponderTerminate: e => handleTouch(e, 'onLostPointerCapture'),
292
+ onPanResponderReject: e => handleTouch(e, 'onLostPointerCapture')
293
+ });
294
+ return {
295
+ priority: 1,
296
+ enabled: true,
297
+ compute(event, state, previous) {
298
+ // https://github.com/pmndrs/react-three-fiber/pull/782
299
+ // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
300
+ state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
301
+ state.raycaster.setFromCamera(state.pointer, state.camera);
302
+ },
303
+ connected: undefined,
304
+ handlers: responder.panHandlers,
305
+ update: () => {
306
+ var _internal$lastEvent;
307
+ const {
308
+ events,
309
+ internal
310
+ } = store.getState();
311
+ if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) {
312
+ handlePointer('onPointerMove')(internal.lastEvent.current);
313
+ }
314
+ },
315
+ connect: () => {
316
+ const {
317
+ set,
318
+ events
319
+ } = store.getState();
320
+ events.disconnect == null ? void 0 : events.disconnect();
321
+ set(state => ({
322
+ events: {
323
+ ...state.events,
324
+ connected: true
325
+ }
326
+ }));
327
+ },
328
+ disconnect: () => {
329
+ const {
330
+ set
331
+ } = store.getState();
332
+ set(state => ({
333
+ events: {
334
+ ...state.events,
335
+ connected: false
336
+ }
337
+ }));
338
+ }
339
+ };
340
+ }
341
+
276
342
  // http://stackoverflow.com/questions/105034
277
343
  function uuidv4() {
278
344
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/fiber",
3
- "version": "8.16.8",
3
+ "version": "8.17.1",
4
4
  "description": "A React renderer for Threejs",
5
5
  "keywords": [
6
6
  "react",
@@ -43,13 +43,14 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@babel/runtime": "^7.17.8",
46
+ "@types/debounce": "^1.2.1",
46
47
  "@types/react-reconciler": "^0.26.7",
47
48
  "@types/webxr": "*",
48
49
  "base64-js": "^1.5.1",
49
50
  "buffer": "^6.0.3",
51
+ "debounce": "^1.2.1",
50
52
  "its-fine": "^1.0.6",
51
53
  "react-reconciler": "^0.27.0",
52
- "react-use-measure": "^2.1.1",
53
54
  "scheduler": "^0.21.0",
54
55
  "suspend-react": "^0.1.3",
55
56
  "zustand": "^3.7.1"
@@ -1,93 +0,0 @@
1
- import * as THREE from 'three';
2
- import type { UseBoundStore } from 'zustand';
3
- import type { RootState } from './store';
4
- import type { Properties } from '../three-types';
5
- export interface Intersection extends THREE.Intersection {
6
- /** The event source (the object which registered the handler) */
7
- eventObject: THREE.Object3D;
8
- }
9
- export interface IntersectionEvent<TSourceEvent> extends Intersection {
10
- /** The event source (the object which registered the handler) */
11
- eventObject: THREE.Object3D;
12
- /** An array of intersections */
13
- intersections: Intersection[];
14
- /** vec3.set(pointer.x, pointer.y, 0).unproject(camera) */
15
- unprojectedPoint: THREE.Vector3;
16
- /** Normalized event coordinates */
17
- pointer: THREE.Vector2;
18
- /** Delta between first click and this event */
19
- delta: number;
20
- /** The ray that pierced it */
21
- ray: THREE.Ray;
22
- /** The camera that was used by the raycaster */
23
- camera: Camera;
24
- /** stopPropagation will stop underlying handlers from firing */
25
- stopPropagation: () => void;
26
- /** The original host event */
27
- nativeEvent: TSourceEvent;
28
- /** If the event was stopped by calling stopPropagation */
29
- stopped: boolean;
30
- }
31
- export declare type Camera = THREE.OrthographicCamera | THREE.PerspectiveCamera;
32
- export declare type ThreeEvent<TEvent> = IntersectionEvent<TEvent> & Properties<TEvent>;
33
- export declare type DomEvent = PointerEvent | MouseEvent | WheelEvent;
34
- export declare type Events = {
35
- onClick: EventListener;
36
- onContextMenu: EventListener;
37
- onDoubleClick: EventListener;
38
- onWheel: EventListener;
39
- onPointerDown: EventListener;
40
- onPointerUp: EventListener;
41
- onPointerLeave: EventListener;
42
- onPointerMove: EventListener;
43
- onPointerCancel: EventListener;
44
- onLostPointerCapture: EventListener;
45
- };
46
- export declare type EventHandlers = {
47
- onClick?: (event: ThreeEvent<MouseEvent>) => void;
48
- onContextMenu?: (event: ThreeEvent<MouseEvent>) => void;
49
- onDoubleClick?: (event: ThreeEvent<MouseEvent>) => void;
50
- onPointerUp?: (event: ThreeEvent<PointerEvent>) => void;
51
- onPointerDown?: (event: ThreeEvent<PointerEvent>) => void;
52
- onPointerOver?: (event: ThreeEvent<PointerEvent>) => void;
53
- onPointerOut?: (event: ThreeEvent<PointerEvent>) => void;
54
- onPointerEnter?: (event: ThreeEvent<PointerEvent>) => void;
55
- onPointerLeave?: (event: ThreeEvent<PointerEvent>) => void;
56
- onPointerMove?: (event: ThreeEvent<PointerEvent>) => void;
57
- onPointerMissed?: (event: MouseEvent) => void;
58
- onPointerCancel?: (event: ThreeEvent<PointerEvent>) => void;
59
- onWheel?: (event: ThreeEvent<WheelEvent>) => void;
60
- };
61
- export declare type FilterFunction = (items: THREE.Intersection[], state: RootState) => THREE.Intersection[];
62
- export declare type ComputeFunction = (event: DomEvent, root: RootState, previous?: RootState) => void;
63
- export interface EventManager<TTarget> {
64
- /** Determines if the event layer is active */
65
- enabled: boolean;
66
- /** Event layer priority, higher prioritized layers come first and may stop(-propagate) lower layer */
67
- priority: number;
68
- /** The compute function needs to set up the raycaster and an xy- pointer */
69
- compute?: ComputeFunction;
70
- /** The filter can re-order or re-structure the intersections */
71
- filter?: FilterFunction;
72
- /** The target node the event layer is tied to */
73
- connected?: TTarget;
74
- /** All the pointer event handlers through which the host forwards native events */
75
- handlers?: Events;
76
- /** Allows re-connecting to another target */
77
- connect?: (target: TTarget) => void;
78
- /** Removes all existing events handlers from the target */
79
- disconnect?: () => void;
80
- /** Triggers a onPointerMove with the last known event. This can be useful to enable raycasting without
81
- * explicit user interaction, for instance when the camera moves a hoverable object underneath the cursor.
82
- */
83
- update?: () => void;
84
- }
85
- export interface PointerCaptureTarget {
86
- intersection: Intersection;
87
- target: Element;
88
- }
89
- export declare function getEventPriority(): 1 | 16 | 4;
90
- export declare function removeInteractivity(store: UseBoundStore<RootState>, object: THREE.Object3D): void;
91
- export declare function createEvents(store: UseBoundStore<RootState>): {
92
- handlePointer: (name: string) => (event: DomEvent) => void;
93
- };
@@ -1,57 +0,0 @@
1
- import * as THREE from 'three';
2
- import * as React from 'react';
3
- import { StateSelector, EqualityChecker } from 'zustand';
4
- import { RootState, RenderCallback } from './store';
5
- import { ObjectMap } from './utils';
6
- import { LocalState } from './renderer';
7
- export interface Loader<T> extends THREE.Loader {
8
- load(url: string, onLoad?: (result: T) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: unknown) => void): unknown;
9
- loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<T>;
10
- }
11
- export declare type LoaderProto<T> = new (...args: any) => Loader<T extends unknown ? any : T>;
12
- export declare type LoaderReturnType<T, L extends LoaderProto<T>> = T extends unknown ? Awaited<ReturnType<InstanceType<L>['loadAsync']>> : T;
13
- export declare type LoaderResult<T> = T extends any[] ? Loader<T[number]> : Loader<T>;
14
- export declare type Extensions<T extends {
15
- prototype: LoaderProto<any>;
16
- }> = (loader: T['prototype']) => void;
17
- export declare type ConditionalType<Child, Parent, Truthy, Falsy> = Child extends Parent ? Truthy : Falsy;
18
- export declare type BranchingReturn<T, Parent, Coerced> = ConditionalType<T, Parent, Coerced, T>;
19
- /**
20
- * Exposes an object's {@link LocalState}.
21
- * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#useInstanceHandle
22
- *
23
- * **Note**: this is an escape hatch to react-internal fields. Expect this to change significantly between versions.
24
- */
25
- export declare function useInstanceHandle<O>(ref: React.MutableRefObject<O>): React.MutableRefObject<LocalState>;
26
- export declare function useStore(): import("zustand").UseBoundStore<RootState, import("zustand").StoreApi<RootState>>;
27
- /**
28
- * Accesses R3F's internal state, containing renderer, canvas, scene, etc.
29
- * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#usethree
30
- */
31
- export declare function useThree<T = RootState>(selector?: StateSelector<RootState, T>, equalityFn?: EqualityChecker<T>): T;
32
- /**
33
- * Executes a callback before render in a shared frame loop.
34
- * Can order effects with render priority or manually render with a positive priority.
35
- * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#useframe
36
- */
37
- export declare function useFrame(callback: RenderCallback, renderPriority?: number): null;
38
- /**
39
- * Returns a node graph of an object with named nodes & materials.
40
- * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#usegraph
41
- */
42
- export declare function useGraph(object: THREE.Object3D): ObjectMap;
43
- declare type GLTFLike = {
44
- scene: THREE.Object3D;
45
- };
46
- /**
47
- * Synchronously loads and caches assets with a three loader.
48
- *
49
- * Note: this hook's caller must be wrapped with `React.Suspense`
50
- * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#useloader
51
- */
52
- export declare function useLoader<T, U extends string | string[], L extends LoaderProto<T>, R = LoaderReturnType<T, L>>(Proto: L, input: U, extensions?: Extensions<L>, onProgress?: (event: ProgressEvent<EventTarget>) => void): U extends any[] ? BranchingReturn<R, GLTFLike, R & ObjectMap>[] : BranchingReturn<R, GLTFLike, R & ObjectMap>;
53
- export declare namespace useLoader {
54
- var preload: <T, U extends string | string[], L extends LoaderProto<T>>(Proto: L, input: U, extensions?: Extensions<L> | undefined) => undefined;
55
- var clear: <T, U extends string | string[], L extends LoaderProto<T>>(Proto: L, input: U) => void;
56
- }
57
- export {};
@@ -1,87 +0,0 @@
1
- /// <reference types="offscreencanvas" />
2
- import * as THREE from 'three';
3
- import * as React from 'react';
4
- import { UseBoundStore } from 'zustand';
5
- import * as ReactThreeFiber from '../three-types';
6
- import { Renderer, context, RootState, Size, Dpr, Performance, PrivateKeys } from './store';
7
- import { extend, Root } from './renderer';
8
- import { addEffect, addAfterEffect, addTail, flushGlobalEffects, Invalidate, Advance } from './loop';
9
- import { EventManager, ComputeFunction } from './events';
10
- import { dispose, getRootState, Camera, buildGraph } from './utils';
11
- import type { Properties } from '../three-types';
12
- declare type Canvas = HTMLCanvasElement | OffscreenCanvas;
13
- declare const roots: Map<Canvas, Root>;
14
- declare const invalidate: Invalidate, advance: Advance;
15
- declare const reconciler: import("react-reconciler").Reconciler<UseBoundStore<RootState, import("zustand").StoreApi<RootState>>, import("./renderer").Instance, void, import("./renderer").Instance, import("./renderer").Instance>, applyProps: typeof import("./utils").applyProps;
16
- declare type GLProps = Renderer | ((canvas: Canvas) => Renderer) | Partial<Properties<THREE.WebGLRenderer> | THREE.WebGLRendererParameters> | undefined;
17
- export declare type RenderProps<TCanvas extends Canvas> = {
18
- /** A threejs renderer instance or props that go into the default renderer */
19
- gl?: GLProps;
20
- /** Dimensions to fit the renderer to. Will measure canvas dimensions if omitted */
21
- size?: Size;
22
- /**
23
- * Enables shadows (by default PCFsoft). Can accept `gl.shadowMap` options for fine-tuning,
24
- * but also strings: 'basic' | 'percentage' | 'soft' | 'variance'.
25
- * @see https://threejs.org/docs/#api/en/renderers/WebGLRenderer.shadowMap
26
- */
27
- shadows?: boolean | 'basic' | 'percentage' | 'soft' | 'variance' | Partial<THREE.WebGLShadowMap>;
28
- /**
29
- * Disables three r139 color management.
30
- * @see https://threejs.org/docs/#manual/en/introduction/Color-management
31
- */
32
- legacy?: boolean;
33
- /** Switch off automatic sRGB color space and gamma correction */
34
- linear?: boolean;
35
- /** Use `THREE.NoToneMapping` instead of `THREE.ACESFilmicToneMapping` */
36
- flat?: boolean;
37
- /** Creates an orthographic camera */
38
- orthographic?: boolean;
39
- /**
40
- * R3F's render mode. Set to `demand` to only render on state change or `never` to take control.
41
- * @see https://docs.pmnd.rs/react-three-fiber/advanced/scaling-performance#on-demand-rendering
42
- */
43
- frameloop?: 'always' | 'demand' | 'never';
44
- /**
45
- * R3F performance options for adaptive performance.
46
- * @see https://docs.pmnd.rs/react-three-fiber/advanced/scaling-performance#movement-regression
47
- */
48
- performance?: Partial<Omit<Performance, 'regress'>>;
49
- /** Target pixel ratio. Can clamp between a range: `[min, max]` */
50
- dpr?: Dpr;
51
- /** Props that go into the default raycaster */
52
- raycaster?: Partial<THREE.Raycaster>;
53
- /** A `THREE.Scene` instance or props that go into the default scene */
54
- scene?: THREE.Scene | Partial<ReactThreeFiber.Object3DNode<THREE.Scene, typeof THREE.Scene>>;
55
- /** A `THREE.Camera` instance or props that go into the default camera */
56
- camera?: (Camera | Partial<ReactThreeFiber.Object3DNode<THREE.Camera, typeof THREE.Camera> & ReactThreeFiber.Object3DNode<THREE.PerspectiveCamera, typeof THREE.PerspectiveCamera> & ReactThreeFiber.Object3DNode<THREE.OrthographicCamera, typeof THREE.OrthographicCamera>>) & {
57
- /** Flags the camera as manual, putting projection into your own hands */
58
- manual?: boolean;
59
- };
60
- /** An R3F event manager to manage elements' pointer events */
61
- events?: (store: UseBoundStore<RootState>) => EventManager<HTMLElement>;
62
- /** Callback after the canvas has rendered (but not yet committed) */
63
- onCreated?: (state: RootState) => void;
64
- /** Response for pointer clicks that have missed any target */
65
- onPointerMissed?: (event: MouseEvent) => void;
66
- };
67
- export declare type ReconcilerRoot<TCanvas extends Canvas> = {
68
- configure: (config?: RenderProps<TCanvas>) => ReconcilerRoot<TCanvas>;
69
- render: (element: React.ReactNode) => UseBoundStore<RootState>;
70
- unmount: () => void;
71
- };
72
- declare function createRoot<TCanvas extends Canvas>(canvas: TCanvas): ReconcilerRoot<TCanvas>;
73
- declare function render<TCanvas extends Canvas>(children: React.ReactNode, canvas: TCanvas, config: RenderProps<TCanvas>): UseBoundStore<RootState>;
74
- declare function unmountComponentAtNode<TCanvas extends Canvas>(canvas: TCanvas, callback?: (canvas: TCanvas) => void): void;
75
- export declare type InjectState = Partial<Omit<RootState, PrivateKeys> & {
76
- events?: {
77
- enabled?: boolean;
78
- priority?: number;
79
- compute?: ComputeFunction;
80
- connected?: any;
81
- };
82
- size?: Size;
83
- }>;
84
- declare function createPortal(children: React.ReactNode, container: THREE.Object3D, state?: InjectState): JSX.Element;
85
- declare const act: any;
86
- export * from './hooks';
87
- export { context, render, createRoot, unmountComponentAtNode, createPortal, reconciler, applyProps, dispose, invalidate, advance, extend, addEffect, addAfterEffect, addTail, flushGlobalEffects, getRootState, act, buildGraph, roots as _roots, };
@@ -1,38 +0,0 @@
1
- import { Root } from './renderer';
2
- import { RootState } from './store';
3
- import { _XRFrame } from './utils';
4
- export declare type GlobalRenderCallback = (timeStamp: number) => void;
5
- /**
6
- * Adds a global render callback which is called each frame.
7
- * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#addEffect
8
- */
9
- export declare const addEffect: (callback: GlobalRenderCallback) => () => void;
10
- /**
11
- * Adds a global after-render callback which is called each frame.
12
- * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#addAfterEffect
13
- */
14
- export declare const addAfterEffect: (callback: GlobalRenderCallback) => () => void;
15
- /**
16
- * Adds a global callback which is called when rendering stops.
17
- * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#addTail
18
- */
19
- export declare const addTail: (callback: GlobalRenderCallback) => () => void;
20
- export declare type GlobalEffectType = 'before' | 'after' | 'tail';
21
- export declare function flushGlobalEffects(type: GlobalEffectType, timestamp: number): void;
22
- export declare type Invalidate = (state?: RootState, frames?: number) => void;
23
- export declare type Advance = (timestamp: number, runGlobalEffects?: boolean, state?: RootState, frame?: _XRFrame) => void;
24
- interface Loop {
25
- loop: (timestamp: number) => void;
26
- /**
27
- * Invalidates the view, requesting a frame to be rendered. Will globally invalidate unless passed a root's state.
28
- * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#invalidate
29
- */
30
- invalidate: Invalidate;
31
- /**
32
- * Advances the frameloop and runs render effects, useful for when manually rendering via `frameloop="never"`.
33
- * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#advance
34
- */
35
- advance: Advance;
36
- }
37
- export declare function createLoop<TCanvas>(roots: Map<TCanvas, Root>): Loop;
38
- export {};