code wiki / (root) / nx_trimesh.nx

nx_trimesh.nx

buildroot/runtime/nx_trimesh.nx

38892 B667 linesdepth 2pulls 3 transitivereach 41 importersview sourcekind library
docsdependenciesstructsconstsfunctions

about

nx_trimesh.nx -- ★SOVEREIGN TRIANGLE-MESH RASTERIZER (operator 2026-07-10, frank feedback: "we just have circles, no triangle or other capabilities for shapes to make more and more real things"). Correct: everything so far is axis-aligned ELLIPSOIDS (smooth blobs) -- no flat faces, sharp edges, or arbitrary form. This adds the UNIVERSAL primitive: the TRIANGLE. A real integer rasterizer -- transform -> perspective project -> barycentric fill with a Z-BUFFER + flat per-face shading -> arbitrary polygon meshes with FLAT FACES and SHARP EDGES. Plus a primitive library (cube/tetra/octa/pyramid/prism/icosahedron/uv-sphere) and composition (build real things from many meshes). 100% integer, sovereign (own trig, own raster). license_tier: ORIGINAL

dependencies 2 imports · 35 importers

nx_syscalls.nx nx_itrig.nx nx_trimesh.nx nx_aa_gate.nx nx_authorworld_gate.nx nx_being_showcase.nx nx_bodyatlas_mesh_gate.nx nx_boxtex_gate.nx nx_bunny_gate.nx nx_cornell.nx nx_cornell_dyn_gate.nx nx_cornell_gate.nx nx_donor_native.nx

diagram shows first 10 each side; +0 more imports, +25 more importers in the complete lists below.

imports: nx_syscalls.nxnx_itrig.nx

imported by: nx_aa_gate.nxnx_authorworld_gate.nxnx_being_showcase.nxnx_bodyatlas_mesh_gate.nxnx_boxtex_gate.nxnx_bunny_gate.nxnx_cornell.nxnx_cornell_dyn_gate.nxnx_cornell_gate.nxnx_donor_native.nxnx_engine_lod_gate.nxnx_engine_phys_gate.nxnx_engine_scene_gate.nxnx_engine_stream_gate.nxnx_gltf_anim.nxnx_gltf_anim_gate.nxnx_gltf_load.nxnx_gltf_load_gate.nxnx_gltf_mesh.nxnx_gltf_mesh_gate.nxnx_gltf_scene.nxnx_gltf_scene_gate.nxnx_hands_gate.nxnx_isosurf.nxnx_isosurf_gate.nxnx_native_turntable.nxnx_objload.nxnx_phong_gate.nxnx_retarget_emit.nxnx_retarget_showcase.nxnx_stdassets_gate.nxnx_texture_gate.nxnx_trimesh_gate.nxnx_worldpipe.nxnx_worldpipe_gate.nx

structs

none

consts

10const TM_MAGIC_1024: i64 = 1024
11const TM_MAGIC_1000000000: i64 = 1000000000
12const TM_MAGIC_374761393: i64 = 374761393
13const TM_MAGIC_668265263: i64 = 668265263
14const TM_MAGIC_1610612741: i64 = 1610612741
15const TM_MAGIC_1274126177: i64 = 1274126177
16const TM_MAGIC_1048576: i64 = 1048576
17const TM_MAGIC_4096: i64 = 4096
18const TM_MAGIC_1618: i64 = 1618
19const TM_MAGIC_65536: i64 = 65536
20const TM_MAGIC_1300: i64 = 1300
21const TM_MAGIC_2400: i64 = 2400
22const TM_MAGIC_3000: i64 = 3000
23const TM_MAGIC_100000: i64 = 100000
24const TM_MAGIC_90000: i64 = 90000
25const TM_MAGIC_65535: i64 = 65535
26const TM_MAGIC_37777: i64 = 37777
27const TM_MAGIC_91131: i64 = 91131
28const TM_MAGIC_6144: i64 = 6144
29const TM_MAGIC_81111: i64 = 81111
30const TM_MAGIC_2000000000: i64 = 2000000000
39const TM_GRID: i64 = 256 // max polygonizer grid resolution supported
40const TM_FOLD: i64 = 6 // surface-crossings per cell column, worst case
41const TM_VCAP: i64 = TM_GRID*TM_GRID*TM_FOLD
42const TM_TCAP: i64 = TM_VCAP*2 // surface nets emits ~2 triangles per vertex
65const TM_SHRES: i64 = 576

functions

57func tm_ovf() -> i64 { return TM_OVF }
called by 13: mainmainmainmainmainmain+7
59func tm_set_spec(v: i64) -> i64 { TM_SPEC = v; return 0 }
61func tm_set_tex(scale: i64) -> i64 { TM_TEX = scale; return 0 }
81func tm_set_sun(x: i64, y: i64, z: i64) -> i64
88func tm_set_shadow(v: i64) -> i64 { TM_SHON = v; return 0 }
89func tm_shadow_bake() -> i64
172func tm_shadow_at(wx: i64, wy: i64, wz: i64) -> i64
called by 1: trimesh_render
191func tm_set_image(rgb: *u8, w: i64, h: i64) -> i64 { TM_IMG = rgb as i64; TM_IMGW = w; TM_IMGH = h; return 0 }
194func tm_vuv(idx: i64, u: i64, v: i64) -> i64 { let pu: *i64 = TM_VU as *i64; let pv: *i64 = TM_VV as *i64; pu[idx] = u; pv[idx] = v; return 0 }
called by 1: gltf_load_std
195func tm_hash3(a: i64, b: i64, c: i64) -> i64
202func tm_noise3(x: i64, y: i64, z: i64, S: i64) -> i64
219func tm_isqrt(v: i64) -> i64 { if v <= 0 { return 0 } var x: i64 = v; var y: i64 = (x+1)/2; while y < x { x=y; y=(x+v/x)/2 } return x }
220func tm_min(a: i64, b: i64) -> i64 { if a<b {return a} return b }
called by 1: tm_min3
221func tm_max(a: i64, b: i64) -> i64 { if a>b {return a} return b }
called by 1: tm_max3
222func tm_min3(a: i64, b: i64, c: i64) -> i64 { return tm_min(tm_min(a,b),c) }
called by 2: tm_shadow_baketrimesh_render calls 1: tm_min
223func tm_max3(a: i64, b: i64, c: i64) -> i64 { return tm_max(tm_max(a,b),c) }
called by 2: tm_shadow_baketrimesh_render calls 1: tm_max
225func tm_reset() -> i64
236func tm_vcol(idx: i64, col: i64) -> i64 { let p: *i64 = TM_VCOL as *i64; p[idx] = col; return 0 }
238func tm_vpos(idx: i64, out: *i64) -> i64 { let px: *i64=TM_VX as *i64; let py: *i64=TM_VY as *i64; let pz: *i64=TM_VZ as *i64; out[0]=px[idx]; out[1]=py[idx]; out[2]=pz[idx]; return 0 }
239func tm_vnorm(idx: i64, out: *i64) -> i64 { let px: *i64=TM_VNX as *i64; let py: *i64=TM_VNY as *i64; let pz: *i64=TM_VNZ as *i64; out[0]=px[idx]; out[1]=py[idx]; out[2]=pz[idx]; return 0 }
240func tm_getvcol(idx: i64) -> i64 { let p: *i64=TM_VCOL as *i64; return p[idx] }
244func tm_vx(i: i64) -> i64 { let p: *i64=TM_VX as *i64; return p[i] }
called by 2: mainmain
245func tm_vy(i: i64) -> i64 { let p: *i64=TM_VY as *i64; return p[i] }
called by 2: mainmain
246func tm_vz(i: i64) -> i64 { let p: *i64=TM_VZ as *i64; return p[i] }
called by 1: main
247func tm_vnx(i: i64) -> i64 { let p: *i64=TM_VNX as *i64; return p[i] }
called by 1: main
248func tm_vny(i: i64) -> i64 { let p: *i64=TM_VNY as *i64; return p[i] }
called by 1: main
249func tm_vnz(i: i64) -> i64 { let p: *i64=TM_VNZ as *i64; return p[i] }
called by 1: main
250func tm_ta(i: i64) -> i64 { let p: *i64=TM_TA as *i64; return p[i] }
called by 1: main
251func tm_tb(i: i64) -> i64 { let p: *i64=TM_TB as *i64; return p[i] }
called by 1: main
252func tm_tc(i: i64) -> i64 { let p: *i64=TM_TC as *i64; return p[i] }
called by 1: main
253func tm_tget(t: i64, out: *i64) -> i64 { let pa: *i64=TM_TA as *i64; let pb: *i64=TM_TB as *i64; let pc: *i64=TM_TC as *i64; out[0]=pa[t]; out[1]=pb[t]; out[2]=pc[t]; return 0 }
255func tm_place(from: i64, to: i64, dx: i64, dy: i64, dz: i64, mil: i64) -> i64
267func tm_compute_normals() -> i64
294func tm_vert(x: i64, y: i64, z: i64) -> i64
303func tm_vert_n(x: i64, y: i64, z: i64, nx: i64, ny: i64, nz: i64) -> i64
312func tm_tri(a: i64, b: i64, c: i64, col: i64) -> i64
320func tm_quad(a: i64, b: i64, c: i64, d: i64, col: i64) -> i64 { tm_tri(a,b,c,col); tm_tri(a,c,d,col); return 0 }
321func tm_nt() -> i64 { return TM_NT }
called by 23: mainmainmainmainmainmain+17
322func tm_nv() -> i64 { return TM_NV }
325func tm_cube(cx: i64, cy: i64, cz: i64, s: i64, col: i64) -> i64
337func tm_tetra(cx: i64, cy: i64, cz: i64, s: i64, col: i64) -> i64
called by 1: main calls 2: tm_verttm_tri
343func tm_octa(cx: i64, cy: i64, cz: i64, s: i64, col: i64) -> i64
called by 1: main calls 2: tm_verttm_tri
350func tm_pyramid(cx: i64, cy: i64, cz: i64, s: i64, col: i64) -> i64
358func tm_prism(cx: i64, cy: i64, cz: i64, s: i64, col: i64) -> i64 { // triangular prism (extruded triangle along z)
called by 1: main calls 3: tm_verttm_tritm_quad
367func tm_icosa(cx: i64, cy: i64, cz: i64, s: i64, col: i64) -> i64
called by 1: main calls 2: tm_verttm_tri
380func tm_uvsphere(cx: i64, cy: i64, cz: i64, s: i64, rings: i64, segs: i64, col: i64) -> i64
416func tm_figure(cx: i64, cy: i64, cz: i64, col: i64) -> i64
called by 1: main calls 1: tm_cube
434func trimesh_render(fb: *i64, zbuf: *i64, W: i64, H: i64, yaw: i64, pitch: i64, camz: i64, focal: i64, smooth: i64) -> i64
641func trimesh_zclear(zbuf: *i64, n: i64) -> i64 { var i: i64=0; while i<n { zbuf[i] = TM_MAGIC_2000000000; i=i+1 } return 0 }
called by 20: mainmainmainmainmainmain+14
643func trimesh_render_aa(fb: *i64, W: i64, H: i64, yaw: i64, pitch: i64, camz: i64, focal: i64, smooth: i64) -> i64