Skip to content

Commit aecbafb

Browse files
authored
Merge pull request #3684 from DennisSmolek/v10-fixes-cleanup
V10 fixes cleanup
2 parents 2b511a5 + fb448e5 commit aecbafb

33 files changed

+2980
-345
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ $RECYCLE.BIN/
1010
.DS_Store
1111
.vscode
1212
.claude
13+
.cursor
14+
Claude.md
1315
.docz/
1416
package-lock.json
1517
coverage/
144 KB
Loading

CHANGELOG-ALPHA.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,92 @@ Removed redundant renderer props that can be passed via `gl` or `renderer` props
4949

5050
### Features
5151

52+
#### Interactive Priority (userData.interactivePriority)
53+
54+
Added support for object-level interactive priority in the event system. Objects with `userData.interactivePriority` take precedence over standard distance-based hit testing, enabling UI controls that render on top via depth tricks to receive events correctly.
55+
56+
```tsx
57+
// This mesh receives events even if behind other objects in world space
58+
<mesh userData={{ interactivePriority: 1 }}>
59+
<boxGeometry />
60+
<meshBasicMaterial />
61+
</mesh>
62+
63+
// Higher values take precedence
64+
<mesh userData={{ interactivePriority: 10 }}>
65+
{/* Receives events before interactivePriority: 1 */}
66+
</mesh>
67+
```
68+
69+
**Sort order:**
70+
71+
1. Objects with `interactivePriority` come before objects without
72+
2. Higher `interactivePriority` values win among prioritized objects
73+
3. Then standard `events.priority` (portal/layer priority)
74+
4. Then distance (closer first)
75+
76+
**Use cases:** Transform controls (PivotControls), UI overlays, debug helpers that use depth tricks to render on top.
77+
78+
**Files changed:**
79+
80+
- `packages/fiber/src/core/events.ts` - Added interactivePriority check in hit sorting
81+
82+
#### useBuffers & useGPUStorage Hooks
83+
84+
Added two new hooks for managing GPU storage in compute-intensive WebGPU applications:
85+
86+
**useBuffers** - Manages buffer data for GPU compute:
87+
88+
```tsx
89+
import { useBuffers } from '@react-three/fiber/webgpu'
90+
import { instancedArray } from 'three/tsl'
91+
92+
const { positions, velocities } = useBuffers(
93+
() => ({
94+
positions: instancedArray(count, 'vec3'),
95+
velocities: new Float32Array(count * 3),
96+
}),
97+
'particles',
98+
)
99+
```
100+
101+
**useGPUStorage** - Manages GPU storage textures:
102+
103+
```tsx
104+
import { useGPUStorage } from '@react-three/fiber/webgpu'
105+
import { StorageTexture } from 'three/webgpu'
106+
107+
const { heightMap } = useGPUStorage(
108+
() => ({
109+
heightMap: new StorageTexture(512, 512),
110+
}),
111+
'terrain',
112+
)
113+
```
114+
115+
**Key features:**
116+
117+
- Same API pattern as `useNodes` and `useUniforms`
118+
- Scoped storage with create-if-not-exists semantics
119+
- Accessible in node creators via `({ buffers, gpuStorage }) => ...`
120+
- Utility functions: `removeBuffers/Storage`, `clearBuffers/Storage`, `rebuildBuffers/Storage`, `disposeBuffers/Storage`
121+
- GPU resource disposal via `disposeBuffers()` and `disposeStorage()`
122+
123+
**Supported types:**
124+
125+
- **useBuffers**: TypedArrays, BufferAttribute, StorageBufferAttribute, TSL buffer nodes (`instancedArray`, `storage`)
126+
- **useGPUStorage**: StorageTexture, Storage3DTexture, TSL storage texture nodes
127+
128+
**Files changed:**
129+
130+
- `packages/fiber/src/core/store.ts` - Added `buffers: {}`, `gpuStorage: {}` to state
131+
- `packages/fiber/types/store.d.ts` - Added BufferLike, BufferStore, StorageLike, StorageStore types
132+
- `packages/fiber/src/webgpu/hooks/useBuffers.tsx` - **NEW** Buffer management hook
133+
- `packages/fiber/src/webgpu/hooks/useGPUStorage.tsx` - **NEW** GPU storage management hook
134+
- `packages/fiber/src/webgpu/hooks/ScopedStore.ts` - Added buffers/gpuStorage to CreatorState
135+
- `packages/fiber/src/webgpu/hooks/index.ts` - Export new hooks
136+
- `packages/fiber/src/webgpu/hooks/readmes/useBuffers-useGPUStorage.md` - **NEW** Documentation
137+
52138
#### forceEven Canvas Prop
53139

54140
Added `forceEven` prop to Canvas for Safari compatibility. Safari has issues with odd or fractional HTML canvas dimensions. When enabled, canvas dimensions are rounded up to the nearest even number.
@@ -323,6 +409,7 @@ Added automatic Hot Module Replacement (HMR) support for WebGPU TSL hooks. When
323409

324410
### Bug Fixes
325411

412+
- Fixed memory leak in `createPortal` where subscriptions to parent store were never cleaned up. When portals were created/destroyed frequently (e.g., with rapidly changing data), each portal subscribed to `previousRoot` but never unsubscribed, keeping the portal's zustand store and all its state in memory indefinitely.
326413
- Fixed portal `size` state being overwritten by parent resize events. Portals now correctly preserve their own size override when the root canvas resizes, matching the existing behavior for `events`. This also fixes nested portals ignoring their size configuration.
327414
- Fixed `setSize` not triggering a frame in demand mode. Now calls `scheduler.invalidate()` directly so `useFrame` callbacks can respond to size changes.
328415
- Fixed `useNodes()` and `useUniforms()` reader modes not updating when store changes

0 commit comments

Comments
 (0)