Scale Lucent ray florets to Citadel arms

This commit is contained in:
Meta Vens 2026-05-05 04:32:10 +01:00
commit 774b5851de
10 changed files with 26 additions and 21 deletions

View file

@ -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**

View file

@ -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))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 767 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 993 KiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Before After
Before After

View file

@ -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`.

View file

@ -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."}

View file

@ -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

View file

@ -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")