reman3/Rayman_X/cpa/tempgrp/AI/AIGame/CAM_Tool.c

1055 lines
37 KiB
C

/*
**************************************************************************************************
* Tool functions for camera AI.
**************************************************************************************************
*/
#define D_CineInfo_StructureDefine
#include "AIUseCPA.h"
#include "specif/AITools.h"
#include "GEO.h"
#include "GLI.h"
#include "COL.h"
#include "PO.h"
/*XB980821*/
#ifndef D_THROW_IPO
#include "IPO.h"
#endif /* D_THROW_IPO */
/*End XB*/
/* Shaitan Clean Env {*/
/*#include "ENV.h"*/
/*End Shaitan Clean Env }*/
#include "SND.h"
/* Shaitan Clean Env {*/
/*#include "SRF.h"*/
/*End Shaitan Clean Env }*/
#include "SCT.h"
#include "GAM.h"
#include "CAM_Base.h"
#include "CAM_Vis.h"
#include "CAM_Tool.h"
#include "safe.h"
/*
**************************************************************************************************
**************************************************************************************************
TOOLS
**************************************************************************************************
**************************************************************************************************
*/
/*
*=================================================================================================
* Fast memcpy
*=================================================================================================
*/
void CAM_memcpy(void *dest, void *src, long size)
{
register long *psrc = (long*)src;
register long *pdest = (long*)dest;
register long lsize = size;
while(lsize >= 4)
{
*pdest++ = *psrc++;
lsize -= 4;
}
while(lsize)
{
*((char *)pdest++) = *((char *)psrc++);
lsize--;
}
}
/*
*=================================================================================================
* Activate or desactivate an internal flag.
*=================================================================================================
*/
void CAM_fn_vSetResetInternalFlag
(
MS_tdxHandleToCineinfo _hCineInfo,
unsigned short *_p_uwCurrentValue,
unsigned short *_p_uwVisibilityValue,
unsigned short *_p_uwWorkValue,
long _lTypeOfChange,
long _lChangingMode,
unsigned short _uwFlag
)
{
if (_lTypeOfChange == 1)
{
CAM_fn_vSetCineinfoWorkFromCurrent(_hCineInfo);
if (_lChangingMode)
*_p_uwWorkValue |= _uwFlag;
else
*_p_uwWorkValue &= ~_uwFlag;
}
else
{
if (_lChangingMode)
{
*_p_uwCurrentValue |= _uwFlag;
*_p_uwVisibilityValue |= _uwFlag;
*_p_uwWorkValue |= _uwFlag;
}
else
{
*_p_uwCurrentValue &= ~_uwFlag;
*_p_uwVisibilityValue &= ~_uwFlag;
*_p_uwWorkValue &= ~_uwFlag;
}
}
}
/*
*=================================================================================================
* Force the camera to be at a given position.
*=================================================================================================
*/
void CAM_fn_vForceCameraPos(HIE_tdxHandleToSuperObject _hSuperObjCamera, MTH3D_tdstVector *_p_stPosition)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
DNM_tdstReport *p_stReport;
/* MTH3D_tdstVector stTempVector;*/
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
p_stReport = fn_pstGetDNMReport(_hSuperObjCamera);
/*
* Force position in global and local matrix.
*/
POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(_hSuperObjCamera), _p_stPosition);
POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectMatrix(_hSuperObjCamera), _p_stPosition);
/*
* Init Last move in report camera
*/
/* MTH3D_M_vNullVector(&stTempVector);*/
/* MTH3D_M_vCopyVector(DNM_M_p_stReportGetLastMove(p_stReport), &stTempVector);*/
MTH3D_M_vNullVector(DNM_M_p_stReportGetLastMove(p_stReport));
/*
* Recompute sector of camera.
*/
fn_vSectInfoInitForSingleCharacter(_hSuperObjCamera, _p_stPosition);
}
/*
*=================================================================================================
* Force the camera to be at a given position.
*=================================================================================================
*/
void CAM_fn_vForceCameraTgt
(
HIE_tdxHandleToSuperObject _hSuperObjCamera,
MTH3D_tdstVector *_p_stPosition,
MTH3D_tdstVector *_p_stRefAxisZ
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MS_tdxHandleToDynam h_Dynam;
MS_tdxHandleToCineinfo hCineInfo;
DNM_tdstParsingDatas *p_stParsingDatas;
DNM_tdstReport *p_stReport;
MTH3D_tdstVector stX, stY, stZ;
MTH3D_tdstVector stCameraPosition;
/* MTH3D_tdstVector stTempVector;*/
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
hCineInfo = M_GetMSHandle(_hSuperObjCamera, Cineinfo);
h_Dynam = M_GetMSHandle(_hSuperObjCamera, Dynam);
p_stReport = fn_pstGetDNMReport(_hSuperObjCamera);
p_stParsingDatas = fn_p_stDynamGetParsingDatas(h_Dynam);
/*
* Get current camera position.
*/
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(_hSuperObjCamera), &stCameraPosition);
/*
* Compute system axis.
*/
MTH3D_M_vCopyVector(&stZ, _p_stRefAxisZ);
CAM_fn_vComputeCameraSystemAxis
(
fn_p_stDynamGetDynamics(h_Dynam),
_hSuperObjCamera,
&stCameraPosition,
_p_stPosition,
&stX,
&stY,
&stZ
);
/*
* Set Rotation Matrix
*/
POS_fn_vSetRotationMatrix(HIE_fn_hGetSuperObjectMatrix(_hSuperObjCamera), &stX, &stY, &stZ);
POS_fn_vSetRotationMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(_hSuperObjCamera), &stX, &stY, &stZ);
/*
* - Set Target pos in ParsingDatas structure
* - Init Last move Target in report camera
* - Init Last Good Target Position in report camera
*/
MTH3D_M_vCopyVector(DNM_M_p_stCPDGetTarget(p_stParsingDatas), _p_stPosition);
/* MTH3D_M_vNullVector(&stTempVector);*/
/* MTH3D_M_vCopyVector(DNM_M_p_stReportGetLastTgtMove(p_stReport), &stTempVector);*/
MTH3D_M_vNullVector(DNM_M_p_stReportGetLastTgtMove(p_stReport));
}
/*
*=================================================================================================
* Test if perso is moving
*=================================================================================================
*/
ACP_tdxBool CAM_fn_bPersoIsMoving(CAM_tdstUpdateCamera *_p_stStruct, MTH3D_tdstVector *_p_stMove)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MTH3D_tdstVector stMove;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
CAM_fn_vAverageSpeed(_p_stStruct->hCineinfo, CAM_C_xAverageForComputeLinearSpeed, &stMove);
if(MTH_M_bGreater(MTH3D_M_xNormVector(&stMove), CAM_C_xMinLinearSpeedTgtPerso))
{
if(_p_stMove)
{
MTH3D_M_vCopyVector(_p_stMove, &stMove);
}
return TRUE;
}
if(_p_stMove)
MTH3D_M_vNullVector(_p_stMove);
return FALSE;
}
/*
*=================================================================================================
* Test if perso is moving
*=================================================================================================
*/
ACP_tdxBool CAM_fn_bPersoIsTurning(HIE_tdxHandleToSuperObject _h_SuperObjPerso, MTH_tdxReal *_p_xAngularSpeed)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MS_tdxHandleToDynam h_Dynam;
DNM_tdstDynamics *p_stDynamics;
DNM_tdstReport *p_stReport;
/* DNM_tdstMove *p_stSpeed;*/
MTH_tdxReal xAngle;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(_p_xAngularSpeed)
*_p_xAngularSpeed = MTH_C_ZERO;
h_Dynam = M_GetMSHandle(_h_SuperObjPerso, Dynam);
if(h_Dynam == NULL)
return FALSE;
p_stDynamics = fn_p_stDynamGetDynamics(h_Dynam);
if(p_stDynamics == NULL)
return FALSE;
p_stReport = DNM_M_p_stDynamicsGetReport(p_stDynamics);
if(p_stReport == NULL)
return FALSE;
xAngle = MTH_M_xRotationGetAngle(MTH_M_p_stMoveGetAngular(DNM_M_p_stReportGetAbsoluteCurrSpeed(p_stReport)));
if(MTH_M_bGreater(xAngle, CAM_C_xMinAngularSpeedTgtPerso))
{
if(_p_xAngularSpeed)
*_p_xAngularSpeed = xAngle;
return TRUE;
}
return FALSE;
}
/*
*=================================================================================================
* Get normal of face of perso.
*=================================================================================================
*/
ACP_tdxBool CAM_fn_bPersoOnFace(HIE_tdxHandleToSuperObject _h_SuperObjPerso, MTH3D_tdstVector *_p_stNormal)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MS_tdxHandleToDynam h_Dynam;
DNM_tdstDynamics *p_stDynamics;
DNM_tdstReport *p_stReport;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/*
* Get the normal of the face the targeted perso is walking on.
*/
h_Dynam = M_GetMSHandle(_h_SuperObjPerso, Dynam);
if(h_Dynam == NULL)
return FALSE;
p_stDynamics = fn_p_stDynamGetDynamics(h_Dynam);
if(p_stDynamics == NULL)
return FALSE;
p_stReport = DNM_M_p_stDynamicsGetReport(p_stDynamics);
if(p_stReport == NULL)
return FALSE;
/* Check if perso is on a ground */
if(!(p_stReport->m_ulCurrSurfaceState & C_WOT_ulGround))
return FALSE;
MTH3D_M_vCopyVector(_p_stNormal, &p_stReport->m_stGround.m_stNorm);
return TRUE;
}
/*
*=================================================================================================
* Get the current father of a perso.
*=================================================================================================
*/
HIE_tdxHandleToSuperObject CAM_fn_hGetFather(HIE_tdxHandleToSuperObject _h_SuperObjPerso)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MS_tdxHandleToDynam h_Dynam;
DNM_tdstDynamics *p_stDynamics;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(_h_SuperObjPerso == NULL)
return NULL;
h_Dynam = M_GetMSHandle(_h_SuperObjPerso, Dynam);
if(h_Dynam == NULL)
return NULL;
p_stDynamics = fn_p_stDynamGetDynamics(h_Dynam);
if(p_stDynamics == NULL)
return NULL;
if (!DNM_M_bDynamicsIsComplexSize(p_stDynamics)) return NULL;
return DNM_M_hDynamicsGetPlatformSO(p_stDynamics);
}
/*
*=================================================================================================
* Projection of a vector on to a plane defined by a norm
*=================================================================================================
*/
void CAM_fn_vComputeProjection
(
MTH3D_tdstVector *_p_sDestVector,
MTH3D_tdstVector *_p_sSrcVector,
MTH3D_tdstVector *_p_sNormVector
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MTH_tdxReal xScalar;
MTH3D_tdstVector stNormPart;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(!MTH_M_bEqualZero(xScalar = MTH3D_M_xDotProductVector(_p_sSrcVector, _p_sNormVector)))
{
MTH3D_M_vMulScalarVector(&stNormPart, xScalar, _p_sNormVector);
/* MTH3D_M_vSubVector(&stNormPart, _p_sSrcVector, &stNormPart);*/
/* MTH3D_M_vCopyVector(_p_sDestVector, &stNormPart);*/
MTH3D_M_vSubVector(_p_sDestVector, _p_sSrcVector, &stNormPart);
}
else
{
MTH3D_M_vCopyVector(_p_sDestVector, _p_sSrcVector);
}
}
/*
*=================================================================================================
* computing rotation between two vectors
*=================================================================================================
*/
MTH_tdxReal CAM_fn_xComputeRotation
(
MTH3D_tdstVector *_p_stDestVector,
MTH3D_tdstVector *_p_stSrcVector,
MTH3D_tdstVector *_p_stAxisVector
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MTH_tdxReal xCos;
MTH_tdxReal xDenom, xNumer;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* formula : cos(a,b) = a.b / sqrt(a.a * b.b) operation : 1 div, 1 sqrt, 10 mul, 6 add */
if( MTH3D_M_bIsNullVector(_p_stSrcVector) || MTH3D_M_bIsNullVector(_p_stDestVector) )
return MTH_C_ZERO;
xDenom = MTH_M_xMul( MTH3D_M_xSqrVector( _p_stSrcVector ), MTH3D_M_xSqrVector( _p_stDestVector ) );
xNumer = MTH3D_M_xDotProductVector( _p_stSrcVector, _p_stDestVector );
xCos = MTH_M_xDiv( xNumer, MTH_M_xSqrt( xDenom ) );
if(_p_stAxisVector)
{
MTH3D_M_vCrossProductVector(_p_stAxisVector, _p_stSrcVector, _p_stDestVector);
if(!MTH3D_M_bIsNullVector(_p_stAxisVector))
{
MTH3D_M_vNormalizeVector(_p_stAxisVector, _p_stAxisVector);
}
}
if (MTH_M_bLess(xCos,MTH_C_MinusONE))
xCos = MTH_C_MinusONE;
else if (MTH_M_bGreater(xCos,MTH_C_ONE))
xCos =MTH_C_ONE;
return (MTH_M_xACos(xCos));
}
/*
*=================================================================================================
* Two vectors are equal with epsilon ?
*=================================================================================================
*/
ACP_tdxBool CAM_fn_bEqualVectorWithEpsilon
(
MTH3D_tdstVector *_p_stVector1,
MTH3D_tdstVector *_p_stVector2,
MTH_tdxReal _xEpsilon
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MTH3D_tdstVector stDiffVector;
MTH_tdxReal xDist;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MTH3D_M_vSubVector(&stDiffVector, _p_stVector1, _p_stVector2);
xDist = MTH3D_M_xSqrVector(&stDiffVector);
if(MTH_M_bGreater(xDist, MTH_M_xSqr(_xEpsilon)))
return FALSE;
else
return TRUE;
}
/*
*=================================================================================================
* Check validity of the computed angles
*=================================================================================================
*/
void CAM_fn_vCheckValidityOfComputedAngles
(
MS_tdxHandleToInternalCineinfo _hIntCineInfo,
MTH_tdxReal *_p_xHorizontalAngle,
MTH_tdxReal *_p_xVerticalAngle
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MTH_tdxReal xAbsHorizontalAngle, xAbsVerticalAngle;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
xAbsHorizontalAngle = MTH_M_xAbs(*_p_xHorizontalAngle);
xAbsVerticalAngle = MTH_M_xAbs(*_p_xVerticalAngle);
if(MTH_M_bGreater(xAbsVerticalAngle, MTH_C_PiBy2))
{
if (MTH_M_bGreater(*_p_xVerticalAngle, MTH_C_ZERO))
*_p_xVerticalAngle = MTH_M_xSub(MTH_C_Pi, *_p_xVerticalAngle);
else
*_p_xVerticalAngle = MTH_M_xSub(MTH_M_xNeg(MTH_C_Pi), *_p_xVerticalAngle);
}
*_p_xHorizontalAngle = CAM_fn_xSetAngleInInterval02Pi(*_p_xHorizontalAngle);
*_p_xVerticalAngle = CAM_fn_xSetAngleInInterval02Pi(*_p_xVerticalAngle);
}
/*
*=================================================================================================
* Compute horizontal angle and vertical angle between two Vector
*=================================================================================================
*/
void CAM_fn_vComputeAnglesBetweenTwoVectors
(
MS_tdxHandleToInternalCineinfo _hIntCineInfo,
MTH3D_tdstVector *_p_stSourceVector,
MTH3D_tdstVector *_p_stTargetVector,
MTH_tdxReal *_p_xHorizontalAngle,
MTH_tdxReal *_p_xVerticalAngle,
MTH3D_tdstVector *_p_stRefAxisZ
)
{
*_p_xHorizontalAngle = CAM_fn_xComputeHorizontalAngle(_p_stSourceVector, _p_stTargetVector, _p_stRefAxisZ);
*_p_xVerticalAngle = CAM_fn_xComputeVerticalAngle(_p_stSourceVector, _p_stTargetVector, _p_stRefAxisZ);
CAM_fn_vCheckValidityOfComputedAngles(_hIntCineInfo, _p_xHorizontalAngle, _p_xVerticalAngle);
}
/*
*=================================================================================================
* Set the angle in ]-Pi,Pi] :
*=================================================================================================
*/
MTH_tdxReal CAM_fn_xSetAngleInIntervalPiPi(MTH_tdxReal _xAngle)
{
if(MTH_M_bGreater(_xAngle, MTH_C_Pi))
return (MTH_M_xSub(_xAngle, MTH_C_2Pi));
else if(MTH_M_bLessEqual(_xAngle, MTH_M_xNeg(MTH_C_Pi)))
return (MTH_M_xAdd(_xAngle, MTH_C_2Pi));
else
return (_xAngle);
}
/*
*=================================================================================================
* Set the angle in [0,2Pi[ :
*=================================================================================================
*/
MTH_tdxReal CAM_fn_xSetAngleInInterval02Pi(MTH_tdxReal _xAngle)
{
if (MTH_M_bLess(_xAngle, MTH_C_ZERO))
return(MTH_M_xAdd(_xAngle, MTH_C_2Pi));
else if (MTH_M_bGreaterEqual(_xAngle, MTH_C_2Pi))
return(MTH_M_xSub(_xAngle, MTH_C_2Pi));
else
return (_xAngle);
}
/*
**************************************************************************************************
**************************************************************************************************
**************************************************************************************************
**************************************************************************************************
*/
/*
*=================================================================================================
* Test if camera has reached the wanted position.
* Compute the current camera pos with the actuel global matrix.
*=================================================================================================
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
ACP_tdxBool CAM_fn_bPositionIsReached
(
HIE_tdxHandleToSuperObject _hCamera,
MTH3D_tdstVector *_p_stWantedPosition,
MTH_tdxReal _xDistMin,
MTH3D_tdstVector *_p_stCurrentPosition
)
{
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(_hCamera), _p_stCurrentPosition);
return(CAM_fn_bEqualVectorWithEpsilon(_p_stCurrentPosition, _p_stWantedPosition, _xDistMin));
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*
*=================================================================================================
* Compute sight axis of a perso. Sight axis depend on the perso matrix and dynamical state.
*=================================================================================================
*/
void CAM_fn_vGetPersoSightAxis(CAM_tdstUpdateCamera *_p_stStruct, MTH3D_tdstVector *_p_stAxis, MTH3D_tdstVector *_p_stAxisZ)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MTH3D_tdstVector stFirstComplementaryAxis;
MTH3D_tdstVector stSecondComplementaryAxis;
POS_tdstCompletePosition *p_stPersoGlobalMatrix;
MTH3D_tdstVector stTmpVector1, stTmpVector2;
/* MTH_tdxReal xSign;*/
unsigned char ucChannel;
HIE_tdxHandleToSuperObject hPerso;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
hPerso = _p_stStruct->hCineinfoWork->hSuperObjectTargeted;
fn_vGetPersoSightAxisSystem
(
_p_stStruct->hCineinfo,
_p_stAxis,/*&stAxis */
&stFirstComplementaryAxis,
&stSecondComplementaryAxis
);
if ((ucChannel = _p_stStruct->hCineinfoWork->cChannel) != C_ucUnknownChannel)
{
/* FBF blindage acces modules {*/
#ifdef ACTIVE_EDITOR
fn_vCheckModuleAccess(hPerso,TRUE, &ucChannel);
#endif
/* } fin blindage acces modules */
hPerso = fn_hGetSuperObjectInChannel(fn_h3dDataGetChannelSOList(M_GetMSHandle(hPerso, 3dData)),(short) ucChannel);
}
p_stPersoGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(hPerso);
/* if (MTH_M_bEqual(MTH_M_xAbs((xSign = MTH3D_M_xGetXofVector(_p_stAxis))), MTH_C_ONE))
{
POS_fn_vGetRotationMatrix( p_stPersoGlobalMatrix, _p_stAxis, &stTmpVector1, &stTmpVector2);
if (_p_stAxisZ)
MTH3D_M_vCopyVector(_p_stAxisZ, &stTmpVector2);
}
else
{
if (MTH_M_bEqual(MTH_M_xAbs((xSign=MTH3D_M_xGetZofVector(_p_stAxis))), MTH_C_ONE))
{
POS_fn_vGetRotationMatrix(p_stPersoGlobalMatrix, &stTmpVector1, &stTmpVector2, _p_stAxis);
if (_p_stAxisZ)
MTH3D_M_vNegVector(_p_stAxisZ, &stTmpVector2);
}
else
{
xSign = MTH3D_M_xGetYofVector(_p_stAxis);
POS_fn_vGetRotationMatrix(p_stPersoGlobalMatrix, &stTmpVector1, _p_stAxis, &stTmpVector2);
if (_p_stAxisZ)
MTH3D_M_vCopyVector(_p_stAxisZ, &stTmpVector2);
}
}
if (MTH_M_bLessZero(xSign))
{
MTH3D_M_vNegVector(_p_stAxis, _p_stAxis);
}*/
/* Force axis to be -Y*/
POS_fn_vGetRotationMatrix(p_stPersoGlobalMatrix, &stTmpVector1, _p_stAxis, &stTmpVector2);
if (_p_stAxisZ)
MTH3D_M_vCopyVector(_p_stAxisZ, &stTmpVector2);
MTH3D_M_vNegVector(_p_stAxis, _p_stAxis);
}
/*
**************************************************************************************************
**************************************************************************************************
**************************************************************************************************
**************************************************************************************************
*/
MTH_tdxReal Cam_fn_xComputeProjectionRail
(
MTH3D_tdstVector *_p_stTargetedPersoPos,
MTH3D_tdstVector *_p_stWpPosition,
MTH3D_tdstVector *_p_stDestWpPosition
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MTH3D_tdstVector stAxe;
MTH3D_tdstVector stTargetWp;
MTH3D_tdstVector stProjectedVector;
MTH3D_tdstVector stProjectedPoint;
MTH_tdxReal xFactor;
MTH_tdxReal xDotProduct;
MTH_tdxReal xSqrNorm;
MTH_tdxReal xDist1, xDist2;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MTH3D_M_vSubVector(&stTargetWp, _p_stTargetedPersoPos, _p_stWpPosition);
MTH3D_M_vSubVector(&stAxe, _p_stDestWpPosition, _p_stWpPosition);
/*
* Factor of projection of Vector on Rail Axis
*/
xSqrNorm = MTH3D_M_xSqrVector(&stAxe);
if (MTH_M_bIsNull(xSqrNorm))
{
return (MTH_C_InfinitPlus);
}
xDotProduct = MTH3D_M_xDotProductVector(&stAxe, &stTargetWp);
xFactor = MTH_M_xDiv(xDotProduct, xSqrNorm);
if(MTH_M_bLessZero(xFactor))
{
xDist1 = MTH3D_M_xVectorGap(_p_stWpPosition, _p_stTargetedPersoPos);
xDist2 = MTH3D_M_xVectorGap(_p_stDestWpPosition, _p_stTargetedPersoPos);
if (MTH_M_bGreater(xDist1,xDist2))
return (xDist2);
else
return (xDist1);
}
MTH3D_M_vMulScalarVector(&stProjectedVector, xFactor, &stAxe);
MTH3D_M_vAddVector(&stProjectedPoint, &stProjectedVector, _p_stWpPosition);
return (MTH3D_M_xVectorGap(&stProjectedPoint, _p_stTargetedPersoPos));
}
/*
*=================================================================================================
* Compute the camera moving on a rail
*=================================================================================================
*/
void Cam_fn_vComputeMovingOnRail
(
CAM_tdstUpdateCamera *_p_stStruct,
MTH3D_tdstVector *_p_stWantedPosition,
MTH3D_tdstVector *_p_stWpPosition,
MTH3D_tdstVector *_p_stPreviousWpPosition,
MTH_tdxReal _xDistWanted
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MTH3D_tdstVector stRailAxis;
MTH3D_tdstVector stTargetCamera;
MTH3D_tdstVector stVector;
MTH3D_tdstVector stVector1;
MTH3D_tdstVector stProjectedVector;
MTH3D_tdstVector stCameraNextWp;
MTH3D_tdstVector stProjectedPoint;
MTH3D_tdstVector stWpDestination;
MTH_tdxReal xFactor;
MTH_tdxReal xDotProduct;
MTH_tdxReal xNorm;
MTH_tdxReal xActualNorm;
MTH_tdxReal xSqrNorm;
MTH_tdxReal xDistWanted;
char cCameraIsOnWp = 0;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
CAM_fn_vComputeReferencePoint(_p_stStruct);
MTH3D_M_vSubVector(&stCameraNextWp, _p_stWpPosition, &_p_stStruct->stCurrentCameraPos);
MTH3D_M_vCopyVector(&stWpDestination, _p_stWpPosition);
MTH3D_M_vSubVector(&stTargetCamera, &_p_stStruct->stTargetedPersoPos, &_p_stStruct->stCurrentCameraPos);
/*
* Factor of projection of Vector on Rail Axis
*/
xSqrNorm = MTH3D_M_xSqrVector(&stCameraNextWp);
if (MTH_M_bIsNull(xSqrNorm))
{
MTH3D_M_vSubVector(&stCameraNextWp, &_p_stStruct->stCurrentCameraPos, _p_stPreviousWpPosition);
MTH3D_M_vCopyVector(&stWpDestination, _p_stPreviousWpPosition);
xSqrNorm = MTH3D_M_xSqrVector(&stCameraNextWp);
if (MTH_M_bIsNull(xSqrNorm))
{
MTH3D_M_vCopyVector(_p_stWantedPosition, &_p_stStruct->stCurrentCameraPos);
return;
}
cCameraIsOnWp = 1;
}
xDotProduct = MTH3D_M_xDotProductVector(&stCameraNextWp, &stTargetCamera);
xFactor = MTH_M_xDiv(xDotProduct, xSqrNorm);
if (!MTH_M_bIsNullWithEpsilon(xFactor,MTH_M_xFloatToReal(0.0001f)))
{
/* axis of rail */
if (cCameraIsOnWp)
{MTH3D_M_vSubVector(&stCameraNextWp, &_p_stStruct->stCurrentCameraPos, &stWpDestination);}
else
{MTH3D_M_vSubVector(&stCameraNextWp, &stWpDestination, &_p_stStruct->stCurrentCameraPos);}
MTH3D_M_vMulScalarVector(&stProjectedVector, xFactor, &stCameraNextWp);
MTH3D_M_vSubVector(&stVector1, &stTargetCamera, &stProjectedVector);
MTH3D_M_vAddVector(&stProjectedPoint, &_p_stStruct->stCurrentCameraPos, &stProjectedVector);
xNorm = MTH3D_M_xSqrVector(&stVector1);
xDistWanted = MTH_M_xSqr(_xDistWanted);
xActualNorm = MTH3D_M_xVectorGap(&stProjectedPoint, &_p_stStruct->stCurrentCameraPos);
if (!MTH_M_bGreater(xNorm, xDistWanted))
{
xNorm = MTH_M_xSqrt(MTH_M_xSub(xDistWanted, xNorm));
if (MTH_M_bGreater(xNorm, xActualNorm))
{
xNorm = MTH_M_xSub(xNorm, xActualNorm);
if (MTH_M_bGreaterZero(xFactor))
{MTH3D_M_vCopyVector(&stWpDestination, _p_stPreviousWpPosition);}/* Change he sens of moving*/
else
{if (cCameraIsOnWp) {return;}}/* No moving*/
}
else
{
xNorm = MTH_M_xSub(xActualNorm, xNorm);
if (MTH_M_bLessZero(xFactor))
{MTH3D_M_vCopyVector(&stWpDestination, _p_stPreviousWpPosition);} /* Change he sens of moving*/
else
{if (cCameraIsOnWp) {return;}}/* No moving*/
}
}
else
{
/*
* Go to the projected point
*/
if (MTH_M_bLessZero(xFactor))
{MTH3D_M_vCopyVector(&stWpDestination, _p_stPreviousWpPosition);} /* Change he sens of moving*/
else
{if (cCameraIsOnWp) return;} /* No moving*/
xNorm = xActualNorm;
}
MTH3D_M_vSubVector(&stRailAxis, &stWpDestination, &_p_stStruct->stCurrentCameraPos);
if (MTH_M_bGreater(xNorm,MTH3D_M_xNormVector(&stRailAxis)))
{
MTH3D_M_vCopyVector(_p_stWantedPosition, &stWpDestination);
}
else
{
MTH3D_M_vNormalizeVector(&stRailAxis,&stRailAxis);
MTH3D_M_vMulScalarVector(&stVector, xNorm, &stRailAxis);
MTH3D_M_vAddVector(_p_stWantedPosition, &_p_stStruct->stCurrentCameraPos, &stVector);
}
}
}
/*
**************************************************************************************************
**************************************************************************************************
**************************************************************************************************
**************************************************************************************************
*/
/*
*=================================================================================================
* Init camera stucture.
*=================================================================================================
*/
void CAM_fn_vInitCameraStructure(HIE_tdxHandleToSuperObject _hSuperObjPerso, CAM_tdstUpdateCamera *_p_stStruct)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MS_tdxHandleToDynam hDynam;
MTH3D_tdstVector stTempVector;
DNM_tdstDynamics *p_stDynamics;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
memset(_p_stStruct, 0, sizeof(CAM_tdstUpdateCamera));
/*
* Init camera stucture.
*/
hDynam = M_GetMSHandle(_hSuperObjPerso, Dynam);
_p_stStruct->p_stDynamics = fn_p_stDynamGetDynamics(hDynam);
_p_stStruct->p_stReport = DNM_M_p_stDynamicsGetReport(_p_stStruct->p_stDynamics);
_p_stStruct->hCineinfo = M_GetMSHandle(_hSuperObjPerso, Cineinfo);
_p_stStruct->hCineinfoWork = M_GetCineinfo(_hSuperObjPerso, Work);
_p_stStruct->hCineinfoCurrent = M_GetCineinfo(_hSuperObjPerso, Current);
_p_stStruct->hCineinfoInit = M_GetCineinfo(_hSuperObjPerso, Init);
_p_stStruct->hCineinfoVisibility = M_GetCineinfo(_hSuperObjPerso, Visibility);
_p_stStruct->hSuperObjCamera = _hSuperObjPerso;
/*
* Current camera pos.
*/
POS_fn_vGetTranslationVector
(
HIE_fn_hGetSuperObjectGlobalMatrix(_hSuperObjPerso),
&_p_stStruct->stCurrentCameraPos
);
/*
* Does targeted perso is moving ?
* We update _p_stStruct->stTgtPersoMove only if perso is moving (cause we want to
* remember the last move vector of the perso).
*/
if(_p_stStruct->hCineinfoWork->hSuperObjectTargeted != NULL)
{
/* Absolute move */
_p_stStruct->cTgtPersoIsMovingAbsolute = CAM_fn_bPersoIsMoving
(
_p_stStruct,
&_p_stStruct->stTgtPersoMoveAbsolute
);
/* Relative move */
if(CAM_fn_hGetFather(_p_stStruct->hCineinfoWork->hSuperObjectTargeted) == NULL)
{
_p_stStruct->cTgtPersoIsMovingRelative = _p_stStruct->cTgtPersoIsMovingAbsolute;
MTH3D_M_vCopyVector(&_p_stStruct->stTgtPersoMoveRelative, &_p_stStruct->stTgtPersoMoveAbsolute);
}
else
{
hDynam = M_GetMSHandle(_p_stStruct->hCineinfoWork->hSuperObjectTargeted, Dynam);
p_stDynamics = fn_p_stDynamGetDynamics(hDynam);
POS_fn_vGetTranslationVector(DNM_M_p_stDynamicsGetPrevPreviousMatrix(p_stDynamics), &stTempVector);
POS_fn_vGetTranslationVector(DNM_M_p_stDynamicsGetPreviousMatrix(p_stDynamics), &_p_stStruct->stTgtPersoMoveRelative);
MTH3D_M_vSubVector(&_p_stStruct->stTgtPersoMoveRelative, &stTempVector, &_p_stStruct->stTgtPersoMoveRelative);
if(MTH_M_bGreater(MTH3D_M_xNormVector(&_p_stStruct->stTgtPersoMoveRelative), CAM_C_xMinLinearSpeedTgtPerso))
_p_stStruct->cTgtPersoIsMovingRelative = 1;
else
_p_stStruct->cTgtPersoIsMovingRelative = 0;
}
}
}
/*
**************************************************************************************************
**************************************************************************************************
**************************************************************************************************
**************************************************************************************************
*/
/*
*=================================================================================================
* Description:
* Send parameters to Parsing
* Fill the Macdpid structur
*=================================================================================================
*/
void CAM_fn_vSendParametersToParsing(CAM_tdstUpdateCamera *_p_stStruct)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
tdstMACDPID *p_stMACDPID;
DNM_tdstDynamics *p_stDynamics;
MS_tdxHandleToDynam h_Dynam;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if((h_Dynam = M_GetMSHandle(_p_stStruct->hSuperObjCamera, Dynam)) == NULL )
return;
if((p_stDynamics = fn_p_stDynamGetDynamics(h_Dynam)) == NULL)
return;
p_stMACDPID = DNM_M_p_stDynamicsGetExternalDatas(p_stDynamics);
/*
* Cut angle factor.
*/
M_xMACDPIDGetCutAngleFactorPos(p_stMACDPID) = CAM_C_xCutAngleFactorPos;
M_xMACDPIDGetCutAngleFactorTgt(p_stMACDPID) = CAM_C_xCutAngleFactorTgt;
/* Angle Theta */
M_xMACDPIDSetTheta(p_stMACDPID, _p_stStruct->hCineinfoWork->xAngleTheta);
/* Target and move vector */
MTH3D_M_vCopyVector(M_p_stMACDPIDGetTarget(p_stMACDPID), &_p_stStruct->stCptPos.stTarget);
MTH3D_M_vCopyVector(M_p_stMACDPIDGetMovePos(p_stMACDPID), &_p_stStruct->stCptPos.stMovePos);
/* Linear speed and speeding up */
M_xMACDPIDGetLinearSpeed(p_stMACDPID) = _p_stStruct->stCptPos.xLinearSpeed;
if(MTH_M_bEqual(_p_stStruct->hCineinfoWork->xLinearIncreaseSpeed, MTH_C_ZERO))
_p_stStruct->hCineinfoWork->xLinearIncreaseSpeed = MTH_M_xFloatToReal(0.001f);
M_xMACDPIDGetLinearIncreaseSpeed(p_stMACDPID) = _p_stStruct->hCineinfoWork->xLinearIncreaseSpeed;
M_xMACDPIDGetLinearDecreaseSpeed(p_stMACDPID) = _p_stStruct->hCineinfoWork->xLinearDecreaseSpeed;
/* Angular speed and speeding up */
M_xMACDPIDGetAngularSpeed(p_stMACDPID) = _p_stStruct->stCptPos.xAngularSpeed;
if(MTH_M_bEqual(_p_stStruct->hCineinfoWork->xAngularIncreaseSpeed, MTH_C_ZERO))
_p_stStruct->hCineinfoWork->xLinearIncreaseSpeed = MTH_M_xFloatToReal(0.001f);
M_xMACDPIDGetAngularIncreaseSpeed(p_stMACDPID) = _p_stStruct->hCineinfoWork->xAngularIncreaseSpeed;
M_xMACDPIDGetAngularDecreaseSpeed(p_stMACDPID) = _p_stStruct->hCineinfoWork->xAngularDecreaseSpeed;
/* Target speed and speeding up */
M_xMACDPIDGetTargetSpeed(p_stMACDPID) = _p_stStruct->stCptPos.xTargetSpeed;
if(MTH_M_bEqual(_p_stStruct->hCineinfoWork->xAngularIncreaseSpeed, MTH_C_ZERO))
_p_stStruct->hCineinfoWork->xTargetIncreaseSpeed = MTH_M_xFloatToReal(0.001f);
M_xMACDPIDGetTargetIncreaseSpeed(p_stMACDPID) = _p_stStruct->hCineinfoWork->xTargetIncreaseSpeed;
M_xMACDPIDGetTargetDecreaseSpeed(p_stMACDPID) = _p_stStruct->hCineinfoWork->xTargetDecreaseSpeed;
/* Reference point for camera position (only for angular parsing) */
MTH3D_M_vCopyVector(M_p_stMACDPIDGetPosReferencePoint(p_stMACDPID), &_p_stStruct->stTargetedPersoPos);
/* Reference axis Z to twist camera */
MTH3D_M_vCopyVector(M_p_stMACDPIDGetRefAxisZ(p_stMACDPID), &_p_stStruct->stCptPos.stRefAxisZ);
/*
* DNM Flags.
* Change DNM flags depending on context.
*/
/*---*/
if(_p_stStruct->hCineinfo->ucVolIAFlags & C_VolIAFlags_InitJustCopiedInCurrent)
{
_p_stStruct->hCineinfoWork->uwDNMFlags |= DNM_CAM_C_NoLinearParsing;
_p_stStruct->hCineinfoWork->uwDNMFlags |= DNM_CAM_C_NoAngularParsing;
_p_stStruct->hCineinfoWork->uwDNMFlags |= DNM_CAM_C_NoTargetParsing;
}
/*---*/
if(_p_stStruct->hCineinfoWork->hSuperObjectTargeted == NULL)
{
MTH3D_M_vNullVector(M_p_stMACDPIDGetPosReferencePoint(p_stMACDPID));
}
/*---*/
if(_p_stStruct->hCineinfoWork->uwIAFlags & C_IAFlags_PositionIsAlreadyComputed)
{
_p_stStruct->hCineinfoWork->uwDNMFlags |= DNM_CAM_C_NoAngularParsing;
MTH3D_M_vNullVector(M_p_stMACDPIDGetPosReferencePoint(p_stMACDPID));
}
/*---*/
if(_p_stStruct->hCineinfoWork->uwDNMFlags & DNM_CAM_C_FixedOrientation)
_p_stStruct->hCineinfoWork->uwDNMFlags |= DNM_CAM_C_NoTargetParsing;
/*---*/
if(_p_stStruct->hCineinfoWork->uwDNMFlags & DNM_CAM_C_NoLinearParsing)
{
_p_stStruct->hCineinfoWork->uwDNMFlags |= DNM_CAM_C_NoLinearInertia;
M_xMACDPIDGetCutAngleFactorPos(p_stMACDPID) = MTH_C_ONE;
}
/*---*/
if(_p_stStruct->hCineinfoWork->uwDNMFlags & DNM_CAM_C_NoAngularParsing)
{
_p_stStruct->hCineinfoWork->uwDNMFlags |= DNM_CAM_C_NoAngularInertia;
M_xMACDPIDGetCutAngleFactorPos(p_stMACDPID) = MTH_C_ONE;
}
/*---*/
if(_p_stStruct->hCineinfoWork->uwDNMFlags & DNM_CAM_C_NoTargetParsing)
{
_p_stStruct->hCineinfoWork->uwDNMFlags |= DNM_CAM_C_NoTargetInertia;
M_xMACDPIDGetCutAngleFactorTgt(p_stMACDPID) = MTH_C_ONE;
}
/*---*/
M_uwMACDPIDGetFlags(p_stMACDPID) = _p_stStruct->hCineinfoWork->uwDNMFlags;
/* If no collision, force camera sector to be the same as targeted perso */
if((_p_stStruct->hCineinfoWork->hSuperObjectTargeted) && (_p_stStruct->hCineinfoWork->uwDNMFlags & DNM_CAM_C_NoObstacle))
{
/* the camera is forced in the sector of its target */
fn_vSectInfoSetCurrentSector(M_GetMSHandle(_p_stStruct->hSuperObjCamera,SectInfo), fn_h_SectInfoGetCurrentSector(M_GetMSHandle(_p_stStruct->hCineinfoWork->hSuperObjectTargeted,SectInfo)));
//fn_vSectInfoInitForSingleCharacter(_p_stStruct->hSuperObjCamera, &_p_stStruct->stTargetedPersoRealPos);
}
if(!(_p_stStruct->cTgtPersoIsMovingAbsolute))
{
M_xMACDPIDGetCutAngleFactorPos(p_stMACDPID) = M_xMACDPIDGetCutAngleFactorTgt(p_stMACDPID) = MTH_C_ONE;
}
}
extern char cRefAxisIsAlreadyComputed;
extern char cNoDynChangeTheta;
extern char cCanTestStatic;
void CAM_fn_vForceBestPosition(HIE_tdxHandleToSuperObject _hCamera)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* HIE_tdxHandleToSuperObject hCamera;*/
MS_tdxHandleToCineinfo hCineinfo;
CAM_tdstUpdateCamera stStruct;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
hCineinfo = M_GetMSHandle(_hCamera, Cineinfo);
/*
* To have the actual good camera parameters.
*/
CAM_fn_vSetCineinfoWorkFromCurrent(hCineinfo);
CAM_fn_vInitCameraStructure(_hCamera, &stStruct);
cRefAxisIsAlreadyComputed = stStruct.hCineinfoWork->uwIAFlags & C_IAFlags_RefAxisIsAlreadyComputed ? 1 : 0;
cNoDynChangeTheta = stStruct.hCineinfoWork->uwIAFlags & C_IAFlags_NoDynChangeTheta ? 1 : 0;
cCanTestStatic = 1;
/*
* Compute target and real wanted camera pos (this is necessary
* for failure when we want a more correct position.
*/
CAM_fn_vComputeReferencePoint(&stStruct);
CAM_fn_vComputeTarget(&stStruct);
CAM_fn_vComputeRealWantedPos(&stStruct);
CAM_fn_vComputeMovePosWithDynTheta(&stStruct);
/*
* If no perso, can't do it.
*/
if(stStruct.hCineinfoCurrent->hSuperObjectTargeted == NULL)
return;
/*
* Force visibility failure.
*/
CAM_fn_vForceFailureVisibility(&stStruct);
CAM_fn_vComputeFailureVisibility(&stStruct);
/* stStruct.hCineinfoWork->uwDNMFlags |= (DNM_CAM_C_NoLinearParsing|DNM_CAM_C_NoAngularParsing);*/
}