280 lines
16 KiB
C
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 */
|