1106 lines
48 KiB
C
1106 lines
48 KiB
C
/*
|
|
0 1 2 3 4 5 6 7
|
|
01234567890123456789012345678901234567890123456789012345678901234567890123456789
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Geometric object octree part
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 06 nov 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "acp_base.h"
|
|
#include "MTH.h"
|
|
#include "MEC.h"
|
|
#include "GMT.h"
|
|
#include "GEO.h"
|
|
#include "GLI.h"
|
|
#include "TMP.h"
|
|
|
|
#include "COL/OctreeGO.h"
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Global variables
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Octree construction
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* limite du nombre de faces dans une partition */
|
|
ACP_tdxIndex COL_g_xNumberOfFacesLimit;
|
|
|
|
/* limite du nombre de faces totales */
|
|
ACP_tdxIndex COL_g_xTotalNumberOfFacesLimit;
|
|
|
|
/* profondeur maximale de l octree */
|
|
ACP_tdxIndex COL_g_xOctreeMaxDepth;
|
|
|
|
/* profondeur */
|
|
ACP_tdxIndex COL_g_xDepth;
|
|
|
|
/* statistiques */
|
|
/* compteur de noeuds */
|
|
ACP_tdxIndex COL_g_xNodeCounter;
|
|
/* compteur de feuilles */
|
|
ACP_tdxIndex COL_g_xFinalNodeCounter;
|
|
/* memoire allouee */
|
|
long COL_g_lMemory;
|
|
/* nb faces mises en liste */
|
|
long COL_g_lFacesInList;
|
|
/* profondeur du noeud */
|
|
ACP_tdxIndex COL_g_xSelectedDepth;
|
|
|
|
|
|
/* ANNECY MT - 19/08/98 {*/
|
|
long COL_g_lMaxNumberOfTaggedFaces;
|
|
|
|
long COL_g_lFacesTagCounter;
|
|
|
|
long *COL_g_d_lTaggedFacesTable;
|
|
/* END ANNECY MT }*/
|
|
|
|
COL_tdxFaceIndex *COL_g_d_xSelectedFaceIndexList; /* only for script loading*/
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Init global variables
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 19 Aug 1998 Author : MT
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
void COL_fn_vOctreeGlobalInit()
|
|
{
|
|
COL_g_lMaxNumberOfTaggedFaces = 0;
|
|
|
|
COL_g_d_lTaggedFacesTable = NULL;
|
|
|
|
/* ANNECY MT - 14/09/98 {*/
|
|
COL_g_d_xSelectedFaceIndexList = NULL; /* only for script loading*/
|
|
/* END ANNECY MT }*/
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Alloc global variables
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 19 Aug 1998 Author : MT
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
void COL_fn_vOctreeGlobalsCompute()
|
|
{
|
|
if(COL_g_lMaxNumberOfTaggedFaces)
|
|
{
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeTaggedFaceTable , NULL);
|
|
GEO_M_CPAMalloc ( COL_g_d_lTaggedFacesTable, long *, COL_g_lMaxNumberOfTaggedFaces*sizeof(long), E_uwGEONotEnoughtMemory );
|
|
/* if(COL_g_d_lTaggedFacesTable)
|
|
memset(COL_g_d_lTaggedFacesTable , 0L , COL_g_lMaxNumberOfTaggedFaces*sizeof(long)); */ /*AR9904 Already done in alloc function */
|
|
}
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : DesInit global variables
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 19 Aug 1998 Author : MT
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
/*
|
|
void COL_fn_vOctreeGlobalDesInit()
|
|
{
|
|
COL_g_lMaxNumberOfTaggedFaces = 0;
|
|
|
|
if(COL_g_d_lTaggedFacesTable)
|
|
{
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeTaggedFaceTable , NULL);
|
|
GEO_M_CPAFree(COL_g_d_lTaggedFacesTable);
|
|
}
|
|
}
|
|
*/
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Compute element bases table
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 21 oct 1997 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* calcul de la table des bases d element */
|
|
/* used*/
|
|
void COL_fn_vComputeElementBasesTable ( GEO_tdstGeometricObject *p_stGeomObj,
|
|
COL_tdpstOctree p_stOctree )
|
|
{
|
|
ACP_tdxIndex xElementIndex;
|
|
GEO_tdstElementIndexedTriangles *p_stElementIndexedTriangles;
|
|
/* GEO_tdstElementFaceMapDescriptors *p_stElementFaceMapDescriptors;*/
|
|
GEO_tdstElementSpheres *p_stElementSpheres;
|
|
GEO_tdstElementAlignedBoxes *p_stElementAlignedBoxes;
|
|
|
|
/* init des compteurs */
|
|
p_stOctree->xNbFaces = 0;
|
|
|
|
/* passe sur les elements */
|
|
for ( xElementIndex = 0 ; xElementIndex < p_stGeomObj->xNbElements ; xElementIndex++ )
|
|
{
|
|
switch ( p_stGeomObj->d_xListOfElementsTypes[xElementIndex] )
|
|
{
|
|
case GEO_C_xElementIndexedTriangles :
|
|
p_stElementIndexedTriangles = (GEO_tdstElementIndexedTriangles *)(p_stGeomObj->d_stListOfElements[xElementIndex]);
|
|
|
|
/* init des bases */
|
|
p_stOctree->d_xElementBasesTable[xElementIndex] = (COL_tdxFaceIndexDouble)(p_stOctree->xNbFaces);
|
|
|
|
/* nbfaces */
|
|
p_stOctree->xNbFaces += p_stElementIndexedTriangles->xNbFaces;
|
|
break;
|
|
case GEO_C_xElementSpheres :
|
|
p_stElementSpheres = (GEO_tdstElementSpheres *)(p_stGeomObj->d_stListOfElements[xElementIndex]);
|
|
|
|
/* init des bases */
|
|
p_stOctree->d_xElementBasesTable[xElementIndex] = (COL_tdxFaceIndexDouble)(p_stOctree->xNbFaces);
|
|
|
|
/* nbfaces */
|
|
p_stOctree->xNbFaces += p_stElementSpheres->xNbSpheres;
|
|
break;
|
|
|
|
case GEO_C_xElementAlignedBoxes :
|
|
p_stElementAlignedBoxes = (GEO_tdstElementAlignedBoxes *)(p_stGeomObj->d_stListOfElements[xElementIndex]);
|
|
|
|
/* init des bases */
|
|
p_stOctree->d_xElementBasesTable[xElementIndex] = (COL_tdxFaceIndexDouble)(p_stOctree->xNbFaces);
|
|
|
|
/* nbfaces */
|
|
p_stOctree->xNbFaces += p_stElementAlignedBoxes->xNbAlignedBoxes;
|
|
break;
|
|
|
|
default :
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Init tagged points table
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 21 oct 1997 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Create tags table of points and faces
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 22 aug 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
modif by FBF 29/04/98 : separation from TMP temporary allocation and GEO definitive allocation
|
|
*/
|
|
|
|
/* creation des tableaux de tags */
|
|
/* used*/
|
|
void COL_fn_vCreateTagsTables ( GEO_tdstGeometricObject *p_stGeomObj,
|
|
COL_tdpstOctree p_stOctree )
|
|
{
|
|
/* allocation du tableau de bases des elements */
|
|
/* create element base table, TMP alloc */
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeElementBaseTable , NULL);
|
|
p_stOctree->d_xElementBasesTable = (COL_tdxFaceIndexDouble *) TMP_M_p_Malloc ( (p_stGeomObj->xNbElements)*sizeof(COL_tdxFaceIndexDouble) );
|
|
COL_fn_vComputeElementBasesTable ( p_stGeomObj, p_stOctree );
|
|
|
|
if ( p_stOctree->xNbFaces < COL_g_xTotalNumberOfFacesLimit )
|
|
{
|
|
/* free element base table, TMP free */
|
|
TMP_M_Free( p_stOctree->d_xElementBasesTable);
|
|
p_stOctree->d_xElementBasesTable = NULL;
|
|
}
|
|
else
|
|
{
|
|
COL_tdxFaceIndexDouble *p_xTmpPtr;
|
|
/* save element base table ptr */
|
|
p_xTmpPtr = p_stOctree->d_xElementBasesTable;
|
|
/* allocate real element base table (GEO)*/
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeFaceIndex , NULL);
|
|
GEO_M_CPAMalloc ( p_stOctree->d_xElementBasesTable, COL_tdxFaceIndexDouble *, (p_stGeomObj->xNbElements)*sizeof(COL_tdxFaceIndexDouble), E_uwGEONotEnoughtMemory );
|
|
COL_g_lMemory += (p_stGeomObj->xNbElements)*sizeof(COL_tdxFaceIndexDouble);
|
|
/* copy tmp element base table in new one */
|
|
memcpy(p_stOctree->d_xElementBasesTable,p_xTmpPtr,(p_stGeomObj->xNbElements)*sizeof(COL_tdxFaceIndexDouble));
|
|
/* and delete tmp element base table */
|
|
TMP_M_Free( p_xTmpPtr );
|
|
|
|
COL_g_lMemory += (p_stGeomObj->xNbPoints)*sizeof(long);
|
|
|
|
COL_g_lMaxNumberOfTaggedFaces = max(COL_g_lMaxNumberOfTaggedFaces,p_stOctree->xNbFaces);
|
|
COL_g_lMemory += (p_stOctree->xNbFaces)*sizeof(long);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Calculate the number of faces in a box
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 22 aug 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
/* InZeFunctionFunction to factorize code*/
|
|
/* used*/
|
|
COL_tdxFaceIndex *fn_xAddInTable(
|
|
COL_tdxFaceIndex *p_xSelectionIndex,
|
|
ACP_tdxIndex xElementIndex,
|
|
ACP_tdxIndex xDataElementIndex,
|
|
ACP_tdxIndex *p_xSuppIndex )
|
|
{
|
|
/* index de l element */
|
|
if(xElementIndex<COL_C_MaxIndex)
|
|
{
|
|
*p_xSelectionIndex = (COL_tdxFaceIndex)xElementIndex;
|
|
p_xSelectionIndex++;
|
|
}
|
|
else
|
|
{
|
|
*p_xSelectionIndex++ = (COL_C_OverflowIndex + xElementIndex) >> 8;
|
|
*p_xSelectionIndex++ = xElementIndex & 0xFF;
|
|
(*p_xSuppIndex)++;
|
|
}
|
|
/* index de la face */
|
|
if(xDataElementIndex<COL_C_MaxIndex)
|
|
{
|
|
*p_xSelectionIndex = (COL_tdxFaceIndex)xDataElementIndex;
|
|
p_xSelectionIndex++;
|
|
}
|
|
else
|
|
{
|
|
*p_xSelectionIndex++ = (COL_C_OverflowIndex + xDataElementIndex) >> 8;
|
|
*p_xSelectionIndex++ = xDataElementIndex & 0xFF;
|
|
(*p_xSuppIndex)++;
|
|
}
|
|
|
|
/* increment du compteur */
|
|
(*(COL_tdxFaceIndexDouble*)COL_g_d_xSelectedFaceIndexList)++;
|
|
|
|
return p_xSelectionIndex;
|
|
}
|
|
/* EndOfInZeFunctionFunction*/
|
|
|
|
|
|
|
|
|
|
/* compte le nombre de faces dans la boite */
|
|
/* used*/
|
|
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 )
|
|
{
|
|
COL_tdxFaceIndex *p_xSelectionIndex;
|
|
|
|
ACP_tdxIndex xElementIndex;
|
|
ACP_tdxIndex xDataElementIndex;
|
|
/* ACP_tdxIndex xAtomIndex;*/
|
|
/* ACP_tdxIndex xIndex;*/
|
|
|
|
GEO_tdstElementIndexedTriangles *p_stElementIndexedTriangles;
|
|
/* GEO_tdstElementFaceMapDescriptors *p_stElementFaceMapDescriptors;*/
|
|
/* GEO_tdstElementTMeshes *p_stElementTMeshes;*/
|
|
GEO_tdstElementSpheres *p_stElementSpheres;
|
|
GEO_tdstElementAlignedBoxes *p_stElementAlignedBoxes;
|
|
|
|
GEO_tdstIndexedSphere *p_stIndexedSphere;
|
|
GEO_tdstIndexedAlignedBox *p_stIndexedAlignedBox;
|
|
|
|
MTH3D_tdstVector *p_stVertex1;
|
|
MTH3D_tdstVector *p_stVertex2;
|
|
MTH3D_tdstVector *p_stVertex3;
|
|
MTH3D_tdstVector *p_stNormal;
|
|
MTH3D_tdstVector *p_stCenter;
|
|
MTH3D_tdstVector *p_stMinPoint;
|
|
MTH3D_tdstVector *p_stMaxPoint;
|
|
|
|
/* init compteur */
|
|
p_xSelectionIndex = COL_g_d_xSelectedFaceIndexList;
|
|
|
|
/* le premier numero de face est en fait le nombre de faces de la liste */
|
|
#if !defined(U64) /* Oliv' for alignment*/
|
|
*((COL_tdxFaceIndexDouble*)p_xSelectionIndex) = 0;
|
|
((COL_tdxFaceIndexDouble*)p_xSelectionIndex)++;
|
|
#else /* U64 */
|
|
*p_xSelectionIndex++ = 0;
|
|
*p_xSelectionIndex++ = 0;
|
|
#endif /* U64 */
|
|
*p_xSuppIndex = 1;
|
|
|
|
|
|
/* passe sur les elements */
|
|
for ( xElementIndex = 0 ; xElementIndex < p_stGeomObj->xNbElements ; xElementIndex++ )
|
|
{
|
|
switch ( p_stGeomObj->d_xListOfElementsTypes[xElementIndex] )
|
|
{
|
|
case GEO_C_xElementIndexedTriangles :
|
|
p_stElementIndexedTriangles = (GEO_tdstElementIndexedTriangles *)(p_stGeomObj->d_stListOfElements[xElementIndex]);
|
|
|
|
/* pour les triangles */
|
|
for ( xDataElementIndex = 0 ; xDataElementIndex < p_stElementIndexedTriangles->xNbFaces ; xDataElementIndex++ )
|
|
{
|
|
/* points du triangle */
|
|
p_stVertex1 = p_stGeomObj->d_stListOfPoints + (p_stElementIndexedTriangles->d_stListOfFacesTripled + xDataElementIndex)->a3_xIndex[0];
|
|
p_stVertex2 = p_stGeomObj->d_stListOfPoints + (p_stElementIndexedTriangles->d_stListOfFacesTripled + xDataElementIndex)->a3_xIndex[1];
|
|
p_stVertex3 = p_stGeomObj->d_stListOfPoints + (p_stElementIndexedTriangles->d_stListOfFacesTripled + xDataElementIndex)->a3_xIndex[2];
|
|
|
|
/* calcul de la normale */
|
|
p_stNormal = p_stElementIndexedTriangles->d_stListOfFacesNormals + xDataElementIndex;
|
|
|
|
/* if face in box */
|
|
if ( INT_fn_bIntersectTriangleWithBoxWithHit ( p_stVertex1, p_stVertex2, p_stVertex3, p_stNormal, p_stPartitionMinPoint, p_stPartitionMaxPoint,NULL ) )
|
|
{
|
|
/* Oliv' - factorize code - 24/09/1998*/
|
|
p_xSelectionIndex = fn_xAddInTable( p_xSelectionIndex, xElementIndex, xDataElementIndex, p_xSuppIndex );
|
|
/* EndOfOliv'*/
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
case GEO_C_xElementSpheres :
|
|
p_stElementSpheres = (GEO_tdstElementSpheres *)(p_stGeomObj->d_stListOfElements[xElementIndex]);
|
|
|
|
/* pour les spheres */
|
|
for ( xDataElementIndex = 0 ; xDataElementIndex < p_stElementSpheres->xNbSpheres ; xDataElementIndex++ )
|
|
{
|
|
/* sphere */
|
|
p_stIndexedSphere = p_stElementSpheres->d_stListOfSpheres + xDataElementIndex;
|
|
|
|
/* centre de la sphere */
|
|
p_stCenter = p_stGeomObj->d_stListOfPoints + p_stIndexedSphere->xCenterPoint;
|
|
|
|
/* intersection sphere - boite */
|
|
if ( INT_fn_bIntersectSphereWithBox ( p_stCenter, p_stIndexedSphere->xRadius, p_stPartitionMinPoint, p_stPartitionMaxPoint ) )
|
|
{
|
|
/* Oliv' - factorize code - 24/09/1998*/
|
|
p_xSelectionIndex = fn_xAddInTable( p_xSelectionIndex, xElementIndex, xDataElementIndex, p_xSuppIndex );
|
|
/* EndOfOliv'*/
|
|
}
|
|
}
|
|
break;
|
|
|
|
case GEO_C_xElementAlignedBoxes :
|
|
p_stElementAlignedBoxes = (GEO_tdstElementAlignedBoxes *)(p_stGeomObj->d_stListOfElements[xElementIndex]);
|
|
|
|
/* pour les boites */
|
|
for ( xDataElementIndex = 0 ; xDataElementIndex < p_stElementAlignedBoxes->xNbAlignedBoxes ; xDataElementIndex++ )
|
|
{
|
|
/* boite */
|
|
p_stIndexedAlignedBox = p_stElementAlignedBoxes->d_stListOfAlignedBoxes + xDataElementIndex;
|
|
|
|
/* points de la boite */
|
|
p_stMinPoint = p_stGeomObj->d_stListOfPoints + p_stIndexedAlignedBox->xMinPoint;
|
|
p_stMaxPoint = p_stGeomObj->d_stListOfPoints + p_stIndexedAlignedBox->xMaxPoint;
|
|
|
|
/* intersection boite - boite */
|
|
if ( INT_fn_bIntersectBoxWithBox ( p_stMinPoint, p_stMaxPoint, p_stPartitionMinPoint, p_stPartitionMaxPoint ) )
|
|
{
|
|
/* Oliv' - factorize code - 24/09/1998*/
|
|
p_xSelectionIndex = fn_xAddInTable( p_xSelectionIndex, xElementIndex, xDataElementIndex, p_xSuppIndex );
|
|
/* EndOfOliv'*/
|
|
}
|
|
}
|
|
break;
|
|
|
|
default :
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* ANNECY MT - 14/09/98 {*/
|
|
return (ACP_tdxIndex)(*((COL_tdxFaceIndexDouble*)COL_g_d_xSelectedFaceIndexList));
|
|
/* END ANNECY MT }*/
|
|
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Compute the midpoint of a box
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 22 aug 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* calcule le milieu de la boite */
|
|
/* used*/
|
|
void COL_fn_vComputeMidBox ( MTH3D_tdstVector *p_stMinPoint,
|
|
MTH3D_tdstVector *p_stMaxPoint,
|
|
MTH3D_tdstVector *p_stSeparationPoint )
|
|
{
|
|
MTH3D_M_vMiddleVector ( p_stSeparationPoint, p_stMinPoint, p_stMaxPoint );
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Calculate the separation point of a partition
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 22 aug 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* calcule le point de separation d une partition */
|
|
/* used*/
|
|
void COL_fn_vComputeSeparationPoint ( GEO_tdstGeometricObject *p_stGeomObj,
|
|
MTH3D_tdstVector *p_stMinPoint,
|
|
MTH3D_tdstVector *p_stMaxPoint,
|
|
MTH3D_tdstVector *p_stSeparationPoint )
|
|
{
|
|
ACP_tdxIndex xVertexIndex;
|
|
ACP_tdxIndex xNumberOfVertices;
|
|
|
|
MTH3D_M_vNullVector ( p_stSeparationPoint );
|
|
|
|
xNumberOfVertices = 0;
|
|
for ( xVertexIndex = 0 ; xVertexIndex < p_stGeomObj->xNbPoints ; xVertexIndex++ )
|
|
{
|
|
if ( INT_fn_bGetInclusionPointInBox ( &(p_stGeomObj->d_stListOfPoints[xVertexIndex]), p_stMinPoint, p_stMaxPoint ) )
|
|
{
|
|
MTH3D_M_vAddVector ( p_stSeparationPoint, p_stSeparationPoint, &(p_stGeomObj->d_stListOfPoints[xVertexIndex]) );
|
|
xNumberOfVertices++;
|
|
}
|
|
}
|
|
|
|
/* si nombre de points < 2 prendre le milieu */
|
|
if ( xNumberOfVertices < 2 )
|
|
{
|
|
COL_fn_vComputeMidBox ( p_stMinPoint, p_stMaxPoint, p_stSeparationPoint );
|
|
}
|
|
else
|
|
{
|
|
MTH3D_M_vDivScalarVector ( p_stSeparationPoint, p_stSeparationPoint, MTH_M_xLongToReal ( xNumberOfVertices ) );
|
|
}
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Calculate one the eight under-partition of a partition
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 22 aug 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* calcule les coordonnees de la sous-boite */
|
|
/* used*/
|
|
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 )
|
|
{
|
|
switch ( xBoxPosition )
|
|
{
|
|
case COL_C_xXMinYMinZMin :
|
|
MTH3D_M_vSetVectorElements ( p_stMinPart, p_stMinPoint->xX, p_stMinPoint->xY, p_stMinPoint->xZ );
|
|
MTH3D_M_vSetVectorElements ( p_stMaxPart, p_stSeparationPoint->xX, p_stSeparationPoint->xY, p_stSeparationPoint->xZ );
|
|
break;
|
|
case COL_C_xXMinYMinZMax :
|
|
MTH3D_M_vSetVectorElements ( p_stMinPart, p_stMinPoint->xX, p_stMinPoint->xY, p_stSeparationPoint->xZ );
|
|
MTH3D_M_vSetVectorElements ( p_stMaxPart, p_stSeparationPoint->xX, p_stSeparationPoint->xY, p_stMaxPoint->xZ );
|
|
break;
|
|
case COL_C_xXMinYMaxZMin :
|
|
MTH3D_M_vSetVectorElements ( p_stMinPart, p_stMinPoint->xX, p_stSeparationPoint->xY, p_stMinPoint->xZ );
|
|
MTH3D_M_vSetVectorElements ( p_stMaxPart, p_stSeparationPoint->xX, p_stMaxPoint->xY, p_stSeparationPoint->xZ );
|
|
break;
|
|
case COL_C_xXMinYMaxZMax :
|
|
MTH3D_M_vSetVectorElements ( p_stMinPart, p_stMinPoint->xX, p_stSeparationPoint->xY, p_stSeparationPoint->xZ );
|
|
MTH3D_M_vSetVectorElements ( p_stMaxPart, p_stSeparationPoint->xX, p_stMaxPoint->xY, p_stMaxPoint->xZ );
|
|
break;
|
|
case COL_C_xXMaxYMinZMin :
|
|
MTH3D_M_vSetVectorElements ( p_stMinPart, p_stSeparationPoint->xX, p_stMinPoint->xY, p_stMinPoint->xZ );
|
|
MTH3D_M_vSetVectorElements ( p_stMaxPart, p_stMaxPoint->xX, p_stSeparationPoint->xY, p_stSeparationPoint->xZ );
|
|
break;
|
|
case COL_C_xXMaxYMinZMax :
|
|
MTH3D_M_vSetVectorElements ( p_stMinPart, p_stSeparationPoint->xX, p_stMinPoint->xY, p_stSeparationPoint->xZ );
|
|
MTH3D_M_vSetVectorElements ( p_stMaxPart, p_stMaxPoint->xX, p_stSeparationPoint->xY, p_stMaxPoint->xZ );
|
|
break;
|
|
case COL_C_xXMaxYMaxZMin :
|
|
MTH3D_M_vSetVectorElements ( p_stMinPart, p_stSeparationPoint->xX, p_stSeparationPoint->xY, p_stMinPoint->xZ );
|
|
MTH3D_M_vSetVectorElements ( p_stMaxPart, p_stMaxPoint->xX, p_stMaxPoint->xY, p_stSeparationPoint->xZ );
|
|
break;
|
|
case COL_C_xXMaxYMaxZMax :
|
|
MTH3D_M_vSetVectorElements ( p_stMinPart, p_stSeparationPoint->xX, p_stSeparationPoint->xY, p_stSeparationPoint->xZ );
|
|
MTH3D_M_vSetVectorElements ( p_stMaxPart, p_stMaxPoint->xX, p_stMaxPoint->xY, p_stMaxPoint->xZ );
|
|
break;
|
|
|
|
default :
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Recursive function of an octree node construction
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 22 aug 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* construction recursive d un noeud */
|
|
/* used*/
|
|
COL_tdpstOctreeNode COL_fn_pstConstructRecursiveOctree ( GEO_tdstGeometricObject *p_stGeomObj,
|
|
MTH3D_tdstVector *p_stMinPoint,
|
|
MTH3D_tdstVector *p_stMaxPoint )
|
|
{
|
|
COL_tdpstOctreeNode p_stNodeToBeConstructed;
|
|
ACP_tdxIndex xNumberOfFaces,xOverflowSize;
|
|
MTH3D_tdstVector stMinPart;
|
|
MTH3D_tdstVector stMaxPart;
|
|
MTH3D_tdstVector stSeparationPoint;
|
|
|
|
COL_g_xDepth++;
|
|
|
|
/* allocation du noeud */
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeOctreeNode , NULL);
|
|
GEO_M_CPAMalloc ( p_stNodeToBeConstructed, COL_tdpstOctreeNode, sizeof(COL_tdstOctreeNode), E_uwGEONotEnoughtMemory );
|
|
COL_g_lMemory += sizeof(COL_tdstOctreeNode);
|
|
|
|
/* partition du noeud se prend la boite */
|
|
MTH3D_M_vCopyVector ( &(p_stNodeToBeConstructed->stMinPart) , p_stMinPoint );
|
|
MTH3D_M_vCopyVector ( &(p_stNodeToBeConstructed->stMaxPart) , p_stMaxPoint );
|
|
|
|
/* mise a jour du compteur */
|
|
COL_g_xNodeCounter++;
|
|
|
|
/* si nombre de faces > limite et profondeur < limite */
|
|
if
|
|
(
|
|
( (xNumberOfFaces = COL_fn_xNumberOfFacesInBox ( p_stGeomObj, p_stGeomObj->p_stOctree, p_stMinPoint, p_stMaxPoint, &xOverflowSize )) > COL_g_xNumberOfFacesLimit ) &&
|
|
( COL_g_xDepth < COL_g_xOctreeMaxDepth )
|
|
)
|
|
{
|
|
/* mise a nul de la liste de faces */
|
|
p_stNodeToBeConstructed->d_xFaceIndexList = NULL;
|
|
/* allocation des fils */
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeOctreeNode , NULL);
|
|
GEO_M_CPAMalloc ( p_stNodeToBeConstructed->p_pstChildList, COL_tdpstOctreeNode *, COL_C_xNbVerticesPerBox*sizeof(COL_tdpstOctreeNode), E_uwGEONotEnoughtMemory );
|
|
COL_g_lMemory += COL_C_xNbVerticesPerBox*sizeof(COL_tdpstOctreeNode);
|
|
/* calcul du point de separation */
|
|
COL_fn_vComputeSeparationPoint ( p_stGeomObj, p_stMinPoint, p_stMaxPoint, &stSeparationPoint );
|
|
/* calcul des boites et discretisation */
|
|
COL_fn_vComputePartitionBox ( &stMinPart, &stMaxPart, p_stMinPoint, p_stMaxPoint, &stSeparationPoint, COL_C_xXMinYMinZMin );
|
|
p_stNodeToBeConstructed->p_pstChildList[COL_C_xXMinYMinZMin] = COL_fn_pstConstructRecursiveOctree ( p_stGeomObj, &stMinPart, &stMaxPart );
|
|
COL_fn_vComputePartitionBox ( &stMinPart, &stMaxPart, p_stMinPoint, p_stMaxPoint, &stSeparationPoint, COL_C_xXMinYMinZMax );
|
|
p_stNodeToBeConstructed->p_pstChildList[COL_C_xXMinYMinZMax] = COL_fn_pstConstructRecursiveOctree ( p_stGeomObj, &stMinPart, &stMaxPart );
|
|
COL_fn_vComputePartitionBox ( &stMinPart, &stMaxPart, p_stMinPoint, p_stMaxPoint, &stSeparationPoint, COL_C_xXMinYMaxZMin );
|
|
p_stNodeToBeConstructed->p_pstChildList[COL_C_xXMinYMaxZMin] = COL_fn_pstConstructRecursiveOctree ( p_stGeomObj, &stMinPart, &stMaxPart );
|
|
COL_fn_vComputePartitionBox ( &stMinPart, &stMaxPart, p_stMinPoint, p_stMaxPoint, &stSeparationPoint, COL_C_xXMinYMaxZMax );
|
|
p_stNodeToBeConstructed->p_pstChildList[COL_C_xXMinYMaxZMax] = COL_fn_pstConstructRecursiveOctree ( p_stGeomObj, &stMinPart, &stMaxPart );
|
|
COL_fn_vComputePartitionBox ( &stMinPart, &stMaxPart, p_stMinPoint, p_stMaxPoint, &stSeparationPoint, COL_C_xXMaxYMinZMin );
|
|
p_stNodeToBeConstructed->p_pstChildList[COL_C_xXMaxYMinZMin] = COL_fn_pstConstructRecursiveOctree ( p_stGeomObj, &stMinPart, &stMaxPart );
|
|
COL_fn_vComputePartitionBox ( &stMinPart, &stMaxPart, p_stMinPoint, p_stMaxPoint, &stSeparationPoint, COL_C_xXMaxYMinZMax );
|
|
p_stNodeToBeConstructed->p_pstChildList[COL_C_xXMaxYMinZMax] = COL_fn_pstConstructRecursiveOctree ( p_stGeomObj, &stMinPart, &stMaxPart );
|
|
COL_fn_vComputePartitionBox ( &stMinPart, &stMaxPart, p_stMinPoint, p_stMaxPoint, &stSeparationPoint, COL_C_xXMaxYMaxZMin );
|
|
p_stNodeToBeConstructed->p_pstChildList[COL_C_xXMaxYMaxZMin] = COL_fn_pstConstructRecursiveOctree ( p_stGeomObj, &stMinPart, &stMaxPart );
|
|
COL_fn_vComputePartitionBox ( &stMinPart, &stMaxPart, p_stMinPoint, p_stMaxPoint, &stSeparationPoint, COL_C_xXMaxYMaxZMax );
|
|
p_stNodeToBeConstructed->p_pstChildList[COL_C_xXMaxYMaxZMax] = COL_fn_pstConstructRecursiveOctree ( p_stGeomObj, &stMinPart, &stMaxPart );
|
|
}
|
|
else
|
|
{
|
|
/* mise a jour du compteur */
|
|
COL_g_xFinalNodeCounter++;
|
|
/* mise a nul de la liste de fils */
|
|
p_stNodeToBeConstructed->p_pstChildList = NULL;
|
|
/* mise a nulle de la liste de faces pour xNumberOfFaces=0 */
|
|
if ( xNumberOfFaces != 0 )
|
|
{
|
|
/* allocation de la liste de faces */
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeFaceIndexList , NULL);
|
|
GEO_M_CPAMalloc ( p_stNodeToBeConstructed->d_xFaceIndexList, COL_tdxFaceIndex *, (1+2*xNumberOfFaces)*sizeof(COL_tdxFaceIndex)+xOverflowSize, E_uwGEONotEnoughtMemory );
|
|
COL_g_lMemory += (1+2*xNumberOfFaces)*sizeof(COL_tdxFaceIndex)+xOverflowSize;
|
|
COL_g_lFacesInList += xNumberOfFaces;
|
|
|
|
/* copie de la liste de faces */
|
|
memcpy ( p_stNodeToBeConstructed->d_xFaceIndexList, COL_g_d_xSelectedFaceIndexList, sizeof ( COL_tdxFaceIndex ) * (1+2*xNumberOfFaces)+xOverflowSize );
|
|
}
|
|
else
|
|
{
|
|
/* pas de liste */
|
|
p_stNodeToBeConstructed->d_xFaceIndexList = NULL;
|
|
}
|
|
}
|
|
|
|
COL_g_xDepth--;
|
|
|
|
return p_stNodeToBeConstructed;
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Create the octree of an geometric object
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 22 aug 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* creation - construction - calcul d un octree */
|
|
/* un octree est attache a un objet geometrique */
|
|
/* used*/
|
|
ACP_tdxBool COL_fn_bCreateOctree ( GEO_tdstGeometricObject *p_stGeomObj,
|
|
ACP_tdxIndex xNbOfFacesLimit,
|
|
ACP_tdxIndex xTotalNbOfFacesLimit,
|
|
ACP_tdxIndex xOctMaxDepth )
|
|
{
|
|
COL_tdstOctree *p_stOctree;
|
|
|
|
/* init des variables module octree */
|
|
COL_g_xNumberOfFacesLimit = xNbOfFacesLimit;
|
|
COL_g_xTotalNumberOfFacesLimit = xTotalNbOfFacesLimit;
|
|
COL_g_xOctreeMaxDepth = xOctMaxDepth;
|
|
|
|
/* init des stats */
|
|
COL_g_xDepth = 0;
|
|
COL_g_xNodeCounter = 0;
|
|
COL_g_xFinalNodeCounter = 0;
|
|
COL_g_lMemory = 0;
|
|
COL_g_lFacesInList = 0;
|
|
|
|
GEO_vCreateObjectListOfPointsMaterial ( p_stGeomObj );
|
|
GEO_vComputeObjectListOfPointsMaterial ( p_stGeomObj );
|
|
|
|
if ( p_stGeomObj->p_stOctree == NULL && p_stGeomObj->xNbElements != 0)
|
|
{
|
|
/* allocation de la structure octree */
|
|
/* temporary alloc TMP */
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeOctreeStructure , NULL);
|
|
p_stGeomObj->p_stOctree = (COL_tdpstOctree)TMP_M_p_Malloc( sizeof(COL_tdstOctree) );
|
|
p_stOctree = p_stGeomObj->p_stOctree;
|
|
|
|
/* init des champs de la structure */
|
|
|
|
/* allocation et init des tableaux de tags */
|
|
COL_fn_vCreateTagsTables ( p_stGeomObj, p_stOctree );
|
|
|
|
if ( p_stOctree->xNbFaces < COL_g_xTotalNumberOfFacesLimit )
|
|
{
|
|
/* desalloc */
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeOctreeStructure , NULL);
|
|
TMP_M_Free( p_stGeomObj->p_stOctree );
|
|
p_stGeomObj->p_stOctree = NULL;
|
|
p_stOctree = NULL;
|
|
|
|
GEO_xCreateObjectListOfEdges ( p_stGeomObj );
|
|
GEO_xComputeObjectListOfEdges ( p_stGeomObj );
|
|
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
struct COL_tdstOctree_ *p_oTmpPtr;
|
|
|
|
/* save octree ptr */
|
|
p_oTmpPtr = p_stGeomObj->p_stOctree;
|
|
/* allocate real octree (GEO)*/
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeOctreeStructure , NULL);
|
|
GEO_M_CPAMalloc ( p_stGeomObj->p_stOctree, COL_tdpstOctree, sizeof(COL_tdstOctree), E_uwGEONotEnoughtMemory );
|
|
COL_g_lMemory += sizeof(COL_tdstOctree);
|
|
/* copy tmp octree in new one */
|
|
memcpy(p_stGeomObj->p_stOctree,p_oTmpPtr,sizeof(COL_tdstOctree));
|
|
p_stOctree = p_stGeomObj->p_stOctree;
|
|
/* and delete tmp element base table */
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeOctreeStructure , NULL);
|
|
TMP_M_Free( p_oTmpPtr );
|
|
|
|
/* calcul de la bounding box */
|
|
COL_fn_vComputeBoundingBoxOfGeometricObject ( &(p_stOctree->stMinBoundingBox), &(p_stOctree->stMaxBoundingBox), p_stGeomObj );
|
|
|
|
/* allocation et init d une liste de selection des faces */
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeFaceIndexList , NULL);
|
|
COL_g_d_xSelectedFaceIndexList = (COL_tdxFaceIndex *)TMP_M_p_Malloc ( (1+2*(p_stOctree->xNbFaces))*sizeof(COL_tdxFaceIndexDouble) );
|
|
*COL_g_d_xSelectedFaceIndexList = 0;
|
|
|
|
/* construction de l arbre */
|
|
p_stOctree->p_stOctreeRoot = COL_fn_pstConstructRecursiveOctree ( p_stGeomObj, &(p_stOctree->stMinBoundingBox), &(p_stOctree->stMaxBoundingBox) );
|
|
TMP_M_Free ( COL_g_d_xSelectedFaceIndexList );
|
|
return TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Recursive function of an octree node destruction
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 22 aug 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* destruction recursive d un noeud */
|
|
/*
|
|
void COL_fn_vDestructRecursiveOctree ( COL_tdstOctreeNode *p_stNodeToBeDestructed )
|
|
{
|
|
// branche ou feuille
|
|
if ( p_stNodeToBeDestructed->p_pstChildList != NULL )
|
|
{
|
|
// branche
|
|
COL_fn_vDestructRecursiveOctree ( p_stNodeToBeDestructed->p_pstChildList[COL_C_xXMinYMinZMin] );
|
|
COL_fn_vDestructRecursiveOctree ( p_stNodeToBeDestructed->p_pstChildList[COL_C_xXMinYMinZMax] );
|
|
COL_fn_vDestructRecursiveOctree ( p_stNodeToBeDestructed->p_pstChildList[COL_C_xXMinYMaxZMin] );
|
|
COL_fn_vDestructRecursiveOctree ( p_stNodeToBeDestructed->p_pstChildList[COL_C_xXMinYMaxZMax] );
|
|
COL_fn_vDestructRecursiveOctree ( p_stNodeToBeDestructed->p_pstChildList[COL_C_xXMaxYMinZMin] );
|
|
COL_fn_vDestructRecursiveOctree ( p_stNodeToBeDestructed->p_pstChildList[COL_C_xXMaxYMinZMax] );
|
|
COL_fn_vDestructRecursiveOctree ( p_stNodeToBeDestructed->p_pstChildList[COL_C_xXMaxYMaxZMin] );
|
|
COL_fn_vDestructRecursiveOctree ( p_stNodeToBeDestructed->p_pstChildList[COL_C_xXMaxYMaxZMax] );
|
|
// desallocation de la liste de fils
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeOctreeNode , NULL);
|
|
GEO_M_CPAFree ( p_stNodeToBeDestructed->p_pstChildList );
|
|
}
|
|
else
|
|
{
|
|
// feuille
|
|
// desallocation de la liste de faces
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeFaceIndexList , NULL);
|
|
GEO_M_CPAFree ( p_stNodeToBeDestructed->d_xFaceIndexList );
|
|
}
|
|
|
|
// desallocation du noeud
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeOctree , MMG_C_lSubTypeOctreeNode , NULL);
|
|
GEO_M_CPAFree ( p_stNodeToBeDestructed );
|
|
}
|
|
*/
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Delete the octree of an object
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 22 aug 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* effacement - destruction d un octree */
|
|
|
|
/*
|
|
void COL_fn_vDeleteOctree ( GEO_tdstGeometricObject *p_stGeomObj )
|
|
{
|
|
if ( p_stGeomObj->p_stOctree != NULL )
|
|
{
|
|
// destruction de l octree
|
|
COL_fn_vDestructRecursiveOctree ( (p_stGeomObj->p_stOctree)->p_stOctreeRoot );
|
|
|
|
// destruction du tableau de tags de points
|
|
//GEO_M_CPAFree ( (p_stGeomObj->p_stOctree)->d_lTaggedPointsTable );
|
|
|
|
// destruction du tableau de tags de faces
|
|
//GEO_M_CPAFree ( (p_stGeomObj->p_stOctree)->d_lTaggedFacesTable );
|
|
|
|
// destruction du tableau des bases des elements
|
|
GEO_M_CPAFree ( (p_stGeomObj->p_stOctree)->d_xElementBasesTable );
|
|
|
|
// destruction de la liste de faces selectionnees
|
|
//GEO_M_CPAFree ( (p_stGeomObj->p_stOctree)->d_xSelectedFaceIndexList );
|
|
|
|
// destruction de la structure octree
|
|
GEO_M_CPAFree ( p_stGeomObj->p_stOctree );
|
|
p_stGeomObj->p_stOctree = NULL;
|
|
}
|
|
}
|
|
*/
|
|
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Recursive function of an octree node exploration
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 22 aug 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* exploration recursive d un noeud */
|
|
/* used*/
|
|
void COL_fn_vExploreRecursiveOctreeWithBox ( COL_tdpstOctreeNode p_stNodeToBeExplored,
|
|
MTH3D_tdstVector *p_stMinSituation,
|
|
MTH3D_tdstVector *p_stMaxSituation,
|
|
COL_tdpstOctreeNode *d_pstSelectedNode,
|
|
ACP_tdxIndex *p_xNumberOfSelectedNodes )
|
|
{
|
|
COL_g_xDepth++;
|
|
/* si dans partition */
|
|
if ( INT_fn_bIntersectBoxWithBox ( p_stMinSituation, p_stMaxSituation,
|
|
&(p_stNodeToBeExplored->stMinPart), &(p_stNodeToBeExplored->stMaxPart) ) )
|
|
{
|
|
/* si liste de fils est diff de nul */
|
|
if ( p_stNodeToBeExplored->p_pstChildList != NULL )
|
|
{
|
|
/* on descend */
|
|
COL_fn_vExploreRecursiveOctreeWithBox ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMinZMin], p_stMinSituation, p_stMaxSituation, d_pstSelectedNode, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithBox ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMinZMax], p_stMinSituation, p_stMaxSituation, d_pstSelectedNode, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithBox ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMaxZMin], p_stMinSituation, p_stMaxSituation, d_pstSelectedNode, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithBox ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMaxZMax], p_stMinSituation, p_stMaxSituation, d_pstSelectedNode, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithBox ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMinZMin], p_stMinSituation, p_stMaxSituation, d_pstSelectedNode, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithBox ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMinZMax], p_stMinSituation, p_stMaxSituation, d_pstSelectedNode, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithBox ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMaxZMin], p_stMinSituation, p_stMaxSituation, d_pstSelectedNode, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithBox ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMaxZMax], p_stMinSituation, p_stMaxSituation, d_pstSelectedNode, p_xNumberOfSelectedNodes );
|
|
}
|
|
else
|
|
{
|
|
if ( p_stNodeToBeExplored->d_xFaceIndexList != NULL )
|
|
{
|
|
/* on recupere les noeuds */
|
|
if ( *p_xNumberOfSelectedNodes < COL_C_xMaxSelectedNodes )
|
|
{
|
|
d_pstSelectedNode[*p_xNumberOfSelectedNodes] = p_stNodeToBeExplored;
|
|
(*p_xNumberOfSelectedNodes) ++;
|
|
COL_g_xSelectedDepth = COL_g_xDepth;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
COL_g_xDepth--;
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Explore the octree of an object with a box
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 22 aug 1996 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* exploration d un octree */
|
|
/* used*/
|
|
void COL_fn_vExploreOctreeWithBox ( COL_tdpstOctree p_stOctree,
|
|
MTH3D_tdstVector *p_stMinPoint,
|
|
MTH3D_tdstVector *p_stMaxPoint,
|
|
COL_tdpstOctreeNode *d_pstSelectedNode,
|
|
ACP_tdxIndex *p_xNumberOfSelectedNodes )
|
|
{
|
|
/* init les noeuds selectionnes */
|
|
*p_xNumberOfSelectedNodes = 0;
|
|
COL_g_xSelectedDepth = 0;
|
|
COL_g_xDepth = 0;
|
|
|
|
if ( p_stOctree != NULL )
|
|
{
|
|
/* exploration */
|
|
COL_fn_vExploreRecursiveOctreeWithBox ( p_stOctree->p_stOctreeRoot, p_stMinPoint, p_stMaxPoint,
|
|
d_pstSelectedNode, p_xNumberOfSelectedNodes );
|
|
}
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : View and add a selected node
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 02 dec 1996 Author : YLG-FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
/* used*/
|
|
void COL_fn_vViewAndAddSelectedNode ( COL_tdpstOctreeNode p_stNodeToBeExplored,
|
|
MTH_tdxReal xT,
|
|
COL_tdpstOctreeNode *d_pstSelectedNode,
|
|
MTH_tdxReal *d_xSelectedT,
|
|
ACP_tdxIndex *p_xNumberOfSelectedNodes )
|
|
{
|
|
ACP_tdxIndex xNodeIndex;
|
|
|
|
/* index sur le dernier element */
|
|
xNodeIndex = *p_xNumberOfSelectedNodes;
|
|
while ( ( 0 < xNodeIndex ) && ( xT < d_xSelectedT[xNodeIndex-1] ) )
|
|
{
|
|
if ( xNodeIndex < COL_C_xMaxSelectedNodes )
|
|
{
|
|
/* passe dans la liste xIndex <- xIndex-1 */
|
|
d_pstSelectedNode[xNodeIndex] = d_pstSelectedNode[xNodeIndex-1];
|
|
d_xSelectedT[xNodeIndex] = d_xSelectedT[xNodeIndex-1];
|
|
}
|
|
xNodeIndex--;
|
|
}
|
|
|
|
if ( xNodeIndex < COL_C_xMaxSelectedNodes )
|
|
{
|
|
/* ajout ds liste xIndex */
|
|
d_pstSelectedNode[xNodeIndex] = p_stNodeToBeExplored;
|
|
d_xSelectedT[xNodeIndex] = xT;
|
|
if ( *p_xNumberOfSelectedNodes < COL_C_xMaxSelectedNodes )
|
|
{
|
|
(*p_xNumberOfSelectedNodes) ++;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Recursive function of an octree node exploration
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 02 dec 1996 Author : YLG-FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* exploration recursive d un noeud */
|
|
/* used*/
|
|
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 )
|
|
{
|
|
MTH_tdxReal xT;
|
|
|
|
COL_g_xDepth++;
|
|
/* si dans partition */
|
|
if ( INT_fn_bDetectIntersectSegmentWithBox ( p_stVertexA, p_stVectAB,
|
|
&(p_stNodeToBeExplored->stMinPart),
|
|
&(p_stNodeToBeExplored->stMaxPart), &xT ) )
|
|
{
|
|
/* si liste de fils est diff de nul */
|
|
if ( p_stNodeToBeExplored->p_pstChildList != NULL )
|
|
{
|
|
/* on descend */
|
|
COL_fn_vExploreRecursiveOctreeWithSegment ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMinZMin], p_stVertexA, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSegment ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMinZMax], p_stVertexA, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSegment ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMaxZMin], p_stVertexA, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSegment ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMaxZMax], p_stVertexA, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSegment ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMinZMin], p_stVertexA, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSegment ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMinZMax], p_stVertexA, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSegment ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMaxZMin], p_stVertexA, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSegment ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMaxZMax], p_stVertexA, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
}
|
|
else
|
|
{
|
|
if ( p_stNodeToBeExplored->d_xFaceIndexList != NULL )
|
|
{
|
|
/* on recupere les noeuds */
|
|
COL_fn_vViewAndAddSelectedNode ( p_stNodeToBeExplored, xT, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_g_xSelectedDepth = COL_g_xDepth;
|
|
}
|
|
}
|
|
}
|
|
COL_g_xDepth--;
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Explore the octree of an object with a segment
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 02 dec 1996 Author : YLG-FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* exploration d un octree */
|
|
/* used*/
|
|
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 )
|
|
{
|
|
/* init les noeuds selectionnes */
|
|
*p_xNumberOfSelectedNodes = 0;
|
|
COL_g_xSelectedDepth = 0;
|
|
COL_g_xDepth = 0;
|
|
|
|
if ( p_stOctree != NULL )
|
|
{
|
|
/* exploration */
|
|
COL_fn_vExploreRecursiveOctreeWithSegment ( p_stOctree->p_stOctreeRoot, p_stVertexA, p_stVectAB,
|
|
d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
}
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Recursive function of an octree node exploration
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 02 dec 1996 Author : YLG-FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
#ifdef ACTIVE_EDITOR
|
|
/* active editor only*/
|
|
/* exploration recursive d un noeud */
|
|
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 )
|
|
{
|
|
MTH_tdxReal xT;
|
|
ACP_tdxBool bBack;
|
|
|
|
COL_g_xDepth++;
|
|
/* si dans partition */
|
|
if ( INT_fn_bIntersectSemiAxeWithBoxForOctree ( p_stVertexA, p_stVertexB, p_stVectAB,
|
|
&(p_stNodeToBeExplored->stMinPart),
|
|
&(p_stNodeToBeExplored->stMaxPart), &bBack, &xT ) )
|
|
{
|
|
/* si liste de fils est diff de nul */
|
|
if ( p_stNodeToBeExplored->p_pstChildList != NULL )
|
|
{
|
|
/* on descend */
|
|
COL_fn_vExploreRecursiveOctreeWithSemiAxe ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMinZMin], p_stVertexA, p_stVertexB, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSemiAxe ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMinZMax], p_stVertexA, p_stVertexB, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSemiAxe ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMaxZMin], p_stVertexA, p_stVertexB, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSemiAxe ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMinYMaxZMax], p_stVertexA, p_stVertexB, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSemiAxe ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMinZMin], p_stVertexA, p_stVertexB, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSemiAxe ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMinZMax], p_stVertexA, p_stVertexB, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSemiAxe ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMaxZMin], p_stVertexA, p_stVertexB, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_fn_vExploreRecursiveOctreeWithSemiAxe ( p_stNodeToBeExplored->p_pstChildList[COL_C_xXMaxYMaxZMax], p_stVertexA, p_stVertexB, p_stVectAB, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
}
|
|
else
|
|
{
|
|
if ( p_stNodeToBeExplored->d_xFaceIndexList != NULL )
|
|
{
|
|
/* on recupere les noeuds */
|
|
if ( bBack )
|
|
{
|
|
xT = 0;
|
|
}
|
|
COL_fn_vViewAndAddSelectedNode ( p_stNodeToBeExplored, xT, d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
COL_g_xSelectedDepth = COL_g_xDepth;
|
|
}
|
|
}
|
|
}
|
|
COL_g_xDepth--;
|
|
}
|
|
|
|
#endif
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Explore the octree of an object with a semi-axe
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 02 dec 1996 Author : YLG-FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifdef ACTIVE_EDITOR
|
|
/* active editor only*/
|
|
/* exploration d un octree */
|
|
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 )
|
|
{
|
|
/* init les noeuds selectionnes */
|
|
*p_xNumberOfSelectedNodes = 0;
|
|
COL_g_xSelectedDepth = 0;
|
|
COL_g_xDepth = 0;
|
|
|
|
if ( p_stOctree != NULL )
|
|
{
|
|
/* exploration */
|
|
COL_fn_vExploreRecursiveOctreeWithSemiAxe ( p_stOctree->p_stOctreeRoot, p_stVertexA, p_stVertexB, p_stVectAB,
|
|
d_pstSelectedNode, d_xSelectedT, p_xNumberOfSelectedNodes );
|
|
}
|
|
}
|
|
|
|
#endif
|