/* MODULE : COL (Intersection & Collision Library) AUTHOR : Frederic PHILIPPE UBI R&D FILE : OctreeGO.h (Geometric object octree) */ #ifndef COL_OCTREEGO_H #define COL_OCTREEGO_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 "IntersGO.h" /* ----------------------------------------------------------------------------- CONSTANT DECLARATION ----------------------------------------------------------------------------- */ #define COL_C_xMaxSelectedNodes 100 #define COL_C_xNoProblem 0 #define COL_C_xNoOctree 1 #define COL_C_xDepthProblem 2 #define COL_C_xFacesPerNodeLimit 3 #define COL_C_xNbOfElements 4 #define COL_C_xNbOfFaces 5 /* ANNECY MT - 14/09/98 {*/ #define COL_C_MaxIndex 0x0080 #define COL_C_OverflowIndex 0x8000 /* END ANNECY MT }*/ /* ----------------------------------------------------------------------------- TYPES DEFINITION ----------------------------------------------------------------------------- */ /* index de face */ /* ANNECY MT - 14/09/98 {*/ typedef unsigned char COL_tdxFaceIndex; typedef unsigned short COL_tdxFaceIndexDouble; /* END ANNECY MT }*/ /* definition d un noeud de l octree */ typedef struct COL_tdstOctreeNode_ { /* boite du noeud = partition */ #if !defined(PRESS_DEMO) /* swap members to make the engine unusable with the binarized data of another engine */ MTH3D_tdstVector stMinPart; MTH3D_tdstVector stMaxPart; #else MTH3D_tdstVector stMaxPart; MTH3D_tdstVector stMinPart; #endif /* PRESS_DEMO */ /* liste de fils */ struct COL_tdstOctreeNode_ **p_pstChildList; /* liste de faces + nombre de faces de cette liste */ COL_tdxFaceIndex *d_xFaceIndexList; } COL_tdstOctreeNode, *COL_tdpstOctreeNode; /* definition d un octree */ typedef struct COL_tdstOctree_ { /* racine de l octree */ COL_tdpstOctreeNode p_stOctreeRoot; /* nombre de faces dans l octree */ ACP_tdxIndex xNbFaces; /* table de bases des elements dans le tableau de tags de faces */ /* ANNECY MT - 26/11/98 {*/ COL_tdxFaceIndexDouble *d_xElementBasesTable; /* END ANNECY MT }*/ /* boite englobante de l objet */ MTH3D_tdstVector stMinBoundingBox; MTH3D_tdstVector stMaxBoundingBox; } COL_tdstOctree, *COL_tdpstOctree; /* ----------------------------------------------------------------------------- GLOBAL VARIABLE DECLARATION ----------------------------------------------------------------------------- */ /* statistiques */ /* compteur de noeuds */ extern ACP_tdxIndex COL_g_xNodeCounter; /* compteur de feuilles */ extern ACP_tdxIndex COL_g_xFinalNodeCounter; /* memoire allouee */ extern long COL_g_lMemory; /* nb faces mises en liste */ extern long COL_g_lFacesInList; /* profondeur du noeud */ extern ACP_tdxIndex COL_g_xSelectedDepth; /* ANNECY MT - 19/08/98 {*/ extern long COL_g_lFacesTagCounter; extern long *COL_g_d_lTaggedFacesTable; /* END ANNECY MT }*/ /* ----------------------------------------------------------------------------- FUNCTIONS DECLARATION ----------------------------------------------------------------------------- */ /* ANNECY MT - 19/08/98 {*/ extern CPA_EXPORT void COL_fn_vOctreeGlobalInit(); extern CPA_EXPORT void COL_fn_vOctreeGlobalsCompute(); extern CPA_EXPORT void COL_fn_vOctreeGlobalDesInit(); /* END ANNECY MT }*/ extern CPA_EXPORT void COL_fn_vComputeElementBasesTable ( GEO_tdstGeometricObject *p_stGeomObj, COL_tdpstOctree p_stOctree ); extern CPA_EXPORT void COL_fn_vInitTaggedPointsTable ( GEO_tdstGeometricObject *p_stGeomObj, COL_tdpstOctree p_stOctree ); extern CPA_EXPORT void COL_fn_vInitTaggedFacesTable ( COL_tdpstOctree p_stOctree ); extern CPA_EXPORT void COL_fn_vCreateTagsTables ( GEO_tdstGeometricObject *p_stGeomObj, COL_tdpstOctree p_stOctree ); extern CPA_EXPORT ACP_tdxIndex COL_fn_xNumberOfFacesInBox ( GEO_tdstGeometricObject *p_stGeomObj, COL_tdpstOctree p_stOctree, MTH3D_tdstVector *p_stPartitionMinPoint, MTH3D_tdstVector *p_stPartitionMaxPoint, ACP_tdxIndex *p_xSuppIndex ); extern CPA_EXPORT void COL_fn_vComputeMidBox ( MTH3D_tdstVector *p_stMinPoint, MTH3D_tdstVector *p_stMaxPoint, MTH3D_tdstVector *p_stSeparationPoint ); extern CPA_EXPORT void COL_fn_vComputeSeparationPoint ( GEO_tdstGeometricObject *p_stGeomObj, MTH3D_tdstVector *p_stMinPoint, MTH3D_tdstVector *p_stMaxPoint, MTH3D_tdstVector *p_stSeparationPoint ); extern CPA_EXPORT void COL_fn_vComputePartitionBox ( MTH3D_tdstVector *p_stMinPart, MTH3D_tdstVector *p_stMaxPart, MTH3D_tdstVector *p_stMinPoint, MTH3D_tdstVector *p_stMaxPoint, MTH3D_tdstVector *p_stSeparationPoint, ACP_tdxIndex xBoxPosition ); extern CPA_EXPORT COL_tdpstOctreeNode COL_fn_pstConstructRecursiveOctree ( GEO_tdstGeometricObject *p_stGeomObj, MTH3D_tdstVector *p_stMinPoint, MTH3D_tdstVector *p_stMaxPoint ); extern CPA_EXPORT ACP_tdxBool COL_fn_bCreateOctree ( GEO_tdstGeometricObject *p_stGeomObj, ACP_tdxIndex xNbOfFacesLimit, ACP_tdxIndex xTotalNbOfFacesLimit, ACP_tdxIndex xOctMaxDepth ); extern CPA_EXPORT void COL_fn_vDestructRecursiveOctree ( COL_tdstOctreeNode *p_stNodeToBeDestructed ); extern CPA_EXPORT void COL_fn_vDeleteOctree ( GEO_tdstGeometricObject *p_stGeomObj ); extern CPA_EXPORT void COL_fn_vExploreRecursiveOctreeWithBox ( COL_tdpstOctreeNode p_stNodeToBeExplored, MTH3D_tdstVector *p_stMinSituation, MTH3D_tdstVector *p_stMaxSituation, COL_tdpstOctreeNode *d_pstSelectedNode, ACP_tdxIndex *p_xNumberOfSelectedNodes ); extern CPA_EXPORT void COL_fn_vExploreOctreeWithBox ( COL_tdpstOctree p_stOctree, MTH3D_tdstVector *p_stMinPoint, MTH3D_tdstVector *p_stMaxPoint, COL_tdpstOctreeNode *d_pstSelectedNode, ACP_tdxIndex *p_xNumberOfSelectedNodes ); extern CPA_EXPORT void COL_fn_vViewAndAddSelectedNode ( COL_tdpstOctreeNode p_stNodeToBeExplored, MTH_tdxReal xT, COL_tdpstOctreeNode *d_pstSelectedNode, MTH_tdxReal *d_xSelectedT, ACP_tdxIndex *p_xNumberOfSelectedNodes ); extern CPA_EXPORT void COL_fn_vExploreRecursiveOctreeWithSegment ( COL_tdpstOctreeNode p_stNodeToBeExplored, MTH3D_tdstVector *p_stVertexA, MTH3D_tdstVector *p_stVectAB, COL_tdpstOctreeNode *d_pstSelectedNode, MTH_tdxReal *d_xSelectedT, ACP_tdxIndex *p_xNumberOfSelectedNodes ); extern CPA_EXPORT void COL_fn_vExploreOctreeWithSegment ( COL_tdpstOctree p_stOctree, MTH3D_tdstVector *p_stVertexA, MTH3D_tdstVector *p_stVectAB, COL_tdpstOctreeNode *d_pstSelectedNode, MTH_tdxReal *d_xSelectedT, ACP_tdxIndex *p_xNumberOfSelectedNodes ); extern CPA_EXPORT void COL_fn_vExploreRecursiveOctreeWithSemiAxe ( COL_tdpstOctreeNode p_stNodeToBeExplored, MTH3D_tdstVector *p_stVertexA, MTH3D_tdstVector *p_stVertexB, MTH3D_tdstVector *p_stVectAB, COL_tdpstOctreeNode *d_pstSelectedNode, MTH_tdxReal *d_xSelectedT, ACP_tdxIndex *p_xNumberOfSelectedNodes ); extern CPA_EXPORT void COL_fn_vExploreOctreeWithSemiAxe ( COL_tdpstOctree p_stOctree, MTH3D_tdstVector *p_stVertexA, MTH3D_tdstVector *p_stVertexB, MTH3D_tdstVector *p_stVectAB, COL_tdpstOctreeNode *d_pstSelectedNode, MTH_tdxReal *d_xSelectedT, ACP_tdxIndex *p_xNumberOfSelectedNodes ); extern CPA_EXPORT void COL_fn_vExploreRecursiveOctreeWithSemiAxeForShadow ( COL_tdpstOctreeNode p_stNodeToBeExplored, MTH3D_tdstVector *p_stVertexA, MTH3D_tdstVector *p_stVertexB, MTH3D_tdstVector *p_stVectAB, MTH_tdxReal xNearDistance, COL_tdpstOctreeNode *d_pstSelectedNode, MTH_tdxReal *d_xSelectedT, ACP_tdxIndex *p_xNumberOfSelectedNodes ); extern CPA_EXPORT ACP_tdxIndex COL_fn_xVerifyRecursiveOctree ( COL_tdpstOctreeNode p_stNodeToBeExplored, ACP_tdxIndex xNbOfElements, ACP_tdxIndex xNbOfFaces, ACP_tdxIndex xNbOfFacesPerNodeLimit, ACP_tdxIndex xOctMaxDepth ); extern CPA_EXPORT ACP_tdxIndex COL_fn_xVerifyOctree ( COL_tdpstOctree p_stOctree, ACP_tdxIndex xNbOfElements, ACP_tdxIndex xNbOfFaces, ACP_tdxIndex xNbOfFacesPerNodeLimit, ACP_tdxIndex xOctMaxDepth ); /* ANNECY MT - 14/09/98 {*/ /* extern CPA_EXPORT void COL_fn_vModifyRecursiveIndexedTriangleInOctree ( COL_tdpstOctreeNode p_stNodeToBeExplored, ACP_tdxIndex xOldElementIndex, ACP_tdxIndex xOldTriangleIndex, ACP_tdxIndex xNewElementIndex, ACP_tdxIndex xNewFaceMapIndex ); extern CPA_EXPORT void COL_fn_vModifyIndexedTriangleInOctree ( GEO_tdstGeometricObject *p_stGeomObj, ACP_tdxIndex xOldElementIndex, ACP_tdxIndex xOldTriangleIndex, ACP_tdxIndex xNewElementIndex, ACP_tdxIndex xNewFaceMapIndex ); extern CPA_EXPORT void COL_fn_vModifyRecursiveFaceMapTriangleInOctree ( COL_tdpstOctreeNode p_stNodeToBeExplored, ACP_tdxIndex xOldElementIndex, ACP_tdxIndex xOldFaceMapIndex, ACP_tdxIndex xNewElementIndex, ACP_tdxIndex xNewTriangleIndex ); extern CPA_EXPORT void COL_fn_vModifyFaceMapTriangleInOctree ( GEO_tdstGeometricObject *p_stGeomObj, ACP_tdxIndex xOldElementIndex, ACP_tdxIndex xOldFaceMapIndex, ACP_tdxIndex xNewElementIndex, ACP_tdxIndex xNewTriangleIndex ); */ /* END ANNECY MT }*/ extern CPA_EXPORT void COL_fn_vModifyRecursiveFaceInOctree ( COL_tdpstOctreeNode p_stNodeToBeExplored, ACP_tdxIndex xOldElementIndex, ACP_tdxIndex xOldFaceIndex, ACP_tdxIndex xNewElementIndex, ACP_tdxIndex xNewFaceIndex ); extern CPA_EXPORT void COL_fn_vModifyFaceInOctree ( GEO_tdstGeometricObject *p_stGeomObj, ACP_tdxIndex xOldElementIndex, ACP_tdxIndex xOldFaceIndex, ACP_tdxIndex xNewElementIndex, ACP_tdxIndex xNewFaceIndex ); #ifdef __cplusplus }; #endif /* __cplusplus */ #endif /* COL_OCTREEGO_H */