sobinist

Untitled

Dec 2nd, 2022
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.35 KB | None | 0 0
  1.  
  2. //DNM_tdstMecObstacle g_a_stObstacle [COL_C_xMaxNumberOfCollisions];
  3. DNM_tdstMecObstacle *g_a_stObstacle = (DNM_tdstMecObstacle *) COL_g_stCollisionCase;
  4. ACP_tdxBool g_bWaterNoCollide;
  5.  
  6. ACP_tdxBool MEC_fn_bCollision ( long* p_lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic, HIE_tdxHandleToSuperObject p_stSupObj, POS_tdstCompletePosition *p_stStartPosition, POS_tdstCompletePosition *p_stEndPosition, ACP_tdxBool bBackFace )
  7. {
  8. long lCounter;
  9. DNM_tdstMecObstacle *p_stTmpObstacle;
  10. DNM_tdstMecObstacle stHandObstacle;
  11. POS_tdxHandleToPosition hSupObjMatrix;
  12. MTH3D_tdstVector stMove, stVector;
  13. MTH3D_tdstVector *p_stStartTranslation, *p_stEndTranslation;
  14. MTH3D_tdstVector *p_stX, *p_stY, *p_stZ;
  15. /* XB 05/05/99 */
  16. /* ACP_tdxBool bIndexedTriangles = FALSE; */
  17. /* End XB 05/05/99 */
  18. ACP_tdxBool bObstacleOk = FALSE;
  19. MTH_tdxReal xDotProd;
  20. ACP_tdxBool bWaterFace = FALSE;
  21. MTH_tdxReal xDotProdMax;
  22.  
  23. *p_lObstacle = 0;
  24. xDotProdMax = MTH_C_MinusONE;
  25.  
  26. *p_lObstacle = COL_lHaveITakeSThgIntoTheMug (p_stObstacle, p_stSupObj, p_stStartPosition, p_stEndPosition);
  27.  
  28. /* delete back faces */
  29. if (!bBackFace) MEC_fn_vDeleteBaseBackFace ( *p_lObstacle,p_stObstacle, p_stDynamic );
  30.  
  31. MEC_fn_vDeleteNoCollidedGroundFace (*p_lObstacle,p_stObstacle,p_stDynamic);
  32.  
  33. if (*p_lObstacle<=0) return FALSE;
  34.  
  35. if (DNM_M_bDynamicsIsHanging(p_stDynamic))
  36. MEC_fn_vDeleteHangingObstacle (*p_lObstacle,p_stObstacle,p_stDynamic);
  37.  
  38. p_stStartTranslation = POS_fn_p_stGetTranslationVector (p_stStartPosition);
  39. p_stEndTranslation = POS_fn_p_stGetTranslationVector (p_stEndPosition);
  40. MTH3D_M_vSubVector ( &stMove, p_stStartTranslation, p_stEndTranslation );
  41.  
  42. MEC_fn_vComputeCollisionTranslation (*p_lObstacle,p_stObstacle,&stMove);
  43.  
  44. hSupObjMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(p_stSupObj);
  45. POS_fn_vGetRotationVector ( hSupObjMatrix, &p_stX, &p_stY, &p_stZ );
  46.  
  47. for (lCounter=0; lCounter<*p_lObstacle; lCounter++)
  48. {
  49. p_stTmpObstacle = p_stObstacle+lCounter;
  50.  
  51. if (MEC_fn_bIsObstacleValid(p_stTmpObstacle))
  52. {
  53.  
  54. ACP_tdxBool bCollisionOk = TRUE;
  55.  
  56. /* hands */
  57. if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetMyMaterial(p_stTmpObstacle),C_xDNM_HAND_TYPE_GAME_MATERIAL))
  58. {
  59. bCollisionOk = FALSE;
  60. if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_HANG_TYPE_GAME_MATERIAL) )
  61. {
  62. /* collide only hand with ground */
  63. if (MEC_fn_bGroundObstacle(p_stDynamic,p_stTmpObstacle))
  64. {
  65. /* choose best hand obstacle */
  66. MTH3D_M_vSubVector (&stVector,DNM_M_p_stObstacleGetContact(p_stTmpObstacle),POS_fn_p_stGetTranslationVector(hSupObjMatrix));
  67. if (!MEC_fn_bIsNullVector(&stVector))
  68. MTH3D_M_vNormalizeVector (&stVector,&stVector);
  69.  
  70. xDotProd = MTH_M_xAbs(MTH3D_M_xDotProductVector (p_stY,&stVector));
  71. if (xDotProd>xDotProdMax)
  72. {
  73. xDotProdMax = xDotProd;
  74. DNM_M_MecObstacleCopyClone ( &stHandObstacle, p_stTmpObstacle );
  75. }
  76. }
  77. }
  78. }
  79.  
  80. /* water */
  81. else if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_WATER_TYPE_GAME_MATERIAL))
  82. {
  83. if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetMyMaterial(p_stTmpObstacle),C_xDNM_WATER_TYPE_GAME_MATERIAL))
  84. {
  85.  
  86. if (!bWaterFace)
  87. {
  88.  
  89. /* delete water back face */
  90. xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stTmpObstacle),DNM_M_pObstacleGetZoneMove(p_stTmpObstacle) );
  91.  
  92. if ( MTH_M_bGreater ( MTH_M_xAbs ( MTH3D_M_xGetZofVector (DNM_M_pObstacleGetZoneMove(p_stTmpObstacle))), 0.03 ) )
  93. {
  94. if ( MTH_M_bLess(xDotProd, MTH_C_ZERO) )
  95. {
  96. MEC_fn_vReportCollision (p_stDynamic, p_stSupObj, 1, p_stTmpObstacle, 0);
  97. /* the obstacle is used for repositionning only if required*/
  98. bCollisionOk = fn_bBrainWaterCollideSO(p_stSupObj);
  99. if (!bCollisionOk)
  100. g_bWaterNoCollide = TRUE;
  101. bWaterFace = TRUE;
  102. }
  103. else
  104. bCollisionOk = FALSE;
  105. }
  106. else
  107. {
  108.  
  109.  
  110. MTH3D_M_vSubVector ( &stVector, DNM_M_p_stObstacleGetContact(p_stTmpObstacle), DNM_M_pObstacleGetZonePosition(p_stTmpObstacle) );
  111. MTH3D_M_vAddVector ( &stVector, &stVector, DNM_M_pObstacleGetZoneMove(p_stTmpObstacle) );
  112.  
  113. xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stTmpObstacle),&stVector );
  114.  
  115. if (MTH_M_bLessEqual(xDotProd,MTH_C_ZERO))
  116. {
  117. MEC_fn_vReportCollision (p_stDynamic, p_stSupObj, 1, p_stTmpObstacle, 0);
  118. bCollisionOk = fn_bBrainWaterCollideSO(p_stSupObj);
  119. if (!bCollisionOk)
  120. g_bWaterNoCollide = TRUE;
  121. bWaterFace = TRUE;
  122. }
  123. else
  124. bCollisionOk = FALSE;
  125. }
  126.  
  127. if (MTH_M_bGreater(MTH3D_M_xGetZofVector(DNM_M_p_stObstacleGetNorm(p_stTmpObstacle)),MTH_C_ZERO))
  128. bCollisionOk = FALSE;
  129.  
  130.  
  131. }
  132. else
  133. {
  134. bCollisionOk = FALSE;
  135. }
  136.  
  137. }
  138. else /*we do not report the collision because it does not exist: do not use the obstable for repositionning*/
  139. bCollisionOk = FALSE;
  140.  
  141. }
  142.  
  143. else
  144. {
  145. /* No collision faces */
  146. if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_NO_COLLISION_TYPE_GAME_MATERIAL))
  147. {
  148. /* Climb faces */
  149. if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_CLIMB_TYPE_GAME_MATERIAL))
  150. bCollisionOk = DNM_M_bDynamicsIsClimb(p_stDynamic);
  151.  
  152. /* Gi faces */
  153. else if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_GI_TYPE_GAME_MATERIAL))
  154. bCollisionOk = DNM_M_bDynamicsIsGi(p_stDynamic);
  155.  
  156. /* Other faces */
  157. else if (MEC_fn_bTestMaskGameMaterial(DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_COLLISION_REPORT_MASK))
  158. {
  159. bCollisionOk=FALSE;
  160. MEC_fn_vReportCollision (p_stDynamic, p_stSupObj, 1, p_stTmpObstacle, 0);
  161. }
  162.  
  163. /* no report */
  164. else bCollisionOk=FALSE;
  165.  
  166. }
  167. }
  168.  
  169. if (!bCollisionOk) MEC_fn_vInvalidateObstacle(p_stTmpObstacle);
  170. else bObstacleOk=TRUE;
  171. }
  172. }
  173.  
  174.  
  175. /* report hand obstacle */
  176. if (xDotProdMax != MTH_C_MinusONE)
  177. MEC_fn_vReportCollision (p_stDynamic, p_stSupObj, 1, &stHandObstacle, 0);
  178.  
  179. return bObstacleOk;
  180. }
  181.  
  182.  
Add Comment
Please, Sign In to add comment