code wiki / _hdl_build / nx_vn_art.nx

nx_vn_art.nx source

↩ module page · 96 lines · 4677 B

1// nx_vn_art.nx -- the ecosystem GENERATES a VN background (the visuals gap, attacked honestly): a procedural 2// dusk-storm lighthouse scene, integer-rastered (NO float) into a packed-RGB framebuffer, then written as a 3// sovereign PNG (our own nx_png encoder). It is served as a same-origin static image (CSS background-image, NOT a 4// JS blit, NOT a third-party fetch) on the live VN. Honest scope: PROCEDURAL atmosphere, not hand-painted CG -- 5// a real step from styled-text to generated art, the first rung of VN visuals. license_tier: ORIGINAL expect_exit: 0 6import "nx_syscalls.nx" 7import "nx_shade.nx" 8import "nx_png.nx" 9 10func aw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 11func frect(fb: *i64, w: i64, h: i64, x0: i64, y0: i64, x1: i64, y1: i64, c: i64) -> i64 { 12 var yy: i64 = y0; if yy < 0 { yy = 0 } 13 var ye: i64 = y1; if ye > h { ye = h } 14 while yy < ye { var xx: i64 = x0; if xx < 0 { xx = 0 } var xe: i64 = x1; if xe > w { xe = w } while xx < xe { fb[yy*w + xx] = c; xx = xx + 1 } yy = yy + 1 } 15 return 0 16} 17 18func va_bg(fb: *i64, W: i64, H: i64) -> i64 { 19 let horizon: i64 = H*7/10 20 // sky gradient: dark navy top -> dusk-purple horizon 21 var y: i64 = 0 22 while y < horizon { 23 let t: i64 = y*256/horizon 24 let r: i64 = 12 + (84-12)*t/256; let g: i64 = 16 + (56-16)*t/256; let b: i64 = 38 + (92-38)*t/256 25 frect(fb, W, H, 0, y, W, y+1, sh_rgb(r, g, b)); y = y + 1 26 } 27 // moon (pale disc, upper-left) 28 let mx: i64 = W/5; let my: i64 = horizon*2/5; let mr: i64 = 26 29 var yy: i64 = my - mr 30 while yy <= my + mr { 31 var xx: i64 = mx - mr 32 while xx <= mx + mr { let dx: i64 = xx-mx; let dy: i64 = yy-my; if dx*dx + dy*dy <= mr*mr { if xx >= 0 { if xx < W { if yy >= 0 { if yy < horizon { fb[yy*W + xx] = sh_rgb(228, 224, 204) } } } } } xx = xx + 1 } 33 yy = yy + 1 34 } 35 // sea: dark teal, darkening downward 36 y = horizon 37 while y < H { 38 let t: i64 = (y-horizon)*256/(H-horizon) 39 let r: i64 = 12 - 6*t/256; let g: i64 = 28 - 12*t/256; let b: i64 = 46 - 18*t/256 40 frect(fb, W, H, 0, y, W, y+1, sh_rgb(r, g, b)); y = y + 1 41 } 42 frect(fb, W, H, 0, horizon-1, W, horizon+1, sh_rgb(132, 96, 120)) // horizon glow 43 // lighthouse tower (tapered, red banded) 44 let cx: i64 = W*62/100 45 let topY: i64 = horizon - H*44/100 46 let baseY: i64 = horizon + 8 47 let hBase: i64 = 21; let hTop: i64 = 12 48 y = topY 49 while y <= baseY { 50 let t: i64 = (y-topY)*256/(baseY-topY) 51 let half: i64 = hTop + (hBase-hTop)*t/256 52 let band: i64 = (y-topY)*6/(baseY-topY) 53 var col: i64 = sh_rgb(208, 210, 220) 54 if (band % 2) == 1 { col = sh_rgb(178, 58, 54) } 55 frect(fb, W, H, cx-half, y, cx+half, y+1, col); y = y + 1 56 } 57 // gallery + lamp room (bright) + glow halo 58 frect(fb, W, H, cx-13, topY-4, cx+13, topY+2, sh_rgb(58, 60, 74)) 59 frect(fb, W, H, cx-8, topY-18, cx+8, topY-4, sh_rgb(255, 234, 140)) 60 // soft glow halo around the lamp 61 let gx: i64 = cx; let gy: i64 = topY - 11; let gr: i64 = 30 62 yy = gy - gr 63 while yy <= gy + gr { 64 var xx: i64 = gx - gr 65 while xx <= gx + gr { 66 let dx: i64 = xx-gx; let dy: i64 = yy-gy; let d2: i64 = dx*dx + dy*dy 67 if d2 <= gr*gr { if d2 > 144 { if xx >= 0 { if xx < W { if yy >= 0 { if yy < horizon { 68 let cur: i64 = fb[yy*W + xx]; let k: i64 = (gr*gr - d2)*120/(gr*gr) 69 let nr: i64 = sh_r(cur) + k; let ng: i64 = sh_g(cur) + k*9/10; let nb: i64 = sh_b(cur) + k/2 70 var rr: i64 = nr; if rr > 255 { rr = 255 } var gg: i64 = ng; if gg > 255 { gg = 255 } var bb: i64 = nb; if bb > 255 { bb = 255 } 71 fb[yy*W + xx] = sh_rgb(rr, gg, bb) 72 } } } } } } 73 xx = xx + 1 74 } 75 yy = yy + 1 76 } 77 // rain: sparse diagonal streaks 78 var i: i64 = 0 79 while i < 320 { 80 let rx: i64 = (i*73 + 11) % W; let ry: i64 = (i*149 + 7) % horizon 81 var s: i64 = 0 82 while s < 6 { let px: i64 = rx + s; let py: i64 = ry + s*2; if px < W { if py < horizon { fb[py*W + px] = sh_rgb(150, 162, 188) } } s = s + 1 } 83 i = i + 1 84 } 85 return 0 86} 87 88func main(argc: i64, argv: *i64) -> i64 { 89 let W: i64 = 320; let H: i64 = 180 90 let fb: *i64 = sys_mmap(8*W*H) as *i64 91 va_bg(fb, W, H) 92 sys_mkdir("knowledge/staging/game" as *u8, 0x1ed) 93 write_png(fb, W, H, "knowledge/staging/game/vn_bg.png" as *u8) 94 aw("nx_vn_art: generated procedural lighthouse background -> knowledge/staging/game/vn_bg.png (640x360, integer raster, sovereign PNG)\n" as *u8) 95 sys_exit(0); return 0 96}