Plane.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /******************************************************************************
  2. Use 'Plane2' to handle 2D planes, Flt type
  3. Use 'Plane' to handle 3D planes, Flt type
  4. Use 'PlaneD2' to handle 2D planes, Dbl type
  5. Use 'PlaneD' to handle 3D planes, Dbl type
  6. /******************************************************************************/
  7. struct Plane2 // Plane 2D
  8. {
  9. Vec2 pos , // plane position
  10. normal; // plane normal
  11. Plane2& set(C Vec2 &pos, C Vec2 &normal) {T.pos=pos; T.normal=normal; return T;}
  12. Plane2() {}
  13. Plane2(C Vec2 &pos, C Vec2 &normal) {set(pos, normal);}
  14. };
  15. /******************************************************************************/
  16. struct PlaneD2 // Plane 2D (double precision)
  17. {
  18. VecD2 pos , // plane position
  19. normal; // plane normal
  20. PlaneD2& set(C VecD2 &pos, C VecD2 &normal) {T.pos=pos; T.normal=normal; return T;}
  21. PlaneD2() {}
  22. PlaneD2(C VecD2 &pos, C VecD2 &normal) {set(pos, normal);}
  23. };
  24. /******************************************************************************/
  25. struct Plane // Plane 3D
  26. {
  27. Vec pos , // plane position
  28. normal; // plane normal
  29. Plane& set(C Vec &pos, C Vec &normal) {T.pos=pos; T.normal=normal; return T;}
  30. Plane& operator+=(C Vec &d) {T.pos+=d; return T;}
  31. Plane& operator-=(C Vec &d) {T.pos-=d; return T;}
  32. friend Plane operator+ (C Plane &plane, C Vec &d) {return Plane(plane)+=d;}
  33. friend Plane operator- (C Plane &plane, C Vec &d) {return Plane(plane)-=d;}
  34. // get
  35. Str asText()C {return S+"Pos: "+pos+", Normal: "+normal;} // get text description
  36. // draw
  37. void drawLocal (C Color &color, Flt size, Bool fill=false, Int resolution=-1)C; // this relies on active object matrix which can be set using 'SetMatrix' function
  38. void drawInfiniteBySize (C Color &color, Flt cell_size )C; // this relies on active object matrix which can be set using 'SetMatrix' function
  39. void drawInfiniteByResolution(C Color &color, Int resolution=-1)C; // this relies on active object matrix which can be set using 'SetMatrix' function
  40. Plane() {}
  41. Plane(C Vec &pos,C Vec &normal) {set(pos, normal);}
  42. };
  43. /******************************************************************************/
  44. struct PlaneM // Plane 3D (mixed precision)
  45. {
  46. VecD pos ; // plane position
  47. Vec normal; // plane normal
  48. PlaneM& set(C VecD &pos, C Vec &normal) {T.pos=pos; T.normal=normal; return T;}
  49. PlaneM() {}
  50. PlaneM(C VecD &pos, C Vec &normal) {set(pos, normal);}
  51. };
  52. /******************************************************************************/
  53. struct PlaneD // Plane 3D (double precision)
  54. {
  55. VecD pos , // plane position
  56. normal; // plane normal
  57. PlaneD& set(C VecD &pos, C VecD &normal) {T.pos=pos; T.normal=normal; return T;}
  58. PlaneD() {}
  59. PlaneD(C VecD &pos, C VecD &normal) {set(pos, normal);}
  60. };
  61. /******************************************************************************/
  62. // distance between point and a plane ('plane_normal' must be normalized)
  63. inline Flt DistPointPlane(C Vec2 &point, C Vec2 &plane_normal) {return Dot(point, plane_normal);} // this function assumes that plane position is Vec2 (0,0)
  64. inline Dbl DistPointPlane(C VecD2 &point, C VecD2 &plane_normal) {return Dot(point, plane_normal);} // this function assumes that plane position is VecD2(0,0)
  65. inline Flt DistPointPlane(C Vec &point, C Vec &plane_normal) {return Dot(point, plane_normal);} // this function assumes that plane position is Vec (0,0,0)
  66. inline Dbl DistPointPlane(C VecD &point, C Vec &plane_normal) {return Dot(point, plane_normal);} // this function assumes that plane position is VecD (0,0,0)
  67. inline Dbl DistPointPlane(C VecD &point, C VecD &plane_normal) {return Dot(point, plane_normal);} // this function assumes that plane position is VecD (0,0,0)
  68. Flt DistPointPlane(C Vec2 &point, C Vec2 &plane_pos, C Vec2 &plane_normal);
  69. Dbl DistPointPlane(C VecD2 &point, C VecD2 &plane_pos, C VecD2 &plane_normal);
  70. Flt DistPointPlane(C Vec &point, C Vec &plane_pos, C Vec &plane_normal);
  71. Dbl DistPointPlane(C Vec &point, C VecD &plane_pos, C Vec &plane_normal);
  72. Dbl DistPointPlane(C VecD &point, C Vec &plane_pos, C Vec &plane_normal);
  73. Dbl DistPointPlane(C VecD &point, C VecD &plane_pos, C Vec &plane_normal);
  74. Dbl DistPointPlane(C VecD &point, C VecD &plane_pos, C VecD &plane_normal);
  75. // distance between point and a plane using 'ray' movement directions ('plane_normal' and 'ray' must be normalized)
  76. Flt DistPointPlaneRay(C Vec2 &point, C Vec2 &plane_normal, C Vec2 &ray); // this function assumes that plane position is Vec2 (0,0)
  77. Dbl DistPointPlaneRay(C VecD2 &point, C VecD2 &plane_normal, C VecD2 &ray); // this function assumes that plane position is VecD2(0,0)
  78. Flt DistPointPlaneRay(C Vec &point, C Vec &plane_normal, C Vec &ray); // this function assumes that plane position is Vec (0,0,0)
  79. Dbl DistPointPlaneRay(C VecD &point, C Vec &plane_normal, C Vec &ray); // this function assumes that plane position is VecD (0,0,0)
  80. Dbl DistPointPlaneRay(C VecD &point, C VecD &plane_normal, C VecD &ray); // this function assumes that plane position is VecD (0,0,0)
  81. Flt DistPointPlaneRay(C Vec2 &point, C Vec2 &plane_pos, C Vec2 &plane_normal, C Vec2 &ray);
  82. Dbl DistPointPlaneRay(C VecD2 &point, C VecD2 &plane_pos, C VecD2 &plane_normal, C VecD2 &ray);
  83. Flt DistPointPlaneRay(C Vec &point, C Vec &plane_pos, C Vec &plane_normal, C Vec &ray);
  84. Dbl DistPointPlaneRay(C VecD &point, C VecD &plane_pos, C Vec &plane_normal, C Vec &ray);
  85. Dbl DistPointPlaneRay(C VecD &point, C VecD &plane_pos, C VecD &plane_normal, C VecD &ray);
  86. // distance between point and a plane using Y axis movement vector ('plane_normal' must be normalized)
  87. Flt DistPointPlaneY(C Vec &point, C Vec &plane_normal); // this function assumes that plane position is Vec (0,0,0)
  88. Dbl DistPointPlaneY(C VecD &point, C Vec &plane_normal); // this function assumes that plane position is VecD(0,0,0)
  89. Dbl DistPointPlaneY(C VecD &point, C VecD &plane_normal); // this function assumes that plane position is VecD(0,0,0)
  90. Flt DistPointPlaneY(C Vec &point, C Vec &plane_pos, C Vec &plane_normal);
  91. Dbl DistPointPlaneY(C VecD &point, C VecD &plane_pos, C Vec &plane_normal);
  92. Dbl DistPointPlaneY(C VecD &point, C VecD &plane_pos, C VecD &plane_normal);
  93. // distance between point and a plane
  94. inline Flt Dist(C Vec2 &point, C Plane2 &plane) {return DistPointPlane(point, plane.pos, plane.normal);}
  95. inline Dbl Dist(C VecD2 &point, C PlaneD2 &plane) {return DistPointPlane(point, plane.pos, plane.normal);}
  96. inline Flt Dist(C Vec &point, C Plane &plane) {return DistPointPlane(point, plane.pos, plane.normal);}
  97. inline Dbl Dist(C Vec &point, C PlaneM &plane) {return DistPointPlane(point, plane.pos, plane.normal);}
  98. inline Dbl Dist(C VecD &point, C PlaneM &plane) {return DistPointPlane(point, plane.pos, plane.normal);}
  99. inline Dbl Dist(C VecD &point, C PlaneD &plane) {return DistPointPlane(point, plane.pos, plane.normal);}
  100. // if point cuts a plane
  101. inline Bool Cuts(C Vec2 &point, C Plane2 &plane) {return Dist(point, plane)<=0;}
  102. inline Bool Cuts(C VecD2 &point, C PlaneD2 &plane) {return Dist(point, plane)<=0;}
  103. inline Bool Cuts(C Vec &point, C Plane &plane) {return Dist(point, plane)<=0;}
  104. inline Bool Cuts(C VecD &point, C PlaneD &plane) {return Dist(point, plane)<=0;}
  105. // return point casted on the plane along the 'plane_normal' ('plane_normal' must be normalized)
  106. Vec2 PointOnPlane(C Vec2 &point, C Vec2 &plane_normal); // this function assumes that plane position is Vec2 (0,0)
  107. VecD2 PointOnPlane(C VecD2 &point, C VecD2 &plane_normal); // this function assumes that plane position is VecD2(0,0)
  108. Vec PointOnPlane(C Vec &point, C Vec &plane_normal); // this function assumes that plane position is Vec (0,0,0)
  109. VecD PointOnPlane(C VecD &point, C VecD &plane_normal); // this function assumes that plane position is VecD (0,0,0)
  110. Vec2 PointOnPlane(C Vec2 &point, C Vec2 &plane_pos, C Vec2 &plane_normal);
  111. VecD2 PointOnPlane(C VecD2 &point, C VecD2 &plane_pos, C VecD2 &plane_normal);
  112. Vec PointOnPlane(C Vec &point, C Vec &plane_pos, C Vec &plane_normal);
  113. VecD PointOnPlane(C Vec &point, C VecD &plane_pos, C Vec &plane_normal);
  114. VecD PointOnPlane(C VecD &point, C Vec &plane_pos, C Vec &plane_normal);
  115. VecD PointOnPlane(C VecD &point, C VecD &plane_pos, C Vec &plane_normal);
  116. VecD PointOnPlane(C VecD &point, C VecD &plane_pos, C VecD &plane_normal);
  117. // return point casted on the plane along the 'ray' movement vector ('plane_normal' and 'ray' must be normalized)
  118. Vec2 PointOnPlaneRay(C Vec2 &point, C Vec2 &plane_normal, C Vec2 &ray); // this function assumes that plane position is Vec2 (0,0,0)
  119. VecD2 PointOnPlaneRay(C VecD2 &point, C VecD2 &plane_normal, C VecD2 &ray); // this function assumes that plane position is VecD2(0,0,0)
  120. Vec PointOnPlaneRay(C Vec &point, C Vec &plane_normal, C Vec &ray); // this function assumes that plane position is Vec (0,0,0)
  121. VecD PointOnPlaneRay(C VecD &point, C Vec &plane_normal, C Vec &ray); // this function assumes that plane position is VecD (0,0,0)
  122. VecD PointOnPlaneRay(C VecD &point, C VecD &plane_normal, C VecD &ray); // this function assumes that plane position is VecD (0,0,0)
  123. Vec2 PointOnPlaneRay(C Vec2 &point, C Vec2 &plane_pos, C Vec2 &plane_normal, C Vec2 &ray);
  124. VecD2 PointOnPlaneRay(C VecD2 &point, C VecD2 &plane_pos, C VecD2 &plane_normal, C VecD2 &ray);
  125. Vec PointOnPlaneRay(C Vec &point, C Vec &plane_pos, C Vec &plane_normal, C Vec &ray);
  126. VecD PointOnPlaneRay(C VecD &point, C VecD &plane_pos, C Vec &plane_normal, C Vec &ray);
  127. VecD PointOnPlaneRay(C VecD &point, C VecD &plane_pos, C VecD &plane_normal, C VecD &ray);
  128. // return point casted on the plane along the Y axis movement vector ('plane_normal' must be normalized)
  129. Vec PointOnPlaneY(C Vec &point, C Vec &plane_normal); // this function assumes that plane position is Vec (0,0,0)
  130. VecD PointOnPlaneY(C VecD &point, C Vec &plane_normal); // this function assumes that plane position is VecD(0,0,0)
  131. VecD PointOnPlaneY(C VecD &point, C VecD &plane_normal); // this function assumes that plane position is VecD(0,0,0)
  132. Vec PointOnPlaneY(C Vec &point, C Vec &plane_pos, C Vec &plane_normal);
  133. VecD PointOnPlaneY(C VecD &point, C VecD &plane_pos, C Vec &plane_normal);
  134. VecD PointOnPlaneY(C VecD &point, C VecD &plane_pos, C VecD &plane_normal);
  135. // return step (0..1) used for interpolating between 'a' and 'b' points "Lerp(a, b, step)" in order to obtain a point casted on a plane, 'dist_a' and 'dist_b' are the point distances from the plane
  136. inline Flt PointOnPlaneStep(Flt dist_a, Flt dist_b) {return dist_a/(dist_a-dist_b);}
  137. inline Dbl PointOnPlaneStep(Dbl dist_a, Dbl dist_b) {return dist_a/(dist_a-dist_b);}
  138. // return point casted on a plane, by known 2 points 'a' and 'b', and their distance from plane 'dist_a' and 'dist_b' (returned point and 'a' 'b' points will always be on the same straight line)
  139. Flt PointOnPlane( Flt a, Flt b, Flt dist_a, Flt dist_b);
  140. Dbl PointOnPlane( Dbl a, Dbl b, Dbl dist_a, Dbl dist_b);
  141. Vec2 PointOnPlane(C Vec2 &a, C Vec2 &b, Flt dist_a, Flt dist_b);
  142. VecD2 PointOnPlane(C VecD2 &a, C VecD2 &b, Dbl dist_a, Dbl dist_b);
  143. Vec PointOnPlane(C Vec &a, C Vec &b, Flt dist_a, Flt dist_b);
  144. VecD PointOnPlane(C VecD &a, C VecD &b, Dbl dist_a, Dbl dist_b);
  145. // if moving point cuts through static plane
  146. Bool SweepPointPlane(C Vec2 &point, C Vec2 &move, C Plane2 &plane, Flt *hit_frac=null, Vec2 *hit_normal=null, Vec2 *hit_pos=null, Bool two_sided=false);
  147. Bool SweepPointPlane(C VecD2 &point, C VecD2 &move, C PlaneD2 &plane, Dbl *hit_frac=null, VecD2 *hit_normal=null, VecD2 *hit_pos=null, Bool two_sided=false);
  148. Bool SweepPointPlane(C Vec &point, C Vec &move, C Plane &plane, Flt *hit_frac=null, Vec *hit_normal=null, Vec *hit_pos=null, Bool two_sided=false);
  149. Bool SweepPointPlane(C VecD &point, C VecD &move, C PlaneD &plane, Dbl *hit_frac=null, VecD *hit_normal=null, VecD *hit_pos=null, Bool two_sided=false);
  150. // if moving plane cuts through static point
  151. inline Bool SweepPlanePoint(C Plane2 &plane, C Vec2 &move, C Vec2 &point, Flt *hit_frac=null) {return SweepPointPlane(point, -move, plane, hit_frac);}
  152. inline Bool SweepPlanePoint(C PlaneD2 &plane, C VecD2 &move, C VecD2 &point, Dbl *hit_frac=null) {return SweepPointPlane(point, -move, plane, hit_frac);}
  153. inline Bool SweepPlanePoint(C Plane &plane, C Vec &move, C Vec &point, Flt *hit_frac=null) {return SweepPointPlane(point, -move, plane, hit_frac);}
  154. inline Bool SweepPlanePoint(C PlaneD &plane, C VecD &move, C VecD &point, Dbl *hit_frac=null) {return SweepPointPlane(point, -move, plane, hit_frac);}
  155. // slide 'move' movement by colliding normals, this function adjusts desired 'move' vector according to colliding planes with their normals, so that 'move' vector will slide along the planes if needed, and not move through them
  156. void SlideMovement(Vec2 &move, C Vec2 *normal, Int normals);
  157. void SlideMovement(Vec &move, C Vec *normal, Int normals);
  158. /******************************************************************************/