/* MODULE : COL (Intersection & Collision Library) AUTHOR : Frederic PHILIPPE UBI R&D FILE : CollGOCo.h (Geometric object collision) */ #ifndef COL_COLLGOCO_H #define COL_COLLGOCO_H #ifdef __cplusplus extern "C" { #endif #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 "IntersGO.h" #include "OctreeGO.h" #include "CollGOUt.h" /* ----------------------------------------------------------------------------- CONSTANT DECLARATION ----------------------------------------------------------------------------- */ /* cas de collision */ #define COL_C_ulDynamicNonWithStaticNon 0x00000000 #define COL_C_ulDynamicPtsWithStaticITr 0x00000001 #define COL_C_ulDynamicPtsWithStaticFMD 0x00000002 #define COL_C_ulDynamicPtsWithStaticSph 0x00000004 #define COL_C_ulDynamicPtsWithStaticBox 0x00000008 #define COL_C_ulDynamicPtsWithStaticElt 0x0000000F #define COL_C_ulDynamicITrWithStaticPts 0x00000010 #define COL_C_ulDynamicFMDWithStaticPts 0x00000020 #define COL_C_ulDynamicSphWithStaticPts 0x00000040 #define COL_C_ulDynamicBoxWithStaticPts 0x00000080 #define COL_C_ulDynamicEltWithStaticPts 0x000000F0 #define COL_C_ulDynamicEdgWithStaticEdg 0x00000100 #define COL_C_ulDynamicEdgWithStaticSph 0x00000200 #define COL_C_ulDynamicEdgWithStaticBox 0x00000400 #define COL_C_ulDynamicEdgWithStaticElt 0x00000600 #define COL_C_ulDynamicSphWithStaticEdg 0x00000800 #define COL_C_ulDynamicBoxWithStaticEdg 0x00001000 #define COL_C_ulDynamicEltWithStaticEdg 0x00001800 #define COL_C_ulDynamicITrWithStaticSph 0x00002000 #define COL_C_ulDynamicITrWithStaticBox 0x00004000 #define COL_C_ulDynamicITrWithStaticElt 0x00006000 #define COL_C_ulDynamicFMDWithStaticSph 0x00008000 #define COL_C_ulDynamicFMDWithStaticBox 0x00010000 #define COL_C_ulDynamicFMDWithStaticElt 0x00018000 #define COL_C_ulDynamicSphWithStaticITr 0x00020000 #define COL_C_ulDynamicSphWithStaticFMD 0x00040000 #define COL_C_ulDynamicSphWithStaticSph 0x00080000 #define COL_C_ulDynamicSphWithStaticBox 0x00100000 #define COL_C_ulDynamicSphWithStaticElt 0x001E0000 #define COL_C_ulDynamicBoxWithStaticITr 0x00200000 #define COL_C_ulDynamicBoxWithStaticFMD 0x00400000 #define COL_C_ulDynamicBoxWithStaticSph 0x00800000 #define COL_C_ulDynamicBoxWithStaticBox 0x01000000 #define COL_C_ulDynamicBoxWithStaticElt 0x01E00000 #define COL_C_ulDynamicEltWithStaticElt 0x01FFE000 #define COL_C_ulDynamicAllWithStaticAll 0x01FFFFFF /* ANNECY AV {*/ /*#define COL_C_xPointEntity 0*/ #define COL_C_xTriangleEntity 1 /*#define COL_C_xEdgeEntity 2*/ #define COL_C_xSphereEntity 3 #define COL_C_xAlignedBoxEntity 4 #define COL_C_xHighEdgeEntity 7 /* Edge that is above the collision point */ #define COL_C_xLowEdgeEntity 8 /* Edge that is below the collision point */ /* END ANNECY AV }*/ /*ANNECY jt {*/ #define COL_C_xNoEntity 99 /*ENDANNECY jt }*/ #define COL_C_xMaxStaticPoints 500 #define COL_C_xMaxStaticEdges 500 #define COL_C_xMaxStaticBoundingBoxes 50 /*#define COL_C_xMaxNumberOfCollisions 25 // 50 jt*/ #define COL_C_xMaxNumberOfCollisions 75 /* ----------------------------------------------------------------------------- TYPES DEFINITION ----------------------------------------------------------------------------- */ /* WARNING To Optimize MECA-Collisions Array computing, this struct MUST BE exactly the same as DNM_stMecObstacle in DNMObsta.h Any change to this struct MUST be reported to DNM_stMecObstacle */ typedef struct COL_tdstCollisionCase_ { /* 1 temps de collision */ MTH_tdxReal xCollisionTime; /* 2 normale de collision */ MTH3D_tdstVector stCollisionNormal; /* 3 point de collision */ MTH3D_tdstVector stCollisionPoint; /* 4 materiau dynamique */ GMT_tdxHandleToGameMaterial hDynamicMaterial; /* 5 materiau statique */ GMT_tdxHandleToGameMaterial hStaticMaterial; /* 6 parametre 1 pour la meca HIE_tdxHandleToSuperObject mp_stSupObj */ void *p_vParameter1; /* 7 parametre 2 pour la meca DNM_tdeObstacleType m_eType */ long sParameter2; /* 8 geometrie dynamique */ ACP_tdxIndex xDynamicGeomEntity; /* 9 geometrie statique */ ACP_tdxIndex xStaticGeomEntity; /* 10 The translation to do to the actor*/ MTH3D_tdstVector stTranslation; /* 11 the movement of the zone */ MTH3D_tdstVector stMovement; /* 12 the final position of the center of the sphere */ MTH3D_tdstVector stEndPosition; /* 13 The radius of the sphere (or the dimension of the box) */ MTH_tdxReal xSphereRadius; /* 14 Pour correspondre a la structure de meca*/ /*DNM_tdstMecMatCharacteristics m_stProperties; *//* Material properties */ MTH_tdxReal m_xSlide1; MTH_tdxReal m_xRebound1; /* 15 Pour correspondre a la structure de meca*/ /* DNM_tdstMecMatCharacteristics m_stMyProperties;*/ /* Material properties of mine */ MTH_tdxReal m_xSlide2; MTH_tdxReal m_xRebound2; } COL_tdstCollisionCase; typedef struct COL_tdstGVForCollision_ { /* parametres */ ACP_tdxBool bStaticGeomObjHasNoTransformationMatrix; ACP_tdxBool bDynamicGeomObjHasZoomInsteadOfScale; GEO_tdstGeometricObject *p_stDynamicGeomObj; POS_tdstCompletePosition *p_stT0DynamicGeomObjMatrix; POS_tdstCompletePosition *p_stT1DynamicGeomObjMatrix; GEO_tdstGeometricObject *p_stStaticGeomObj; POS_tdstCompletePosition *p_stStaticGeomObjMatrix; unsigned long ulSelectedCollisionCases; void *p_vParameter1; short sParameter2; /* variables internes */ /* matrices */ POS_tdstCompletePosition stInvMatrix; POS_tdstCompletePosition stD2ST0TransformMatrix; POS_tdstCompletePosition stD2ST1TransformMatrix; POS_tdstCompletePosition stS2DT0TransformMatrix; POS_tdstCompletePosition stS2DT1TransformMatrix; MTH_tdxReal xStaticScale; /* index generaux */ ACP_tdxIndex xDynamicPointIndex; ACP_tdxIndex xStaticPointIndex; ACP_tdxIndex xDynamicEdgeIndex; ACP_tdxIndex xStaticEdgeIndex; ACP_tdxIndex xDynamicElementIndex; ACP_tdxIndex xStaticElementIndex; /* pointeurs des elements */ MTH3D_tdstVector *p_stDynamicPoint; MTH3D_tdstVector *p_stStaticPoint; GEO_tdstDoubledIndex *p_stDynamicEdge; GEO_tdstDoubledIndex *p_stStaticEdge; GEO_tdstElementIndexedTriangles *p_stDynamicElementIndexedTriangles; GEO_tdstElementIndexedTriangles *p_stStaticElementIndexedTriangles; //XB99/04/27 #ifndef U64 GEO_tdstElementFaceMapDescriptors *p_stDynamicElementFaceMapDescriptors; GEO_tdstElementFaceMapDescriptors *p_stStaticElementFaceMapDescriptors; #endif U64 //End XB99/04/27 GEO_tdstElementSpheres *p_stDynamicElementSpheres; GEO_tdstElementSpheres *p_stStaticElementSpheres; GEO_tdstElementAlignedBoxes *p_stDynamicElementAlignedBoxes; GEO_tdstElementAlignedBoxes *p_stStaticElementAlignedBoxes; #ifdef USE_ALTIMAPS GEO_tdstElementAltimap *p_stStaticElementAltimap; #endif /*USE_ALTIMAPS*/ /* index des elements */ ACP_tdxIndex xDynamicIndexedTriangleIndex; ACP_tdxIndex xStaticIndexedTriangleIndex; ACP_tdxIndex xDynamicFaceMapTriangleIndex; ACP_tdxIndex xStaticFaceMapTriangleIndex; ACP_tdxIndex xDynamicIndexedSphereIndex; ACP_tdxIndex xStaticIndexedSphereIndex; ACP_tdxIndex xDynamicIndexedAlignedBoxIndex; ACP_tdxIndex xStaticIndexedAlignedBoxIndex; /* ANNECY MT 25/02/98 {*/ long lBitsFieldOfIndexedSpheresInCollision; /* END ANNECY MT }*/ /* pointeurs des parties d element */ GEO_tdstIndexedSphere *p_stDynamicIndexedSphere; GEO_tdstIndexedSphere *p_stStaticIndexedSphere; GEO_tdstIndexedAlignedBox *p_stDynamicIndexedAlignedBox; GEO_tdstIndexedAlignedBox *p_stStaticIndexedAlignedBox; /* donnees de base */ MTH3D_tdstVector stDinST0Point; MTH3D_tdstVector stDinST1Point; MTH3D_tdstVector stDinST01Vector; /* jt 220399 */ MTH3D_tdstVector stSwapDinST0Point; MTH3D_tdstVector stSinDT0Point; MTH3D_tdstVector stSinDT1Point; MTH3D_tdstVector stSinDT01Vector; ACP_tdxIndex xVertex1Index; ACP_tdxIndex xVertex2Index; MTH3D_tdstVector *p_stVertex1; MTH3D_tdstVector *p_stVertex2; MTH3D_tdstVector stEdgeVector; MTH3D_tdstVector *p_stDynamicCenter; MTH3D_tdstVector *p_stStaticCenter; MTH_tdxReal xDynamicRadius; /* jt 260399 */ MTH_tdxReal xSwapRadius; ACP_tdxBool bUseEnlargeSphere; MTH3D_tdstVector *p_stDynamicMinPoint; MTH3D_tdstVector *p_stDynamicMaxPoint; MTH3D_tdstVector *p_stStaticMinPoint; MTH3D_tdstVector *p_stStaticMaxPoint; MTH3D_tdstVector stDinST0MaxPoint; MTH3D_tdstVector stDinST1MaxPoint; MTH3D_tdstVector stDinST0MinPoint; MTH3D_tdstVector stDinST1MinPoint; COL_tda8st8VerticesBox a8_stDynamic8VBox; COL_tda8st8VerticesBox a8_stStatic8VBox; COL_tda8st8VerticesBox a8_stDinST08VBox; COL_tda8st8VerticesBox a8_stDinST18VBox; COL_tda8st8VerticesBox a8_stDinST01Vect; COL_tda8st8VerticesBox a8_stSinDT08VBox; COL_tda8st8VerticesBox a8_stSinDT18VBox; COL_tda8st8VerticesBox a8_stSinDT01Vect; GMT_tdxHandleToGameMaterial hDynamicMaterial; GMT_tdxHandleToGameMaterial hStaticMaterial; COL_tdpstOctree p_stOctree; ACP_tdxIndex xNumberOfSelectedNodes; COL_tdpstOctreeNode aDEF_pstSelectedNode[COL_C_xMaxSelectedNodes]; MTH_tdxReal aDEF_xSelectedT[COL_C_xMaxSelectedNodes]; ACP_tdxBool bSurfacicDynamicElement; ACP_tdxBool bDynamicSphereAndPointOnly; ACP_tdxIndex xNbStaticPoints; ACP_tdxIndex aDEF_xListOfStaticPoints[COL_C_xMaxStaticPoints]; ACP_tdxIndex xNbStaticEdges; ACP_tdxIndex aDEF_xListOfStaticPt1Edges[COL_C_xMaxStaticEdges]; ACP_tdxIndex aDEF_xListOfStaticPt2Edges[COL_C_xMaxStaticEdges]; GMT_tdxHandleToGameMaterial aDEF_hListOfStaticMaterialEdges[COL_C_xMaxStaticEdges]; } COL_tdstGVForCollision; /* ----------------------------------------------------------------------------- GLOBAL VARIABLE DECLARATION ----------------------------------------------------------------------------- */ /* cas de collision */ extern COL_tdstCollisionCase COL_g_stCollisionCase [COL_C_xMaxNumberOfCollisions]; extern COL_tdstGVForCollision COL_g_stGVForCol; extern long COL_g_lNbElementsInTable; /* ----------------------------------------------------------------------------- FUNCTIONS DECLARATION ----------------------------------------------------------------------------- */ /*extern CPA_EXPORT void COL_fn_vInitCollisionTable ( void );*/ /* anthony */ #define COL_fn_vInitCollisionTable() { COL_g_lNbElementsInTable = 0; } extern CPA_EXPORT void COL_fn_vAddInStaticCollisionTable ( MTH_tdxReal _xT, MTH3D_tdstVector * _p_stTranslation, MTH3D_tdstVector * _p_stHit, MTH3D_tdstVector * _p_stNormal, GMT_tdxHandleToGameMaterial _hDynMat, GMT_tdxHandleToGameMaterial _hStatMat, ACP_tdxIndex _xDynamicGeomEntity, ACP_tdxIndex _xStaticGeomEntity, void * _p_vParameter1, short _sParameter2, MTH3D_tdstVector * _p_stMovement, MTH_tdxReal _xSphereRadius, MTH3D_tdstVector * _p_stEndPosition); /*extern CPA_EXPORT ACP_tdxBool COL_fn_bGetResultCollision (COL_tdstCollisionCase * p_stCollisionCaseDst);*/ extern CPA_EXPORT ACP_tdxBool COL_fn_bGetMultipleResultCollision (COL_tdstCollisionCase * * _p_p_stCollisionCaseDst); #ifdef __cplusplus }; #endif #endif /* COL_COLLGOCO_H */