feat: port FloatingIslands — the stack that runs backwards
6 of 8 archetypes ported. This one starts from VOID and FILLS where the other four start from ROCK and CARVE, which is what it was worth doing: neither end of the pile needed a new operator, only the opposite sign. FConstantRockSource -> FConstantFieldSource(+/-Base) AllSolid <-> AllAir FSdfCarveOp -> FSdfConvertOp(Sign = +/-1) carve <-> fill FSdfRoughnessMod 4th archetype, unchanged Only the island blob source is new. Multiplying by +/-1 is exact in IEEE-754, so the three already-green ports are bit-for-bit untouched. ClassifyBox can return AllAir for the first time in the plugin, and an island strate is by construction mostly empty — the test counts AllSolid and AllAir separately so an aggregate cannot hide whether that fired. Two bounds that would have been holes if assumed rather than derived: the island bound is one-sided (a hairline thread of matter hangs below each island down its axis, so only the TOP may reject), and the domain warp displaces X and Y independently, so the pad needs WarpAmp*sqrt(2). Also: AUDIT C1 was NOT closed. The 2026-07-27 sweep matched `SeedF * K` and this archetype's warp spells it `(float)S * K`, so one site survived — at seed 2e9 the warp flattens and every island snaps back to a perfect circle. Fixed in both paths in one pass so the equivalence test stays a valid oracle. Expect island silhouettes to change at large seeds. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -445,6 +445,30 @@ untouched — and since a floating-island strate is *mostly* empty void, that is
|
||||
with `FConstantVoidSource`'s `ClassifyBox → AllAir`, a FloatingIslands strate could go from skipping
|
||||
zero tiles to skipping the large majority of them.
|
||||
|
||||
#### ✅ PORTED 2026-07-28 — three deviations from the sketch above, all deliberate
|
||||
|
||||
1. **`FConstantVoidSource` and `FSdfFill` are not new classes.** Each is the class it mirrors, with
|
||||
the opposite **sign**: `FConstantFieldSource(±Base)` and `FSdfConvertOp(Sign = ±1)`, two factories
|
||||
each. The table above listed them as separate ops; writing them separately would have duplicated
|
||||
the classifier and the six-line formula for nothing. Multiplying by ±1 is exact in IEEE-754, so
|
||||
the three already-green ports are bit-for-bit untouched by the generalisation.
|
||||
**This is the port's actual result:** reuse **by inversion** rather than by identity — evidence
|
||||
that the abstract axis (the sign of the internal density) is the right one, not just that two
|
||||
archetypes happened to look alike.
|
||||
2. **The warp stays inside the source; no `FRAME` op was built.** Frames are worth building at the
|
||||
second real user, and two of the three (`TunnelNetwork`'s cave warp, its tunnel warp) are not
|
||||
ported yet. Designing the abstraction against a single example is what this refactor has avoided
|
||||
throughout — cf. `IVoxelBiomeField`, which was born from a concrete second need. Revisit with
|
||||
TunnelNetwork.
|
||||
3. **`AUDIT §C1`'s last surviving site was in this archetype** and was fixed in both paths in the
|
||||
same pass (the warp's `(float)S * 0.0007f`; the 2026-07-27 sweep matched `SeedF * K` and missed
|
||||
the `(float)S` spelling).
|
||||
|
||||
**The `Identity` bound is one-sided, and that matters:** `Sdf ≥ WorldZ − TopSurf` bounds an island
|
||||
from **above** only. Below `BotZ` the SDF degenerates to ≈ `DistXY`, so a hairline thread of matter
|
||||
hangs down each island's axis to the strate floor. Rejecting a box because it sits below an island
|
||||
would be a hole. Only the top rejects.
|
||||
|
||||
---
|
||||
|
||||
## 8. Underwater
|
||||
|
||||
Reference in New Issue
Block a user