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}