diff --git a/docs/research/builds/lucent-tether-habitat.md b/docs/research/builds/lucent-tether-habitat.md index 713870b..76886bf 100644 --- a/docs/research/builds/lucent-tether-habitat.md +++ b/docs/research/builds/lucent-tether-habitat.md @@ -155,16 +155,17 @@ else: **Sunflower Utility Crest** The city disk is the disk-floret region. The external crest is the ray-floret -region: alternating solar panels and radiators, Perlin-warped and anchored -around the flat dome base, radiating sunward outside the glass rather than -inside the city volume. +region: alternating solar panels and radiators, Perlin-warped and hinged around +the flat dome base. These are Citadel-scale arms, large enough that a defensive +folded posture can reach toward the far media-eye end of the tether and dwarf +the dome itself. ```python for petal in range(34): center_a = TAU * petal / petals + 0.025 * pymath.sin(petal * 1.7) target_verts = solar_verts if petal % 2 == 0 else radiator_verts radius = 1.57 + outward_reach * smoothstep(t) - x = CITY_GROUND_X - 0.035 - sunward_cant * smoothstep(t) + x = CITY_GROUND_X + arm_length * smoothstep(t) ``` **Shader Graphs Are Geometry Evidence Too** diff --git a/examples/geometry_script/lucent_tether_habitat.py b/examples/geometry_script/lucent_tether_habitat.py index 5e93ece..0de4efd 100644 --- a/examples/geometry_script/lucent_tether_habitat.py +++ b/examples/geometry_script/lucent_tether_habitat.py @@ -266,14 +266,14 @@ def add_yz_disk(name, x, radius, material, segments=96): def add_dome_base_crest(mats): solar_verts, solar_faces = [], [] radiator_verts, radiator_faces = [], [] - petals = 34 - radial_steps = 5 + petals = 18 + radial_steps = 8 for petal in range(petals): center_a = TAU * petal / petals + 0.025 * pymath.sin(petal * 1.7) - width = TAU / petals * (0.82 + 0.36 * hash01(petal, 0, 251)) - outward_reach = 0.48 + 0.38 * fbm_2d(pymath.cos(center_a) * 2.1, pymath.sin(center_a) * 2.1, seed=177) - sunward_cant = 0.18 + 0.12 * hash01(petal, 9, 277) - twist = 0.08 * (hash01(petal, 4, 271) - 0.5) + width = TAU / petals * (0.72 + 0.24 * hash01(petal, 0, 251)) + outward_reach = 0.8 + 0.42 * fbm_2d(pymath.cos(center_a) * 2.1, pymath.sin(center_a) * 2.1, seed=177) + arm_length = (TETHER_END[0] - CITY_GROUND_X) * (0.88 + 0.08 * hash01(petal, 12, 277)) + twist = 0.18 * (hash01(petal, 4, 271) - 0.5) target_verts = solar_verts if petal % 2 == 0 else radiator_verts target_faces = solar_faces if petal % 2 == 0 else radiator_faces petal_base = len(target_verts) @@ -284,10 +284,11 @@ def add_dome_base_crest(mats): noise = fbm_2d(petal * 0.41, step * 0.73 + side, seed=303) - 0.5 local_width = width * (1.0 - 0.42 * smoothstep(t)) * edge + noise * 0.018 a = center_a + side * local_width * 0.5 + twist * t - radius = 1.57 + outward_reach * smoothstep(t) + 0.04 * noise - # Outside means sunward/outboard of the flattened dome base: - # negative X from the city ground plane, not inside the glass. - x = CITY_GROUND_X - 0.035 - sunward_cant * smoothstep(t) + radius = 1.62 + outward_reach * smoothstep(t) + 0.05 * noise + # External defensive arms stow by folding along the tether + # toward the far media-eye end; deployed they read as Citadel + # scale ray florets rather than petals glued to the dome. + x = CITY_GROUND_X + arm_length * smoothstep(t) y = radius * pymath.cos(a) z = radius * pymath.sin(a) target_verts.append((x, y, z)) diff --git a/experiments/generated/lucent_tether_habitat/lucent_city_bubble_aquarium.png b/experiments/generated/lucent_tether_habitat/lucent_city_bubble_aquarium.png index cee92d4..6a2b6f6 100644 Binary files a/experiments/generated/lucent_tether_habitat/lucent_city_bubble_aquarium.png and b/experiments/generated/lucent_tether_habitat/lucent_city_bubble_aquarium.png differ diff --git a/experiments/generated/lucent_tether_habitat/lucent_media_eye_lounge.png b/experiments/generated/lucent_tether_habitat/lucent_media_eye_lounge.png index 07e8861..36e6347 100644 Binary files a/experiments/generated/lucent_tether_habitat/lucent_media_eye_lounge.png and b/experiments/generated/lucent_tether_habitat/lucent_media_eye_lounge.png differ diff --git a/experiments/generated/lucent_tether_habitat/lucent_tether_habitat.blend b/experiments/generated/lucent_tether_habitat/lucent_tether_habitat.blend index ead0213..1367ff9 100644 Binary files a/experiments/generated/lucent_tether_habitat/lucent_tether_habitat.blend and b/experiments/generated/lucent_tether_habitat/lucent_tether_habitat.blend differ diff --git a/experiments/generated/lucent_tether_habitat/lucent_tether_overview.png b/experiments/generated/lucent_tether_habitat/lucent_tether_overview.png index 9dbcf3e..0ed2b6f 100644 Binary files a/experiments/generated/lucent_tether_habitat/lucent_tether_overview.png and b/experiments/generated/lucent_tether_habitat/lucent_tether_overview.png differ diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 2d8fc88..05f1071 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -50,7 +50,7 @@ From-scratch story-bound builds: attachment, an orthogonal spin-gravity city plane, a flat-cut dome base, radial/tangential streets, irregular parcels, prestige anchor towers, parks, faux-rural edge falloff, and an exterior sunflower-like crest of alternating - solar panels/radiators. + Citadel-scale solar panels/radiators. Build notes: `docs/research/builds/lucent-tether-habitat.md`; verifier: `tools/verify_lucent_tether_habitat.py`. diff --git a/state/evidence.jsonl b/state/evidence.jsonl index 18a3c78..692fbe8 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -47,3 +47,4 @@ {"ts": "2026-05-05T02:20:23+00:00", "type": "implementation", "status": "accepted", "note": "Replaced Lucent city-bubble grid with street-generation-inspired radial/tangential field roads, irregular annular parcel cells, anchor-plaza prestige skyscrapers, park voids, midcity blocks, and faux-rural cottagecore edge falloff; tether now visibly descends to the city ground-surface plaza."} {"ts": "2026-05-05T03:01:59+00:00", "type": "implementation", "status": "accepted", "note": "Corrected Lucent dome city coordinate frame: ground is now a YZ disk orthogonal to the tether/spin axis, buildings extrude along +X, dome is boolean-cut flat at the base, city fills to the rim, and a Perlin-edged sunflower ray-floret crest rises from the base partway up the dome."} {"ts": "2026-05-05T03:16:04+00:00", "type": "implementation", "status": "accepted", "note": "Moved Lucent sunflower ray florets outside the dome: alternating solar panel and radiator meshes now radiate sunward from the flat base rim, with verifier checks that their geometry remains outside the dome cut."} +{"ts": "2026-05-05T03:31:22+00:00", "type": "implementation", "status": "accepted", "note": "Scaled Lucent external ray florets to Citadel-like utility arms: alternating solar/radiator panels now dwarf the dome and span far along the tether, so a folded defensive posture can plausibly reach toward the media-eye end."} diff --git a/state/map.yaml b/state/map.yaml index 66a2cab..c0e940c 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -101,7 +101,7 @@ data_flow: - If state grows faster than understanding, cut it back. current_status: - summary: VibeGeometry has verified Geometry Script translations for local samples, official Blender demos, and IRCSS French Houses footholds, plus from-scratch Aetheria Bloom and Lucent tether habitat builds. Durable lessons now driving the pipeline: Python orchestrates intent and batching; Geometry Script emits inspectable node groups; source-bound scenes need explicit coordinate contracts before ornament; spin-gravity habitats need ground planes orthogonal to their tether/rotation axis; utility petals, radiators, and solar arrays belong outside pressure glass; large habitat parts need visible load paths across coordinate frames; organic city maps need street fields, irregular parcels, parks, and land-use gradients rather than grids; dense detail must be batched; institutional spaces should model power as surfaces, rails, overlays, thresholds, shader behavior, and camera evidence; and visual acceptance needs domain-facing inspection renders plus verifier checks, not only overview renders. The first reusable `vibegeometry/` helper library now carries coordinate frames, fields, batching, Blender scene primitives, and verifier helpers used by the Bloom and Lucent builds. Known graph-tooling blockers remain repeat-zone feedback, repeat Top outputs, foreach zones, and gizmo nodes. + summary: VibeGeometry has verified Geometry Script translations for local samples, official Blender demos, and IRCSS French Houses footholds, plus from-scratch Aetheria Bloom and Lucent tether habitat builds. Durable lessons now driving the pipeline: Python orchestrates intent and batching; Geometry Script emits inspectable node groups; source-bound scenes need explicit coordinate contracts before ornament; spin-gravity habitats need ground planes orthogonal to their tether/rotation axis; utility petals, radiators, and solar arrays belong outside pressure glass and may need Citadel-scale presence; large habitat parts need visible load paths across coordinate frames; organic city maps need street fields, irregular parcels, parks, and land-use gradients rather than grids; dense detail must be batched; institutional spaces should model power as surfaces, rails, overlays, thresholds, shader behavior, and camera evidence; and visual acceptance needs domain-facing inspection renders plus verifier checks, not only overview renders. The first reusable `vibegeometry/` helper library now carries coordinate frames, fields, batching, Blender scene primitives, and verifier helpers used by the Bloom and Lucent builds. Known graph-tooling blockers remain repeat-zone feedback, repeat Top outputs, foreach zones, and gizmo nodes. next_action: Extract the first higher-level reusable builder seam from the completed story-bound builds: either threshold/control-rail interface kits from the Lucent habitat or endcap terrace/spiral artery kits from the Bloom, then bind that seam to scene-brief, manifest, inspection-render, and verifier contract drafts. remotes: vibegeometry: https://github.com/GameCult/VibeGeometry diff --git a/tools/verify_lucent_tether_habitat.py b/tools/verify_lucent_tether_habitat.py index bd4a7cf..882674a 100644 --- a/tools/verify_lucent_tether_habitat.py +++ b/tools/verify_lucent_tether_habitat.py @@ -103,11 +103,13 @@ def verify_city_coordinate_contract(): raise AssertionError("City ground surface should be orthogonal to tether with minimal X depth") if solar.location.x > 0.001 or radiator.location.x > 0.001: raise AssertionError("Ray florets should use object-space geometry, not hidden object offsets") - if max(vertex.co.x for vertex in solar.data.vertices) >= -5.45: - raise AssertionError("Solar ray florets should sit outside the dome base, sunward of the flat cut") - if max(vertex.co.x for vertex in radiator.data.vertices) >= -5.45: - raise AssertionError("Radiator ray florets should sit outside the dome base, sunward of the flat cut") - if solar.dimensions.y < 3.4 or solar.dimensions.z < 3.4 or radiator.dimensions.y < 3.4 or radiator.dimensions.z < 3.4: + solar_min_x = min(vertex.co.x for vertex in solar.data.vertices) + radiator_min_x = min(vertex.co.x for vertex in radiator.data.vertices) + if solar_min_x < -5.46 or radiator_min_x < -5.46: + raise AssertionError("Ray florets should hinge at the flat dome base, not behind it") + if solar.dimensions.x < 10.5 or radiator.dimensions.x < 10.5: + raise AssertionError("Ray florets should be Citadel-scale arms long enough to fold toward the far tether end") + if solar.dimensions.y < 4.2 or solar.dimensions.z < 4.2 or radiator.dimensions.y < 4.2 or radiator.dimensions.z < 4.2: raise AssertionError("Alternating solar/radiator ray florets should wrap around most of the dome rim")