render.bend checks
raw source on the hub · import 0xc517d5d3635f5bc3ec47170caccaebf0/render.bend as Render
1 import
import Base
Types
type Cam source · line 8 · raw
Data
C@px:F32 -> @py:F32 -> @pz:F32 -> @yaw:F32 -> @pitch:F32 -> @fov:F32 -> Cam
type Ray source · line 11 · raw
Data
R@ox:F32 -> @oy:F32 -> @oz:F32 -> @dx:F32 -> @dy:F32 -> @dz:F32 -> Ray
Definitions
def Render.cam_from source · line 15 · raw
@px:F32 -> @py:F32 -> @pz:F32 -> @yaw:F32 -> @pitch:F32 -> @fov:F32 -> Cam
Camera constructor helper.
def Render.nonzero_go source · line 19 · raw
@x:F32 -> @z:Bool -> F32
Division guard: replace 0.0 with a small epsilon (keeps math total).
def Render.nonzero source · line 26 · raw
@+x:F32 -> F32
def Render.chan source · line 30 · raw
@c:U32 -> @k:Nat -> U32
Extract byte k (0n=B, 8n=G, 16n=R) from a packed 0xRRGGBB color.
def Render.pack source · line 34 · raw
@r:U32 -> @g:U32 -> @b:U32 -> U32
Pack R/G/B bytes into 0xRRGGBB.
def Render.mix_chan source · line 40 · raw
@a:U32 -> @b:U32 -> @t:F32 -> U32
Lerp one channel a -> b by t (t in 0..1).
def Render.mix_rgb source · line 46 · raw
@+c0:U32 -> @+c1:U32 -> @+t:F32 -> U32
Lerp packed colors c0 -> c1 by t.
def Render.shade_chan source · line 52 · raw
@c:U32 -> @k:Nat -> @b:F32 -> U32
Scale one channel by brightness b.
def Render.shade source · line 56 · raw
@+c:U32 -> @steps:U32 -> U32
Distance fog: brightness 1.0 -> 0.2 over ~64 steps, applied per channel.
def Render.sky source · line 64 · raw
@dx:F32 -> @dy:F32 -> @dz:F32 -> @time:F32 -> U32
Sky gradient: day (horizon 0x87CEEB -> zenith 0x3B7DDD) lerped to night 0x0B1026 by a daylight factor from time (day cycle 0..1).
def Render.pixel_ray source · line 75 · raw
@cam:Cam -> @u:F32 -> @v:F32 -> @w:U32 -> @h:U32 -> Ray
Primary ray through pixel (u, v) of a w-by-h frame. NDC = (u/w*2-1)*aspect etc., pinhole with tan(fov/2), then yaw (Y) and pitch (X) rotation, normalized. All divisions epsilon-guarded.
def Render.is_cross source · line 115 · raw
@+x:U32 -> @+y:U32 -> @+w:U32 -> @+h:U32 -> Bool
Crosshair test: within 2px of frame center.
def Render.face_br05 source · line 174 · raw
@n:Nat -> F32
---- Additive pure helpers (appended; old defs untouched) ----
def Render.face_br04 source · line 181 · raw
@n:Nat -> F32
def Render.face_br03 source · line 188 · raw
@n:Nat -> F32
def Render.face_br02 source · line 195 · raw
@n:Nat -> F32
def Render.face_br01 source · line 202 · raw
@n:Nat -> F32
def Render.face_br00 source · line 209 · raw
@n:Nat -> F32
def Render.face_br source · line 216 · raw
@face:U32 -> F32
def Render.face_shade source · line 219 · raw
@+color:U32 -> @face:U32 -> U32
def Render.sun_dir source · line 225 · raw
@time:F32 -> Pair(F32, Pair(F32, F32))
def Render.sun_hit source · line 231 · raw
@dx:F32 -> @dy:F32 -> @dz:F32 -> @sx:F32 -> @sy:F32 -> @sz:F32 -> Bool
def Render.sun_pick source · line 239 · raw
@hit:Bool -> @sky:U32 -> U32
def Render.sun_finish source · line 246 · raw
@sy:F32 -> @sz:F32 -> @sx:F32 -> @+dx:F32 -> @+dy:F32 -> @+dz:F32 -> @time:F32 -> U32
def Render.sun_mid source · line 251 · raw
@inner:Pair(F32, F32) -> @sx:F32 -> @+dx:F32 -> @+dy:F32 -> @+dz:F32 -> @time:F32 -> U32
def Render.sun_split source · line 255 · raw
@sun:Pair(F32, Pair(F32, F32)) -> @+dx:F32 -> @+dy:F32 -> @+dz:F32 -> @+time:F32 -> U32
def Render.sun_color source · line 259 · raw
@+dx:F32 -> @+dy:F32 -> @+dz:F32 -> @+time:F32 -> U32
def Render.cloud_pick source · line 262 · raw
@hit:Bool -> Bool
def Render.cloud_hit source · line 269 · raw
@x:F32 -> @z:F32 -> @time:F32 -> Bool
def Render.water_tint source · line 277 · raw
@+color:U32 -> U32
def Render.mix_hurt source · line 283 · raw
@hit:Bool -> @+color:U32 -> U32
def Render.hurt_flash source · line 290 · raw
@+color:U32 -> @ticks:U32 -> U32
def Render.vig_pick source · line 293 · raw
@edge:Bool -> @+color:U32 -> U32
def Render.vignette source · line 303 · raw
@+x:U32 -> @+y:U32 -> @+w:U32 -> @+h:U32 -> @+color:U32 -> U32
def Render.particle04 source · line 317 · raw
@n:Nat -> U32
def Render.particle03 source · line 324 · raw
@n:Nat -> U32
def Render.particle02 source · line 331 · raw
@n:Nat -> U32
def Render.particle01 source · line 338 · raw
@n:Nat -> U32
def Render.particle00 source · line 345 · raw
@n:Nat -> U32
def Render.particle source · line 352 · raw
@+kind:U32 -> @+life:U32 -> U32
def Render.shade_face source · line 362 · raw
@color:U32 -> @steps:U32 -> @face:U32 -> U32
Templates
template Render.march source · line 126 · raw
@-get:(@_:U32 -> @_:U32 -> @_:U32 -> U32) -> @-color_of:(@_:U32 -> U32) -> @fuel:Nat -> @bid:U32 -> @empty:Bool -> @px:F32 -> @py:F32 -> @pz:F32 -> @+dx:F32 -> @+dy:F32 -> @+dz:F32 -> @+steps:U32 -> @+time:F32 -> U32
Fixed-step raymarcher (0.25 voxels/step). fuel bounds the steps, so it is termination-safe. Hit => fog-shaded palette color, miss => sky. NOTE: ~get must answer 0 for out-of-bounds coords (including the huge U32 values that negative F32 positions convert to).
template Render.trace source · line 142 · raw
@-get:(@_:U32 -> @_:U32 -> @_:U32 -> U32) -> @-color_of:(@_:U32 -> U32) -> @fuel:Nat -> @ox:F32 -> @oy:F32 -> @oz:F32 -> @dx:F32 -> @dy:F32 -> @dz:F32 -> @time:F32 -> U32
Entry point game.bend calls: march a ray, return final U32 color.
template Render.pixel_go source · line 146 · raw
@-get:(@_:U32 -> @_:U32 -> @_:U32 -> U32) -> @-color_of:(@_:U32 -> U32) -> @r:Ray -> @+x:U32 -> @+y:U32 -> @+w:U32 -> @+h:U32 -> @+time:F32 -> U32
One framebuffer pixel: ray + trace + white crosshair dot.
template Render.pixel source · line 152 · raw
@-get:(@_:U32 -> @_:U32 -> @_:U32 -> U32) -> @-color_of:(@_:U32 -> U32) -> @cam:Cam -> @+x:U32 -> @+y:U32 -> @+w:U32 -> @+h:U32 -> @+time:F32 -> U32
template Render.build source · line 157 · raw
@-get:(@_:U32 -> @_:U32 -> @_:U32 -> U32) -> @-color_of:(@_:U32 -> U32) -> @+size:Nat -> @+cam:Cam -> @+x0:U32 -> @+y0:U32 -> @+w:U32 -> @+h:U32 -> @+time:F32 -> Image
Quadtree tile builder: size is depth (0n => one Pix). The 4 quadrants are built with parallel lets; size shrinks first, so it terminates.
template Render.frame source · line 170 · raw
@-get:(@_:U32 -> @_:U32 -> @_:U32 -> U32) -> @-color_of:(@_:U32 -> U32) -> @cam:Cam -> @time:F32 -> Image
Full 256x256 frame (depth 8).