Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

279 lines
7.3 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================//
  7. #ifndef CONVERT_H
  8. #define CONVERT_H
  9. #pragma once
  10. #include "mathlib/vector.h"
  11. #include "mathlib/mathlib.h"
  12. #include "ivp_physics.hxx"
  13. struct cplane_t;
  14. #include "vphysics_interface.h"
  15. // UNDONE: Remove all conversion/scaling
  16. // Convert our units (inches) to IVP units (meters)
  17. struct vphysics_units_t
  18. {
  19. float unitScaleMeters; // factor that converts game units to meters
  20. float unitScaleMetersInv; // factor that converts meters to game units
  21. float globalCollisionTolerance; // global collision tolerance in game units
  22. float collisionSweepEpsilon; // collision sweep tests clip at this, must be the same as engine's DIST_EPSILON
  23. float collisionSweepIncrementalEpsilon; // near-zero test for incremental steps in collision sweep tests
  24. };
  25. extern vphysics_units_t g_PhysicsUnits;
  26. #define HL2IVP_FACTOR g_PhysicsUnits.unitScaleMeters
  27. #define IVP2HL(x) (float)(x * (g_PhysicsUnits.unitScaleMetersInv))
  28. #define HL2IVP(x) (double)(x * HL2IVP_FACTOR)
  29. // Convert HL engine units to IVP units
  30. inline void ConvertPositionToIVP( const Vector &in, IVP_U_Float_Point &out )
  31. {
  32. float tmpZ;
  33. tmpZ = in[1];
  34. out.k[0] = HL2IVP(in[0]);
  35. out.k[1] = -HL2IVP(in[2]);
  36. out.k[2] = HL2IVP(tmpZ);
  37. }
  38. inline void ConvertPositionToIVP( const Vector &in, IVP_U_Point &out )
  39. {
  40. float tmpZ;
  41. tmpZ = in[1];
  42. out.k[0] = HL2IVP(in[0]);
  43. out.k[1] = -HL2IVP(in[2]);
  44. out.k[2] = HL2IVP(tmpZ);
  45. }
  46. inline void ConvertPositionToIVP( const Vector &in, IVP_U_Float_Point3 &out )
  47. {
  48. float tmpZ;
  49. tmpZ = in[1];
  50. out.k[0] = HL2IVP(in[0]);
  51. out.k[1] = -HL2IVP(in[2]);
  52. out.k[2] = HL2IVP(tmpZ);
  53. }
  54. inline void ConvertPositionToIVP( float &x, float &y, float &z )
  55. {
  56. float tmpZ;
  57. tmpZ = y;
  58. y = -HL2IVP(z);
  59. z = HL2IVP(tmpZ);
  60. x = HL2IVP(x);
  61. }
  62. inline void ConvertDirectionToIVP( const Vector &in, IVP_U_Float_Point &out )
  63. {
  64. float tmpZ;
  65. tmpZ = in[1];
  66. out.k[0] = in[0];
  67. out.k[1] = -in[2];
  68. out.k[2] = tmpZ;
  69. }
  70. inline void ConvertDirectionToIVP( const Vector &in, IVP_U_Point &out )
  71. {
  72. float tmpZ;
  73. tmpZ = in[1];
  74. out.k[0] = in[0];
  75. out.k[1] = -in[2];
  76. out.k[2] = tmpZ;
  77. }
  78. // forces are handled the same as positions & velocities (scaled by distance conversion factor)
  79. #define ConvertForceImpulseToIVP ConvertPositionToIVP
  80. #define ConvertForceImpulseToHL ConvertPositionToHL
  81. inline float ConvertAngleToIVP( float angleIn )
  82. {
  83. return DEG2RAD(angleIn);
  84. }
  85. inline void ConvertAngularImpulseToIVP( const AngularImpulse &in, IVP_U_Float_Point &out )
  86. {
  87. float tmpZ;
  88. tmpZ = in[1];
  89. out.k[0] = DEG2RAD(in[0]);
  90. out.k[1] = -DEG2RAD(in[2]);
  91. out.k[2] = DEG2RAD(tmpZ);
  92. }
  93. inline float ConvertDistanceToIVP( float distance )
  94. {
  95. return HL2IVP( distance );
  96. }
  97. inline void ConvertPlaneToIVP( const Vector &pNormal, float dist, IVP_U_Hesse &plane )
  98. {
  99. ConvertDirectionToIVP( pNormal, (IVP_U_Point &)plane );
  100. // HL stores planes as Ax + By + Cz = D
  101. // IVP stores them as Ax + BY + Cz + D = 0
  102. plane.hesse_val = -ConvertDistanceToIVP( dist );
  103. }
  104. inline void ConvertPlaneToIVP( const Vector &pNormal, float dist, IVP_U_Float_Hesse &plane )
  105. {
  106. ConvertDirectionToIVP( pNormal, (IVP_U_Float_Point &)plane );
  107. // HL stores planes as Ax + By + Cz = D
  108. // IVP stores them as Ax + BY + Cz + D = 0
  109. plane.hesse_val = -ConvertDistanceToIVP( dist );
  110. }
  111. inline float ConvertDensityToIVP( float density )
  112. {
  113. return density;
  114. }
  115. // in convert.cpp
  116. extern void ConvertMatrixToIVP( const matrix3x4_t& matrix, IVP_U_Matrix &out );
  117. extern void ConvertRotationToIVP( const QAngle &angles, IVP_U_Matrix3 &out );
  118. extern void ConvertRotationToIVP( const QAngle& angles, IVP_U_Quat &out );
  119. extern void ConvertBoxToIVP( const Vector &mins, const Vector &maxs, Vector &outmins, Vector &outmaxs );
  120. extern int ConvertCoordinateAxisToIVP( int axisIndex );
  121. extern int ConvertCoordinateAxisToHL( int axisIndex );
  122. // IVP to HL conversions
  123. inline void ConvertPositionToHL( const IVP_U_Point &point, Vector& out )
  124. {
  125. float tmpY = IVP2HL(point.k[2]);
  126. out[2] = -IVP2HL(point.k[1]);
  127. out[1] = tmpY;
  128. out[0] = IVP2HL(point.k[0]);
  129. }
  130. inline void ConvertPositionToHL( const IVP_U_Float_Point &point, Vector& out )
  131. {
  132. float tmpY = IVP2HL(point.k[2]);
  133. out[2] = -IVP2HL(point.k[1]);
  134. out[1] = tmpY;
  135. out[0] = IVP2HL(point.k[0]);
  136. }
  137. inline void ConvertPositionToHL( const IVP_U_Float_Point3 &point, Vector& out )
  138. {
  139. float tmpY = IVP2HL(point.k[2]);
  140. out[2] = -IVP2HL(point.k[1]);
  141. out[1] = tmpY;
  142. out[0] = IVP2HL(point.k[0]);
  143. }
  144. inline void ConvertDirectionToHL( const IVP_U_Point &point, Vector& out )
  145. {
  146. float tmpY = point.k[2];
  147. out[2] = -point.k[1];
  148. out[1] = tmpY;
  149. out[0] = point.k[0];
  150. }
  151. inline void ConvertDirectionToHL( const IVP_U_Float_Point &point, Vector& out )
  152. {
  153. float tmpY = point.k[2];
  154. out[2] = -point.k[1];
  155. out[1] = tmpY;
  156. out[0] = point.k[0];
  157. }
  158. inline float ConvertAngleToHL( float angleIn )
  159. {
  160. return RAD2DEG(angleIn);
  161. }
  162. inline void ConvertAngularImpulseToHL( const IVP_U_Float_Point &point, AngularImpulse &out )
  163. {
  164. float tmpY = point.k[2];
  165. out[2] = -RAD2DEG(point.k[1]);
  166. out[1] = RAD2DEG(tmpY);
  167. out[0] = RAD2DEG(point.k[0]);
  168. }
  169. inline float ConvertDistanceToHL( float distance )
  170. {
  171. return IVP2HL( distance );
  172. }
  173. // NOTE: Converts in place
  174. inline void ConvertPlaneToHL( cplane_t &plane )
  175. {
  176. IVP_U_Float_Hesse tmp(plane.normal.x, plane.normal.y, plane.normal.z, -plane.dist);
  177. ConvertDirectionToHL( (IVP_U_Float_Point &)tmp, plane.normal );
  178. // HL stores planes as Ax + By + Cz = D
  179. // IVP stores them as Ax + BY + Cz + D = 0
  180. plane.dist = -ConvertDistanceToHL( tmp.hesse_val );
  181. }
  182. inline void ConvertPlaneToHL( const IVP_U_Float_Hesse &plane, Vector *pNormalOut, float *pDistOut )
  183. {
  184. if ( pNormalOut )
  185. {
  186. ConvertDirectionToHL( plane, *pNormalOut );
  187. }
  188. // HL stores planes as Ax + By + Cz = D
  189. // IVP stores them as Ax + BY + Cz + D = 0
  190. if ( pDistOut )
  191. {
  192. *pDistOut = -ConvertDistanceToHL( plane.hesse_val );
  193. }
  194. }
  195. inline float ConvertVolumeToHL( float volume )
  196. {
  197. float factor = IVP2HL(1.0);
  198. factor = (factor * factor * factor);
  199. return factor * volume;
  200. }
  201. #define INSQR_PER_METERSQR (1.f / (METERS_PER_INCH*METERS_PER_INCH))
  202. inline float ConvertEnergyToHL( float energy )
  203. {
  204. return energy * INSQR_PER_METERSQR;
  205. }
  206. inline void IVP_Float_PointAbs( IVP_U_Float_Point &out, const IVP_U_Float_Point &in )
  207. {
  208. out.k[0] = fabsf( in.k[0] );
  209. out.k[1] = fabsf( in.k[1] );
  210. out.k[2] = fabsf( in.k[2] );
  211. }
  212. // convert.cpp
  213. extern void ConvertRotationToHL( const IVP_U_Matrix3 &in, QAngle &angles );
  214. extern void ConvertMatrixToHL( const IVP_U_Matrix &in, matrix3x4_t& output );
  215. extern void ConvertRotationToHL( const IVP_U_Quat &in, QAngle& angles );
  216. extern void TransformIVPToLocal( IVP_U_Point &pointInOut, IVP_Real_Object *pObject, bool translate );
  217. extern void TransformLocalToIVP( IVP_U_Point &pointInOut, IVP_Real_Object *pObject, bool translate );
  218. extern void TransformIVPToLocal( const IVP_U_Point &pointIn, IVP_U_Point &pointOut, IVP_Real_Object *pObject, bool translate );
  219. extern void TransformLocalToIVP( const IVP_U_Point &pointIn, IVP_U_Point &pointOut, IVP_Real_Object *pObject, bool translate );
  220. extern void TransformLocalToIVP( const IVP_U_Float_Point &pointIn, IVP_U_Point &pointOut, IVP_Real_Object *pObject, bool translate );
  221. extern void TransformLocalToIVP( const IVP_U_Float_Point &pointIn, IVP_U_Float_Point &pointOut, IVP_Real_Object *pObject, bool translate );
  222. #endif // CONVERT_H