ScalePhysicsObject

From Valve Developer Community
Revision as of 09:04, 24 July 2006 by Ts2do (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
Warning.pngWarning:This function has not been tested.
void ScalePhysicsObject(CBaseEntity *pEnt, float scale)
{
	Assert(pEnt);
	IPhysicsObject *pList[32];
	IPhysicsObject *pNew = NULL;
	pEnt->VPhysicsGetObjectList( pList, ARRAYSIZE(pList) )
	for( int a = 0; pList[a] != NULL; a++)
	{
		IPhysicsObject pObj = pList[a];
		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);
	if(pList[1]==NULL)
	{
		pEnt->VPhysicsSetObject( pNew );
	}
	else
	{
		// Don't know what to do for ragdolls
	}
}