nx_beach_water_surface_gate.nx source
↩ module page · 71 lines · 3335 B
1import "nx_beach_water_surface.nx"
2import "nx_gate_verdict.nx"
3func main() -> i64 {
4 let c: *i64=gv_ctr()
5 let base: i64=sys_mmap(CRAFT_TOTAL) as i64
6 let ray: *BeachWaterRay=sys_mmap(__size_of(BeachWaterRay)) as *BeachWaterRay
7 hq_set(base,10,10,4*256); hq_set(base,11,10,8*256)
8 hq_set(base,10,11,4*256); hq_set(base,11,11,8*256)
9 ray.origin_y_q8=9*256; ray.origin_z_q8=10*256+128
10 ray.direction_y_q8=-256; ray.max_parameter_q16=4*65536
11 var fraction: i64=0
12 var mismatches: i64=0
13 var wet: i64=0
14 while fraction < 256 {
15 ray.origin_x_q8=10*256+fraction
16 let hit: i64=beach_water_hit(base,ray,7*256)
17 var expected: i64=-1
18 if fraction < 128 { expected=2*65536; wet=wet+1 }
19 if hit != expected { mismatches=mismatches+1 }
20 fraction=fraction+1
21 }
22 gv_check_eq("analytic slope shoreline across all Q8 subcell positions",mismatches,0,c)
23 gv_check_eq("shoreline divides the cell halfway",wet,128,c)
24 ray.origin_x_q8=10*256
25 ray.origin_y_q8=6*256; ray.direction_y_q8=256
26 gv_check_eq("underwater ray reaches surface",beach_water_hit(base,ray,7*256),65536,c)
27 ray.direction_y_q8=0
28 gv_check_eq("parallel ray has no isolated intersection",beach_water_hit(base,ray,7*256),-1,c)
29 ray.direction_y_q8=-256
30 gv_check_eq("ray facing away from surface misses",beach_water_hit(base,ray,7*256),-1,c)
31 ray.origin_y_q8=9*256; ray.max_parameter_q16=65536
32 gv_check_eq("caller ray interval is respected",beach_water_hit(base,ray,7*256),-1,c)
33 ray.max_parameter_q16=4*65536; ray.origin_x_q8=-256
34 gv_check_eq("missing terrain coverage is not invented ocean",beach_water_hit(base,ray,7*256),-1,c)
35 wc_spec(base,2)
36 let level: i64=(wsp(base)[P_WATER]+1)*256
37 ray.origin_y_q8=level+256; ray.direction_y_q8=-256
38 ray.max_parameter_q16=2*65536
39 var seed: i64=1
40 var checked: i64=0
41 var generatedMismatch: i64=0
42 while seed <= 16 {
43 gencol(base,10,10,10,10,seed);gencol(base,11,10,11,10,seed)
44 gencol(base,10,11,10,11,seed);gencol(base,11,11,11,11,seed)
45 fraction=0
46 while fraction < 256 {
47 ray.origin_x_q8=10*256+fraction
48 ray.origin_z_q8=10*256+255-fraction
49 let bed: i64=wc_surface_source(base,ray.origin_x_q8,ray.origin_z_q8)
50 let hit: i64=beach_water_hit(base,ray,level)
51 if bed >= level { if hit != -1 { generatedMismatch=generatedMismatch+1 } }
52 else { if bed >= 0 { if hit != 65536 { generatedMismatch=generatedMismatch+1 } } }
53 checked=checked+1;fraction=fraction+1
54 }
55 seed=seed+1
56 }
57 gv_kv("generated_samples",checked)
58 gv_kv("water_level_q8",level)
59 gv_check_eq("generated beach field water intersection coherence",generatedMismatch,0,c)
60 let packed: i64=pack_uniforms_impl(base)
61 let bytes: *u8=(base+O_URAW+UR_WATER_Q8*4) as *u8
62 let packedLevel: i64=(bytes[0] as i64)+((bytes[1] as i64)<<8)+((bytes[2] as i64)<<16)+((bytes[3] as i64)<<24)
63 gv_check_eq("native frame carries simulation water surface",packedLevel,level,c)
64 gv_check_eq("native frame allocation remains unchanged",packed*4,URAW_BYTES,c)
65 let spec: *i64=wsp(base)
66 spec[P_WATER]=3
67 pack_uniforms_impl(base)
68 let changedLevel: i64=(bytes[0] as i64)+((bytes[1] as i64)<<8)+((bytes[2] as i64)<<16)+((bytes[3] as i64)<<24)
69 gv_check_eq("water level changes propagate on next frame",changedLevel,4*256,c)
70 return gv_verdict("BEACH-WATER-SURFACE",c,"Continuous still-water geometry and native frame data only; no renderer, wave, optical or visual acceptance.")
71}