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

1037 lines
37 KiB
C

/*
*=======================================================================================
* Name : MecBase.c
* Author : J Thénoz Date : 01/05/98
* Description : Mechanic functions for Base model
*=======================================================================================
*/
/*FB030898*/
#define HIE_FRIEND
/*END FB*/
#include "cpa_expt.h"
#include "ACP_Base.h"
#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/MECOpt.h"
#include "MEC/MECBhv.h"
#include "MEC/MECCol.h"
#include "MEC/MECPfm.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*/
/* global */
MTH_tdxReal MEC_g_xClimbSpeedLimit = MTH_M_xDoubleToReal(0.7);
MTH_tdxReal MEC_g_xBaseCoeff = C_xDNM_BASE_COEF;
MTH_tdxReal MEC_g_xWalkCoeff = C_xDNM_WALK_COEF;
extern POS_tdstCompletePosition * POS_g_p_stIdentityMatrix;
extern long g_lCallCounter;
extern ACP_tdxBool g_bHighSpeed;
/* internal functions */
long MEC_fn_lComputeCall ( struct DNM_stDynamics *p_stDynamic, HIE_tdxHandleToSuperObject hSupObj, MTH_tdxReal xDT, MTH_tdxReal xCoef )
{
long lNbFrame, lCall;
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 );
if ((fn_ulStandardGameGetCustomBitsSO(hSupObj) & C_ulDNM_RAYMAN_CUSTOM_BIT) == C_ulDNM_RAYMAN_CUSTOM_BIT)
lCall = MTH_M_xRealToLong (MTH_M_xAdd( MTH_M_xMul(MTH_M_xDiv(MTH3D_M_xNormVector(&stVector),C_ulDNM_RAYMAN_ZDM_RADIUS),xCoef) ,MTH_C_ONE));
else
{
lNbFrame = MTH_M_xRealToLong (MTH_M_xAdd(MTH_M_xDiv (xDT,M_xGetFrameLength(g_stEngineStructure.stEngineTimer)),MTH_C_Inv2));
lCall = 1;
if (lNbFrame>4 && MTH_M_bGreater(MTH3D_M_xNormVector(&stVector),MTH_C_Inv2) )
lCall = 2;
}
return lCall;
}
void MEC_fn_vBaseManager ( struct DNM_stDynamics *p_stDynamic, HIE_tdxHandleToSuperObject hSupObj, MTH_tdxReal xDT )
{
long lCall, lCounter;
if ( DNM_M_bDynamicsIsDontUseNewMechanic(p_stDynamic) || MTH_M_bEqualZero(MEC_g_xBaseCoeff) )
MEC_fn_vBaseObstacleManagement ( p_stDynamic, hSupObj, xDT );
else
{
lCall = MEC_fn_lComputeCall ( p_stDynamic, hSupObj, xDT, MEC_g_xBaseCoeff );
MEC_fn_vSlowMode (p_stDynamic,lCall);
MEC_fn_vBaseObstacleManagement ( p_stDynamic, hSupObj, xDT );
for (lCounter=1; lCounter<lCall; lCounter++)
{
MEC_fn_vRepeatMove (p_stDynamic);
MEC_fn_vBaseObstacleManagement ( p_stDynamic, hSupObj, xDT );
}
MEC_fn_vNormalMode (p_stDynamic,lCall);
}
}
void MEC_fn_vWalkManager ( struct DNM_stDynamics *p_stDynamic, HIE_tdxHandleToSuperObject hSupObj, MTH_tdxReal xDT )
{
long lCall, lCounter;
if ( DNM_M_bDynamicsIsDontUseNewMechanic(p_stDynamic) || MTH_M_bEqualZero(MEC_g_xWalkCoeff) )
MEC_fn_vGroundObstacleManagement ( p_stDynamic, hSupObj, xDT );
else
{
lCall = MEC_fn_lComputeCall ( p_stDynamic, hSupObj, xDT, MEC_g_xWalkCoeff );
MEC_fn_vSlowMode (p_stDynamic,lCall);
MEC_fn_vGroundObstacleManagement ( p_stDynamic, hSupObj, xDT );
for (lCounter=1; lCounter<lCall; lCounter++)
{
g_lCallCounter = 0;
MEC_fn_vRepeatMove (p_stDynamic);
MEC_fn_vGroundObstacleManagement ( p_stDynamic, hSupObj, xDT );
}
MEC_fn_vNormalMode (p_stDynamic,lCall);
}
}
/* Dynamic function*/
struct DNM_stDynamics *MEC_p_stDynamicsBaseMechanics
(
struct DNM_stDynamics *p_stDynamic,
HIE_tdxHandleToSuperObject hSupObj,
struct DNM_stParsingDatas *p_stParsingDatas,
DNM_tdxHandleToMecIdentityCard h_MecIdCard,
MTH_tdxReal xDT
)
{
/* variable declaration */
DNM_tdstMecBaseIdCard* pstBaseMecIdCard;
GEO_tdxHandleToMatrix hGlobalMatrix;
POS_tdxHandleToPosition hCurrentMatrix;
POS_tdxHandleToPosition hPreviousMatrix;
POS_tdxHandleToPosition hPrevPreviousMatrix;
POS_tdxHandleToPosition hAbsolutePreviousMatrix;
POS_tdxHandleToPosition hPreviousReferenceMatrix;
POS_tdxHandleToPosition hInvPreviousReferenceMatrix;
POS_tdxHandleToPosition hPrevPreviousReferenceMatrix;
POS_tdxHandleToPosition hRefMatrix;
POS_tdxHandleToPosition hInvRefMatrix;
POS_tdstCompletePosition stPreviousReferenceMatrix, stInvPreviousReferenceMatrix, stPrevPreviousReferenceMatrix, stInvMatrix, stRefMatrix;
MTH3D_tdstVector *p_stCurrentTranslation, *p_stAbsolutePreviousTranslation;
MTH3D_tdstVector stSpeed;
MTH3D_tdstVector stStablePreviousPosition;
MTH3D_tdstVector *p_stPreviousX, *p_stPreviousY, *p_stPreviousZ;
/* XB 05/05/99 */
/* MTH_tdxReal xDotProd; */
/* End XB 05/05/99 */
DNM_tdstReport* p_stReport=NULL;
ACP_tdxBool bNeedToCollide;
ACP_tdxBool bPlatform=FALSE;
ACP_tdxBool bPlatformChange=FALSE;
ACP_tdxBool bImposeRotation;
MTH3D_tdstVector stI, stJ, stK;
long lNbFrame, lFrame;
MTH_tdstMove stMove;
MTH3D_tdstVector stVector;
MTH3D_tdstVector stMatrixTranslation;
/* XB 05/05/99 */
/* MTH_tdxReal xSlide = MTH_C_ZERO; */
/* End XB 05/05/99 */
DNM_tdstMecObstacle* p_stObstacle;
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic) && DNM_M_bDynamicsIsCollisionReport(p_stDynamic))
MTH_M_MoveSetNull(&stMove); //AR9903
if (DNM_M_bDynamicsIsCollisionReport(p_stDynamic))
{
p_stReport = DNM_M_p_stDynamicsGetReport (p_stDynamic);
if ( DNM_M_ulReportGetSurfaceState (p_stReport) & C_WOT_ulForceMobile )
DNM_M_ulReportSetSurfaceState (p_stReport,C_WOT_ulMobile);
else
DNM_M_ulReportSetSurfaceState (p_stReport,C_WOT_ulNoObstacle);
}
DNM_M_vDynamicsSetExec ( p_stDynamic, TRUE );
DNM_M_vDynamicsSetActorMove (p_stDynamic,FALSE);
/* exit optimization */
if ( !fn_bGetCharacterForceCollisionWhenNotMoving(hSupObj) && MEC_fn_bNoMove(p_stDynamic) && !DNM_M_bDynamicsIsInit(p_stDynamic) && !DNM_M_bDynamicsIsChangeScale(p_stDynamic) )
{
return p_stDynamic;
}
/* variable definition */
pstBaseMecIdCard = (DNM_tdstMecBaseIdCard*)h_MecIdCard;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic))
{
hPrevPreviousMatrix = DNM_M_p_stDynamicsGetPrevPreviousMatrix (p_stDynamic);
hAbsolutePreviousMatrix = DNM_M_p_stDynamicsGetAbsolutePreviousMatrix (p_stDynamic);
}
POS_fn_vCopyMatrix(&stPreviousReferenceMatrix, (POS_tdstCompletePosition *) POS_g_p_stIdentityMatrix);
hPreviousReferenceMatrix = &stPreviousReferenceMatrix;
POS_fn_vCopyMatrix(&stPrevPreviousReferenceMatrix, (POS_tdstCompletePosition *) POS_g_p_stIdentityMatrix);
hPrevPreviousReferenceMatrix = &stPrevPreviousReferenceMatrix;
hGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (hSupObj);
POS_fn_vCopyMatrix(&stRefMatrix, (POS_tdstCompletePosition *) POS_g_p_stIdentityMatrix);
hRefMatrix = &stRefMatrix;
hInvRefMatrix = (POS_tdxHandleToPosition)&stInvMatrix;
DNM_M_vDynamicsSetComputeInvertMatrix (p_stDynamic,TRUE);
/* clear global report */
DNM_M_ulReportSetSurfaceState ( &g_stReport, 0 );
g_lCallCounter = 0;
g_bHighSpeed = FALSE;
if ( DNM_M_bDynamicsIsInit(p_stDynamic))
{
POS_fn_vCopyMatrix ( hCurrentMatrix, hGlobalMatrix );
POS_fn_vCopyMatrix ( hPreviousMatrix, hGlobalMatrix );
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic))
{
POS_fn_vCopyMatrix ( hPrevPreviousMatrix, hGlobalMatrix );
POS_fn_vCopyMatrix ( hAbsolutePreviousMatrix, hGlobalMatrix );
}
if (DNM_M_bDynamicsIsAdvancedSize(p_stDynamic)) MEC_fn_vRegisterCollisionTranslation ( p_stDynamic, hCurrentMatrix );
if (!DNM_M_bDynamicsIsChangeScale(p_stDynamic))
{
POS_fn_vGetScaleMatrix (hGlobalMatrix, &stI, &stJ, &stK);
DNM_M_vDynamicsSetScale (p_stDynamic, MTH3D_M_xGetXofVector(&stI), MTH3D_M_xGetYofVector(&stJ), MTH3D_M_xGetZofVector(&stK) );
}
MTH3D_M_vNullVector ( DNM_M_pDynamicsGetPreviousSpeed ( p_stDynamic ) );
DNM_M_vDynamicsSetInit (p_stDynamic,FALSE);
}
if ( DNM_M_bDynamicsIsMechanicChange (p_stDynamic) && DNM_M_bDynamicsIsComplexSize(p_stDynamic))
MEC_fn_vCancelTilt (p_stDynamic);
POS_fn_vCopyMatrix ( hRefMatrix , hPreviousMatrix );
if (DNM_M_bDynamicsIsImposeRotation(p_stDynamic))
MTH3D_M_vCopyMatrix ( &(hRefMatrix->stRotationMatrix), DNM_M_p_stDynamicsGetImposeRotationMatrix(p_stDynamic) );
/* init collision counter */
if (DNM_M_bDynamicsIsAdvancedSize(p_stDynamic))
{
if ( DNM_M_cDynamicsGetCollideCounter(p_stDynamic) <= 0 )
DNM_M_vDynamicsSetCollideCounter ( p_stDynamic, fn_ucCollSetGetCollComputeFrequencySO(hSupObj) );
}
/* shoot mechanic */
if (DNM_M_bDynamicsIsShoot (p_stDynamic))
{
bImposeRotation = DNM_M_bDynamicsIsImposeRotation(p_stDynamic);
/* shoot mechanic */
MTH3D_M_vMulScalarVector ( &stVector, xDT, DNM_M_pDynamicsGetPreviousSpeed ( p_stDynamic ) );
MEC_fn_vSetInitialFrameTranslation ( p_stDynamic, &stVector );
POS_fn_vCopyMatrix ( hPreviousReferenceMatrix, hPreviousMatrix );
/* Impose speed ? */
if (DNM_M_bDynamicsIsImposeSpeed(p_stDynamic))
{
MEC_fn_vImposeSpeed (p_stDynamic,xDT,hRefMatrix,hInvRefMatrix);
DNM_M_vDynamicsSetImposeSpeedX ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetImposeSpeedY ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetImposeSpeedZ ( p_stDynamic, FALSE );
}
/* Impose rotation ? */
if ( bImposeRotation )
{
MEC_fn_vImposeRotation (p_stDynamic);
DNM_M_vDynamicsSetImposeRotation ( p_stDynamic, FALSE );
}
if (DNM_M_bDynamicsIsCollide(p_stDynamic))
{
if (DNM_M_bDynamicsIsAdvancedSize(p_stDynamic))
{
DNM_M_vDynamicsDecCollideCounter (p_stDynamic);
if ( DNM_M_cDynamicsGetCollideCounter (p_stDynamic)==0 )
{
// MEC_fn_vBaseObstacleManagement ( p_stDynamic, hSupObj, xDT );
MEC_fn_vBaseManager ( p_stDynamic, hSupObj, xDT );
if (fn_ucCollSetGetCollComputeFrequencySO(hSupObj)>1) MEC_fn_vRegisterCollisionTranslation (p_stDynamic,hCurrentMatrix);
}
}
// else MEC_fn_vBaseObstacleManagement ( p_stDynamic, hSupObj, xDT );
else MEC_fn_vBaseManager ( p_stDynamic, hSupObj, xDT );
}
MEC_fn_vComputeSpeed ( p_stDynamic, xDT );
/* adjust matrix to get scale */
MEC_fn_vCorrectMatrix ( p_stDynamic, hCurrentMatrix );
if(!MEC_fn_bIsEqualMatrix (hGlobalMatrix,hCurrentMatrix))
{
POS_fn_vCopyMatrix ( hGlobalMatrix, hCurrentMatrix );
HIE_fn_vComputeNewRelativeMatrix (hSupObj);
}
/* platform and pushed objects update */
if ( fn_bStandardGameIsAPlatform(hSupObj) )
{
if(!MEC_fn_bIsEqualMatrix (hPreviousMatrix,hCurrentMatrix))
{
HIE_fn_vRefreshHierarchy (hSupObj);
/* invert matrix only if usefull */
if (bImposeRotation)
{
hInvPreviousReferenceMatrix = (POS_tdxHandleToPosition)&stInvPreviousReferenceMatrix;
POS_fn_vInvertMatrix (hInvPreviousReferenceMatrix,hPreviousReferenceMatrix);
}
else
{
MEC_fn_vInvertMatrix (p_stDynamic,hInvRefMatrix,hRefMatrix);
hInvPreviousReferenceMatrix = hInvRefMatrix;
}
MEC_fn_vUpdatePlatform (p_stDynamic,hSupObj, hPreviousReferenceMatrix, hInvPreviousReferenceMatrix);
}
}
else if ( (fn_ulStandardGameGetCustomBitsSO(hSupObj) & C_ulDNM_COMPUTE_CHANNEL) && !MEC_fn_bIsEqualMatrix (hPreviousMatrix,hCurrentMatrix))
{
HIE_fn_vRefreshHierarchy (hSupObj);
}
MEC_fn_vInitMatrix (p_stDynamic);
MEC_fn_vFillCollisionReport (p_stDynamic);
return p_stDynamic;
}
/* number of frame */
lNbFrame = MTH_M_xRealToLong (MTH_M_xAdd(MTH_M_xDiv (xDT,M_xGetFrameLength(g_stEngineStructure.stEngineTimer)),MTH_C_Inv2));
/* stable position */
POS_fn_vGetTranslationVector ( hPreviousMatrix, &stStablePreviousPosition );
/* copy previous reference */
POS_fn_vCopyMatrix ( hPreviousReferenceMatrix, hPreviousMatrix );
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic)) POS_fn_vCopyMatrix ( hPrevPreviousReferenceMatrix, hPrevPreviousMatrix );
/* reset platform crash */
DNM_M_bDynamicsSetPlatformCrash (p_stDynamic,FALSE);
DNM_M_bDynamicsSetCanFall (p_stDynamic,FALSE);
if ( DNM_M_bDynamicsIsScale(p_stDynamic) && MEC_fn_bIsScale(p_stDynamic) )
MEC_fn_vAdjustScaleData (p_stDynamic,hRefMatrix,hInvRefMatrix);
MTH3D_M_vMulScalarVector ( DNM_M_p_stDynamicsGetSpeedAnim(p_stDynamic), M_xGetFrameLength(g_stEngineStructure.stEngineTimer), DNM_M_p_stDynamicsGetSpeedAnim(p_stDynamic) );
POS_fn_vRotateVector ( DNM_M_p_stDynamicsGetSpeedAnim(p_stDynamic), hCurrentMatrix, DNM_M_p_stDynamicsGetSpeedAnim(p_stDynamic) );
/* init frame */
MTH3D_M_vDivScalarVector (DNM_M_pDynamicsGetAddTranslation(p_stDynamic),DNM_M_pDynamicsGetAddTranslation(p_stDynamic), MTH_M_xDoubleToReal(lNbFrame));
/* translate matrix on */
MEC_fn_vTranslateMatrixOn (p_stDynamic,&stMatrixTranslation);
for (lFrame=0; lFrame<lNbFrame; lFrame++)
{
if (DNM_M_bDynamicsIsAnimation(p_stDynamic)) MEC_fn_vSetInitialFrameTranslation (p_stDynamic,DNM_M_p_stDynamicsGetSpeedAnim(p_stDynamic));
/* Propose speed */
if (DNM_M_bDynamicsIsProposeSpeed(p_stDynamic)) MEC_fn_vProposeSpeed (p_stDynamic,M_xGetFrameLength(g_stEngineStructure.stEngineTimer),hRefMatrix,hInvRefMatrix);
/* stream priority 0 */
if ( DNM_M_bDynamicsIsStream(p_stDynamic) )
{
if ( DNM_M_xDynamicsGetStreamPriority(p_stDynamic)==0 )
MEC_fn_vAddStream (p_stDynamic,M_xGetFrameLength(g_stEngineStructure.stEngineTimer),TRUE);
}
/* inertia */
MEC_fn_vInertia (p_stDynamic,M_xGetFrameLength(g_stEngineStructure.stEngineTimer),hRefMatrix,hInvRefMatrix);
/* Gravity */
if ( DNM_M_bDynamicsIsGravity(p_stDynamic) ) MEC_fn_vGravitySpeed (p_stDynamic,M_xGetFrameLength(g_stEngineStructure.stEngineTimer));
/* Impose speed ? */
if (DNM_M_bDynamicsIsImposeSpeed(p_stDynamic)) MEC_fn_vImposeSpeed (p_stDynamic,M_xGetFrameLength(g_stEngineStructure.stEngineTimer),hRefMatrix,hInvRefMatrix);
/* Add speed ? */
if(DNM_M_bDynamicsIsAddSpeed(p_stDynamic)) MEC_fn_vAddSpeed (p_stDynamic,M_xGetFrameLength(g_stEngineStructure.stEngineTimer),hRefMatrix,hInvRefMatrix);
if ( DNM_M_bDynamicsIsImposeRotation(p_stDynamic) )
{
/* Impose rotation */
MEC_fn_vImposeRotation (p_stDynamic);
/* Add translation due to impose rotation */
MEC_fn_vAdditionnalTranslation (p_stDynamic);
}
else if (DNM_M_bDynamicsIsImposeTranslation(p_stDynamic)) MEC_fn_vAdditionnalTranslation (p_stDynamic);
/* stream priority 1 */
if (DNM_M_bDynamicsIsStream(p_stDynamic))
{
if ( DNM_M_xDynamicsGetStreamPriority(p_stDynamic)==1 )
MEC_fn_vAddStream (p_stDynamic,M_xGetFrameLength(g_stEngineStructure.stEngineTimer),FALSE);
}
/* Speed limit */
if (DNM_M_bDynamicsIsSpeedLimit(p_stDynamic)) MEC_fn_vSpeedLimit ( p_stDynamic, M_xGetFrameLength(g_stEngineStructure.stEngineTimer), hRefMatrix, hInvRefMatrix );
MEC_fn_vComputeSpeed (p_stDynamic,M_xGetFrameLength(g_stEngineStructure.stEngineTimer));
/* report additionnnal vector */
if (DNM_M_bDynamicsIsAdvancedSize(p_stDynamic)) MEC_fn_vComputeInertiaTranslation ( p_stDynamic, M_xGetFrameLength(g_stEngineStructure.stEngineTimer) );
/* current -> previous */
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic)) POS_fn_vCopyMatrix ( hPrevPreviousMatrix, hPreviousMatrix );
POS_fn_vCopyMatrix ( hPreviousMatrix, hCurrentMatrix );
/* optimisation */
if ( MTH3D_M_bIsNullVector (DNM_M_pDynamicsGetPreviousSpeed(p_stDynamic)) ) lFrame=lNbFrame;
}
/* restore values */
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic)) POS_fn_vCopyMatrix ( hPrevPreviousMatrix, hPrevPreviousReferenceMatrix );
POS_fn_vCopyMatrix ( hPreviousMatrix, hPreviousReferenceMatrix );
/* translate matrix off */
MEC_fn_vTranslateMatrixOff (p_stDynamic,&stMatrixTranslation);
/* adjust speed */
MEC_fn_vAdjustSpeed (p_stDynamic, xDT);
/* Tilt */
if (DNM_M_bDynamicsIsTilt(p_stDynamic)) MEC_fn_vAddTiltSpeed (p_stDynamic,xDT);
/* need to collide ? */
bNeedToCollide = MEC_fn_bDynamicsNeedCollide(p_stDynamic);
/* platform ? */
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic)) bPlatform = MEC_fn_bIsPlatform(p_stDynamic);
DNM_M_vDynamicsSetNoGravity (p_stDynamic,FALSE);
if (DNM_M_bDynamicsIsAdvancedSize(p_stDynamic))
{
/* dec collision counter */
DNM_M_vDynamicsDecCollideCounter (p_stDynamic);
/* Obstacle part */
if (DNM_M_cDynamicsGetCollideCounter (p_stDynamic)==0)
{
if ( bNeedToCollide || bPlatform || fn_bGetCharacterForceCollisionWhenNotMoving(hSupObj) )
{
if (DNM_M_bDynamicsIsGi (p_stDynamic)) MEC_fn_vGiObstacleManagement ( p_stDynamic, hSupObj, xDT );
else if (DNM_M_bDynamicsIsClimb (p_stDynamic))
{
MEC_fn_vClimbObstacleManagement ( p_stDynamic, hSupObj, xDT );
/* if actor moves just a little, actor don't move at all.*/
if (MTH_M_bLess ( MTH3D_M_xNormVector(DNM_M_pDynamicsGetPreviousSpeed(p_stDynamic)), MEC_g_xClimbSpeedLimit ))
{
MTH3D_M_vCopyVector ( POS_fn_p_stGetTranslationVector(hCurrentMatrix), POS_fn_p_stGetTranslationVector(hPreviousMatrix) );
MTH3D_M_vNullVector ( DNM_M_pDynamicsGetPreviousSpeed(p_stDynamic) );
}
}
// else if (DNM_M_bDynamicsIsOnGround (p_stDynamic)) MEC_fn_vGroundObstacleManagement ( p_stDynamic, hSupObj, xDT );
else if (DNM_M_bDynamicsIsOnGround (p_stDynamic)) MEC_fn_vWalkManager ( p_stDynamic, hSupObj, xDT );
else if (DNM_M_bDynamicsIsSpider (p_stDynamic)) MEC_fn_vSpiderObstacleManagement ( p_stDynamic, hSupObj, xDT );
// else if (DNM_M_bDynamicsIsCollide(p_stDynamic)) MEC_fn_vBaseObstacleManagement ( p_stDynamic, hSupObj, xDT );
else if (DNM_M_bDynamicsIsCollide(p_stDynamic)) MEC_fn_vBaseManager ( p_stDynamic, hSupObj, xDT );
}
/* else*/
/* {*/
/* collide only with other actors */
/* if (fn_bGetCharacterForceCollisionWhenNotMoving(hSupObj))*/
/* {*/
/* ACP_tdxBool bCollisionState;*/
/* bCollisionState = fn_bGetCharacterNoCollisionWithMap (hSupObj);*/
/* fn_vSetCharacterNoCollisionWithMap (hSupObj,TRUE);*/
/* if (MEC_fn_bInCollision(p_stDynamic,hSupObj) && !bCollisionState)*/
/* {*/
/* fn_vSetCharacterNoCollisionWithMap (hSupObj,bCollisionState);*/
/* if (DNM_M_bDynamicsIsGi (p_stDynamic)) MEC_fn_vGiObstacleManagement ( p_stDynamic, hSupObj, xDT );*/
/* else if (DNM_M_bDynamicsIsClimb (p_stDynamic)) MEC_fn_vClimbObstacleManagement ( p_stDynamic, hSupObj, xDT );*/
/* else if ((p_stDynamic)) MEC_fn_vGroundObstacleManagement ( p_stDynamic, hSupObj, xDT, FALSE );*/
/* else if (DNM_M_bDynamicsIsCollide(p_stDynamic)) MEC_fn_vBaseObstacleManagement ( p_stDynamic, hSupObj, xDT );*/
/* }*/
/* else*/
/* {*/
/* fn_vSetCharacterNoCollisionWithMap (hSupObj,bCollisionState);*/
/* DNM_M_ulReportSetSurfaceState ( p_stReport, DNM_M_ulReportGetPrevSurfaceState (p_stReport) );*/
/* }*/
/* }*/
/* }*/
/* bCollide = TRUE;*/
/* register collision */
if (fn_ucCollSetGetCollComputeFrequencySO(hSupObj)>1) MEC_fn_vRegisterCollisionTranslation (p_stDynamic,hCurrentMatrix);
}
else
{
if (DNM_M_bDynamicsIsOnGround (p_stDynamic)) MEC_fn_vGroundGuess (p_stDynamic,xDT);
if (DNM_M_bDynamicsIsCollisionReport(p_stDynamic))
/* current collision state = previous one */
DNM_M_ulReportSetSurfaceState ( p_stReport, DNM_M_ulReportGetPrevSurfaceState (p_stReport) );
}
}
else /* no advanced mechanic so collide every frame */
{
if ( bNeedToCollide || fn_bGetCharacterForceCollisionWhenNotMoving(hSupObj) )
{
if (DNM_M_bDynamicsIsGi (p_stDynamic)) MEC_fn_vGiObstacleManagement ( p_stDynamic, hSupObj, xDT );
else if (DNM_M_bDynamicsIsClimb (p_stDynamic))
{
MEC_fn_vClimbObstacleManagement ( p_stDynamic, hSupObj, xDT );
/* if actor moves just a little, actor don't move at all.*/
if (MTH_M_bLess ( MTH3D_M_xNormVector(DNM_M_pDynamicsGetPreviousSpeed(p_stDynamic)), MEC_g_xClimbSpeedLimit ))
{
MTH3D_M_vCopyVector ( POS_fn_p_stGetTranslationVector(hCurrentMatrix), POS_fn_p_stGetTranslationVector(hPreviousMatrix) );
MTH3D_M_vNullVector ( DNM_M_pDynamicsGetPreviousSpeed(p_stDynamic) );
}
}
// else if (DNM_M_bDynamicsIsOnGround (p_stDynamic)) MEC_fn_vGroundObstacleManagement ( p_stDynamic, hSupObj, xDT );
else if (DNM_M_bDynamicsIsOnGround (p_stDynamic)) MEC_fn_vWalkManager ( p_stDynamic, hSupObj, xDT );
else if (DNM_M_bDynamicsIsSpider (p_stDynamic)) MEC_fn_vSpiderObstacleManagement ( p_stDynamic, hSupObj, xDT );
// else if (DNM_M_bDynamicsIsCollide(p_stDynamic)) MEC_fn_vBaseObstacleManagement ( p_stDynamic, hSupObj, xDT );
else if (DNM_M_bDynamicsIsCollide(p_stDynamic)) MEC_fn_vBaseManager ( p_stDynamic, hSupObj, xDT );
}
}
/* check position limit */
MEC_fn_vPositionLimit ( p_stDynamic, &stStablePreviousPosition );
/* Platform Management */
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic)) bPlatformChange = MEC_fn_vBasePlatformManagement ( p_stDynamic, hSupObj );
/* correct scale */
MEC_fn_vCorrectMatrix ( p_stDynamic, hCurrentMatrix );
/* speed */
p_stCurrentTranslation = POS_fn_p_stGetTranslationVector (hCurrentMatrix);
/* XB 05/05/99 : move the following line 7 lines after */
/* p_stAbsolutePreviousTranslation = POS_fn_p_stGetTranslationVector (hAbsolutePreviousMatrix); */
/* End XB 05/05/99 */
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic) && DNM_M_bDynamicsIsCollisionReport(p_stDynamic))
{
/* XB 05/05/99 */
p_stAbsolutePreviousTranslation = POS_fn_p_stGetTranslationVector (hAbsolutePreviousMatrix);
/* End XB 05/05/99 */
/* absolute speed */
MTH3D_M_vSubVector (&stSpeed,p_stCurrentTranslation,p_stAbsolutePreviousTranslation);
MTH3D_M_vDivScalarVector (&stSpeed, &stSpeed, xDT);
/* Update Dynamic Report speed linear -> to keep speed variable in IA */
/* to CB's camera */
POS_fn_vGetRotationVector ( hAbsolutePreviousMatrix, &p_stPreviousX, &p_stPreviousY, &p_stPreviousZ );
/* XB 05/05/99 : unused !!!! */
/* check |xDotProd|<=1 */
/* xDotProd = MTH_M_xMin ( MTH_M_xMax ( xDotProd, MTH_C_MinusONE ), MTH_C_ONE ); */
/* End XB 05/05/99 */
/* keep Y of hAbsolutePreviousMatrix in &stMove */
/* will be used to update real angular position if required by camera */
MTH_M_MoveSetAngularPosition ( &stMove, MTH_C_ONE, p_stPreviousY );
MTH_M_MoveSetLinear ( &stMove, &stSpeed );
DNM_M_ReportSetAbsoluteCurrSpeed ( DNM_M_p_stDynamicsGetReport (p_stDynamic), &stMove );
}
/* Update Gli position */
if(!MEC_fn_bIsEqualMatrix (hGlobalMatrix,hCurrentMatrix) || bPlatformChange)
{
POS_fn_vCopyMatrix ( hGlobalMatrix, hCurrentMatrix );
HIE_fn_vComputeNewRelativeMatrix (hSupObj);
DNM_M_vDynamicsSetActorMove (p_stDynamic,TRUE);
}
/* platform and pushed objects update */
if ( fn_bStandardGameIsAPlatform(hSupObj) )
{
if(!MEC_fn_bIsEqualMatrix (hPreviousMatrix,hCurrentMatrix))
{
HIE_fn_vRefreshHierarchy (hSupObj);
/* invert matrix only if usefull */
if (DNM_M_bDynamicsIsImposeRotation(p_stDynamic))
{
hInvPreviousReferenceMatrix = (POS_tdxHandleToPosition)&stInvPreviousReferenceMatrix;
POS_fn_vInvertMatrix (hInvPreviousReferenceMatrix,hPreviousReferenceMatrix);
}
else
{
MEC_fn_vInvertMatrix (p_stDynamic,hInvRefMatrix,hRefMatrix);
hInvPreviousReferenceMatrix = hInvRefMatrix;
}
MEC_fn_vUpdatePlatform (p_stDynamic,hSupObj, hPreviousReferenceMatrix, hInvPreviousReferenceMatrix);
}
}
else if ( (fn_ulStandardGameGetCustomBitsSO(hSupObj) & C_ulDNM_COMPUTE_CHANNEL) && !MEC_fn_bIsEqualMatrix (hPreviousMatrix,hCurrentMatrix))
{
HIE_fn_vRefreshHierarchy (hSupObj);
}
/* Update Matrix */
MEC_fn_vInitMatrix (p_stDynamic);
/* Update Dynamic Report position linear -> to keep position varaiable in IA */
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic) && DNM_M_bDynamicsIsCollisionReport(p_stDynamic))
{
MTH3D_M_vCopyVector ( &stVector, p_stCurrentTranslation );
MTH_M_MoveSetAngularToNull ( &stMove );
MTH_M_MoveSetLinear ( &stMove, &stVector );
DNM_M_ReportSetAbsoluteCurrPosition (DNM_M_p_stDynamicsGetReport (p_stDynamic),&stMove);
}
MEC_fn_vFillCollisionReport (p_stDynamic);
/* Update report state */
if (DNM_M_bDynamicsIsCollisionReport(p_stDynamic)) DNM_M_ulReportSetPrevSurfaceState ( p_stReport, DNM_M_ulReportGetSurfaceState (p_stReport) );
/* update Nb Frame */
DNM_M_vDynamicsSetNbFrame ( p_stDynamic, (unsigned char)lNbFrame );
/* End */
MTH3D_M_vNullVector ( DNM_M_pDynamicsGetImposeSpeed (p_stDynamic) );
MTH3D_M_vNullVector ( DNM_M_pDynamicsGetProposeSpeed (p_stDynamic) );
MTH3D_M_vNullVector ( DNM_M_p_stDynamicsGetSpeedAnim(p_stDynamic) );
MTH3D_M_vNullVector ( DNM_M_pDynamicsGetAddTranslation(p_stDynamic) );
DNM_M_bDynamicsSetAbsoluteImposeSpeed ( p_stDynamic, FALSE );
DNM_M_bDynamicsSetAbsoluteProposeSpeed ( p_stDynamic, FALSE );
DNM_M_bDynamicsSetAbsoluteAddSpeed ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetImposeSpeedX ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetImposeSpeedY ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetImposeSpeedZ ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetProposeSpeedX ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetProposeSpeedY ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetProposeSpeedZ ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetAddSpeedX ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetAddSpeedY ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetAddSpeedZ ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetImposeRotation ( p_stDynamic, FALSE );
DNM_M_vDynamicsSetImposeTranslation ( p_stDynamic, FALSE );
DNM_M_bDynamicsSetMechanicChange( p_stDynamic,FALSE);
DNM_M_vDynamicsSetChangeScale( p_stDynamic, FALSE );
/* reset coeff */
MEC_g_xBaseCoeff = C_xDNM_BASE_COEF;
MEC_g_xWalkCoeff = C_xDNM_WALK_COEF;
if (DNM_M_bDynamicsIsAdvancedSize(p_stDynamic))
{
p_stObstacle = DNM_M_p_stReportGetObstacle (&g_stReport);
if ( p_stObstacle && ((DNM_M_ulReportGetSurfaceState(&g_stReport))!=C_WOT_ulNoObstacle) )
DNM_M_vDynamicsSetPreviousSlide(p_stDynamic,MEC_fn_xGetSlide (p_stDynamic,p_stObstacle));
else
DNM_M_vDynamicsSetPreviousSlide(p_stDynamic,MTH_C_ZERO);
}
p_stObstacle = DNM_M_p_stReportGetGround(&g_stReport);
if
(
p_stObstacle
&& ((DNM_M_ulReportGetSurfaceState(&g_stReport)&C_WOT_ulGround)==C_WOT_ulGround)
&& MTH_M_bDifferent(MEC_fn_xGetSlide (p_stDynamic,p_stObstacle),MTH_C_ZERO)
)
DNM_M_vDynamicsSetSlidingGround(p_stDynamic,TRUE);
else
DNM_M_vDynamicsSetSlidingGround(p_stDynamic,FALSE);
if (DNM_M_bDynamicsIsAdvancedSize(p_stDynamic))
{
MTH3D_M_vNullVector ( DNM_M_pDynamicsGetAddSpeed (p_stDynamic) );
MTH3D_M_vNullVector ( DNM_M_pDynamicsGetStreamSpeed (p_stDynamic) );
}
return p_stDynamic;
}
/* Impose rotation matrix */
void MEC_vImposeRotationMatrix
(
struct DNM_stDynamics *p_stDynamic,
POS_tdxHandleToPosition hRotationMatrix
)
{
POS_tdxHandleToPosition hCurrentMatrix;
MTH3D_tdstVector *p_stCurrentTranslation, *p_stMatrixTranslation;
MTH3D_tdstVector stMove;
if (DNM_M_bDynamicsIsInit(p_stDynamic)) return;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
/* impose rotation */
DNM_M_vDynamicsSetImposeRotation (p_stDynamic,TRUE);
DNM_M_vDynamicsSetImposeRotationMatrix (p_stDynamic,&(hRotationMatrix->stRotationMatrix));
/* translation without rotation */
p_stCurrentTranslation = POS_fn_p_stGetTranslationVector ( hCurrentMatrix );
p_stMatrixTranslation = POS_fn_p_stGetTranslationVector ( hRotationMatrix );
MTH3D_M_vSubVector (&stMove,p_stMatrixTranslation,p_stCurrentTranslation);
DNM_M_vDynamicsSetAddTranslation (p_stDynamic,&stMove);
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic)) MEC_fn_vCancelTilt (p_stDynamic);
}
void MEC_vImposeRotationVector
(
struct DNM_stDynamics *p_stDynamic,
MTH3D_tdstVector *p_stX,
MTH3D_tdstVector *p_stY,
MTH3D_tdstVector *p_stZ
)
{
MTH3D_tdstMatrix* p_stImposeRotationMatrix;
if (DNM_M_bDynamicsIsInit(p_stDynamic)) return;
p_stImposeRotationMatrix = DNM_M_p_stDynamicsGetImposeRotationMatrix (p_stDynamic);
MTH3D_M_vSetVectorsInMatrix( p_stImposeRotationMatrix, p_stX, p_stY, p_stZ);
/* impose rotation */
DNM_M_vDynamicsSetImposeRotation (p_stDynamic,TRUE);
}
/* Impose relative rotation */
void MEC_vImposeRelativeRotation
(
struct DNM_stDynamics *p_stDynamic,
MTH3D_tdstMatrix *p_stRotationMatrix
)
{
MTH3D_tdstVector *p_stI, *p_stJ, *p_stK;
MTH3D_tdstMatrix stMatrix;
POS_tdxHandleToPosition hCurrentMatrix;
if (DNM_M_bDynamicsIsInit(p_stDynamic)) return;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
POS_fn_vGetRotationVector ( hCurrentMatrix, &p_stI, &p_stJ, &p_stK );
MTH3D_M_vSetVectorsInMatrix ( &stMatrix, p_stI, p_stJ, p_stK );
MTH3D_M_vMulMatrixMatrix ( &stMatrix, &stMatrix, p_stRotationMatrix );
MTH3D_M_vGetVectorsInMatrix ( p_stI, p_stJ, p_stK, &stMatrix );
MEC_fn_vUpdateMatrix (p_stDynamic,hCurrentMatrix);
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic)) MEC_fn_vCancelTilt (p_stDynamic);
}
/* Impose absolute translation */
void MEC_vImposeTranslation
(
struct DNM_stDynamics *p_stDynamic,
MTH3D_tdstVector* p_stVector
)
{
MTH3D_tdstVector stVector;
MTH3D_tdstVector* p_stCurrentTranslation;
POS_tdxHandleToPosition hCurrentMatrix;
if (DNM_M_bDynamicsIsInit(p_stDynamic)) return;
DNM_M_vDynamicsSetImposeTranslation ( p_stDynamic, TRUE );
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
p_stCurrentTranslation = POS_fn_p_stGetTranslationVector (hCurrentMatrix);
MTH3D_M_vSubVector ( &stVector, p_stVector, p_stCurrentTranslation );
DNM_M_vDynamicsSetAddTranslation (p_stDynamic,&stVector);
MTH3D_M_vNullVector ( DNM_M_pDynamicsGetPreviousSpeed(p_stDynamic) );
}
/* Init translation */
void MEC_vInitTranslation
(
struct DNM_stDynamics *p_stDynamic,
HIE_tdxHandleToSuperObject hSupObj,
MTH3D_tdstVector* p_stVector
)
{
POS_tdxHandleToPosition hCurrentMatrix, hPreviousMatrix, hAbsolutePreviousMatrix, hPrevPreviousMatrix, hGlobalMatrix;
if (DNM_M_bDynamicsIsInit(p_stDynamic))
{
hGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (hSupObj);
POS_fn_vSetTranslationVector (hGlobalMatrix,p_stVector);
}
else
{
/*--- Base ---*/
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
hGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (hSupObj);
POS_fn_vSetTranslationVector (hCurrentMatrix,p_stVector);
POS_fn_vSetTranslationVector (hPreviousMatrix,p_stVector);
POS_fn_vCopyMatrix ( hGlobalMatrix, hCurrentMatrix );
/*--- Complex ---*/
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic))
{
hAbsolutePreviousMatrix = DNM_M_p_stDynamicsGetAbsolutePreviousMatrix (p_stDynamic);
hPrevPreviousMatrix = DNM_M_p_stDynamicsGetPrevPreviousMatrix (p_stDynamic);
POS_fn_vSetTranslationVector (hAbsolutePreviousMatrix,p_stVector);
POS_fn_vSetTranslationVector (hPrevPreviousMatrix,p_stVector);
}
}
HIE_fn_vComputeNewRelativeMatrix (hSupObj);
/* reset data */
/*--- Base ---*/
MTH3D_M_vNullVector (DNM_M_pDynamicsGetPreviousSpeed (p_stDynamic));
MTH3D_M_vNullVector (DNM_M_pDynamicsGetAddTranslation(p_stDynamic));
/*--- Advanced ---*/
if (DNM_M_bDynamicsIsAdvancedSize(p_stDynamic))
{
MTH3D_M_vNullVector (DNM_M_pDynamicsGetInertiaTranslation(p_stDynamic));
}
}
void MEC_fn_vImposeActorMatrix
(
HIE_tdxHandleToSuperObject hSupObj
)
{
POS_tdxHandleToPosition hCurrentMatrix, hPreviousMatrix, hAbsolutePreviousMatrix, hPrevPreviousMatrix, hGlobalMatrix;
struct DNM_stDynamics *p_stDynamic;
p_stDynamic = fn_p_stDynamGetDynamicsSO (hSupObj);
if (!p_stDynamic) return;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
hGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (hSupObj);
POS_fn_vCopyMatrix ( hCurrentMatrix, hGlobalMatrix );
POS_fn_vCopyMatrix ( hPreviousMatrix, hGlobalMatrix );
MTH3D_M_vNullVector ( DNM_M_pDynamicsGetPreviousSpeed(p_stDynamic) );
DNM_M_vDynamicsSetActorMove (p_stDynamic,TRUE);
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic))
{
hAbsolutePreviousMatrix = DNM_M_p_stDynamicsGetAbsolutePreviousMatrix (p_stDynamic);
hPrevPreviousMatrix = DNM_M_p_stDynamicsGetPrevPreviousMatrix (p_stDynamic);
POS_fn_vCopyMatrix ( hAbsolutePreviousMatrix, hGlobalMatrix );
POS_fn_vCopyMatrix ( hPrevPreviousMatrix, hGlobalMatrix );
}
}
void MEC_vTurnAroundZAxis
(
struct DNM_stDynamics *p_stDynamic,
MTH_tdxReal xAngle
)
{
POS_tdxHandleToPosition hCurrentMatrix;
MTH3D_tdstVector stVectorZ;
MTH3D_tdstVector stMove;
if (DNM_M_bDynamicsIsInit(p_stDynamic)) return;
if (MTH_M_bIsNull(xAngle)) return;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
if (DNM_M_bDynamicsIsTilt(p_stDynamic))
{
MTH3D_tdstVector stI, stJ, stK;
MTH_tdxReal xCos, xSin;
POS_tdxHandleToPosition hMatrix;
POS_tdstCompletePosition stMatrix;
hMatrix = &stMatrix;
xCos = MTH_M_xCos ( xAngle );
xSin = MTH_M_xSin ( xAngle );
/*FB030898*/
/*POS_fn_vGetTranslationVector ( hCurrentMatrix, &stMove );*/
MTH3D_M_vCopyVector(&stMove, &(hCurrentMatrix->stTranslationVector) );
/*END FB*/
/*FB030898*/
/*POS_fn_vSetIdentityMatrix ( hMatrix );*/
POS_fn_vCopyMatrix(hMatrix, (POS_tdstCompletePosition *) POS_g_p_stIdentityMatrix);
/*END FB*/
MTH3D_M_vSetVectorElements ( &stI, xCos, xSin, MTH_C_ZERO );
MTH3D_M_vSetVectorElements ( &stJ, MTH_M_xNeg(xSin), xCos, MTH_C_ZERO );
MTH3D_M_vSetBaseKVector ( &stK );
POS_fn_vSetRotationMatrix ( hMatrix, &stI, &stJ, &stK );
POS_fn_vMulMatrixMatrix ( hCurrentMatrix, hMatrix, hCurrentMatrix );
/*FB030898*/
/*POS_fn_vSetTranslationVector ( hCurrentMatrix, &stMove );*/
MTH3D_M_vCopyVector( &(hCurrentMatrix->stTranslationVector), &stMove );
/*END FB*/
return;
}
/*FB030898*/
/*POS_fn_vGetTranslationVector ( hCurrentMatrix, &stMove );*/
MTH3D_M_vCopyVector(&stMove, &(hCurrentMatrix->stTranslationVector) );
/*END FB*/
MTH3D_M_vSetVectorElements ( &stVectorZ, MTH_C_ZERO, MTH_C_ZERO, MTH_C_MinusONE );
POS_fn_vRotatePositionAroundAxis (hCurrentMatrix, &stVectorZ, xAngle);
/*FB030898*/
/*POS_fn_vSetTranslationVector ( hCurrentMatrix, &stMove );*/
MTH3D_M_vCopyVector( &(hCurrentMatrix->stTranslationVector), &stMove );
/*END FB*/
}
void MEC_vTurnAbsolute
(
struct DNM_stDynamics *p_stDynamic,
MTH3D_tdstVector* p_stVector
)
{
POS_tdxHandleToPosition hCurrentMatrix;
MTH3D_tdstVector *p_stI, *p_stJ, *p_stK;
if (DNM_M_bDynamicsIsInit(p_stDynamic)) return;
if (MTH3D_M_bIsNullVector(p_stVector)) return;
hCurrentMatrix = DNM_M_p_stDynamicsGetCurrentMatrix (p_stDynamic);
POS_fn_vGetRotationVector (hCurrentMatrix,&p_stI,&p_stJ,&p_stK);
MTH3D_M_vNormalizeVector ( p_stJ,p_stVector);
MTH3D_M_vNegVector ( p_stJ, p_stJ );
MTH3D_M_vCrossProductVector (p_stI,p_stJ,p_stK);
MTH3D_M_vCrossProductVector (p_stJ,p_stK,p_stI);
MEC_fn_vUpdateMatrix ( p_stDynamic, hCurrentMatrix );
if (DNM_M_bDynamicsIsComplexSize(p_stDynamic)) MEC_fn_vCancelTilt (p_stDynamic);
}
void DNM_fn_vSetHangingLimit
(
struct DNM_stDynamics *p_stDynamic,
MTH_tdxReal xValue
)
{
if (MEC_fn_bIsPlatform(p_stDynamic))
DNM_M_vDynamicsSetHangingLimit (p_stDynamic,MTH_M_xSub ( xValue, MTH3D_M_xGetZofVector(POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(DNM_M_hDynamicsGetPlatformSO(p_stDynamic)))) ) );
else
DNM_M_vDynamicsSetHangingLimit (p_stDynamic,xValue);
}
/* Update speed for camera */
void MEC_fn_vUpdateSpeed (HIE_tdxHandleToSuperObject hSupObj)
{
MS_tdxHandleToDynam h_Dynam;
struct DNM_stDynamics *p_stDynamic;
MTH3D_tdstVector *p_stSpeed;
POS_tdxHandleToPosition hPreviousMatrix;
MTH3D_tdstVector *p_stCurrentX, *p_stCurrentY, *p_stCurrentZ;
MTH3D_tdstVector stPreviousY;
MTH3D_tdstVector stAxis;
MTH3D_tdstVector stCrossProduct;
MTH_tdstMove* p_stMove;
MTH_tdxReal xDotProd, xAngle;
h_Dynam = M_GetMSHandle(hSupObj,Dynam);
if (!h_Dynam) return;
p_stDynamic = fn_p_stDynamGetDynamics(h_Dynam);
if ( !DNM_M_bDynamicsIsComplexSize(p_stDynamic) || !DNM_M_bDynamicsIsCollisionReport(p_stDynamic) ) return;
p_stSpeed = DNM_M_pDynamicsGetPreviousSpeed (p_stDynamic);
hPreviousMatrix = DNM_M_p_stDynamicsGetPreviousMatrix (p_stDynamic);
/* Update Dynamic Report speed linear -> to keep speed variable in IA */
/* to CB's camera */
POS_fn_vGetRotationVector ( hPreviousMatrix, &p_stCurrentX, &p_stCurrentY, &p_stCurrentZ );
p_stMove = DNM_M_p_stReportGetAbsoluteCurrSpeed ( DNM_M_p_stDynamicsGetReport (p_stDynamic) );
MTH3D_M_vCopyVector (&stPreviousY,MTH_M_p_stRotationGetAxis(MTH_M_p_stMoveGetAngular(p_stMove)));
xDotProd = MTH3D_M_xDotProductVector (&stPreviousY,p_stCurrentY);
MTH3D_M_vCrossProductVectorWithoutBuffer (&stCrossProduct, &stPreviousY, p_stCurrentY);
/* check |xDotProd|<=1 */
xDotProd = MTH_M_xMin ( MTH_M_xMax ( xDotProd, MTH_C_MinusONE ), MTH_C_ONE );
if (MTH_M_bGreater(MTH3D_M_xGetZofVector(&stCrossProduct),MTH_C_ZERO)) xAngle = MTH_M_xACos (xDotProd);
else xAngle = MTH_M_xNeg (MTH_M_xACos(xDotProd));
MTH3D_M_vSetBaseKVector (&stAxis);
MTH_M_MoveSetAngularPosition ( p_stMove, xAngle, &stAxis );
}