ScalePhysicsObject
From Valve Developer Community
Warning: 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) ) 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() ); solid.param.mass *= scale; solid.param.volume *= scale; solid.param.inertia *= scale; pNew = physenv->CreatePolyObject( pColl, pObj->GetMaterialIndex(), worldPosition, angles, &solid.param ); Assert(pNew); pEnt->VPhysicsDestroyObject(); pEnt->VPhysicsSetObject( pNew ); }