kiba-engine
vec.h
1 #pragma once
2 
3 #include <kiba/core/types.h>
4 #include <kiba/math/math.h>
5 
6 typedef union {
7  struct {
8  f32 x, y, z;
9  };
10 
11  struct {
12  f32 r, g, b;
13  };
14 
15  struct {
16  f32 _v0, _v1, _v2;
17  };
18 
19  f32 raw[3];
20 } vec3;
21 
22 STATIC_ASSERT(sizeof(vec3) == sizeof(float[3]), "vec3's general layout must be identical to its raw format");
23 
24 static inline vec3 vec3_create(f32 x, f32 y, f32 z) {
25  return (vec3){
26  .x = x,
27  .y = y,
28  .z = z,
29  };
30 }
31 
32 static inline vec3 vec3_add(vec3 v1, vec3 v2) {
33  v1.x += v2.x;
34  v1.y += v2.y;
35  v1.z += v2.z;
36  return v1;
37 }
38 
39 static inline vec3 vec3_sub(vec3 v1, vec3 v2) {
40  v1.x -= v2.x;
41  v1.y -= v2.y;
42  v1.z -= v2.z;
43  return v1;
44 }
45 
46 static inline vec3 vec3_mul(vec3 v1, vec3 v2) {
47  v1.x *= v2.x;
48  v1.y *= v2.y;
49  v1.z *= v2.z;
50  return v1;
51 }
52 
53 static inline vec3 vec3_div(vec3 v1, vec3 v2) {
54  v1.x /= v2.x;
55  v1.y /= v2.y;
56  v1.z /= v2.z;
57  return v1;
58 }
59 
60 static inline vec3 vec3_cross_product(vec3 v1, vec3 v2) {
61  // TODO check created assembly
62  return vec3_sub(vec3_create(v1.y * v2.z, v1.z * v2.x, v1.x * v2.y),
63  vec3_create(v1.z * v2.y, v1.x * v2.z, v1.y * v2.x));
64  /*return (vec3){
65  .x = v1.y * v2.z - v1.z * v2.y,
66  .y = v1.z * v2.x - v1.x * v2.z,
67  .z = v1.x * v2.y - v1.y * v2.x,
68  };*/
69 }
70 
71 static inline f32 vec3_dot(vec3 v1, vec3 v2) { return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; }
72 
73 static inline vec3 vec3_add_scalar(vec3 v, f32 s) {
74  v.x += s;
75  v.y += s;
76  v.z += s;
77  return v;
78 }
79 
80 static inline vec3 vec3_sub_scalar(vec3 v, f32 s) {
81  v.x -= s;
82  v.y -= s;
83  v.z -= s;
84  return v;
85 }
86 
87 static inline vec3 vec3_mul_scalar(vec3 v, f32 s) {
88  v.x *= s;
89  v.y *= s;
90  v.z *= s;
91  return v;
92 }
93 
94 static inline vec3 vec3_div_scalar(vec3 v, f32 s) {
95  v.x /= s;
96  v.y /= s;
97  v.z /= s;
98  return v;
99 }
100 
101 static inline f32 vec3_length(vec3 v) { return f32_sqrt(v.x * v.x + v.y * v.y + v.z * v.z); }
102 
103 // TODO add fast normalization using fast inverse of length
104 static inline vec3 vec3_normalize(vec3 v) { return vec3_div_scalar(v, vec3_length(v)); }
105 
106 typedef union {
107  struct {
108  f32 x, y, z, w;
109  };
110 
111  struct {
112  f32 r, g, b, a;
113  };
114 
115  struct {
116  f32 _v0, _v1, _v2, _v3;
117  };
118 } vec4;
119 
120 static inline vec4 vec4_create(f32 x, f32 y, f32 z, f32 w) {
121  return (vec4){
122  .x = x,
123  .y = y,
124  .z = z,
125  .w = w,
126  };
127 }
128 
129 static inline vec4 vec4_from_vec3(vec3 v, f32 w) { return vec4_create(v.x, v.y, v.z, w); }
#define STATIC_ASSERT
Performs a static assert.
Definition: log.h:75
Definition: vec.h:6
Definition: vec.h:106