Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //DNM_tdstMecObstacle g_a_stObstacle [COL_C_xMaxNumberOfCollisions];
- DNM_tdstMecObstacle *g_a_stObstacle = (DNM_tdstMecObstacle *) COL_g_stCollisionCase;
- ACP_tdxBool g_bWaterNoCollide;
- 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 )
- {
- long lCounter;
- DNM_tdstMecObstacle *p_stTmpObstacle;
- DNM_tdstMecObstacle stHandObstacle;
- POS_tdxHandleToPosition hSupObjMatrix;
- MTH3D_tdstVector stMove, stVector;
- MTH3D_tdstVector *p_stStartTranslation, *p_stEndTranslation;
- MTH3D_tdstVector *p_stX, *p_stY, *p_stZ;
- /* XB 05/05/99 */
- /* ACP_tdxBool bIndexedTriangles = FALSE; */
- /* End XB 05/05/99 */
- ACP_tdxBool bObstacleOk = FALSE;
- MTH_tdxReal xDotProd;
- ACP_tdxBool bWaterFace = FALSE;
- MTH_tdxReal xDotProdMax;
- *p_lObstacle = 0;
- xDotProdMax = MTH_C_MinusONE;
- *p_lObstacle = COL_lHaveITakeSThgIntoTheMug (p_stObstacle, p_stSupObj, p_stStartPosition, p_stEndPosition);
- /* delete back faces */
- if (!bBackFace) MEC_fn_vDeleteBaseBackFace ( *p_lObstacle,p_stObstacle, p_stDynamic );
- MEC_fn_vDeleteNoCollidedGroundFace (*p_lObstacle,p_stObstacle,p_stDynamic);
- if (*p_lObstacle<=0) return FALSE;
- if (DNM_M_bDynamicsIsHanging(p_stDynamic))
- MEC_fn_vDeleteHangingObstacle (*p_lObstacle,p_stObstacle,p_stDynamic);
- p_stStartTranslation = POS_fn_p_stGetTranslationVector (p_stStartPosition);
- p_stEndTranslation = POS_fn_p_stGetTranslationVector (p_stEndPosition);
- MTH3D_M_vSubVector ( &stMove, p_stStartTranslation, p_stEndTranslation );
- MEC_fn_vComputeCollisionTranslation (*p_lObstacle,p_stObstacle,&stMove);
- hSupObjMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(p_stSupObj);
- POS_fn_vGetRotationVector ( hSupObjMatrix, &p_stX, &p_stY, &p_stZ );
- for (lCounter=0; lCounter<*p_lObstacle; lCounter++)
- {
- p_stTmpObstacle = p_stObstacle+lCounter;
- if (MEC_fn_bIsObstacleValid(p_stTmpObstacle))
- {
- ACP_tdxBool bCollisionOk = TRUE;
- /* hands */
- if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetMyMaterial(p_stTmpObstacle),C_xDNM_HAND_TYPE_GAME_MATERIAL))
- {
- bCollisionOk = FALSE;
- if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_HANG_TYPE_GAME_MATERIAL) )
- {
- /* collide only hand with ground */
- if (MEC_fn_bGroundObstacle(p_stDynamic,p_stTmpObstacle))
- {
- /* choose best hand obstacle */
- MTH3D_M_vSubVector (&stVector,DNM_M_p_stObstacleGetContact(p_stTmpObstacle),POS_fn_p_stGetTranslationVector(hSupObjMatrix));
- if (!MEC_fn_bIsNullVector(&stVector))
- MTH3D_M_vNormalizeVector (&stVector,&stVector);
- xDotProd = MTH_M_xAbs(MTH3D_M_xDotProductVector (p_stY,&stVector));
- if (xDotProd>xDotProdMax)
- {
- xDotProdMax = xDotProd;
- DNM_M_MecObstacleCopyClone ( &stHandObstacle, p_stTmpObstacle );
- }
- }
- }
- }
- /* water */
- else if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_WATER_TYPE_GAME_MATERIAL))
- {
- if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetMyMaterial(p_stTmpObstacle),C_xDNM_WATER_TYPE_GAME_MATERIAL))
- {
- if (!bWaterFace)
- {
- /* delete water back face */
- xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stTmpObstacle),DNM_M_pObstacleGetZoneMove(p_stTmpObstacle) );
- if ( MTH_M_bGreater ( MTH_M_xAbs ( MTH3D_M_xGetZofVector (DNM_M_pObstacleGetZoneMove(p_stTmpObstacle))), 0.03 ) )
- {
- if ( MTH_M_bLess(xDotProd, MTH_C_ZERO) )
- {
- MEC_fn_vReportCollision (p_stDynamic, p_stSupObj, 1, p_stTmpObstacle, 0);
- /* the obstacle is used for repositionning only if required*/
- bCollisionOk = fn_bBrainWaterCollideSO(p_stSupObj);
- if (!bCollisionOk)
- g_bWaterNoCollide = TRUE;
- bWaterFace = TRUE;
- }
- else
- bCollisionOk = FALSE;
- }
- else
- {
- MTH3D_M_vSubVector ( &stVector, DNM_M_p_stObstacleGetContact(p_stTmpObstacle), DNM_M_pObstacleGetZonePosition(p_stTmpObstacle) );
- MTH3D_M_vAddVector ( &stVector, &stVector, DNM_M_pObstacleGetZoneMove(p_stTmpObstacle) );
- xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stTmpObstacle),&stVector );
- if (MTH_M_bLessEqual(xDotProd,MTH_C_ZERO))
- {
- MEC_fn_vReportCollision (p_stDynamic, p_stSupObj, 1, p_stTmpObstacle, 0);
- bCollisionOk = fn_bBrainWaterCollideSO(p_stSupObj);
- if (!bCollisionOk)
- g_bWaterNoCollide = TRUE;
- bWaterFace = TRUE;
- }
- else
- bCollisionOk = FALSE;
- }
- if (MTH_M_bGreater(MTH3D_M_xGetZofVector(DNM_M_p_stObstacleGetNorm(p_stTmpObstacle)),MTH_C_ZERO))
- bCollisionOk = FALSE;
- }
- else
- {
- bCollisionOk = FALSE;
- }
- }
- else /*we do not report the collision because it does not exist: do not use the obstable for repositionning*/
- bCollisionOk = FALSE;
- }
- else
- {
- /* No collision faces */
- if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_NO_COLLISION_TYPE_GAME_MATERIAL))
- {
- /* Climb faces */
- if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_CLIMB_TYPE_GAME_MATERIAL))
- bCollisionOk = DNM_M_bDynamicsIsClimb(p_stDynamic);
- /* Gi faces */
- else if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_GI_TYPE_GAME_MATERIAL))
- bCollisionOk = DNM_M_bDynamicsIsGi(p_stDynamic);
- /* Other faces */
- else if (MEC_fn_bTestMaskGameMaterial(DNM_M_hObstacleGetCollidedMaterial(p_stTmpObstacle),C_xDNM_COLLISION_REPORT_MASK))
- {
- bCollisionOk=FALSE;
- MEC_fn_vReportCollision (p_stDynamic, p_stSupObj, 1, p_stTmpObstacle, 0);
- }
- /* no report */
- else bCollisionOk=FALSE;
- }
- }
- if (!bCollisionOk) MEC_fn_vInvalidateObstacle(p_stTmpObstacle);
- else bObstacleOk=TRUE;
- }
- }
- /* report hand obstacle */
- if (xDotProdMax != MTH_C_MinusONE)
- MEC_fn_vReportCollision (p_stDynamic, p_stSupObj, 1, &stHandObstacle, 0);
- return bObstacleOk;
- }
Add Comment
Please, Sign In to add comment