| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- #include "iron_vec4.h"
- #include "iron_quat.h"
- #include <math.h>
- #include <iron_math.h>
- vec4_t vec4_create(float x, float y, float z, float w) {
- vec4_t v;
- v.x = x;
- v.y = y;
- v.z = z;
- v.w = w;
- return v;
- }
- vec4_t vec4_cross(vec4_t a, vec4_t b) {
- vec4_t v;
- v.x = a.y * b.z - a.z * b.y;
- v.y = a.z * b.x - a.x * b.z;
- v.z = a.x * b.y - a.y * b.x;
- return v;
- }
- vec4_t vec4_add(vec4_t a, vec4_t b) {
- a.x += b.x;
- a.y += b.y;
- a.z += b.z;
- a.w += b.w;
- return a;
- }
- vec4_t vec4_fadd(vec4_t a, float x, float y, float z, float w) {
- a.x += x;
- a.y += y;
- a.z += z;
- a.w += w;
- return a;
- }
- vec4_t vec4_norm(vec4_t a) {
- float n = vec4_len(a);
- if (n > 0.0) {
- float inv_n = 1.0f / n;
- a.x *= inv_n;
- a.y *= inv_n;
- a.z *= inv_n;
- }
- return a;
- }
- vec4_t vec4_mult(vec4_t a, float f) {
- a.x *= f;
- a.y *= f;
- a.z *= f;
- a.w *= f;
- return a;
- }
- float vec4_dot(vec4_t a, vec4_t b) {
- return a.x * b.x + a.y * b.y + a.z * b.z;
- }
- vec4_t vec4_clone(vec4_t v) {
- return v;
- }
- vec4_t vec4_lerp(vec4_t from, vec4_t to, float s) {
- vec4_t v;
- v.x = from.x + (to.x - from.x) * s;
- v.y = from.y + (to.y - from.y) * s;
- v.z = from.z + (to.z - from.z) * s;
- return v;
- }
- vec4_t vec4_apply_proj(vec4_t a, mat4_t m) {
- vec4_t v;
- float d = 1.0 / (m.m[3] * a.x + m.m[7] * a.y + m.m[11] * a.z + m.m[15]); // Perspective divide
- v.x = (m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12]) * d;
- v.y = (m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13]) * d;
- v.z = (m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14]) * d;
- return v;
- }
- vec4_t vec4_apply_mat(vec4_t a, mat4_t m) {
- vec4_t v;
- v.x = m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12];
- v.y = m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13];
- v.z = m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14];
- return v;
- }
- vec4_t vec4_apply_mat4(vec4_t a, mat4_t m) {
- vec4_t v;
- v.x = m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12] * a.w;
- v.y = m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13] * a.w;
- v.z = m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14] * a.w;
- v.w = m.m[3] * a.x + m.m[7] * a.y + m.m[11] * a.z + m.m[15] * a.w;
- return v;
- }
- vec4_t vec4_apply_axis_angle(vec4_t a, vec4_t axis, float angle) {
- quat_t q = quat_from_axis_angle(axis, angle);
- return vec4_apply_quat(a, q);
- }
- vec4_t vec4_apply_quat(vec4_t a, quat_t q) {
- vec4_t v;
- float ix = q.w * a.x + q.y * a.z - q.z * a.y;
- float iy = q.w * a.y + q.z * a.x - q.x * a.z;
- float iz = q.w * a.z + q.x * a.y - q.y * a.x;
- float iw = -q.x * a.x - q.y * a.y - q.z * a.z;
- v.x = ix * q.w + iw * -q.x + iy * -q.z - iz * -q.y;
- v.y = iy * q.w + iw * -q.y + iz * -q.x - ix * -q.z;
- v.z = iz * q.w + iw * -q.z + ix * -q.y - iy * -q.x;
- return v;
- }
- bool vec4_equals(vec4_t a, vec4_t b) {
- return a.x == b.x && a.y == b.y && a.z == b.z;
- }
- bool vec4_almost_equals(vec4_t a, vec4_t b, float prec) {
- return fabs(a.x - b.x) < prec && fabs(a.y - b.y) < prec && fabs(a.z - b.z) < prec;
- }
- float vec4_len(vec4_t a) {
- return sqrtf(a.x * a.x + a.y * a.y + a.z * a.z);
- }
- vec4_t vec4_sub(vec4_t a, vec4_t b) {
- a.x -= b.x;
- a.y -= b.y;
- a.z -= b.z;
- return a;
- }
- vec4_t vec4_exp(vec4_t a) {
- a.x = expf(a.x);
- a.y = expf(a.y);
- a.z = expf(a.z);
- return a;
- }
- float vec4_dist(vec4_t v1, vec4_t v2) {
- return vec4_fdist(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z);
- }
- float vec4_fdist(float v1x, float v1y, float v1z, float v2x, float v2y, float v2z) {
- float vx = v1x - v2x;
- float vy = v1y - v2y;
- float vz = v1z - v2z;
- return sqrtf(vx * vx + vy * vy + vz * vz);
- }
- vec4_t vec4_reflect(vec4_t a, vec4_t n) {
- float d = 2 * vec4_dot(a, n);
- a.x -= d * n.x;
- a.y -= d * n.y;
- a.z -= d * n.z;
- return a;
- }
- vec4_t vec4_clamp(vec4_t a, float min, float max) {
- float l = vec4_len(a);
- if (l < min) {
- return vec4_mult(vec4_norm(a), min);
- }
- else if (l > max) {
- return vec4_mult(vec4_norm(a), max);
- }
- return a;
- }
- vec4_t vec4_x_axis() {
- return vec4_create(1.0, 0.0, 0.0, 1.0);
- }
- vec4_t vec4_y_axis() {
- return vec4_create(0.0, 1.0, 0.0, 1.0);
- }
- vec4_t vec4_z_axis() {
- return vec4_create(0.0, 0.0, 1.0, 1.0);
- }
- vec4_t vec4_nan() {
- vec4_t v;
- v.x = NAN;
- return v;
- }
- bool vec4_isnan(vec4_t v) {
- return isnan(v.x);
- }
|