code wiki / _hdl_build / nx_stl_view_demo.nx

nx_stl_view_demo.nx source

↩ module page · 57 lines · 2926 B

1// nx_stl_view_demo.nx -- emit a REAL openable .html artifact (not a test): builds an octahedron 2// STL (8 triangles, a stand-in for a statue mesh) and writes the sovereign viewer to 3// /tmp/nishi_stl_view.html. Open it in any browser to orbit/zoom the model. Proves the 4// STL -> "see the CAD" path end to end on a multi-triangle solid. license_tier: ORIGINAL 5import "nx_stl_view_html.nx" 6import "nx_fab_slice.nx" 7import "nx_syscalls.nx" 8const K_MAGIC_65536: i64 = 65536 9const K_MAGIC_16777216: i64 = 16777216 10const K_MAGIC_1101004800: i64 = 1101004800 11const K_MAGIC_3248488448: i64 = 3248488448 12const K_MAGIC_2048: i64 = 2048 13const K_MAGIC_262144: i64 = 262144 14 15func dm_w32(b: *u8, off: i64, v: i64) -> i64 { 16 b[off]=(v%256) as u8; b[off+1]=((v/256)%256) as u8; b[off+2]=((v/K_MAGIC_65536)%256) as u8; b[off+3]=((v/K_MAGIC_16777216)%256) as u8 17 return 4 18} 19// f32 bit patterns we need (mm): 0=0x00000000, 20=0x41A00000, -20=0xC1A00000 20func dm_setv(stl: *u8, tri: i64, vtx: i64, xb: i64, yb: i64, zb: i64) -> i64 { 21 let base: i64 = 84 + tri*50 + 12 + vtx*12 22 dm_w32(stl, base, xb); dm_w32(stl, base+4, yb); dm_w32(stl, base+8, zb) 23 return 0 24} 25 26func main() -> i64 { 27 let P: i64 = K_MAGIC_1101004800 // +20.0f 28 let N: i64 = K_MAGIC_3248488448 // -20.0f 29 let Z: i64 = 0 // 0.0f 30 let stl: *u8 = sys_mmap(K_MAGIC_2048) 31 dm_w32(stl, 80, 8) // 8 triangles 32 33 // octahedron: apex +Y (0,20,0), nadir -Y (0,-20,0), equator (+X,0,0)(0,0,+Z? use +X,-X,+Z,-Z) 34 // equator verts: A=(20,0,0) B=(0,0,20) C=(-20,0,0) D=(0,0,-20); top=T(0,20,0) bot=O(0,-20,0) 35 // top fan: TAB, TBC, TCD, TDA ; bottom fan: OBA, OCB, ODC, OAD (winding outward) 36 dm_setv(stl,0,0,Z,P,Z); dm_setv(stl,0,1,P,Z,Z); dm_setv(stl,0,2,Z,Z,P) 37 dm_setv(stl,1,0,Z,P,Z); dm_setv(stl,1,1,Z,Z,P); dm_setv(stl,1,2,N,Z,Z) 38 dm_setv(stl,2,0,Z,P,Z); dm_setv(stl,2,1,N,Z,Z); dm_setv(stl,2,2,Z,Z,N) 39 dm_setv(stl,3,0,Z,P,Z); dm_setv(stl,3,1,Z,Z,N); dm_setv(stl,3,2,P,Z,Z) 40 dm_setv(stl,4,0,Z,N,Z); dm_setv(stl,4,1,Z,Z,P); dm_setv(stl,4,2,P,Z,Z) 41 dm_setv(stl,5,0,Z,N,Z); dm_setv(stl,5,1,N,Z,Z); dm_setv(stl,5,2,Z,Z,P) 42 dm_setv(stl,6,0,Z,N,Z); dm_setv(stl,6,1,Z,Z,N); dm_setv(stl,6,2,N,Z,Z) 43 dm_setv(stl,7,0,Z,N,Z); dm_setv(stl,7,1,P,Z,Z); dm_setv(stl,7,2,Z,Z,N) 44 45 let html: *u8 = sys_mmap(K_MAGIC_262144) 46 let hn: i64 = nx_stl_view_emit(stl, html) 47 48 let fd: i64 = sys_openat_wr("/tmp/nishi_stl_view.html" as *u8, 0x1a4) 49 if fd < 0 { sys_write(2, "open failed\n" as *u8, 12); sys_exit(1) } 50 sys_write(fd, html, hn) 51 sys_close(fd) 52 sys_write(1, "wrote /tmp/nishi_stl_view.html bytes=" as *u8, 37) 53 let bb: *u8 = sys_mmap(28); var m: i64=hn; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k) 54 sys_write(1, "\n" as *u8, 1) 55 sys_exit(0) 56 return 0 57}