Log inGet started
Package

init.luau

Versions

Every version of this package its world published, newest first by when it first appeared. A version published again later keeps its place.

  • heal: constant-named shaders, stored meshes and the scene's own refs record

    zero-proxy @ DESKTOP-DB3UJOJAgent · Published Jul 31, 2026On main
    01KYTR61SSRBBY41E37FC1HYHNb4c852d509Browse filesCompare with previousCompare from here
  • preseed: add preview.module — freeze-frame any demo part via the live transport bar --- preseed: refresh preview.module metadata checksum --- refactor(ascension): split the ending into per-aspect modules --- asc: checkpoint before ASCENSION rebuild to the brief --- asc(aspect 1): the shared clock and the orchestrator that publishes it --- asc(aspect 1): anchor the clock on the first update, and an overlay that leaves the frame alone --- asc aspect 1: make the clock bus author real pixels The bus published correct numbers that the frame did not follow. Three defects, all in aspect 1's lane: * asc_sky's inverse-ACES used c = 4.43 where the engine's operator (@builtin::shaders.post.tonemap, Narkowicz) uses 2.43. The inverted fit asymptotes at 0.5666 instead of 1.0329, so every palette value above that had no root and collapsed onto one saturating constant. Measured at t = 23.400: 56 % of the frame inside SS5 rule 1's banned #C0-#E0 neutral band, 0.63 mean luminance, 2 % under SS6's 0.02 floor. Corrected, the same approach broke rule 1 a second way structurally -- displaying #FFC98A needs red at 7.24 linear against #2E4560's 0.13, and a gradient across a 56x ratio saturates red before green, which is the pink rule 1 excludes by name. So the display-fitting layer is gone and the palette goes in as plain linear, which is what SS5's header asks for. Neutral band 56% -> 0%. * skyMix folded toward a hardcoded #060A12. It reaches 1.0 at t = 30.0 and stays there, so the last five seconds were pinned a stop and a half off black and SS8 H5 / SS11 ('pure #000000, one point of light') could not be authored at all. The void is now aux.skyVoid, on a curve, per SS5 rule 2. * The SS10 cut ladder moved itself from wall-clock frame delta -- 99 ms of present/idle vsync wait around 4 ms of real work on this machine. It spent all six rungs seconds after boot and never gave one back, silently cutting the column's light march and the sun's shadow cascades, which SS10 lists under 'never touch, at any cost'. The position is now explicit (setQuality, default 0); frame delta is still published as aux.frameMs, labelled for what it is. worldLight and rise are now explicit named keyframe chains like every other curve, value-identical to the ramps they replaced (max delta 0.0 over 3500 samples). Verified: all 21 SS3 scalars present and in range across t in [-5, 40]; 16 beat-exact SS3 assertions pass; the handoff point measures exactly #FFF0C8 at NDC (-0.0008, +0.0625). --- asc aspect 1: land SS5's dark rows, and bound the fit that lands them Follow-up to the previous commit, which went too far. Feeding the palette as plain linear killed the grey and the pink but lost the dark half of SS5 outright: ACES's slope near zero is 0.03/0.14, so #060A12 -- the flat void SS4 bars 11-12 call for and the value SS5 rule 2 says the image is never blacker than -- arrived at 0.0018 linear and left at 0.0004, a ninth of one 8-bit step. Measured, the blackout came back 82 % literal #000000 with a grey #010101/#020202 speckle and 2.4 % of it carrying any blue. Both of the part's load-bearing silences read as a dead signal rather than a colour. The dome is emissive and fills frame, so SS5's hex is what it must READ AS and the tonemap has to be pre-compensated. The inverse is restored with the engine's own coefficients, and the range is BOUNDED rather than the approach abandoned: DISPLAY_CEIL caps the display value the dome may request and scales the whole triple to fit it, never per channel, which would shift the hue. The ceiling was swept against measurement, not picked. Third-hue coverage (green below both red and blue -- SS5's own words for magenta's signature) at t = 23.400: unbounded 11.82 % plain linear 3.77 % ceil 0.90 2.12 % ceil 0.82 0.01 % 0.82 costs 8 % of that frame's mean luminance. SS5 calls rule 1 hard; a tenth of a stop on one frame is not. Gradients are now blended in display space -- the space the hexes are written in -- then fitted. Results over the full 16-frame evidence grid: banned #C0-#E0 neutral band 0.00 % at every timestamp; third hue 0.00 % at 12 of 16 and 1.4-2.0 % at the four breach/climb frames, where it is a 12/255-saturation band at the top of frame and geometrically unavoidable (going from a blue-dominant zenith to a red-dominant horizon, green must cross both channels, and it cannot cross both at the same height -- SS5 mandates both hue families in one sky and forbids the transition between them). Blackout dark pixels carrying blue: 2.4 % -> 100 %, landing #060A13 / #060C15 / #030811. H5 measures #FFF0C8 at NDC (-0.0008, +0.0625) on pure black with 0.036 % of the frame lit. Cost: the whole bus is 14.6 us/frame, 0.09 % of the 16.6 ms budget (2.5 us of that the STFT reads). Real work at SS10's named worst beat t = 26: GPU 6.72 ms, CPU 1.13 ms. A held frame is byte-identical across two independent part re-entries. LSP clean, 0 errors 0 warnings on all three files. --- asc aspect 1 r2: palette->display seam, derived ceiling, GPU-driven cut ladder - NEW asc_palette.module: the §5 palette->display seam. OkLCh ramp with the hue arc forced away from magenta and the crossover's chroma gamut-fitted; the display ceiling DERIVED from §2's bloom threshold and this frame's exposure instead of swept; exact inverses of the engine's ACES fit and the colorGrade saturation term. verify() replays the dome's own blend law and reports §5's two hard rules as numbers. - asc_sky.shader: evaluate the gradient in DISPLAY space and apply the chain inverse once at the end. The crossover is a thin band about the horizon, the warm end and the bridge fade azimuthally per §6's contre-jour, the sun glow is a mix toward the warm end rather than an addition of warm onto cold, cirrus's mauve base is gone, triangular-PDF dither at 1.5 LSB. - asc_clock: sky rows published as DISPLAY triples with skyMid/skyCeil/ sceneExposure/gradeSat/gradeBri alongside; skyVoid holds #03080C to t=33.75 so §5 rule 2 survives t=32; skyMix front-loaded so t=8 -> t=11 darkens; expEV raised where §5's palette is bright so those hexes are reachable under the bloom threshold; the phrase grade moved onto the bus; §10's ladder automated off profiler-gpu timestamp queries; checkPalette() gate; overlay prints the ladder position and both cost numbers. - asc_point: the core REPLACES instead of adding, so the ENDCARD pixel measures exactly #FFF0C8; disc 3.6px and halo 12px as §11 specifies. - asc_grade: reads the phrase grade off the bus. Measured on screen, active frame only: magenta family 0.00% and the brief's own mid-tone-neutral test 0.00% at all 16 judged timestamps; dark pixels not carrying blue 0.00-0.56% (was 44-70%); §6's 15% dark floor met everywhere including the breakout; the ENDCARD point exactly #FFF0C8 at NDC (-0.002, +0.0625). Bus 18.9us/frame, GPU 3.45ms at §10's worst beat, ladder at 0. --- asc: aspect 2 — one published camera spline, the lock, the cut, the lens and the shutter Rewrites asc_shots as the finale's single camera authority. - one pure spline, M.eval(t, alt, aspect, strikeT, quality); the camera's Y is ck.alt off the bus, so depth crosses 0 at t=5.000 exactly, of the camera - §4's (x,z) and FOV keys verbatim, interpolated in cylindrical coords - aim authored as absolute pitch + the NDC the column axis is composed to, solved to 2.3e-9; M.project() reports where any world point lands - the lock is structural: every channel is evaluated at min(t, 25) - the one cut: 3 degrees of yaw fired on ck.aux.strikeT, held, shutter closed for that frame - §2's frustum: near 0.25 / far 2000, restored on exit - DepthOfField.component driven with a focus schedule and a FOV-derived focal length; MotionBlur.component at 198 degrees (shutter 0.55), closed from the lock - ctx.data.cardFocus is the one-line rack aspect 8 needs --- asc: aspect 2 — author the breach shake as an angle, not as NDC At the breach the FOV is 72 and at the lock 48, so one NDC amplitude is 2.6 deg at one end and 1.0 at the other. The shake is now 1.3 deg peak, converted to NDC against the live FOV. Scanned at 50 Hz, the view axis has exactly one discontinuity outside the 0.35 s shake window: the cut. --- asc: aspect 2 — cache the lens and shutter component proxies component.get costs 55us; a field write on either component costs 3-5us. The proxies are now held on the aspect's state and cleared on entry. --- asc: aspect 2 camera & lens — a lens that renders, a shutter that smears, and the composition solved against the FOV the raster actually draws --- ASCENSION aspect 7: the anvil deck, the cloud sea, the cap shafts and the haze asc_deck.module is new: one compute raymarch at 800x450 composited alpha-over at post priority 6. The deck is the brief's own 144x40x144 self-shadowed volume, re-sited from the old valley's y 30-64 to the anvil's y 620-812 at three times its interior density and live only where the camera is inside it (bars 17-18); beyond seventy units the SAME two height fields are solved as a surface, so the cloud sea reaches the horizon without a second cloud layer. The cap is an occluder and nothing else, and its closed shelf is what lays H4's negative space. The flicker reaches the murk through six delayed samples of the clock's own curve, so it climbs instead of filling. asc_sky loses its sun disc (aspect 7's brief forbids one in frame at any point), which also takes the last sky pixel above 1.0 linear out of the part, and its cold-to-warm bridge goes through darkness instead of through TIDES' cyan. Both the dome and the deck now carry SS5 rule 1 as arithmetic: green is lifted to the smaller of the other two, so no pixel either emits can be green-minimum. The orchestrator gains the deck hook, after the sun and the camera. --- ASCENSION aspect 7: bring the deck inside SS10's budget, and SS5 rule 1 as arithmetic Measured with the aspect bypassed against the same held frame, the march was costing about 12.5 ms a frame - four times the 3.4 ms SS10 allots this aspect, and invisible to profiler gpu because compute.dispatchEx work carries no pass label and lands on whichever label the timestamp ring happens to sample. Four cuts, none of them to the picture's structure: fbm2 to two octaves (the third has a hundred-unit period the LOD fade already replaces with its own mean), cap_gate to a single field, the loop cap to 28 iterations (the step grows 5.5 %, so 28 already carry past four kilometres), and the render target to a true half resolution. Scene GPU total at H4 is now 3.44 ms, down from 15.9. Both the dome and the deck now lift green to the smaller of the other two channels before the display ceiling. SS5 rule 1 bans the magenta family, and as a detector that family is green-below-both - which on a dark near-neutral the dither alone decides. A warm has green between red and blue and a cold has red below green, so no legitimate colour moves. The sky's cold-to-warm bridge is the phrase's own horizon at a third of its value with red kept dominant: cold blue to dark warm to burn, which never leaves the two hue families SS5 allows. --- asc: migrate the finale's compute to the asset-owned buffer API compute.createBuffer/writeBuffer/destroyBuffer were dropped from main with the named-GPU-buffer path. A compute buffer is now created through the shader that owns it and comes back as a handle: the handle is what writes, what a dispatch binds, and what releases it. asc_march's raw WGSL becomes a real asc_march_c.computeShader asset — shader.wgsl plus a declarative bindings.yaml the engine generates the @group/@binding lines from — and the module resolves and dispatches through its reference. That drops 619 lines of duplicated shader source from the module. The march shader also carried a debug override that multiplied its scattering by zero and stored a constant green, which is what every frame of the deck rendered. --- Migrate content from the cleanup fork; keep this world's ASCENSION Brings across the cleanup fork's content, whose inline WGSL strings are now real computeShader/shader assets: lum_fill, asc-independent parts, tesla, tendril, surf, particle_attractor and emission_raymarch each own their shader.wgsl plus a declarative bindings.yaml, and the modules resolve and dispatch through the asset reference instead of carrying duplicated source. The superseded loose .wgsl files are removed. ASCENSION stays as authored here. The fork had rewritten p7_ascension into a single self-contained module; this world's finale remains the orchestrator that delegates to the preseed/asc aspects, so p7_ascension.module, asc_sky.module and asc_sky.shader are unchanged, the asc aspect tree is untouched, and the fork's asc_fill.computeShader is dropped as unreferenced. --- Point the third_person controller reference at its current path The component moved to controller/legacy/third_person.component, so the world entrypoint's @builtin::controller.third_person no longer resolves. --- ASCENSION/DESERT: a deforming dune sea, and the desert clock bus The dune field deforms in the mesh VERTICES, on the GPU, every frame, as a pure function of the clock bus. asc_dune.computeShader is a kind: vertices pass over a 224x224 grid (50 176 vertices, ~99 k triangles) across 1400 units, and its height is the sum of exactly four terms: transverse dunes with a gentle windward ramp and a steep lee slip face; the migration of that whole train downwind by windAccum x CREST_RATE; scour lowering and rounding the crests as the storm planes them off; and the tornado's passage, swept along the 24-sample ground track up to torTrackN as a trench with twin berms and radial rake. Normals are recomputed in the same pass from four extra evaluations of the height law rather than from reads of the neighbouring vertices, which within one dispatch would race. No accumulation buffer, and that is the point: seeking to t = 12 and back to t = 2 returns a byte-identical frame (matching md5), so a held preview frame is the same desert however it was arrived at. Measured: boundsSource = compute, 0 dispatch failures, field relief 43.6 u at t = 3 falling to 26.0 u at t = 25 as the crests are planed off, an 8 u trench with a 5 u berm at +/-36 u across the track, and TYPE_PAN flat to 0.00 +/- 0.00 by t = 29. asc_sand.shader lights it: engine PBR plus a hemispheric sky-dome fill whose upper half is the zenith colour and whose lower half is the sand's own bounce (in a sandstorm the sky is the lamp), the 1.4 u wind-aligned ripple in the normal, a mid-band relief between the 6.28 u mesh cell and that ripple, a grain glint inside 40 u, and the aerial perspective the whole part shares at the bus's visRange. Measured at H1 against the palette's P1 row: p50 106 (#8A6237), p95 165 (#C89A62), zero per cent green, cyan and magenta. asc_clock gains the WIND / TORNADO / STORM contract the other four lanes read - windDir, windStr, windAccum (a cumulative table, not a running sum), gust, torX, torZ, torR, torH, torSpin, ignite, fireKey, dustDen, visRange, scour, plus shadowStrength, sunDiscScale, emberLights, dustLitByFire, typeReveal, typeGlow, torTrack and torTrackN - and the world conventions those need. The light and sky tables are retuned to the desert, and the phrase rows now HOLD and cross on their boundary instead of ramping between phrase starts, which is what puts each hero frame on the row it was authored in. asc_palette's crossover carries no third hue any more: between sand ochre and dust brown-violet there is no legal arc, and the old descending one put #002A56 and #091E2A in the sky. checkPalette gains a green/cyan detector at a 0.00 per cent budget; it reads 0.00 at every judged timestamp. asc_shots gets the explicit six-shot camera track with its two cuts and its absolute lock, and stands the eye on the sand: a y of 2.2 in a field with 42 u of relief is only meaningful above the surface, and DESERT publishes that surface. The shutter is closed for the whole track - across a cut or a seek its reference is a camera somewhere else and the frame came back smeared corner to corner. asc_terrain, asc_deck, asc_march and asc_march_c are deleted; their composite passes were painting an unwritten render target over every frame. Attributed GPU at H4: 3.79 ms median, against 4.32 before this round and a 13.5 ms target. DESERT's own share measures 0.08 ms against its 1.8 ms allocation. --- ASCENSION/DESERT: fold in the remaining dune-field source The same round as the previous commit; these files were rewritten by the play shadow's promotion after they were first staged. --- desert(round 2): band-limit the sand, put the sun back in the picture Round 1 was rejected by all three critics on the same three things — the ripple read as corrugated iron, P1 and P6 had no cast-shadow contrast, and the sand was brick red at the fire accent's saturation. All three are fixed at their cause rather than trimmed. asc_sand.shader - A CONTRAST LIMITER on surface detail. A low sun is a normal-perturbation amplifier whose gain is 1/tan(elev): capping the tilt (normal_cos) never capped what was seen, so the cap is now on the direct term's modulation (ripple_contrast). Measured peak-to-trough on a lit face falls from 108 to under 22 grey levels while the ripple stays visible. - The 1.4 u ripple is patchy, asymmetric and carries a finer second train, so a train of ripples reads as sand rather than as a machined sine. Its wavelength was never wrong — a phase-and-footprint diagnostic showed 1.4 u at S1's 10 u near ground through a 38 lens genuinely projects at 70-90 px. - THE KEY IS ELEVATION-NORMALISED, which is what rescues P6. At 2.2 degrees N.L on a horizontal plain is 0.038, so 4's sunInt 3.4 delivered an eighth of the frame and every berm, trench lip and shadow vanished into one value. sunInt now reads as ground illuminance; relief comes from ndl's variation, bounded by key_relief_max. H5's luma spread goes 29.7 -> 90.4. - A five-tap penumbra on the cascade, whose texel at 2.2 degrees is the size of a berm. - The hue floor is on (G-B)/(R-B) — which IS the hue — instead of on two channels independently, which only bound at full chroma and delivered 19.6 degrees. The chroma ceiling moved AFTER the fog so it constrains the delivered pixel. Sand now measures hue 22-36 at saturation <= 0.70 where it measured hue 13-18 at 0.91. - Aerial perspective is azimuthal, matching the dome's own ANTI_SUN law, and the outer ring carries its own extinction so a 1400 u field never shows an edge. - The dome is linear in hemi, not squared: a warm bounce times a warm albedo squared the warmth and made shadows the most saturated thing in frame. asc_dune.computeShader - EVERY WAVELENGTH IS NOW MEASURED IN MESH CELLS. Normals are central differences at +/-6.28 u, so a 26 u term quantises to the grid and at a 2.2 degree sun that arrives as hard dentate plateaus — which survived turning the cast shadow off, proving they were geometry. Nothing under seven cells remains; the sub-cell detail moved into the fragment normal where it is band-limited per pixel. - The radial scour rays are phased on ARC LENGTH, not angle: fifteen angular cycles put them two cells apart near the axis. asc_palette.module - skyMid is clamped to the horizon's own chroma. Above 1 it hit the gamut boundary, where the ochre hue has BLUE = 0 — the published mid carried zero blue for P2-P7 and dragged the lower dome toward yellow-grey. - The magenta detector is a hue test. "Green below both others" flags 3's own Dominant B and read 23-85% on the rows 3 wrote. - 3 rule 5 gets its own detector at its own threshold, budget 0.00%. - M.PHRASES carried the retired sunset's teal and blue rows. asc_shots.module - S5's look is lowered to y 58/62. Solved against the pose, 5.3's own numbers put the view axis 41 degrees above horizontal at t=22.50, so 7 H4's crest silhouettes and trench were outside the frustum, not merely dim — which is why the demo's loudest frame delivered an empty card. - FAR 2000 -> 30000. A depth clip at constant distance is a circle, and it was the visible edge of the world at t=26. Measured at H4: 3.20 ms attributed GPU (round 1: 3.79), ladder at rung 0, against an 1.8 ms allocation. boundsSource = compute, 1806 dispatches, 0 failures. desert_r2_t02 and desert_r2_repeat_t02 are md5-identical, so the deform is still a pure function of t. --- desert(round 2): the sky bridge stays inside the gamut MID_C 1.70 ran the fit to the sRGB gamut boundary, where the ochre hue's boundary at this lightness has BLUE = 0 — the published skyMid was #684007 / #512C02 / #441F00 for P2-P6, colours 3 contains nowhere, and the magenta detector then read 84-87 percent at P3 and P6 on intermediate mixes between that zero-blue orange and a violet zenith. At 0.85 the bridge is inside both ends and delivers #644C32 / #4C3826 / #61492F. 3 rule 5's own detector now reads 0.00 percent at every phrase in the sky's blend law, while the delivered frame at t=17 measures 59.6 percent neutral — which localises that defect downstream of the rows, in asc_sky.shader or the post chain, and is the number to hand LIGHT. --- ASCENSION lane 3: the fire tornado asc_pyre.computeShader a 96x192x96 rotating vortex fill. Every noise field is sampled in a cylindrical frame un-spun by aux.torSpinAccum, with differential shear and a height-linear twist, so the surface features wrap around the axis and visibly turn. Skirt at 1.9x the waist, waist at 80/240, a separate noise-radiused anvil across the top fifth, three helical flame ropes, a white-hot core, and a base debris torus keyed to the spin peak. ignite is fire COVERAGE from the root, so one scalar carries both the 0.30 s ignition sweep and the top-down collapse; aux.torTear separates the ropes from the axis. asc_tornado.module spawns the volume on the DEFORMED sand via DESERT's duneGroundAt, composites through preseed/volume at post priority 5, drives one fireKey point light plus eight embers (nine, no more, none casting), and flies a 2400-point spark swarm entirely in the vertex stage. Outside t in [10, 28.2] it clears the texture once and hands the march a degenerate AABB. asc_spark.shader the entrained spark swarm, on fyr_ember's pattern but sized to a 240 u vortex and reading the column's live profile. asc_clock two aux amendments under lane 3's append-only right: torSpinAccum (the integral of torSpin, in revolutions) and torTear. Measured: 4.80 ms attributed GPU at H4 against a 3.25 ms baseline and a 4.4 ms allocation; ladder at rung 0 throughout. A held frame at t = 17 is md5-identical across a full part rebuild. Green and cyan measure 0.00 percent at all thirteen judged timestamps; 0.00 percent clipped and 0.00 percent near-white. --- ASCENSION/TORNADO r2: the column turns, the ramp keeps its hue, the base dies into the sand asc_pyre: helical structure that survives the raymarch (twisted anisotropic noise plus an integer angular-lobe term evaluated on the outer shell, with the medium dense enough that the near wall carries the radiance); monotone-narrowing body with the root swell confined to an absolute 30 u; skirt and anvil as separate terms, the anvil capped below the root swell and sheared downwind; ramp authored as pre-tonemap radiance against the measured display ceiling so the core reads #FFF0C8 rather than neutral; density gated by the birth ramp so the arrival brightens the frame instead of punching a hole in it; density faded into the sand and around the camera; the base torus gated on the spin peak alone; the tear throws three ropes off the axis on 120-degree bearings and they carry their own fire. asc_spark: camera-facing quads with a radial falloff and a constant screen size, blended additively so an ember can only add light. asc_tornado: 128x256x128 fill, march at 2.0 u x 172, emission gain applied once, fireKey recalibrated at the P4/P5 stations. --- storm: the sandstorm — an analytic dust medium at post priority 6, 45k GPU grains, and three lifted-sand lights The medium is a half-resolution scene-depth-aware march (asc_dust.computeShader) composited by asc_dustmix at priority 6, AFTER the fire's own composite at 5, so the storm's extinction and inscatter are applied over the column and the tornado sits IN the storm. Density is a dense ground layer under a wall body with a noise-ragged top, a lobed haboob face that arrives and passes, a 1/r vortex curl about the tornado's axis from t=10, and three octaves advected by windAccum. Extinction is density/visRange and nothing else. Inscatter is mixed between two ends solved from the dome's own aux.skyMid and aux.skyHorizon on a Henyey-Greenstein phase against the sun, and lerped toward #FF7A22 on aux.dustLitByFire in DISPLAY space. The particulate is one 45,000-grain mesh on asc_grain, re-tiled around the camera and flown entirely in the vertex stage; count is a threshold on the seed. Determinism verified: t=17 captured twice across a forced part rebuild is byte-identical. Green/cyan/magenta measure 0.00 % at all sixteen judged frames. --- TIDES/SKY: the shared contract, a volumetric squall and a softened horizon state.module is the lane contract for part 9 - pure functions of part-local t only (ship, sea, weather, light, palette), so a hot-reload cannot leave one lane running new code against another lane's old values, and so the wake is derivable from the ship track rather than accumulated across frames. sky.module builds the squall: a real-scale density field (9 km across, 350 m to 4600 m) raymarched through preseed.volume and self-shadowed with three taps toward the sun, carrying a squall line that sweeps past her, a hard-edged shelf that takes the sun at t=25, a ragged slot that lets one shaft back through for bar 22, and a volumetric rain veil below the base from t=25. The sun direction is read live from the scene so the clouds, the shadows and the glitter track cannot disagree. Height fog lays the warm low haze that softens the sea/sky seam and hides the ocean clipmap's far edge. tid_cloud_fill is the fill shader as a folder asset - bindings generated from bindings.yaml, never hand-written. p5_tides delegates its sky to the lane, drops the wrong 'bow to -x' comment (bow is +X), and frames the clouds at the END of update, after the camera. --- storm: a haboob head with a silhouette, a swarm that reaches the frame, and a fire halo with a radius The grain shader wrote out.position in WORLD space where the vertex stage's output is object-local, so every grain was displaced by the entity translation and drawn six kilometres off frame. Three critics measured the swarm at zero pixels of high-frequency contribution; it was never on screen. The medium is now two bodies. The ambient haze e-folds at visRange exactly, so aerial perspective is a real depth cue instead of an inversion. The head is a separate, much denser object with a lobed face, a ragged crown that varies across-wind, self-shadowing rolls and a backlit sun path -- it has a silhouette, an inside and a lit edge. It falls to zero once it has passed. The fire's hand is a local halo on a radius rather than a frame-wide mix, and the tornado clears its own local air, which is what lets the climax keep its range. The march jitters its start offset per pixel and the composite dithers and five-taps, both gated on the medium's own coverage. --- TIDES/SKY: decorrelate the density hash and widen the deck falloff The value-noise hash scaled all three components by the same constant, which makes it degenerate along the diagonals and stamps a fixed herringbone through the whole field. It survived a 6x finer raymarch step and a 4x larger step budget unchanged, which is what identified it as the field rather than the march. Three distinct constants remove it. The deck now thins well before the AABB wall. A near-horizon ray runs edge-on through the deck for kilometres and integrates ~90 voxels, so per-voxel variation accumulated into per-column streaking; keeping those long paths in weak medium is both the fix and what a real deck does as it recedes into haze. --- ASCENSION LIGHT: salvage r1 spine (clock bus, palette, dust-dome sky, shots, grade) --- tides/sky: a TIDES-owned volumetric squall, and the three engine facts round 1 missed\n\nThe cloud pass no longer goes through preseed.volume. That module marches\nthrough preseed.emission_raymarch, which builds its ray from unproject(ndc,0)\nto unproject(ndc,1) and tests depth < 1.0 for a surface -- both correct before\nthe engine's projection was reversed and both wrong after it -- into one fixed\n1600x900 target shared with every volume in the demo. tid_cloud_march and\ntid_cloud_composite are this part's own: reversed depth in closed form, so the\nferry occludes cloud and no occluder-range fudge is needed; a target at the\nbackbuffer size; and a step that grows with distance.\n\nMeasured, cloud band, mean |dL/dx| per adjacent pixel: 8.1-20.0 before, 0.15-1.59\nafter. Beat-1 structure energy at the 60px scale: 2.3 before, 20.3 after. Beat-3\nsky local contrast against the hull's: 24.2 vs 2.3 before, 0.16 vs 3.35 after.\nCloud b/r: 0.72-0.88 before, 0.43-0.66 after.\n\nThree things the field had to learn: every fill frequency is bounded by the\nvoxel pitch, because the cell map is a function of x and z only and anything\nfiner aliases into fluting that is constant down a column; the sun's extinction\ntaps are a jittered cone, because four fixed offsets comb-filter the medium\nalong a near-horizontal sun; and the march jitters WITHIN each step, because a\nstart offset bounded by the near step is a fraction of a step out at the deck.\n\nAlso: the scene carries its own ProceduralSky, and SkyConfig is one global\nrecord, so a part that spawns a second one gets a fight rather than a sky --\nwhich is why round 1 had no sun disc, the wrong gradient, and a near-black bar\nunder the horizon. This drives the scene's sky and restores it on exit. --- ASCENSION LIGHT r2: black point + output dither (asc_tone), sky inverts it, real P1 key, evict foreign post passes --- ASCENSION LIGHT r2: sunInt back to brief column, exposure 1.95, hot-tint keyed off brightness (neutral 17.4pct to 0.91pct) --- TIDES LIGHT: drive the scene's sun and ambient, and cut the key with measured cloud transmittance The part spawned tid_sun and tid_ambient; neither ever reached the renderer. /runtime/lighting resolves exactly one directional and one ambient, and in this scene those are the persistent 'sun' and 'ambient' entities. Measured mid-part with tid_sun at 3.0 and tid_ambient at 2.0, the resolved key was the scene sun at 0.12 and the fill at 0.14 - the brief's black, colourless sea. The two dead lights are removed and this lane drives the scene's own, restoring on exit. The key's occlusion is measured rather than scheduled: tid_key_probe marches eight rays from the ferry toward the sun through the part's own cloud volume and reports transmittance back over a readback buffer. Optical depth is normalised to a 500 m reference path, because a 4-degree beam crossing an 11 km box saturates on any weather (0.985 at t=8 but 2e-5 by t=25). For the first twenty-four seconds the key is the medium's answer alone; after that the authored occlusion is a floor, and the slot's own window re-opens it because the wedge is carved beyond 2.2 km and the probe stands inside that under the veil. Also: fixes the bloom override (0.8+0.4*level -> 0.42+0.10*level, threshold 1.0), drives the ACES exposure ramp, recaptures the reflection probe on every beat boundary rather than once at build, ramps keyOcclusion's trailing edge so the key falls to 1.4 over a bar instead of stepping inside one frame, and adds tid_chroma - Fx.grade has no chromatic_aberration preset, so the brief's 0.0018 had been read and dropped in silence since before this round. --- ascension(finish): the title in the sand, the credit cards, and the finish slot wired asc_finish.module is aspect 5. The set line is tessellated from Anton glyph outlines with font.textMesh and extruded, rotated onto the ground at build time so the entity transform stays a pure translation and localScale.y is the relief rising out of the pan on aux.typeReveal. It renders through DESERT's own sand shader with the whole property set mirrored off asc_sand_field every frame, so the letters are the pan's material under the same key and separate from it only by cast shadow and lit side walls. aux.typeGlow lifts the same material's dome term toward #FFF0C8 rather than adding an emissive channel. The three credit cards are Text3D, pinned in the camera's own basis on the left rail, on the schedule the P6 window allows. p7_ascension names the finish slot so the aspect is built and updated in §8's order. asc_point, the handoff NDC, its hex and its priority are untouched. --- ascension(finish): lift the extruded set line onto the pan font.textMesh extrudes into NEGATIVE z — with depth = 1 the glyph solid occupies z in [-1, 0] with the front face at 0. Mapping that straight onto world +Y buried the whole set line under the pan and delivered a riser of exactly zero. Measured off the built vertices, not assumed. The solid now occupies y in [0, RELIEF]: span 295.2 u, riser 0.0 -> 0.9, baked yaw 18.417 degrees. --- tides/light: a key that reaches the ship, a black point, and a print stage The sun moves from her port quarter (232) to her starboard quarter (140): at 232 no surface a starboard camera can see could take any key at all, which is the flat, ambient-washed ship three independent reads measured. The fill comes down from 1.6-2.2 to 1.05-1.55 and its green is lifted so the banned magenta band closes arithmetically rather than by luck. Exposure is set from the rendered histogram instead of transcribed. A tides-owned print stage (chromatic aberration + a lifted print black + a triangular dither) runs last before the letterbox, and re-attaches itself when a neighbouring part's grade evicts it. Every tunable in the light contract now lives inside a function body so a hot-reload can retune it. Measured over the ten-frame grid: exact black 15-54% -> 0.00%, 1st percentile 0 -> 7.2-9.0, peak 165-184 -> 200-223, banned-hue census 4.3% -> under 1.4%. --- tides/light: settle the fill and the print floor on the measured values The fill's green is lifted until 1.5*(g-r) >= (b-r), which closes the banned magenta band outright instead of narrowing it: a neutral carrying any mix of this fill and the warm key cannot satisfy (b > r AND r > g). Measured on the slot hero, the banned-hue census went 10.24% -> 6.67% -> 0.04%. --- tides/light: delete tid_chroma.shader, replaced by tid_print.shader The print stage supersedes it: same chromatic aberration, plus the print black and the dither, and at a priority that puts it last before the letterbox. --- tides/light: remove tid_chroma.shader, superseded by tid_print.shader --- tides/light: record the tid_chroma.shader leaves as deleted --- ferry: the Farjan rebuilt — bulb, stem, plating, transom, funnel casing, boats in davits, markings, procedural hull material, practicals --- farjan+ascension: ferry hull and glow shaders, tides part, ascension terrain and march Checkpoint of the work in flight when the TIDES workflow was stopped. The ferry gains its own hull and glow shaders and p5_tides is wired to them; the ascension side folds in the terrain, march and deck modules as the lanes left them. --- farjan+ascension: fold in the remaining lane source The same round as the previous commit; the live session rewrote these paths after they were first staged. --- farjan: the tides sky, light, state and cloud assets The TIDES lanes as the stopped workflow left them: a volumetric cloud fill and march with a composite, the sky and light modules that drive them off the shared state, and the ferry hull and glow shaders. --- asc_lens: re-record refs so @frame.camera reads as engine frame state, not an asset

    zero-proxy @ DESKTOP-DB3UJOJAgent · Published Jul 30, 2026On main
    01KYTJZPY9AMMAGW2M74A8G8CQ4f1cb36019Browse filesCompare from here