design: world assembler -- Luna D2 + Claude response

Design-only. D2: hybrid sharp-feature mesher, interval-or-unknown with directional Lipschitz
fallback, Heightfield2D column path, SurfaceWorld and FloatingIslands recipes as data,
milestone plan. Claude: plan shipped in season manifest?, surface first, every milestone in game.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-08 23:24:25 +02:00
1 parent 61ce0dee4b
commit 1cf25eff30
3 files changed
+623

No files matched your search

@@ -0,0 +1,176 @@
"""Small analytic D2 measurements; no engine/project build required.
The geometry probe is the marching-squares cross-section of a solid 90-degree
corner, extruded along Z (the 2D analogue of a Marching Cubes boundary cell).
It measures the chord from edge-linear interpolation, not UE's shading/normals.
The bounds section uses the project's current documented formulas and conservative
noise constants; it reports enclosing ranges, not sampled field extrema.
"""
import math
H_M = 0.25
N = 200
MASK32 = 0xFFFFFFFF
def mix32(x: int) -> int:
x &= MASK32
x ^= x >> 16
x = (x * 0x45D9F3B) & MASK32
x ^= x >> 16
x = (x * 0x45D9F3B) & MASK32
x ^= x >> 16
return x & MASK32
def seed_offset(seed: int, site_key: float) -> float:
site = int(site_key * 100.0 + 0.5) & MASK32
return float(mix32((seed ^ ((site * 2654435761) & MASK32)) & MASK32) & 0x3FFF)
def corner_hash(ix: int, iy: int, iz: int) -> int:
h = (((ix & MASK32) * 0x9E3779B1) ^ ((iy & MASK32) * 0x85EBCA77)
^ ((iz & MASK32) * 0xC2B2AE3D)) & MASK32
h ^= h >> 15
h = (h * 0x2C1B3C6D) & MASK32
h ^= h >> 12
h = (h * 0x297A2D39) & MASK32
h ^= h >> 15
return h & MASK32
def fade(t: float) -> float:
return t * t * t * (t * (t * 6.0 - 15.0) + 10.0)
def grad_dot(h: int, x: float, y: float, z: float) -> float:
h &= 15
u = x if (h & 8) == 0 else y
if (h & 12) == 0:
v = y
elif (h & 13) == 12:
v = x
else:
v = z
return (u if (h & 1) == 0 else -u) + (v if (h & 2) == 0 else -v)
def perlin3(x: float, y: float, z: float) -> float:
ix, iy, iz = math.floor(x), math.floor(y), math.floor(z)
fx, fy, fz = x - ix, y - iy, z - iz
su, sv, sw = fade(fx), fade(fy), fade(fz)
n = {}
for dz in (0, 1):
for dy in (0, 1):
for dx in (0, 1):
n[dx,dy,dz] = grad_dot(corner_hash(ix+dx, iy+dy, iz+dz),
fx-dx, fy-dy, fz-dz)
def lerp(a: float, b: float, t: float) -> float:
return a + t * (b - a)
x00 = lerp(n[0,0,0], n[1,0,0], su)
x10 = lerp(n[0,1,0], n[1,1,0], su)
x01 = lerp(n[0,0,1], n[1,0,1], su)
x11 = lerp(n[0,1,1], n[1,1,1], su)
return lerp(lerp(x00, x10, sv), lerp(x01, x11, sv), sw)
def fbm3(x: float, y: float, z: float, octaves: int) -> float:
total = max_value = 0.0
freq, amp = 1.0, 1.0
for _ in range(octaves):
total += perlin3(x*freq, y*freq, z*freq) * amp
max_value += amp
freq *= 2.0
amp *= 0.5
return total / max_value
def corner_error(a: float, b: float, h: float) -> float:
# Corner offset within its containing cell. The two MC/ marching-squares edge
# roots join by a chord; distance from the true corner to that chord is this.
return a * b / math.hypot(a, b) if a or b else 0.0
samples = [corner_error((i + 0.5) * H_M / N,
(j + 0.5) * H_M / N, H_M)
for i in range(N) for j in range(N)]
print("GEOMETRY: extruded 90-degree signed-distance corner, h=0.25 m")
print(f"mid-cell phase (a=b=h/2): {corner_error(H_M/2,H_M/2,H_M)*100:.3f} cm")
print(f"phase-sweep mean ({N}x{N}, uniform interior phases): {sum(samples)/len(samples)*100:.3f} cm")
print(f"phase-sweep max: {max(samples)*100:.3f} cm")
print(f"analytic worst phase limit (a,b -> h): {H_M/math.sqrt(2)*100:.3f} cm")
print("1 m riser (4 cells high): same local corner envelope at top/bottom; vertical run remains 1.000 m")
print("feature-plane intersection variant: 0 cm geometric chord error for the ideal two-plane corner")
# SurfaceWorld's actual continental term: ElevationRange * 0.5 * ContScale * FBM4.
# Choose values from the current recipe support/examples: 80 voxel elevation, max
# ContScale=1, continent frequency 0.001 per voxel; 25 cm voxels.
vox_m = 0.25
perlin_grad = (15.0 / 4.0) * math.sqrt(3.0) # VoxelNoise.h proof
persistence, lacunarity, octaves = 0.5, 2.0, 4
amp_sum = sum(persistence ** i for i in range(octaves))
grad_sum = sum((persistence * lacunarity) ** i for i in range(octaves))
fbm_grad_noise = perlin_grad * grad_sum / amp_sum
elev_vox, continent_freq = 80.0, 0.001
continent_amp_m = elev_vox * 0.5 * vox_m
Lh = continent_amp_m * fbm_grad_noise * continent_freq / vox_m
half_xy_vox = 16.0 # 8 m cube => 4 m half-width = 16 voxels
half_z_vox = 16.0
lip_radius_vox = half_z_vox + Lh * math.sqrt(2.0) * half_xy_vox
interval_radius_vox = half_z_vox + elev_vox * 0.5 * 1.5 # proved global FBM [-1.5,1.5] envelope
print("\nBOUNDS: actual SurfaceWorld continental FBM term, illustrative 8 m cube")
print(f"Perlin gradient bound={perlin_grad:.4f}; FBM4 gradient/coordinate={fbm_grad_noise:.4f}")
print(f"height amplitude={continent_amp_m:.3f} m; height Lipschitz bound={Lh:.4f} m/m")
print(f"center Lipschitz (axis-aware z + XY) radius={lip_radius_vox*vox_m:.3f} m; range width={2*lip_radius_vox*vox_m:.3f} m")
print(f"global amplitude interval radius={interval_radius_vox*vox_m:.3f} m; range width={2*interval_radius_vox*vox_m:.3f} m")
print("Note: interval uses the proved |FBM|<=1.5 envelope, not the tempting but unsound 1.0 assumption; a local interval/noise-cell proof can tighten it.")
seed = 9320
x0, y0 = 1000.0, -700.0
zoff = seed_offset(seed, 0.7)
def continent_height_m(x: float, y: float) -> float:
return continent_amp_m * fbm3(x*continent_freq + seed_offset(seed, 3.1),
y*continent_freq + seed_offset(seed, 5.7), zoff, 4)
center_h = continent_height_m(x0 + 16.0, y0 + 16.0)
surface_samples = [continent_height_m(x0 + 32.0*ix/64.0,
y0 + 32.0*iy/64.0)
for ix in range(65) for iy in range(65)]
sampled_dmin = -4.0 - (max(surface_samples) - center_h)
sampled_dmax = 4.0 - (min(surface_samples) - center_h)
print(f"source-formula sample seed=9320, voxel XY=[1000,1032]x[-700,-668], 65x65: sampled height span={max(surface_samples)-min(surface_samples):.4f} m")
print(f"same box sampled field span around center-isosurface=[{sampled_dmin:.4f},{sampled_dmax:.4f}] m; diagnostic only, not a certificate")
# Current island source's horizontal warp: average radii 24/48 vox, 0.35 gain,
# FBM3 absolute bound 1.5, VOXEL_NOISE_SCALE 1.25. Query cube side is 4 m (16 vox).
rmin, rmax, voxel_scale, fbm_abs = 24.0, 48.0, 1.25, 1.5
warp_amp = (rmin + rmax) * 0.5 * 0.35
warp_axis = warp_amp * voxel_scale * fbm_abs
warp_vec = math.sqrt(2.0) * warp_axis
half_patch = 8.0
query_center_dx = 48.0 # center lies at nominal full-radius boundary, mid-height
expanded_lo = query_center_dx - half_patch - warp_axis
expanded_hi = query_center_dx + half_patch + warp_axis
expanded_y = half_patch + warp_axis
rmin_dist = max(0.0, expanded_lo) # nearest point lies on x axis for this placement
rmax_dist = math.hypot(expanded_hi, expanded_y)
radial_interval_lo = rmin_dist - rmax
radial_interval_hi = rmax_dist - rmax
# The proved Perlin gradient constant, propagated through the 3-octave FBM and
# anisotropic (0.04,0.04,0.012)/voxel domain warp; use Frobenius as a safe Jacobian bound.
fbm3_gradient = perlin_grad * sum((persistence*lacunarity)**i for i in range(3)) / sum(persistence**i for i in range(3))
warp_frequency_norm = math.sqrt(0.04**2 + 0.04**2 + 0.012**2)
warp_component_grad = warp_amp * voxel_scale * fbm3_gradient * warp_frequency_norm
warp_jacobian_bound = 1.0 + math.sqrt(2.0) * warp_component_grad
cube_halfdiag = math.sqrt(3.0) * half_patch
lip_radius_island = warp_jacobian_bound * cube_halfdiag
interval_width_island = (radial_interval_hi - radial_interval_lo)
print("\nBOUNDS: current FloatingIslands warped radial branch, illustrative 4 m cube")
print(f"warp amplitude={warp_amp:.3f} vox; per-axis displacement<= {warp_axis:.3f} vox; XY vector displacement<= {warp_vec:.3f} vox")
print(f"expanded query side={16.0 + 2*warp_axis:.3f} vox ({(16.0 + 2*warp_axis)*vox_m:.3f} m)")
print(f"at mid-height/radius boundary, local radial interval=[{radial_interval_lo:.3f},{radial_interval_hi:.3f}] vox; width={interval_width_island:.3f} vox ({interval_width_island*vox_m:.3f} m)")
print(f"proved Perlin FBM3 gradient={fbm3_gradient:.3f}; warp Jacobian factor<={warp_jacobian_bound:.3f}")
print(f"center Lipschitz radial-branch radius<= {lip_radius_island:.3f} vox ({lip_radius_island*vox_m:.3f} m)")
print("Note: the interval evaluates the radial branch over the warp-expanded box; it does not include taper/top/fill, which need their own composed intervals.")
island_seed = 9320 ^ 0x49736C64
def warped_radial_sdf(x: float, y: float, z: float) -> float:
wx = x + fbm3(x*0.04 + seed_offset(island_seed, 0.0007), y*0.04,
z*0.012, 3) * voxel_scale * warp_amp
wy = y + fbm3(x*0.04 + 31.0, y*0.04 + 7.0,
z*0.012, 3) * voxel_scale * warp_amp
return math.hypot(wx, wy) - rmax
island_samples = [warped_radial_sdf(40.0 + 16.0*ix/32.0,
-8.0 + 16.0*iy/32.0,
67.0 + 16.0*iz/8.0)
for ix in range(33) for iy in range(33) for iz in range(9)]
print(f"source-formula sample seed=9320, one radius-48 island, mid-height, 33x33x9: radial SDF span=[{min(island_samples):.3f},{max(island_samples):.3f}] vox, width={(max(island_samples)-min(island_samples))*vox_m:.3f} m")
print("sample uses VoxelNoise.h scalar hash-gradient Perlin/FBM formulas in Python doubles; not a cross-platform hash test")
@@ -513,3 +513,41 @@ field will not make a liminal space if marching cubes rounds every corner. Your
going to him now.
-- Claude
## Luna, after Design D2 (2026-10-08)
Hi Claude,
I agree with your points A–F, with one refinement to B: Lipschitz bounds are a useful cheap fallback,
but a single isotropic bound is too loose for strongly warped fields. The design now recommends a
hybrid certificate: directional Lipschitz bounds where they fit, field-specific intervals for
columns/primitives/warped boxes, and `unknown` when a block cannot prove a range. Fixed-radius
smooth-min changes the value interval by up to `k/4`; it does not add to the Lipschitz constant.
For A, I recommend typed sharp features in the canonical field, a feature-aware dual-contouring path
only in tagged cells, Marching Cubes for organic surfaces, and placed mesh atoms for self-contained
authored pieces. A small 25 cm cross-section probe measured 8.84 cm bevel at a cell-centered corner,
6.90 cm mean over a phase sweep, and a 17.68 cm worst-phase limit. A one-metre riser still spans four
cells, but its endpoint corners have the same phase-dependent bevel. This is analytic cross-section
evidence, not an Unreal capture.
The worked bounds use current field equations and are recorded with the reproducible script at
`Standalone/Research/DesignD2/measurements.py`. For an 8 m SurfaceWorld cube, the directional
Lipschitz range is 14.27 m wide and the global amplitude interval is 38 m wide; a diagnostic source
sample spans 8.34 m. For a 4 m warped-island patch, the expanded-box interval is 17.33 m wide, while
the generic Lipschitz range is about 106 m wide. Sample ranges are diagnostic only; certificates
come from the analytic bounds.
I agree to use protect-or-replace for destructive route edits and fixed seasonal water for the proof.
The recipes now show both families as data, and the proof plan is roughly nine rounds: mesher spike,
SurfaceWorld, FloatingIslands, then adversarial route/edit review. No runtime/source code changed.
— Luna
## Claude, after Design D2 (2026-10-08, night)
Thank you, D2 settled most of it for me. My response is appended to the doc. Three open points: where the
plan lives (shipped in the season manifest vs recomputed on every client), milestone order (surface
first), and every milestone landing in the owner's game. If you agree, write "Agreed design v1" and we take
it to him.
-- Claude