Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
170 commits
Select commit Hold shift + click to select a range
5682886
The showcase shows what the bridge gained in 0.8.4
dzolotov Sep 30, 2026
775c232
0.9 has a plan: parity first, then past it
dzolotov Sep 30, 2026
7a1143e
The 0.9 plan answers its own open questions
dzolotov Sep 30, 2026
389d377
A hot reload reaches the picture
dzolotov Sep 30, 2026
2d1e808
An edited model lands in the nodes the game holds
dzolotov Sep 30, 2026
eac8d3f
The editor plays the project it is editing
dzolotov Sep 30, 2026
4afad3f
A level edit knows whether the run has to replay
dzolotov Sep 30, 2026
a0cb058
A level saved in the editor lands in the running game
dzolotov Sep 30, 2026
52dc84a
A tuned number is on the tape, and new code can relive the last seconds
dzolotov Sep 30, 2026
ff151e4
A material dragged in the inspector changes the next frame
dzolotov Sep 30, 2026
8f03266
The river's land reaches the sky, and its gunners are seen firing
dzolotov Sep 30, 2026
d3ea84a
A river craft only moves where there is water to cross
dzolotov Sep 30, 2026
e7bd729
A level saved in the editor lands in the platformer as it runs
dzolotov Sep 30, 2026
1b393e6
A dragged slider shows in the running game, and a reload replays itself
dzolotov Sep 30, 2026
0c6916b
The Medium article on the Flame bridge has its pictures
dzolotov Sep 30, 2026
bf23cec
The Medium article calls River Sortie a game along the lines of River…
dzolotov Sep 30, 2026
a08b56d
The Medium article calls River Sortie a River Raid-style shooter
dzolotov Sep 30, 2026
6375bd6
The Medium article takes its title and points back to the first one
dzolotov Sep 30, 2026
74f0b9a
The Medium article reads less like a template
dzolotov Sep 30, 2026
93ba614
The Medium article takes the serial comma
dzolotov Sep 30, 2026
c2cd178
An agent can play the level it is editing
dzolotov Sep 30, 2026
45eac9a
The Medium article credits Carol Shaw for River Raid
dzolotov Sep 30, 2026
33aeea8
The Carol Shaw paragraph claims only what it can back
dzolotov Sep 30, 2026
d6d5fd0
The Carol Shaw paragraph says it once
dzolotov Sep 30, 2026
9860d08
The Medium article ends with where to write
dzolotov Sep 30, 2026
f95f792
A texture repainted under a running game is drawn at its new size
dzolotov Sep 30, 2026
03c7781
A decal box paints its picture onto the geometry inside it
dzolotov Oct 1, 2026
da2a61a
The root's own test run checks the structure rules
dzolotov Oct 1, 2026
0ec4912
The README counts the golden scenes again, and a decal's scissor is p…
dzolotov Oct 1, 2026
9d54254
Merge main, the 0.8.5 releases, into 0.9.0
dzolotov Oct 1, 2026
8728858
Merge branch 'main' into 0.9.0
dzolotov Oct 1, 2026
d23fb08
Merge branch 'main' into 0.9.0
dzolotov Oct 1, 2026
ce87e65
Merge branch 'main' into 0.9.0
dzolotov Oct 1, 2026
9f8e399
Edges can be smoothed by SMAA as well as FXAA
dzolotov Oct 2, 2026
4154005
The lens bends the picture, flares, and takes a grading tool's table
dzolotov Oct 2, 2026
c6a9153
Merge P3: a decal box paints its picture onto the geometry inside it
dzolotov Oct 2, 2026
c9e26f9
A mirror in the floor, and a camera drawing into a texture
dzolotov Oct 2, 2026
fc4db1c
The sky becomes air, with stars at night and fog that lies low
dzolotov Oct 2, 2026
dfeb7c2
A draw can read one part of its index buffer
dzolotov Oct 2, 2026
d17a8aa
A material written in the material language now builds into a shader …
dzolotov Oct 2, 2026
132202d
A sky panorama edited under a running game lights it again
dzolotov Oct 2, 2026
7f1973b
A save in the editor reaches the game as a patch, and a saved run rep…
dzolotov Oct 2, 2026
064e6a8
A shader parameter dragged in the editor changes the running game
dzolotov Oct 2, 2026
3e338cb
The editor plays a running game it attaches to by address
dzolotov Oct 2, 2026
f7dbaf4
An actor decides by a tree that is written down
dzolotov Oct 2, 2026
3d5f1dc
A paused run can be scrubbed, branched from, and bisected against ano…
dzolotov Oct 2, 2026
6d3ed03
A recorded run is a game's regression test, with no GPU
dzolotov Oct 2, 2026
6d5547d
A save is migrated, written on pause, and kept in the cloud only with…
dzolotov Oct 2, 2026
180ed44
A player's run can be sent with consent and drawn as a heatmap
dzolotov Oct 2, 2026
6697658
A paused game can be photographed at any size, filtered and shared
dzolotov Oct 2, 2026
e463283
A tool attached to a running game can read the frame it drew
dzolotov Oct 2, 2026
6abaf88
A body can turn, when it is built to
dzolotov Oct 2, 2026
fb401c9
The level editor has Windows and Linux runners, and Stop ends the too…
dzolotov Oct 2, 2026
b572b5d
A level bakes into a navigation mesh beside its grid
dzolotov Oct 2, 2026
5ff47d9
An animation graph picks the clip in the fixed step
dzolotov Oct 2, 2026
6f7bc70
A level can be shared behind a short code
dzolotov Oct 2, 2026
1efddf5
A material channel can be shown in place of the light, beside it
dzolotov Oct 2, 2026
a82e4b8
Merge remote-tracking branch 'origin/main' into feat/translucent-shadows
dzolotov Oct 2, 2026
2379a55
An orthographic camera stops treating its eye as a point
dzolotov Oct 2, 2026
2d692bf
Nodes that share a material can be put in an order
dzolotov Oct 2, 2026
2657152
See-through casters shade the sun by what their material lets through
dzolotov Oct 2, 2026
b104ed3
The bench's glass and liquids cast shadows by what they let through
dzolotov Oct 2, 2026
d86fb0b
The bench's shadows take the colour of what is in the tubes
dzolotov Oct 2, 2026
500e20c
A transmitting caster's shadow takes the colour of its depth
dzolotov Oct 2, 2026
25d51c8
A see-through caster can paint what it lets through, past one
dzolotov Oct 2, 2026
b55b81a
The bench works its shadows out with geometric optics
dzolotov Oct 2, 2026
96c9449
Light through a refracting caster is followed to where it lands
dzolotov Oct 2, 2026
30c003e
The bench can be lit by the engine's photons as well as its own optics
dzolotov Oct 2, 2026
72182a4
A masked edge can be smoothed as multisample coverage where the devic…
dzolotov Oct 2, 2026
81bb2fb
A material written in the language draws on all four backends from on…
dzolotov Oct 2, 2026
eb6cb36
CI walks past packages/education, photons use the particles' varyings
dzolotov Oct 2, 2026
e80cd44
Merge pull request #52 from pleiondev/feat/translucent-shadows
dzolotov Oct 2, 2026
d748c2d
A material written in the language takes values a game sets while it …
dzolotov Oct 2, 2026
67c55f3
A material edited under a running game is drawn by the next frame
dzolotov Oct 2, 2026
8cb5aa0
The bench's glass is as visible as its shadow is dark
dzolotov Oct 2, 2026
50ebd49
Merge pull request #53 from pleiondev/fix/glass-shadow-contrast
dzolotov Oct 2, 2026
932715d
Thin glass composites over what is behind it; convex volumes
dzolotov Oct 2, 2026
eda5620
chemlab: liquid that keeps level, sloshes and refracts the bench
dzolotov Oct 2, 2026
9e71aa2
Merge pull request #54 from pleiondev/feat/liquid-look
dzolotov Oct 2, 2026
3332a0d
chemlab: pour a solution into a clean tube until both hold the same
dzolotov Oct 2, 2026
538e6cf
Merge pull request #55 from pleiondev/feat/chemlab-pouring
dzolotov Oct 2, 2026
8977c92
Reflected light is lost to a shadow only as far as it is turned away
dzolotov Oct 2, 2026
4a6045a
chemlab: run on macOS; controls on two lines; stream placeholder Meta…
dzolotov Oct 2, 2026
251e0e7
Merge pull request #56 from pleiondev/fix/glass-edge-and-macos
dzolotov Oct 2, 2026
022e8d4
chemlab: glass you can see; the engine's photons always on
dzolotov Oct 2, 2026
077970e
Merge pull request #57 from pleiondev/feat/visible-glass
dzolotov Oct 2, 2026
0db358a
chemlab: glass halfway between a ghost and a wall
dzolotov Oct 2, 2026
2e743a1
Merge pull request #58 from pleiondev/feat/glass-middle
dzolotov Oct 2, 2026
a2ebb92
chemlab: hold the sliders to their range during a pour
dzolotov Oct 2, 2026
f2f9c2e
Merge pull request #59 from pleiondev/fix/slider-range
dzolotov Oct 2, 2026
e8b0a48
chemlab: the stream worked out from the flow, poured lip to lip
dzolotov Oct 2, 2026
7bf83ab
Merge pull request #60 from pleiondev/fix/thinner-stream
dzolotov Oct 2, 2026
77912a8
chemlab: the stream keeps to continuity and runs down the glass
dzolotov Oct 2, 2026
2ad84ab
Merge pull request #61 from pleiondev/feat/stream-walls
dzolotov Oct 2, 2026
6b3806f
chemlab: pour by the lean, lean in the picture
dzolotov Oct 2, 2026
75af676
Merge pull request #62 from pleiondev/feat/pour-by-tilt
dzolotov Oct 2, 2026
a1d145f
Liquids in flutter3d_physics: vessels, outflow, free surface
dzolotov Oct 2, 2026
79fbaec
Merge pull request #63 from pleiondev/feat/fluid-core
dzolotov Oct 2, 2026
3a2e1fc
Liquids: a stream as parcels, held by walls, parting into drops
dzolotov Oct 2, 2026
8fad679
Merge pull request #64 from pleiondev/feat/fluid-jet
dzolotov Oct 2, 2026
de1f4cf
Liquids: capillarity, communicating vessels, a fluid world
dzolotov Oct 2, 2026
d2e09c0
Merge pull request #65 from pleiondev/feat/fluid-capillary
dzolotov Oct 2, 2026
a5fc7f1
Liquids: solutions and layers that do not mix
dzolotov Oct 2, 2026
3381813
Merge pull request #66 from pleiondev/feat/fluid-mixtures
dzolotov Oct 2, 2026
3fd1370
Liquids: drops, splashes and spills as particles
dzolotov Oct 2, 2026
01645e2
Merge pull request #67 from pleiondev/feat/fluid-particles
dzolotov Oct 2, 2026
c4808f5
Liquids: buoyancy, drag and the load on a vessel
dzolotov Oct 2, 2026
500e58d
Merge pull request #68 from pleiondev/feat/fluid-bodies
dzolotov Oct 2, 2026
00ecd27
Meshes for liquids, streams and particles in flutter3d_core
dzolotov Oct 2, 2026
1330aa9
Merge pull request #69 from pleiondev/feat/fluid-meshes
dzolotov Oct 2, 2026
7dcea66
feat: Run chemlab on the fluid module at life size
dzolotov Oct 2, 2026
559002e
fix: Rename River's jet plane mesh off the engine's jetMesh
dzolotov Oct 2, 2026
024cf8a
Merge pull request #70 from pleiondev/feat/chemlab-on-fluids
dzolotov Oct 2, 2026
0a80c27
Merge local 0.9.0 into origin's: the 0.9 roadmap work and the liquids
dzolotov Oct 2, 2026
5b2b5d3
fix: Stamp a vessel's place with the frame's time
dzolotov Oct 2, 2026
a2c1d5f
Merge pull request #71 from pleiondev/fix/liquid-place-time
dzolotov Oct 2, 2026
d14a1e3
fix: Make the pour work on macOS and the web, and look like one
dzolotov Oct 2, 2026
f5a70e1
Merge pull request #72 from pleiondev/fix/pour-visual
dzolotov Oct 3, 2026
a6d9b4d
perf: Let a liquid standing still sleep
dzolotov Oct 3, 2026
3b1e678
Merge pull request #73 from pleiondev/perf/sleeping-liquids
dzolotov Oct 3, 2026
ea778c7
A scene can be written as widgets over the same graph
dzolotov Oct 3, 2026
eadb2ef
The article's collision snippet matches the example it quotes
dzolotov Oct 3, 2026
9c7b5a8
Shadow cascades follow an orthographic camera's view
dzolotov Oct 3, 2026
5db8c76
Particles and splats fog by depth through an orthographic camera
dzolotov Oct 3, 2026
ddb0626
An orthographic near plane can stand behind the camera
dzolotov Oct 3, 2026
0e356ee
Splats sort by depth through an orthographic camera
dzolotov Oct 3, 2026
89fbc02
The overlay reads its pixel off the camera's own projection
dzolotov Oct 3, 2026
1c020f2
A level brush can say where it draws
dzolotov Oct 3, 2026
5dc50fb
A renderer draws materials from more than one bundle
dzolotov Oct 3, 2026
ae1c2f1
A hot edit that changes how a material binds reaches it
dzolotov Oct 3, 2026
ca527b3
A WebGPU stage loaded from a bundle says what it declares
dzolotov Oct 3, 2026
8b583bd
A material can answer each light itself
dzolotov Oct 3, 2026
9d0f9da
Each copy of an instanced batch carries numbers of the game's own
dzolotov Oct 3, 2026
70a0fee
The rest of a scene can be written as widgets
dzolotov Oct 3, 2026
fcd823f
The physics core starts in C
dzolotov Oct 3, 2026
05a344a
An overfull flask no longer floods the bench
dzolotov Oct 3, 2026
5a5f31e
The native world turns, burns and feels the wind
dzolotov Oct 3, 2026
ace94d3
Native bodies find where they touch
dzolotov Oct 3, 2026
5bde4fb
Native crates rest, stack, slide and roll
dzolotov Oct 3, 2026
f0dc5df
The native world keeps a tree of where things are
dzolotov Oct 4, 2026
feb324e
Native bodies come in any convex shape
dzolotov Oct 4, 2026
f5166a2
Native levels can be made of triangles
dzolotov Oct 4, 2026
d8e2e8b
Native bodies can be joined
dzolotov Oct 4, 2026
25c5f44
Fast native bodies stop at thin walls
dzolotov Oct 4, 2026
5fb7e20
A native bullet's turn is swept with it
dzolotov Oct 4, 2026
0fc670e
The native world answers rays, and walks a character
dzolotov Oct 4, 2026
a29822b
A thin native rod no longer flies apart
dzolotov Oct 4, 2026
378c232
Particles fall on the GPU as they do on the CPU
dzolotov Oct 4, 2026
9537968
Rubble heaps on the GPU a frame late
dzolotov Oct 4, 2026
5592e0d
Cloth hangs and drapes on the GPU as on the CPU
dzolotov Oct 4, 2026
4ce71f7
Water slumps, splashes and settles on the GPU too
dzolotov Oct 4, 2026
7645b2c
A world steps on threads and lands on the same bits
dzolotov Oct 4, 2026
f3db172
Contacts solve a colour at a time in the fast mode
dzolotov Oct 4, 2026
973b63f
The broadphase remembers its pairs between steps
dzolotov Oct 4, 2026
00388e6
The fast mode solves contacts four to a vector
dzolotov Oct 4, 2026
65867bc
The core's Dart side reaches it by address, not by pointer
dzolotov Oct 4, 2026
3db3038
The physics core runs in the browser on the same API
dzolotov Oct 4, 2026
4790081
The core steps on Web Workers in the browser
dzolotov Oct 4, 2026
812176a
A ragdoll falls, tumbles and sleeps on its joints
dzolotov Oct 4, 2026
f44ab65
The core's own tests run under flutter test again
dzolotov Oct 4, 2026
5653d3b
The core steps to the same bits on every platform it reaches
dzolotov Oct 4, 2026
5469c51
The pool's lock starts on Windows with a call that exists
dzolotov Oct 5, 2026
efb05f3
The digests run on Windows from a Mac too
dzolotov Oct 5, 2026
e59de43
The generator reads a Windows checkout's line ends as its own
dzolotov Oct 5, 2026
301ec2f
Bodies are stepped through a seam a second backend can fill
dzolotov Oct 5, 2026
799d5ca
The native core steps flutter3d_physics' own bodies
dzolotov Oct 5, 2026
a909330
The platformer's level plays with its crates on the native core
dzolotov Oct 5, 2026
bc0210a
The mirrored bodies step to the same bits in the browser
dzolotov Oct 5, 2026
a795727
The platformer steps its crates on the native core
dzolotov Oct 5, 2026
9757547
flutter3d says it runs on the web, and nothing it imports says otherwise
dzolotov Oct 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
52 changes: 42 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -362,17 +362,24 @@ jobs:
# this workflow has no way to drive. What a build proves is the half that
# actually breaks: the CMake, the plugin registration, and every package in
# the graph compiling for a platform none of them had been asked about.
#
# The level editor as well, for P11: it ships desktop downloads for both, so
# its runners are compiled here rather than first by whoever downloads one.
# Its graph brings `file_selector`'s own GTK and Win32 plugins, which the
# dungeon demo does not.
desktop:
strategy:
# Both, whichever fails: a matrix that stops at the first failure hides
# whether the other one was ever going to work.
# Every cell, whichever fails: a matrix that stops at the first failure
# hides whether the others were ever going to work.
fail-fast: false
matrix:
target: [linux, windows]
app: [flutter3d_demo_dungeon, flutter3d_editor]
include:
- os: ubuntu-latest
target: linux
- os: windows-latest
target: windows
- target: linux
os: ubuntu-latest
- target: windows
os: windows-latest
runs-on: ${{ matrix.os }}
timeout-minutes: 30
steps:
Expand All @@ -385,8 +392,8 @@ jobs:
cache: true

# libasound2-dev is not part of the Flutter desktop toolchain: it is what
# flutter_soloud's own ALSA backend compiles against, and the dungeon demo
# is the application that pulls the audio plugin in. Without it the build
# flutter_soloud's own ALSA backend compiles against, and both applications
# pull the audio plugin in, the editor through `flutter3d_game`. Without it the build
# gets all the way to soloud_alsa.cpp and stops at a missing header.
- name: linux desktop toolchain
if: matrix.target == 'linux'
Expand All @@ -402,8 +409,33 @@ jobs:
- run: flutter precache --${{ matrix.target }}
- run: cd packages/flutter3d_impeller && dart run bin/build_shader_bundle.dart

- name: build the dungeon demo
run: cd apps/flutter3d_demo_dungeon && flutter build ${{ matrix.target }} --debug
- name: build ${{ matrix.app }}
run: cd apps/${{ matrix.app }} && flutter build ${{ matrix.target }} --debug

# The native physics core on Windows, built by MSVC as the hook builds it
# there: its C tests, its digests — the bits every other platform steps
# to, written in csrc/tests/test_digest.c — the pool on Win32 threads, and
# the Dart side over the library the hook made. The check job runs the
# same package on Linux; nothing else here compiles the core with MSVC.
physics-native-windows:
runs-on: windows-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v7

# `cl` on the path, for test/c_unit_test.dart; the hook finds MSVC
# itself.
- uses: ilammy/msvc-dev-cmd@v1

- uses: subosito/flutter-action@v2
with:
flutter-version: '3.47.0'
channel: stable
cache: true

- run: flutter pub get
- run: flutter test
working-directory: packages/flutter3d_physics_native

godot:
runs-on: ubuntu-latest
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ row a change belongs to.

```sh
dart analyze # in the packages you touched
dart run tool/structure.dart # 35 rules about how the tree is arranged
dart run tool/structure.dart # 36 rules about how the tree is arranged
dart run tool/verify_plan.dart # every finished row names something real
```

Expand Down
21 changes: 12 additions & 9 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@ point of §3.3.
| `flutter3d_editor_core` | The headless half of a level editor: the document being changed and undone, the handles a pointer hits, the palette a level builds out of itself, the project a template becomes; `LevelScene`, which turns a level into brush meshes, materials, lights and probes with no Flutter; the seeded level generators; and `LightOptimizer`, which finds fewer lights that light a level the way it was lit. Plain Dart |
| `flutter3d_editor_widgets` | Editor controls the modeller and the level editor share instead of each keeping its own copy — `ui-27`'s own package: `SectionLabel`, `NumberField`, `ColorField`, `RangeSliderField`, `EnumField`, `TextureSlotRow`, `TexturePathField`, `ColorSwatchField`, `HintTextBox`/`NumbersRow`, `FieldRow` and `EditorWidgetsTheme` so far |
| `flutter3d_editor_mcp` | The same editor offered to an agent: `EditorCommand` as a table of MCP tools over stdio, one document per process, plus the two verbs a caller with no screen needs — a flat listing, and the validator. Plain Dart |
| `flutter3d_editor_play` | Play from a level editor: the game a level belongs to run with `flutter run --machine`, swapped, restarted and stopped, its devices listed, and a saved level sent to it. What the editor's Play button and `flutter3d_editor_mcp`'s `play` tools both run. Plain Dart with `dart:io`, which is why it is not in `flutter3d_editor_core`; `attach.dart` is the part without it, a game attached to by its VM service address, which is the web editor's Play |
| `flutter3d_mcp_kit` | What every MCP server here shares: a tool paired with its handler, a server that is a list of them over one session, the two shapes of answer, and a loopback HTTP transport an open application offers its session over. Plain Dart |
| `flutter3d_sim_mcp` | A level an agent plays blind, of whatever `HeadlessGame` a host hands it — step, read back, digest, hand over the run — and many seeded playtests in isolates; and a rendered frame of a level offered to an agent: drawn with no GPU in one of the renderer's debug views, one pixel read back unclamped, the passes the frame graph ran. Names no genre |
| `flutter3d_build` | The converter behind `dart run flutter3d_build:convert` and the build hook that runs it on every build, and the bakes that need a renderer or a mesh editor ahead of time: levels of detail, impostors, cluster tables, a file per device class, paged splat captures, six-way smoke sheets, and the light optimizer's command. That is why it depends on `flutter3d_cpu`, `flutter3d_mesh`, `flutter3d_model_core`, `flutter3d_editor_core` and `flutter3d_sim`. Not a dependency of the engine: no game that draws a frame runs it. Plain Dart |
Expand Down Expand Up @@ -334,7 +335,7 @@ a caller for that cannot supply a Flutter SDK.

### 3.3 Rules that are scanned, not remembered

`tool/structure.dart` walks `packages/` and `apps/` and enforces thirty-five rules in
`tool/structure.dart` walks `packages/` and `apps/` and enforces thirty-six rules in
under a second, as the first step of CI. They cover the *arrangement* of the code
— who imports what, what a name says, where a thing may live — while anything
about what the code *does* stays a test.
Expand Down Expand Up @@ -405,7 +406,8 @@ written and read in:
```
point shadows (static) → point shadows → directional shadows → shadow moments
reflection probe 0 … n → irradiance update
scene → scene colour copy → transparent → object ids
render textures → planar reflections
scene → decals → scene colour copy → transparent → object ids
(overlay nodes) → reflections → luminance → depth pyramid
ssao → ssao blur → contact shadows → contact shadow resolve
camera velocity → object velocity → reactive mask
Expand Down Expand Up @@ -2689,8 +2691,8 @@ storage.
|---|---|
| Style | `dart format` |
| Analysis | `flutter analyze` clean across the workspace, no warnings |
| Unit tests | **10789 tests** across 42 packages and 10 applications |
| Structure rules | 35, `dart run tool/structure.dart`, the first CI step |
| Unit tests | **11490 tests** across 44 packages and 10 applications |
| Structure rules | 36, `dart run tool/structure.dart`, the first CI step |
| CI | GitHub Actions over `tool/ci.sh`, on `ubuntu-latest`, with no graphics card |

### 13.1 The published-enum boundary
Expand Down Expand Up @@ -2729,7 +2731,7 @@ material parameter — is the case `doc/boundary-0.5.0.md` worked through for
set belongs to whoever builds on the package rather than to the package
itself.

**Golden render tests.** 78 scenes against **four complete independent
**Golden render tests.** 95 scenes against **four complete independent
reference sets** — Impeller, the software rasteriser, WebGL2 and WebGPU — each
held to zero differing pixels against its own set, with a per-channel tolerance
of 8.
Expand Down Expand Up @@ -3141,7 +3143,7 @@ metres. The directional light's cascades fit the view up to that distance and
nothing beyond it casts — a level whose far end matters visually wants the
number raised, and pays for it in texels.

**The web backend draws all seventy-eight golden scenes the way Impeller does**,
**The web backend draws all ninety-five golden scenes the way Impeller does**,
between 0.01% and 0.42% of pixels differing by more than 8 per channel — the
silhouette's worth of disagreement two rasterisers always have. Two of those
numbers fell when the minification filter learned to read a sampler's
Expand Down Expand Up @@ -3257,7 +3259,7 @@ and charge each of them the bytes, and neither is a change to make on somebody
else's behalf. A build that wants it says so in one flag, and the engine's own
example takes the same answer from `?backend=webgpu` in the URL — a query
parameter rather than a define, because the browser golden stand's whole saving
is one dart2js run serving seventy-eight scenes and both browser backends.
is one dart2js run serving ninety-five scenes and both browser backends.

**`flutter3d_shaders` is one text and no two backends take it the same way.**
Impeller compiles the GLSL with `impellerc`; the WebGL2 generator translates it
Expand Down Expand Up @@ -3707,13 +3709,14 @@ what went out at 0.4.2.
`flutter3d_audio_core`, `flutter3d_physics`, `flutter3d_mcp_kit`,
`flutter3d_lti`, `pad_input`, `pointer_lock`, `flame_multiplayer`
2. `flutter3d_conformance`, `flutter3d_core`, `flutter3d_audio`,
`flame_multiplayer_dashwire`
`flame_multiplayer_dashwire`, `flutter3d_physics_native`
3. `flutter3d_mesh`, `flutter3d_build`, `flutter3d_particles`,
`flutter3d_editor_widgets`
4. `flutter3d`, `flutter3d_model_core`
5. `flutter3d_impeller`, `flutter3d_webgl`, `flutter3d_webgpu`, `flutter3d_cpu`,
`flutter3d_sim`
6. `flutter3d_app`, `flutter3d_editor_core`, `flutter3d_net`, `flutter3d_lab`
6. `flutter3d_app`, `flutter3d_editor_core`, `flutter3d_editor_play`,
`flutter3d_net`, `flutter3d_lab`
7. `flutter3d_game`, `flutter3d_stereo`, `flutter3d_testing`,
`flutter3d_editor_mcp`, `flutter3d_model_mcp`, `flutter3d_net_webrtc`
8. `flutter3d_game_shooter`, `flutter3d_game_platformer`, `flutter3d_game_racing`,
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ number should be.

## Architecture is checked by scans, not by review

`dart run tool/structure.dart` holds thirty-five rules about how the repository is
`dart run tool/structure.dart` holds thirty-six rules about how the repository is
arranged — that a genre package names no other genre, that the hardware layer
names no graphics API, that the engine names no backend, that a simulation step
reaches for no clock and no loose dice. It runs first in CI and takes under a
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,9 @@ Or one package at a time:
(cd packages/flutter3d_physics && dart test) # plain Dart, no Flutter needed
```

There are 10789 tests across forty-two packages and nine applications. The
There are 11490 tests across forty-four packages and nine applications. The
only ones that need a GPU are the Impeller half of the golden set. The other
half is rendered by the software backend, which is what makes 78 scenes
half is rendered by the software backend, which is what makes 95 scenes
checkable in a headless run.

Several steps run in a browser. `flutter test --platform chrome` covers the two
Expand Down Expand Up @@ -209,7 +209,7 @@ binary has not got, and binding a slot a compiled shader does not have takes
the frame down. The message names nothing that leads back to the file that was
edited.

So `dart run tool/structure.dart` checks it: one of its thirty-five rules compares
So `dart run tool/structure.dart` checks it: one of its thirty-six rules compares
the bundle against the sources it was built from and says which of them are
newer. The rule skips when there is no bundle at all, which is every fresh
checkout and every CI run. `impellerc` is not there to build one, and a rule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@
import FlutterMacOS
import Foundation

import flutter_soloud
import pad_input
import pointer_lock

func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FlutterSoloudPlugin.register(with: registry.registrar(forPlugin: "FlutterSoloudPlugin"))
GamepadPlugin.register(with: registry.registrar(forPlugin: "GamepadPlugin"))
PointerLockPlugin.register(with: registry.registrar(forPlugin: "PointerLockPlugin"))
}
3 changes: 3 additions & 0 deletions apps/flutter3d_demo_dungeon/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,9 @@ class _GameScreenState extends State<GameScreen>
frameTimes: _frameTimes,
bugReport: _remoteBugReport,
);
// `P12`: the frame this game draws, pass by pass and draw by draw, for
// whichever renderer is open when somebody asks.
registerRenderExtensions(() => _renderer);

_view = RenderView(camera: _camera);

Expand Down
Loading
Loading