Scene 143 — Recording: Porous Growth Comparison stages Steam Bun, Crust Dough and Crumb Loaf from left to right. Each has the same rounded geometry and two actual holes made by leaving particles out. All start at 365 K. A 560 K radial controlled heater warms them; the central specimen receives stronger heating because it is closer to the source. Compare a material with itself across takes.
In Presets > Recording studio, select this take and load it. Its four mode buttons reload to paused, with identical geometry and initial conditions:
| Button | Growth-consistent stress | Pseudo thickness gains | Z-occupancy/support |
|---|---|---|---|
| Pure 2D | On | Off | Off |
| Thickness surrogate | On | On | Off |
| Legacy thickness | Off | On | Off |
| Z-occupancy legacy forces | On | On | On |
P runs/pauses, U hides UI, and R reloads the default corrected thickness take. The first two routes isolate the existing thickness gains. The middle two isolate the new constitutive law. The final route preserves the old occupancy support heuristic for comparison; these authored holes have no particles, so they are fully open through the modeled slice. Carving with the Erase Wall tool creates partial occupancy, a separate experiment.
For other scenes, the optional checkbox is Bake / Thickness > Growth-consistent porous stress. It defaults off. Only Steam Bun, Crust Dough and Crumb Loaf are enrolled. Existing Bake Stability v2, Bake Profiles v1, pseudo thickness and z-occupancy controls remain selectable. Reloading another scene resets the new option to its off default.
Specific correction
The previous porous law used an inflated target area J_rest only in its volume
term, while its corotated term remained 2 mu (F - R) F^T. At a freely grown
configuration F = sqrt(J_rest) R, the volume term vanishes but the corotated term
still pulls inward. This contradicts the inflated rest shape already assumed by
the Bake Stability v2 tear test. Larger thickness gain amplifies the inconsistency
because it increases the growth target.
The optional route uses an isotropic growth split:
Fg = sqrt(J_rest) I
Fe = F / sqrt(J_rest)
Je = J / J_rest
stress = 2 mu (Fe - R) Fe^T + lambda (Je - 1) Je I
Both terms vanish at free isotropic growth, including rotated growth. This is a small application of the elastic/inelastic split discussed in Ozakin and Yavari's thermal-stress theory and Sauer, Ghaffari and Gupta's growth/swelling formulation. The implementation is a simplified 2D constitutive choice; it does not implement either paper's complete model.
The same optional route removes the setting-time blend back toward the original unexpanded rotation, measures tensile and differential stretch relative to the grown shape, and removes Crumb Loaf's direct pore-state-to-tear term. Mechanical strain and shell/core mismatch still drive tearing. Material-specific heat, gas, setting, viscosity, venting and stiffness coefficients remain stylized.
What thickness does and does not do
2.5D Bake/Kiln Support increases selected shell/core stiffness, target area, gas retention and tear thresholds. These are constitutive gain controls. They do not add a z coordinate, layers, bending across depth, or a hidden load path.
Real 2.5D (z-occupancy) stores an 8-bit remaining fraction per particle. It scales deposited mass, momentum and heat together, and optionally the drawn opacity. Its grid support reduces gravity where local density resembles an overhang and applies a lateral density-gradient pull. That heuristic is not an anchored 3D structure or a momentum-conserving hidden-layer solve. Its coverage calibration also depends on mass and grid spacing. Naming it "Real 2.5D" in the existing UI should not be read as a physical guarantee.
A through-hole wider than the MPM interpolation neighborhood cannot transmit stress across the empty gap. A real porous 3D object may carry loads around such a slice through material in front or behind it. These scalar modes cannot recover that missing topology. The new growth correction fixes one local inconsistency; large cavities can still close under gravity. True depth connectivity requires additional geometry/layers or explicit structural constraints.
Validation and reproduction
Build from the source root using the correctly rooted build-local cache:
cmake --build build-local --config Release --target noita_gish porous_growth_test scene_browser_data_test
.\build-local\Release\porous_growth_test.exe BASELINE_P2G.comp
.\build-local\Release\scene_browser_data_test.exe
.\build-local\Release\Crucible.exe --scene 143 --porous-mode thickness --run --frames 600 --hidden --no-ui --no-settings --capture porous-thickness.bmp
--porous-mode accepts 2d, thickness, legacy, or occupancy, only with scene
143. Capture files are BMP. Keep frame count and solver settings equal. The
baseline shader used here is shaders/physics/mpm_p2g.comp from commit
16ccccedab0e98a5c619d920788b537ebb1c7f1b.
On the RTX 4080 Laptop GPU, the regression passes 234 checks: free growth with rotation, loaded force and damage, remaining-occupancy scaling, setting and crumb self-tear behavior, unaffected unenrolled material, and 24 exact checkpoint comparisons with the option disabled. These are local GPU invariants, not a proof of coupled energy conservation or convergence. Metadata parsing passes 17,465 checks.
All four 600-frame engine runs completed with 10,605 particles, no nonfinite positions, velocities, temperatures or material states, and clean shutdown. The snapshots show a modest retained-height difference with thickness and substantial settling in every mode. Steam Bun height was 0.623 in pure 2D and 0.690 with thickness (world units). At equal thickness, Crumb Loaf's mean tear channel was 0.0515 in the legacy route and 0.0244 in the corrected route. These are observations of this fixture, not material calibration or universal improvements.

