reman3/Rayman_X/cpa/public/COL/IntersGO.h

280 lines
16 KiB
C

/*
MODULE : COL (Intersection & Collision Library)
AUTHOR : Frederic PHILIPPE
UBI R&D
FILE : IntersGO.h (Geometric object intersection)
*/
#ifndef COL_INTERSGO_H
#define COL_INTERSGO_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include "cpa_expt.h"
/* For Global declaration in C files : */
#ifdef COL_GLOBALS
#define COL_EXTERN extern
#else /* !COL_GLOBALS */
#define COL_EXTERN
#endif /* !COL_GLOBALS */
/*
-----------------------------------------------------------------------------
INCLUDES FILES
-----------------------------------------------------------------------------
*/
#include "Futil.h"
#include "Box.h"
#include "Inters.h"
#include "OctreeGO.h"
/*
-----------------------------------------------------------------------------
CONSTANT DECLARATION
-----------------------------------------------------------------------------
*/
#define INT_C_lMaxProjectingEdges 100
/*
-----------------------------------------------------------------------------
TYPES DEFINITION
-----------------------------------------------------------------------------
*/
typedef struct COL_tdstShadowElement_
{
ACP_tdxIndex xElementIndex;
ACP_tdxIndex xDataElementIndex;
}
COL_tdstShadowElement;
/*
-----------------------------------------------------------------------------
GLOBAL VARIABLE DECLARATION
-----------------------------------------------------------------------------
*/
/*
-----------------------------------------------------------------------------
MACROS DEFINITIONS
-----------------------------------------------------------------------------
*/
#ifdef USE_ALTIMAPS
/***********************************************************************************************/
/* Name : COL_M_vSortSquareSelection*/
/* Description : Macro that sorts the given coords*/
/* Author : Marc FASCIA*/
/***********************************************************************************************/
#define COL_M_vSortSquareSelection( xMin, xMax ) \
if( (xMin) > (xMax) ) \
{ \
ACP_tdxIndex xSwap; \
xSwap = xMax; \
xMax = xMin; \
xMin = xSwap; \
}
/***********************************************************************************************/
/* Name : COL_M_vScanSelectedSquares*/
/* Description : Macro that scans all the squares selected */
/* Author : Marc FASCIA*/
/***********************************************************************************************/
#define COL_M_vScanSelectedSquares( xI, xJ, xV, xDx, xSMinX, xSMinY, xSMaxX, xSMaxY ) \
COL_M_vSortSquareSelection( xSMinX, xSMaxX ); \
COL_M_vSortSquareSelection( xSMinY, xSMaxY ); \
for( (xV)=(xDx)*(xSMinY), (xJ)=(xSMinY) ; (xJ)<((xSMaxY) + 1) ; (xJ)++, (xV)=(xDx)*(xJ) ) \
for( (xV)+=(xSMinX), (xI)=(xSMinX) ; (xI)<((xSMaxX) + 1) ; (xI)++, (xV)++ )
/***********************************************************************************************/
/* Name : COL_M_vClipSquareSelection*/
/* Description : Clips the selection is bigger than the altimap*/
/* Author : Marc FASCIA*/
/***********************************************************************************************/
#define COL_M_vClipSquareSelection( p_Altimap, xX, xY, ClipMode ) \
if( ClipMode ) \
{ \
if( ClipMode & 1 ) \
xX = 0; \
else \
if( ClipMode & 2 ) \
xX = p_Altimap->xWidth - 1; \
\
if( ClipMode & 4 ) \
xY = 0; \
else \
if( ClipMode & 8 ) \
xY = p_Altimap->xDepth - 1; \
}
/*
-----------------------------------------------------------------------------
FUNCTIONS DECLARATION
-----------------------------------------------------------------------------
*/
/***********************************************************************************************/
/* Name : COL_bSelectAltimapSquare*/
/* Description : Sets the square coords of the square placed below or above the point*/
/* Return val. : True if the point is above or below the altimap. False otherwise*/
/* 0 : On the map*/
/* 1 : Left*/
/* 2 : Right*/
/* 4 : Below*/
/* 8 : Above*/
/* Author : Marc FASCIA*/
/***********************************************************************************************/
unsigned char COL_ucSelectAltimapSquare( GEO_tdstElementAltimap * p_Altimap,
MTH3D_tdstVector * p_TestPoint,
ACP_tdxIndex * p_xCoordX,
ACP_tdxIndex * p_xCoordY );
/***********************************************************************************************/
/* Name : COL_ucBuildAltimapSquareTriangle*/
/* Description : */
/* Return val. : The type of the next triangle in this square*/
/* Author : Marc FASCIA*/
/***********************************************************************************************/
unsigned char COL_ucBuildAltimapSquareTriangle( GEO_tdstElementAltimap * p_Altimap, /* The altimap*/
ACP_tdxIndex xSx, /* Square coord X*/
ACP_tdxIndex xSy, /* Square coord Y*/
unsigned char ucTriangle, /* Which triangle of this square*/
MTH3D_tdstVector * p_stV1, /* Triplet of points*/
MTH3D_tdstVector * p_stV2, /* ''*/
MTH3D_tdstVector * p_stV3, /* ''*/
MTH3D_tdstVector * p_stNormal, /* Normal vector*/
ACP_tdxIndex * p_xFaceIndex ); /* Index of built face*/
#endif /*USE_ALTIMAPS*/
/*----------------------------------------------------------------------------------*/
extern CPA_EXPORT void INT_fn_vViewAndAddFaceElementInList ( ACP_tdxIndex xNbMaxElements,
ACP_tdxIndex *p_xNbElements,
struct GLI_tdstDataOfElement_ *d_stDataOfElement,
MTH3D_tdstVector *p_stVertexA,
ACP_tdxBool bBack,
MTH3D_tdstVector *p_stHit,
ACP_tdxIndex xElements,
ACP_tdxIndex xDataElementIndex );
extern CPA_EXPORT ACP_tdxBool INT_fn_bIntersectSegmentWithFaceOfGeometricObject ( MTH3D_tdstVector *p_stVertexA,
MTH3D_tdstVector *p_stVertexB,
MTH3D_tdstVector *p_stVectAB,
GEO_tdstGeometricObject *p_stGeomObj,
ACP_tdxIndex xNbMaxElements,
ACP_tdxIndex *p_xNbElements,
struct GLI_tdstDataOfElement_ *d_stDataOfElement );
extern CPA_EXPORT ACP_tdxBool INT_fn_bIntersectSegmentWithFirstFaceOfGeometricObject ( MTH3D_tdstVector *p_stVertexA,
MTH3D_tdstVector *p_stVertexB,
MTH3D_tdstVector *p_stVectAB,
GEO_tdstGeometricObject *p_stGeomObj,
MTH3D_tdstVector *p_stHitPoint,
ACP_tdxIndex *p_xElement,
ACP_tdxIndex *p_xDataElement );
extern CPA_EXPORT ACP_tdxBool INT_fn_bDetectIntersectSegmentWithFaceOfGeometricObject ( MTH3D_tdstVector *p_stVertexA,
MTH3D_tdstVector *p_stVectAB,
GEO_tdstGeometricObject *p_stGeomObj );
extern CPA_EXPORT ACP_tdxBool INT_fn_bIntersectSemiAxeWithFaceOfGeometricObject ( MTH3D_tdstVector *p_stVertexA,
MTH3D_tdstVector *p_stVertexB,
MTH3D_tdstVector *p_stVectAB,
GEO_tdstGeometricObject *p_stGeomObj,
ACP_tdxIndex xNbMaxElements,
ACP_tdxIndex *p_xNbElements,
struct GLI_tdstDataOfElement_ *d_stDataOfElement );
extern CPA_EXPORT ACP_tdxBool INT_fn_bSemiAxeNearPointOfTriangle ( MTH3D_tdstVector *p_stVertexA,
MTH3D_tdstVector *p_stVectAB,
MTH_tdxReal xNearDistance,
MTH3D_tdstVector *p_stVertex1,
MTH3D_tdstVector *p_stVertex2,
MTH3D_tdstVector *p_stVertex3,
MTH_tdxReal *p_xT );
extern CPA_EXPORT ACP_tdxBool INT_fn_bIntersectSemiAxeWithShadowFaceOfGeometricObject ( MTH3D_tdstVector *p_stVertexA,
MTH3D_tdstVector *p_stVertexB,
MTH3D_tdstVector *p_stVectAB,
GEO_tdstGeometricObject *p_stGeomObj,
MTH3D_tdstVector *p_stHit,
ACP_tdxIndex *p_xElement,
ACP_tdxIndex *p_xDataElements
);
ACP_tdxBool INT_fn_bIntersectSegmentWithShadowFaceOfGeometricObject ( MTH3D_tdstVector *p_stVertexA,
MTH3D_tdstVector *p_stVertexB,
MTH3D_tdstVector *p_stVectAB,
GEO_tdstGeometricObject *p_stGeomObj,
MTH3D_tdstVector *p_stHit,
ACP_tdxIndex *p_xElement,
ACP_tdxIndex *p_xDataElements
);
extern CPA_EXPORT ACP_tdxBool INT_fn_bIntersectSphereWithShadowFaceOfGeometricObject ( MTH3D_tdstVector *p_stCenter,
MTH_tdxReal xRadius,
GEO_tdstGeometricObject *p_stGeomObj,
ACP_tdxIndex xNbMaxElements,
ACP_tdxIndex *p_xNbElements,
COL_tdstShadowElement *d_stShadowElement,
ACP_tdxBool *p_bBadMaterial);
extern CPA_EXPORT ACP_tdxBool INT_fn_bDetectIntersectSemiAxeWithFaceOfGeometricObject ( MTH3D_tdstVector *p_stVertexA,
MTH3D_tdstVector *p_stVertexB,
MTH3D_tdstVector *p_stVectAB,
GEO_tdstGeometricObject *p_stGeomObj );
extern CPA_EXPORT void INT_fn_vSearchAndReplacePointInElement ( GEO_tdstGeometricObject *p_stGeomObj,
ACP_tdxIndex xNbElements,
struct GLI_tdstDataOfElement_ *d_stDataOfElement );
extern CPA_EXPORT ACP_tdxBool INT_fn_bIntersectSemiAxeWithPointOfGeometricObject ( MTH3D_tdstVector *p_stVertexA,
MTH3D_tdstVector *p_stVectAB,
GEO_tdstGeometricObject *p_stGeomObj,
ACP_tdxIndex xNbMaxElements,
ACP_tdxIndex *p_xNbElements,
struct GLI_tdstDataOfElement_ *d_stDataOfElement );
extern CPA_EXPORT ACP_tdxBool INT_fn_bEdgePartOfTriangle ( ACP_tdxIndex xEdge1,
ACP_tdxIndex xEdge2,
ACP_tdxIndex xPoint1,
ACP_tdxIndex xPoint2,
ACP_tdxIndex xPoint3 );
extern CPA_EXPORT ACP_tdxBool INT_fn_bEdgePartOfEdge ( ACP_tdxIndex xEdge1,
ACP_tdxIndex xEdge2,
ACP_tdxIndex xPoint1,
ACP_tdxIndex xPoint2 );
extern CPA_EXPORT void INT_fn_vSearchAndReplaceEdgeInElement ( GEO_tdstGeometricObject *p_stGeomObj,
ACP_tdxIndex xNbElements,
struct GLI_tdstDataOfElement_ *d_stDataOfElement );
extern CPA_EXPORT ACP_tdxBool INT_fn_bIntersectSemiAxeWithEdgeOfGeometricObject ( MTH3D_tdstVector *p_stVertexA,
MTH3D_tdstVector *p_stVectAB,
GEO_tdstGeometricObject *p_stGeomObj,
ACP_tdxIndex xNbMaxElements,
ACP_tdxIndex *p_xNbElements,
struct GLI_tdstDataOfElement_ *d_stDataOfElement );
extern CPA_EXPORT ACP_tdxBool INT_fn_bGetInclusionPointInGeometricObject ( MTH3D_tdstVector *p_stPoint,
GEO_tdstGeometricObject *p_stGeomObj );
extern CPA_EXPORT ACP_tdxBool INT_fn_bDetectIntersectGeomObjWithGeomObj ( GEO_tdstGeometricObject *p_stGeomObj1,
POS_tdstCompletePosition *_p_stMatrix1,
GEO_tdstGeometricObject *p_stGeomObj2,
POS_tdstCompletePosition *_p_stMatrix2,
GMT_tdxHandleToGameMaterial *_p_hMat1,
GMT_tdxHandleToGameMaterial *_p_hMat2 );
#ifdef __cplusplus
};
#endif /* __cplusplus */
#endif /* COL_INTERSGO_H */