1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
type vertex = {
vx : float;
vy : float;
z : float;
u : float;
v : float;
inv_z : float;
u_over_z : float;
v_over_z : float;
normal : Vec3.t;
}
let vertex_of_view (camera : Camera.t) ~(width : int) ~(height : int)
((view_point, (u, v), normal) : Vec3.t * (float * float) * Vec3.t) : vertex option =
let (_px, _py, pz) = view_point in
let fsx = float_of_int width and fsy = float_of_int height in
match Camera.ndc camera ~aspect:(fsx /. fsy) view_point with
| None -> None
| Some (ndc_x, ndc_y) ->
let inv_z = 1. /. pz in
Some
{ vx = (fsx /. 2.) +. (ndc_x *. (fsx /. 2.));
vy = (fsy /. 2.) -. (ndc_y *. (fsy /. 2.));
z = pz;
u;
v;
inv_z;
u_over_z = u *. inv_z;
v_over_z = v *. inv_z;
normal;
}
let vertex (camera : Camera.t) ~(width : int) ~(height : int)
((point, uv, normal) : Vec3.t * (float * float) * Vec3.t) : vertex option =
vertex_of_view camera ~width ~height (Camera.view camera point, uv, normal)