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
48
49
  | 
#ifndef VGLTF_MATHS_H
#define VGLTF_MATHS_H
typedef float vgltf_vec_value_type;
constexpr double VGLTF_MATHS_PI = 3.14159265358979323846;
#define VGLTF_MATHS_DEG_TO_RAD(deg) (deg * VGLTF_MATHS_PI / 180.0)
#define VGLTF_MAX(x, y) ((x) > (y) ? (x) : (y))
typedef struct {
  vgltf_vec_value_type x;
  vgltf_vec_value_type y;
} vgltf_vec2;
typedef struct {
  vgltf_vec_value_type x;
  vgltf_vec_value_type y;
  vgltf_vec_value_type z;
} vgltf_vec3;
vgltf_vec3 vgltf_vec3_sub(vgltf_vec3 lhs, vgltf_vec3 rhs);
vgltf_vec3 vgltf_vec3_cross(vgltf_vec3 lhs, vgltf_vec3 rhs);
vgltf_vec_value_type vgltf_vec3_dot(vgltf_vec3 lhs, vgltf_vec3 rhs);
vgltf_vec_value_type vgltf_vec3_length(vgltf_vec3 vec);
vgltf_vec3 vgltf_vec3_normalized(vgltf_vec3 vec);
typedef vgltf_vec_value_type vgltf_mat_value_type;
// row major
typedef vgltf_mat_value_type vgltf_mat4[16];
void vgltf_mat4_multiply(vgltf_mat4 out, vgltf_mat4 lhs, vgltf_mat4 rhs);
void vgltf_mat4_rotate(vgltf_mat4 out, vgltf_mat4 matrix,
                     vgltf_mat_value_type angle_radians, vgltf_vec3 axis);
void vgltf_mat4_look_at(vgltf_mat4 out, vgltf_vec3 eye_position,
                      vgltf_vec3 target_position, vgltf_vec3 up_axis);
void vgltf_mat4_perspective(vgltf_mat4 out, vgltf_mat_value_type fov,
                          vgltf_mat_value_type aspect_ratio,
                          vgltf_mat_value_type near, vgltf_mat_value_type far);
// clang-format off
#define VGLTF_MAT4_IDENTITY { \
  1, 0, 0, 0, \
  0, 1, 0, 0, \
  0, 0, 1, 0, \
  0, 0, 0, 1, \
}
// clang-format on
#endif // VGLTF_MATHS_H
  |