Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
b13146e
fix: multi-touch event canvelation
DennisSmolek Jan 25, 2026
0bb91ef
feat: new TSL Hooks
DennisSmolek Jan 26, 2026
017f63d
chore: change PostProcessing to RenderPipeline
DennisSmolek Jan 26, 2026
f71b118
fix: createPortal memory leak
DennisSmolek Jan 26, 2026
56c80de
wip: heroes
DennisSmolek Jan 30, 2026
eab2da9
Merge pull request #3680 from pmndrs/chore/canary
krispya Jan 30, 2026
fb0f08d
chore: Canary releases on v10
krispya Jan 30, 2026
09b9408
Merge pull request #3682 from pmndrs/chore/canary-on-v10
krispya Jan 30, 2026
4b35b63
chore: remove changesets
krispya Jan 30, 2026
93aaa0e
chore: some additional cleanup
krispya Jan 30, 2026
c326d8f
chore: allow explicit canary runs
krispya Jan 30, 2026
b0a1668
chore: try to fix canary
krispya Jan 30, 2026
e4ab28e
chore: test canary release
krispya Jan 30, 2026
1cf4ba1
chore: use latest npm in canary
krispya Jan 30, 2026
b0fafc8
chore: update canary to node 24
krispya Jan 30, 2026
dbbe704
chore: investigating canary issues
krispya Jan 30, 2026
604355a
chore: canary only for r3f
krispya Jan 30, 2026
2b511a5
Merge pull request #3683 from pmndrs/chore/remove-changesets
DennisSmolek Jan 31, 2026
2c63b6c
wip: ripple
DennisSmolek Jan 31, 2026
506ae11
wip: bottle
DennisSmolek Feb 1, 2026
761cc52
feat: basic bottle
DennisSmolek Feb 1, 2026
7c80929
feat: bottle hero
DennisSmolek Feb 1, 2026
69b4ede
chore: remove heroes
DennisSmolek Feb 1, 2026
987cd29
Merge branch 'v10' into v10-fixes-cleanup
DennisSmolek Feb 1, 2026
ba8c050
chore: gitignore
DennisSmolek Feb 1, 2026
fb448e5
chore: type import path correction
DennisSmolek Feb 1, 2026
aecbafb
Merge pull request #3684 from DennisSmolek/v10-fixes-cleanup
DennisSmolek Feb 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions .changeset/README.md

This file was deleted.

7 changes: 0 additions & 7 deletions .changeset/aggregate-release.md

This file was deleted.

13 changes: 0 additions & 13 deletions .changeset/config.json

This file was deleted.

8 changes: 0 additions & 8 deletions .changeset/dry-clubs-go.md

This file was deleted.

11 changes: 0 additions & 11 deletions .changeset/pre.json

This file was deleted.

35 changes: 0 additions & 35 deletions .changeset/v10-alpha-release.md

This file was deleted.

44 changes: 13 additions & 31 deletions .github/workflows/canary.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
name: Canary Release

on:
schedule:
# Run at 2am UTC every night
- cron: '0 2 * * *'
workflow_dispatch: # Manual trigger
push:
branches: [v10]
workflow_dispatch:

permissions:
id-token: write # Required for npm OIDC
Expand All @@ -17,48 +16,31 @@ jobs:
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
ref: v10
fetch-depth: 0

- name: Check for changes in last 24 hours
id: changes
run: |
COMMITS=$(git log --oneline --since="24 hours ago" | wc -l)
if [ "$COMMITS" -eq 0 ] && [ "${{ github.event_name }}" != "workflow_dispatch" ]; then
echo "skip=true" >> $GITHUB_OUTPUT
echo "No changes in last 24 hours, skipping canary release"
else
echo "skip=false" >> $GITHUB_OUTPUT
echo "Found $COMMITS commits or manual trigger, proceeding with canary release"
fi

- name: Install pnpm
if: steps.changes.outputs.skip != 'true'
uses: pnpm/action-setup@v4
with:
run_install: false

- name: Use Node 22
if: steps.changes.outputs.skip != 'true'
- name: Use Node 24
uses: actions/setup-node@v4
with:
node-version: 22
node-version: 24
cache: 'pnpm'
registry-url: 'https://registry.npmjs.org'

- name: Install deps
if: steps.changes.outputs.skip != 'true'
run: pnpm install

- name: Build
if: steps.changes.outputs.skip != 'true'
run: pnpm build

- name: Create canary versions
if: steps.changes.outputs.skip != 'true'
run: pnpm changeset version --snapshot canary
- name: Set canary version
run: |
CANARY_VERSION="10.0.0-canary.$(git rev-parse --short HEAD)"
echo "Publishing canary version: $CANARY_VERSION"
cd packages/fiber && npm version $CANARY_VERSION --no-git-tag-version

- name: Publish to npm
if: steps.changes.outputs.skip != 'true'
run: pnpm changeset publish --tag canary
run: pnpm --filter @react-three/fiber publish --tag canary --no-git-checks --provenance
env:
NODE_AUTH_TOKEN: ''
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ $RECYCLE.BIN/
.DS_Store
.vscode
.claude
.cursor
Claude.md
.docz/
package-lock.json
coverage/
Expand Down
Binary file added .playwright-mcp/mission-control-demo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
87 changes: 87 additions & 0 deletions CHANGELOG-ALPHA.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,92 @@ Removed redundant renderer props that can be passed via `gl` or `renderer` props

### Features

#### Interactive Priority (userData.interactivePriority)

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.

```tsx
// This mesh receives events even if behind other objects in world space
<mesh userData={{ interactivePriority: 1 }}>
<boxGeometry />
<meshBasicMaterial />
</mesh>

// Higher values take precedence
<mesh userData={{ interactivePriority: 10 }}>
{/* Receives events before interactivePriority: 1 */}
</mesh>
```

**Sort order:**

1. Objects with `interactivePriority` come before objects without
2. Higher `interactivePriority` values win among prioritized objects
3. Then standard `events.priority` (portal/layer priority)
4. Then distance (closer first)

**Use cases:** Transform controls (PivotControls), UI overlays, debug helpers that use depth tricks to render on top.

**Files changed:**

- `packages/fiber/src/core/events.ts` - Added interactivePriority check in hit sorting

#### useBuffers & useGPUStorage Hooks

Added two new hooks for managing GPU storage in compute-intensive WebGPU applications:

**useBuffers** - Manages buffer data for GPU compute:

```tsx
import { useBuffers } from '@react-three/fiber/webgpu'
import { instancedArray } from 'three/tsl'

const { positions, velocities } = useBuffers(
() => ({
positions: instancedArray(count, 'vec3'),
velocities: new Float32Array(count * 3),
}),
'particles',
)
```

**useGPUStorage** - Manages GPU storage textures:

```tsx
import { useGPUStorage } from '@react-three/fiber/webgpu'
import { StorageTexture } from 'three/webgpu'

const { heightMap } = useGPUStorage(
() => ({
heightMap: new StorageTexture(512, 512),
}),
'terrain',
)
```

**Key features:**

- Same API pattern as `useNodes` and `useUniforms`
- Scoped storage with create-if-not-exists semantics
- Accessible in node creators via `({ buffers, gpuStorage }) => ...`
- Utility functions: `removeBuffers/Storage`, `clearBuffers/Storage`, `rebuildBuffers/Storage`, `disposeBuffers/Storage`
- GPU resource disposal via `disposeBuffers()` and `disposeStorage()`

**Supported types:**

- **useBuffers**: TypedArrays, BufferAttribute, StorageBufferAttribute, TSL buffer nodes (`instancedArray`, `storage`)
- **useGPUStorage**: StorageTexture, Storage3DTexture, TSL storage texture nodes

**Files changed:**

- `packages/fiber/src/core/store.ts` - Added `buffers: {}`, `gpuStorage: {}` to state
- `packages/fiber/types/store.d.ts` - Added BufferLike, BufferStore, StorageLike, StorageStore types
- `packages/fiber/src/webgpu/hooks/useBuffers.tsx` - **NEW** Buffer management hook
- `packages/fiber/src/webgpu/hooks/useGPUStorage.tsx` - **NEW** GPU storage management hook
- `packages/fiber/src/webgpu/hooks/ScopedStore.ts` - Added buffers/gpuStorage to CreatorState
- `packages/fiber/src/webgpu/hooks/index.ts` - Export new hooks
- `packages/fiber/src/webgpu/hooks/readmes/useBuffers-useGPUStorage.md` - **NEW** Documentation

#### forceEven Canvas Prop

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.
Expand Down Expand Up @@ -323,6 +409,7 @@ Added automatic Hot Module Replacement (HMR) support for WebGPU TSL hooks. When

### Bug Fixes

- 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.
- 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.
- Fixed `setSize` not triggering a frame in demand mode. Now calls `scheduler.invalidate()` directly so `useFrame` callbacks can respond to size changes.
- Fixed `useNodes()` and `useUniforms()` reader modes not updating when store changes
Expand Down
7 changes: 1 addition & 6 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,6 @@ pnpm ci # build → typecheck → eslint → dev → test → form

# Single Test File
vitest packages/fiber/tests/hooks.test.tsx

# Changesets (required for all code changes)
pnpm changeset:add # Create changeset for PR
```

## Architecture
Expand Down Expand Up @@ -139,9 +136,7 @@ Prefer clean, minimal code patterns:
## Commits & Releases

- **Conventional commits**: `feat:`, `fix:`, `chore:`, `docs:`
- **Changesets required**: Every code change needs `pnpm changeset:add` before merge
- **Version bump**: `pnpm vers` (from changesets)
- **Release**: `pnpm release` (build + changeset publish)
- **Release**: `pnpm release` (build + publish all packages)

## Common Pitfalls

Expand Down
Loading
Loading