diff options
Diffstat (limited to 'src/un_vec.c')
-rw-r--r-- | src/un_vec.c | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/src/un_vec.c b/src/un_vec.c new file mode 100644 index 0000000..1e1ccda --- /dev/null +++ b/src/un_vec.c @@ -0,0 +1,294 @@ + + + +/* + * + * vector from two vectors + * + * add + * sub + * + * add scalar + * sub scalar + * + * mul scalar + * div scalar + * + * distance + * discance sqr + * + * magnitude + * magnitude sqr + * + * dot, cross, surface_cross, normalize, reflect, flatten, project + * + * + * + */ + +void un_m_add2f(f32 *v, f32 *a, f32 *b) { + v[0] = a[0] + b[0]; + v[1] = a[1] + b[1]; +} + +void un_m_add3f(f32 *v, f32 *a, f32 *b) { + v[0] = a[0] + b[0]; + v[1] = a[1] + b[1]; + v[2] = a[2] + b[2]; +} + +void un_m_add4f(f32 *v, f32 *a, f32 *b) { + v[0] = a[0] + b[0]; + v[1] = a[1] + b[1]; + v[2] = a[2] + b[2]; + v[3] = a[3] + b[3]; +} + +void un_m_sub2f(f32 *v, f32 *a, f32 *b) { + v[0] = a[0] - b[0]; + v[1] = a[1] - b[1]; +} + +void un_m_sub3f(f32 *v, f32 *a, f32 *b) { + v[0] = a[0] - b[0]; + v[1] = a[1] - b[1]; + v[2] = a[2] - b[2]; +} + +void un_m_sub4f(f32 *v, f32 *a, f32 *b) { + v[0] = a[0] - b[0]; + v[1] = a[1] - b[1]; + v[2] = a[2] - b[2]; + v[3] = a[3] - b[3]; +} + +void un_m_add_scalar2f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] + scalar; + v[1] = a[1] + scalar; +} + +void un_m_add_scalar3f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] + scalar; + v[1] = a[1] + scalar; + v[2] = a[2] + scalar; +} + +void un_m_add_scalar4f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] + scalar; + v[1] = a[1] + scalar; + v[2] = a[2] + scalar; + v[3] = a[3] + scalar; +} + +void un_m_sub_scalar2f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] - scalar; + v[1] = a[1] - scalar; +} + +void un_m_sub_scalar3f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] - scalar; + v[1] = a[1] - scalar; + v[2] = a[2] - scalar; +} + +void un_m_sub_scalar4f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] - scalar; + v[1] = a[1] - scalar; + v[2] = a[2] - scalar; + v[3] = a[3] - scalar; +} + +void un_m_mul_scalar2f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] * scalar; + v[1] = a[1] * scalar; +} + +void un_m_mul_scalar3f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] * scalar; + v[1] = a[1] * scalar; + v[2] = a[2] * scalar; +} + +void un_m_mul_scalar4f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] * scalar; + v[1] = a[1] * scalar; + v[2] = a[2] * scalar; + v[3] = a[3] * scalar; +} + +void un_m_div_scalar2f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] / scalar; + v[1] = a[1] / scalar; +} + +void un_m_div_scalar3f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] / scalar; + v[1] = a[1] / scalar; + v[2] = a[2] / scalar; +} + +void un_m_div_scalar4f(f32 *v, f32 *a, f32 scalar) { + v[0] = a[0] / scalar; + v[1] = a[1] / scalar; + v[2] = a[2] / scalar; + v[3] = a[3] / scalar; +} + +void un_m_dot2f(f32 *v, f32 *a, f32 *b) { + *v = a[0] * b[0] + a[1] * b[1]; +} + +void un_m_dot3f(f32 *v, f32 *a, f32 *b) { + *v = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} + +void un_m_dot4f(f32 *v, f32 *a, f32 *b) { + *v = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; +} + +void un_m_hadamard2f(f32 *v, f32 *a, f32 *b) { + v[0] = a[0] * b[0]; + v[1] = a[1] * b[1]; +} + +void un_m_hadamard3f(f32 *v, f32 *a, f32 *b) { + v[0] = a[0] * b[0]; + v[1] = a[1] * b[1]; + v[2] = a[2] * b[2]; +} + +void un_m_hadamard4f(f32 *v, f32 *a, f32 *b) { + v[0] = a[0] * b[0]; + v[1] = a[1] * b[1]; + v[2] = a[2] * b[2]; + v[3] = a[3] * b[3]; +} + +void un_m_cross2f(f32 *v, f32 *a) { + v[0] = a[1]; + v[1] =-a[0]; +} + +void un_m_cross3f(f32 *v, f32 *a, f32 *b) { + v[0] = a[1] * b[2] - a[2] * b[1]; + v[1] = a[2] * b[0] - a[0] * b[2]; + v[2] = a[0] * b[1] - a[1] * b[0]; +} + +void un_m_magnitude2f(f32 *v, f32 *a) { + *v = sqrtf(a[0] * a[0] + a[1] * a[1]); +} + +void un_m_magnitude3f(f32 *v, f32 *a) { + *v = sqrtf(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); +} + +void un_m_magnitude4f(f32 *v, f32 *a) { + *v = sqrtf(a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3]); +} + +void un_m_magnitude_sqr2f(f32 *v, f32 *a) { + *v = a[0] * a[0] + a[1] * a[1]; +} + +void un_m_magnitude_sqr3f(f32 *v, f32 *a) { + *v = a[0] * a[0] + a[1] * a[1] + a[2] * a[2]; +} + +void un_m_magnitude_sqr4f(f32 *v, f32 *a) { + *v = a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3]; +} + + +void un_m_distance_sqr2f(f32 *v, f32 *a, f32 *b) { + f32 f[2]; + un_m_sub2f(f, b, a); + *v = f[0] * f[0] + f[1] * f[1]; +} + +void un_m_distance_sqr3f(f32 *v, f32 *a, f32 *b) { + f32 f[3]; + un_m_sub3f(f, b, a); + *v = f[0] * f[0] + f[1] * f[1] + f[2] * f[2]; +} + +void un_m_distance_sqr4f(f32 *v, f32 *a, f32 *b) { + f32 f[4]; + un_m_sub4f(f, b, a); + *v = f[0] * f[0] + f[1] * f[1] + f[2] * f[2] + f[3] * f[3]; +} + +void un_m_normalize2f(f32 *v, f32 *a) { + f32 f; + un_m_magnitude2f(&f, a); + v[0] /= f; + v[1] /= f; +} + +void un_m_normalize3f(f32 *v, f32 *a) { + f32 f; + un_m_magnitude3f(&f, a); + v[0] /= f; + v[1] /= f; + v[2] /= f; +} + +void un_m_normalize4f(f32 *v, f32 *a) { + f32 f; + un_m_magnitude4f(&f, a); + v[0] /= f; + v[1] /= f; + v[2] /= f; + v[3] /= f; +} + +void un_m_project2f(f32 *v, f32 *a, f32 *onto) { + f32 dot, magn, scale; + + un_m_dot2f(&dot, a, onto); + un_m_magnitude_sqr2f(&magn, onto); + + if (magn < EPSILON) { + un_memory_set((void*)v, 0, sizeof(*v) * 2); + return; + } + + scale = dot / magn; + v[0] = onto[0] * scale; + v[1] = onto[1] * scale; +} + +void un_m_project3f(f32 *v, f32 *a, f32 *onto) { + f32 dot, magn, scale; + + un_m_dot3f(&dot, a, onto); + un_m_magnitude_sqr3f(&magn, onto); + + if (magn < EPSILON) { + un_memory_set((void*)v, 0, sizeof(*v) * 3); + return; + } + + scale = dot / magn; + v[0] = onto[0] * scale; + v[1] = onto[1] * scale; + v[2] = onto[2] * scale; +} + +void un_m_project4f(f32 *v, f32 *a, f32 *onto) { + f32 dot, magn, scale; + + un_m_dot4f(&dot, a, onto); + un_m_magnitude_sqr4f(&magn, onto); + + if (magn < EPSILON) { + un_memory_set((void*)v, 0, sizeof(*v) * 4); + return; + } + + scale = dot / magn; + v[0] = onto[0] * scale; + v[1] = onto[1] * scale; + v[2] = onto[2] * scale; + v[3] = onto[3] * scale; +} |