308 lines
12 KiB
C
308 lines
12 KiB
C
/*
|
|
*=======================================================================================
|
|
* Name : MecTools.c
|
|
* Author : J Thénoz Date : 01/05/98
|
|
* Description : Mechanic tools funstions
|
|
*=======================================================================================
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _MECTOOLS_H_
|
|
#define _MECTOOLS_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* only to compile inline functions */
|
|
#include "Mecdef.h"
|
|
#include "col\CollGoCo.h"
|
|
|
|
|
|
/* Dynamics */
|
|
#pragma warning (disable : 4706) // There are some voluntary assignment inside this function
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsBaseMechanic (struct DNM_stDynamics *p_stDynamic)
|
|
{
|
|
register DNM_tdxHandleToMecIdentityCard hIdCard;
|
|
return (ACP_tdxBool)(( ((hIdCard = DNM_M_pDynamicsGetCurrentIdCard (p_stDynamic)) != 0) && hIdCard && (DNM_fn_eIdentityCardGetType(hIdCard)==DNM_eBase)));
|
|
}
|
|
#pragma warning (default : 4706)
|
|
|
|
INLINE
|
|
MTH_tdxReal MEC_fn_xMinSlope (struct DNM_stDynamics *p_stDynamic)
|
|
{
|
|
return MTH_M_xNeg (DNM_M_xDynamicsGetSlopeLimit(p_stDynamic));
|
|
}
|
|
|
|
INLINE
|
|
MTH_tdxReal MEC_fn_xMaxSlope (struct DNM_stDynamics *p_stDynamic)
|
|
{
|
|
return DNM_M_xDynamicsGetSlopeLimit(p_stDynamic);
|
|
}
|
|
|
|
INLINE
|
|
MTH_tdxReal MEC_fn_xGroundLimit (struct DNM_stDynamics *p_stDynamic)
|
|
{
|
|
return DNM_M_xDynamicsGetCosSlope (p_stDynamic);
|
|
}
|
|
|
|
INLINE
|
|
MTH_tdxReal MEC_fn_xWallLimit (struct DNM_stDynamics *p_stDynamic)
|
|
{
|
|
return MTH_M_xNeg ( DNM_M_xDynamicsGetCosSlope (p_stDynamic) );;
|
|
}
|
|
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsPlatform (struct DNM_stDynamics *p_stDynamic)
|
|
{
|
|
return (ACP_tdxBool)(HIE_fn_bIsSuperObjectValid (DNM_M_hDynamicsGetPlatformSO(p_stDynamic)));
|
|
}
|
|
|
|
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsScale (struct DNM_stDynamics *p_stDynamic)
|
|
{
|
|
return (ACP_tdxBool)(!MTH_M_bEqualWithEpsilon (DNM_M_p_stDynamicsGetScaleX(p_stDynamic), MTH_C_ONE, C_xDNM_MTH_EPSILON)
|
|
|| !MTH_M_bEqualWithEpsilon (DNM_M_p_stDynamicsGetScaleY(p_stDynamic), MTH_C_ONE, C_xDNM_MTH_EPSILON)
|
|
|| !MTH_M_bEqualWithEpsilon (DNM_M_p_stDynamicsGetScaleZ(p_stDynamic), MTH_C_ONE, C_xDNM_MTH_EPSILON));
|
|
}
|
|
|
|
|
|
INLINE
|
|
void MEC_fn_vComputeSlopeLimit (struct DNM_stDynamics *p_stDynamic)
|
|
{
|
|
register MTH_tdxReal xSlopeLimit = MTH_M_xSqrt (MTH_M_xDiv (MTH_C_ONE,MTH_M_xAdd(MTH_C_ONE,MTH_M_xSqr(DNM_M_xDynamicsGetSlopeLimit(p_stDynamic)))));
|
|
DNM_M_vDynamicsSetCosSlope ( p_stDynamic, xSlopeLimit );
|
|
}
|
|
|
|
|
|
|
|
/* Material */
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bTypeOfGameMaterial(GMT_tdxHandleToGameMaterial hGameMat, GMT_tdxMask xTestMask)
|
|
{
|
|
register GMT_tdxHandleToCollideMaterial hCollMat;
|
|
return (ACP_tdxBool)( ((hCollMat=hGameMat->hCollideMaterial)!=(GMT_tdxHandleToCollideMaterial)GMT_C_InvalidCollideMaterial) && (hCollMat->xIdentifier&xTestMask)==xTestMask );
|
|
}
|
|
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bTestMaskGameMaterial(GMT_tdxHandleToGameMaterial hGameMat, GMT_tdxMask xTestMask)
|
|
{
|
|
register GMT_tdxHandleToCollideMaterial hCollMat;
|
|
return (ACP_tdxBool)( ((hCollMat=hGameMat->hCollideMaterial)!=(GMT_tdxHandleToCollideMaterial)GMT_C_InvalidCollideMaterial) && (hCollMat->xIdentifier&xTestMask)!=MTH_C_ZERO );
|
|
}
|
|
|
|
|
|
/* Normal */
|
|
ACP_tdxBool MEC_fn_bWallNormal (struct DNM_stDynamics *p_stDynamic, MTH3D_tdstVector* p_stNormal);
|
|
ACP_tdxBool MEC_fn_bGroundNormal (struct DNM_stDynamics *p_stDynamic, MTH3D_tdstVector* p_stNormal);
|
|
|
|
/* Obstacle */
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsEdge (DNM_tdstMecObstacle *p_stObstacle)
|
|
{
|
|
return (ACP_tdxBool)((DNM_M_xObstacleGetCollidedEntity(p_stObstacle)==COL_C_xHighEdgeEntity) || (DNM_M_xObstacleGetCollidedEntity(p_stObstacle)==COL_C_xLowEdgeEntity));
|
|
}
|
|
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsHighEdge (DNM_tdstMecObstacle *p_stObstacle)
|
|
{
|
|
return (ACP_tdxBool)(DNM_M_xObstacleGetCollidedEntity(p_stObstacle)==COL_C_xHighEdgeEntity);
|
|
}
|
|
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsLowEdge (DNM_tdstMecObstacle *p_stObstacle)
|
|
{
|
|
return (ACP_tdxBool)(DNM_M_xObstacleGetCollidedEntity(p_stObstacle)==COL_C_xLowEdgeEntity);
|
|
}
|
|
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsWater (DNM_tdstMecObstacle *p_stObstacle)
|
|
{
|
|
return (ACP_tdxBool)(MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetCollidedMaterial(p_stObstacle),C_xDNM_WATER_TYPE_GAME_MATERIAL)
|
|
&& MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetMyMaterial(p_stObstacle),C_xDNM_WATER_TYPE_GAME_MATERIAL));
|
|
}
|
|
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsCollide (DNM_tdstMecObstacle *p_stObstacle)
|
|
{
|
|
return (ACP_tdxBool) MTH_M_bLess ( DNM_M_xObstacleGetRate(p_stObstacle), MTH_C_ZERO );
|
|
}
|
|
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsDoubleEdge (DNM_tdstMecObstacle *p_stObstacle)
|
|
{
|
|
return (ACP_tdxBool) (( DNM_M_eObstacleGetType(p_stObstacle)&DNM_ObsType_DoubleEdge ) == DNM_ObsType_DoubleEdge);
|
|
}
|
|
|
|
|
|
/* this obstacle is a wall ? */
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bWallObstacle (struct DNM_stDynamics *p_stDynamic, DNM_tdstMecObstacle *p_stObstacle)
|
|
{
|
|
return MEC_fn_bWallNormal (p_stDynamic,DNM_M_p_stObstacleGetNorm (p_stObstacle));
|
|
}
|
|
|
|
|
|
/* this obstacle is a ground ? */
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bGroundObstacle (struct DNM_stDynamics *p_stDynamic, DNM_tdstMecObstacle *p_stObstacle)
|
|
{
|
|
return MEC_fn_bGroundNormal (p_stDynamic,DNM_M_p_stObstacleGetNorm (p_stObstacle));
|
|
}
|
|
|
|
ACP_tdxBool MEC_fn_bCeilObstacle (struct DNM_stDynamics *p_stDynamic, DNM_tdstMecObstacle *p_stObstacle);
|
|
ACP_tdxBool MEC_fn_bIsStatic (long lObstacle, DNM_tdstMecObstacle *p_stObstacle);
|
|
void MEC_fn_vAddObstacleList (long *p_lObstacle, DNM_tdstMecObstacle *p_stObstacle, long lAddObstacle, DNM_tdstMecObstacle *p_stAddObstacle);
|
|
ACP_tdxBool MEC_fn_bCanCrashActor (DNM_tdstMecObstacle* p_stCollideObstacle);
|
|
|
|
INLINE
|
|
void MEC_fn_vInvalidateObstacle ( DNM_tdstMecObstacle *p_stObstacle )
|
|
{
|
|
DNM_M_xObstacleSetCollidedEntity ( p_stObstacle, COL_C_xNoEntity );
|
|
}
|
|
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsObstacleValid ( DNM_tdstMecObstacle *p_stObstacle )
|
|
{
|
|
return (ACP_tdxBool)(DNM_M_xObstacleGetCollidedEntity(p_stObstacle)!=COL_C_xNoEntity);
|
|
}
|
|
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsObstacleSphere ( DNM_tdstMecObstacle *p_stObstacle )
|
|
{
|
|
return (ACP_tdxBool)(DNM_M_xObstacleGetCollidedEntity(p_stObstacle)==COL_C_xSphereEntity);
|
|
}
|
|
|
|
/* Collision */
|
|
BOOL MEC_fn_bDynamicsNeedCollide (struct DNM_stDynamics *p_stDynamic);
|
|
MTH_tdxReal MEC_fn_xGetSlide (struct DNM_stDynamics *p_stDynamic,DNM_tdstMecObstacle *p_stObstacle);
|
|
MTH_tdxReal MEC_fn_xGetRebound (struct DNM_stDynamics *p_stDynamic,DNM_tdstMecObstacle *p_stObstacle);
|
|
void MEC_fn_vComputeCollisionTranslation ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, MTH3D_tdstVector* p_stMove );
|
|
void MEC_fn_vDeleteWallEdge (long lObstacle, DNM_tdstMecObstacle *p_stObstacle, DNM_tdstDynamics *p_stDynamic);
|
|
void MEC_fn_vDeleteUnderGroundWall (long lObstacle, DNM_tdstMecObstacle *p_stObstacle, DNM_tdstDynamics *p_stDynamic, DNM_tdstMecObstacle *p_stGroundObstacle);
|
|
DNM_tdstMecObstacle* MEC_fn_pSelectGround (struct DNM_stDynamics *p_stDynamic, long lObstacle, DNM_tdstMecObstacle *p_stObstacle,ACP_tdxBool *bFirstGround);
|
|
ACP_tdxBool MEC_fn_bDetectStep (struct DNM_stDynamics *p_stDynamic, long lObstacle, DNM_tdstMecObstacle *p_stObstacle, DNM_tdstMecObstacle *p_stGroundObstacle, MTH3D_tdstVector* p_stMoveDirection);
|
|
|
|
|
|
INLINE
|
|
void MEC_fn_vGetCollisionTranslation (struct DNM_stDynamics *p_stDynamic, POS_tdxHandleToPosition hMatrix)
|
|
{
|
|
POS_fn_vSetTranslationVector ( hMatrix, DNM_M_pDynamicsGetCollisionTranslation(p_stDynamic) );
|
|
}
|
|
|
|
INLINE
|
|
void MEC_fn_vRegisterCollisionTranslation (struct DNM_stDynamics *p_stDynamic, POS_tdxHandleToPosition hMatrix)
|
|
{
|
|
DNM_M_vDynamicsSetCollisionTranslation ( p_stDynamic, POS_fn_p_stGetTranslationVector ( hMatrix ) );
|
|
}
|
|
|
|
/* Speed*/
|
|
void MEC_fn_vComputeSpeed (struct DNM_stDynamics *p_stDynamic, MTH_tdxReal xDT);
|
|
|
|
/* Matrix */
|
|
void MEC_fn_vInitMatrix (DNM_tdstDynamics *p_stDynamic);
|
|
void MEC_fn_vCorrectMatrix (struct DNM_stDynamics *p_stDynamic, POS_tdxHandleToPosition hMatrix);
|
|
ACP_tdxBool MEC_fn_bIsEqualMatrix (POS_tdxHandleToPosition hMatrix1, POS_tdxHandleToPosition hMatrix2);
|
|
ACP_tdxBool MEC_fn_bIsEqualRotationMatrix (POS_tdxHandleToPosition hMatrix1, POS_tdxHandleToPosition hMatrix2);
|
|
ACP_tdxBool MEC_fn_bIsEqualTransformMatrix (POS_tdxHandleToPosition hMatrix1, POS_tdxHandleToPosition hMatrix2);
|
|
void MEC_fn_vTranslateMatrixOn (struct DNM_stDynamics *p_stDynamic,MTH3D_tdstVector* p_stMatrixTranslation);
|
|
void MEC_fn_vTranslateMatrixOff (struct DNM_stDynamics *p_stDynamic,MTH3D_tdstVector* p_stMatrixTranslation);
|
|
void MEC_fn_vUpdateMatrix (struct DNM_stDynamics *p_stDynamic,POS_tdxHandleToPosition _hMatrix);
|
|
|
|
INLINE
|
|
void MEC_fn_vInvertMatrix (struct DNM_stDynamics *p_stDynamic,POS_tdxHandleToPosition hInvMatrix, POS_tdxHandleToPosition hMatrix)
|
|
{
|
|
if (DNM_M_bDynamicsIsComputeInvertMatrix(p_stDynamic))
|
|
{
|
|
POS_fn_vInvertMatrix ( hInvMatrix, hMatrix );
|
|
DNM_M_vDynamicsSetComputeInvertMatrix ( p_stDynamic, FALSE );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Adjust */
|
|
void MEC_fn_vAdjustStaticVector (struct DNM_stDynamics *p_stDynamic,MTH3D_tdstVector *p_stVector);
|
|
void MEC_fn_vAdjustStaticMove (struct DNM_stDynamics *p_stDynamic,MTH3D_tdstVector *p_stMove);
|
|
void MEC_fn_vAdjustStaticMatrix (struct DNM_stDynamics *p_stDynamic,POS_tdxHandleToPosition hMatrix);
|
|
void MEC_fn_vAdjustScaleVector (struct DNM_stDynamics *p_stDynamic,MTH3D_tdstVector* p_stVector);
|
|
void MEC_fn_vAdjustSpeed (struct DNM_stDynamics* p_stDynamic, MTH_tdxReal xDT);
|
|
|
|
/* Mth */
|
|
MTH_tdxReal MEC_fn_vRoundReal (MTH_tdxReal xReal, MTH_tdxReal xEpsilon);
|
|
void MEC_fn_vRoundVector (MTH3D_tdstVector* p_stVector, MTH_tdxReal xEpsilon);
|
|
INLINE
|
|
ACP_tdxBool MEC_fn_bIsNullVector ( MTH3D_tdstVector* p_stVector)
|
|
{
|
|
return (ACP_tdxBool)(
|
|
MTH_M_bEqualWithEpsilon ( MTH3D_M_xGetXofVector(p_stVector), MTH_C_ZERO, MTH_M_xDoubleToReal(1e-3) )
|
|
&& MTH_M_bEqualWithEpsilon ( MTH3D_M_xGetYofVector(p_stVector), MTH_C_ZERO, MTH_M_xDoubleToReal(1e-3) )
|
|
&& MTH_M_bEqualWithEpsilon ( MTH3D_M_xGetZofVector(p_stVector), MTH_C_ZERO, MTH_M_xDoubleToReal(1e-3) ));
|
|
|
|
}
|
|
MTH_tdxReal MEC_fn_xConvertScale ( MTH_tdxReal xValue );
|
|
ACP_tdxBool MEC_fn_bVectorParallel ( MTH3D_tdstVector* p_stVector1, MTH3D_tdstVector* p_stVector2 );
|
|
void MEC_fn_vCheckMinVectorNorm ( MTH3D_tdstVector* p_stVector, MTH_tdxReal xLimit );
|
|
|
|
/* BackFaces */
|
|
void MEC_fn_vDeleteBaseBackFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic );
|
|
void MEC_fn_vDeleteOnGroundBackFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic, MTH3D_tdstVector* p_stVector, DNM_tdstMecObstacle *p_stGroundObstacle );
|
|
void MEC_fn_vDeleteGiBackFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic, MTH3D_tdstVector* p_stVector );
|
|
void MEC_fn_vDeleteClimbBackFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic, MTH3D_tdstVector* p_stVector );
|
|
void MEC_fn_vDeleteBaseBackFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic );
|
|
|
|
/* Ground Faces */
|
|
void MEC_fn_vDeleteNoCollidedGroundFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic );
|
|
|
|
/* Delete Faces for Hanging mechanic */
|
|
void MEC_fn_vDeleteHangingObstacle ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic );
|
|
|
|
void MEC_fn_vDeleteObstacleBehind ( long lObstacle, DNM_tdstMecObstacle *a_stObstacle, DNM_tdstMecObstacle *p_stObstacle );
|
|
|
|
void MEC_fn_vDeleteNullTranslationObstacle ( long lObstacle, DNM_tdstMecObstacle *a_stObstacle );
|
|
|
|
/* Hierarchy */
|
|
HIE_tdxHandleToSuperObject MEC_fn_hGetFatherActor (HIE_tdxHandleToSuperObject hSupObj);
|
|
|
|
/* Frame */
|
|
void MEC_fn_vComputeInitialFrameTranslation ( MTH3D_tdstVector *p_stVector, struct DNM_stDynamics *p_stDynamic, long lFrame);
|
|
void MEC_fn_vSetInitialFrameTranslation ( struct DNM_stDynamics *p_stDynamic, MTH3D_tdstVector* p_stVector);
|
|
|
|
/* Stream */
|
|
void MEC_fn_vComputeStream ( MTH3D_tdstVector *p_stStream, struct DNM_stDynamics *p_stDynamic, MTH_tdxReal xDT, ACP_tdxBool bSlide);
|
|
|
|
/* Inertia */
|
|
void MEC_fn_vComputeInertiaTranslation ( struct DNM_stDynamics *p_stDynamic, MTH_tdxReal xDT );
|
|
|
|
/* actor */
|
|
ACP_tdxBool MEC_fn_bIsMultiCollision (HIE_tdxHandleToSuperObject hSupObj);
|
|
ACP_tdxBool MEC_fn_bMainActor (HIE_tdxHandleToSuperObject hSupObj);
|
|
|
|
|
|
/* optimization */
|
|
ACP_tdxBool MEC_fn_bNoMove (struct DNM_stDynamics *p_stDynamic);
|
|
|
|
/* safe position */
|
|
void MEC_fn_vAdjustSafeTranslation (struct DNM_stDynamics *p_stDynamic);
|
|
void MEC_fn_vRegisterSafeTranslation (struct DNM_stDynamics *p_stDynamic, POS_tdxHandleToPosition hMatrix);
|
|
|
|
|
|
/* secure mode */
|
|
void MEC_fn_vSlowMode (struct DNM_stDynamics *p_stDynamic, long lMode);
|
|
void MEC_fn_vNormalMode (struct DNM_stDynamics *p_stDynamic, long lMode);
|
|
void MEC_fn_vRepeatMove (struct DNM_stDynamics *p_stDynamic);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
#endif //_MECTOOLS_H_
|
|
|
|
|