vec.c (5034B)
1 #include "vec.h" 2 3 #include <math.h> 4 5 f32 radians(f32 degrees) 6 { 7 return degrees * (M_PI / 180.0f); 8 } 9 10 b8 IVec3_equal(const IVec3 a, const IVec3 b) 11 { 12 return (a[0] == b[0]) & (a[1] == b[1]) & (a[2] == b[2]); 13 } 14 15 void Vec3_set(f32 x, f32 y, f32 z, Vec3 dst) 16 { 17 dst[0] = x; 18 dst[1] = y; 19 dst[2] = z; 20 } 21 22 void Vec3_scale(const Vec3 src, f32 scale, Vec3 dst) 23 { 24 dst[0] = src[0] * scale; 25 dst[1] = src[1] * scale; 26 dst[2] = src[2] * scale; 27 } 28 29 void Vec3_add(const Vec3 src_a, const Vec3 src_b, Vec3 dst) 30 { 31 dst[0] = src_a[0] + src_b[0]; 32 dst[1] = src_a[1] + src_b[1]; 33 dst[2] = src_a[2] + src_b[2]; 34 } 35 36 void Vec3_sub(const Vec3 src_a, const Vec3 src_b, Vec3 dst) 37 { 38 dst[0] = src_a[0] - src_b[0]; 39 dst[1] = src_a[1] - src_b[1]; 40 dst[2] = src_a[2] - src_b[2]; 41 } 42 43 void Vec3_mul(const Vec3 src_a, const Vec3 src_b, Vec3 dst) 44 { 45 dst[0] = src_a[1] * src_b[2] - src_a[2] * src_b[1]; 46 dst[1] = src_a[2] * src_b[0] - src_a[0] * src_b[2]; 47 dst[2] = src_a[0] * src_b[1] - src_a[1] * src_b[0]; 48 } 49 50 void Vec3_normalize(const Vec3 src, Vec3 dst) 51 { 52 f32 m = Vec3_mag(src); 53 if (m > 0.0f) 54 { 55 dst[0] = src[0] / m; 56 dst[1] = src[1] / m; 57 dst[2] = src[2] / m; 58 } 59 } 60 61 f32 Vec3_dot(const Vec3 src_a, const Vec3 src_b) 62 { 63 return src_a[0] * src_b[0] + src_a[1] * src_b[1] + src_a[2] * src_b[2]; 64 } 65 66 f32 Vec3_magSquared(const Vec3 src) 67 { 68 return Vec3_dot(src, src); 69 } 70 71 f32 Vec3_mag(const Vec3 src) 72 { 73 return sqrtf(Vec3_magSquared(src)); 74 } 75 76 void Mat4_mul(const Mat4 src_a, const Mat4 src_b, Mat4 dst) 77 { 78 // x basis 79 dst[0][0] = src_a[0][0] * src_b[0][0] + src_a[1][0] * src_b[0][1] + src_a[2][0] * src_b[0][2] + src_a[3][0] * src_b[0][3]; 80 dst[0][1] = src_a[0][1] * src_b[0][0] + src_a[1][1] * src_b[0][1] + src_a[2][1] * src_b[0][2] + src_a[3][1] * src_b[0][3]; 81 dst[0][2] = src_a[0][2] * src_b[0][0] + src_a[1][2] * src_b[0][1] + src_a[2][2] * src_b[0][2] + src_a[3][2] * src_b[0][3]; 82 dst[0][3] = src_a[0][3] * src_b[0][0] + src_a[1][3] * src_b[0][1] + src_a[2][3] * src_b[0][2] + src_a[3][3] * src_b[0][3]; 83 84 // y basis 85 dst[1][0] = src_a[0][0] * src_b[1][0] + src_a[1][0] * src_b[1][1] + src_a[2][0] * src_b[1][2] + src_a[3][0] * src_b[1][3]; 86 dst[1][1] = src_a[0][1] * src_b[1][0] + src_a[1][1] * src_b[1][1] + src_a[2][1] * src_b[1][2] + src_a[3][1] * src_b[1][3]; 87 dst[1][2] = src_a[0][2] * src_b[1][0] + src_a[1][2] * src_b[1][1] + src_a[2][2] * src_b[1][2] + src_a[3][2] * src_b[1][3]; 88 dst[1][3] = src_a[0][3] * src_b[1][0] + src_a[1][3] * src_b[1][1] + src_a[2][3] * src_b[1][2] + src_a[3][3] * src_b[1][3]; 89 90 // z basis 91 dst[2][0] = src_a[0][0] * src_b[2][0] + src_a[1][0] * src_b[2][1] + src_a[2][0] * src_b[2][2] + src_a[3][0] * src_b[2][3]; 92 dst[2][1] = src_a[0][1] * src_b[2][0] + src_a[1][1] * src_b[2][1] + src_a[2][1] * src_b[2][2] + src_a[3][1] * src_b[2][3]; 93 dst[2][2] = src_a[0][2] * src_b[2][0] + src_a[1][2] * src_b[2][1] + src_a[2][2] * src_b[2][2] + src_a[3][2] * src_b[2][3]; 94 dst[2][3] = src_a[0][3] * src_b[2][0] + src_a[1][3] * src_b[2][1] + src_a[2][3] * src_b[2][2] + src_a[3][3] * src_b[2][3]; 95 96 // w basis 97 dst[3][0] = src_a[0][0] * src_b[3][0] + src_a[1][0] * src_b[3][1] + src_a[2][0] * src_b[3][2] + src_a[3][0] * src_b[3][3]; 98 dst[3][1] = src_a[0][1] * src_b[3][0] + src_a[1][1] * src_b[3][1] + src_a[2][1] * src_b[3][2] + src_a[3][1] * src_b[3][3]; 99 dst[3][2] = src_a[0][2] * src_b[3][0] + src_a[1][2] * src_b[3][1] + src_a[2][2] * src_b[3][2] + src_a[3][2] * src_b[3][3]; 100 dst[3][3] = src_a[0][3] * src_b[3][0] + src_a[1][3] * src_b[3][1] + src_a[2][3] * src_b[3][2] + src_a[3][3] * src_b[3][3]; 101 } 102 103 void Mat4_lookAt(const Vec3 camera, const Vec3 target, const Vec3 up, Mat4 dst) 104 { 105 Vec3 f; 106 Vec3_sub(target, camera, f); 107 Vec3_normalize(f, f); 108 109 Vec3 s; 110 Vec3_mul(f, up, s); 111 Vec3_normalize(s, s); 112 113 Vec3 u; 114 Vec3_mul(s, f, u); 115 Vec3_normalize(s, s); 116 117 // x basis 118 dst[0][0] = s[0]; 119 dst[0][1] = u[0]; 120 dst[0][2] = -f[0]; 121 dst[0][3] = 0.0f; 122 123 // y basis 124 dst[1][0] = s[1]; 125 dst[1][1] = u[1]; 126 dst[1][2] = -f[1]; 127 dst[1][3] = 0.0f; 128 129 // z basis 130 dst[2][0] = s[2]; 131 dst[2][1] = u[2]; 132 dst[2][2] = -f[2]; 133 dst[2][3] = 0.0f; 134 135 // w basis 136 dst[3][0] = -Vec3_dot(s, camera); 137 dst[3][1] = -Vec3_dot(u, camera); 138 dst[3][2] = Vec3_dot(f, camera); 139 dst[3][3] = 1.0f; 140 } 141 142 void Mat4_perspective(f32 fov, f32 aspect, f32 near, f32 far, Mat4 dst) 143 { 144 f32 tan_half_fov = tanf(fov * 0.5f); 145 146 // x basis 147 dst[0][0] = 1.0f / (aspect * tan_half_fov); 148 dst[0][1] = 0.0f; 149 dst[0][2] = 0.0f; 150 dst[0][3] = 0.0f; 151 152 // y basis 153 dst[1][0] = 0.0f; 154 dst[1][1] = 1.0f / (tan_half_fov); 155 dst[1][2] = 0.0f; 156 dst[1][3] = 0.0f; 157 158 // z basis 159 dst[2][0] = 0.0f; 160 dst[2][1] = 0.0f; 161 dst[2][2] = -(far + near) / (far - near); 162 dst[2][3] = -1.0f; 163 164 // w basis 165 dst[3][0] = 0.0f; 166 dst[3][1] = 0.0f; 167 dst[3][2] = -(2 * far * near) / (far - near); 168 dst[3][3] = 0.0f; 169 } 170