18 KiB
Floating Island Shard Domain Warp Implementation Plan
Created: 2026-04-22 Status: VERIFIED Approved: Yes Iterations: 0 Worktree: No Type: Feature
Summary
Goal: In the Iris overworld pack (primary testbed: roughplains.json), make floating island shards read as less "mathy / sharply vertical" by enabling the already-wired per-layer domain warp on the two floatingChildBiomes entries.
Architecture: IrisFloatingChildBiomes already defines wallWarpStyle + wallWarpAmplitude fields and exposes them through getWallWarpCng(...). FloatingIslandSample.sample(...) already consumes them at Iris/core/.../FloatingIslandSample.java:220-254 — for each Y layer of an island column, it offsets the footprint XZ sample by a signed 3D noise value before re-testing against footprintThreshold. This gives organic bulge/recession on the side walls without touching the tops (driven by topShapeMode=BIOME) or the bottoms (driven by bottomStyle). The current pack doesn't set wallWarpStyle, so useWarp == false and walls are a straight extrusion of the 2D footprint.
Tech Stack: Iris pack JSON (no Java changes).
Scope
In Scope
- Edit
[Minecraft Server]/consumers/plugin-consumers/shared-plugin-data/iris/packs/overworld/biomes/temperate/roughplains.json. - Add
wallWarpStyleandwallWarpAmplitudeto both entries infloatingChildBiomes(mushroom/forestandtropical/wilds). - Chosen values (answers to Q1/Q2/Q3):
wallWarpStyle = {"style":"SIMPLEX","zoom":0.25},wallWarpAmplitude = 10.0. Identical on both entries.
Out of Scope
- Java source changes inside
Iris/core— the warp is already wired. NoFloatingIslandSample.javaorIrisFloatingChildBiomes.javaedits. - Changing the schema default for
wallWarpStylefromnullto a non-null value — would silently change behavior for every existing pack; user explicitly chose "pack only". - Audit of other biomes — Grep confirms
floatingChildBiomesonly appears inroughplains.jsonacross the overworld pack. - Any change to
topShapeMode,bottomStyle,carveStyle, orfootprintStyle(tops and bottoms already look correct). - Code quality improvements to the warp algorithm (independent X/Z seeds, multi-octave / iq-style warp-the-warp, vertical frequency multiplier) — user declined the "code-side improvement too" option.
TotalFixes.mdentry — repo policy (AGENTS.md) says append to existing sections; will be handled during implementation as part of the DoD if the repo conventions require it.
Approach
Chosen: Pack-only enablement of the existing wall-warp feature.
Why: All the plumbing already exists; the missing link is pack configuration. Zero code changes means zero risk of regressing any other floating-island behavior. The user owns this test pack, so they can tune values in follow-up without a code round-trip.
Alternatives considered:
- Flip schema default of
wallWarpStyleto a gentle SIMPLEX. Rejected — silently changes behavior for every existing pack/user, and the point of having the feature opt-in is that visual style is a pack-authored choice. - Rewrite the warp in
FloatingIslandSamplefor higher fidelity (iq-style warp-the-warp, independent X/Z noise hashes, per-axis frequency scaling). Rejected — the current single-pass 3D warp already produces perturbed walls; the author of this ticket observed that the walls look "very sharply vertical" precisely because the feature is off in this pack, not because the existing implementation is inadequate. Revisit only if enabling the feature fails to soften the walls to the user's liking. - Per-entry tuning (mushroom gentler, tropical heavier). Rejected — user selected "same warp for both". Revisit in a follow-up if the tropical shards (thicker at 112) still read as too vertical compared to mushroom (32).
Context for Implementer
- Target file (ONLY file to edit):
/Users/brianfopiano/Developer/RemoteGit/[Minecraft Server]/consumers/plugin-consumers/shared-plugin-data/iris/packs/overworld/biomes/temperate/roughplains.json - Do not touch: any file under
Iris/core/src/.... This is pack authoring, not code. - Schema reference:
Iris/core/src/main/java/art/arcane/iris/engine/object/IrisFloatingChildBiomes.java:170-176documentswallWarpStyleandwallWarpAmplitudewith accepted values, including the exact example the chosen config is based on ({"style":"SIMPLEX","zoom":0.25}for "gentle undulation"). Amplitude 10 falls between the labeled bands (@Descline 175: "4..8 = gentle naturalization. 16+ = heavily meandering"), placing it in the lower-medium range — consistent with the user's stated Medium (~8-12 blocks) preference. - Field type:
wallWarpAmplitudeis declareddouble(default6.0) atIrisFloatingChildBiomes.java:176. In JSON, write10.0(not10) to match the field's declared type and the existing default's literal form — Gson coerces either, but10.0is clearer for future pack authors comparing to the default. - Consumer reference:
FloatingIslandSample.java:220-254— confirms that when bothwallWarpStyle != nullandwallWarpAmplitude > 0, the per-layer XZ warp activates. No other branch needs to be exercised. - Field placement convention: Existing entries order properties as
footprint* → picker* → altitude* → height → topShape → bottom* → maxThickness → carve* → inheritX → objectShrinkFactor. Insert the two wall-warp fields immediately aftermaxThicknessand beforecarveStyle— this keeps wall-shaping modifiers grouped and matches the @Desc-style progression from coarse (footprint) → fine (carve) detail. Preserve JSON formatting (4-space indent, trailing commas only where already present). - Gotchas:
- JSON (not JSONC) — no comments, no trailing commas after the last key of an object.
- Iris CNG styles are case-sensitive — use
"SIMPLEX"exactly, not"simplex". - The file currently has two entries in
floatingChildBiomes— both must be updated. The whole point of the change is symmetric behavior on both.
Domain context
- What the warp does at runtime (to guide visual verification): For each Y layer of a candidate island column, the generator computes
(sx, sz) = (wx, wz) + 10 × signed_noise3d(wx, wy, wz)(X and Z offsets use decorrelated input coordinates), then re-samples the 2D footprint at(sx, sz)and re-tests againstfootprintThreshold. This means the horizontal silhouette of a shard can expand or contract by up to ~10 blocks per Y slice — the wall is no longer a vertical extrusion of the footprint. Zoom 0.25 makes the feature size of the warp ~25 blocks, which varies across the ~30-block CELLULAR shards enough to push each shard's silhouette into asymmetric bulges without high-frequency jitter. - Why tops/bottoms stay clean: Tops are shaped by
topShapeMode = BIOME(the target biome's own generators); bottoms bybottomStyle(CELLULAR zoom 0.3 / NOWHERE). The wall warp only perturbs the footprint test insidesample(), not the computedtopYorbotY— so the nicely-noised caps are untouched.
Runtime Environment
This is a Minecraft server plugin — there is no UI to script and no HTTP surface. Verification requires running the Minecraft server with the edited pack and inspecting a generated chunk that contains a floating island.
- Pack hot-reload: Iris supports
/iris studio close+/iris studio openor/iris reload <pack>on a live server; the user's workflow memory (project_iris_floating_debug.md) confirms this is the active testbed. - Deploy path: The pack is already under
[Minecraft Server]/consumers/plugin-consumers/shared-plugin-data/iris/packs/overworld/— editing the file in place is the deploy step (no build artifact to copy; perAGENTS.mdnever copy JARs into server plugin folders, but pack JSON edits are safe). - Health check / restart procedure: Run
/iris studio closein-game to close any open studio world, then/iris create <test-world> overworld(or re-open the existing studio world) so the floating child entries re-initialize. Teleport to a floating island column and visually inspect walls.
Assumptions
- Both
floatingChildBiomesentries are intended to benefit from wall warping — supported by the user's phrasing "the shards" (plural) and Q3 choice "Same warp for both". Task 1 depends on this. wallWarpStyle = SIMPLEX, zoom 0.25+wallWarpAmplitude = 10.0lands in the lower-medium range between the@Desclabels "4..8 = gentle" and "16+ = heavily meandering" onIrisFloatingChildBiomes.java:175. Task 1 depends on this.- Iris correctly serializes
wallWarpStyleinto anIrisGeneratorStyleon pack load. Supported byIrisFloatingChildBiomes.getWallWarpCng(...)reading it viagetWallWarpStyle()andFloatingIslandSample:221consuming the CNG (no reflection path or gated loader). Task 1 depends on this. - The generator does not cache island solidity in a way that would persist pre-change results —
FloatingIslandSampleusesCHUNK_MEMOThreadLocal which is cleared on each chunk build. Task 1 (verification step) depends on this; if stale chunks appear post-edit, regenerate or use a fresh world. - No other pack files reference
roughplainsvia snippet-inheritance that would also need edits. Supported by Grep offloatingChildBiomesreturning onlyroughplains.json. Task 1 depends on this.
Risks and Mitigations
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| JSON syntax error (missing comma, wrong quote) breaks pack load | Low | Medium — pack won't load until fixed | Validate with python3 -m json.tool <file> after edit; check Iris console for load errors on server restart |
| Amplitude 10 on the taller tropical/wilds shards (112 thick) still reads as too vertical | Medium | Low — purely aesthetic, follow-up tune | Document in "Deferred Ideas" the fallback of bumping tropical amplitude to ~14 or adding scale-aware per-entry tuning |
| Warp displaces thin edge columns entirely out of the footprint, shrinking island footprint noticeably | Medium | Low — this is the desired effect but could feel over-aggressive at the edges | Amplitude 10 is moderate; if islands feel too shrunken, reduce to 6-8 on follow-up |
| Enabling warp adds 2 extra 3D noise samples per Y layer inside islands — perf hit on pregen | Low | Low — bounded by island coverage × max thickness; CNG samples are cheap and already-cached | No action needed; if pregen CPS regresses (see project_iris_pregen_perf.md), revisit by disabling warp on one entry |
The two entries producing identical warp patterns at the same world XZ (because the warp seed mask 0xA117BA17E0FL is constant across entries) makes them look correlated |
Low | Very low — entries don't spatially overlap (picker noise chooses one per column) | Mention as a known-limitation in "Deferred Ideas"; if user ever wants decorrelated warp, add a per-entry seed salt. Not in scope. |
Goal Verification
Truths
wallWarpStyleandwallWarpAmplitudeare set on both entries offloatingChildBiomesinroughplains.json.- Both entries use identical warp config:
{"style":"SIMPLEX","zoom":0.25}and amplitude10.0. roughplains.jsonremains valid JSON (parses without error).- The placement of the two new keys is inside each floating entry object, adjacent to other wall/interior shaping fields (between
maxThicknessandcarveStyle). - No files under
Iris/core/are modified (enforced bygit diff --statshowing only the pack JSON changed, if the user is tracking the pack in git). - At runtime, a generated floating island in a roughplains region shows horizontal wall perturbation (bulge/recede) rather than a straight XZ extrusion of the 2D footprint. (Manual verification — see scenario MV-001 below.)
Artifacts
[Minecraft Server]/consumers/plugin-consumers/shared-plugin-data/iris/packs/overworld/biomes/temperate/roughplains.json— the editIris/core/src/main/java/art/arcane/iris/engine/object/IrisFloatingChildBiomes.java:170-176— schema source (read-only reference, not modified)Iris/core/src/main/java/art/arcane/iris/engine/object/FloatingIslandSample.java:220-254— consumer source (read-only reference, not modified)
Manual Verification Scenarios
No browser automation path exists for a Minecraft server plugin. Scenarios are documented for the user to run in-game.
MV-001: Wall warp visually active on roughplains floating islands
Priority: Critical
Preconditions: Test world generated (or fresh chunks loaded) using the overworld pack with the edited roughplains.json. Fly mode + /iris studio access.
Mapped Tasks: Task 1
| Step | Action | Expected Result |
|---|---|---|
| 1 | Restart the server (or /iris reload overworld) so the pack JSON is re-parsed |
Iris console logs pack load with no errors mentioning wallWarpStyle or IrisFloatingChildBiomes |
| 2 | Generate or teleport to a roughplains region (Y ≥ ~180 where floating islands live) | At least one floating island column visible |
| 3 | Fly around the side of a floating island shard | Side walls show horizontal bulges/recesses as Y changes — silhouette is NOT a perfect vertical extrusion of the top outline |
| 4 | Compare top surface with earlier screenshots/observations | Top biome surface (mushroom/forest or tropical/wilds) looks the same as before — tops unchanged |
| 5 | Compare bottom tail with earlier observations | Bottom tail (dripping/roots) looks the same as before — bottoms unchanged |
MV-002: Pack loads as valid JSON
Priority: Critical Preconditions: Edit applied. Mapped Tasks: Task 1
| Step | Action | Expected Result |
|---|---|---|
| 1 | Run python3 -m json.tool <pack-path> from shell |
Exits 0, no parse error |
| 2 | Grep the file for wallWarpStyle |
Returns exactly 2 matches (one per floating entry) |
| 3 | Grep the file for wallWarpAmplitude |
Returns exactly 2 matches |
Progress Tracking
- Task 1: Enable wall warp on both
floatingChildBiomesentries inroughplains.json
Total Tasks: 1 | Completed: 1 | Remaining: 0
Implementation Tasks
Task 1: Enable wall warp on both floating child biomes in roughplains.json
Objective: Add wallWarpStyle and wallWarpAmplitude to both entries of floatingChildBiomes in roughplains.json, identical values on both.
Dependencies: None
Mapped Scenarios: MV-001, MV-002
Files:
- Modify:
/Users/brianfopiano/Developer/RemoteGit/[Minecraft Server]/consumers/plugin-consumers/shared-plugin-data/iris/packs/overworld/biomes/temperate/roughplains.json
Key Decisions / Notes:
- Insert two keys in each entry, immediately after
"maxThickness": N,and before"carveStyle": { ... },. - Exact JSON to insert (indentation matches surrounding 4-space style — one leading space for the key position based on the file's existing alignment):
"wallWarpStyle": {
"style": "SIMPLEX",
"zoom": 0.25
},
"wallWarpAmplitude": 10.0,
- Do this on the
mushroom/forestentry (currently the block starting at line 255) AND on thetropical/wildsentry (starting at line 277). - Do NOT reorder any existing fields.
- Do NOT add
wallWarpStyleto the parent biome fields — it is per-entry onIrisFloatingChildBiomes, not onIrisBiome. - Preserve the existing (minor) indentation quirks in the file as-is; this is a targeted additive edit.
- No performance concern — the warp adds two noise samples per Y layer inside island columns only; CNG results are cached per-entry via
AtomicCacheinIrisFloatingChildBiomes.
Definition of Done:
- Both
floatingChildBiomesentries containwallWarpStyle: {"style":"SIMPLEX","zoom":0.25}andwallWarpAmplitude: 10.0. - Pre-edit sanity:
grep -rl 'floatingChildBiomes' /Users/brianfopiano/Developer/RemoteGit/[Minecraft\ Server]/consumers/plugin-consumers/shared-plugin-data/iris/packs/overworld/returns onlyroughplains.json(no other pack file needs the same edit). python3 -m json.tool <pack-path>exits 0 (valid JSON).grep -c 'wallWarpStyle' <pack-path>returns2.grep -c 'wallWarpAmplitude' <pack-path>returns2.- MV-001 passes end-to-end on a live test world: side walls of roughplains floating shards exhibit horizontal bulge/recession, while tops and bottoms look unchanged from prior observation.
- No files under
Iris/core/or any other plugin source tree are modified.
Verify:
# JSON validity
python3 -m json.tool /Users/brianfopiano/Developer/RemoteGit/[Minecraft\ Server]/consumers/plugin-consumers/shared-plugin-data/iris/packs/overworld/biomes/temperate/roughplains.json > /dev/null
# Field counts
grep -c 'wallWarpStyle' /Users/brianfopiano/Developer/RemoteGit/[Minecraft\ Server]/consumers/plugin-consumers/shared-plugin-data/iris/packs/overworld/biomes/temperate/roughplains.json
grep -c 'wallWarpAmplitude' /Users/brianfopiano/Developer/RemoteGit/[Minecraft\ Server]/consumers/plugin-consumers/shared-plugin-data/iris/packs/overworld/biomes/temperate/roughplains.json
Then MV-001 via manual in-game verification on the user's running test server.
Deferred Ideas
- Per-entry scale-aware tuning: If the tropical/wilds shards (112 thick) still read as too vertical compared to mushroom/forest (32 thick), bump tropical's
wallWarpAmplitudeto ~14 while leaving mushroom at 10. - Per-entry warp decorrelation: Both entries currently sample
wallWarpnoise from the same RNG mask (0xA117BA17E0FLinIrisFloatingChildBiomes:81). Entries never spatially overlap (the picker routes each column to exactly one), but if visually noticeable correlation ever appears where biomes are adjacent, add a per-entry seed salt. - Higher-fidelity warp (iq-style): Chain a second noise sample:
P' = P + A·n1(P); P'' = P' + B·n2(P');then sample footprint atP''. Only pursue if the single-pass warp is not expressive enough after Task 1 is tuned. - Vertical frequency scaling: Expose a
wallWarpVerticalScaleso the warp varies faster with Y than with XZ — would make adjacent Y slices more different, reducing any residual vertical banding without changing horizontal feature size. - Schema default flip: Changing
IrisFloatingChildBiomes.wallWarpStyledefault fromnullto a gentle SIMPLEX. Out of scope this plan; would silently change behavior for any existing pack.