reman3/Rayman_X/cpa/tempgrp/SPO/HieMtStk.c

237 lines
6.3 KiB
C

#include "ACP_base.h"
#include "GMT.h"
/*memory management of geometry.*/
/*
#include "ErrGEO.h"
#include "MemGEO.h"
*/
/* 007 #include "incGEO.h"*/
/*#include "MmgGEO.h"*/
/* 007 #include "incGLI.h"*/
/* 007*/
#include "geo.h"
#include "gli.h"
#include "SPO/HieMtStk.h"
extern POS_tdstCompletePosition *g_p_stCurrentMatrix ;/*provisoire*/
/*utiliser des EXTERN à l'occasion ...*/
GEO_tdxHandleToMatrix HIE_g_a_hMatrixStack[HIE_C_lMaxMatrixInStack];
GEO_tdxHandleToMatrix HIE_g_hCurrentMatrix ;
long HIE_g_lNbMatrixInStack = 0;
#define HIE_M_vUpdateStack()\
{\
g_p_stCurrentMatrix=HIE_g_hCurrentMatrix=HIE_g_a_hMatrixStack[HIE_g_lNbMatrixInStack-1];\
}
GEO_tdxHandleToMatrix GEO_fn_hCreateMatrix(void)
{
GEO_tdxHandleToMatrix hReturn;
MMG_fn_vAddMemoryInfo( MMG_C_lTypePosition , MMG_C_lSubTypePosition , 0 );
GEO_M_CPAMalloc(hReturn, GEO_tdxHandleToMatrix, sizeof(POS_tdstCompletePosition), E_uwGEONotEnoughtMemory);
POS_fn_vSetIdentityMatrix(hReturn);
return hReturn;
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void GEO_fn_vDestroyMatrix(GEO_tdxHandleToMatrix _hMatrix)
{
GEO_M_CPAFree(_hMatrix);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
void HIE_fn_vCreateMatrixStack(void)
{
HIE_g_a_hMatrixStack[0] = GEO_fn_hCreateMatrix();
HIE_g_lNbMatrixInStack = 1;
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void HIE_fn_vDestroyMatrixStack(void)
{
GEO_fn_vDestroyMatrix( HIE_g_a_hMatrixStack[0] );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*erase all the stack and then put the identity on the top*/
void HIE_fn_vInitMatrixStack(void)
{
HIE_g_lNbMatrixInStack=0;
POS_fn_vSetIdentityMatrix(HIE_g_a_hMatrixStack[HIE_g_lNbMatrixInStack]);
HIE_g_lNbMatrixInStack++;
HIE_M_vUpdateStack();
}
ACP_tdxBool HIE_fn_bLoadIdentity(void)
{
if( HIE_g_lNbMatrixInStack == HIE_C_lMaxMatrixInStack )
#if !defined(U64)
return NOK;
#else
ASM_BREAK;
#endif /* U64 */
HIE_g_a_hMatrixStack[HIE_g_lNbMatrixInStack] = HIE_g_a_hMatrixStack[0];
HIE_g_lNbMatrixInStack++;
HIE_M_vUpdateStack();
return OK;
}
/* remove the top of the stack*/
ACP_tdxBool HIE_fn_bPopMatrix(void)
{
if( HIE_g_lNbMatrixInStack == 0 )
#if !defined(U64)
return NOK;
#else
ASM_BREAK;
#endif /* U64 */
HIE_g_lNbMatrixInStack--;
HIE_M_vUpdateStack();
return OK;
}
/*put the parameter on the top of the stack*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
ACP_tdxBool HIE_fn_bLoadMatrix(GEO_tdxHandleToMatrix _hMatrix)
{
return HIE_fn_bStoreMatrix(_hMatrix);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*empty the stack*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void HIE_fn_vResetMatrixStack(void)
{
HIE_g_lNbMatrixInStack=0;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
ACP_tdxBool HIE_fn_bStoreMatrix( GEO_tdxHandleToMatrix _hMatrix )
{
if( HIE_g_lNbMatrixInStack == HIE_C_lMaxMatrixInStack )
#if !defined(U64)
return NOK;
#else
ASM_BREAK;
#endif /* U64 */
HIE_g_a_hMatrixStack[HIE_g_lNbMatrixInStack] = _hMatrix;
HIE_g_lNbMatrixInStack++;
HIE_M_vUpdateStack();
return OK;
}
/*//////////////////////////////////////////////////////////////////////////////////////////////////////*/
/*//////////////////////////////////////////////////////////////////////////////////////////////////////*/
/* New stack used to push the camera matrix first*/
/*//////////////////////////////////////////////////////////////////////////////////////////////////////*/
/*//////////////////////////////////////////////////////////////////////////////////////////////////////*/
extern POS_tdstCompletePosition *g_p_stCurrentInCamCoordsMatrix;
POS_tdstCompletePosition HIE_g_a_stCameraMatrixStack[HIE_C_lMaxMatrixInStack+1];
unsigned long HIE_g_lNbMatrixInCameraStack;
#define HIE_M_vUpdateCameraMatrixStack() \
{\
g_p_stCurrentInCamCoordsMatrix = &HIE_g_a_stCameraMatrixStack[HIE_g_lNbMatrixInCameraStack-1]; \
}
/* empty the stack and push the camera mtrix of the given viewport*/
ACP_tdxBool HIE_fn_bInitCameraMatrixStack(GLD_tdxHandleToViewportAttributes _hVpt)
{
HIE_g_lNbMatrixInCameraStack=0;
#if defined(ACTIVE_EDITOR)
if( ((( GLI_tdstSpecificAttributesFor3D *)_hVpt->p_vSpecificToXD)->p_stCam) == NULL )
return NOK;
#endif
POS_fn_vCopyMatrix(&HIE_g_a_stCameraMatrixStack[HIE_g_lNbMatrixInCameraStack] , &((( GLI_tdstSpecificAttributesFor3D *)_hVpt->p_vSpecificToXD)->p_stCam)->stMatrix);
HIE_g_lNbMatrixInCameraStack++;
HIE_M_vUpdateCameraMatrixStack();
return OK;
}
/* update the stak with global matrix of the given SuperObject*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 07/06/99 */
ACP_tdxBool HIE_fn_bStoreOnCameraMatrixStack( GEO_tdxHandleToMatrix _hMatrix )
{
if( !HIE_g_lNbMatrixInCameraStack || HIE_g_lNbMatrixInCameraStack == HIE_C_lMaxMatrixInStack )
#if !defined(U64)
return NOK;
#else
ASM_BREAK;
#endif /* U64 */
POS_fn_vMulMatrixMatrix( &HIE_g_a_stCameraMatrixStack[HIE_g_lNbMatrixInCameraStack] , &HIE_g_a_stCameraMatrixStack[0]
, _hMatrix );
HIE_g_lNbMatrixInCameraStack++;
HIE_M_vUpdateCameraMatrixStack();
return OK;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 07/06/99 */
/* update the stak with local matrix of the given SuperObject*/
ACP_tdxBool HIE_fn_bPushOnCameraMatrixStack( GEO_tdxHandleToMatrix _hMatrix )
{
if( !HIE_g_lNbMatrixInCameraStack || HIE_g_lNbMatrixInCameraStack == HIE_C_lMaxMatrixInStack )
#if !defined(U64)
return NOK;
#else
ASM_BREAK;
#endif /* U64 */
POS_fn_vMulMatrixMatrix( &HIE_g_a_stCameraMatrixStack[HIE_g_lNbMatrixInCameraStack] , &HIE_g_a_stCameraMatrixStack[HIE_g_lNbMatrixInCameraStack-1]
, _hMatrix );
HIE_g_lNbMatrixInCameraStack++;
HIE_M_vUpdateCameraMatrixStack();
return OK;
}
/* */
ACP_tdxBool HIE_fn_bPopOnCameraMatrixStack()
{
if( HIE_g_lNbMatrixInCameraStack == 0 )
#if !defined(U64)
return NOK;
#else
ASM_BREAK;
#endif /* U64 */
HIE_g_lNbMatrixInCameraStack--;
assert(HIE_g_lNbMatrixInCameraStack>0);
HIE_M_vUpdateCameraMatrixStack();
return OK;
}
/**/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void HIE_fn_vSetCurrentInCamCoordsMatrix (POS_tdstCompletePosition *p_stMatrix)
{
g_p_stCurrentInCamCoordsMatrix = p_stMatrix;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
POS_tdstCompletePosition * HIE_fn_pGetCurrentInCamCoordsMatrix (void)
{
return g_p_stCurrentInCamCoordsMatrix;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */