302 lines
14 KiB
C
302 lines
14 KiB
C
/*
|
|
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 */
|