2655 lines
113 KiB
C
2655 lines
113 KiB
C
/**********************************************************************************************/
|
||
/* Name: GeoObj.c*/
|
||
/* Code: Philippe Vimont*/
|
||
/* Modif : 30 May 1997 - Guenaele - remove old D3D*/
|
||
/**********************************************************************************************/
|
||
#include <assert.h>
|
||
#include "cpa_std.h"
|
||
|
||
#include "acp_base.h"
|
||
|
||
#include "mth.h"
|
||
#include "GEO.h"
|
||
#include "gmt.h"
|
||
#include "mec.h"
|
||
#include "Col\OctreeGO.h"
|
||
|
||
// FBF N64-format pour coords, et logfile dans x:\exe\geodump.log{
|
||
#ifdef U64CONVERTETLOG
|
||
extern BOOL g_bLoadMap;
|
||
extern FILE *dump;
|
||
|
||
#endif //U64CONVERTLOG
|
||
// } fin N64-format
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xComputeNormalWeightedBySurf*/
|
||
/* Goal: the Normals of triangle is weighted by surf (See computer graphics, gouraud shading)*/
|
||
/* Code: Philippe Vimont*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_xComputeNormalWeightedBySurf ( MTH3D_tdstVector *p_stPResult, MTH3D_tdstVector *p_stPA, MTH3D_tdstVector *p_stPB, MTH3D_tdstVector *p_stPC )
|
||
{
|
||
MTH3D_tdstVector stEdgeAB, stEdgeAC;
|
||
|
||
MTH3D_M_vSubVector ( &stEdgeAB, p_stPB, p_stPA );
|
||
MTH3D_M_vSubVector ( &stEdgeAC, p_stPC, p_stPA );
|
||
|
||
MTH3D_M_vCrossProductVectorWithoutBuffer( p_stPResult, &stEdgeAB, &stEdgeAC );
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xCreateObjectPointNormals*/
|
||
/* Goal: Create the point Normals of object*/
|
||
/* Code: Frederic Philippe*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 07/06/99 */
|
||
void GEO_xCreateObjectPointNormals ( GEO_tdstGeometricObject *p_stObj )
|
||
{
|
||
MTH3D_tdstVector *p_stVertex, *p_stLastVertex;
|
||
|
||
if ( p_stObj->xNbPoints == 0 )
|
||
return;
|
||
|
||
if ( p_stObj->d_stListOfPointsNormals != NULL )
|
||
return;
|
||
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypePointsNormals , 0 );
|
||
GEO_M_CPAMalloc ( p_stObj->d_stListOfPointsNormals, MTH3D_tdstVector *, sizeof(MTH3D_tdstVector)*p_stObj->xNbPoints, E_uwGEONotEnoughtMemory );
|
||
|
||
p_stLastVertex = p_stObj->d_stListOfPointsNormals + p_stObj->xNbPoints;
|
||
for ( p_stVertex = p_stObj->d_stListOfPointsNormals; p_stVertex < p_stLastVertex; p_stVertex ++ )
|
||
{
|
||
MTH3D_M_vNullVector ( p_stVertex );
|
||
}
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 07/06/99 */
|
||
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xComputeAltimapObjectNormals*/
|
||
/* Goal: Create and compute the Normals of object*/
|
||
/* Code: Marc Fascia*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
#ifdef USE_ALTIMAPS
|
||
void GEO_xComputeAltimapObjectNormals( GEO_tdstGeometricObject *p_stObj )
|
||
{
|
||
GEO_tdstElementAltimap *p_stAltimap;
|
||
ACP_tdxIndex xI, xJ, xK, xL, xA, xB, xC, xSquareBLVertex;
|
||
MTH3D_tdstVector *d_stPoints, stOriginNoZ;
|
||
GEO_tdstAltimapSquare *stSquare;
|
||
unsigned char ucType;
|
||
|
||
p_stAltimap = (GEO_tdstElementAltimap *) p_stObj->d_stListOfElements[0];
|
||
|
||
/*--- d_stpoints : Array of Vertices of the Altimap*/
|
||
GEO_M_CPAMalloc( d_stPoints, MTH3D_tdstVector *, ( p_stAltimap->xWidth+1 ) * ( p_stAltimap->xDepth+1 ) * sizeof( MTH3D_tdstVector ), E_uwGEONotEnoughtMemory );
|
||
|
||
/*--- xI : Width*/
|
||
/*--- xJ : Height*/
|
||
/*--- xK : xJ * (Width+1) + xI*/
|
||
MTH3D_M_vSetVectorElements( &stOriginNoZ, p_stAltimap->stOrigin.xX, p_stAltimap->stOrigin.xY, MTH_C_ZERO );
|
||
for(xJ = 0, xK = 0; xJ < p_stAltimap->xDepth+1; xJ++)
|
||
for(xI = 0 ; xI< p_stAltimap->xWidth+1; xI++, xK ++)
|
||
{
|
||
/*--- For each Vertex, sets the coordinates in its super object axis system*/
|
||
MTH3D_M_vNullVector(p_stAltimap->d_stPointNormals + xK);
|
||
(d_stPoints + xK) -> xX = MTH_M_xRealToLong(xI) * p_stAltimap->xDeltaX;
|
||
(d_stPoints + xK) -> xY = MTH_M_xRealToLong(xJ) * p_stAltimap->xDeltaY;
|
||
(d_stPoints + xK) -> xZ = p_stAltimap->d_xHeight[xK];
|
||
MTH3D_M_vAddVector(d_stPoints + xK, d_stPoints + xK, &stOriginNoZ);
|
||
}
|
||
|
||
for(xJ = 0, xK = 0 ; xJ < p_stAltimap->xDepth ; xJ++)
|
||
for(xI = 0 ; xI < p_stAltimap->xWidth; xI++, xK++)
|
||
{
|
||
stSquare = (p_stAltimap->d_stSquare) + xK;
|
||
xL = stSquare->xFaceIndex;
|
||
ucType = stSquare->ucType;
|
||
xSquareBLVertex = xJ * (p_stAltimap->xWidth + 1) + xI;
|
||
|
||
while( ucType )
|
||
{
|
||
if( ucType & GEO_C_xAltiSquareTopRight )
|
||
{
|
||
xA = xSquareBLVertex + 1;
|
||
xB = xSquareBLVertex + 1 + p_stAltimap->xWidth + 1;
|
||
xC = xSquareBLVertex + p_stAltimap->xWidth + 1;
|
||
ucType &= ~GEO_C_xAltiSquareTopRight;
|
||
ucType <<= 4;
|
||
}
|
||
else if( ucType & GEO_C_xAltiSquareBottomLeft )
|
||
{
|
||
xA = xSquareBLVertex;
|
||
xB = xSquareBLVertex + 1;
|
||
xC = xSquareBLVertex + p_stAltimap->xWidth + 1;
|
||
ucType = 0;
|
||
}
|
||
else if( (ucType >> 4) & GEO_C_xAltiSquareBottomLeft )
|
||
{
|
||
xA = xSquareBLVertex;
|
||
xB = xSquareBLVertex + 1;
|
||
xC = xSquareBLVertex + p_stAltimap->xWidth + 1;
|
||
ucType = 0;
|
||
xL++;
|
||
}
|
||
else if( ucType & GEO_C_xAltiSquareTopLeft )
|
||
{
|
||
xA = xSquareBLVertex;
|
||
xB = xSquareBLVertex + 1 + p_stAltimap->xWidth + 1;
|
||
xC = xSquareBLVertex + p_stAltimap->xWidth + 1;
|
||
ucType &= ~GEO_C_xAltiSquareTopLeft;
|
||
ucType <<= 4;
|
||
}
|
||
else if( ucType & GEO_C_xAltiSquareBottomRight )
|
||
{
|
||
xA = xSquareBLVertex;
|
||
xB = xSquareBLVertex + 1;
|
||
xC = xSquareBLVertex + 1 + p_stAltimap->xWidth + 1;
|
||
ucType = 0;
|
||
}
|
||
else if( (ucType >> 4) & GEO_C_xAltiSquareBottomRight )
|
||
{
|
||
xA = xSquareBLVertex;
|
||
xB = xSquareBLVertex + 1;
|
||
xC = xSquareBLVertex + 1 + p_stAltimap->xWidth + 1;
|
||
ucType = 0;
|
||
xL++;
|
||
}
|
||
else
|
||
break;
|
||
|
||
GEO_xComputeNormalWeightedBySurf( &(p_stAltimap->d_stFaces[xL].stNormal), d_stPoints + xA, d_stPoints + xB, d_stPoints + xC );
|
||
MTH3D_M_vAddVector( p_stAltimap->d_stPointNormals + xA, p_stAltimap->d_stPointNormals + xA, &(p_stAltimap->d_stFaces[xL].stNormal) );
|
||
MTH3D_M_vAddVector( p_stAltimap->d_stPointNormals + xB, p_stAltimap->d_stPointNormals + xB, &(p_stAltimap->d_stFaces[xL].stNormal) );
|
||
MTH3D_M_vAddVector( p_stAltimap->d_stPointNormals + xC, p_stAltimap->d_stPointNormals + xC, &(p_stAltimap->d_stFaces[xL].stNormal) );
|
||
|
||
MTH3D_M_vNormalizeVector ( &(p_stAltimap->d_stFaces[xL].stNormal), &(p_stAltimap->d_stFaces[xL].stNormal) );
|
||
}
|
||
}
|
||
|
||
for(xJ = 0, xK = 0; xJ < p_stAltimap->xDepth+1; xJ++)
|
||
for(xI = 0; xI< p_stAltimap->xWidth+1; xI++, xK++)
|
||
{
|
||
if( MTH_M_bEqualZero( MTH3D_M_xNormVector( p_stAltimap->d_stPointNormals + xK ) ) )
|
||
MTH3D_M_vSetVectorElements( p_stAltimap->d_stPointNormals + xK, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE )
|
||
else
|
||
MTH3D_M_vNormalizeVector( p_stAltimap->d_stPointNormals + xK, p_stAltimap->d_stPointNormals + xK )
|
||
}
|
||
GEO_M_CPAFree(d_stPoints);
|
||
return;
|
||
}
|
||
#endif /*USE_ALTIMAPS*/
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xComputeObjectNormals*/
|
||
/* Goal: Create and compute the Normals of object*/
|
||
/* Code: Philippe Vimont*/
|
||
/* Modification: Frederic Philippe*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_xComputeObjectNormals( GEO_tdstGeometricObject *p_stObj )
|
||
{
|
||
MTH3D_tdstVector *p_stVertex, *p_stLastVertex, stNormalResult;
|
||
GEO_tdstTripledIndex *p_stITStart, *p_stITLast;
|
||
GEO_tdstElementIndexedTriangles *p_stLocalElement;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
GEO_tdstFaceMapTriangle *p_stITStartFMD, *p_stITLastFMD;
|
||
GEO_tdstElementFaceMapDescriptors *p_stLocalElementFMD;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
ACP_tdxIndex xIndex, xTriangleIndex;
|
||
|
||
|
||
#ifdef USE_ALTIMAPS
|
||
if ( p_stObj->d_xListOfElementsTypes[0] == GEO_C_xElementAltimap )
|
||
GEO_xComputeAltimapObjectNormals( p_stObj );
|
||
#endif
|
||
|
||
if ( p_stObj->xNbPoints == 0 )
|
||
return;
|
||
|
||
if ( p_stObj->d_stListOfPointsNormals == NULL )
|
||
{
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypePointsNormals , 0 );
|
||
GEO_M_CPAMalloc ( p_stObj->d_stListOfPointsNormals, MTH3D_tdstVector *, sizeof(MTH3D_tdstVector)*p_stObj->xNbPoints, E_uwGEONotEnoughtMemory );
|
||
}
|
||
|
||
p_stVertex = p_stObj->d_stListOfPointsNormals;
|
||
p_stLastVertex = p_stVertex + p_stObj->xNbPoints;
|
||
for ( ; p_stVertex < p_stLastVertex ; p_stVertex ++ )
|
||
{
|
||
MTH3D_M_vNullVector ( p_stVertex );
|
||
}
|
||
|
||
for ( xIndex = 0 ; xIndex < p_stObj->xNbElements ; xIndex ++ )
|
||
{
|
||
// FBF N64-format pour coords, et logfile dans x:\exe\geodump.log{
|
||
#ifdef U64CONVERTETLOG
|
||
if (g_bLoadMap)
|
||
{
|
||
fprintf (dump,"------- compute face normal for element %03d\n",xIndex,p_stVertex->xX,p_stVertex->xY,p_stVertex->xZ);
|
||
fflush(dump);
|
||
}
|
||
|
||
#endif //U64CONVERTLOG
|
||
// } fin N64-format
|
||
|
||
|
||
if ( p_stObj->d_xListOfElementsTypes[xIndex] == GEO_C_xElementIndexedTriangles )
|
||
{
|
||
p_stLocalElement = ((GEO_tdstElementIndexedTriangles *)p_stObj->d_stListOfElements[xIndex]);
|
||
|
||
p_stITStart = p_stLocalElement->d_stListOfFacesTripled;
|
||
p_stITLast = p_stITStart + p_stLocalElement->xNbFaces;
|
||
for ( xTriangleIndex = 0 ; p_stITStart < p_stITLast ; p_stITStart ++ , xTriangleIndex ++ )
|
||
{
|
||
GEO_xComputeNormalWeightedBySurf ( &stNormalResult, p_stObj->d_stListOfPoints + p_stITStart->a3_xIndex[0], p_stObj->d_stListOfPoints + p_stITStart->a3_xIndex[1], p_stObj->d_stListOfPoints + p_stITStart->a3_xIndex[2] );
|
||
p_stLocalElement->d_stListOfFacesNormals[xTriangleIndex] = stNormalResult;
|
||
|
||
if ( !MTH3D_M_bIsNullVector( &stNormalResult ) )
|
||
{
|
||
MTH3D_M_vAddVector ( p_stObj->d_stListOfPointsNormals + p_stITStart->a3_xIndex[0], p_stObj->d_stListOfPointsNormals + p_stITStart->a3_xIndex[0], &stNormalResult );
|
||
MTH3D_M_vAddVector ( p_stObj->d_stListOfPointsNormals + p_stITStart->a3_xIndex[1], p_stObj->d_stListOfPointsNormals + p_stITStart->a3_xIndex[1], &stNormalResult );
|
||
MTH3D_M_vAddVector ( p_stObj->d_stListOfPointsNormals + p_stITStart->a3_xIndex[2], p_stObj->d_stListOfPointsNormals + p_stITStart->a3_xIndex[2], &stNormalResult );
|
||
MTH3D_M_vNormalizeVector ( &p_stLocalElement->d_stListOfFacesNormals[xTriangleIndex], &p_stLocalElement->d_stListOfFacesNormals[xTriangleIndex] );
|
||
}
|
||
// FBF N64-format pour coords, et logfile dans x:\exe\geodump.log{
|
||
#ifdef U64CONVERTETLOG
|
||
if (g_bLoadMap)
|
||
{
|
||
fprintf (dump,"face normal %03d : x=%f,y=%f,z=%f\n",xTriangleIndex,p_stLocalElement->d_stListOfFacesNormals[xTriangleIndex].xX,p_stLocalElement->d_stListOfFacesNormals[xTriangleIndex].xY,p_stLocalElement->d_stListOfFacesNormals[xTriangleIndex].xZ);
|
||
fflush(dump);
|
||
}
|
||
|
||
#endif //U64CONVERTLOG
|
||
// } fin N64-format
|
||
|
||
}
|
||
}
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
else if ( p_stObj->d_xListOfElementsTypes[xIndex] == GEO_C_xElementFaceMapDescriptors )
|
||
{
|
||
p_stLocalElementFMD = ((GEO_tdstElementFaceMapDescriptors *)p_stObj->d_stListOfElements[xIndex]);
|
||
|
||
p_stITStartFMD = p_stLocalElementFMD->d_stListOfFacesQuadrupled;
|
||
p_stITLastFMD = p_stITStartFMD + p_stLocalElementFMD->xNbFaces;
|
||
for ( xTriangleIndex=0 ; p_stITStartFMD < p_stITLastFMD ; p_stITStartFMD ++ , xTriangleIndex ++ )
|
||
{
|
||
GEO_xComputeNormalWeightedBySurf
|
||
(
|
||
&stNormalResult,
|
||
p_stObj->d_stListOfPoints + p_stITStartFMD->stFaceTripled.a3_xIndex[0],
|
||
p_stObj->d_stListOfPoints + p_stITStartFMD->stFaceTripled.a3_xIndex[1],
|
||
p_stObj->d_stListOfPoints + p_stITStartFMD->stFaceTripled.a3_xIndex[2]
|
||
);
|
||
p_stLocalElementFMD->d_stListOfFacesNormals[xTriangleIndex] = stNormalResult;
|
||
|
||
if ( !MTH3D_M_bIsNullVector( &stNormalResult ) )
|
||
{
|
||
MTH3D_M_vAddVector ( p_stObj->d_stListOfPointsNormals + p_stITStartFMD->stFaceTripled.a3_xIndex[0], p_stObj->d_stListOfPointsNormals + p_stITStartFMD->stFaceTripled.a3_xIndex[0], &stNormalResult );
|
||
MTH3D_M_vAddVector ( p_stObj->d_stListOfPointsNormals + p_stITStartFMD->stFaceTripled.a3_xIndex[1], p_stObj->d_stListOfPointsNormals + p_stITStartFMD->stFaceTripled.a3_xIndex[1], &stNormalResult );
|
||
MTH3D_M_vAddVector ( p_stObj->d_stListOfPointsNormals + p_stITStartFMD->stFaceTripled.a3_xIndex[2], p_stObj->d_stListOfPointsNormals + p_stITStartFMD->stFaceTripled.a3_xIndex[2], &stNormalResult );
|
||
MTH3D_M_vNormalizeVector ( &p_stLocalElementFMD->d_stListOfFacesNormals[xTriangleIndex], &p_stLocalElementFMD->d_stListOfFacesNormals[xTriangleIndex] );
|
||
}
|
||
}
|
||
}
|
||
#endif U64
|
||
//End XB99/04/27
|
||
}
|
||
|
||
p_stVertex = p_stObj->d_stListOfPointsNormals;
|
||
p_stLastVertex = p_stVertex + p_stObj->xNbPoints;
|
||
for ( ; p_stVertex < p_stLastVertex ; p_stVertex ++ )
|
||
{
|
||
if ( MTH3D_M_bIsNullVector( p_stVertex ) )
|
||
{
|
||
MTH3D_M_vSetVectorElements ( p_stVertex, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE );
|
||
}
|
||
else
|
||
{
|
||
MTH3D_M_vNormalizeVector ( p_stVertex, p_stVertex );
|
||
}
|
||
}
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xComputeObjectNormals2*/
|
||
/* Goal: Compute the Normals of object*/
|
||
/* Code: Frederic Philippe*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_xComputeObjectNormals2 ( GEO_tdstGeometricObject *p_stObj )
|
||
{
|
||
if ( p_stObj->d_stListOfPointsNormals == NULL )
|
||
return;
|
||
|
||
GEO_xComputeObjectNormals( p_stObj );
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xComputeIndexUsedByElements*/
|
||
/* Goal:*/
|
||
/* Code:*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_xComputeIndexUsedByElements ( GEO_tdstGeometricObject *p_stObj )
|
||
{
|
||
GEO_tdstElementIndexedTriangles *p_stLocalElement;
|
||
ACP_tdxIndex xIndex, xTriangleIndex;
|
||
unsigned long xObjIndex,xIndexCounter;
|
||
unsigned char aDEF_ulCountBuffer [ (( C_lMaxVertexPerObject + 7 ) >> 3 ) ];
|
||
|
||
if ( p_stObj->xNbElements == 1 )
|
||
return;
|
||
|
||
for ( xIndex = 0 ; xIndex < p_stObj->xNbElements ; xIndex ++ )
|
||
{
|
||
if ( p_stObj->d_xListOfElementsTypes[xIndex] == GEO_C_xElementIndexedTriangles )
|
||
{
|
||
p_stLocalElement = ((GEO_tdstElementIndexedTriangles *)p_stObj->d_stListOfElements[xIndex]);
|
||
|
||
/* Clear CountBuffer */
|
||
memset( (unsigned char *)aDEF_ulCountBuffer , 0 , ((p_stObj->xNbPoints+7) >> 3) );
|
||
|
||
/* Tagging idex in Countbuffer */
|
||
for (xTriangleIndex = 0; xTriangleIndex < p_stLocalElement->xNbFaces; xTriangleIndex++ )
|
||
{
|
||
xObjIndex = (p_stLocalElement->d_stListOfFacesTripled + xTriangleIndex)->a3_xIndex[0];
|
||
*(aDEF_ulCountBuffer + (xObjIndex >> 3)) |= (1 << (xObjIndex & 0x00000007));
|
||
xObjIndex = (p_stLocalElement->d_stListOfFacesTripled + xTriangleIndex)->a3_xIndex[1];
|
||
*(aDEF_ulCountBuffer + (xObjIndex >> 3)) |= (1 << (xObjIndex & 0x00000007));
|
||
xObjIndex = (p_stLocalElement->d_stListOfFacesTripled + xTriangleIndex)->a3_xIndex[2];
|
||
*(aDEF_ulCountBuffer + (xObjIndex >> 3)) |= (1 << (xObjIndex & 0x00000007));
|
||
}
|
||
|
||
/* Counting Number of Indexes used */
|
||
p_stLocalElement->xNumberOfIndexsUsed = 0;
|
||
for (xObjIndex = 0; xObjIndex < (((unsigned long)p_stObj->xNbPoints)+7) >> 3; xObjIndex ++ )
|
||
{
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x01) p_stLocalElement->xNumberOfIndexsUsed++;
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x02) p_stLocalElement->xNumberOfIndexsUsed++;
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x04) p_stLocalElement->xNumberOfIndexsUsed++;
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x08) p_stLocalElement->xNumberOfIndexsUsed++;
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x10) p_stLocalElement->xNumberOfIndexsUsed++;
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x20) p_stLocalElement->xNumberOfIndexsUsed++;
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x40) p_stLocalElement->xNumberOfIndexsUsed++;
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x80) p_stLocalElement->xNumberOfIndexsUsed++;
|
||
}
|
||
|
||
if (p_stLocalElement->xNumberOfIndexsUsed == p_stObj->xNbPoints)
|
||
continue;
|
||
|
||
|
||
/* allocate d_stListOfIndexUsedByThisElement */
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeIndexUsedByElement , 0 );
|
||
GEO_M_CPAMalloc ( p_stLocalElement->d_stListOfIndexUsedByThisElement,
|
||
ACP_tdxIndex *,
|
||
sizeof(ACP_tdxIndex)*p_stLocalElement->xNumberOfIndexsUsed,
|
||
E_uwGEONotEnoughtMemory );
|
||
|
||
/* Building d_stListOfIndexUsedByThisElement */
|
||
xIndexCounter = 0;
|
||
for (xObjIndex = 0; xObjIndex < (((unsigned long)p_stObj->xNbPoints)+7) >> 3; xObjIndex ++ )
|
||
{
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x01) p_stLocalElement->d_stListOfIndexUsedByThisElement[xIndexCounter++] = (ACP_tdxIndex)(xObjIndex*8 + 0);
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x02) p_stLocalElement->d_stListOfIndexUsedByThisElement[xIndexCounter++] = (ACP_tdxIndex)(xObjIndex*8 + 1);
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x04) p_stLocalElement->d_stListOfIndexUsedByThisElement[xIndexCounter++] = (ACP_tdxIndex)(xObjIndex*8 + 2);
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x08) p_stLocalElement->d_stListOfIndexUsedByThisElement[xIndexCounter++] = (ACP_tdxIndex)(xObjIndex*8 + 3);
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x10) p_stLocalElement->d_stListOfIndexUsedByThisElement[xIndexCounter++] = (ACP_tdxIndex)(xObjIndex*8 + 4);
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x20) p_stLocalElement->d_stListOfIndexUsedByThisElement[xIndexCounter++] = (ACP_tdxIndex)(xObjIndex*8 + 5);
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x40) p_stLocalElement->d_stListOfIndexUsedByThisElement[xIndexCounter++] = (ACP_tdxIndex)(xObjIndex*8 + 6);
|
||
if (*(aDEF_ulCountBuffer + xObjIndex) & 0x80) p_stLocalElement->d_stListOfIndexUsedByThisElement[xIndexCounter++] = (ACP_tdxIndex)(xObjIndex*8 + 7);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xComputeObjectSphereBox*/
|
||
/* Goal: Compute the spherebox of object*/
|
||
/* Code: by ??*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
void
|
||
GEO_xComputeObjectSphereBox ( GEO_tdstGeometricObject *p_stObj )
|
||
{
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
|
||
/* Cette information est demand<6E> par le super objet*/
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
void GLI_vGetMinMaxObject
|
||
(
|
||
GEO_tdstGeometricObject *p_stObj,
|
||
MTH_tdxReal *xMinX,MTH_tdxReal *xMaxX,
|
||
MTH_tdxReal *xMinY,MTH_tdxReal *xMaxY,
|
||
MTH_tdxReal *xMinZ,MTH_tdxReal *xMaxZ
|
||
)
|
||
{
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
|
||
|
||
/* ********************************************************************************************/
|
||
/* NEW FUNCTIONS STARTS HERE*/
|
||
/* ********************************************************************************************/
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_hAllocGeometricObject*/
|
||
/* Goal: alloc a geometric objetc on the GEO static bloc*/
|
||
/* Code: Marc trabucato 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
ACP_tdxHandleOfObject GEO_hAllocGeometricObject( ACP_tdxIndex xNbPoints , ACP_tdxIndex xNbElements )
|
||
{
|
||
GEO_tdstGeometricObject *p_stObjectToCreate;
|
||
|
||
/* alloc Main struct*/
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeMainObject , 0 );
|
||
GEO_M_CPAMalloc (p_stObjectToCreate , GEO_tdstGeometricObject * , sizeof ( GEO_tdstGeometricObject), E_uwGEONotEnoughtMemory );
|
||
|
||
p_stObjectToCreate->xNbElements = xNbElements;
|
||
p_stObjectToCreate->xNbPoints = xNbPoints;
|
||
|
||
/* alloc Array of Element Type*/
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeListOfElementType , 0 );
|
||
GEO_M_CPAMalloc (p_stObjectToCreate->d_xListOfElementsTypes , ACP_tdxIndex * , sizeof ( ACP_tdxIndex ) * xNbElements , E_uwGEONotEnoughtMemory );
|
||
/* alloc Array of Element*/
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeListOfElement , 0 );
|
||
GEO_M_CPAMalloc (p_stObjectToCreate->d_stListOfElements , void ** , sizeof ( void * ) * xNbElements , E_uwGEONotEnoughtMemory );
|
||
|
||
/* alloc Array of Points*/
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeListOfPoint , 0 );
|
||
GEO_M_CPAMalloc (p_stObjectToCreate->d_stListOfPoints , MTH3D_tdstVector * , sizeof ( MTH3D_tdstVector ) * xNbPoints , E_uwGEONotEnoughtMemory );
|
||
|
||
/* alloc Array of Normals*/
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypePointsNormals , 0 );
|
||
GEO_M_CPAMalloc (p_stObjectToCreate->d_stListOfPointsNormals ,MTH3D_tdstVector * , sizeof ( MTH3D_tdstVector ) * xNbPoints , E_uwGEONotEnoughtMemory );
|
||
|
||
return (ACP_tdxHandleOfObject)p_stObjectToCreate;
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_hAllocTMPGeometricObject*/
|
||
/* Goal: alloc a geometric objetc on the TMP static bloc*/
|
||
/* Code: Marc trabucato 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
||
ACP_tdxHandleOfObject GEO_hAllocTMPGeometricObject( ACP_tdxIndex xNbPoints , ACP_tdxIndex xNbElements )
|
||
{
|
||
GEO_tdstGeometricObject *p_stObjectToCreate;
|
||
|
||
/* alloc Main struct*/
|
||
GEO_M_TMPMalloc (p_stObjectToCreate , GEO_tdstGeometricObject * , sizeof ( GEO_tdstGeometricObject) );
|
||
|
||
p_stObjectToCreate->xNbElements = xNbElements;
|
||
p_stObjectToCreate->xNbPoints = xNbPoints;
|
||
|
||
/* alloc Array of Element Type*/
|
||
GEO_M_TMPMalloc (p_stObjectToCreate->d_xListOfElementsTypes , ACP_tdxIndex * , sizeof ( ACP_tdxIndex ) * xNbElements );
|
||
/* alloc Array of Element*/
|
||
GEO_M_TMPMalloc (p_stObjectToCreate->d_stListOfElements , void ** , sizeof ( void * ) * xNbElements );
|
||
|
||
/* alloc Array of Points*/
|
||
GEO_M_TMPMalloc (p_stObjectToCreate->d_stListOfPoints , MTH3D_tdstVector * , sizeof ( MTH3D_tdstVector ) * xNbPoints );
|
||
/* alloc Array of Normals*/
|
||
GEO_M_TMPMalloc (p_stObjectToCreate->d_stListOfPointsNormals , MTH3D_tdstVector * , sizeof ( MTH3D_tdstVector ) * xNbPoints );
|
||
|
||
return (ACP_tdxHandleOfObject)p_stObjectToCreate;
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
||
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vCreateGeometricObject*/
|
||
/* Goal: init a geometric object*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_vInitGeometricObject( GEO_tdstGeometricObject *p_stObjectToCreate , ACP_tdxIndex xNbPoints , ACP_tdxIndex xNbElements )
|
||
{
|
||
ACP_tdxIndex xInitCount;
|
||
|
||
for (xInitCount=0;xInitCount<xNbElements;xInitCount++)
|
||
p_stObjectToCreate->d_xListOfElementsTypes[xInitCount]=GEO_C_xElementNULL;
|
||
|
||
p_stObjectToCreate->p_stOctree = NULL;
|
||
|
||
p_stObjectToCreate -> xNbParallelBoxes = 0;
|
||
p_stObjectToCreate -> d_stListOfParallelBoxes = NULL;
|
||
|
||
p_stObjectToCreate->ulType = GEO_C_NotALookAt ;
|
||
|
||
#if defined(U64)
|
||
p_stObjectToCreate->fScale = 1.0;
|
||
p_stObjectToCreate->fRadius = 16384.0;
|
||
p_stObjectToCreate->uwRliFlag = 0;
|
||
#endif /* U64 */
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vCreateGeometricObject*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_vCreateGeometricObject( ACP_tdxHandleOfObject *p_hObject , ACP_tdxIndex xNbPoints , ACP_tdxIndex xNbElements )
|
||
{
|
||
*p_hObject = GEO_hAllocGeometricObject( xNbPoints, xNbElements );
|
||
GEO_vInitGeometricObject( (GEO_tdstGeometricObject *) *p_hObject, xNbPoints, xNbElements );
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vCreateTMPGeometricObject*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
||
void GEO_vCreateTMPGeometricObject ( ACP_tdxHandleOfObject *p_hObject , ACP_tdxIndex xNbPoints , ACP_tdxIndex xNbElements )
|
||
{
|
||
*p_hObject = GEO_hAllocTMPGeometricObject( xNbPoints, xNbElements );
|
||
GEO_vInitGeometricObject( (GEO_tdstGeometricObject *) *p_hObject, xNbPoints, xNbElements );
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vDeleteGeometricObject*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_vDeleteGeometricObject ( ACP_tdxHandleOfObject *p_hObj )
|
||
{
|
||
long lElementCounter;
|
||
GEO_tdstGeometricObject *p_hObject ;
|
||
|
||
p_hObject= *(GEO_tdstGeometricObject **)p_hObj ;
|
||
|
||
for (lElementCounter = 0 ; lElementCounter < p_hObject -> xNbElements; lElementCounter ++ )
|
||
switch (p_hObject -> d_xListOfElementsTypes [lElementCounter ] )
|
||
{
|
||
case GEO_C_xElementNULL:
|
||
break;
|
||
case GEO_C_xElementPoints:
|
||
GEO_M_CPAFree( ((GEO_tdstElementPoints * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_xListOfPointIndex);
|
||
GEO_M_CPAFree( p_hObject -> d_stListOfElements[lElementCounter ] );
|
||
break;
|
||
case GEO_C_xElementLines:
|
||
GEO_M_CPAFree( ((GEO_tdstElementLines * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfLineIndex);
|
||
GEO_M_CPAFree( ((GEO_tdstElementLines * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_hListOfLinesMaterial);
|
||
GEO_M_CPAFree( ((GEO_tdstElementLines * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfLinesReceivedLightIntensity);
|
||
GEO_M_CPAFree( ((GEO_tdstElementLines * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
|
||
break;
|
||
case GEO_C_xElementFaceMapDescriptors :
|
||
GEO_M_CPAFree( ((GEO_tdstElementFaceMapDescriptors * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesNormals);
|
||
GEO_M_CPAFree( ((GEO_tdstElementFaceMapDescriptors * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesQuadrupled);
|
||
GEO_M_CPAFree( ((GEO_tdstElementFaceMapDescriptors * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
|
||
break;
|
||
case GEO_C_xElementSprites:
|
||
GEO_M_CPAFree( ((GEO_tdstElementSprite * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfSprites);
|
||
GEO_M_CPAFree( ((GEO_tdstElementSprite * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
|
||
break;
|
||
case GEO_C_xElementSpheres:
|
||
GEO_M_CPAFree( ((GEO_tdstElementSpheres * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfSpheres );
|
||
GEO_M_CPAFree( ((GEO_tdstElementSpheres * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
|
||
break;
|
||
case GEO_C_xElementAlignedBoxes:
|
||
GEO_M_CPAFree( ((GEO_tdstElementAlignedBoxes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfAlignedBoxes);
|
||
GEO_M_CPAFree( ((GEO_tdstElementAlignedBoxes * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
|
||
break;
|
||
case GEO_C_xElementCones:
|
||
GEO_M_CPAFree( ((GEO_tdstElementCones * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfCones);
|
||
GEO_M_CPAFree( ((GEO_tdstElementCones * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
|
||
break;
|
||
case GEO_C_xElementTMeshes:
|
||
GEO_M_CPAFree( ((GEO_tdstElementTMeshes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfMeshAtoms);
|
||
GEO_M_CPAFree( ((GEO_tdstElementTMeshes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesNormals);
|
||
GEO_M_CPAFree( ((GEO_tdstElementTMeshes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfElementUV);
|
||
GEO_M_CPAFree( ((GEO_tdstElementTMeshes * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
|
||
break;
|
||
case GEO_C_xElementIndexedTriangles :
|
||
GEO_M_CPAFree( ((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesTripled);
|
||
GEO_M_CPAFree( ((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesTripledIndexUV);
|
||
GEO_M_CPAFree( ((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesNormals);
|
||
GEO_M_CPAFree( ((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfElementUV);
|
||
GEO_M_CPAFree( ((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) );
|
||
break;
|
||
} /* Element switch*/
|
||
GEO_M_CPAFree( p_hObject -> d_stListOfPoints);
|
||
GEO_M_CPAFree( p_hObject -> d_stListOfPointsNormals);
|
||
|
||
if ( p_hObject -> d_hListOfPointsMaterial )
|
||
GEO_M_CPAFree( p_hObject -> d_hListOfPointsMaterial);
|
||
|
||
if ( p_hObject -> d_stListOfEdges)
|
||
GEO_M_CPAFree( p_hObject -> d_stListOfEdges);
|
||
if ( p_hObject -> d_hListOfEdgesMaterial)
|
||
GEO_M_CPAFree( p_hObject -> d_hListOfEdgesMaterial);
|
||
if ( p_hObject -> d_xListOfElementsTypes)
|
||
GEO_M_CPAFree( p_hObject -> d_xListOfElementsTypes);
|
||
if( p_hObject -> d_stListOfElements)
|
||
GEO_M_CPAFree( p_hObject -> d_stListOfElements);
|
||
if ( p_hObject -> d_stListOfParallelBoxes)
|
||
GEO_M_CPAFree( p_hObject -> d_stListOfParallelBoxes );
|
||
GEO_M_CPAFree( p_hObject );
|
||
*p_hObj = NULL;
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
||
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vRecursiveReinitGamesMaterials*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
/* fbolefeysot - 01/10/98*/
|
||
/* remove init values in GMT{*/
|
||
/*
|
||
void GEO_vRecursiveReinitGamesMaterials ( ACP_tdxHandleOfObject *p_hObj )
|
||
{
|
||
long lElementCounter;
|
||
long lPartOfElementCounter;
|
||
GEO_tdstGeometricObject *p_hObject ;
|
||
|
||
p_hObject= *(GEO_tdstGeometricObject **)p_hObj ;
|
||
|
||
for (lElementCounter = 0 ; lElementCounter < p_hObject -> xNbElements; lElementCounter ++ )
|
||
switch (p_hObject -> d_xListOfElementsTypes [lElementCounter ] )
|
||
{
|
||
case GEO_C_xElementNULL:
|
||
break;
|
||
case GEO_C_xElementPoints:
|
||
GMT_fn_vReInitializeGameMaterial(((GEO_tdstElementPoints * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> hMaterial);
|
||
break;
|
||
case GEO_C_xElementLines:
|
||
for ( lPartOfElementCounter = 0 ;lPartOfElementCounter < ((GEO_tdstElementLines * )(p_hObject -> d_stListOfElements[lElementCounter ]))->xNbLines; lPartOfElementCounter++)
|
||
GMT_fn_vReInitializeGameMaterial(((GEO_tdstElementLines * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_hListOfLinesMaterial[lPartOfElementCounter]);
|
||
break;
|
||
case GEO_C_xElementFaceMapDescriptors :
|
||
for (lPartOfElementCounter = 0 ;lPartOfElementCounter < ((GEO_tdstElementFaceMapDescriptors * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> xNbFaces;lPartOfElementCounter++)
|
||
GMT_fn_vReInitializeGameMaterial(((GEO_tdstElementFaceMapDescriptors * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfFacesQuadrupled[lPartOfElementCounter].hFaceMapDescriptor->hMaterial);
|
||
break;
|
||
case GEO_C_xElementSprites:
|
||
for (lPartOfElementCounter = 0 ;lPartOfElementCounter < ((GEO_tdstElementSprite * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> xNbSprites;lPartOfElementCounter++)
|
||
GMT_fn_vReInitializeGameMaterial(*((GEO_tdstElementSprite * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfSprites[lPartOfElementCounter].hSprite->d_hMaterial);
|
||
break;
|
||
case GEO_C_xElementSpheres:
|
||
for (lPartOfElementCounter = 0 ;lPartOfElementCounter < ((GEO_tdstElementSpheres * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> xNbSpheres;lPartOfElementCounter++)
|
||
GMT_fn_vReInitializeGameMaterial(((GEO_tdstElementSpheres * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfSpheres[lPartOfElementCounter].hMaterial);
|
||
break;
|
||
case GEO_C_xElementAlignedBoxes:
|
||
for (lPartOfElementCounter = 0 ;lPartOfElementCounter < ((GEO_tdstElementAlignedBoxes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> xNbAlignedBoxes;lPartOfElementCounter++)
|
||
GMT_fn_vReInitializeGameMaterial(((GEO_tdstElementAlignedBoxes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfAlignedBoxes[lPartOfElementCounter].hMaterial);
|
||
break;
|
||
case GEO_C_xElementCones:
|
||
for (lPartOfElementCounter = 0 ;lPartOfElementCounter < ((GEO_tdstElementCones * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> xNbCones;lPartOfElementCounter++)
|
||
GMT_fn_vReInitializeGameMaterial(((GEO_tdstElementCones * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> d_stListOfCones[lPartOfElementCounter].hMaterial);
|
||
break;
|
||
case GEO_C_xElementTMeshes:
|
||
GMT_fn_vReInitializeGameMaterial(((GEO_tdstElementTMeshes * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> hMaterial);
|
||
break;
|
||
case GEO_C_xElementIndexedTriangles :
|
||
GMT_fn_vReInitializeGameMaterial(((GEO_tdstElementIndexedTriangles * )(p_hObject -> d_stListOfElements[lElementCounter ])) -> hMaterial);
|
||
break;
|
||
} // Element switch
|
||
}
|
||
*/
|
||
/*END fbolefeysot}*/
|
||
|
||
ACP_tdxIndex GEO_xGetGeometricObjectNumberOfPoints ( ACP_tdxHandleOfObject hObject )
|
||
{
|
||
return hObject->xNbPoints;
|
||
}
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
ACP_tdxIndex GEO_xGetGeometricObjectNumberOfEdges ( ACP_tdxHandleOfObject hObject )
|
||
{
|
||
return hObject->xNbEdges;
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vSetPointOfObject*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_vSetPointOfObject ( ACP_tdxHandleOfObject hObject , MTH3D_tdstVector *p_stPoint , ACP_tdxIndex xIndexOfPoint)
|
||
{
|
||
*(hObject -> d_stListOfPoints + xIndexOfPoint) = *p_stPoint ;
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vSetListOfPointsOfObject*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
void GEO_vSetListOfPointsOfObject ( ACP_tdxHandleOfObject hObject , MTH3D_tdstVector *p_stPoint , ACP_tdxIndex xNbPoints , ACP_tdxIndex xIndexOfFirstPoint)
|
||
{
|
||
memcpy( hObject-> d_stListOfPoints + xIndexOfFirstPoint, p_stPoint, sizeof(MTH3D_tdstVector) * xNbPoints);
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vGetPointOfObject*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_vGetPointOfObject( ACP_tdxHandleOfObject hObject , MTH3D_tdstVector *p_stPoint , ACP_tdxIndex xIndexOfPoint)
|
||
{
|
||
*p_stPoint = *(hObject -> d_stListOfPoints + xIndexOfPoint) ;
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vGetListOfPointsOfObject*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
void GEO_vGetListOfPointsOfObject ( ACP_tdxHandleOfObject hObject , MTH3D_tdstVector *p_stPoint , ACP_tdxIndex xNbPoints , ACP_tdxIndex xIndexOfFirstPoint)
|
||
{
|
||
memcpy( p_stPoint, hObject->d_stListOfPoints + xIndexOfFirstPoint, sizeof(MTH3D_tdstVector) * xNbPoints);
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vSetPointReceivedLightIntensityOfObject*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
||
void GEO_vSetPointReceivedLightIntensityOfObject ( ACP_tdxHandleOfObject hObject , GEO_tdstColor *p_stColor , ACP_tdxIndex xIndexOfPoint)
|
||
{
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vGetPointReceivedLightIntensityOfObject*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_vGetPointReceivedLightIntensityOfObject ( ACP_tdxHandleOfObject hObject , GEO_tdstColor *p_xColor , ACP_tdxIndex xIndexOfPoint)
|
||
{
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vSetNormalOfPointOfObject*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_vSetNormalOfPointOfObject ( ACP_tdxHandleOfObject hObject , MTH3D_tdstVector *p_stNormal , ACP_tdxIndex xIndexOfPoint)
|
||
{
|
||
*(hObject ->d_stListOfPointsNormals + xIndexOfPoint) = *p_stNormal ;
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* NAME : GEO_vGetNormalOfPointOfObject*/
|
||
/* Goal:*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_vGetNormalOfPointOfObject ( ACP_tdxHandleOfObject hObject , MTH3D_tdstVector *p_stNormal , ACP_tdxIndex xIndexOfPoint)
|
||
{
|
||
*p_stNormal = *(hObject->d_stListOfPointsNormals + xIndexOfPoint) ;
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
||
|
||
|
||
|
||
/**********************************************************************************************/
|
||
/* Compute Edges*/
|
||
/* Goal: Compute the liste of edge of geometric object*/
|
||
/* Code by philippe Vimont*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
long GEO_fbIsNotLinked(ACP_tdxIndex *aDEF_xLinkTable, ACP_tdxIndex *p_xLinkToCreate, ACP_tdxIndex xLinkToTest)
|
||
{
|
||
ACP_tdxIndex xLinkCounterLocal;
|
||
for (xLinkCounterLocal = 0 ; xLinkCounterLocal < *p_xLinkToCreate; xLinkCounterLocal ++ )
|
||
if (aDEF_xLinkTable[xLinkCounterLocal] == xLinkToTest)
|
||
return(0);
|
||
|
||
aDEF_xLinkTable[*p_xLinkToCreate] = xLinkToTest;
|
||
(*p_xLinkToCreate) ++;
|
||
|
||
return 1;
|
||
}
|
||
|
||
void GEO_xCreateObjectListOfEdges ( GEO_tdstGeometricObject *p_stObj )
|
||
{
|
||
GEO_tdstTripledIndex *p_stITStart , *p_stITLast ;
|
||
GEO_tdstElementIndexedTriangles *p_stLocalElement;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
GEO_tdstFaceMapTriangle *p_stITStartFMD , *p_stITLastFMD ;
|
||
GEO_tdstElementFaceMapDescriptors *p_stLocalElementFMD;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
GEO_tdstElementLines *p_stElementLines;
|
||
GEO_tdstDoubledIndex *p_stLineStart , *p_stLineLast ;
|
||
ACP_tdxIndex xIndex,xIndexVertices,xNbEdges;
|
||
ACP_tdxIndex aDEF_xLinkTable[300],xLinkToCreate;
|
||
/*300 , cause the maximum of linked edge ever seen is 30*/
|
||
/*so 300 is a real extremist possibility*/
|
||
|
||
if ( p_stObj->d_stListOfEdges != NULL )
|
||
return;
|
||
|
||
xNbEdges = 0;
|
||
/* compute nbedges*/
|
||
for(xIndexVertices=0 ; xIndexVertices<p_stObj->xNbPoints ; xIndexVertices++)
|
||
{
|
||
xLinkToCreate = 0;
|
||
for(xIndex=0 ; xIndex<p_stObj->xNbElements ; xIndex++)
|
||
{
|
||
if(p_stObj->d_xListOfElementsTypes[xIndex] == GEO_C_xElementIndexedTriangles)
|
||
{
|
||
p_stLocalElement =
|
||
((GEO_tdstElementIndexedTriangles *) p_stObj -> d_stListOfElements[xIndex]);
|
||
p_stITLast = p_stLocalElement -> d_stListOfFacesTripled
|
||
+ p_stLocalElement -> xNbFaces ;
|
||
|
||
for (p_stITStart = p_stLocalElement -> d_stListOfFacesTripled ;
|
||
p_stITStart < p_stITLast ;
|
||
p_stITStart ++)
|
||
{
|
||
if (p_stITStart -> a3_xIndex[0] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[1] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[1] ))
|
||
xNbEdges++;
|
||
if ((p_stITStart -> a3_xIndex[2] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[2] ))
|
||
xNbEdges++;
|
||
} else
|
||
if (p_stITStart -> a3_xIndex[1] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[2] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[2] ))
|
||
xNbEdges++;
|
||
if ((p_stITStart -> a3_xIndex[0] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[0] ))
|
||
xNbEdges++;
|
||
} else
|
||
if (p_stITStart -> a3_xIndex[2] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[1] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[1] ))
|
||
xNbEdges++;
|
||
if ((p_stITStart -> a3_xIndex[0] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[0] ))
|
||
xNbEdges++;
|
||
}
|
||
}
|
||
}
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
else
|
||
if(p_stObj->d_xListOfElementsTypes[xIndex] == GEO_C_xElementFaceMapDescriptors )
|
||
{
|
||
p_stLocalElementFMD =
|
||
((GEO_tdstElementFaceMapDescriptors *) p_stObj -> d_stListOfElements[xIndex]);
|
||
|
||
p_stITLastFMD = p_stLocalElementFMD -> d_stListOfFacesQuadrupled
|
||
+ p_stLocalElementFMD -> xNbFaces ;
|
||
|
||
for (p_stITStartFMD = p_stLocalElementFMD -> d_stListOfFacesQuadrupled ;
|
||
p_stITStartFMD < p_stITLastFMD ;
|
||
p_stITStartFMD ++)
|
||
{
|
||
p_stITStart = &p_stITStartFMD -> stFaceTripled ;
|
||
if (p_stITStart -> a3_xIndex[0] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[1] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[1] ))
|
||
xNbEdges++;
|
||
if ((p_stITStart -> a3_xIndex[2] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[2] ))
|
||
xNbEdges++;
|
||
} else
|
||
if (p_stITStart -> a3_xIndex[1] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[2] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[2] ))
|
||
xNbEdges++;
|
||
if ((p_stITStart -> a3_xIndex[0] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[0] ))
|
||
xNbEdges++;
|
||
} else
|
||
if (p_stITStart -> a3_xIndex[2] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[1] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[1] ))
|
||
xNbEdges++;
|
||
if ((p_stITStart -> a3_xIndex[0] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[0] ))
|
||
xNbEdges++;
|
||
}
|
||
}
|
||
}
|
||
#endif U64
|
||
//End XB99/04/27
|
||
else
|
||
if(p_stObj->d_xListOfElementsTypes[xIndex] == GEO_C_xElementLines )
|
||
{
|
||
p_stElementLines = (GEO_tdstElementLines *)(*(p_stObj->d_stListOfElements + xIndex));
|
||
|
||
p_stLineLast = p_stElementLines -> d_stListOfLineIndex
|
||
+ p_stElementLines -> xNbLines ;
|
||
|
||
for (p_stLineStart = p_stElementLines -> d_stListOfLineIndex ;
|
||
p_stLineStart < p_stLineLast ;
|
||
p_stLineStart ++)
|
||
{
|
||
if (p_stLineStart -> a2_xIndex[0] == xIndexVertices)
|
||
{
|
||
if ((p_stLineStart -> a2_xIndex[1] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stLineStart -> a2_xIndex[1] ))
|
||
xNbEdges++;
|
||
} else
|
||
if (p_stLineStart -> a2_xIndex[1] == xIndexVertices)
|
||
{
|
||
if ((p_stLineStart -> a2_xIndex[0] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stLineStart -> a2_xIndex[0] ))
|
||
xNbEdges++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeListOfEdge , 0 );
|
||
/* Create EDGE TABLE*/
|
||
GEO_M_CPAMalloc (
|
||
p_stObj->d_stListOfEdges ,
|
||
GEO_tdstDoubledIndex * ,
|
||
sizeof (GEO_tdstDoubledIndex) * xNbEdges,
|
||
E_uwGEONotEnoughtMemory );
|
||
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeListOfEdgeMaterial , 0 );
|
||
GEO_M_CPAMalloc (
|
||
p_stObj->d_hListOfEdgesMaterial ,
|
||
/*ACP_tdxHandleOfMaterial*/ GMT_tdxHandleToGameMaterial * ,
|
||
sizeof (/*ACP_tdxHandleOfMaterial*/ GMT_tdxHandleToGameMaterial) * xNbEdges,
|
||
E_uwGEONotEnoughtMemory );
|
||
|
||
p_stObj -> xNbEdges = xNbEdges;
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Compute Edges*/
|
||
/* Goal: Compute the liste of edge of geometric object*/
|
||
/* Code by philippe Vimont*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void
|
||
GEO_xComputeObjectListOfEdges ( GEO_tdstGeometricObject *p_stObj )
|
||
{
|
||
GEO_tdstTripledIndex *p_stITStart , *p_stITLast ;
|
||
GEO_tdstDoubledIndex *p_stEdgeToBuild;
|
||
GEO_tdstElementIndexedTriangles *p_stLocalElement;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
GEO_tdstFaceMapTriangle *p_stITStartFMD , *p_stITLastFMD ;
|
||
GEO_tdstElementFaceMapDescriptors *p_stLocalElementFMD;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
GEO_tdstElementLines *p_stElementLines;
|
||
GEO_tdstDoubledIndex *p_stLineStart , *p_stLineLast ;
|
||
GMT_tdxHandleToGameMaterial *p_hEdgeMaterialToBuild;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
GMT_tdxHandleToGameMaterial hMaterial;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
GMT_tdxHandleToGameMaterial *p_hLineMaterial;
|
||
ACP_tdxIndex xIndex,xIndexVertices;
|
||
ACP_tdxIndex aDEF_xLinkTable[300],xLinkToCreate;
|
||
/*300 , cause the maximum of linked edge ever seen is 30*/
|
||
/*so 300 is a real extremist possibility*/
|
||
|
||
p_stEdgeToBuild = p_stObj->d_stListOfEdges ;
|
||
p_hEdgeMaterialToBuild = p_stObj->d_hListOfEdgesMaterial ;
|
||
|
||
for(xIndexVertices=0 ; xIndexVertices<p_stObj->xNbPoints ; xIndexVertices++)
|
||
{
|
||
xLinkToCreate = 0;
|
||
for(xIndex=0 ; xIndex<p_stObj->xNbElements ; xIndex++)
|
||
{
|
||
if(p_stObj->d_xListOfElementsTypes[xIndex] == GEO_C_xElementIndexedTriangles)
|
||
{
|
||
p_stLocalElement =
|
||
((GEO_tdstElementIndexedTriangles *) p_stObj -> d_stListOfElements[xIndex]);
|
||
|
||
p_stITLast = p_stLocalElement -> d_stListOfFacesTripled
|
||
+ p_stLocalElement -> xNbFaces ;
|
||
|
||
for (p_stITStart = p_stLocalElement -> d_stListOfFacesTripled ;
|
||
p_stITStart < p_stITLast ;
|
||
p_stITStart ++)
|
||
{
|
||
if (p_stITStart -> a3_xIndex[0] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[1] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[1] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[1];
|
||
*p_hEdgeMaterialToBuild = p_stLocalElement->hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
if ((p_stITStart -> a3_xIndex[2] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[2] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[2];
|
||
*p_hEdgeMaterialToBuild = p_stLocalElement->hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
} else
|
||
if (p_stITStart -> a3_xIndex[1] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[2] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[2] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[2];
|
||
*p_hEdgeMaterialToBuild = p_stLocalElement->hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
if ((p_stITStart -> a3_xIndex[0] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[0] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[0];
|
||
*p_hEdgeMaterialToBuild = p_stLocalElement->hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
} else
|
||
if (p_stITStart -> a3_xIndex[2] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[1] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[1] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[1];
|
||
*p_hEdgeMaterialToBuild = p_stLocalElement->hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
if ((p_stITStart -> a3_xIndex[0] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[0] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[0];
|
||
*p_hEdgeMaterialToBuild = p_stLocalElement->hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
else
|
||
if(p_stObj->d_xListOfElementsTypes[xIndex] == GEO_C_xElementFaceMapDescriptors )
|
||
{
|
||
p_stLocalElementFMD =
|
||
((GEO_tdstElementFaceMapDescriptors *) p_stObj -> d_stListOfElements[xIndex]);
|
||
|
||
p_stITLastFMD = p_stLocalElementFMD -> d_stListOfFacesQuadrupled
|
||
+ p_stLocalElementFMD -> xNbFaces ;
|
||
|
||
for (p_stITStartFMD = p_stLocalElementFMD -> d_stListOfFacesQuadrupled ;
|
||
p_stITStartFMD < p_stITLastFMD ;
|
||
p_stITStartFMD ++)
|
||
{
|
||
p_stITStart = &p_stITStartFMD -> stFaceTripled ;
|
||
GEO_xGetFaceMapDescriptorGameMaterial ( p_stITStartFMD->hFaceMapDescriptor, &hMaterial );
|
||
|
||
if (p_stITStart -> a3_xIndex[0] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[1] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[1] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[1];
|
||
*p_hEdgeMaterialToBuild = hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
if ((p_stITStart -> a3_xIndex[2] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[2] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[2];
|
||
*p_hEdgeMaterialToBuild = hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
} else
|
||
if (p_stITStart -> a3_xIndex[1] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[2] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[2] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[2];
|
||
*p_hEdgeMaterialToBuild = hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
if ((p_stITStart -> a3_xIndex[0] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[0] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[0];
|
||
*p_hEdgeMaterialToBuild = hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
} else
|
||
if (p_stITStart -> a3_xIndex[2] == xIndexVertices)
|
||
{
|
||
if ((p_stITStart -> a3_xIndex[1] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[1] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[1];
|
||
*p_hEdgeMaterialToBuild = hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
if ((p_stITStart -> a3_xIndex[0] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stITStart -> a3_xIndex[0] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stITStart -> a3_xIndex[0];
|
||
*p_hEdgeMaterialToBuild = hMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif U64
|
||
//End XB99/04/27
|
||
else
|
||
if(p_stObj->d_xListOfElementsTypes[xIndex] == GEO_C_xElementLines )
|
||
{
|
||
p_stElementLines = (GEO_tdstElementLines *)(*(p_stObj->d_stListOfElements + xIndex));
|
||
|
||
p_stLineLast = p_stElementLines -> d_stListOfLineIndex
|
||
+ p_stElementLines -> xNbLines ;
|
||
|
||
p_hLineMaterial = p_stElementLines->d_hListOfLinesMaterial;
|
||
|
||
for (p_stLineStart = p_stElementLines -> d_stListOfLineIndex ;
|
||
p_stLineStart < p_stLineLast ;
|
||
p_stLineStart ++, p_hLineMaterial++ )
|
||
{
|
||
if (p_stLineStart -> a2_xIndex[0] == xIndexVertices)
|
||
{
|
||
if ((p_stLineStart -> a2_xIndex[1] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stLineStart -> a2_xIndex[1] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stLineStart -> a2_xIndex[1];
|
||
*p_hEdgeMaterialToBuild = *p_hLineMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
} else
|
||
if (p_stLineStart -> a2_xIndex[1] == xIndexVertices)
|
||
{
|
||
if ((p_stLineStart -> a2_xIndex[0] > xIndexVertices) && GEO_fbIsNotLinked(aDEF_xLinkTable,&xLinkToCreate,p_stLineStart -> a2_xIndex[0] ))
|
||
{
|
||
p_stEdgeToBuild -> a2_xIndex[0] = xIndexVertices;
|
||
(p_stEdgeToBuild++) -> a2_xIndex[1] = p_stLineStart -> a2_xIndex[0];
|
||
*p_hEdgeMaterialToBuild = *p_hLineMaterial;
|
||
p_hEdgeMaterialToBuild ++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xDuplicateObject*/
|
||
/* Goal: Duplicate an object without common table (vertices, ...)*/
|
||
/* Code: Marc Villemain (indispensable for D3D)*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
GEO_tdstGeometricObject *GEO_xDuplicateVisualObject ( GEO_tdstGeometricObject *p_stObj )
|
||
{
|
||
return ( p_stObj );
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_lGetGeometricObjectNumberOfElements*/
|
||
/* Goal: return's the number of elements of a geometric object*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
||
long GEO_lGetGeometricObjectNumberOfElements ( ACP_tdxHandleOfObject hObject )
|
||
{
|
||
return hObject->xNbElements ;
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
||
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_vResetGeometricObjectElements*/
|
||
/* Goal: reset an element (can be use in real time, it is not a delete)*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
void GEO_vResetGeometricObjectElements (ACP_tdxHandleOfObject hObject , ACP_tdxHandleOfElement hElement )
|
||
{
|
||
hObject->d_xListOfElementsTypes[hElement] = GEO_C_xElementNULL;
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xDuplicateGeometricObject*/
|
||
/* Goal: Duplicate an object without common table (vertices, ...)*/
|
||
/* Code: Philippe Vimont 1.0 (duplicate.doc)*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
ACP_tdxHandleOfObject GEO_xDuplicateGeometricObject( ACP_tdxHandleOfObject hObject , ACP_tdxIndex xNewNumberOfElement)
|
||
{
|
||
GEO_tdstGeometricObject *p_stObjTmp;
|
||
ACP_tdxHandleOfObject hObjectRet;
|
||
ACP_tdxIndex xElementCounter;
|
||
|
||
if(hObject == NULL)
|
||
return NULL;
|
||
|
||
if (xNewNumberOfElement == 0)
|
||
xNewNumberOfElement = hObject->xNbElements;
|
||
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeMainObject , 0 );
|
||
GEO_M_CPAMalloc ( p_stObjTmp , GEO_tdstGeometricObject*, sizeof(GEO_tdstGeometricObject), E_uwGEONotEnoughtMemory );
|
||
|
||
if(p_stObjTmp == NULL)
|
||
return(NULL);
|
||
|
||
*p_stObjTmp = *hObject;
|
||
p_stObjTmp->xNbElements = xNewNumberOfElement;
|
||
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeListOfElementType , 0 );
|
||
GEO_M_CPAMalloc ( p_stObjTmp -> d_xListOfElementsTypes , ACP_tdxIndex * , sizeof ( ACP_tdxIndex ) * xNewNumberOfElement , E_uwGEONotEnoughtMemory );
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeListOfElement , 0 );
|
||
GEO_M_CPAMalloc ( p_stObjTmp -> d_stListOfElements , void ** , sizeof ( void * ) * xNewNumberOfElement , E_uwGEONotEnoughtMemory );
|
||
|
||
if ((p_stObjTmp -> d_stListOfElements == NULL) || (p_stObjTmp -> d_xListOfElementsTypes == NULL ))
|
||
return NULL;
|
||
|
||
for (xElementCounter = 0; xElementCounter < xNewNumberOfElement; xElementCounter ++)
|
||
p_stObjTmp -> d_xListOfElementsTypes[xNewNumberOfElement] = GEO_C_xElementNULL;
|
||
|
||
if (xNewNumberOfElement >= hObject -> xNbElements)
|
||
{
|
||
memcpy(p_stObjTmp -> d_stListOfElements, hObject -> d_stListOfElements, sizeof(void *) * hObject -> xNbElements);
|
||
memcpy(p_stObjTmp -> d_xListOfElementsTypes, hObject -> d_xListOfElementsTypes, sizeof(ACP_tdxIndex) * hObject -> xNbElements);
|
||
}
|
||
|
||
hObjectRet = p_stObjTmp;
|
||
return ( hObjectRet );
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xGetElementType*/
|
||
/* Goal: get ... (duplicate.doc)*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
ACP_tdxIndex GEO_xGetElementType ( ACP_tdxHandleOfObject hObject , ACP_tdxIndex xElement )
|
||
{
|
||
return (hObject -> d_xListOfElementsTypes [xElement]);
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xGetGeometricObjectNumberOfElements*/
|
||
/* Goal: get ... (duplicate.doc)*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
|
||
#ifdef USE_PROFILER
|
||
ACP_tdxIndex GEO_xGetGeometricObjectNumberOfElements( ACP_tdxHandleOfObject hObject )
|
||
{
|
||
ACP_tdxIndex xI,xNumberOfElement;
|
||
|
||
xNumberOfElement = 0;
|
||
for (xI = 0 ; xI < hObject -> xNbElements ; xI ++ )
|
||
if (hObject -> d_xListOfElementsTypes [xI] != GEO_C_xElementNULL)
|
||
xNumberOfElement++;
|
||
return (xNumberOfElement);
|
||
}
|
||
#endif
|
||
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xGetGeometricObjectNumberOfElementsMax*/
|
||
/* Goal: get ...(duplicate.doc)*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
ACP_tdxIndex GEO_xGetGeometricObjectNumberOfElementsMax( ACP_tdxHandleOfObject hObject )
|
||
{
|
||
return(hObject -> xNbElements);
|
||
}
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_xDuplicateGeometricObjectCommonData*/
|
||
/* Goal: duplicate vertice, vertice normals or vertices colors .... (duplicate.doc)*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_xDuplicateGeometricObjectCommonData ( ACP_tdxHandleOfObject hObject1 , ACP_tdxHandleOfObject hObject2 , long lWhatIsDuplicate )
|
||
{
|
||
if (hObject1 == hObject2)
|
||
return;
|
||
|
||
if (lWhatIsDuplicate & GEO_C_lDuplicateVertices)
|
||
{
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeListOfPoint , 0 );
|
||
GEO_M_CPAMalloc ( hObject2->d_stListOfPoints , MTH3D_tdstVector * , sizeof ( MTH3D_tdstVector) * hObject1->xNbPoints , E_uwGEONotEnoughtMemory );
|
||
memcpy( hObject2->d_stListOfPoints, hObject1->d_stListOfPoints, sizeof ( MTH3D_tdstVector) * hObject1->xNbPoints );
|
||
}
|
||
if (lWhatIsDuplicate & GEO_C_lDuplicateVerticesNormals )
|
||
{
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypePointsNormals , 0 );
|
||
GEO_M_CPAMalloc ( hObject2->d_stListOfPointsNormals , MTH3D_tdstVector * , sizeof ( MTH3D_tdstVector) * hObject1->xNbPoints, E_uwGEONotEnoughtMemory );
|
||
memcpy( hObject2->d_stListOfPointsNormals , hObject1->d_stListOfPointsNormals , sizeof ( MTH3D_tdstVector) * hObject1->xNbPoints);
|
||
}
|
||
/*
|
||
if (lWhatIsDuplicate & GEO_C_lDuplicateColideInformation)
|
||
{
|
||
}
|
||
*/
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_bDuplicateGeometricObjectElement*/
|
||
/* Goal: duplicate an element (duplicate.doc)*/
|
||
/* example for an indextriangle, duplicate the element without duplicate the faces*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
#define GEO_M_DuplicateElement( Elem ) \
|
||
GEO_M_CPAMalloc (\
|
||
hObject2 -> d_stListOfElements [*p_xElementCounter] ,\
|
||
void *,\
|
||
sizeof( Elem ) ,\
|
||
E_uwGEONotEnoughtMemory );\
|
||
if (hObject2 -> d_stListOfElements [*p_xElementCounter] == NULL) return(FALSE);\
|
||
hObject2 -> d_xListOfElementsTypes [*p_xElementCounter] = hObject1 -> d_xListOfElementsTypes [hElement];\
|
||
memcpy( \
|
||
hObject2->d_stListOfElements [*p_xElementCounter] , \
|
||
hObject1->d_stListOfElements [hElement] , \
|
||
sizeof ( Elem ) )
|
||
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
long GEO_bDuplicateGeometricObjectElement ( ACP_tdxHandleOfObject hObject1 , ACP_tdxHandleOfObject hObject2 , ACP_tdxHandleOfElement hElement , ACP_tdxHandleOfElement *p_xElementCounter)
|
||
{
|
||
for (*p_xElementCounter = 0; *p_xElementCounter < hObject2 -> xNbElements; (*p_xElementCounter) ++)
|
||
if (hObject2 -> d_xListOfElementsTypes[*p_xElementCounter] == GEO_C_xElementNULL)
|
||
break;
|
||
if ( *p_xElementCounter == hObject2 -> xNbElements )
|
||
return(FALSE);
|
||
|
||
switch (hObject1 -> d_xListOfElementsTypes [hElement])
|
||
{
|
||
case GEO_C_xElementNULL:
|
||
break;
|
||
case GEO_C_xElementPoints:
|
||
GEO_M_DuplicateElement( GEO_tdstElementPoints ) ;
|
||
break;
|
||
case GEO_C_xElementLines:
|
||
GEO_M_DuplicateElement( GEO_tdstElementLines ) ;
|
||
break;
|
||
case GEO_C_xElementFaceMapDescriptors :
|
||
GEO_M_DuplicateElement( GEO_tdstElementFaceMapDescriptors ) ;
|
||
break;
|
||
case GEO_C_xElementSprites:
|
||
GEO_M_DuplicateElement( GEO_tdstElementSprite ) ;
|
||
break;
|
||
case GEO_C_xElementSpheres:
|
||
GEO_M_DuplicateElement( GEO_tdstElementSpheres ) ;
|
||
break;
|
||
case GEO_C_xElementAlignedBoxes:
|
||
GEO_M_DuplicateElement( GEO_tdstElementAlignedBoxes ) ;
|
||
break;
|
||
case GEO_C_xElementCones:
|
||
GEO_M_DuplicateElement( GEO_tdstIndexedCone ) ;
|
||
break;
|
||
case GEO_C_xElementTMeshes:
|
||
GEO_M_DuplicateElement( GEO_tdstElementTMeshes ) ;
|
||
break;
|
||
case GEO_C_xElementIndexedTriangles :
|
||
GEO_M_DuplicateElement( GEO_tdstElementIndexedTriangles ) ;
|
||
break;
|
||
} /* Element switch*/
|
||
return(TRUE);
|
||
}
|
||
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_bCopyingGeometricObjectElement*/
|
||
/* Goal: copying an element (duplicate.doc)*/
|
||
/* Code: Philippe Vimont 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
long GEO_bCopyingGeometricObjectElement
|
||
(
|
||
ACP_tdxHandleOfObject hObject1 ,
|
||
ACP_tdxHandleOfObject hObject2 ,
|
||
ACP_tdxIndex xElementNumberInFirstObject ,
|
||
ACP_tdxIndex *p_xNewElementNumberInSecondObject
|
||
)
|
||
{
|
||
for (*p_xNewElementNumberInSecondObject = 0;
|
||
*p_xNewElementNumberInSecondObject < hObject2 -> xNbElements;
|
||
(*p_xNewElementNumberInSecondObject) ++)
|
||
if (hObject2 -> d_xListOfElementsTypes[*p_xNewElementNumberInSecondObject] == GEO_C_xElementNULL)
|
||
break;
|
||
if ( *p_xNewElementNumberInSecondObject == hObject2 -> xNbElements ) return(FALSE);
|
||
hObject2 -> d_xListOfElementsTypes [ *p_xNewElementNumberInSecondObject ] =
|
||
hObject1 -> d_xListOfElementsTypes [ xElementNumberInFirstObject ];
|
||
hObject2 -> d_stListOfElements [ *p_xNewElementNumberInSecondObject ] =
|
||
hObject1 -> d_stListOfElements [ xElementNumberInFirstObject ];
|
||
return TRUE;
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_vCreateObjectListOfPointsMaterial*/
|
||
/* Goal: create the list of point materials*/
|
||
/* Code: Frederic Philippe 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void
|
||
GEO_vCreateObjectListOfPointsMaterial
|
||
(
|
||
ACP_tdxHandleOfObject hObject
|
||
)
|
||
{
|
||
if ( hObject->d_hListOfPointsMaterial != NULL )
|
||
return;
|
||
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypePointsMaterial , 0 );
|
||
GEO_M_CPAMalloc (
|
||
hObject->d_hListOfPointsMaterial ,
|
||
/*ACP_tdxHandleOfMaterial*/ GMT_tdxHandleToGameMaterial *,
|
||
(hObject->xNbPoints)*sizeof( /*ACP_tdxHandleOfMaterial*/ GMT_tdxHandleToGameMaterial ) ,
|
||
E_uwGEONotEnoughtMemory );
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_vComputeObjectListOfPointsMaterial*/
|
||
/* Goal: compute the list of point materials*/
|
||
/* Code: Frederic Philippe 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void
|
||
GEO_vComputeObjectListOfPointsMaterial
|
||
(
|
||
ACP_tdxHandleOfObject hObject
|
||
)
|
||
{
|
||
ACP_tdxIndex xElementIndex;
|
||
ACP_tdxIndex xDataElementIndex;
|
||
GEO_tdstElementIndexedTriangles *p_stElementIndexedTriangles;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
GEO_tdstElementFaceMapDescriptors *p_stElementFaceMapDescriptors;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
GEO_tdstElementSpheres *p_stElementSpheres;
|
||
GEO_tdstElementAlignedBoxes *p_stElementAlignedBoxes;
|
||
GEO_tdstElementPoints *p_stElementPoints;
|
||
GEO_tdstElementLines *p_stElementLines;
|
||
|
||
ACP_tdxIndex xPointIndex;
|
||
ACP_tdxIndex xGlobalPointIndex;
|
||
/*ACP_tdxHandleOfMaterial hMaterial;*/
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
GMT_tdxHandleToGameMaterial hMaterial;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
GEO_tdstIndexedSphere *p_stIndexedSphere;
|
||
GEO_tdstIndexedAlignedBox *p_stIndexedAlignedBox;
|
||
|
||
for ( xElementIndex = 0 ; xElementIndex < hObject->xNbElements ; xElementIndex++ )
|
||
{
|
||
switch ( *(hObject->d_xListOfElementsTypes + xElementIndex) )
|
||
{
|
||
case GEO_C_xElementIndexedTriangles :
|
||
p_stElementIndexedTriangles = (GEO_tdstElementIndexedTriangles *)(*(hObject->d_stListOfElements + xElementIndex));
|
||
|
||
/* pour les triangles */
|
||
for ( xDataElementIndex = 0 ; xDataElementIndex < p_stElementIndexedTriangles->xNbFaces ; xDataElementIndex++ )
|
||
{
|
||
/* points du triangle */
|
||
for ( xPointIndex = 0 ; xPointIndex < 3 ; xPointIndex++ )
|
||
{
|
||
xGlobalPointIndex = (p_stElementIndexedTriangles->d_stListOfFacesTripled + xDataElementIndex)->a3_xIndex[xPointIndex];
|
||
if ( hObject->d_hListOfPointsMaterial )
|
||
*(hObject->d_hListOfPointsMaterial + xGlobalPointIndex) = p_stElementIndexedTriangles->hMaterial;
|
||
}
|
||
}
|
||
break;
|
||
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
case GEO_C_xElementFaceMapDescriptors :
|
||
p_stElementFaceMapDescriptors = (GEO_tdstElementFaceMapDescriptors *)(*(hObject->d_stListOfElements + xElementIndex));
|
||
|
||
/* pour les triangles */
|
||
for ( xDataElementIndex = 0 ; xDataElementIndex < p_stElementFaceMapDescriptors->xNbFaces ; xDataElementIndex++ )
|
||
{
|
||
GEO_xGetFaceMapDescriptorGameMaterial ( (p_stElementFaceMapDescriptors->d_stListOfFacesQuadrupled + xDataElementIndex)->hFaceMapDescriptor,
|
||
&hMaterial);
|
||
/* points du triangle */
|
||
for ( xPointIndex = 0 ; xPointIndex < 3 ; xPointIndex++ )
|
||
{
|
||
xGlobalPointIndex = (p_stElementFaceMapDescriptors->d_stListOfFacesQuadrupled + xDataElementIndex)->stFaceTripled.a3_xIndex[xPointIndex];
|
||
if ( hObject->d_hListOfPointsMaterial )
|
||
*(hObject->d_hListOfPointsMaterial + xGlobalPointIndex) = hMaterial;
|
||
}
|
||
}
|
||
break;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
|
||
case GEO_C_xElementSpheres :
|
||
p_stElementSpheres = (GEO_tdstElementSpheres *)(*(hObject->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 */
|
||
xGlobalPointIndex = p_stIndexedSphere->xCenterPoint;
|
||
if ( hObject->d_hListOfPointsMaterial )
|
||
*(hObject->d_hListOfPointsMaterial + xGlobalPointIndex) = p_stIndexedSphere->hMaterial;
|
||
}
|
||
break;
|
||
|
||
case GEO_C_xElementAlignedBoxes :
|
||
p_stElementAlignedBoxes = (GEO_tdstElementAlignedBoxes *)(*(hObject->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 */
|
||
xGlobalPointIndex = p_stIndexedAlignedBox->xMinPoint;
|
||
if ( hObject->d_hListOfPointsMaterial )
|
||
*(hObject->d_hListOfPointsMaterial + xGlobalPointIndex) = p_stIndexedAlignedBox->hMaterial;
|
||
xGlobalPointIndex = p_stIndexedAlignedBox->xMaxPoint;
|
||
if ( hObject->d_hListOfPointsMaterial )
|
||
*(hObject->d_hListOfPointsMaterial + xGlobalPointIndex) = p_stIndexedAlignedBox->hMaterial;
|
||
}
|
||
break;
|
||
|
||
case GEO_C_xElementPoints :
|
||
p_stElementPoints = (GEO_tdstElementPoints *)(*(hObject->d_stListOfElements + xElementIndex));
|
||
|
||
/* pour les points */
|
||
for ( xDataElementIndex = 0 ; xDataElementIndex < p_stElementPoints->xNbPoints ; xDataElementIndex++ )
|
||
{
|
||
xGlobalPointIndex = *(p_stElementPoints->d_xListOfPointIndex + xDataElementIndex);
|
||
if ( hObject->d_hListOfPointsMaterial )
|
||
*(hObject->d_hListOfPointsMaterial + xGlobalPointIndex) = p_stElementPoints->hMaterial;
|
||
}
|
||
break;
|
||
|
||
case GEO_C_xElementLines :
|
||
p_stElementLines = (GEO_tdstElementLines *)(*(hObject->d_stListOfElements + xElementIndex));
|
||
|
||
/* pour les lignes */
|
||
for ( xDataElementIndex = 0 ; xDataElementIndex < p_stElementLines->xNbLines ; xDataElementIndex++ )
|
||
{
|
||
/* points de la ligne */
|
||
xGlobalPointIndex = (p_stElementLines->d_stListOfLineIndex + xDataElementIndex)->a2_xIndex[0];
|
||
if ( hObject->d_hListOfPointsMaterial )
|
||
*(hObject->d_hListOfPointsMaterial + xGlobalPointIndex) = *(p_stElementLines->d_hListOfLinesMaterial + xDataElementIndex);
|
||
xGlobalPointIndex = (p_stElementLines->d_stListOfLineIndex + xDataElementIndex)->a2_xIndex[1];
|
||
if ( hObject->d_hListOfPointsMaterial )
|
||
*(hObject->d_hListOfPointsMaterial + xGlobalPointIndex) = *(p_stElementLines->d_hListOfLinesMaterial + xDataElementIndex);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_vEndModifyObject*/
|
||
/* Goal: end the modify*/
|
||
/* Code: Marc Villemain 1.1*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_vEndModifyObject(ACP_tdxHandleOfObject hObject)
|
||
{
|
||
GEO_xComputeObjectNormals(hObject);
|
||
GEO_xComputeIndexUsedByElements ( hObject );
|
||
GEO_vComputeObjectListOfParallelBox ( hObject );
|
||
|
||
/*VLNEWGLI*/
|
||
#ifndef U64
|
||
hObject->xBoudingSphereCenter = *(hObject->d_stListOfPoints);
|
||
hObject->xBoudingSphereRadius = 0.0f;
|
||
GEO_fn_vAddObjectToSphere( hObject , &hObject->xBoudingSphereCenter , &hObject->xBoudingSphereRadius );
|
||
#endif /*U64*/
|
||
/*EVL*/
|
||
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_vEndCreateObject*/
|
||
/* Goal: end the creation*/
|
||
/* Code: Frederic Philippe 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
|
||
void GEO_vEndCreateObject(ACP_tdxHandleOfObject hObject)
|
||
{
|
||
GEO_xCreateObjectPointNormals ( hObject );
|
||
GEO_vCreateObjectListOfParallelBox ( hObject, hObject -> xNbParallelBoxes );
|
||
GEO_xComputeObjectNormals2(hObject);
|
||
GEO_vComputeObjectListOfParallelBox ( hObject );
|
||
|
||
/*VLNEWGLI*/
|
||
#ifndef U64
|
||
hObject->xBoudingSphereCenter = *(hObject->d_stListOfPoints);
|
||
hObject->xBoudingSphereRadius = 0.0f;
|
||
GEO_fn_vAddObjectToSphere( hObject , &hObject->xBoudingSphereCenter , &hObject->xBoudingSphereRadius );
|
||
#endif /*U64*/
|
||
/*EVL*/
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
|
||
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_vEndModifyObject2*/
|
||
/* Goal: end the modify*/
|
||
/* Code: Frederic Philippe 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void GEO_vEndModifyObject2(ACP_tdxHandleOfObject hObject)
|
||
{
|
||
GEO_xComputeObjectNormals2(hObject);
|
||
GEO_vComputeObjectListOfParallelBox ( hObject );
|
||
|
||
/*VLNEWGLI*/
|
||
#ifndef U64
|
||
hObject->xBoudingSphereCenter = *(hObject->d_stListOfPoints);
|
||
hObject->xBoudingSphereRadius = 0.0f;
|
||
GEO_fn_vAddObjectToSphere( hObject , &hObject->xBoudingSphereCenter , &hObject->xBoudingSphereRadius );
|
||
#endif /*U64*/
|
||
/*EVL*/
|
||
|
||
}
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_vEndModifyGoThroughObject*/
|
||
/* Goal: end the modify*/
|
||
/* Code: Marc Villemain 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
||
void GEO_vEndModifyGoThroughObject(ACP_tdxHandleOfObject hObject)
|
||
{
|
||
GEO_xComputeObjectNormals(hObject);
|
||
GEO_vComputeObjectListOfParallelBox ( hObject );
|
||
|
||
/*VLNEWGLI*/
|
||
#ifndef U64
|
||
hObject->xBoudingSphereCenter = *(hObject->d_stListOfPoints);
|
||
hObject->xBoudingSphereRadius = 0.0f;
|
||
GEO_fn_vAddObjectToSphere( hObject , &hObject->xBoudingSphereCenter , &hObject->xBoudingSphereRadius );
|
||
#endif /*U64*/
|
||
/*EVL*/
|
||
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_vEndModifyObjectWithoutComputingNormal*/
|
||
/* Goal: same as GEO_vEndModifyObject by do not compute the normals*/
|
||
/* Code: Alexis Vaisse*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
|
||
void GEO_vEndModifyObjectWithoutComputingNormal (ACP_tdxHandleOfObject hObject)
|
||
{
|
||
GEO_xComputeIndexUsedByElements ( hObject );
|
||
GEO_vComputeObjectListOfParallelBox ( hObject );
|
||
|
||
/*VLNEWGLI*/
|
||
#ifndef U64
|
||
hObject->xBoudingSphereCenter = *(hObject->d_stListOfPoints);
|
||
hObject->xBoudingSphereRadius = 0.0f;
|
||
GEO_fn_vAddObjectToSphere( hObject , &hObject->xBoudingSphereCenter , &hObject->xBoudingSphereRadius );
|
||
#endif /*U64*/
|
||
/*EVL*/
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
|
||
|
||
|
||
/**********************************************************************************************/
|
||
/* Name: GEO_vGetNormalOfGeometricObjectElement*/
|
||
/* Goal: get the normal of an element (IT and FMD)*/
|
||
/* Code: Frederic Philippe 1.0*/
|
||
/* OPTIMMIZED : No*/
|
||
/**********************************************************************************************/
|
||
void
|
||
GEO_vGetNormalOfGeometricObjectElement
|
||
(
|
||
ACP_tdxHandleOfObject hObject,
|
||
ACP_tdxIndex xElementIndex,
|
||
ACP_tdxIndex xDataElementIndex,
|
||
MTH3D_tdstVector *p_stNormal
|
||
)
|
||
{
|
||
GEO_tdstElementIndexedTriangles *p_stElementIndexedTriangles;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
GEO_tdstElementFaceMapDescriptors *p_stElementFaceMapDescriptors;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
|
||
MTH3D_M_vNullVector ( p_stNormal );
|
||
|
||
switch ( hObject->d_xListOfElementsTypes[xElementIndex] )
|
||
{
|
||
case GEO_C_xElementIndexedTriangles :
|
||
p_stElementIndexedTriangles = (GEO_tdstElementIndexedTriangles *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
MTH3D_M_vCopyVector ( p_stNormal, (p_stElementIndexedTriangles->d_stListOfFacesNormals + xDataElementIndex) );
|
||
break;
|
||
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
case GEO_C_xElementFaceMapDescriptors :
|
||
p_stElementFaceMapDescriptors = (GEO_tdstElementFaceMapDescriptors *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
MTH3D_M_vCopyVector ( p_stNormal, (p_stElementFaceMapDescriptors->d_stListOfFacesNormals + xDataElementIndex) );
|
||
break;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
}
|
||
}
|
||
|
||
/*
|
||
--------------------------------------------------------------------------------
|
||
-- Description : Get the material of geometric object element
|
||
--------------------------------------------------------------------------------
|
||
-- Creation date : 19 feb 1997 Author : FPI
|
||
--------------------------------------------------------------------------------
|
||
-- Modification : Use GMT
|
||
-- Modification date : Mar 97 Author : A.R.
|
||
--------------------------------------------------------------------------------
|
||
*/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
ACP_tdxHandleOfMaterial
|
||
GEO_hGetMaterialOfGeometricObjectElement ( ACP_tdxHandleOfObject hObject,
|
||
ACP_tdxIndex xElementIndex,
|
||
ACP_tdxIndex xDataElementIndex )
|
||
{
|
||
GEO_tdstElementIndexedTriangles *p_stElementIndexedTriangles;
|
||
GEO_tdstElementFaceMapDescriptors *p_stElementFaceMapDescriptors;
|
||
GEO_tdstElementSpheres *p_stElementSpheres;
|
||
GEO_tdstElementAlignedBoxes *p_stElementAlignedBoxes;
|
||
|
||
ACP_tdxHandleOfMaterial hMaterial;
|
||
|
||
switch ( hObject->d_xListOfElementsTypes[xElementIndex] )
|
||
{
|
||
case GEO_C_xElementIndexedTriangles :
|
||
p_stElementIndexedTriangles = (GEO_tdstElementIndexedTriangles *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
return GMT_fn_hGetVisualMaterial(p_stElementIndexedTriangles->hMaterial);
|
||
break;
|
||
|
||
case GEO_C_xElementFaceMapDescriptors :
|
||
p_stElementFaceMapDescriptors = (GEO_tdstElementFaceMapDescriptors *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
GEO_xGetFaceMapDescriptorMaterial ( (p_stElementFaceMapDescriptors->d_stListOfFacesQuadrupled + xDataElementIndex)->hFaceMapDescriptor, &hMaterial );
|
||
return hMaterial;
|
||
break;
|
||
|
||
case GEO_C_xElementSpheres :
|
||
p_stElementSpheres = (GEO_tdstElementSpheres *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
return GMT_fn_hGetVisualMaterial((p_stElementSpheres->d_stListOfSpheres + xDataElementIndex)->hMaterial);
|
||
break;
|
||
|
||
case GEO_C_xElementAlignedBoxes :
|
||
p_stElementAlignedBoxes = (GEO_tdstElementAlignedBoxes *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
return GMT_fn_hGetVisualMaterial((p_stElementAlignedBoxes->d_stListOfAlignedBoxes + xDataElementIndex)->hMaterial);
|
||
break;
|
||
|
||
default :
|
||
break;
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/*
|
||
--------------------------------------------------------------------------------
|
||
-- Description : Get the game material of geometric object element
|
||
--------------------------------------------------------------------------------
|
||
-- Creation date : Mar 97 Author : A.R.
|
||
--------------------------------------------------------------------------------
|
||
-- Modification :
|
||
-- Modification date : Author :
|
||
--------------------------------------------------------------------------------
|
||
*/
|
||
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
||
GMT_tdxHandleToGameMaterial
|
||
GEO_fn_hGetGameMaterialOfGeometricObjectElement ( ACP_tdxHandleOfObject hObject,
|
||
ACP_tdxIndex xElementIndex,
|
||
ACP_tdxIndex xDataElementIndex )
|
||
{
|
||
GEO_tdstElementIndexedTriangles *p_stElementIndexedTriangles;
|
||
GEO_tdstElementFaceMapDescriptors *p_stElementFaceMapDescriptors;
|
||
GEO_tdstElementSpheres *p_stElementSpheres;
|
||
GEO_tdstElementAlignedBoxes *p_stElementAlignedBoxes;
|
||
|
||
GMT_tdxHandleToGameMaterial hMaterial;
|
||
|
||
switch ( hObject->d_xListOfElementsTypes[xElementIndex] )
|
||
{
|
||
case GEO_C_xElementIndexedTriangles :
|
||
p_stElementIndexedTriangles = (GEO_tdstElementIndexedTriangles *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
return p_stElementIndexedTriangles->hMaterial;
|
||
break;
|
||
|
||
case GEO_C_xElementFaceMapDescriptors :
|
||
p_stElementFaceMapDescriptors = (GEO_tdstElementFaceMapDescriptors *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
GEO_xGetFaceMapDescriptorGameMaterial ( (p_stElementFaceMapDescriptors->d_stListOfFacesQuadrupled + xDataElementIndex)->hFaceMapDescriptor, &hMaterial );
|
||
return hMaterial;
|
||
break;
|
||
|
||
case GEO_C_xElementSpheres :
|
||
p_stElementSpheres = (GEO_tdstElementSpheres *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
return (p_stElementSpheres->d_stListOfSpheres + xDataElementIndex)->hMaterial;
|
||
break;
|
||
|
||
case GEO_C_xElementAlignedBoxes :
|
||
p_stElementAlignedBoxes = (GEO_tdstElementAlignedBoxes *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
return (p_stElementAlignedBoxes->d_stListOfAlignedBoxes + xDataElementIndex)->hMaterial;
|
||
break;
|
||
|
||
default :
|
||
break;
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
/*
|
||
--------------------------------------------------------------------------------
|
||
-- Description : Edge part of an edge
|
||
--------------------------------------------------------------------------------
|
||
-- Creation date : 18 nov 1996 Author : FPI
|
||
--------------------------------------------------------------------------------
|
||
*/
|
||
|
||
ACP_tdxBool GEO_bEdgePartOfEdge ( ACP_tdxIndex xEdge1,
|
||
ACP_tdxIndex xEdge2,
|
||
ACP_tdxIndex xPoint1,
|
||
ACP_tdxIndex xPoint2 )
|
||
{
|
||
return ( ( xEdge1 == xPoint1 ) && ( xEdge2 == xPoint2 ) ) ||
|
||
( ( xEdge1 == xPoint2 ) && ( xEdge2 == xPoint1 ) );
|
||
}
|
||
|
||
/*
|
||
--------------------------------------------------------------------------------
|
||
-- Description : Set an edge material
|
||
--------------------------------------------------------------------------------
|
||
-- Creation date : 10 jun 1997 Author : FPI
|
||
--------------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
GEO_vSetEdgeMaterial
|
||
(
|
||
ACP_tdxHandleOfObject hObject,
|
||
ACP_tdxIndex xPoint1,
|
||
ACP_tdxIndex xPoint2,
|
||
GMT_tdxHandleToGameMaterial hMaterial
|
||
)
|
||
{
|
||
ACP_tdxIndex xEdgeIndex;
|
||
|
||
/* on cherche le edge */
|
||
for ( xEdgeIndex = 0 ; xEdgeIndex < hObject->xNbEdges ; xEdgeIndex ++ )
|
||
{
|
||
if
|
||
(
|
||
GEO_bEdgePartOfEdge ( (hObject->d_stListOfEdges + xEdgeIndex)->a2_xIndex[0],
|
||
(hObject->d_stListOfEdges + xEdgeIndex)->a2_xIndex[1],
|
||
xPoint1, xPoint2 )
|
||
)
|
||
{
|
||
hObject->d_hListOfEdgesMaterial[xEdgeIndex] = hMaterial;
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
/*
|
||
--------------------------------------------------------------------------------
|
||
-- Description : Compute the material modification of an element
|
||
--------------------------------------------------------------------------------
|
||
-- Creation date : 10 jun 1997 Author : FPI
|
||
--------------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
GEO_vComputeElementMaterial
|
||
(
|
||
ACP_tdxHandleOfObject hObject,
|
||
ACP_tdxIndex xElementIndex,
|
||
ACP_tdxIndex xDataElementIndex
|
||
)
|
||
{
|
||
GEO_tdstElementIndexedTriangles *p_stElementIndexedTriangles;
|
||
GEO_tdstElementFaceMapDescriptors *p_stElementFaceMapDescriptors;
|
||
GEO_tdstElementSpheres *p_stElementSpheres;
|
||
GEO_tdstElementAlignedBoxes *p_stElementAlignedBoxes;
|
||
GEO_tdstElementPoints *p_stElementPoints;
|
||
GEO_tdstElementLines *p_stElementLines;
|
||
ACP_tdxIndex xPointIndex;
|
||
ACP_tdxIndex xGlobalPointIndex;
|
||
GEO_tdstIndexedSphere *p_stIndexedSphere;
|
||
GEO_tdstIndexedAlignedBox *p_stIndexedAlignedBox;
|
||
GMT_tdxHandleToGameMaterial hMaterial;
|
||
|
||
switch ( hObject->d_xListOfElementsTypes[xElementIndex] )
|
||
{
|
||
case GEO_C_xElementIndexedTriangles :
|
||
p_stElementIndexedTriangles = (GEO_tdstElementIndexedTriangles *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
/* points du triangle */
|
||
for ( xPointIndex = 0 ; xPointIndex < 3 ; xPointIndex++ )
|
||
{
|
||
xGlobalPointIndex = (p_stElementIndexedTriangles->d_stListOfFacesTripled + xDataElementIndex)->a3_xIndex[xPointIndex];
|
||
GEO_vSetEdgeMaterial ( hObject, xGlobalPointIndex,
|
||
(p_stElementIndexedTriangles->d_stListOfFacesTripled + xDataElementIndex)->a3_xIndex[(xPointIndex+1)%3],
|
||
p_stElementIndexedTriangles->hMaterial );
|
||
if (hObject->d_hListOfPointsMaterial)
|
||
hObject->d_hListOfPointsMaterial[xGlobalPointIndex] = p_stElementIndexedTriangles->hMaterial;
|
||
}
|
||
break;
|
||
|
||
case GEO_C_xElementFaceMapDescriptors :
|
||
p_stElementFaceMapDescriptors = (GEO_tdstElementFaceMapDescriptors *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
GEO_xGetFaceMapDescriptorGameMaterial ( (p_stElementFaceMapDescriptors->d_stListOfFacesQuadrupled + xDataElementIndex)->hFaceMapDescriptor,
|
||
&hMaterial);
|
||
/* points du triangle */
|
||
for ( xPointIndex = 0 ; xPointIndex < 3 ; xPointIndex++ )
|
||
{
|
||
xGlobalPointIndex = (p_stElementFaceMapDescriptors->d_stListOfFacesQuadrupled + xDataElementIndex)->stFaceTripled.a3_xIndex[xPointIndex];
|
||
GEO_vSetEdgeMaterial ( hObject, xGlobalPointIndex,
|
||
(p_stElementFaceMapDescriptors->d_stListOfFacesQuadrupled + xDataElementIndex)->stFaceTripled.a3_xIndex[(xPointIndex+1)%3],
|
||
hMaterial );
|
||
if (hObject->d_hListOfPointsMaterial)
|
||
hObject->d_hListOfPointsMaterial[xGlobalPointIndex] = hMaterial;
|
||
}
|
||
break;
|
||
|
||
case GEO_C_xElementSpheres :
|
||
p_stElementSpheres = (GEO_tdstElementSpheres *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
/* sphere */
|
||
p_stIndexedSphere = p_stElementSpheres->d_stListOfSpheres + xDataElementIndex;
|
||
|
||
/* centre de la sphere */
|
||
xGlobalPointIndex = p_stIndexedSphere->xCenterPoint;
|
||
if (hObject->d_hListOfPointsMaterial)
|
||
hObject->d_hListOfPointsMaterial[xGlobalPointIndex] = p_stIndexedSphere->hMaterial;
|
||
break;
|
||
|
||
case GEO_C_xElementAlignedBoxes :
|
||
p_stElementAlignedBoxes = (GEO_tdstElementAlignedBoxes *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
/* boite */
|
||
p_stIndexedAlignedBox = p_stElementAlignedBoxes->d_stListOfAlignedBoxes + xDataElementIndex;
|
||
|
||
/* points de la boite */
|
||
xGlobalPointIndex = p_stIndexedAlignedBox->xMinPoint;
|
||
if (hObject->d_hListOfPointsMaterial)
|
||
hObject->d_hListOfPointsMaterial[xGlobalPointIndex] = p_stIndexedAlignedBox->hMaterial;
|
||
xGlobalPointIndex = p_stIndexedAlignedBox->xMaxPoint;
|
||
if (hObject->d_hListOfPointsMaterial)
|
||
hObject->d_hListOfPointsMaterial[xGlobalPointIndex] = p_stIndexedAlignedBox->hMaterial;
|
||
GEO_vSetEdgeMaterial ( hObject, p_stIndexedAlignedBox->xMinPoint,
|
||
xGlobalPointIndex,
|
||
p_stIndexedAlignedBox->hMaterial );
|
||
break;
|
||
|
||
case GEO_C_xElementPoints :
|
||
p_stElementPoints = (GEO_tdstElementPoints *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
xGlobalPointIndex = p_stElementPoints->d_xListOfPointIndex[xDataElementIndex];
|
||
if (hObject->d_hListOfPointsMaterial)
|
||
hObject->d_hListOfPointsMaterial[xGlobalPointIndex] = p_stElementPoints->hMaterial;
|
||
break;
|
||
|
||
case GEO_C_xElementLines :
|
||
p_stElementLines = (GEO_tdstElementLines *)(hObject->d_stListOfElements[xElementIndex]);
|
||
|
||
/* points de la ligne */
|
||
xGlobalPointIndex = (p_stElementLines->d_stListOfLineIndex + xDataElementIndex)->a2_xIndex[0];
|
||
if (hObject->d_hListOfPointsMaterial)
|
||
hObject->d_hListOfPointsMaterial[xGlobalPointIndex] = p_stElementLines->d_hListOfLinesMaterial[xDataElementIndex];
|
||
xGlobalPointIndex = (p_stElementLines->d_stListOfLineIndex + xDataElementIndex)->a2_xIndex[1];
|
||
if (hObject->d_hListOfPointsMaterial)
|
||
hObject->d_hListOfPointsMaterial[xGlobalPointIndex] = p_stElementLines->d_hListOfLinesMaterial[xDataElementIndex];
|
||
GEO_vSetEdgeMaterial ( hObject, (p_stElementLines->d_stListOfLineIndex + xDataElementIndex)->a2_xIndex[0],
|
||
xGlobalPointIndex,
|
||
p_stElementLines->d_hListOfLinesMaterial[xDataElementIndex] );
|
||
break;
|
||
|
||
default :
|
||
break;
|
||
}
|
||
}
|
||
|
||
/*------------------------------------------------------------------
|
||
* Well, this function will make one Geometric Object from a table
|
||
* of Geometric Objects.
|
||
* For now on, deals only with spheres, boxes, points and cones.
|
||
*------------------------------------------------------------------*/
|
||
void GEO_fn_vClearObjectForGAM(ACP_tdxHandleOfObject _hGeoObj)
|
||
{
|
||
ACP_tdxIndex xIndex;
|
||
|
||
_hGeoObj->xNbPoints = 0;
|
||
for( xIndex=0; xIndex<_hGeoObj->xNbElements; xIndex++ )
|
||
{
|
||
switch( GEO_xGetElementType(_hGeoObj,xIndex) )
|
||
{
|
||
case GEO_C_xElementIndexedTriangles:
|
||
break;
|
||
case GEO_C_xElementSpheres:
|
||
((GEO_tdstElementSpheres *)(_hGeoObj->d_stListOfElements[xIndex]))->xNbSpheres = 0;
|
||
break;
|
||
case GEO_C_xElementAlignedBoxes:
|
||
((GEO_tdstElementAlignedBoxes *)(_hGeoObj->d_stListOfElements[xIndex]))->xNbAlignedBoxes = 0;
|
||
break;
|
||
case GEO_C_xElementCones:
|
||
((GEO_tdstElementCones *)(_hGeoObj->d_stListOfElements[xIndex]))->xNbCones = 0;
|
||
break;
|
||
case GEO_C_xElementNULL:
|
||
break;
|
||
case GEO_C_xElementFaceMapDescriptors:
|
||
break;
|
||
case GEO_C_xElementSprites:
|
||
break;
|
||
case GEO_C_xElementTMeshes:
|
||
break;
|
||
case GEO_C_xElementPoints:
|
||
((GEO_tdstElementPoints *)(_hGeoObj->d_stListOfElements[xIndex]))->xNbPoints = 0;
|
||
break;
|
||
case GEO_C_xElementLines:
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
||
|
||
|
||
ACP_tdxHandleOfObject GEO_fn_hTransformTableOfObjectInOneObjectForGAM(
|
||
ACP_tdxHandleOfObject _hGeoObj,
|
||
ACP_tdxHandleOfObject * a_hTableOfGeoObj,
|
||
ACP_tdxIndex xNbOfgEOoBJ)
|
||
{
|
||
ACP_tdxIndex xNbPoints,xNbP;
|
||
GEO_tdstElementPoints * p_stEPSource,* p_stEPTarget;
|
||
ACP_tdxIndex * p_xIPSource ,* p_xIPTarget, *p_xIPSourceEnd;
|
||
GEO_tdstElementSpheres * p_stESSource,* p_stESTarget;
|
||
GEO_tdstIndexedSphere * p_stISSource,* p_stISTarget, *p_stISSourceEnd;
|
||
GEO_tdstElementAlignedBoxes * p_stEBSource,* p_stEBTarget;
|
||
GEO_tdstIndexedAlignedBox * p_stIBSource,* p_stIBTarget, *p_stIBSourceEnd;
|
||
GEO_tdstElementCones * p_stECSource,* p_stECTarget;
|
||
GEO_tdstIndexedCone * p_stICSource,* p_stICTarget, *p_stICSourceEnd;
|
||
ACP_tdxHandleOfObject *p_hGeoObjInTableAtIndex, *p_hGeoObjInTableEnd;
|
||
void **p_hCurrentElementTarget, **p_hCurrentElementTargetEnd;
|
||
ACP_tdxIndex xNbSubElt, *p_xCurrentElementTypeTarget;
|
||
unsigned long ulSize, ulSizeVector, ulSizeCone, ulSizeSphere, ulSizeBox;
|
||
|
||
p_hCurrentElementTarget = _hGeoObj->d_stListOfElements;
|
||
p_stESSource = (GEO_tdstElementSpheres *)*p_hCurrentElementTarget++;
|
||
p_stEBSource = (GEO_tdstElementAlignedBoxes *)*p_hCurrentElementTarget++;
|
||
p_stECSource = (GEO_tdstElementCones *)*p_hCurrentElementTarget++;
|
||
p_stEPSource = (GEO_tdstElementPoints *)*p_hCurrentElementTarget;
|
||
|
||
p_stISSource = p_stESSource -> d_stListOfSpheres;
|
||
p_stIBSource = p_stEBSource -> d_stListOfAlignedBoxes;
|
||
p_stICSource = p_stECSource -> d_stListOfCones;
|
||
p_xIPSource = p_stEPSource -> d_xListOfPointIndex;
|
||
|
||
xNbPoints = 0;
|
||
p_stESSource -> xNbSpheres = 0;
|
||
p_stEBSource -> xNbAlignedBoxes = 0;
|
||
p_stECSource -> xNbCones = 0;
|
||
p_stEPSource -> xNbPoints = 0;
|
||
|
||
ulSizeVector = sizeof(MTH3D_tdstVector);
|
||
ulSizeSphere = sizeof( GEO_tdstIndexedSphere );
|
||
ulSizeCone = sizeof( GEO_tdstIndexedCone);
|
||
ulSizeBox = sizeof( GEO_tdstIndexedAlignedBox );
|
||
|
||
p_hGeoObjInTableAtIndex = a_hTableOfGeoObj;
|
||
p_hGeoObjInTableEnd = p_hGeoObjInTableAtIndex + xNbOfgEOoBJ;
|
||
for( ; p_hGeoObjInTableAtIndex < p_hGeoObjInTableEnd ; p_hGeoObjInTableAtIndex++ )
|
||
{
|
||
xNbP = ( *p_hGeoObjInTableAtIndex ) -> xNbPoints;
|
||
ulSize = ulSizeVector * xNbP;
|
||
if(ulSize!=0) /* for u64, geometric objects can have 0 acp points*/
|
||
{
|
||
memcpy( _hGeoObj -> d_stListOfPoints + xNbPoints, (*p_hGeoObjInTableAtIndex) -> d_stListOfPoints, ulSize );
|
||
memcpy( _hGeoObj -> d_stListOfPointsNormals + xNbPoints, (*p_hGeoObjInTableAtIndex) -> d_stListOfPointsNormals, ulSize );
|
||
|
||
/* Elements*/
|
||
p_hCurrentElementTarget = (*p_hGeoObjInTableAtIndex)->d_stListOfElements;
|
||
p_hCurrentElementTargetEnd = p_hCurrentElementTarget + (ACP_tdxIndex)((*p_hGeoObjInTableAtIndex) -> xNbElements);
|
||
p_xCurrentElementTypeTarget = (*p_hGeoObjInTableAtIndex)->d_xListOfElementsTypes;
|
||
|
||
for( ; p_hCurrentElementTarget < p_hCurrentElementTargetEnd ; p_hCurrentElementTarget++,p_xCurrentElementTypeTarget++ )
|
||
{
|
||
switch( *p_xCurrentElementTypeTarget )
|
||
{
|
||
case GEO_C_xElementSpheres:
|
||
p_stESTarget = (GEO_tdstElementSpheres*)*p_hCurrentElementTarget;
|
||
p_stISTarget = ((GEO_tdstElementSpheres*)*p_hCurrentElementTarget) -> d_stListOfSpheres;
|
||
xNbSubElt = ((GEO_tdstElementSpheres*)*p_hCurrentElementTarget) -> xNbSpheres;
|
||
memcpy( p_stISSource, p_stISTarget, ulSizeSphere * xNbSubElt );
|
||
if( xNbPoints )
|
||
{
|
||
p_stISSourceEnd = p_stISSource + xNbSubElt;
|
||
for( ; p_stISSource < p_stISSourceEnd ; p_stISSource++ )
|
||
{
|
||
p_stISSource -> xCenterPoint += xNbPoints;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
p_stISSource += xNbSubElt;
|
||
}
|
||
p_stESSource -> xNbSpheres += xNbSubElt;
|
||
break;
|
||
|
||
case GEO_C_xElementAlignedBoxes:
|
||
p_stEBTarget = (GEO_tdstElementAlignedBoxes *)*p_hCurrentElementTarget;
|
||
p_stIBTarget = ((GEO_tdstElementAlignedBoxes *)*p_hCurrentElementTarget) -> d_stListOfAlignedBoxes;
|
||
xNbSubElt = ((GEO_tdstElementAlignedBoxes *)*p_hCurrentElementTarget) -> xNbAlignedBoxes;
|
||
memcpy( p_stIBSource, p_stIBTarget, ulSizeBox * xNbSubElt );
|
||
if( xNbPoints )
|
||
{
|
||
p_stIBSourceEnd = p_stIBSource + xNbSubElt;
|
||
for ( ; p_stIBSource < p_stIBSourceEnd ; p_stIBSource++ )
|
||
{
|
||
p_stIBSource -> xMinPoint += xNbPoints;
|
||
p_stIBSource -> xMaxPoint += xNbPoints;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
p_stIBSource += xNbSubElt;
|
||
}
|
||
p_stEBSource -> xNbAlignedBoxes += xNbSubElt;
|
||
break;
|
||
|
||
case GEO_C_xElementCones:
|
||
p_stECTarget = (GEO_tdstElementCones *)*p_hCurrentElementTarget;
|
||
p_stICTarget = ((GEO_tdstElementCones *)*p_hCurrentElementTarget) -> d_stListOfCones;
|
||
xNbSubElt = ((GEO_tdstElementCones *)*p_hCurrentElementTarget) -> xNbCones;
|
||
memcpy( p_stICSource, p_stICTarget, ulSizeCone * xNbSubElt );
|
||
if( xNbPoints )
|
||
{
|
||
p_stICSourceEnd = p_stICSource + xNbSubElt;
|
||
for ( ; p_stICSource < p_stICSourceEnd ; p_stICSource++ )
|
||
{
|
||
p_stICSource -> xTopPoint += xNbPoints;
|
||
p_stICSource -> xBasePoint += xNbPoints;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
p_stICSource += xNbSubElt;
|
||
}
|
||
p_stECSource -> xNbCones += xNbSubElt;
|
||
break;
|
||
|
||
case GEO_C_xElementPoints:
|
||
p_stEPTarget = ((GEO_tdstElementPoints *)*p_hCurrentElementTarget);
|
||
|
||
p_stEPSource -> xFatness = p_stEPTarget -> xFatness;
|
||
p_stEPSource -> hMaterial = p_stEPTarget -> hMaterial;
|
||
|
||
p_xIPTarget = p_stEPTarget -> d_xListOfPointIndex;
|
||
xNbSubElt = p_stEPTarget -> xNbPoints;
|
||
p_xIPSourceEnd = p_xIPSource + xNbSubElt;
|
||
for ( ; p_xIPSource < p_xIPSourceEnd ; p_xIPTarget++,p_xIPSource++ )
|
||
{
|
||
*p_xIPSource = (*p_xIPTarget) + xNbPoints;
|
||
if ( _hGeoObj->d_hListOfPointsMaterial )
|
||
_hGeoObj->d_hListOfPointsMaterial[ *p_xIPSource ] = p_stEPTarget -> hMaterial;
|
||
}
|
||
p_stEPSource -> xNbPoints += xNbSubElt;
|
||
break;
|
||
|
||
/* Nothing to do with the others types of elements*/
|
||
}
|
||
|
||
}
|
||
xNbPoints += xNbP;
|
||
}
|
||
}
|
||
_hGeoObj->xNbPoints = xNbPoints;
|
||
/*GEO_vEndModifyObject( _hGeoObj );*/
|
||
return _hGeoObj;
|
||
}
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_
|
||
void GEO_fn_vMoveFaceToFaceDescriptors( ACP_tdxHandleOfObject p_stObj, ACP_tdxIndex xElementIT, ACP_tdxIndex xFaceIT, ACP_tdxIndex *p_xElementFMD, ACP_tdxIndex *p_xFaceFMD)
|
||
{
|
||
}
|
||
|
||
|
||
void GEO_fn_vMoveFaceDescriptorsToFace( ACP_tdxHandleOfObject p_stObj, ACP_tdxIndex xElementFMD, ACP_tdxIndex xFaceFMD, ACP_tdxIndex xElementIT, ACP_tdxIndex xFaceIT)
|
||
{
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */
|
||
|
||
/*ANNECY CT 02/02/98{*/
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Compute Surface Speed of a face (for scrolling texture)
|
||
*-----------------------------------------------------------------------------
|
||
* Input : Object which the surface belongs
|
||
* Index of the element of the object
|
||
* Index of the surface of the element
|
||
* vector to return speed
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 02/02/98 Author : Carlos Torres
|
||
*---------------------------------------------------------------------------*/
|
||
void GEO_vGetFaceSurfaceSpeed(ACP_tdxHandleOfObject hObject,
|
||
ACP_tdxIndex xElement,
|
||
ACP_tdxIndex xFace,
|
||
MTH3D_tdstVector * p_vSpeed) {
|
||
GEO_tdstElementIndexedTriangles * p_stElement;
|
||
GEO_tdstTripledIndex * p_stListOfTripled;
|
||
MTH3D_tdstVector * p_vA,* p_vB,* p_vC;
|
||
ACP_tdst2DUVValues * p_uvA,* p_uvB,* p_uvC;
|
||
long bScrollMode;
|
||
MTH_tdxReal xUSpeed,xVSpeed;
|
||
MTH2D_tdstVector vABCSpeed2D;
|
||
|
||
/* init speed*/
|
||
MTH3D_M_vNullVector(p_vSpeed);
|
||
|
||
/* work only for indexed triangles*/
|
||
if (hObject->d_xListOfElementsTypes[xElement] != GEO_C_xElementIndexedTriangles)
|
||
return;
|
||
|
||
/* get element*/
|
||
p_stElement=hObject->d_stListOfElements[xElement];
|
||
|
||
/* get speed*/
|
||
GLI_xGetMaterialTextureScrollingCoef(
|
||
GMT_fn_hGetVisualMaterial(p_stElement->hMaterial),
|
||
0, /* unuse param*/
|
||
&bScrollMode,
|
||
&xUSpeed ,
|
||
&xVSpeed );
|
||
/* change speed unity m/trame to m/s*/
|
||
xUSpeed= MTH_M_xMul(MTH_M_xLongToReal(60),MTH_M_xNeg(xUSpeed));
|
||
xVSpeed= MTH_M_xMul(MTH_M_xLongToReal(60),MTH_M_xNeg(xVSpeed));
|
||
|
||
/* get points A, B and C xyz coordinates*/
|
||
p_stListOfTripled = p_stElement->d_stListOfFacesTripled + xFace;
|
||
p_vA = hObject->d_stListOfPoints + p_stListOfTripled->a3_xIndex[0];
|
||
p_vB = hObject->d_stListOfPoints + p_stListOfTripled->a3_xIndex[1];
|
||
p_vC = hObject->d_stListOfPoints + p_stListOfTripled->a3_xIndex[2];
|
||
/* get points A, B and C uv coordinates*/
|
||
p_stListOfTripled = p_stElement->d_stListOfFacesTripledIndexUV + xFace;
|
||
p_uvA = p_stElement->d_stListOfElementUV + p_stListOfTripled->a3_xIndex[0];
|
||
p_uvB = p_stElement->d_stListOfElementUV + p_stListOfTripled->a3_xIndex[1];
|
||
p_uvC = p_stElement->d_stListOfElementUV + p_stListOfTripled->a3_xIndex[2];
|
||
|
||
|
||
/*///////////////////////////////////////// 2D Speed*/
|
||
{
|
||
MTH2D_tdstMatrix mUVToABC,mABCToUV;
|
||
MTH2D_tdstVector vUVSpeed,vAB,vAC;
|
||
|
||
/* set Speed UV*/
|
||
MTH2D_M_vSetVectorElements(&vUVSpeed,xUSpeed,xVSpeed);
|
||
/* set vectors AB et AC*/
|
||
MTH2D_M_vSetVectorElements(&vAB,p_uvB->xU-p_uvA->xU,p_uvB->xV-p_uvA->xV);
|
||
MTH2D_M_vSetVectorElements(&vAC,p_uvC->xU-p_uvA->xU,p_uvC->xV-p_uvA->xV);
|
||
/* set changement matrice UV -> ABC*/
|
||
MTH2D_M_vSetVectorsInMatrix(&mABCToUV,&vAB,&vAC);
|
||
MTH2D_M_vInverMatrix(&mUVToABC,&mABCToUV);
|
||
/* compute Speed ABC 2D*/
|
||
MTH2D_M_vMulMatrixVectorWithoutBuffer(&vABCSpeed2D,&mUVToABC,&vUVSpeed);
|
||
}
|
||
|
||
/*///////////////////////////////////////// 3D Speed*/
|
||
{
|
||
MTH3D_tdstMatrix mABCToXYZ;
|
||
MTH3D_tdstVector vABCSpeed3D,vAB,vAC,vN;
|
||
|
||
/* set Speed ABC 3D*/
|
||
MTH3D_M_vSetVectorElements(&vABCSpeed3D,MTH2D_M_xGetXofVector(&vABCSpeed2D),MTH2D_M_xGetYofVector(&vABCSpeed2D),MTH_C_ZERO);
|
||
/* set vectors AB et AC and useless normal*/
|
||
MTH3D_M_vSubVector(&vAB,p_vB,p_vA);
|
||
MTH3D_M_vSubVector(&vAC,p_vC,p_vA);
|
||
MTH3D_M_vNullVector(&vN);
|
||
/* set changement matrice ABC -> XYZ*/
|
||
MTH3D_M_vSetVectorsInMatrix(&mABCToXYZ,&vAB,&vAC,&vN);
|
||
/* compute Speed ABC in XYZ*/
|
||
MTH3D_M_vMulMatrixVectorWithoutBuffer(p_vSpeed,&mABCToXYZ,&vABCSpeed3D);
|
||
}
|
||
|
||
}
|
||
/*ENDANNECY CT}*/
|
||
|
||
/*ANNECY MT 20/02/98 {*/
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Allocate the list of parallel boxes
|
||
*-----------------------------------------------------------------------------
|
||
* Input : Object
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 20/02/98 Author : Marc Trabucato
|
||
*---------------------------------------------------------------------------*/
|
||
void GEO_vCreateObjectListOfParallelBox( ACP_tdxHandleOfObject hObject, ACP_tdxIndex xNumberOfParallelBoxes )
|
||
{
|
||
ACP_tdxIndex xIndex;
|
||
|
||
hObject -> xNbParallelBoxes = xNumberOfParallelBoxes;
|
||
|
||
if ( hObject -> xNbParallelBoxes == 0 )
|
||
return;
|
||
|
||
if ( hObject -> d_stListOfParallelBoxes != NULL )
|
||
return;
|
||
|
||
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGeometricObject , MMG_C_lSubTypeParallelBox , 0 );
|
||
|
||
|
||
GEO_M_CPAMalloc ( hObject -> d_stListOfParallelBoxes,
|
||
GEO_tdstParallelBox *,
|
||
sizeof(GEO_tdstParallelBox) * hObject -> xNbParallelBoxes,
|
||
E_uwGEONotEnoughtMemory );
|
||
|
||
for ( xIndex = 0 ; xIndex < hObject -> xNbParallelBoxes ; xIndex ++ )
|
||
{
|
||
MTH3D_M_vFillVector( & ( hObject -> d_stListOfParallelBoxes [ xIndex ] . stMinPoint ), MTH_C_InfinitPlus );
|
||
MTH3D_M_vFillVector( & ( hObject -> d_stListOfParallelBoxes [ xIndex ] . stMaxPoint ), MTH_C_InfinitMinus );
|
||
}
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Compute the list of parallel boxes
|
||
*-----------------------------------------------------------------------------
|
||
* Input : Object
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 20/02/98 Author : Marc Trabucato
|
||
*---------------------------------------------------------------------------*/
|
||
void GEO_vComputeObjectListOfParallelBox( ACP_tdxHandleOfObject hObject )
|
||
{
|
||
ACP_tdxIndex xIndex;
|
||
|
||
if ( hObject -> xNbParallelBoxes == 0 )
|
||
return;
|
||
|
||
if ( hObject -> d_stListOfParallelBoxes == NULL )
|
||
GEO_vCreateObjectListOfParallelBox( hObject , hObject -> xNbParallelBoxes );
|
||
|
||
for ( xIndex = 0 ; xIndex < hObject -> xNbParallelBoxes ; xIndex ++ )
|
||
{
|
||
GEO_vComputeObjectParallelBox( hObject, xIndex );
|
||
}
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Return the number of Parallel boxes in the object
|
||
*-----------------------------------------------------------------------------
|
||
* Input : Object
|
||
*-----------------------------------------------------------------------------
|
||
* Output: the number of Parallel boxes in the object
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 20/02/98 Author : Marc Trabucato
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
||
ACP_tdxIndex GEO_xGetGeometricObjectNumberOfParallelBox( ACP_tdxHandleOfObject hObject )
|
||
{
|
||
return hObject -> xNbParallelBoxes;
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Return the nth Parallel boxe in the object
|
||
*-----------------------------------------------------------------------------
|
||
* Input : Object
|
||
* the index of the wanted parallel box
|
||
*-----------------------------------------------------------------------------
|
||
* Output: an handle of Parallel boxes, or NULL
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 20/02/98 Author : Marc Trabucato
|
||
*---------------------------------------------------------------------------*/
|
||
GEO_tdxHandleToParallelBox GEO_hGetParallelBox( ACP_tdxHandleOfObject hObject, ACP_tdxIndex xParallelBox )
|
||
{
|
||
if( xParallelBox < hObject -> xNbParallelBoxes )
|
||
return hObject -> d_stListOfParallelBoxes + xParallelBox;
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Return the index of th Parallel boxe of the nth element of the object
|
||
*-----------------------------------------------------------------------------
|
||
* Input : Object
|
||
* the index of the wanted element
|
||
*-----------------------------------------------------------------------------
|
||
* Output: an index of Parallel boxes, or GEO_C_xNoParallelBox
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 20/02/98 Author : Marc Trabucato
|
||
*---------------------------------------------------------------------------*/
|
||
ACP_tdxIndex GEO_xGetParallelBoxIndexOfElement( ACP_tdxHandleOfObject hObject, ACP_tdxIndex xIndexElement )
|
||
{
|
||
switch ( hObject -> d_xListOfElementsTypes[ xIndexElement ] )
|
||
{
|
||
case GEO_C_xElementIndexedTriangles:
|
||
return ((GEO_tdstElementIndexedTriangles*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox;
|
||
break;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
case GEO_C_xElementFaceMapDescriptors:
|
||
return ((GEO_tdstElementFaceMapDescriptors*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox;
|
||
break;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
case GEO_C_xElementSprites:
|
||
return ((GEO_tdstElementSprite*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox;
|
||
break;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
case GEO_C_xElementTMeshes:
|
||
return ((GEO_tdstElementTMeshes*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox;
|
||
break;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
case GEO_C_xElementPoints:
|
||
return ((GEO_tdstElementPoints*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox;
|
||
break;
|
||
case GEO_C_xElementLines:
|
||
return ((GEO_tdstElementLines*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox;
|
||
break;
|
||
case GEO_C_xElementSpheres:
|
||
return ((GEO_tdstElementSpheres*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox;
|
||
break;
|
||
case GEO_C_xElementAlignedBoxes:
|
||
return ((GEO_tdstElementAlignedBoxes*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox;
|
||
break;
|
||
case GEO_C_xElementCones:
|
||
return ((GEO_tdstElementCones*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox;
|
||
break;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
case GEO_C_xElementAltimap:
|
||
return GEO_C_xNoParallelBox;
|
||
break;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
default:
|
||
return GEO_C_xNoParallelBox;
|
||
}
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Set the index of th Parallel boxe of the nth element of the object
|
||
*-----------------------------------------------------------------------------
|
||
* Input : Object
|
||
* the index of the wanted element
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 20/02/98 Author : Marc Trabucato
|
||
*---------------------------------------------------------------------------*/
|
||
void GEO_vSetParallelBoxIndexOfElement( ACP_tdxHandleOfObject hObject, ACP_tdxIndex xIndexElement, ACP_tdxIndex xIndexOfParallelBox )
|
||
{
|
||
switch ( hObject -> d_xListOfElementsTypes[ xIndexElement ] )
|
||
{
|
||
case GEO_C_xElementIndexedTriangles:
|
||
((GEO_tdstElementIndexedTriangles*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox = xIndexOfParallelBox;
|
||
break;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
case GEO_C_xElementFaceMapDescriptors:
|
||
((GEO_tdstElementFaceMapDescriptors*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox = xIndexOfParallelBox;
|
||
break;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
case GEO_C_xElementSprites:
|
||
((GEO_tdstElementSprite*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox = xIndexOfParallelBox;
|
||
break;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
case GEO_C_xElementTMeshes:
|
||
((GEO_tdstElementTMeshes*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox = xIndexOfParallelBox;
|
||
break;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
case GEO_C_xElementPoints:
|
||
((GEO_tdstElementPoints*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox = xIndexOfParallelBox;
|
||
break;
|
||
case GEO_C_xElementLines:
|
||
((GEO_tdstElementLines*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox = xIndexOfParallelBox;
|
||
break;
|
||
case GEO_C_xElementSpheres:
|
||
((GEO_tdstElementSpheres*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox = xIndexOfParallelBox;
|
||
break;
|
||
case GEO_C_xElementAlignedBoxes:
|
||
((GEO_tdstElementAlignedBoxes*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox = xIndexOfParallelBox;
|
||
break;
|
||
case GEO_C_xElementCones:
|
||
((GEO_tdstElementCones*) ( hObject -> d_stListOfElements[ xIndexElement ] )) -> xIndexOfParallelBox = xIndexOfParallelBox;
|
||
break;
|
||
//XB99/04/27
|
||
#ifndef U64
|
||
case GEO_C_xElementAltimap:
|
||
break;
|
||
#endif U64
|
||
//End XB99/04/27
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Compute given bounding volume
|
||
*-----------------------------------------------------------------------------
|
||
* Input : an object
|
||
* the index of bounding volume to compute
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 20/02/98 Author : Marc Trabucato
|
||
*---------------------------------------------------------------------------*/
|
||
/*Move in GeoObj2.c because gcc -O2 crash*/
|
||
|
||
|
||
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
|
||
ACP_tdxBool GEO_bIsLookAt (GEO_tdstGeometricObject *p_stObj) {
|
||
return ( (ACP_tdxBool)p_stObj->ulType ) ;
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
|
||
|
||
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
||
void GEO_vTurnLookAt ( GEO_tdstGeometricObject *p_stObj,
|
||
GLD_tdxHandleToViewportAttributes hVpt,
|
||
struct POS_stCompletePosition *p_stCurrentMatrix) {
|
||
GLI_tdstCamera *p_stCam ;
|
||
POS_tdstCompletePosition hCameraPosInv ;
|
||
MTH3D_tdstVector stX, stY, stZ ;
|
||
MTH_tdxReal xNorme ;
|
||
|
||
p_stCam = (( GLI_tdstSpecificAttributesFor3D *)hVpt->p_vSpecificToXD)->p_stCam ;
|
||
POS_fn_vInvertIsoMatrix( &hCameraPosInv, &(p_stCam->stMatrix) );
|
||
|
||
stX.xX = hCameraPosInv.stTranslationVector.xX - p_stCurrentMatrix->stTranslationVector.xX ;
|
||
stX.xY = hCameraPosInv.stTranslationVector.xY - p_stCurrentMatrix->stTranslationVector.xY ;
|
||
stX.xZ = hCameraPosInv.stTranslationVector.xZ - p_stCurrentMatrix->stTranslationVector.xZ ;
|
||
MTH3D_M_vNormalizeVector(&stX, &stX) ;
|
||
|
||
/* STM - avoid using the rotation matrix - it might disappear*/
|
||
if ( p_stObj->ulType & GEO_C_SemiLookAt ) {
|
||
POS_fn_vGetRotationMatrixCol2(p_stCurrentMatrix, &stZ);
|
||
/* stZ.xX = p_stCurrentMatrix->stRotationMatrix.stCol_2.xX ;*/
|
||
/* stZ.xY = p_stCurrentMatrix->stRotationMatrix.stCol_2.xY ;*/
|
||
/* stZ.xZ = p_stCurrentMatrix->stRotationMatrix.stCol_2.xZ ;*/
|
||
}
|
||
else {
|
||
stZ.xX = hCameraPosInv.stTransformMatrix.stCol_1.xX ;
|
||
stZ.xY = hCameraPosInv.stTransformMatrix.stCol_1.xY ;
|
||
stZ.xZ = hCameraPosInv.stTransformMatrix.stCol_1.xZ ;
|
||
}
|
||
|
||
MTH3D_M_vCrossProductVectorWithoutBuffer ( &stY, &stZ, &stX ) ;
|
||
xNorme = MTH3D_M_xNormVector (&stY) ;
|
||
if ( xNorme > 0 ){
|
||
MTH3D_M_vNormalizeVector(&stY, &stY) ;
|
||
MTH3D_M_vCrossProductVectorWithoutBuffer ( &stX, &stY, &stZ ) ;
|
||
POS_fn_vSetRotationMatrix ( p_stCurrentMatrix, &stX, &stY, &stZ ) ;
|
||
}
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
||
|