CPhysicsObject *CreatePhysicsSphere( CPhysicsEnvironment *pEnvironment, float radius, int materialIndex, const Vector &position, const QAngle &angles, objectparams_t *pParams, bool isStatic ) { IVP_U_Quat rotation; IVP_U_Point pos; ConvertRotationToIVP( angles, rotation ); ConvertPositionToIVP( position, pos ); IVP_Template_Real_Object objectTemplate; InitObjectTemplate( objectTemplate, materialIndex, pParams, isStatic ); IVP_Template_Ball ballTemplate; ballTemplate.radius = ConvertDistanceToIVP( radius ); IVP_Ball *realObject = pEnvironment->GetIVPEnvironment()->create_ball( &ballTemplate, &objectTemplate, &rotation, &pos ); float volume = pParams->volume; if ( volume <= 0 ) { volume = 4.0f * radius * radius * radius * M_PI / 3.0f; } CPhysicsObject *pObject = new CPhysicsObject(); pObject->Init( realObject, materialIndex, volume, 0, 0, NULL ); //, pParams->dragCoefficient, pParams->dragCoefficient pObject->SetGameData( pParams->pGameData ); if ( pParams->enableCollisions ) { pObject->EnableCollisions( true ); } // drag is not supported on spheres //pObject->EnableDrag( false ); // no rolling drag by default pObject->SetRollingDrag( 0 ); return pObject; }
CPhysicsObject *CreatePhysicsObject( CPhysicsEnvironment *pEnvironment, const CPhysCollide *pCollisionModel, int materialIndex, const Vector &position, const QAngle& angles, objectparams_t *pParams, bool isStatic ) { IVP_Template_Real_Object objectTemplate; IVP_U_Quat rotation; IVP_U_Point pos; ConvertRotationToIVP( angles, rotation ); ConvertPositionToIVP( position, pos ); InitObjectTemplate( objectTemplate, materialIndex, pParams, isStatic ); IVP_U_Matrix massCenterMatrix; massCenterMatrix.init(); if ( pParams->massCenterOverride ) { IVP_U_Point center; ConvertPositionToIVP( *pParams->massCenterOverride, center ); massCenterMatrix.shift_os( ¢er ); objectTemplate.mass_center_override = &massCenterMatrix; } CPhysicsObject *pObject = new CPhysicsObject(); IVP_SurfaceManager *pSurman = CreateSurfaceManager( pCollisionModel, pObject->m_collideType ); BEGIN_IVP_ALLOCATION(); IVP_Polygon *realObject = pEnvironment->GetIVPEnvironment()->create_polygon(pSurman, &objectTemplate, &rotation, &pos); pObject->Init( realObject, materialIndex, pParams->volume, pParams->dragCoefficient, pParams->dragCoefficient, pParams->massCenterOverride ); pObject->SetGameData( pParams->pGameData ); if ( pParams->enableCollisions ) { pObject->EnableCollisions( true ); } if ( !isStatic && pParams->dragCoefficient != 0.0f ) { pObject->EnableDrag( true ); } pObject->SetRollingDrag( pParams->rollingDrag ); END_IVP_ALLOCATION(); return pObject; }