Clone of PhatAC @ https://github.com/floaterxk/PhatAC

MathLib.cpp 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include "StdAfx.h"
  2. #include "MathLib.h"
  3. #include "Frame.h"
  4. ULONG Vec2D::pack_size()
  5. {
  6. return(sizeof(float) * 2);
  7. }
  8. ULONG Vec2D::Pack(BYTE** ppData, ULONG iSize)
  9. {
  10. ULONG PackSize = pack_size();
  11. if (iSize >= PackSize)
  12. {
  13. PACK(float, x);
  14. PACK(float, y);
  15. }
  16. return PackSize;
  17. }
  18. BOOL Vec2D::UnPack(BYTE** ppData, ULONG iSize)
  19. {
  20. UNPACK(float, x);
  21. UNPACK(float, y);
  22. return TRUE;
  23. }
  24. Vector cross_product(const Vector& v1, const Vector& v2)
  25. {
  26. return Vector(v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x);
  27. }
  28. BOOL Vector::is_zero() const
  29. {
  30. if ((fabs(x) >= F_EPSILON) || (fabs(y) >= F_EPSILON) || (fabs(z) >= F_EPSILON))
  31. return FALSE;
  32. return TRUE;
  33. }
  34. float Vector::dot_product(const Vector& v) const
  35. {
  36. return((x * v.x) + (y * v.y) + (z * v.z));
  37. }
  38. BOOL Vector::normalize_check_small()
  39. {
  40. float nfactor = magnitude();
  41. if (nfactor < F_EPSILON)
  42. return TRUE; // Too small.
  43. nfactor = 1 / nfactor;
  44. x *= nfactor;
  45. y *= nfactor;
  46. z *= nfactor;
  47. return FALSE;
  48. }
  49. Vector& Vector::normalize()
  50. {
  51. float nfactor = 1 / magnitude();
  52. x *= nfactor;
  53. y *= nfactor;
  54. z *= nfactor;
  55. return *this;
  56. }
  57. BOOL Vector::IsValid() const
  58. {
  59. if (_isnan(x) || _isnan(y) || _isnan(z))
  60. return FALSE;
  61. return TRUE;
  62. }
  63. BOOL Quaternion::IsValid() const
  64. {
  65. if (_isnan(w) || _isnan(x) || _isnan(y) || _isnan(z))
  66. return FALSE;
  67. float magn = (w * w) + (x * x) + (y * y) + (z * z);
  68. if (_isnan(magn))
  69. return FALSE;
  70. if ((F_EPSILON * 5.0f) < fabs(magn - 1.0f))
  71. return FALSE;
  72. return TRUE;
  73. }
  74. void Quaternion::normalize()
  75. {
  76. float magn = 1 / magnitude();
  77. w *= magn;
  78. x *= magn;
  79. y *= magn;
  80. z *= magn;
  81. }
  82. float Quaternion::dot_product(const Quaternion& q) const
  83. {
  84. return((w * q.w) + (x * q.x) + (y * q.y) + (z * q.z));
  85. }
  86. Plane::Plane()
  87. {
  88. }
  89. Plane::Plane(Vector& Vect1, Vector& Vect2)
  90. {
  91. // Finish me
  92. __asm int 3;
  93. }
  94. float Plane::dot_product(const Vector& point)
  95. {
  96. return m_normal.dot_product(point) + m_dist;
  97. }
  98. ULONG Plane::pack_size()
  99. {
  100. return (m_normal.pack_size() + sizeof(float));
  101. }
  102. BOOL Plane::UnPack(BYTE** ppData, ULONG iSize)
  103. {
  104. if (iSize < pack_size())
  105. return FALSE;
  106. // Plane Normal
  107. UNPACK_OBJ(m_normal);
  108. // Plane Distance
  109. UNPACK(float, m_dist);
  110. return TRUE;
  111. }
  112. BOOL Plane::compute_time_of_intersection(const Ray& ray, float *time)
  113. {
  114. float dot = m_normal.dot_product(ray.m_direction);
  115. if (F_EPSILON > abs(dot))
  116. return FALSE;
  117. float depth = dot_product(ray.m_origin) * (-1.0 / dot);
  118. *time = depth;
  119. if (depth < 0.0f)
  120. return FALSE;
  121. return TRUE;
  122. }
  123. int Plane::which_side(const Vector& point, float near_dist)
  124. {
  125. float dp = dot_product(point);
  126. if (dp > near_dist)
  127. return 0;
  128. if (dp < -near_dist)
  129. return 1;
  130. return 2;
  131. }