ScalePhysicsObject

From Valve Developer Community
Revision as of 16:10, 24 July 2006 by Ts2do (talk | contribs)

Jump to: navigation, search

Warning: This function has not been tested.

Note:This function should only be called for physics objects/scaled objects initially extracted from a model.
Note:This function does not scale entities visually.
void ScalePhysicsObject(CBaseEntity *pEnt, float scale)
{
	Assert(pEnt);
	IPhysicsObject *pList[32];
	IPhysicsObject *pNew = NULL;
	pEnt->VPhysicsGetObjectList( pList, ARRAYSIZE(pList) )
	if(pList[1]!=NULL)
	{
		Assert(pList[1]==NULL); // Don't know what to do for ragdolls
		return;
	}
	IPhysicsObject pObj = pList[0];
	Assert(pObj);
	Assert( scale > 0.0f );
	CPhysCollide *pColl = pObj->GetCollide();
	ICollisionQuery *pQuery = physcollision->CreateQueryModel( pColl );

	int convexCount = pQuery->ConvexCount();
	CPhysConvex *pConvex[convexCount];
	for( int x=0; x < convexCount; x++ )
	{
		int tris = pQuery->TriangleCount( x )
		Vector pVerts[tris][3];
		for( int y=0; y < tris; y++ )
		{
			pQuery->GetTriangleVerts( x, y, pVerts[y] );
			pVerts[y][0] *= scale;
			pVerts[y][1] *= scale;
			pVerts[y][2] *= scale;
		}

		pConvex[x] = physcollision->ConvexFromVerts( pVerts, tris );
	}

	physcollision->DestroyQueryModel( pQuery );
	pColl = physcollision->ConvertConvexToCollide( pConvex, convexCount ); // Don't need to free convex objects, this call does

	solid_t solid;
	Vector worldPosition;
	QAngle angles;
	pObj->GetPosition( &worldPosition, &angles );
	PhysModelParseSolid( solid, pEnt, pEnt->GetModelIndex() );

	pNew = physenv->CreatePolyObject( pColl, pObj->GetMaterialIndex(), worldPosition, angles, &solid.param );

	Assert(pNew);

	pEnt->VPhysicsDestroyObject();
	pEnt->VPhysicsSetObject( pNew );
}