sourceextensions/scene/demos/voxels-light.xtl

1⍝# Voxels, 14: light. The endless world, lit: a face open to the sky is 2⍝# in full sunlight; under an overhang, beneath a tree's crown or down a 3⍝# tunnel the light fades, a step a block, as it spreads from the open 4⍝# air. A lamp (the hotbar's eighth block) glows: its light spreads the 5⍝# same way through the air around it. N turns day to night and back -- 6⍝# the sunlight and the sky go, the lamps stay -- by one number in scene, 7⍝# so nothing is worked out again. Each column's light is worked out as 8⍝# it is made (vx:c_olumnLight: sunlight by a scan down each column, 9⍝# then rounds of spreading), and again when an edit makes it again: dig 10⍝# a tunnel's roof open and the sun comes in. 11⍝# Run: just demo scene voxels-light 12⍝# click (or X) dig, right-click (or E) place, 1 to 8 choose the block 13⍝# (8 a lamp), N night or day, W A S D walk, Space jump, Shift run, F 14⍝# fly, drag or the arrows to look, H back to the start, q quit 15 16ᵉⁿ⁼u̲se< "Endless" 17ᵖˡ⁼u̲se< "Play" 18ˢᶜ⁼u̲se< "Scene" 19 20w ← "Voxels 14: light -- X_eTaL" ˢᶜo̲pen! 640 400 21g ← w ˢᶜf̲og! 22.0 44.0 22k ← w ˢᶜs̲ky! 0.55 0.72 0.92 23k ← w ˢᶜc̲urve! 160.0 24 25ᵖˡhelpLit 26 27⍝## The light, checked 28 29⍝# Stone, 18 by 32 by 18 (a column with its border), with a shaft open to 30⍝# the sky at x 4, z 9 down to y 10, a tunnel at y 10 from it east to x 31⍝# 15, and a lamp at the tunnel's end (x 16). Along the tunnel the 32⍝# sunlight falls 3 a block from the shaft's 15; the lamplight falls 3 a 33⍝# block back from the lamp. 34ᵛˣ⁼u̲se< "Voxels" 35cell ← (r̲ange 18 × 32 × 18) − 1 36x ← cell d̲iv 32 × 18 37y ← (cell d̲iv 18) m̲od 32 38z ← cell m̲od 18 39shaft ← (x = 4) × (z = 9) × y ≥ 10 40tunnel ← (y = 10) × (z = 9) × (x ≥ 4) × x ≤ 15 41lamp ← (y = 10) × (z = 9) × x = 16 42b ← 18 32 18 r̲eshape (8 × lamp) + (1 − lamp) × 1 − 0 < shaft + tunnel 43ᵘs̲unOf ← { (sun, _) → sun } 44ᵘl̲ampOf ← { (_, lamp) → lamp } 45L ← ᵛˣc̲olumnLight b 46row ← 1 + tunnel r̲eplicate cell 47"sunlight along the tunnel, x 4 to 15:" 48row s̲elect r̲avel ᵘs̲unOf L 49"lamplight along it, the lamp at x 16:" 50row s̲elect r̲avel ᵘl̲ampOf L 51 52hud ← w ᵖˡh̲udLit 1 53s ← ᵉⁿl̲ighting ᵉⁿn̲ew w 54s ← (4 × (1 + 2 × ᵉⁿreach) × 1 + 2 × ᵉⁿreach) 'ᵉⁿs̲tream p̲ower s 55last ← 100000 'ᵖˡf̲rame p̲ower (s, 1) 56z ← ˢᶜc̲lose! w 57⍝ (an accessor, not a top-level tuple pattern: ask E10) 58ᵘw̲orldOf ← { (s, _) → s } 59s ← ᵘw̲orldOf last 60"by day (1) or night (2) at the end, and the lamps placed:" 61ᵉⁿl̲it s 62'+ r̲/ 8 = 4 s̲elect₂ ᵉⁿe̲dits s 63"bye"