code wiki / _hdl_build / nx_meshgen_analytic_gate_t336.nx
nx_meshgen_analytic_gate_t336.nx source
↩ module page · 35 lines · 2140 B
1// Independent analytic field fixtures for the shared mesher orientation candidate.
2import "nx_meshgen_orientation_candidate_t336.nx"
3import "nx_meshcheck.nx"
4import "nx_gate_verdict.nx"
5func main()->i64{
6 let ctr:*i64=gv_ctr();gv_head("shared mesher analytic closed fields")
7 let f:*i64=sys_mmap((MG_N+1)*(MG_N+1)*(MG_N+1)*8) as *i64
8 let cv:*i64=sys_mmap(MG_N*MG_N*MG_N*8) as *i64
9 let v:*i64=sys_mmap(MG_MAXV*3*8) as *i64;let t:*i64=sys_mmap(MG_MAXF*3*8) as *i64;let o:*i64=sys_mmap(16) as *i64
10 let co:*i64=sys_mmap(MC_O_SLOTS*8) as *i64;let cl:*i64=sys_mmap(mc_list_slots()*8) as *i64
11 var fixture:i64=0
12 while fixture<2{
13 var i:i64=0;while i<=MG_N{var j:i64=0;while j<=MG_N{var k:i64=0;while k<=MG_N{
14 let x:i64=mg_wc(i);let y:i64=mg_wc(j);let z:i64=mg_wc(k)
15 if fixture==0{f[mg_fi(i,j,k)]=x*x+y*y+z*z-300*300}else{
16 var d:i64=sdf_abs(x)-300;let dy:i64=sdf_abs(y)-300;let dz:i64=sdf_abs(z)-300
17 if dy>d{d=dy}if dz>d{d=dz}f[mg_fi(i,j,k)]=d
18 }k=k+1}j=j+1}i=i+1}
19 mg_extract(f,cv,v,t,o);let rc:i64=mc_check(v,o[0],t,o[1],co,cl)
20 gv_puts("fixture=");gv_num(fixture);gv_puts(" vertices=");gv_num(o[0]);gv_puts(" tris=");gv_num(o[1]);gv_puts(" winding=");gv_num(co[MC_O_WINDING]);gv_puts(" boundary=");gv_num(co[MC_O_BOUNDARY]);gv_puts(" nonmanifold=");gv_num(co[MC_O_NONMANIFOLD]);gv_puts(" degen=");gv_num(co[MC_O_DEGEN_AREA]);gv_puts("\n")
21 gv_subjects("analytic closed field triangles",o[1],ctr)
22 gv_check("actual edge checker clean and watertight",rc==MC_CLEAN && mc_watertight(co)==1,ctr)
23 var inward:i64=0;var q:i64=0
24 while q<o[1]{
25 let a:i64=t[q*3]*3;let b:i64=t[q*3+1]*3;let c:i64=t[q*3+2]*3
26 let ux:i64=v[b]-v[a];let uy:i64=v[b+1]-v[a+1];let uz:i64=v[b+2]-v[a+2]
27 let wx:i64=v[c]-v[a];let wy:i64=v[c+1]-v[a+1];let wz:i64=v[c+2]-v[a+2]
28 let dot:i64=(uy*wz-uz*wy)*(v[a]+v[b]+v[c])+(uz*wx-ux*wz)*(v[a+1]+v[b+1]+v[c+1])+(ux*wy-uy*wx)*(v[a+2]+v[b+2]+v[c+2])
29 if dot<=0{inward=inward+1}q=q+1
30 }
31 gv_check("every convex fixture triangle faces outward",inward==0,ctr)
32 fixture=fixture+1
33 }
34 return gv_verdict("shared-mesher-analytic",ctr,"sphere and box actual edge-incidence plus outward orientation")
35}