code wiki / (root) / nx_eye_aperture_reuse_gate_t206.nx

nx_eye_aperture_reuse_gate_t206.nx source

↩ module page · 32 lines · 3095 B

1import "nx_wgsl.nx" 2import "nx_gate_verdict.nx" 3import "nx_cast_shader_src.nx" 4 5 6// Shared body/eye visibility predicate. Frame axes are caller-validated inverse semi-axes; 7// depth_axis is unit length. Points and origin share the current pose coordinate frame. 8// open_fraction is in [0,1]; zero is closed. Closed depth and ellipse boundaries are included. 9// This is geometric visibility, not a claim that an input outline is anatomical. 10func cs_aperture_reused_test(m:*i64,point:i64,origin:i64,right:i64,up:i64,depth_axis:i64,depth_min:i64,depth_max:i64,open_fraction:i64)->i64{ 11 let rel:i64=cs_v3sub(m,point,origin) 12 let x:i64=cs_dot(m,rel,right);let y:i64=cs_dot(m,rel,up);let z:i64=cs_dot(m,rel,depth_axis) 13 let oo:i64=cs_fmul(m,open_fraction,open_fraction) 14 let xy:i64=cs_fadd(m,cs_fmul(m,cs_fmul(m,x,x),oo),cs_fmul(m,y,y)) 15 let opening:i64=ws_and(m,ws_cmp(m,">" as *u8,open_fraction,ws_f(m,"0.0" as *u8)),ws_cmp(m,"<=" as *u8,xy,oo)) 16 return ws_and(m,opening,ws_and(m,ws_cmp(m,">=" as *u8,z,depth_min),ws_cmp(m,"<=" as *u8,z,depth_max))) 17} 18 19func main()->i64{ 20 let c:*i64=gv_ctr();let m:*i64=sir_new() 21 sir_uniform(m,"uPoint" as *u8,T_V3F,0);sir_uniform(m,"uOrigin" as *u8,T_V3F,0);sir_uniform(m,"uRight" as *u8,T_V3F,0);sir_uniform(m,"uUp" as *u8,T_V3F,0);sir_uniform(m,"uDepth" as *u8,T_V3F,0);sir_uniform(m,"uMin" as *u8,T_F32,0);sir_uniform(m,"uMax" as *u8,T_F32,0);sir_uniform(m,"uOpen" as *u8,T_F32,0);sir_fragout(m,"fc" as *u8,T_V4F,0) 22 let f:i64=sir_func(m,"main" as *u8,T_VOID) 23 let inside:i64=cs_aperture_reused_test(m,cs_v3(m,"uPoint" as *u8),cs_v3(m,"uOrigin" as *u8),cs_v3(m,"uRight" as *u8),cs_v3(m,"uUp" as *u8),cs_v3(m,"uDepth" as *u8),cs_fl(m,"uMin" as *u8),cs_fl(m,"uMax" as *u8),cs_fl(m,"uOpen" as *u8)) 24 let yes:i64=ws_set(m,ws_id(m,"fc" as *u8,T_V4F),ws_v4(m,ws_f(m,"1.0" as *u8),ws_f(m,"1.0" as *u8),ws_f(m,"1.0" as *u8),ws_f(m,"1.0" as *u8))) 25 let no:i64=ws_set(m,ws_id(m,"fc" as *u8,T_V4F),ws_v4(m,ws_f(m,"1.0" as *u8),ws_f(m,"0.0" as *u8),ws_f(m,"0.0" as *u8),ws_f(m,"1.0" as *u8))) 26 ws_st(m,f,ws_if(m,inside,yes,no)) 27 let a:*u8=sys_mmap(WG_EMIT_CAP);let t:*i64=sys_mmap(WG_TRACE_CAP*8) as *i64;let n:*i64=sys_mmap(8) as *i64;n[0]=0 28 let g:i64=glsl_emit_module(m,STAGE_FRAGMENT,a,WG_EMIT_CAP,t,WG_TRACE_CAP,n);gv_check("aperture-glsl-emits" as *u8,g>0,c);if g>0{sys_write(1,"APERTURE_GLSL_BEGIN\n" as *u8,20);sys_write(1,a,g);sys_write(1,"\nAPERTURE_GLSL_END\n" as *u8,19)} 29 n[0]=0;let w:i64=wgsl_emit_module(m,STAGE_FRAGMENT,a,WG_EMIT_CAP,t,WG_TRACE_CAP,n);gv_check("aperture-wgsl-emits" as *u8,w>0,c);if w>0{sys_write(1,"APERTURE_WGSL_BEGIN\n" as *u8,20);sys_write(1,a,w);sys_write(1,"\nAPERTURE_WGSL_END\n" as *u8,19)} 30 let layout:i64=wg_uniform_layout(m,a,0,WG_EMIT_CAP);gv_check("aperture-uniform-layout" as *u8,layout>0,c);if layout>0{var chars:i64=0;while chars<WG_EMIT_CAP&&a[chars]!=(0 as u8){chars=chars+1};gv_check("aperture-layout-text-complete" as *u8,chars<WG_EMIT_CAP,c);if chars<WG_EMIT_CAP{sys_write(1,a,chars)}} 31 return gv_verdict("eye-aperture-shared-expression" as *u8,c,"emission only; actual pixel and pose qualification separate" as *u8) 32}