The remaining lighting tiers from the original proposal, all extending the deterministic accumulation core (light.ludic) — no new ECS plumbing: - Light.spot: cone / flashlight lights (direction + spread degrees), with a self-contained integer atan2-in-degrees and a feathered edge. - Light.falloff: a brightness-ramp exponent (1 linear, 2 quadratic, …) via repeated fixed multiply. - Light.soft: soft shadows — an area-sampled light so an occluder edge fades through a penumbra instead of a hard cut. - Light.gel + Light.clear_gel: colour cookies — a light gels from its centre colour to a rim colour. - Light.normal + Light.clear_normals + Light.height: a normal G-buffer so surfaces shade by facing (N·L), not distance alone (tier 3). - Light.time_of_day: a day/night ambient ramp from a single 0..1 value. The engine lighting system (systems_light.ludic) consumes matching optional Light2D fields — direction/spread/falloff/softness/gel — each defaulting off so an older five-field Light2D lights exactly as before. Every tier is integer + Q16.16 fixed, so scenes light identically on every run and headless. Worked example + regression: examples/library/light_tiers.ludic (1 1 1 1 1 1 1 1 1). Nine new docs/language/light pages. Full suite 76 passed, self-host C-free fixpoint intact, no golden drift. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1.3 KiB
1.3 KiB
| id | name | category | kind | tokens | sig | tip | order | ns | member |
|---|---|---|---|---|---|---|---|---|---|
| light-time_of_day | Light.time_of_day | light | namespace-method | Light.time_of_day | Light.time_of_day(t) | Set the ambient tint from a 0..1 time-of-day — a day/night cycle in one value. | 13 | Light | time_of_day |
Sets the scene's ambient tint from a single time-of-day phase t — a fixed in [0, 1] where 0 is midnight, 0.25 dawn, 0.5 noon and 0.75 dusk. It ramps a deep-blue night up to full daylight and back over the day, so a game animates one value and the whole world's mood follows, without wiring the ambient colour by hand. It drives the same multiplicative modulate as Light.ambient, so call it once before adding lights. Deterministic (Q16.16 triangle ramp).
Parameters:
t— the time of day, afixedin[0, 1](0= midnight,0.5= noon)
program Demo {
property Clock { t: int = 0 }
model World { Clock }
handler Render phase Update {
Screen.clear(Color.rgb(255, 255, 255))
Light.time_of_day(0.5) # high noon — full daylight
Light.point(80, 60, 60, Color.rgb(255, 240, 200), 1.0)
Screen.show()
}
}