@react-three/fiber 10.0.0-canary.2b511a5 → 10.0.0-canary.aecbafb

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/dist/legacy.d.cts CHANGED
@@ -3,7 +3,7 @@ import { WebGLRenderTarget, Color as Color$1, ColorRepresentation, Euler as Eule
3
3
  import * as React$1 from 'react';
4
4
  import { ReactNode, Component, RefObject, JSX } from 'react';
5
5
  import * as three_webgpu from 'three/webgpu';
6
- import { WebGPURenderer as WebGPURenderer$1, CanvasTarget, Node, ShaderNodeObject } from 'three/webgpu';
6
+ import { WebGPURenderer as WebGPURenderer$1, Node, StorageTexture, Data3DTexture, CanvasTarget, ShaderNodeObject } from 'three/webgpu';
7
7
  import { StoreApi } from 'zustand';
8
8
  import { UseBoundStoreWithEqualityFn } from 'zustand/traditional';
9
9
  import { Options } from 'react-use-measure';
@@ -148,6 +148,8 @@ interface IntersectionEvent<TSourceEvent> extends Intersection {
148
148
  unprojectedPoint: THREE$1.Vector3
149
149
  /** Normalized event coordinates */
150
150
  pointer: THREE$1.Vector2
151
+ /** pointerId of the original event for multiple pointer events */
152
+ pointerId: number
151
153
  /** Delta between first click and this event */
152
154
  delta: number
153
155
  /** The ray that pierced it */
@@ -224,6 +226,18 @@ interface EventHandlers {
224
226
  type FilterFunction = (items: THREE$1.Intersection[], state: RootState) => THREE$1.Intersection[]
225
227
  type ComputeFunction = (event: DomEvent, root: RootState, previous?: RootState) => void
226
228
 
229
+ /** Configuration for XR pointer registration (controllers/hands) */
230
+ interface XRPointerConfig {
231
+ /** Ray origin (updated each frame by XR system) */
232
+ ray: THREE$1.Ray
233
+ /** Optional: custom compute function for this pointer */
234
+ compute?: (state: RootState) => void
235
+ /** Pointer type identifier */
236
+ type: 'controller' | 'hand' | 'gaze'
237
+ /** Which hand (for controller/hand types) */
238
+ handedness?: 'left' | 'right'
239
+ }
240
+
227
241
  interface EventManager<TTarget> {
228
242
  /** Determines if the event layer is active */
229
243
  enabled: boolean
@@ -243,8 +257,21 @@ interface EventManager<TTarget> {
243
257
  disconnect?: () => void
244
258
  /** Triggers a onPointerMove with the last known event. This can be useful to enable raycasting without
245
259
  * explicit user interaction, for instance when the camera moves a hoverable object underneath the cursor.
260
+ * @param pointerId - Optional pointer ID to update specific pointer only
246
261
  */
247
- update?: () => void
262
+ update?: (pointerId?: number) => void
263
+ /** Defer pointer move raycasting to frame start (default: true) */
264
+ frameTimedRaycasts?: boolean
265
+ /** Always fire raycaster immediately on scroll events (default: true) */
266
+ alwaysFireOnScroll?: boolean
267
+ /** Automatically re-raycast every frame to detect hover changes from moving objects/camera (default: false) */
268
+ updateOnFrame?: boolean
269
+ /** Flush deferred pointer raycasts. Called by scheduler at frame start (input phase). */
270
+ flush?: () => void
271
+ /** Register an XR pointer (controller/hand). Returns assigned pointerId */
272
+ registerPointer?: (config: XRPointerConfig) => number
273
+ /** Unregister an XR pointer */
274
+ unregisterPointer?: (pointerId: number) => void
248
275
  }
249
276
 
250
277
  interface PointerCaptureTarget {
@@ -486,6 +513,68 @@ interface SchedulerApi {
486
513
  subscribeJobState(id: string, listener: () => void): () => void
487
514
  }
488
515
 
516
+ //* Buffer Types (useBuffers) ========================================
517
+
518
+ /**
519
+ * Buffer-like types for GPU compute and storage operations.
520
+ * Includes raw CPU arrays, Three.js buffer attributes, and TSL buffer nodes.
521
+ *
522
+ * @example
523
+ * ```tsx
524
+ * const { positions, velocities } = useBuffers(() => ({
525
+ * positions: instancedArray(count, 'vec3'), // StorageBufferNode
526
+ * velocities: new Float32Array(count * 3), // TypedArray
527
+ * }), 'particles')
528
+ * ```
529
+ */
530
+ type BufferLike =
531
+ | Float32Array
532
+ | Uint32Array
533
+ | Int32Array
534
+ | Float64Array
535
+ | Uint8Array
536
+ | Int8Array
537
+ | Uint16Array
538
+ | Int16Array
539
+ | THREE$1.BufferAttribute // Base class for all buffer attributes
540
+ | Node // TSL buffer nodes (instancedArray, storage)
541
+
542
+ /** Flat record of buffer-like values (no nested scopes) */
543
+ type BufferRecord = Record<string, BufferLike>
544
+
545
+ /**
546
+ * Buffer store that can contain both root-level buffers and scoped buffer objects.
547
+ * Structure: { positions: Float32Array, particles: { vel: StorageBufferNode } }
548
+ */
549
+ type BufferStore = Record<string, BufferLike | BufferRecord>
550
+
551
+ //* Storage Types (useGPUStorage) ========================================
552
+
553
+ /**
554
+ * GPU storage types for texture-based storage operations.
555
+ * Includes Three.js storage textures and TSL storage texture nodes.
556
+ *
557
+ * @example
558
+ * ```tsx
559
+ * const { heightMap } = useGPUStorage(() => ({
560
+ * heightMap: new StorageTexture(512, 512),
561
+ * }), 'terrain')
562
+ * ```
563
+ */
564
+ type StorageLike =
565
+ | StorageTexture // GPU storage texture
566
+ | Data3DTexture // 3D texture (can be used as storage)
567
+ | Node // TSL storage texture nodes (storageTexture)
568
+
569
+ /** Flat record of storage-like values (no nested scopes) */
570
+ type StorageRecord = Record<string, StorageLike>
571
+
572
+ /**
573
+ * Storage store that can contain both root-level storage and scoped storage objects.
574
+ * Structure: { heightMap: StorageTexture, terrain: { normal: StorageTextureNode } }
575
+ */
576
+ type StorageStore = Record<string, StorageLike | StorageRecord>
577
+
489
578
  //* Renderer Types ========================================
490
579
 
491
580
  /** Default renderer type - union of WebGL and WebGPU renderers */
@@ -499,6 +588,18 @@ type Subscription = {
499
588
  store: RootStore
500
589
  }
501
590
 
591
+ /** Per-pointer state for multi-touch and XR support */
592
+ type PointerState = {
593
+ /** Objects currently hovered by this pointer */
594
+ hovered: Map<string, ThreeEvent<DomEvent>>
595
+ /** Objects capturing this pointer */
596
+ captured: Map<THREE$1.Object3D, PointerCaptureTarget>
597
+ /** Initial click position [x, y] */
598
+ initialClick: [x: number, y: number]
599
+ /** Objects hit on initial click */
600
+ initialHits: THREE$1.Object3D[]
601
+ }
602
+
502
603
  type Dpr = number | [min: number, max: number]
503
604
 
504
605
  interface Size {
@@ -540,12 +641,21 @@ interface Performance {
540
641
 
541
642
  interface InternalState {
542
643
  interaction: THREE$1.Object3D[]
543
- hovered: Map<string, ThreeEvent<DomEvent>>
544
644
  subscribers: Subscription[]
645
+ /** Per-pointer state (hover, capture, click tracking) - replaces hovered, capturedMap, initialClick, initialHits */
646
+ pointerMap: Map<number, PointerState>
647
+ /** Pointers needing raycast this frame (used with frameTimedRaycasts) */
648
+ pointerDirty: Map<number, DomEvent>
649
+ /** Last event received (for events.update() compatibility) */
650
+ lastEvent: React$1.RefObject<DomEvent | null>
651
+ /** @deprecated Use pointerMap.get(pointerId).hovered instead */
652
+ hovered: Map<string, ThreeEvent<DomEvent>>
653
+ /** @deprecated Use pointerMap.get(pointerId).captured instead */
545
654
  capturedMap: Map<number, Map<THREE$1.Object3D, PointerCaptureTarget>>
655
+ /** @deprecated Use pointerMap.get(pointerId).initialClick instead */
546
656
  initialClick: [x: number, y: number]
657
+ /** @deprecated Use pointerMap.get(pointerId).initialHits instead */
547
658
  initialHits: THREE$1.Object3D[]
548
- lastEvent: React$1.RefObject<DomEvent | null>
549
659
  /** Visibility event registry (onFramed, onOccluded, onVisible) */
550
660
  visibilityRegistry: Map<string, VisibilityEntry>
551
661
  /** Whether occlusion queries are enabled (WebGPU only) */
@@ -686,11 +796,15 @@ interface RootState {
686
796
  uniforms: UniformStore
687
797
  /** Global TSL nodes - root-level nodes + scoped sub-objects. Use useNodes() hook */
688
798
  nodes: Record<string, any>
799
+ /** Global TSL buffer nodes - root-level buffers + scoped sub-objects. Use useBuffers() hook */
800
+ buffers: BufferStore
801
+ /** Global GPU storage (textures, etc.) - root-level storage + scoped sub-objects. Use useGPUStorage() hook */
802
+ gpuStorage: StorageStore
689
803
  /** Global TSL texture nodes - use useTextures() hook for operations */
690
804
  textures: Map<string, any>
691
- /** WebGPU PostProcessing instance - use usePostProcessing() hook */
692
- postProcessing: any | null // THREE.PostProcessing when available
693
- /** Global TSL pass nodes for post-processing - use usePostProcessing() hook */
805
+ /** WebGPU RenderPipeline instance - use useRenderPipeline() hook */
806
+ renderPipeline: any | null // THREE.PostProcessing (will be THREE.RenderPipeline in future Three.js release)
807
+ /** Global TSL pass nodes for render pipeline - use useRenderPipeline() hook */
694
808
  passes: Record<string, any>
695
809
  /** Internal version counter for HMR - incremented by rebuildNodes/rebuildUniforms to bust memoization */
696
810
  _hmrVersion: number
@@ -1311,6 +1425,7 @@ declare global {
1311
1425
  | three_webgpu.Euler
1312
1426
  | three_webgpu.Quaternion
1313
1427
  | { x: number; y?: number; z?: number; w?: number } // Plain objects converted to vectors
1428
+ | { r: number; g: number; b: number; a?: number } // Plain objects converted to Color
1314
1429
  | Node // TSL nodes like color(), vec3(), float() for type casting
1315
1430
  | UniformNode
1316
1431
 
@@ -1356,34 +1471,34 @@ declare module 'three/tsl' {
1356
1471
  }
1357
1472
 
1358
1473
  /**
1359
- * PostProcessing Types for usePostProcessing hook (WebGPU only)
1474
+ * RenderPipeline Types for useRenderPipeline hook (WebGPU only)
1360
1475
  */
1361
1476
 
1362
1477
 
1363
1478
 
1364
1479
  declare global {
1365
- /** Pass record - stores TSL pass nodes for post-processing */
1480
+ /** Pass record - stores TSL pass nodes for render pipeline */
1366
1481
  type PassRecord = Record<string, any>
1367
1482
 
1368
1483
  /** Setup callback - runs first to configure MRT, create additional passes */
1369
- type PostProcessingSetupCallback = (state: RootState) => PassRecord | void
1484
+ type RenderPipelineSetupCallback = (state: RootState) => PassRecord | void
1370
1485
 
1371
1486
  /** Main callback - runs second to configure outputNode, create effect passes */
1372
- type PostProcessingMainCallback = (state: RootState) => PassRecord | void
1487
+ type RenderPipelineMainCallback = (state: RootState) => PassRecord | void
1373
1488
 
1374
- /** Return type for usePostProcessing hook */
1375
- interface UsePostProcessingReturn {
1489
+ /** Return type for useRenderPipeline hook */
1490
+ interface UseRenderPipelineReturn {
1376
1491
  /** Current passes from state */
1377
1492
  passes: PassRecord
1378
- /** PostProcessing instance (null if not initialized) */
1379
- postProcessing: any | null // THREE.PostProcessing
1493
+ /** RenderPipeline instance (null if not initialized) */
1494
+ renderPipeline: any | null // THREE.PostProcessing (will be THREE.RenderPipeline in future Three.js release)
1380
1495
  /** Clear all passes from state */
1381
1496
  clearPasses: () => void
1382
- /** Reset PostProcessing entirely (clears PP + passes) */
1497
+ /** Reset RenderPipeline entirely (clears PP + passes) */
1383
1498
  reset: () => void
1384
1499
  /** Re-run setup/main callbacks with current closure values */
1385
1500
  rebuild: () => void
1386
- /** True when PostProcessing is configured and ready */
1501
+ /** True when RenderPipeline is configured and ready */
1387
1502
  isReady: boolean
1388
1503
  }
1389
1504
  }
@@ -2003,6 +2118,8 @@ declare function Environment(props: EnvironmentProps): react_jsx_runtime.JSX.Ele
2003
2118
  declare function removeInteractivity(store: RootStore, object: Object3D): void;
2004
2119
  declare function createEvents(store: RootStore): {
2005
2120
  handlePointer: (name: string) => (event: DomEvent) => void;
2121
+ flushDeferredPointers: () => void;
2122
+ processDeferredPointer: (event: DomEvent, pointerId: number) => void;
2006
2123
  };
2007
2124
  /** Default R3F event manager for web */
2008
2125
  declare function createPointerEvents(store: RootStore): EventManager<HTMLElement>;
@@ -2582,9 +2699,9 @@ declare function useTextures(): UseTexturesReturn;
2582
2699
  * const fbo = useRenderTarget(512, 256, { samples: 4 })
2583
2700
  * ```
2584
2701
  */
2585
- declare function useRenderTarget(options?: RenderTargetOptions): RenderTarget | WebGLRenderTarget;
2586
- declare function useRenderTarget(size: number, options?: RenderTargetOptions): RenderTarget | WebGLRenderTarget;
2587
- declare function useRenderTarget(width: number, height: number, options?: RenderTargetOptions): RenderTarget | WebGLRenderTarget;
2702
+ declare function useRenderTarget(options?: RenderTargetOptions): WebGLRenderTarget;
2703
+ declare function useRenderTarget(size: number, options?: RenderTargetOptions): WebGLRenderTarget;
2704
+ declare function useRenderTarget(width: number, height: number, options?: RenderTargetOptions): WebGLRenderTarget;
2588
2705
 
2589
2706
  /**
2590
2707
  * Returns the R3F Canvas' Zustand store. Useful for [transient updates](https://github.com/pmndrs/zustand#transient-updates-for-often-occurring-state-changes).
@@ -4249,4 +4366,4 @@ declare function isOnce(value: unknown): value is {
4249
4366
  declare function Canvas(props: CanvasProps): react_jsx_runtime.JSX.Element;
4250
4367
 
4251
4368
  export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Scheduler, Texture, _roots, act, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getScheduler, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
4252
- export type { Act, AddPhaseOptions, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameControls, FrameNextCallback, FrameNextControls, FrameNextState, FrameState, FrameTimingState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, LegacyInternalState as InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, LegacyRenderer as R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootOptions, LegacyRootState as RootState, RootStore, SchedulerApi, SetBlock, Size, Subscription, TSLNodeInput, TextureEntry, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseFrameNextOptions, UseFrameOptions, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager };
4369
+ export type { Act, AddPhaseOptions, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameControls, FrameNextCallback, FrameNextControls, FrameNextState, FrameState, FrameTimingState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, LegacyInternalState as InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, LegacyRenderer as R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootOptions, LegacyRootState as RootState, RootStore, SchedulerApi, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureEntry, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseFrameNextOptions, UseFrameOptions, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
package/dist/legacy.d.mts CHANGED
@@ -3,7 +3,7 @@ import { WebGLRenderTarget, Color as Color$1, ColorRepresentation, Euler as Eule
3
3
  import * as React$1 from 'react';
4
4
  import { ReactNode, Component, RefObject, JSX } from 'react';
5
5
  import * as three_webgpu from 'three/webgpu';
6
- import { WebGPURenderer as WebGPURenderer$1, CanvasTarget, Node, ShaderNodeObject } from 'three/webgpu';
6
+ import { WebGPURenderer as WebGPURenderer$1, Node, StorageTexture, Data3DTexture, CanvasTarget, ShaderNodeObject } from 'three/webgpu';
7
7
  import { StoreApi } from 'zustand';
8
8
  import { UseBoundStoreWithEqualityFn } from 'zustand/traditional';
9
9
  import { Options } from 'react-use-measure';
@@ -148,6 +148,8 @@ interface IntersectionEvent<TSourceEvent> extends Intersection {
148
148
  unprojectedPoint: THREE$1.Vector3
149
149
  /** Normalized event coordinates */
150
150
  pointer: THREE$1.Vector2
151
+ /** pointerId of the original event for multiple pointer events */
152
+ pointerId: number
151
153
  /** Delta between first click and this event */
152
154
  delta: number
153
155
  /** The ray that pierced it */
@@ -224,6 +226,18 @@ interface EventHandlers {
224
226
  type FilterFunction = (items: THREE$1.Intersection[], state: RootState) => THREE$1.Intersection[]
225
227
  type ComputeFunction = (event: DomEvent, root: RootState, previous?: RootState) => void
226
228
 
229
+ /** Configuration for XR pointer registration (controllers/hands) */
230
+ interface XRPointerConfig {
231
+ /** Ray origin (updated each frame by XR system) */
232
+ ray: THREE$1.Ray
233
+ /** Optional: custom compute function for this pointer */
234
+ compute?: (state: RootState) => void
235
+ /** Pointer type identifier */
236
+ type: 'controller' | 'hand' | 'gaze'
237
+ /** Which hand (for controller/hand types) */
238
+ handedness?: 'left' | 'right'
239
+ }
240
+
227
241
  interface EventManager<TTarget> {
228
242
  /** Determines if the event layer is active */
229
243
  enabled: boolean
@@ -243,8 +257,21 @@ interface EventManager<TTarget> {
243
257
  disconnect?: () => void
244
258
  /** Triggers a onPointerMove with the last known event. This can be useful to enable raycasting without
245
259
  * explicit user interaction, for instance when the camera moves a hoverable object underneath the cursor.
260
+ * @param pointerId - Optional pointer ID to update specific pointer only
246
261
  */
247
- update?: () => void
262
+ update?: (pointerId?: number) => void
263
+ /** Defer pointer move raycasting to frame start (default: true) */
264
+ frameTimedRaycasts?: boolean
265
+ /** Always fire raycaster immediately on scroll events (default: true) */
266
+ alwaysFireOnScroll?: boolean
267
+ /** Automatically re-raycast every frame to detect hover changes from moving objects/camera (default: false) */
268
+ updateOnFrame?: boolean
269
+ /** Flush deferred pointer raycasts. Called by scheduler at frame start (input phase). */
270
+ flush?: () => void
271
+ /** Register an XR pointer (controller/hand). Returns assigned pointerId */
272
+ registerPointer?: (config: XRPointerConfig) => number
273
+ /** Unregister an XR pointer */
274
+ unregisterPointer?: (pointerId: number) => void
248
275
  }
249
276
 
250
277
  interface PointerCaptureTarget {
@@ -486,6 +513,68 @@ interface SchedulerApi {
486
513
  subscribeJobState(id: string, listener: () => void): () => void
487
514
  }
488
515
 
516
+ //* Buffer Types (useBuffers) ========================================
517
+
518
+ /**
519
+ * Buffer-like types for GPU compute and storage operations.
520
+ * Includes raw CPU arrays, Three.js buffer attributes, and TSL buffer nodes.
521
+ *
522
+ * @example
523
+ * ```tsx
524
+ * const { positions, velocities } = useBuffers(() => ({
525
+ * positions: instancedArray(count, 'vec3'), // StorageBufferNode
526
+ * velocities: new Float32Array(count * 3), // TypedArray
527
+ * }), 'particles')
528
+ * ```
529
+ */
530
+ type BufferLike =
531
+ | Float32Array
532
+ | Uint32Array
533
+ | Int32Array
534
+ | Float64Array
535
+ | Uint8Array
536
+ | Int8Array
537
+ | Uint16Array
538
+ | Int16Array
539
+ | THREE$1.BufferAttribute // Base class for all buffer attributes
540
+ | Node // TSL buffer nodes (instancedArray, storage)
541
+
542
+ /** Flat record of buffer-like values (no nested scopes) */
543
+ type BufferRecord = Record<string, BufferLike>
544
+
545
+ /**
546
+ * Buffer store that can contain both root-level buffers and scoped buffer objects.
547
+ * Structure: { positions: Float32Array, particles: { vel: StorageBufferNode } }
548
+ */
549
+ type BufferStore = Record<string, BufferLike | BufferRecord>
550
+
551
+ //* Storage Types (useGPUStorage) ========================================
552
+
553
+ /**
554
+ * GPU storage types for texture-based storage operations.
555
+ * Includes Three.js storage textures and TSL storage texture nodes.
556
+ *
557
+ * @example
558
+ * ```tsx
559
+ * const { heightMap } = useGPUStorage(() => ({
560
+ * heightMap: new StorageTexture(512, 512),
561
+ * }), 'terrain')
562
+ * ```
563
+ */
564
+ type StorageLike =
565
+ | StorageTexture // GPU storage texture
566
+ | Data3DTexture // 3D texture (can be used as storage)
567
+ | Node // TSL storage texture nodes (storageTexture)
568
+
569
+ /** Flat record of storage-like values (no nested scopes) */
570
+ type StorageRecord = Record<string, StorageLike>
571
+
572
+ /**
573
+ * Storage store that can contain both root-level storage and scoped storage objects.
574
+ * Structure: { heightMap: StorageTexture, terrain: { normal: StorageTextureNode } }
575
+ */
576
+ type StorageStore = Record<string, StorageLike | StorageRecord>
577
+
489
578
  //* Renderer Types ========================================
490
579
 
491
580
  /** Default renderer type - union of WebGL and WebGPU renderers */
@@ -499,6 +588,18 @@ type Subscription = {
499
588
  store: RootStore
500
589
  }
501
590
 
591
+ /** Per-pointer state for multi-touch and XR support */
592
+ type PointerState = {
593
+ /** Objects currently hovered by this pointer */
594
+ hovered: Map<string, ThreeEvent<DomEvent>>
595
+ /** Objects capturing this pointer */
596
+ captured: Map<THREE$1.Object3D, PointerCaptureTarget>
597
+ /** Initial click position [x, y] */
598
+ initialClick: [x: number, y: number]
599
+ /** Objects hit on initial click */
600
+ initialHits: THREE$1.Object3D[]
601
+ }
602
+
502
603
  type Dpr = number | [min: number, max: number]
503
604
 
504
605
  interface Size {
@@ -540,12 +641,21 @@ interface Performance {
540
641
 
541
642
  interface InternalState {
542
643
  interaction: THREE$1.Object3D[]
543
- hovered: Map<string, ThreeEvent<DomEvent>>
544
644
  subscribers: Subscription[]
645
+ /** Per-pointer state (hover, capture, click tracking) - replaces hovered, capturedMap, initialClick, initialHits */
646
+ pointerMap: Map<number, PointerState>
647
+ /** Pointers needing raycast this frame (used with frameTimedRaycasts) */
648
+ pointerDirty: Map<number, DomEvent>
649
+ /** Last event received (for events.update() compatibility) */
650
+ lastEvent: React$1.RefObject<DomEvent | null>
651
+ /** @deprecated Use pointerMap.get(pointerId).hovered instead */
652
+ hovered: Map<string, ThreeEvent<DomEvent>>
653
+ /** @deprecated Use pointerMap.get(pointerId).captured instead */
545
654
  capturedMap: Map<number, Map<THREE$1.Object3D, PointerCaptureTarget>>
655
+ /** @deprecated Use pointerMap.get(pointerId).initialClick instead */
546
656
  initialClick: [x: number, y: number]
657
+ /** @deprecated Use pointerMap.get(pointerId).initialHits instead */
547
658
  initialHits: THREE$1.Object3D[]
548
- lastEvent: React$1.RefObject<DomEvent | null>
549
659
  /** Visibility event registry (onFramed, onOccluded, onVisible) */
550
660
  visibilityRegistry: Map<string, VisibilityEntry>
551
661
  /** Whether occlusion queries are enabled (WebGPU only) */
@@ -686,11 +796,15 @@ interface RootState {
686
796
  uniforms: UniformStore
687
797
  /** Global TSL nodes - root-level nodes + scoped sub-objects. Use useNodes() hook */
688
798
  nodes: Record<string, any>
799
+ /** Global TSL buffer nodes - root-level buffers + scoped sub-objects. Use useBuffers() hook */
800
+ buffers: BufferStore
801
+ /** Global GPU storage (textures, etc.) - root-level storage + scoped sub-objects. Use useGPUStorage() hook */
802
+ gpuStorage: StorageStore
689
803
  /** Global TSL texture nodes - use useTextures() hook for operations */
690
804
  textures: Map<string, any>
691
- /** WebGPU PostProcessing instance - use usePostProcessing() hook */
692
- postProcessing: any | null // THREE.PostProcessing when available
693
- /** Global TSL pass nodes for post-processing - use usePostProcessing() hook */
805
+ /** WebGPU RenderPipeline instance - use useRenderPipeline() hook */
806
+ renderPipeline: any | null // THREE.PostProcessing (will be THREE.RenderPipeline in future Three.js release)
807
+ /** Global TSL pass nodes for render pipeline - use useRenderPipeline() hook */
694
808
  passes: Record<string, any>
695
809
  /** Internal version counter for HMR - incremented by rebuildNodes/rebuildUniforms to bust memoization */
696
810
  _hmrVersion: number
@@ -1311,6 +1425,7 @@ declare global {
1311
1425
  | three_webgpu.Euler
1312
1426
  | three_webgpu.Quaternion
1313
1427
  | { x: number; y?: number; z?: number; w?: number } // Plain objects converted to vectors
1428
+ | { r: number; g: number; b: number; a?: number } // Plain objects converted to Color
1314
1429
  | Node // TSL nodes like color(), vec3(), float() for type casting
1315
1430
  | UniformNode
1316
1431
 
@@ -1356,34 +1471,34 @@ declare module 'three/tsl' {
1356
1471
  }
1357
1472
 
1358
1473
  /**
1359
- * PostProcessing Types for usePostProcessing hook (WebGPU only)
1474
+ * RenderPipeline Types for useRenderPipeline hook (WebGPU only)
1360
1475
  */
1361
1476
 
1362
1477
 
1363
1478
 
1364
1479
  declare global {
1365
- /** Pass record - stores TSL pass nodes for post-processing */
1480
+ /** Pass record - stores TSL pass nodes for render pipeline */
1366
1481
  type PassRecord = Record<string, any>
1367
1482
 
1368
1483
  /** Setup callback - runs first to configure MRT, create additional passes */
1369
- type PostProcessingSetupCallback = (state: RootState) => PassRecord | void
1484
+ type RenderPipelineSetupCallback = (state: RootState) => PassRecord | void
1370
1485
 
1371
1486
  /** Main callback - runs second to configure outputNode, create effect passes */
1372
- type PostProcessingMainCallback = (state: RootState) => PassRecord | void
1487
+ type RenderPipelineMainCallback = (state: RootState) => PassRecord | void
1373
1488
 
1374
- /** Return type for usePostProcessing hook */
1375
- interface UsePostProcessingReturn {
1489
+ /** Return type for useRenderPipeline hook */
1490
+ interface UseRenderPipelineReturn {
1376
1491
  /** Current passes from state */
1377
1492
  passes: PassRecord
1378
- /** PostProcessing instance (null if not initialized) */
1379
- postProcessing: any | null // THREE.PostProcessing
1493
+ /** RenderPipeline instance (null if not initialized) */
1494
+ renderPipeline: any | null // THREE.PostProcessing (will be THREE.RenderPipeline in future Three.js release)
1380
1495
  /** Clear all passes from state */
1381
1496
  clearPasses: () => void
1382
- /** Reset PostProcessing entirely (clears PP + passes) */
1497
+ /** Reset RenderPipeline entirely (clears PP + passes) */
1383
1498
  reset: () => void
1384
1499
  /** Re-run setup/main callbacks with current closure values */
1385
1500
  rebuild: () => void
1386
- /** True when PostProcessing is configured and ready */
1501
+ /** True when RenderPipeline is configured and ready */
1387
1502
  isReady: boolean
1388
1503
  }
1389
1504
  }
@@ -2003,6 +2118,8 @@ declare function Environment(props: EnvironmentProps): react_jsx_runtime.JSX.Ele
2003
2118
  declare function removeInteractivity(store: RootStore, object: Object3D): void;
2004
2119
  declare function createEvents(store: RootStore): {
2005
2120
  handlePointer: (name: string) => (event: DomEvent) => void;
2121
+ flushDeferredPointers: () => void;
2122
+ processDeferredPointer: (event: DomEvent, pointerId: number) => void;
2006
2123
  };
2007
2124
  /** Default R3F event manager for web */
2008
2125
  declare function createPointerEvents(store: RootStore): EventManager<HTMLElement>;
@@ -2582,9 +2699,9 @@ declare function useTextures(): UseTexturesReturn;
2582
2699
  * const fbo = useRenderTarget(512, 256, { samples: 4 })
2583
2700
  * ```
2584
2701
  */
2585
- declare function useRenderTarget(options?: RenderTargetOptions): RenderTarget | WebGLRenderTarget;
2586
- declare function useRenderTarget(size: number, options?: RenderTargetOptions): RenderTarget | WebGLRenderTarget;
2587
- declare function useRenderTarget(width: number, height: number, options?: RenderTargetOptions): RenderTarget | WebGLRenderTarget;
2702
+ declare function useRenderTarget(options?: RenderTargetOptions): WebGLRenderTarget;
2703
+ declare function useRenderTarget(size: number, options?: RenderTargetOptions): WebGLRenderTarget;
2704
+ declare function useRenderTarget(width: number, height: number, options?: RenderTargetOptions): WebGLRenderTarget;
2588
2705
 
2589
2706
  /**
2590
2707
  * Returns the R3F Canvas' Zustand store. Useful for [transient updates](https://github.com/pmndrs/zustand#transient-updates-for-often-occurring-state-changes).
@@ -4249,4 +4366,4 @@ declare function isOnce(value: unknown): value is {
4249
4366
  declare function Canvas(props: CanvasProps): react_jsx_runtime.JSX.Element;
4250
4367
 
4251
4368
  export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Scheduler, Texture, _roots, act, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getScheduler, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
4252
- export type { Act, AddPhaseOptions, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameControls, FrameNextCallback, FrameNextControls, FrameNextState, FrameState, FrameTimingState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, LegacyInternalState as InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, LegacyRenderer as R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootOptions, LegacyRootState as RootState, RootStore, SchedulerApi, SetBlock, Size, Subscription, TSLNodeInput, TextureEntry, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseFrameNextOptions, UseFrameOptions, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager };
4369
+ export type { Act, AddPhaseOptions, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameControls, FrameNextCallback, FrameNextControls, FrameNextState, FrameState, FrameTimingState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, LegacyInternalState as InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, LegacyRenderer as R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootOptions, LegacyRootState as RootState, RootStore, SchedulerApi, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureEntry, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseFrameNextOptions, UseFrameOptions, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };