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

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 */