ScalePhysicsObject: Difference between revisions
Jump to navigation
Jump to 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.
No edit summary |
Thunder4ik (talk | contribs) |
||
(5 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
{{Multiple issues| | |||
{{Dead end|date=January 2024}} | |||
{{Orphan|date=January 2024}} | |||
}} | |||
{{warning|This function has not been tested.}} | {{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.}} | |||
<pre>void ScalePhysicsObject(CBaseEntity *pEnt, float scale) | <pre>void ScalePhysicsObject(CBaseEntity *pEnt, float scale) | ||
{ | { | ||
Line 6: | Line 13: | ||
IPhysicsObject *pNew = NULL; | IPhysicsObject *pNew = NULL; | ||
pEnt->VPhysicsGetObjectList( pList, ARRAYSIZE(pList) ) | pEnt->VPhysicsGetObjectList( pList, ARRAYSIZE(pList) ) | ||
for( int | 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++ ) | |||
int | |||
for( int | |||
{ | { | ||
pQuery->GetTriangleVerts( x, y, pVerts[y] ); | |||
pVerts[y][0] *= scale; | |||
pVerts[y][1] *= scale; | |||
pVerts[y][2] *= scale; | |||
} | } | ||
solid_t solid; | 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); | Assert(pNew); | ||
pEnt->VPhysicsDestroyObject(); | |||
pEnt->VPhysicsSetObject( pNew ); | |||
}</pre> | }</pre> | ||
[[Category:Helpers]][[Category:Functions]] | |||
[[Category:Helpers]] | |||
[[Category:Functions]] |
Latest revision as of 10:12, 21 January 2024

This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages)

This article has no
links to other VDC articles. Please help improve this article by adding links
that are relevant to the context within the existing text.
January 2024


January 2024

This article is an orphan, meaning that few or no articles link to it.
You can help by
adding links to this article from other relevant articles.
January 2024
You can help by

January 2024



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 ); }