reman3/Rayman_X/cpa/tempgrp/PO/Specif/PhObjs.c

241 lines
9.7 KiB
C

/*=========================================================================
* PhObjs.c : Physical Objects functions
*
* Version 1.0
* Creation date 18/02/97
* Revision date 18/03/97
*
* That file needs to be compatible for all platforms.
*
* (c) Ubi Studios 1997
*=======================================================================*/
#define PO_FRIEND
#include "ACP_Base.h"
#include "GEO.h"
#include "GLI.h"
#include "COL.h"
#include "SPO.h"
#include "PCS.h"
#include "PO.h"
/* ***************************************************************************** */
/* **************** Creation and first init of a PO **************************** */
/* ***************************************************************************** */
/*-----------------------------------------------------------------------------
* Description : Allocate a Physical Object
*-----------------------------------------------------------------------------
* Creation date : 18/02/97 Author : Sebastien DAVID
*-----------------------------------------------------------------------------*/
PO_tdxHandleToPhysicalObject PO_fn_hAllocPhysicalObject(void)
{
PO_tdstPhysicalObject *p_stPhysicalObject;
/*p_stPhysicalObject = (struct PO_tdstPhysicalObject_ *)Mmg_fn_p_vAlloc(sizeof(struct PO_tdstPhysicalObject_));
if ((stCurrentModeInfo.ucModuleId != 7) || (stCurrentModeInfo.ucMode)){
p_stPhysicalObject->_hVisualSet = NULL;// just for breack
}*/
MMG_fn_vAddMemoryInfo (MMG_C_lTypePO , MMG_C_lSubTypePOStructure , NULL);
GEO_M_CPAMalloc(p_stPhysicalObject,struct PO_tdstPhysicalObject_ *, sizeof(struct PO_tdstPhysicalObject_), E_uwGEONotEnoughtMemory);
//Set (char *s_szBankName,char *s_szObjectName)
//p_stPhysicalObject->p_stGeometricObject=GLI_p_stFindOrLoadGeometric(s_szBankName,s_szObjectName);
p_stPhysicalObject->_hVisualSet = NULL;
p_stPhysicalObject->_hCollideSet = NULL;
p_stPhysicalObject->_hBoundingVolume = NULL;
return (p_stPhysicalObject);
}
/*-----------------------------------------------------------------------------
* Description : Free a Physical Object
*-----------------------------------------------------------------------------
* Creation date : 18/02/97 Author : Sebastien DAVID
*-----------------------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_
void PO_fn_vFreePhysicalObject(PO_tdxHandleToPhysicalObject _hPhysicalObject)
{
Mmg_fn_vFree4Ch(_hPhysicalObject,C_ucMmgDefaultChannel);
}
#endif /* _FIRE_DEADCODE_U64_ */
/* ***************************************************************************** */
/* ******************** Access functions to Object in PO *********************** */
/* ***************************************************************************** */
/*-----------------------------------------------------------------------------
* Description : Get the Object in a Physical Object
*-----------------------------------------------------------------------------
* Creation date : 18/03/97 Author : Sebastien DAVID
*-----------------------------------------------------------------------------*/
/*
void * PO_fn_p_vGetObject(PO_tdxHandleToPhysicalObject _hPhysicalObject)
{
return(_hPhysicalObject->p_vObject);
}
*/
/*-----------------------------------------------------------------------------
* Description : Set the Object in a Physical Object
*-----------------------------------------------------------------------------
* Creation date : 18/03/97 Author : Sebastien DAVID
*-----------------------------------------------------------------------------*/
/*
void PO_fn_p_vSetObject(PO_tdxHandleToPhysicalObject _hPhysicalObject,void * p_vObject)
{
_hPhysicalObject->p_vObject = p_vObject;
}
*/
/*-----------------------------------------------------------------------------
* Description : Get the Visual Set Object in a Physical Object
*-----------------------------------------------------------------------------
* Creation date : 18/03/97 Author : Sebastien DAVID
*-----------------------------------------------------------------------------*/
GEO_tdxHandleToVisualSet PO_fn_hGetVisualSet(PO_tdxHandleToPhysicalObject _hPhysicalObject)
{
return(_hPhysicalObject->_hVisualSet);
}
/*-----------------------------------------------------------------------------
* Description : Set the Visual Set Object in a Physical Object
*-----------------------------------------------------------------------------
* Creation date : 18/03/97 Author : Sebastien DAVID
*-----------------------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_
void PO_fn_vSetVisualSet(PO_tdxHandleToPhysicalObject _hPhysicalObject
,GEO_tdxHandleToVisualSet _hNewVisualSet)
{
_hPhysicalObject->_hVisualSet = _hNewVisualSet;
}
#endif /* _FIRE_DEADCODE_U64_ */
/* ***************************************************************************** */
/* **************** Access functions to CollideSet in PO *********************** */
/* ***************************************************************************** */
/*-----------------------------------------------------------------------------
* Description : Get the Collide Set in a Physical Object
*-----------------------------------------------------------------------------
* Creation date : 19/02/97 Author : Sebastien DAVID
*-----------------------------------------------------------------------------*/
PCS_tdxHandleToPhysicalCollSet PO_fn_hGetCollideSet(PO_tdxHandleToPhysicalObject _hPhysicalObject)
{
return(_hPhysicalObject->_hCollideSet);
}
/*-----------------------------------------------------------------------------
* Description : Set the Collide Set in a Physical Object
*-----------------------------------------------------------------------------
* Creation date : 19/02/97 Author : Sebastien DAVID
*-----------------------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_
void PO_fn_vSetCollideSet(PO_tdxHandleToPhysicalObject _hPhysicalObject
,PCS_tdxHandleToPhysicalCollSet _hNewCollideSet)
{
_hPhysicalObject->_hCollideSet = _hNewCollideSet;
}
#endif /* _FIRE_DEADCODE_U64_ */
/* ***************************************************************************** */
/* **************** Access functions to BoundingVolume in PO ******************* */
/* ***************************************************************************** */
/*-----------------------------------------------------------------------------
* Description : Get the Bounding Volume in a Physical Object
*-----------------------------------------------------------------------------
* Creation date : 18/03/97 Author : Sebastien DAVID
*-----------------------------------------------------------------------------*/
GEO_tdxHandleToBoundingSphere PO_fn_hGetBoundingVolume(PO_tdxHandleToPhysicalObject _hPhysicalObject)
{
return(_hPhysicalObject->_hBoundingVolume);
}
/*-----------------------------------------------------------------------------
* Description : Set the Bounding Volume in a Physical Object
*-----------------------------------------------------------------------------
* Creation date : 18/03/97 Author : Sebastien DAVID
*-----------------------------------------------------------------------------*/
void PO_fn_vSetBoundingVolume(PO_tdxHandleToPhysicalObject _hPhysicalObject,
GEO_tdxHandleToBoundingSphere _hNewBoundingVolume)
{
_hPhysicalObject->_hBoundingVolume = _hNewBoundingVolume;
}
// temporairement !!!!!!!!!!!!!!!
void HIE_fn_vComputeOnePoBoundingVolume(PO_tdxHandleToPhysicalObject _hPhysicalObject)
{
MTH3D_tdstVector stLocalCenter;
MTH_tdxReal xRadius;
GEO_tdxHandleToBoundingSphere hBoundingSphere;
ACP_tdxHandleOfObject hGeometricObject;
MTH_tdxReal xReal;
GEO_fn_vCreateBoundingSphere(&hBoundingSphere);
GLI_vGetVisualSetLOD(PO_fn_hGetVisualSet(_hPhysicalObject), 0, &xReal, &hGeometricObject);
xRadius=0.0f;
#ifndef U64
#ifdef USE_ALTIMAPS
if( hGeometricObject->d_xListOfElementsTypes[ 0 ] == GEO_C_xElementAltimap )
{
//--- Altimap ---
GEO_vGetAltimapOrigin( hGeometricObject, 0, &stLocalCenter );
GEO_fn_vAddAltimapToSphere(hGeometricObject,&stLocalCenter,&xRadius);
}
else
#endif //USE_ALTIMAPS
{
//--- NOT Altimap ---
MTH3D_M_vCopyVector(&stLocalCenter, hGeometricObject->d_stListOfPoints);
GEO_fn_vAddObjectToSphere(hGeometricObject,&stLocalCenter,&xRadius);
}
#else
if( hGeometricObject->d_xListOfElementsTypes != NULL ) // Temporary antibug for sprites AR980327
{
#ifdef USE_ALTIMAPS
if( hGeometricObject->d_xListOfElementsTypes[ 0 ] == GEO_C_xElementAltimap )
{
//--- Altimap ---
GEO_vGetAltimapOrigin( hGeometricObject, 0, &stLocalCenter );
GEO_fn_vAddAltimapToSphere(hGeometricObject,&stLocalCenter,&xRadius);
}
else
#endif //USE_ALTIMAPS
if(hGeometricObject->d_stListOfPoints!=NULL)
{
//--- NOT Altimap ---
MTH3D_M_vCopyVector(&stLocalCenter, hGeometricObject->d_stListOfPoints);
GEO_fn_vAddObjectToSphere(hGeometricObject,&stLocalCenter,&xRadius);
}
else
{
MTH3D_M_vSetVectorElements(&stLocalCenter,
MTH_M_xFloatToReal(hGeometricObject->a3_fCenter[0]),
MTH_M_xFloatToReal(hGeometricObject->a3_fCenter[1]),
MTH_M_xFloatToReal(hGeometricObject->a3_fCenter[2]));
xRadius=MTH_M_xFloatToReal(hGeometricObject->fRadius);
}
}
else
{
MTH3D_M_vSetVectorElements(&stLocalCenter,MTH_C_ZERO,MTH_C_ZERO,MTH_C_ZERO);
xRadius=0.0f;
}
#endif
GEO_fn_vSetBoundingSphere(hBoundingSphere, &stLocalCenter, xRadius);
PO_fn_vSetBoundingVolume(_hPhysicalObject ,hBoundingSphere);
}