ScalePhysicsObject: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
mNo edit summary
mNo edit summary
Line 6: Line 6:
IPhysicsObject *pNew = NULL;
IPhysicsObject *pNew = NULL;
pEnt->VPhysicsGetObjectList( pList, ARRAYSIZE(pList) )
pEnt->VPhysicsGetObjectList( pList, ARRAYSIZE(pList) )
for( int a = 0; pList[a] != NULL; a++)
if(pList[1]!=NULL)
{
{
IPhysicsObject pObj = pList[a];
Assert(pList[1]==NULL); // Don't know what to do for ragdolls
Assert(pObj);
return;
Assert( scale > 0.0f );
}
CPhysCollide *pColl = pObj->GetCollide();
IPhysicsObject pObj = pList[0];
ICollisionQuery *pQuery = physcollision->CreateQueryModel( pColl );
Assert(pObj);
Assert( scale > 0.0f );
int convexCount = pQuery->ConvexCount();
CPhysCollide *pColl = pObj->GetCollide();
CPhysConvex *pConvex[convexCount];
ICollisionQuery *pQuery = physcollision->CreateQueryModel( pColl );
for( int x=0; x < convexCount; x++ )
 
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 tris = pQuery->TriangleCount( x )
pQuery->GetTriangleVerts( x, y, pVerts[y] );
Vector pVerts[tris][3];
pVerts[y][0] *= scale;
for( int y=0; y < tris; y++ )
pVerts[y][1] *= scale;
{
pVerts[y][2] *= scale;
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;
pConvex[x] = physcollision->ConvexFromVerts( pVerts, tris );
Vector worldPosition;
}
QAngle angles;
 
pObj->GetPosition( &worldPosition, &angles );
physcollision->DestroyQueryModel( pQuery );
PhysModelParseSolid( solid, pEnt, pEnt->GetModelIndex() );
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 );


pNew = physenv->CreatePolyObject( pColl, pObj->GetMaterialIndex(), worldPosition, angles, &solid.param );
}
Assert(pNew);
Assert(pNew);
if(pList[1]==NULL)
 
{
pEnt->VPhysicsDestroyObject();
pEnt->VPhysicsDestroyObject();
pEnt->VPhysicsSetObject( pNew );
pEnt->VPhysicsSetObject( pNew );
}
else
{
// Don't know what to do for ragdolls
}
}</pre>
}</pre>
[[Category:Helpers]][[Category:Functions]]
[[Category:Helpers]][[Category:Functions]]

Revision as of 09:07, 24 July 2006

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