nx_beach_water_surface.nx source
↩ module page · 23 lines · 929 B
1// Continuous still-water geometry; Q8 coordinates and Q16 ray parameters.
2import "nx_wasm_craft.nx"
3struct BeachWaterRay {
4 origin_x_q8: i64,
5 origin_y_q8: i64,
6 origin_z_q8: i64,
7 direction_x_q8: i64,
8 direction_y_q8: i64,
9 direction_z_q8: i64,
10 max_parameter_q16: i64,
11}
12// Inputs are native arena values validated by their owning world boundary.
13// -1 is a miss; zero is contact at the surface. Waves and rendering remain separate.
14func beach_water_hit(base: i64, ray: *BeachWaterRay, level_q8: i64) -> i64 {
15 if ray.direction_y_q8 == 0 { return -1 }
16 let parameter: i64=(level_q8-ray.origin_y_q8)*65536/ray.direction_y_q8
17 if parameter < 0 || parameter > ray.max_parameter_q16 { return -1 }
18 let x: i64=ray.origin_x_q8+ray.direction_x_q8*parameter/65536
19 let z: i64=ray.origin_z_q8+ray.direction_z_q8*parameter/65536
20 let bed: i64=wc_surface_source(base,x,z)
21 if bed < 0 || bed >= level_q8 { return -1 }
22 return parameter
23}