ludic/docs/language/light/light-time_of_day.md
Orkuncakilkaya 382826889f
All checks were successful
bootstrap / cfree-fixpoint (push) Successful in 18s
ci / build-and-test (push) Successful in 1m21s
commit-lint / conventional-commits (push) Successful in 4s
docs / build-and-deploy (push) Successful in 19s
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>
2026-08-31 16:35:41 +03:00

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, a fixed in [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()
  }
}