iron_vec4.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "iron_vec4.h"
  2. #include "iron_quat.h"
  3. #include <math.h>
  4. #include <iron_math.h>
  5. vec4_t vec4_create(float x, float y, float z, float w) {
  6. vec4_t v;
  7. v.x = x;
  8. v.y = y;
  9. v.z = z;
  10. v.w = w;
  11. return v;
  12. }
  13. vec4_t vec4_cross(vec4_t a, vec4_t b) {
  14. vec4_t v;
  15. v.x = a.y * b.z - a.z * b.y;
  16. v.y = a.z * b.x - a.x * b.z;
  17. v.z = a.x * b.y - a.y * b.x;
  18. return v;
  19. }
  20. vec4_t vec4_add(vec4_t a, vec4_t b) {
  21. a.x += b.x;
  22. a.y += b.y;
  23. a.z += b.z;
  24. a.w += b.w;
  25. return a;
  26. }
  27. vec4_t vec4_fadd(vec4_t a, float x, float y, float z, float w) {
  28. a.x += x;
  29. a.y += y;
  30. a.z += z;
  31. a.w += w;
  32. return a;
  33. }
  34. vec4_t vec4_norm(vec4_t a) {
  35. float n = vec4_len(a);
  36. if (n > 0.0) {
  37. float inv_n = 1.0f / n;
  38. a.x *= inv_n;
  39. a.y *= inv_n;
  40. a.z *= inv_n;
  41. }
  42. return a;
  43. }
  44. vec4_t vec4_mult(vec4_t a, float f) {
  45. a.x *= f;
  46. a.y *= f;
  47. a.z *= f;
  48. a.w *= f;
  49. return a;
  50. }
  51. float vec4_dot(vec4_t a, vec4_t b) {
  52. return a.x * b.x + a.y * b.y + a.z * b.z;
  53. }
  54. vec4_t vec4_clone(vec4_t v) {
  55. return v;
  56. }
  57. vec4_t vec4_lerp(vec4_t from, vec4_t to, float s) {
  58. vec4_t v;
  59. v.x = from.x + (to.x - from.x) * s;
  60. v.y = from.y + (to.y - from.y) * s;
  61. v.z = from.z + (to.z - from.z) * s;
  62. return v;
  63. }
  64. vec4_t vec4_apply_proj(vec4_t a, mat4_t m) {
  65. vec4_t v;
  66. float d = 1.0 / (m.m[3] * a.x + m.m[7] * a.y + m.m[11] * a.z + m.m[15]); // Perspective divide
  67. v.x = (m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12]) * d;
  68. v.y = (m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13]) * d;
  69. v.z = (m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14]) * d;
  70. return v;
  71. }
  72. vec4_t vec4_apply_mat(vec4_t a, mat4_t m) {
  73. vec4_t v;
  74. v.x = m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12];
  75. v.y = m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13];
  76. v.z = m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14];
  77. return v;
  78. }
  79. vec4_t vec4_apply_mat4(vec4_t a, mat4_t m) {
  80. vec4_t v;
  81. v.x = m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12] * a.w;
  82. v.y = m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13] * a.w;
  83. v.z = m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14] * a.w;
  84. v.w = m.m[3] * a.x + m.m[7] * a.y + m.m[11] * a.z + m.m[15] * a.w;
  85. return v;
  86. }
  87. vec4_t vec4_apply_axis_angle(vec4_t a, vec4_t axis, float angle) {
  88. quat_t q = quat_from_axis_angle(axis, angle);
  89. return vec4_apply_quat(a, q);
  90. }
  91. vec4_t vec4_apply_quat(vec4_t a, quat_t q) {
  92. vec4_t v;
  93. float ix = q.w * a.x + q.y * a.z - q.z * a.y;
  94. float iy = q.w * a.y + q.z * a.x - q.x * a.z;
  95. float iz = q.w * a.z + q.x * a.y - q.y * a.x;
  96. float iw = -q.x * a.x - q.y * a.y - q.z * a.z;
  97. v.x = ix * q.w + iw * -q.x + iy * -q.z - iz * -q.y;
  98. v.y = iy * q.w + iw * -q.y + iz * -q.x - ix * -q.z;
  99. v.z = iz * q.w + iw * -q.z + ix * -q.y - iy * -q.x;
  100. return v;
  101. }
  102. bool vec4_equals(vec4_t a, vec4_t b) {
  103. return a.x == b.x && a.y == b.y && a.z == b.z;
  104. }
  105. bool vec4_almost_equals(vec4_t a, vec4_t b, float prec) {
  106. return fabs(a.x - b.x) < prec && fabs(a.y - b.y) < prec && fabs(a.z - b.z) < prec;
  107. }
  108. float vec4_len(vec4_t a) {
  109. return sqrtf(a.x * a.x + a.y * a.y + a.z * a.z);
  110. }
  111. vec4_t vec4_sub(vec4_t a, vec4_t b) {
  112. a.x -= b.x;
  113. a.y -= b.y;
  114. a.z -= b.z;
  115. return a;
  116. }
  117. vec4_t vec4_exp(vec4_t a) {
  118. a.x = expf(a.x);
  119. a.y = expf(a.y);
  120. a.z = expf(a.z);
  121. return a;
  122. }
  123. float vec4_dist(vec4_t v1, vec4_t v2) {
  124. return vec4_fdist(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z);
  125. }
  126. float vec4_fdist(float v1x, float v1y, float v1z, float v2x, float v2y, float v2z) {
  127. float vx = v1x - v2x;
  128. float vy = v1y - v2y;
  129. float vz = v1z - v2z;
  130. return sqrtf(vx * vx + vy * vy + vz * vz);
  131. }
  132. vec4_t vec4_reflect(vec4_t a, vec4_t n) {
  133. float d = 2 * vec4_dot(a, n);
  134. a.x -= d * n.x;
  135. a.y -= d * n.y;
  136. a.z -= d * n.z;
  137. return a;
  138. }
  139. vec4_t vec4_clamp(vec4_t a, float min, float max) {
  140. float l = vec4_len(a);
  141. if (l < min) {
  142. return vec4_mult(vec4_norm(a), min);
  143. }
  144. else if (l > max) {
  145. return vec4_mult(vec4_norm(a), max);
  146. }
  147. return a;
  148. }
  149. vec4_t vec4_x_axis() {
  150. return vec4_create(1.0, 0.0, 0.0, 1.0);
  151. }
  152. vec4_t vec4_y_axis() {
  153. return vec4_create(0.0, 1.0, 0.0, 1.0);
  154. }
  155. vec4_t vec4_z_axis() {
  156. return vec4_create(0.0, 0.0, 1.0, 1.0);
  157. }
  158. vec4_t vec4_nan() {
  159. vec4_t v;
  160. v.x = NAN;
  161. return v;
  162. }
  163. bool vec4_isnan(vec4_t v) {
  164. return isnan(v.x);
  165. }