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}