feat(light): render-quality tiers 3-4 — cones, falloff, soft shadows, gels, normals, day/night (#49)
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>
This commit is contained in:
parent
377b6d1186
commit
382826889f
18 changed files with 7752 additions and 6502 deletions
30
docs/language/light/light-time_of_day.md
Normal file
30
docs/language/light/light-time_of_day.md
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
---
|
||||
id: light-time_of_day
|
||||
name: Light.time_of_day
|
||||
category: light
|
||||
kind: namespace-method
|
||||
tokens: Light.time_of_day
|
||||
sig: Light.time_of_day(t)
|
||||
tip: Set the ambient tint from a 0..1 time-of-day — a day/night cycle in one value.
|
||||
order: 13
|
||||
ns: Light
|
||||
member: time_of_day
|
||||
---
|
||||
|
||||
Sets the scene's <a href="light-ambient"><code>ambient</code></a> tint from a single **time-of-day** phase <code>t</code> — a <code>fixed</code> in <code>[0, 1]</code> where <code>0</code> is midnight, <code>0.25</code> dawn, <code>0.5</code> noon and <code>0.75</code> 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 <code>Light.ambient</code>, so call it once before adding lights. Deterministic (Q16.16 triangle ramp).
|
||||
|
||||
Parameters:
|
||||
- `t` — the time of day, a `fixed` in `[0, 1]` (`0` = midnight, `0.5` = noon)
|
||||
|
||||
```ludic
|
||||
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()
|
||||
}
|
||||
}
|
||||
```
|
||||
Loading…
Add table
Add a link
Reference in a new issue