reman3/Rayman_X/cpa/tempgrp/MEC/MECTools.c

1353 lines
45 KiB
C

/*
*=======================================================================================
* Name : MecTools.c
* Author : J Thénoz Date : 01/05/98
* Description : Mechanic tools funstions
*=======================================================================================
*/
#include "MEC/MECInc.h"
#include "MEC/DnmDynam.h"
#include "MEC/ParsData.h"
#include "MEC/DNMSurSt.h"
#include "MEC/mbase.h"
#include "Extheade.h"
#include "COL.h"
#include "MEC/MecDef.h"
#include "MEC/MECTOOLS.h"
#include "PCS.h" /* Physical Collide Set */
#include "SCT.h" /* SeCTor*/
#include "FIL.h" /* SeCTor*/
#include "PRT.h" /* PaRTicules*/
#include "GAM.h" /* GAMe*/
/*
* Normal
*/
/* normal of a wall ? */
ACP_tdxBool MEC_fn_bWallNormal (struct DNM_stDynamics *p_stDynamic, MTH3D_tdstVector* p_stNormal)
{
MTH_tdxReal xDotProduct;
MTH3D_tdstVector stVerticalVector;
MTH3D_M_vSetVectorElements (&stVerticalVector, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
xDotProduct = MTH3D_M_xDotProductVector ( p_stNormal, &stVerticalVector );
if ( (xDotProduct>MEC_fn_xWallLimit(p_stDynamic)) && (xDotProduct<MEC_fn_xGroundLimit(p_stDynamic)) )
return TRUE;
else return FALSE;
}
/* normal of a ground ? */
ACP_tdxBool MEC_fn_bGroundNormal (struct DNM_stDynamics *p_stDynamic, MTH3D_tdstVector* p_stNormal)
{
MTH_tdxReal xDotProduct;
MTH3D_tdstVector stVerticalVector;
MTH3D_M_vSetVectorElements (&stVerticalVector, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
xDotProduct = MTH3D_M_xDotProductVector ( p_stNormal, &stVerticalVector );
if (xDotProduct>=MEC_fn_xGroundLimit(p_stDynamic))
return TRUE;
else return FALSE;
}
/*
* Obstacle
*/
/* this obstacle is a ceil ? */
ACP_tdxBool MEC_fn_bCeilObstacle (struct DNM_stDynamics *p_stDynamic, DNM_tdstMecObstacle *p_stObstacle)
{
MTH_tdxReal xDotProduct;
MTH3D_tdstVector stVerticalVector;
MTH3D_tdstVector *p_stNormalVector;
MTH3D_M_vSetVectorElements (&stVerticalVector, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
p_stNormalVector = DNM_M_p_stObstacleGetNorm (p_stObstacle);
xDotProduct = MTH3D_M_xDotProductVector ( p_stNormalVector, &stVerticalVector );
if (xDotProduct<MEC_fn_xWallLimit(p_stDynamic))
return TRUE;
else return FALSE;
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
ACP_tdxBool MEC_fn_bIsStatic (long lObstacle, DNM_tdstMecObstacle *p_stObstacle)
{
long lCounter;
DNM_tdstMecObstacle *p_stTmpObstacle;
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stTmpObstacle = p_stObstacle+lCounter;
if (MEC_fn_bIsObstacleValid(p_stTmpObstacle) && MTH_M_bLess(DNM_M_xObstacleGetRate (p_stObstacle+lCounter),MTH_C_ZERO)) return TRUE;
}
return FALSE;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void MEC_fn_vAddObstacleList (long *p_lObstacle, DNM_tdstMecObstacle *p_stObstacle, long lAddObstacle, DNM_tdstMecObstacle *p_stAddObstacle)
{
long lObstacle=0;
DNM_tdstMecObstacle a_stObstacle [2*COL_C_xMaxNumberOfCollisions];
long lCounter1, lCounter2;
DNM_tdstMecObstacle *p_stObstacle1, *p_stObstacle2;
lCounter2 = 0;
p_stObstacle2 = p_stAddObstacle;
for (lCounter1=0; lCounter1<*p_lObstacle; lCounter1++)
{
p_stObstacle1 = p_stObstacle+lCounter1;
if (MEC_fn_bIsObstacleValid(p_stObstacle1))
{
while ( MTH_M_bGreater(DNM_M_xObstacleGetRate(p_stObstacle1),DNM_M_xObstacleGetRate(p_stObstacle2)) && lCounter2<lAddObstacle )
{
a_stObstacle[lObstacle] = *p_stObstacle2;
lObstacle++;
do lCounter2++;
while ( !MEC_fn_bIsObstacleValid(p_stAddObstacle+lCounter2) && lCounter2<lAddObstacle );
p_stObstacle2 = p_stAddObstacle+lCounter2;
}
a_stObstacle[lObstacle] = *p_stObstacle1;
lObstacle++;
}
}
for (;lCounter2<lAddObstacle; lCounter2++)
{
if (MEC_fn_bIsObstacleValid(p_stAddObstacle+lCounter2))
{
a_stObstacle[lObstacle] = p_stAddObstacle[lCounter2];
lObstacle++;
}
}
/* return result */
if (lObstacle>COL_C_xMaxNumberOfCollisions) lObstacle = COL_C_xMaxNumberOfCollisions;
memcpy ( p_stObstacle, a_stObstacle, lObstacle*sizeof(DNM_tdstMecObstacle) );
*p_lObstacle = lObstacle;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
ACP_tdxBool MEC_fn_bCanCrashActor (DNM_tdstMecObstacle* p_stCollideObstacle)
{
HIE_tdxHandleToSuperObject hSupObj;
hSupObj = DNM_M_p_stObstacleGetObject (p_stCollideObstacle);
if (!HIE_fn_bIsSuperObjectValid(hSupObj)) return FALSE;
hSupObj = MEC_fn_hGetFatherActor (hSupObj);
return (fn_ulStandardGameGetCustomBitsSO(hSupObj) & C_ulDNM_NO_CRASH_CUSTOM_BIT) != C_ulDNM_NO_CRASH_CUSTOM_BIT;
}
/*
* Collision
*/
/* need to call collide ? */
/* yes only if we move */
BOOL MEC_fn_bDynamicsNeedCollide (struct DNM_stDynamics *p_stDynamic)
{
POS_tdxHandleToPosition hCurrentMatrix, hPreviousMatrix;
MTH3D_tdstVector *p_stCurrentPosition, *p_stPreviousPosition;
MTH3D_tdstVector *p_stCurrentI, *p_stCurrentJ, *p_stCurrentK;
MTH3D_tdstVector *p_stPreviousI, *p_stPreviousJ, *p_stPreviousK;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
p_stCurrentPosition = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
p_stPreviousPosition = POS_fn_p_stGetTranslationVector ( hPreviousMatrix );
POS_fn_vGetRotationVector ( hCurrentMatrix, &p_stCurrentI, &p_stCurrentJ, &p_stCurrentK );
POS_fn_vGetRotationVector ( hPreviousMatrix, &p_stPreviousI, &p_stPreviousJ, &p_stPreviousK );
return
!MTH3D_M_bEqualVector (p_stCurrentPosition,p_stPreviousPosition)
|| !MTH3D_M_bEqualVector (p_stCurrentI,p_stPreviousI)
|| !MTH3D_M_bEqualVector (p_stCurrentJ,p_stPreviousJ)
|| !MTH3D_M_bEqualVector (p_stCurrentK,p_stPreviousK);
}
MTH_tdxReal MEC_fn_xGetSlide (struct DNM_stDynamics *p_stDynamic,DNM_tdstMecObstacle *p_stObstacle)
{
MTH_tdxReal xSlide;
GMT_tdxHandleToGameMaterial hGameMaterial;
DNM_tdxHandleToMecMatCharacteristics hMatCharacteristics;
hGameMaterial = hMatCharacteristics = NULL;
if (!p_stObstacle) return MTH_C_ZERO;
hGameMaterial = DNM_M_hObstacleGetCollidedMaterial (p_stObstacle);
if (hGameMaterial!=NULL) hMatCharacteristics=GMT_fn_hGetMechanicsMaterial(hGameMaterial);
xSlide = MTH_C_ZERO;
/* type */
if (hGameMaterial && MEC_fn_bTypeOfGameMaterial (hGameMaterial,C_xDNM_SLIDE_TYPE_GAME_MATERIAL)) xSlide = MTH_C_ONE;
/* game material */
if (hMatCharacteristics) xSlide = DNM_M_xObstacleGetSlide (p_stObstacle);
/* collision control */
if (DNM_M_bDynamicsIsCollisionControl(p_stDynamic)) xSlide = DNM_M_xDynamicsGetSlide (p_stDynamic);
return xSlide;
}
MTH_tdxReal MEC_fn_xGetRebound (struct DNM_stDynamics *p_stDynamic,DNM_tdstMecObstacle *p_stObstacle)
{
MTH_tdxReal xRebound;
GMT_tdxHandleToGameMaterial hGameMaterial;
DNM_tdxHandleToMecMatCharacteristics hMatCharacteristics;
hGameMaterial = hMatCharacteristics = NULL;
if (!p_stObstacle) return MTH_C_ZERO;
hGameMaterial = DNM_M_hObstacleGetCollidedMaterial (p_stObstacle);
if (hGameMaterial!=NULL) hMatCharacteristics=GMT_fn_hGetMechanicsMaterial(hGameMaterial);
xRebound = MTH_C_ZERO;
/* type */
if (hGameMaterial && MEC_fn_bTypeOfGameMaterial (hGameMaterial,C_xDNM_REBOUND_TYPE_GAME_MATERIAL)) xRebound = MTH_C_ONE;
/* game material */
if (hMatCharacteristics) xRebound = DNM_M_xObstacleGetRebound (p_stObstacle);
/* collsion control */
if (DNM_M_bDynamicsIsCollisionControl(p_stDynamic)) xRebound = DNM_M_xDynamicsGetRebound (p_stDynamic);
return xRebound;
}
void MEC_fn_vComputeCollisionTranslation ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, MTH3D_tdstVector* p_stMove )
{
long lCounter;
MTH_tdxReal xRate/*, xNorm*/;
DNM_tdstMecObstacle* p_stTmpObstacle;
MTH3D_tdstVector stVector;
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stTmpObstacle = p_stObstacle+lCounter;
if (MEC_fn_bIsObstacleValid(p_stTmpObstacle))
{
xRate = DNM_M_xObstacleGetRate(p_stTmpObstacle);
if (MTH_M_bGreater(xRate,MTH_C_ONE))
{
DNM_M_xObstacleSetRate (p_stTmpObstacle,MTH_C_ONE);
/* adjust contact point */
MTH3D_M_vNormalizeVector (&stVector,DNM_M_pObstacleGetZoneMove(p_stTmpObstacle));
MTH3D_M_vMulScalarVector (&stVector,DNM_M_xObstacleGetZoneRadius(p_stTmpObstacle),&stVector);
MTH3D_M_vAddVector (&stVector,&stVector,DNM_M_pObstacleGetZonePosition(p_stTmpObstacle));
DNM_M_ObstacleSetContact (p_stTmpObstacle,&stVector);
}
else if (MTH_M_bGreaterEqual(xRate,MTH_C_ZERO))
MTH3D_M_vMulScalarVector ( DNM_M_xObstacleGetTranslation (p_stTmpObstacle), MTH_M_xSub(MTH_C_ONE,DNM_M_xObstacleGetRate(p_stTmpObstacle)),p_stMove );
}
}
}
void MEC_fn_vDeleteWallEdge (long lObstacle, DNM_tdstMecObstacle *p_stObstacle, DNM_tdstDynamics *p_stDynamic)
{
long lCounter;
long lCounter1;
DNM_tdstMecObstacle *p_stTmpObstacle;
DNM_tdstMecObstacle *p_stTmpObstacle1;
MTH3D_tdstVector stVector;
ACP_tdxBool bRemoveEdge = TRUE;
/* delete wall */
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stTmpObstacle = p_stObstacle + lCounter;
if (MEC_fn_bIsObstacleValid(p_stTmpObstacle))
{
if (MEC_fn_bWallObstacle(p_stDynamic,p_stTmpObstacle))
{
if ( (DNM_M_xObstacleGetCollidedEntity(p_stTmpObstacle)==COL_C_xLowEdgeEntity) )
{
if (!MEC_fn_bIsDoubleEdge(p_stTmpObstacle))
{
for (lCounter1=0; lCounter1<lObstacle; lCounter1++)
{
if (lCounter1!=lCounter)
{
p_stTmpObstacle1 = p_stObstacle + lCounter1;
if (MEC_fn_bIsObstacleValid(p_stTmpObstacle1))
{
if (MEC_fn_bIsEdge(p_stTmpObstacle1) && MEC_fn_bWallObstacle(p_stDynamic,p_stTmpObstacle1))
{
MTH3D_M_vSubVector (&stVector,DNM_M_p_stObstacleGetContact(p_stTmpObstacle),DNM_M_p_stObstacleGetContact(p_stTmpObstacle1));
// if (MTH3D_M_bIsNullVector(&stVector))
if (MEC_fn_bIsNullVector(&stVector))
bRemoveEdge = FALSE;
}
}
}
}
if (bRemoveEdge)
MEC_fn_vInvalidateObstacle (p_stTmpObstacle);
}
}
}
}
}
}
void MEC_fn_vDeleteUnderGroundWall (long lObstacle, DNM_tdstMecObstacle *p_stObstacle, DNM_tdstDynamics *p_stDynamic, DNM_tdstMecObstacle *p_stGroundObstacle )
{
long lCounter;
DNM_tdstMecObstacle *p_stTmpObstacle, *p_stGroundEdge;
MTH3D_tdstVector *p_stNormal;
MTH3D_tdstVector stContact, stVector;
MTH_tdxReal xDotProd;
if (!p_stGroundObstacle) return;
p_stGroundEdge = NULL;
for (lCounter=0; lCounter<lObstacle && !p_stGroundEdge; lCounter++)
{
p_stTmpObstacle = p_stObstacle+lCounter;
if (MEC_fn_bIsObstacleValid(p_stTmpObstacle))
{
if
(
MEC_fn_bGroundObstacle (p_stDynamic,p_stTmpObstacle)
&& MEC_fn_bIsEdge (p_stTmpObstacle)
&& MTH_M_bLessEqual(MTH3D_M_xGetZofVector(DNM_M_p_stObstacleGetContact(p_stTmpObstacle)),MTH3D_M_xGetZofVector(DNM_M_p_stObstacleGetContact(p_stGroundObstacle)))
)
p_stGroundEdge = p_stTmpObstacle;
}
}
p_stNormal = DNM_M_p_stObstacleGetNorm (p_stGroundObstacle);
MTH3D_M_vCopyVector ( &stContact,DNM_M_p_stObstacleGetContact (p_stGroundEdge ? p_stGroundEdge : p_stGroundObstacle) );
/* search walls */
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stTmpObstacle = p_stObstacle+lCounter;
if (MEC_fn_bIsObstacleValid(p_stTmpObstacle))
{
if (MEC_fn_bWallObstacle(p_stDynamic,p_stTmpObstacle))
{
MTH3D_M_vSubVector ( &stVector, DNM_M_p_stObstacleGetContact(p_stTmpObstacle), &stContact);
xDotProd = MTH3D_M_xDotProductVector (&stVector,p_stNormal);
// if ( MTH_M_bLess(xDotProd,MTH_M_xDoubleToReal(1e-5)) && !MTH3D_M_bIsNullVector(&stVector) )
if ( MTH_M_bLessEqualZero ( xDotProd ) )
MEC_fn_vInvalidateObstacle(p_stTmpObstacle);
}
}
}
}
DNM_tdstMecObstacle* MEC_fn_pSelectGround (struct DNM_stDynamics *p_stDynamic,long lObstacle, DNM_tdstMecObstacle *p_stObstacle,ACP_tdxBool *bFirstGround)
{
long lCounter, lGround;
DNM_tdstMecObstacle *p_stTmpObstacle;
MTH3D_tdstVector stVector;
DNM_tdstMecObstacle *p_stGroundObstacle = NULL;
MTH_tdxReal xGroundDeltaRate, xDeltaRate;
*bFirstGround = TRUE;
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stTmpObstacle = p_stObstacle+lCounter;
if (MEC_fn_bIsObstacleValid (p_stTmpObstacle))
{
if (MEC_fn_bGroundObstacle(p_stDynamic,p_stTmpObstacle))
{
if (!p_stGroundObstacle)
{
p_stGroundObstacle = p_stTmpObstacle;
lGround = lCounter;
if (DNM_M_bDynamicsIsMechanicChange(p_stDynamic) && !MEC_fn_bIsCollide(p_stGroundObstacle))
return p_stGroundObstacle;
xGroundDeltaRate = MTH_M_xAbs ( MTH_M_xSub ( DNM_M_xObstacleGetRate(p_stGroundObstacle), MTH_M_xDoubleToReal(0.5) ) );
}
else
{
MTH3D_M_vSubVector ( &stVector, DNM_M_p_stObstacleGetContact(p_stGroundObstacle), DNM_M_p_stObstacleGetContact(p_stTmpObstacle) );
if (MTH_M_bGreater(MTH3D_M_xGetZofVector(&stVector),C_xDNM_ON_GROUND_STEP))
{
xDeltaRate = MTH_M_xAbs ( MTH_M_xSub ( DNM_M_xObstacleGetRate(p_stTmpObstacle), MTH_M_xDoubleToReal(0.5) ) );
if ( MTH_M_bLess (xDeltaRate,xGroundDeltaRate) )
{
p_stGroundObstacle = p_stTmpObstacle;
xGroundDeltaRate = xDeltaRate;
*bFirstGround = FALSE;
lGround = lCounter;
}
}
}
}
}
}
return p_stGroundObstacle;
}
ACP_tdxBool MEC_fn_bDetectStep ( struct DNM_stDynamics *p_stDynamic, long lObstacle, DNM_tdstMecObstacle *p_stObstacle, DNM_tdstMecObstacle *p_stGroundObstacle, MTH3D_tdstVector* p_stMoveDirection )
{
long lCounter;
ACP_tdxBool bStep = FALSE;
ACP_tdxBool bStepCandidate = FALSE;
ACP_tdxBool bFindGround = FALSE;
MTH_tdxReal xDotProd;
MTH3D_tdstVector stVector;
DNM_tdstMecObstacle *p_stTmpObstacle;
if (!MEC_fn_bIsEdge(p_stGroundObstacle))
return FALSE;
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stTmpObstacle = p_stObstacle+lCounter;
if (MEC_fn_bIsObstacleValid (p_stTmpObstacle))
{
if (p_stTmpObstacle==p_stGroundObstacle)
bFindGround = TRUE;
else if (MEC_fn_bWallObstacle(p_stDynamic,p_stTmpObstacle))
{
MTH3D_M_vSubVector ( &stVector, DNM_M_p_stObstacleGetContact(p_stGroundObstacle), DNM_M_p_stObstacleGetContact(p_stTmpObstacle) );
if (MTH3D_M_bIsNullVector(&stVector))
{
xDotProd = MTH3D_M_xDotProductVector (DNM_M_p_stObstacleGetNorm(p_stTmpObstacle),p_stMoveDirection);
if (MTH_M_bLessZero(xDotProd))
bStepCandidate=TRUE;
}
}
else if (MEC_fn_bGroundObstacle(p_stDynamic,p_stTmpObstacle))
{
MTH3D_M_vSubVector ( &stVector, DNM_M_p_stObstacleGetContact(p_stGroundObstacle), DNM_M_p_stObstacleGetContact(p_stTmpObstacle) );
if (MTH_M_bLess(MTH3D_M_xGetZofVector(&stVector),C_xDNM_ON_GROUND_STEP) && !MTH3D_M_bIsNullVector(&stVector))
{
if (bStepCandidate && bFindGround)
{
bStep = TRUE;
bStepCandidate = FALSE;
}
}
}
}
}
return bStep;
}
/*
* Speed
*/
/* compute absolute speed */
void MEC_fn_vComputeSpeed (struct DNM_stDynamics *p_stDynamic, MTH_tdxReal xDT)
{
MTH3D_tdstVector stSpeed;
POS_tdxHandleToPosition hPreviousMatrix, hCurrentMatrix;
MTH3D_tdstVector *p_stCurrentTranslation, *p_stPreviousTranslation;
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
p_stCurrentTranslation = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
p_stPreviousTranslation = POS_fn_p_stGetTranslationVector ( hPreviousMatrix );
MTH3D_M_vSubVector (&stSpeed,p_stCurrentTranslation,p_stPreviousTranslation);
MTH3D_M_vDivScalarVector (&stSpeed, &stSpeed, xDT);
DNM_M_vDynamicsSetPreviousSpeed (p_stDynamic, &stSpeed);
}
/*
* Matrix
*/
/* Init matrix*/
void MEC_fn_vInitMatrix (DNM_tdstDynamics *p_stDynamic)
{
POS_tdxHandleToPosition hCurrentMatrix, hPreviousMatrix, hAbsolutePreviousMatrix;
POS_tdxHandleToPosition hPrevPreviousMatrix;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
/*--- Complex ---*/
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic))
{
hAbsolutePreviousMatrix = DNM_M_p_stDynamicsGetAbsolutePreviousMatrix (p_stDynamic);
hPrevPreviousMatrix = DNM_M_p_stDynamicsGetPrevPreviousMatrix (p_stDynamic);
POS_fn_vCopyMatrix ( hPrevPreviousMatrix, hPreviousMatrix );
POS_fn_vCopyMatrix ( hAbsolutePreviousMatrix, hCurrentMatrix );
}
/*--- Base ---*/
POS_fn_vCopyMatrix ( hPreviousMatrix, hCurrentMatrix );
}
/* correct scale */
void MEC_fn_vCorrectMatrix (struct DNM_stDynamics *p_stDynamic, POS_tdxHandleToPosition hMatrix)
{
MTH3D_tdstVector stI, stJ, stK;
POS_fn_vNormalizeMatrix (hMatrix);
MTH3D_M_vSetVectorElements ( &stI, DNM_M_p_stDynamicsGetScaleX(p_stDynamic), MTH_C_ZERO, MTH_C_ZERO );
MTH3D_M_vSetVectorElements ( &stJ, MTH_C_ZERO, DNM_M_p_stDynamicsGetScaleY(p_stDynamic), MTH_C_ZERO );
MTH3D_M_vSetVectorElements ( &stK, MTH_C_ZERO, MTH_C_ZERO, DNM_M_p_stDynamicsGetScaleZ(p_stDynamic) );
POS_fn_vSetScaleMatrix (hMatrix, &stI, &stJ, &stK);
return;
}
ACP_tdxBool MEC_fn_bIsEqualMatrix (POS_tdxHandleToPosition hMatrix1, POS_tdxHandleToPosition hMatrix2)
{
MTH3D_tdstVector *p_stTranslation1, *p_stTranslation2;
p_stTranslation1 = POS_fn_p_stGetTranslationVector ( hMatrix1 );
p_stTranslation2 = POS_fn_p_stGetTranslationVector ( hMatrix2 );
return MTH3D_M_bEqualVector (p_stTranslation1,p_stTranslation2) && MEC_fn_bIsEqualTransformMatrix (hMatrix1,hMatrix2);
}
ACP_tdxBool MEC_fn_bIsEqualRotationMatrix (POS_tdxHandleToPosition hMatrix1, POS_tdxHandleToPosition hMatrix2)
{
MTH3D_tdstVector *p_stI1, *p_stJ1, *p_stK1;
MTH3D_tdstVector *p_stI2, *p_stJ2, *p_stK2;
POS_fn_vGetRotationVector ( hMatrix1, &p_stI1, &p_stJ1, &p_stK1 );
POS_fn_vGetRotationVector ( hMatrix2, &p_stI2, &p_stJ2, &p_stK2 );
return MTH3D_M_bEqualVector (p_stI1,p_stI2) && MTH3D_M_bEqualVector (p_stJ1,p_stJ2) && MTH3D_M_bEqualVector (p_stK1,p_stK2);
}
ACP_tdxBool MEC_fn_bIsEqualTransformMatrix (POS_tdxHandleToPosition hMatrix1, POS_tdxHandleToPosition hMatrix2)
{
MTH3D_tdstVector stI1, stJ1, stK1;
MTH3D_tdstVector stI2, stJ2, stK2;
POS_fn_vGetTransformMatrix ( hMatrix1, &stI1, &stJ1, &stK1 );
POS_fn_vGetTransformMatrix ( hMatrix2, &stI2, &stJ2, &stK2 );
return MTH3D_M_bEqualVector (&stI1,&stI2) && MTH3D_M_bEqualVector (&stJ1,&stJ2) && MTH3D_M_bEqualVector (&stK1,&stK2);
}
void MEC_fn_vTranslateMatrixOn (struct DNM_stDynamics *p_stDynamic,MTH3D_tdstVector* p_stMatrixTranslation)
{
POS_tdxHandleToPosition hCurrentMatrix, hPreviousMatrix;
MTH3D_tdstVector *p_stCurrentVector, *p_stPreviousVector;
long lx, ly, lz;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
p_stCurrentVector = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
p_stPreviousVector = POS_fn_p_stGetTranslationVector ( hPreviousMatrix );
lx = MTH_M_xRealToLong(MTH3D_M_xGetXofVector(p_stPreviousVector));
ly = MTH_M_xRealToLong(MTH3D_M_xGetYofVector(p_stPreviousVector));
lz = MTH_M_xRealToLong(MTH3D_M_xGetZofVector(p_stPreviousVector));
MTH3D_M_vSetXofVector ( p_stMatrixTranslation, MTH_M_xLongToReal(lx) );
MTH3D_M_vSetYofVector ( p_stMatrixTranslation, MTH_M_xLongToReal(ly) );
MTH3D_M_vSetZofVector ( p_stMatrixTranslation, MTH_M_xLongToReal(lz) );
MTH3D_M_vSubVector ( p_stCurrentVector, p_stCurrentVector, p_stMatrixTranslation );
MTH3D_M_vSubVector ( p_stPreviousVector, p_stPreviousVector, p_stMatrixTranslation );
}
void MEC_fn_vTranslateMatrixOff (struct DNM_stDynamics *p_stDynamic,MTH3D_tdstVector* p_stMatrixTranslation)
{
POS_tdxHandleToPosition hCurrentMatrix;
MTH3D_tdstVector *p_stCurrentVector;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
p_stCurrentVector = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
MTH3D_M_vAddVector ( p_stCurrentVector, p_stCurrentVector, p_stMatrixTranslation );
}
void MEC_fn_vUpdateMatrix ( struct DNM_stDynamics *p_stDynamic, POS_tdxHandleToPosition _hMatrix )
{
MTH3D_tdstVector stI, stJ, stK;
MTH3D_M_vSetVectorElements ( &stI, DNM_M_p_stDynamicsGetScaleX(p_stDynamic), MTH_C_ZERO, MTH_C_ZERO );
MTH3D_M_vSetVectorElements ( &stJ, MTH_C_ZERO, DNM_M_p_stDynamicsGetScaleY(p_stDynamic), MTH_C_ZERO );
MTH3D_M_vSetVectorElements ( &stK, MTH_C_ZERO, MTH_C_ZERO, DNM_M_p_stDynamicsGetScaleZ(p_stDynamic) );
POS_fn_vSetScaleMatrix ( _hMatrix, &stI, &stJ, &stK );
}
/*
* Adjust
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 07/06/99 */
void MEC_fn_vAdjustStaticVector (struct DNM_stDynamics *p_stDynamic,MTH3D_tdstVector *p_stVector)
{
POS_tdxHandleToPosition hPreviousMatrix, hCurrentMatrix;
MTH3D_tdstVector *p_stPreviousPosition, *p_stCurrentPosition;
MTH3D_tdstVector stTranslation;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
p_stPreviousPosition = POS_fn_p_stGetTranslationVector ( hPreviousMatrix );
p_stCurrentPosition = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
MTH3D_M_vSubVector ( &stTranslation, p_stVector, p_stCurrentPosition );
POS_fn_vSetTranslationVector ( hCurrentMatrix, p_stVector );
MTH3D_M_vAddVector ( p_stPreviousPosition, p_stPreviousPosition, &stTranslation );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 07/06/99 */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void MEC_fn_vAdjustStaticMove (struct DNM_stDynamics *p_stDynamic,MTH3D_tdstVector *p_stMove)
{
POS_tdxHandleToPosition hCurrentMatrix;
MTH3D_tdstVector *p_stCurrentPosition;
MTH3D_tdstVector stVector;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
p_stCurrentPosition = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
MTH3D_M_vAddVector (&stVector,p_stCurrentPosition,p_stMove);
MEC_fn_vAdjustStaticVector (p_stDynamic,&stVector);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void MEC_fn_vAdjustStaticMatrix (struct DNM_stDynamics *p_stDynamic,POS_tdxHandleToPosition hMatrix)
{
POS_tdxHandleToPosition hCurrentMatrix;
MTH3D_tdstVector *p_stTranslation;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
/* translation */
p_stTranslation = POS_fn_p_stGetTranslationVector ( hMatrix );
MEC_fn_vAdjustStaticVector (p_stDynamic,p_stTranslation);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
void MEC_fn_vAdjustScaleVector (struct DNM_stDynamics *p_stDynamic,MTH3D_tdstVector* p_stVector)
{
MTH3D_M_vSetXofVector ( p_stVector, MTH_M_xMul(MTH3D_M_xGetXofVector (p_stVector),DNM_M_p_stDynamicsGetScaleX(p_stDynamic)) );
MTH3D_M_vSetYofVector ( p_stVector, MTH_M_xMul(MTH3D_M_xGetYofVector (p_stVector),DNM_M_p_stDynamicsGetScaleY(p_stDynamic)) );
MTH3D_M_vSetZofVector ( p_stVector, MTH_M_xMul(MTH3D_M_xGetZofVector (p_stVector),DNM_M_p_stDynamicsGetScaleZ(p_stDynamic)) );
}
void MEC_fn_vAdjustSpeed (struct DNM_stDynamics* p_stDynamic, MTH_tdxReal xDT)
{
POS_tdxHandleToPosition hPreviousMatrix, hCurrentMatrix;
MTH3D_tdstVector *p_stPreviousPosition, *p_stCurrentPosition;
MTH3D_tdstVector stTranslation;
MTH_tdxReal xDotProd;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
p_stPreviousPosition = POS_fn_p_stGetTranslationVector ( hPreviousMatrix );
p_stCurrentPosition = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
MTH3D_M_vSubVector ( &stTranslation, p_stCurrentPosition, p_stPreviousPosition);
if (!MEC_fn_bIsNullVector(&stTranslation)) MTH3D_M_vNormalizeVector (&stTranslation,&stTranslation)
else MTH3D_M_vNullVector (&stTranslation);
xDotProd = MTH3D_M_xDotProductVector (&stTranslation,DNM_M_pDynamicsGetPreviousSpeed(p_stDynamic));
MTH3D_M_vMulScalarVector (&stTranslation, MTH_M_xMul(xDotProd,xDT), &stTranslation);
MTH3D_M_vAddVector (p_stCurrentPosition,p_stPreviousPosition,&stTranslation);
}
/*
* Mth
*/
MTH_tdxReal MEC_fn_vRoundReal (MTH_tdxReal xReal, MTH_tdxReal xEpsilon)
{
long lValue;
MTH_tdxReal xValue;
xValue = MTH_M_xDiv (xReal, xEpsilon);
lValue = MTH_M_xRealToLong (xValue);
xReal = MTH_M_xLongToReal (lValue);
return MTH_M_xMul (xReal, xEpsilon);
}
void MEC_fn_vRoundVector (MTH3D_tdstVector* p_stVector, MTH_tdxReal xEpsilon)
{
MTH3D_M_vSetXofVector ( p_stVector, MEC_fn_vRoundReal ( MTH3D_M_xGetXofVector(p_stVector), xEpsilon ) );
MTH3D_M_vSetYofVector ( p_stVector, MEC_fn_vRoundReal ( MTH3D_M_xGetYofVector(p_stVector), xEpsilon ) );
MTH3D_M_vSetZofVector ( p_stVector, MEC_fn_vRoundReal ( MTH3D_M_xGetZofVector(p_stVector), xEpsilon ) );
}
/* Convert inertia, slide and rebound factor*/
MTH_tdxReal MEC_fn_xConvertScale ( MTH_tdxReal xValue )
{
/* 1 - (1-x)^4 0<x<1 */
/* x x>=1 */
MTH_tdxReal xTmpValue;
if (xValue>=MTH_C_ONE) return xValue;
if (xValue>MTH_C_ZERO)
{
xTmpValue = MTH_M_xSub ( MTH_C_ONE, xValue );
xTmpValue = MTH_M_xMul ( xTmpValue, xTmpValue );
xTmpValue = MTH_M_xMul ( xTmpValue, xTmpValue );
xTmpValue = MTH_M_xSub ( MTH_C_ONE, xTmpValue );
}
else
xTmpValue=MTH_C_ZERO;
return xTmpValue;
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
ACP_tdxBool MEC_fn_bVectorParallel ( MTH3D_tdstVector* p_stVector1, MTH3D_tdstVector* p_stVector2 )
{
MTH_tdxReal xDotProd;
MTH_tdxReal xProdNorm;
xDotProd = MTH3D_M_xDotProductVector (p_stVector1,p_stVector2);
xProdNorm = MTH_M_xMul ( MTH3D_M_xNormVector(p_stVector1), MTH3D_M_xNormVector(p_stVector2) );
return MTH_M_bLess ( MTH_M_xAbs(MTH_M_xSub(xDotProd,xProdNorm)), MTH_M_xDoubleToReal(0.01) );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void MEC_fn_vCheckMinVectorNorm ( MTH3D_tdstVector* p_stVector, MTH_tdxReal xLimit )
{
MTH_tdxReal xNorm;
xNorm = MTH3D_M_xNormVector (p_stVector);
if (MTH_M_bLess(xNorm,xLimit))
{
MTH3D_M_vNullVector (p_stVector);
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
/*
* BackFace
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void MEC_fn_vDeleteBackFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle )
{
long lCounter;
MTH_tdxReal xDotProd;
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
DNM_tdstMecObstacle *p_stCurrentObstacle = p_stObstacle + lCounter;
if ( MEC_fn_bIsObstacleValid (p_stCurrentObstacle) &&!MEC_fn_bIsWater (p_stCurrentObstacle) )
{
xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stCurrentObstacle),DNM_M_pObstacleGetZoneMove(p_stCurrentObstacle) );
/* if ( MTH_M_bGreaterEqual(xDotProd, MTH_C_ZERO ) )*/
if ( MTH_M_bGreater(xDotProd, MTH_M_xNeg(C_xDNM_MTH_EPSILON)) )
MEC_fn_vInvalidateObstacle (p_stCurrentObstacle);
}
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
void MEC_fn_vDeleteOnGroundBackFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic, MTH3D_tdstVector* p_stVector, DNM_tdstMecObstacle *p_stGroundObstacle )
{
MTH3D_tdstVector stVector, stAdjustVector;
long lCounter;
/* XB 05/05/99 */
/* ACP_tdxBool bWallOk = FALSE; */
/* End XB 05/05/99 */
MTH_tdxReal xDotProd;
DNM_tdstMecObstacle *p_stCurrentObstacle;
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stCurrentObstacle = p_stObstacle + lCounter;
if (MEC_fn_bIsObstacleValid(p_stCurrentObstacle))
{
if (MEC_fn_bWallObstacle(p_stDynamic,p_stCurrentObstacle))
{
xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stCurrentObstacle),p_stVector );
if ( MTH_M_bLessEqual(xDotProd,MTH_C_ZERO))
{
MTH3D_M_vSubVector (&stVector,DNM_M_p_stObstacleGetContact(p_stCurrentObstacle),POS_fn_p_stGetTranslationVector(DNM_M_p_stDynamicsGetPreviousMatrix(p_stDynamic)));
MTH3D_M_vMulScalarVector ( &stAdjustVector, DNM_M_xObstacleGetZoneRadius(p_stCurrentObstacle), DNM_M_pDynamicsGetGroundNormal(p_stDynamic) );
MTH3D_M_vSubVector ( &stVector, &stVector, &stAdjustVector );
xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stCurrentObstacle),&stVector );
if ( MTH_M_bGreater(xDotProd,MTH_C_ZERO) )
MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
}
else MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
}
else if (!MEC_fn_bGroundObstacle(p_stDynamic,p_stCurrentObstacle))
{
if (p_stGroundObstacle)
{
MTH3D_M_vSubVector (&stVector,DNM_M_p_stObstacleGetContact(p_stCurrentObstacle),DNM_M_p_stObstacleGetContact(p_stGroundObstacle));
xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stGroundObstacle),&stVector );
if (MTH_M_bLess(xDotProd,C_ulDNM_RAYMAN_ZDM_RADIUS))
MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
}
}
}
}
}
void MEC_fn_vDeleteGiBackFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic, MTH3D_tdstVector* p_stVector )
{
long lCounter;
MTH_tdxReal xDotProd;
MTH3D_tdstVector stVerticalVector;
MTH3D_M_vSetBaseKVector (&stVerticalVector);
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
DNM_tdstMecObstacle *p_stCurrentObstacle = p_stObstacle + lCounter;
if (MEC_fn_bIsObstacleValid(p_stCurrentObstacle))
{
if ( MEC_fn_bTypeOfGameMaterial(DNM_M_hObstacleGetCollidedMaterial (p_stCurrentObstacle),C_xDNM_GI_TYPE_GAME_MATERIAL) && !MEC_fn_bTypeOfGameMaterial(DNM_M_hObstacleGetCollidedMaterial (p_stCurrentObstacle),C_xDNM_NO_COLLISION_TYPE_GAME_MATERIAL) )
{
xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stCurrentObstacle),&stVerticalVector );
if ( MTH_M_bGreater(xDotProd,MTH_C_ZERO) )
MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
}
else if (MEC_fn_bCeilObstacle(p_stDynamic,p_stCurrentObstacle))
{
MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
}
else if (MEC_fn_bWallObstacle(p_stDynamic,p_stCurrentObstacle))
{
xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stCurrentObstacle), p_stVector );
if ( MTH_M_bGreater(xDotProd,MTH_C_ZERO) )
MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
}
}
}
}
void MEC_fn_vDeleteClimbBackFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic, MTH3D_tdstVector* p_stVector )
{
long lCounter;
MTH_tdxReal xDotProd;
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
DNM_tdstMecObstacle *p_stCurrentObstacle = p_stObstacle + lCounter;
if (MEC_fn_bIsObstacleValid(p_stCurrentObstacle))
{
POS_tdxHandleToPosition hCurrentMatrix;
MTH3D_tdstVector *p_stX, *p_stY, *p_stZ;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
POS_fn_vGetRotationVector ( hCurrentMatrix, &p_stX, &p_stY, &p_stZ );
xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stCurrentObstacle), p_stY );
if ( MEC_fn_bTypeOfGameMaterial(DNM_M_hObstacleGetCollidedMaterial (p_stCurrentObstacle),C_xDNM_CLIMB_TYPE_GAME_MATERIAL) && !MEC_fn_bTypeOfGameMaterial(DNM_M_hObstacleGetCollidedMaterial (p_stCurrentObstacle),C_xDNM_NO_COLLISION_TYPE_GAME_MATERIAL) )
{
if ( MTH_M_bLess(xDotProd,MTH_M_xDoubleToReal(-0.707)) )
MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
}
else
{
if ( MTH_M_bLess(xDotProd,MTH_M_xDoubleToReal(-0.95)) )
MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
else
{
xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stCurrentObstacle),p_stVector );
if ( MTH_M_bGreater(xDotProd,C_xDNM_MTH_EPSILON) )
MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
}
}
}
}
}
void MEC_fn_vDeleteBaseBackFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic )
{
MTH3D_tdstVector stVector;
long lCounter;
MTH_tdxReal xDotProd1, xDotProd2;
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
DNM_tdstMecObstacle *p_stCurrentObstacle = p_stObstacle + lCounter;
if ( MEC_fn_bIsObstacleValid(p_stCurrentObstacle) && !MEC_fn_bIsWater(p_stCurrentObstacle) )
{
if (!MEC_fn_bIsNullVector(DNM_M_pObstacleGetZoneMove(p_stCurrentObstacle)))
MTH3D_M_vNormalizeVector (&stVector,DNM_M_pObstacleGetZoneMove(p_stCurrentObstacle))
else
MTH3D_M_vNullVector (&stVector);
xDotProd2 = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stCurrentObstacle),&stVector );
if ( MTH_M_bGreater(xDotProd2,MTH_M_xDoubleToReal(0.707)) ) /* 45° */
MEC_fn_vInvalidateObstacle (p_stCurrentObstacle);
else if (!DNM_M_bDynamicsIsHanging(p_stDynamic))
{
// if (MTH_M_bLess( MTH3D_M_xNormVector(DNM_M_pObstacleGetZoneMove(p_stCurrentObstacle)), DNM_M_xObstacleGetZoneRadius(p_stCurrentObstacle)) || MTH_M_bLess ( MTH_M_xAbs(xDotProd2), MTH_M_xDoubleToReal(0.17365) ) ) /* 10° */
{
if (MTH_M_bEqualZero(DNM_M_xObstacleGetZoneRadius(p_stCurrentObstacle)))
MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
else
{
MTH3D_M_vSubVector ( &stVector, DNM_M_p_stObstacleGetContact(p_stCurrentObstacle), DNM_M_pObstacleGetZonePosition(p_stCurrentObstacle) );
MTH3D_M_vAddVector ( &stVector, &stVector, DNM_M_pObstacleGetZoneMove(p_stCurrentObstacle) );
xDotProd1 = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stCurrentObstacle),&stVector );
if (MTH_M_bGreater(xDotProd1,MTH_C_ZERO))
MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
}
}
// else
// {
// if ( MTH_M_bGreaterZero(xDotProd2) )
// MEC_fn_vInvalidateObstacle (p_stCurrentObstacle);
// }
}
}
}
}
/*
* No collided faces
*/
void MEC_fn_vDeleteNoCollidedGroundFace ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic )
{
long lCounter;
DNM_tdstMecObstacle *p_stCurrentObstacle;
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stCurrentObstacle = p_stObstacle + lCounter;
if (MEC_fn_bIsObstacleValid(p_stCurrentObstacle))
{
if (MEC_fn_bGroundObstacle(p_stDynamic,p_stCurrentObstacle))
{
if (MEC_fn_bTypeOfGameMaterial (DNM_M_hObstacleGetMyMaterial(p_stCurrentObstacle),C_xDNM_NO_COLLISION_WITH_GROUND))
MEC_fn_vInvalidateObstacle(p_stCurrentObstacle);
}
}
}
}
void MEC_fn_vDeleteHangingObstacle ( long lObstacle, DNM_tdstMecObstacle *p_stObstacle, struct DNM_stDynamics* p_stDynamic )
{
long lCounter;
MTH3D_tdstVector stVector;
DNM_tdstMecObstacle *p_stTmpObstacle;
DNM_tdstMecObstacle *p_stGroundObstacle = NULL;
MTH_tdxReal xZ = MTH_C_InfinitPlus;
MTH_tdxReal xHandZPosition;
// if (MEC_fn_bIsPlatform(p_stDynamic))
// {
// for (lCounter=0; lCounter<lObstacle; lCounter++)
// MEC_fn_vInvalidateObstacle(p_stObstacle + lCounter);
// return;
// }
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stTmpObstacle = p_stObstacle + lCounter;
if (MEC_fn_bIsObstacleValid(p_stTmpObstacle)&&MEC_fn_bGroundObstacle(p_stDynamic,p_stTmpObstacle))
{
if ( MTH_M_bLess ( MTH3D_M_xGetZofVector(DNM_M_p_stObstacleGetContact(p_stTmpObstacle)), xZ ) )
{
p_stGroundObstacle = p_stTmpObstacle;
xZ = MTH3D_M_xGetZofVector(DNM_M_p_stObstacleGetContact(p_stTmpObstacle));
}
}
}
if (MEC_fn_bIsPlatform(p_stDynamic))
xHandZPosition = MTH_M_xAdd ( DNM_M_xDynamicsGetHangingLimit(p_stDynamic), MTH3D_M_xGetZofVector(POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(DNM_M_hDynamicsGetPlatformSO(p_stDynamic)))) );
else
xHandZPosition = DNM_M_xDynamicsGetHangingLimit(p_stDynamic);
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stTmpObstacle = p_stObstacle + lCounter;
if (MEC_fn_bIsObstacleValid(p_stTmpObstacle))
{
if ( !MEC_fn_bGroundObstacle(p_stDynamic,p_stTmpObstacle) && MTH_M_bLessEqual(DNM_M_xObstacleGetRate(p_stTmpObstacle),MTH_C_ONE) && !MEC_fn_bIsEdge(p_stTmpObstacle) )
{
if (p_stGroundObstacle)
{
MTH3D_M_vSubVector ( &stVector, DNM_M_p_stObstacleGetContact(p_stTmpObstacle), DNM_M_p_stObstacleGetContact(p_stGroundObstacle) );
if (MTH_M_bLess ( MTH3D_M_xDotProductVector(DNM_M_p_stObstacleGetNorm(p_stGroundObstacle),&stVector), MTH_M_xDoubleToReal(0.005) ))
MEC_fn_vInvalidateObstacle(p_stTmpObstacle);
}
else
{
if (MTH_M_bLessEqual(MTH3D_M_xGetZofVector(DNM_M_p_stObstacleGetContact(p_stTmpObstacle)),/*DNM_M_xDynamicsGetHangingLimit(p_stDynamic)*/ xHandZPosition ))
MEC_fn_vInvalidateObstacle(p_stTmpObstacle);
}
}
else
MEC_fn_vInvalidateObstacle(p_stTmpObstacle);
}
}
}
void MEC_fn_vDeleteObstacleBehind ( long lObstacle, DNM_tdstMecObstacle *a_stObstacle, DNM_tdstMecObstacle *p_stObstacle )
{
long lCounter;
MTH3D_tdstVector stVector;
DNM_tdstMecObstacle *p_stTmpObstacle;
MTH_tdxReal xDotProd;
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stTmpObstacle = a_stObstacle + lCounter;
if (MEC_fn_bIsObstacleValid(p_stTmpObstacle)&&(p_stTmpObstacle!=p_stObstacle))
{
MTH3D_M_vSubVector ( &stVector, DNM_M_p_stObstacleGetContact(p_stTmpObstacle), DNM_M_p_stObstacleGetContact(p_stObstacle) );
xDotProd = MTH3D_M_xDotProductVector ( DNM_M_p_stObstacleGetNorm(p_stObstacle), &stVector );
if (MTH_M_bLess(xDotProd,MTH_M_xDoubleToReal(-1e-3)))
MEC_fn_vInvalidateObstacle(p_stTmpObstacle);
}
}
}
void MEC_fn_vDeleteNullTranslationObstacle ( long lObstacle, DNM_tdstMecObstacle *a_stObstacle )
{
long lCounter;
DNM_tdstMecObstacle *p_stTmpObstacle;
for (lCounter=0; lCounter<lObstacle; lCounter++)
{
p_stTmpObstacle = a_stObstacle + lCounter;
if ( MEC_fn_bIsObstacleValid(p_stTmpObstacle) && MEC_fn_bIsNullVector(DNM_M_xObstacleGetTranslation(p_stTmpObstacle)) )
MEC_fn_vInvalidateObstacle(p_stTmpObstacle);
}
}
/*
* Hierarchy
*/
/* Get father actor*/
HIE_tdxHandleToSuperObject MEC_fn_hGetFatherActor (HIE_tdxHandleToSuperObject hSupObj)
{
HIE_tdxHandleToSuperObject hActor = hSupObj;
while (HIE_fn_ulGetSuperObjectType(hActor)!=HIE_C_ulActor)
{
hActor = HIE_fn_hGetSuperObjectFather (hActor);
if (!HIE_fn_bIsSuperObjectValid (hActor)) return hActor;
}
return hActor;
}
/*
* Frame
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void MEC_fn_vComputeInitialFrameTranslation ( MTH3D_tdstVector *p_stVector, struct DNM_stDynamics *p_stDynamic, long lFrame)
{
POS_tdxHandleToPosition hPreviousMatrix, hCurrentMatrix;
MTH3D_tdstVector *p_stPreviousPosition, *p_stCurrentPosition;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
p_stPreviousPosition = POS_fn_p_stGetTranslationVector ( hPreviousMatrix );
p_stCurrentPosition = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
MTH3D_M_vSubVector ( p_stVector, p_stCurrentPosition, p_stPreviousPosition );
MTH3D_M_vDivScalarVector ( p_stVector, p_stVector, MTH_M_xDoubleToReal(lFrame) );
POS_fn_vSetTranslationVector ( hCurrentMatrix, p_stPreviousPosition );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
void MEC_fn_vSetInitialFrameTranslation ( struct DNM_stDynamics *p_stDynamic, MTH3D_tdstVector* p_stVector)
{
POS_tdxHandleToPosition hCurrentMatrix;
MTH3D_tdstVector *p_stCurrentPosition;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
p_stCurrentPosition = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
MTH3D_M_vAddVector (p_stCurrentPosition,p_stCurrentPosition,p_stVector);
}
void MEC_fn_vComputeStream ( MTH3D_tdstVector *p_stStream, struct DNM_stDynamics *p_stDynamic, MTH_tdxReal xDT, ACP_tdxBool bSlide)
{
MTH_tdxReal xMultFactor;
xMultFactor = MTH_M_xMul (xDT,DNM_M_xDynamicsGetStreamFactor(p_stDynamic));
MTH3D_M_vMulScalarVector ( p_stStream, xMultFactor, DNM_M_pDynamicsGetStreamSpeed ( p_stDynamic ) );
if (bSlide) MTH3D_M_vMulScalarVector ( p_stStream, DNM_M_xDynamicsGetPreviousSlide(p_stDynamic), p_stStream );
}
void MEC_fn_vComputeInertiaTranslation ( struct DNM_stDynamics *p_stDynamic, MTH_tdxReal xDT )
{
MTH3D_tdstVector stVector;
ACP_tdxBool bSlide;
/* stream */
bSlide = (DNM_M_xDynamicsGetStreamPriority(p_stDynamic)!=1);
MEC_fn_vComputeStream ( &stVector, p_stDynamic, xDT, bSlide);
/* additionnal rotation */
MTH3D_M_vAddVector ( &stVector, &stVector, DNM_M_pDynamicsGetAddTranslation (p_stDynamic) );
DNM_M_vDynamicsSetInertiaTranslation ( p_stDynamic, &stVector );
}
/*
* Actor
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
ACP_tdxBool MEC_fn_bIsMultiCollision (HIE_tdxHandleToSuperObject hSupObj)
{
/* Rayman */
return (fn_ulStandardGameGetCustomBitsSO(hSupObj) & C_ulDNM_RAYMAN_CUSTOM_BIT) == C_ulDNM_RAYMAN_CUSTOM_BIT;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
/*#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
ACP_tdxBool MEC_fn_bMainActor (HIE_tdxHandleToSuperObject hSupObj)
{
/* Rayman */
return (fn_ulStandardGameGetCustomBitsSO(hSupObj) & C_ulDNM_RAYMAN_CUSTOM_BIT) == C_ulDNM_RAYMAN_CUSTOM_BIT;
}
/*#endif /* _FIRE_DEADCODE_U64_ /* Added by RUC */
/*
* Optimization
*/
ACP_tdxBool MEC_fn_bNoMove (struct DNM_stDynamics *p_stDynamic)
{
if ( !MTH3D_M_bIsNullVector(DNM_M_pDynamicsGetPreviousSpeed(p_stDynamic)) ) return FALSE;
if ( DNM_M_bDynamicsIsGravity(p_stDynamic) ) return FALSE;
if ( DNM_M_bDynamicsIsAnimation(p_stDynamic) ) return FALSE;
if ( DNM_M_bDynamicsIsImposeSpeed(p_stDynamic) ) return FALSE;
if ( DNM_M_bDynamicsIsImposeRotation(p_stDynamic) ) return FALSE;
if ( DNM_M_bDynamicsIsProposeSpeed(p_stDynamic) ) return FALSE;
if (DNM_M_bDynamicsIsAdvancedSize(p_stDynamic))
{
if ( DNM_M_bDynamicsIsInertia(p_stDynamic) ) return FALSE;
if ( DNM_M_bDynamicsIsImposeRotation(p_stDynamic) ) return FALSE;
if ( DNM_M_bDynamicsIsStream(p_stDynamic) ) return FALSE;
if ( DNM_M_bDynamicsIsAddSpeed(p_stDynamic) ) return FALSE;
}
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic))
{
if ( MEC_fn_bIsPlatform(p_stDynamic) ) return FALSE;
}
return TRUE;
}
/*
* Safe position
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void MEC_fn_vAdjustSafeTranslation (struct DNM_stDynamics *p_stDynamic)
{
POS_tdxHandleToPosition hPreviousMatrix, hCurrentMatrix;
MTH3D_tdstVector* p_stTranslation;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
if (DNM_M_bDynamicsIsSafeValid(p_stDynamic))
{
p_stTranslation = DNM_M_pDynamicsGetSafeTranslation ( p_stDynamic );
POS_fn_vSetTranslationVector ( hPreviousMatrix, p_stTranslation );
POS_fn_vSetTranslationVector ( hCurrentMatrix, p_stTranslation );
}
else
{
p_stTranslation = POS_fn_p_stGetTranslationVector ( hPreviousMatrix );
POS_fn_vSetTranslationVector ( hCurrentMatrix, p_stTranslation );
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void MEC_fn_vRegisterSafeTranslation (struct DNM_stDynamics *p_stDynamic, POS_tdxHandleToPosition hMatrix)
{
MTH3D_tdstVector *p_stTranslation;
p_stTranslation = POS_fn_p_stGetTranslationVector ( hMatrix );
DNM_M_vDynamicsSetSafeValid ( p_stDynamic, TRUE );
DNM_M_vDynamicsSetSafeTranslation ( p_stDynamic, p_stTranslation );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
void MEC_fn_vSlowMode (struct DNM_stDynamics *p_stDynamic, long lMode)
{
POS_tdxHandleToPosition hPreviousMatrix, hCurrentMatrix;
MTH3D_tdstVector *p_stPreviousPosition, *p_stCurrentPosition;
MTH3D_tdstVector *p_stSpeed;
MTH3D_tdstVector stVector;
MTH_tdxReal xInvMode;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
p_stPreviousPosition = POS_fn_p_stGetTranslationVector ( hPreviousMatrix );
p_stCurrentPosition = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
xInvMode = MTH_M_xInv (MTH_M_xDoubleToReal(lMode));
/* adjust position */
MTH3D_M_vSubVector ( &stVector, p_stCurrentPosition, p_stPreviousPosition );
MTH3D_M_vMulScalarVector ( &stVector, xInvMode , &stVector );
MTH3D_M_vAddVector ( p_stCurrentPosition, p_stPreviousPosition, &stVector );
/* adjust speed */
p_stSpeed = DNM_M_pDynamicsGetPreviousSpeed (p_stDynamic);
MTH3D_M_vMulScalarVector ( p_stSpeed, xInvMode , p_stSpeed );
}
void MEC_fn_vNormalMode (struct DNM_stDynamics *p_stDynamic, long lMode)
{
POS_tdxHandleToPosition hPreviousMatrix, hCurrentMatrix;
MTH3D_tdstVector *p_stPreviousPosition, *p_stCurrentPosition;
MTH3D_tdstVector *p_stSpeed;
MTH3D_tdstVector stVector;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
p_stPreviousPosition = POS_fn_p_stGetTranslationVector ( hPreviousMatrix );
p_stCurrentPosition = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
/* adjust position */
MTH3D_M_vSubVector ( &stVector, p_stCurrentPosition, p_stPreviousPosition );
MTH3D_M_vMulScalarVector ( &stVector, MTH_M_xDoubleToReal(lMode) , &stVector );
MTH3D_M_vSubVector ( p_stPreviousPosition, p_stCurrentPosition, &stVector );
/* adjust speed */
p_stSpeed = DNM_M_pDynamicsGetPreviousSpeed (p_stDynamic);
MTH3D_M_vMulScalarVector ( p_stSpeed, MTH_M_xDoubleToReal(lMode) , p_stSpeed );
}
void MEC_fn_vRepeatMove (struct DNM_stDynamics *p_stDynamic)
{
POS_tdxHandleToPosition hPreviousMatrix, hCurrentMatrix;
MTH3D_tdstVector *p_stPreviousPosition, *p_stCurrentPosition;
MTH3D_tdstVector stVector;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
p_stPreviousPosition = POS_fn_p_stGetTranslationVector ( hPreviousMatrix );
p_stCurrentPosition = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
MTH3D_M_vSubVector ( &stVector, p_stCurrentPosition, p_stPreviousPosition );
MTH3D_M_vCopyVector ( p_stPreviousPosition, p_stCurrentPosition );
MTH3D_M_vAddVector ( p_stCurrentPosition, p_stCurrentPosition, &stVector );
}