/*
===================
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;
}
Beispiel #2
0
/*
===================
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;
}