reman3/Rayman_X/cpa/tempgrp/GAM/ToolMatr.c

221 lines
8.1 KiB
C

/* FM970130 : Matrix tool*/
/*=========================================================================
* ToolMatr.c : This module contain simple used functions
* This is a part of the Game project.
*
* It contains adding function concerning the matrix management
*
* Version 1.0
* Creation date 30/01/97
* Author Fabien MORALES
* Revision date
*
* That file needs to be compatible for all platforms.
*
* (c) Ubi Studios 1996
*=======================================================================*/
#include "ToolsCPA.h"
#include "Actions\AllActs.h"
#include "ToolMatr.h"
#include "TypeCam.h"
#define CAM_C_xAngleEpsilon ((MTH_tdxReal)1E-4)
/********************************************/
/* Operations on Rotation-Matrices */
/********************************************/
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Description: fn_vSetRotationMatrixX*/
/* Set the absolute angle of rotation (X axis) for a super perso matrix*/
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Methods: */
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Input: POS_tdstCompletePosition *p_stMatrix : super perso matrix*/
/* GLI_tdxValue xAngle*/
/* Output: void*/
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Creation date: Jan.30, 1997 Author: Fabien MORALES*/
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Modifications: */
/* Modification date: Modification Author: Fabien MORALES*/
/*/////////////////////////////////////////////////////////////////////////////////*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vSetRotationMatrixX ( POS_tdstCompletePosition *p_stMatrix ,
GLI_tdxValue xAngle )
{
MTH3D_tdstVector I,J,K;
/* compute the modified angle*/
/* x axis is (-y) axis*/
/* to do...*/
MTH3D_M_vSetVectorElements(&I,MTH_C_ONE,MTH_C_ZERO,MTH_C_ZERO);
MTH3D_M_vSetVectorElements(&J,MTH_C_ZERO,MTH_M_xCos(xAngle),MTH_M_xSin(xAngle));
MTH3D_M_vSetVectorElements(&K,MTH_C_ZERO,MTH_M_xNeg(MTH_M_xSin(xAngle)),MTH_M_xCos(xAngle));
POS_fn_vSetRotationMatrix( p_stMatrix ,&I,&J,&K) ;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Description: fn_vSetRotationMatrixY*/
/* Set the absolute angle of rotation (Y axis) for a superperso matrix*/
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Methods: */
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Input: POS_tdstCompletePosition *p_stMatrix : super perso matrix*/
/* GLI_tdxValue xAngle*/
/* Output: void*/
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Creation date: Jan.30, 1997 Author: Fabien MORALES*/
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Modifications: */
/* Modification date: Modification Author: Fabien MORALES*/
/*/////////////////////////////////////////////////////////////////////////////////*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vSetRotationMatrixY ( POS_tdstCompletePosition *p_stMatrix ,
GLI_tdxValue xAngle )
{
MTH3D_tdstVector I,J,K;
/* compute the modified angle*/
/* x axis is (-y) axis*/
/* to do...*/
MTH3D_M_vSetVectorElements(&I,MTH_M_xCos(xAngle),MTH_C_ZERO,MTH_M_xNeg(MTH_M_xSin(xAngle)));
MTH3D_M_vSetVectorElements(&J,MTH_C_ZERO,MTH_C_ONE,MTH_C_ZERO);
MTH3D_M_vSetVectorElements(&K,MTH_M_xSin(xAngle),MTH_C_ZERO,MTH_M_xCos(xAngle));
POS_fn_vSetRotationMatrix( p_stMatrix ,&I,&J,&K) ;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Description: fn_vSetRotationMatrixZ*/
/* Set the absolute angle of rotation (Z axis) for a superperso matrix*/
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Methods: */
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Input: POS_tdstCompletePosition *p_stMatrix : super perso matrix*/
/* GLI_tdxValue xAngle*/
/* Output: void*/
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Creation date: Jan.30, 1997 Author: Fabien MORALES*/
/*/////////////////////////////////////////////////////////////////////////////////*/
/* Modifications: */
/* Modification date: Modification Author: Fabien MORALES*/
/*/////////////////////////////////////////////////////////////////////////////////*/
void fn_vSetRotationMatrixZ ( POS_tdstCompletePosition *p_stMatrix ,
GLI_tdxValue xAngle )
{
MTH3D_tdstVector I,J,K;
GLI_tdxValue xModifiedAngle;
/* x axis is (-y) axis*/
xModifiedAngle= MTH_M_xAdd(xAngle,MTH_C_PiBy2);
MTH3D_M_vSetVectorElements(&I,MTH_M_xCos(xModifiedAngle),MTH_M_xSin(xModifiedAngle),MTH_C_ZERO);
MTH3D_M_vSetVectorElements(&J,MTH_M_xNeg(MTH_M_xSin(xModifiedAngle)),MTH_M_xCos(xModifiedAngle),MTH_C_ZERO);
MTH3D_M_vSetVectorElements(&K,MTH_C_ZERO,MTH_C_ZERO,MTH_C_ONE);
POS_fn_vSetRotationMatrix( p_stMatrix ,&I,&J,&K) ;
}
/*
*=====================================================================================================
* Set the absolute angle of rotation (X axis) for a super perso matrix
*=====================================================================================================
*/
void fn_vTurnMatrixX(POS_tdstCompletePosition *_p_stMatrix, MTH_tdxReal _xAngle)
{
POS_tdstCompletePosition TmpMatrix;
MTH3D_tdstVector I,J,K;
MTH_tdxReal xCos,xSin;
POS_fn_vSetIdentityMatrix ( &TmpMatrix ) ;
xCos = MTH_M_xCos(_xAngle);
xSin = MTH_M_xSin(_xAngle);
if (MTH_M_bIsNullWithEpsilon(xCos,CAM_C_xAngleEpsilon))
xCos = MTH_C_ZERO;
if (MTH_M_bIsNullWithEpsilon(xSin,CAM_C_xAngleEpsilon))
xSin= MTH_C_ZERO;
MTH3D_M_vSetBaseIVector(&I);
MTH3D_M_vSetVectorElements(&J,MTH_C_ZERO,xCos,xSin);
MTH3D_M_vSetVectorElements(&K,MTH_C_ZERO,MTH_M_xNeg(xSin),xCos);
POS_fn_vSetRotationMatrix ( &TmpMatrix ,&I,&J,&K) ;
POS_fn_vMulMatrixMatrix (_p_stMatrix,&TmpMatrix,_p_stMatrix);
}
/*
*=====================================================================================================
* Set the absolute angle of rotation (Y axis) for a super perso matrix
*
*=====================================================================================================
*/
void fn_vTurnMatrixY
(
POS_tdstCompletePosition *_p_stMatrix ,
MTH_tdxReal _xAngle
)
{
POS_tdstCompletePosition TmpMatrix;
MTH3D_tdstVector I,J,K;
MTH_tdxReal xCos,xSin;
POS_fn_vSetIdentityMatrix ( &TmpMatrix ) ;
xCos = MTH_M_xCos(_xAngle);
xSin = MTH_M_xSin(_xAngle);
if (MTH_M_bIsNullWithEpsilon(xCos,CAM_C_xAngleEpsilon))
xCos = MTH_C_ZERO;
if (MTH_M_bIsNullWithEpsilon(xSin,CAM_C_xAngleEpsilon))
xSin= MTH_C_ZERO;
MTH3D_M_vSetVectorElements(&I,xCos,MTH_C_ZERO,MTH_M_xNeg(xSin));
MTH3D_M_vSetBaseJVector(&J);
MTH3D_M_vSetVectorElements(&K,xSin,MTH_C_ZERO,xCos);
POS_fn_vSetRotationMatrix ( &TmpMatrix ,&I,&J,&K) ;
POS_fn_vMulMatrixMatrix (_p_stMatrix,&TmpMatrix,_p_stMatrix) ;
}
/*
*=====================================================================================================
* Set the absolute angle of rotation (Z axis) for a super perso matrix
*
*=====================================================================================================
*/
void fn_vTurnMatrixZ
(
POS_tdstCompletePosition *_p_stMatrix ,
MTH_tdxReal _xAngle
)
{
POS_tdstCompletePosition TmpMatrix;
MTH3D_tdstVector I,J,K;
MTH_tdxReal xCos,xSin;
POS_fn_vSetIdentityMatrix ( &TmpMatrix ) ;
xCos = MTH_M_xCos(_xAngle);
xSin = MTH_M_xSin(_xAngle);
if (MTH_M_bIsNullWithEpsilon(xCos,CAM_C_xAngleEpsilon))
xCos = MTH_C_ZERO;
if (MTH_M_bIsNullWithEpsilon(xSin,CAM_C_xAngleEpsilon))
xSin= MTH_C_ZERO;
MTH3D_M_vSetVectorElements(&I,xCos,xSin,MTH_C_ZERO);
MTH3D_M_vSetVectorElements(&J,MTH_M_xNeg(xSin),xCos,MTH_C_ZERO);
MTH3D_M_vSetBaseKVector(&K);
POS_fn_vSetRotationMatrix ( &TmpMatrix ,&I,&J,&K) ;
POS_fn_vMulMatrixMatrix (_p_stMatrix,&TmpMatrix,_p_stMatrix) ;
}