/* =================== CM_GenerateTriangleSoupCollide Creates an internal structure that will be used to perform collision detection with a triangle soup mesh. Points is packed as concatenated rows. =================== */ cSurfaceCollide_t *CM_GenerateTriangleSoupCollide( int numVertexes, vec3_t *vertexes, int numIndexes, int *indexes ) { cSurfaceCollide_t *sc; static cTriangleSoup_t triSoup; int i, j; if ( numVertexes <= 2 || !vertexes || numIndexes <= 2 || !indexes ) { Sys::Drop( "CM_GenerateTriangleSoupCollide: bad parameters: (%i, %p, %i, %p)", numVertexes, vertexes, numIndexes, indexes ); } if ( numIndexes > SHADER_MAX_INDEXES ) { Sys::Drop( "CM_GenerateTriangleSoupCollide: source is > SHADER_MAX_TRIANGLES" ); } // build a triangle soup triSoup.numTriangles = numIndexes / 3; for ( i = 0; i < triSoup.numTriangles; i++ ) { for ( j = 0; j < 3; j++ ) { triSoup.indexes[ i * 3 + j ] = indexes[ i * 3 + j ]; //VectorCopy( VectorCopy( vertexes[ indexes[ i * 3 + j ] ], triSoup.points[ i ][ j ] ); } } //for(i = 0; i < triSoup.num sc = ( cSurfaceCollide_t * ) CM_Alloc( sizeof( *sc ) ); ClearBounds( sc->bounds[ 0 ], sc->bounds[ 1 ] ); for ( i = 0; i < triSoup.numTriangles; i++ ) { for ( j = 0; j < 3; j++ ) { AddPointToBounds( triSoup.points[ i ][ j ], sc->bounds[ 0 ], sc->bounds[ 1 ] ); } } // generate a bsp tree for the surface CM_SurfaceCollideFromTriangleSoup( &triSoup, sc ); // expand by one unit for epsilon purposes sc->bounds[ 0 ][ 0 ] -= 1; sc->bounds[ 0 ][ 1 ] -= 1; sc->bounds[ 0 ][ 2 ] -= 1; sc->bounds[ 1 ][ 0 ] += 1; sc->bounds[ 1 ][ 1 ] += 1; sc->bounds[ 1 ][ 2 ] += 1; cmLog.Debug( "CM_GenerateTriangleSoupCollide: %i planes %i facets", sc->numPlanes, sc->numFacets ); return sc; }
/* =================== CM_GenerateTriangleSoupCollide Creates an internal structure that will be used to perform collision detection with a triangle soup mesh. Points is packed as concatenated rows. =================== */ cSurfaceCollide_t *CM_GenerateTriangleSoupCollide( int numVertexes, vec3_t *vertexes, int numIndexes, int *indexes ) { cSurfaceCollide_t *sc; static cTriangleSoup_t triSoup; int i, j; if( numVertexes <= 2 || !vertexes || numIndexes <= 2 || !indexes ) Host_Error( "CM_GenerateTriangleSoupCollide: bad params: ( %i, %i )\n", numVertexes, numIndexes ); if( numIndexes > SHADER_MAX_INDEXES ) Host_Error( "CM_GenerateTriangleSoupCollide: source is > SHADER_MAX_TRIANGLES\n" ); // build a triangle soup triSoup.numTriangles = numIndexes / 3; for( i = 0; i < triSoup.numTriangles; i++ ) { for( j = 0; j < 3; j++ ) { triSoup.indexes[i*3+j] = indexes[i*3+j]; VectorCopy(vertexes[indexes[i*3+j]], triSoup.points[i][j]); } } sc = Mem_Alloc( cms.mempool, sizeof( *sc )); ClearBounds( sc->bounds[0], sc->bounds[1] ); for( i = 0; i < triSoup.numTriangles; i++ ) { for( j = 0; j < 3; j++ ) AddPointToBounds( triSoup.points[i][j], sc->bounds[0], sc->bounds[1] ); } // generate a bsp tree for the surface CM_SurfaceCollideFromTriangleSoup( &triSoup, sc ); // expand by one unit for epsilon purposes sc->bounds[0][0] -= 1; sc->bounds[0][1] -= 1; sc->bounds[0][2] -= 1; sc->bounds[1][0] += 1; sc->bounds[1][1] += 1; sc->bounds[1][2] += 1; return sc; }