mrDIMAS

Vec3 C99

Oct 1st, 2015
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.45 KB | None | 0 0
  1. #ifndef _VECTOR3_
  2. #define _VECTOR3_
  3.  
  4. #include <math.h>
  5.  
  6. typedef struct TVec3 {
  7.     float x, y, z;
  8. } TVec3;
  9.  
  10. static inline TVec3 Vec3_Clamp( TVec3 vec, float min, float max ) {  
  11.     return (TVec3) { .x = ((vec.x < min) ? min : ((vec.x > max) ? max : vec.x )),
  12.                      .y = ((vec.y < min) ? min : ((vec.y > max) ? max : vec.y )),
  13.                      .z = ((vec.z < min) ? min : ((vec.z > max) ? max : vec.z ))};
  14. }
  15.  
  16. static inline TVec3 Vec3_Set( float x, float y, float z ) {
  17.     return (TVec3) { .x = x, .y = y, .z = z };
  18. }
  19.  
  20. static inline TVec3 Vec3_Zero( void ) {
  21.     return (TVec3) { .x = 0.0f, .y = 0.0f, .z = 0.0f };
  22. }
  23.  
  24. static inline TVec3 Vec3_Add( TVec3 a, TVec3 b ) {
  25.     return (TVec3) { .x = a.x + b.x, .y = a.y + b.y, .z = a.z + b.z };
  26. }
  27.  
  28. static inline TVec3 Vec3_Sub( TVec3 a, TVec3 b ) {
  29.     return (TVec3) { .x = a.x - b.x, .y = a.y - b.y, .z = a.z - b.z };
  30. }
  31.  
  32. static inline TVec3 Vec3_Mul( TVec3 a, TVec3 b ) {
  33.     return (TVec3) { .x = a.x * b.x, .y = a.y * b.y, .z = a.z * b.z };
  34. }
  35.  
  36. static inline TVec3 Vec3_Div( TVec3 a, TVec3 b ) {
  37.     return (TVec3) { .x = a.x / b.x, .y = a.y / b.y, .z = a.z / b.z };
  38. }
  39.  
  40. static inline TVec3 Vec3_Negate( TVec3 a ) {
  41.     return (TVec3) { .x = -a.x, .y = -a.y, .z = -a.z };
  42. }
  43.  
  44. static inline TVec3 Vec3_Middle( TVec3 a, TVec3 b ) {
  45.     return (TVec3) { .x = (a.x + b.x) * 0.5f, .y = (a.y + b.y) * 0.5f, .z = (a.z + b.z) * 0.5f };
  46. }
  47.  
  48. static inline TVec3 Vec3_Scale( TVec3 a, float scale ) {
  49.     return (TVec3) { .x = a.x * scale, .y = a.y * scale, .z = a.z * scale };
  50. }
  51.  
  52. static inline TVec3 Vec3_Cross( TVec3 a, TVec3 b ) {
  53.     return (TVec3) { .x = a.y * b.z - a.z * b.y, .y = a.z * b.x - a.x * b.z, .z = a.x * b.y - a.y * b.x };
  54. }
  55.  
  56. static inline TVec3 Vec3_Lerp( TVec3 a, TVec3 b, float t ) {
  57.     return (TVec3) { .x = a.x + ( b.x - a.x ) * t, .y = a.y + ( b.y - a.y ) * t, .z = a.z + ( b.z - a.z ) * t };
  58. }
  59.  
  60. static inline TVec3 Vec3_Min( TVec3 a, TVec3 b ) {
  61.     return ((a.x < b.x) || (a.y < b.y) || (a.z < b.z)) ? a : b;
  62. }
  63.  
  64. static inline TVec3 Vec3_Max( TVec3 a, TVec3 b ) {
  65.     return ((a.x > b.x) || (a.y > b.y) || (a.z > b.z)) ? a : b;
  66. }
  67.  
  68. static inline float Vec3_Length( TVec3 a ) {
  69.     return sqrt( a.x * a.x + a.y * a.y + a.z * a.z );
  70. }
  71.  
  72. static inline float Vec3_SqrLength( TVec3 a ) {
  73.     return a.x * a.x + a.y * a.y + a.z * a.z;
  74. }
  75.  
  76. static inline float Vec3_SqrDistance( TVec3 a, TVec3 b ) {
  77.     return Vec3_SqrLength( Vec3_Sub( a, b ) );
  78. }
  79.  
  80. static inline float Vec3_Distance( TVec3 a, TVec3 b ) {
  81.     return Vec3_Length( Vec3_Sub( a, b ));
  82. }
  83.  
  84. static inline float Vec3_Dot( TVec3 a, TVec3 b ) {
  85.     return a.x * b.x + a.y * b.y + a.z * b.z;
  86. }
  87.  
  88. static inline float Vec3_Angle( TVec3 a, TVec3 b ) {
  89.     //return acos( Vec3_Dot( a, b ) / (sqrt( Vec3_SqrLength( a ) * Vec3_SqrLength( b ))));
  90.     return acos( Vec3_Dot( a, b ) / ( Vec3_Length( a ) * Vec3_Length( b )));
  91. }
  92.  
  93. static inline TVec3 Vec3_Normalize( TVec3 a ) {
  94.     float length = Vec3_Length( a );
  95.     return (length > 0.000001f) ? (TVec3) { .x = a.x / length, .y = a.y / length, .z = a.z / length }
  96.                                 : (TVec3) { .x = a.x, .y = a.y, .z = a.z };
  97. }
  98.  
  99. static inline TVec3 Vec3_NormalizeEx( TVec3 a, float * len ) {
  100.     float length = Vec3_Length( a );
  101.     if( len ) *len = length;
  102.     return (length > 0.000001f) ? (TVec3) { .x = a.x / length, .y = a.y / length, .z = a.z / length }
  103.                                 : (TVec3) { .x = a.x, .y = a.y, .z = a.z };
  104. }
  105.  
  106. #endif
Advertisement
Add Comment
Please, Sign In to add comment