// UNEXPOSED void CPhysicsObject::ComputeDragBasis(bool isStatic) { m_dragBasis.setZero(); m_angDragBasis.setZero(); if (!isStatic && GetCollide()) { btCollisionShape *shape = m_pObject->getCollisionShape(); btVector3 min, max, delta; btTransform ident = btTransform::getIdentity(); shape->getAabb(ident, min, max); delta = max - min; delta = delta.absolute(); m_dragBasis.setX(delta.y() * delta.z()); m_dragBasis.setY(delta.x() * delta.z()); m_dragBasis.setZ(delta.x() * delta.y()); m_dragBasis *= GetInvMass(); btVector3 ang = m_pObject->getInvInertiaDiagLocal(); delta *= 0.5; m_angDragBasis.setX(AngDragIntegral(ang[0], delta.x(), delta.y(), delta.z()) + AngDragIntegral(ang[0], delta.x(), delta.z(), delta.y())); m_angDragBasis.setY(AngDragIntegral(ang[1], delta.y(), delta.x(), delta.z()) + AngDragIntegral(ang[1], delta.y(), delta.z(), delta.x())); m_angDragBasis.setZ(AngDragIntegral(ang[2], delta.z(), delta.x(), delta.y()) + AngDragIntegral(ang[2], delta.z(), delta.y(), delta.x())); } }
void CPhysicsObject::OutputDebugInfo() const { Msg( "-----------------\n" ); // FIXME: requires CBaseEntity!! // Msg( "Object: %s\n", (CBaseEntity *)GetGameData()->GetModelName() ); Msg( "Mass: %f (inv %f)\n", GetMass(), GetInvMass() ); // FIXME: complete this function via format noted on // http://facepunch.com/threads/1178143?p=35663773&viewfull=1#post35663773 }
void CPhysicsObject::OutputDebugInfo() const { Msg("-----------------\n"); if (m_pName) Msg("Object: %s\n", m_pName); Msg("Mass: %f (inv %f)\n", GetMass(), GetInvMass()); Vector pos; QAngle ang; GetPosition(&pos, &ang); Msg("Position: %f %f %f\nAngle: %f %f %f\n", pos.x, pos.y, pos.z, ang.x, ang.y, ang.z); Vector inertia = GetInertia(); Vector invinertia = GetInvInertia(); Msg("Inertia: %f %f %f (inv %f %f %f)\n", inertia.x, inertia.y, inertia.z, invinertia.x, invinertia.y, invinertia.z); Vector vel; AngularImpulse angvel; GetVelocity(&vel, &angvel); Msg("Velocity: %f, %f, %f\nAng Velocity: %f, %f, %f\n", vel.x, vel.y, vel.z, angvel.x, angvel.y, angvel.z); float dampspeed, damprot; GetDamping(&dampspeed, &damprot); Msg("Damping %f linear, %f angular\n", dampspeed, damprot); Vector dragBasis; Vector angDragBasis; ConvertPosToHL(m_dragBasis, dragBasis); ConvertDirectionToHL(m_angDragBasis, angDragBasis); Msg("Linear Drag: %f, %f, %f (factor %f)\n", dragBasis.x, dragBasis.y, dragBasis.z, m_dragCoefficient); Msg("Angular Drag: %f, %f, %f (factor %f)\n", angDragBasis.x, angDragBasis.y, angDragBasis.z, m_angDragCoefficient); // TODO: Attached to x controllers Msg("State: %s, Collision %s, Motion %s, Drag %s, Flags %04X (game %04x, index %d)\n", IsAsleep() ? "Asleep" : "Awake", IsCollisionEnabled() ? "Enabled" : "Disabled", IsStatic() ? "Static" : IsMotionEnabled() ? "Enabled" : "Disabled", IsDragEnabled() ? "Enabled" : "Disabled", m_pObject->getFlags(), GetGameFlags(), GetGameIndex() ); const char *pMaterialStr = g_SurfaceDatabase.GetPropName(m_materialIndex); surfacedata_t *surfaceData = g_SurfaceDatabase.GetSurfaceData(m_materialIndex); if (surfaceData) { Msg("Material: %s : density(%f), thickness(%f), friction(%f), elasticity(%f)\n", pMaterialStr, surfaceData->physics.density, surfaceData->physics.thickness, surfaceData->physics.friction, surfaceData->physics.elasticity); } Msg("-- COLLISION SHAPE INFO --\n"); g_PhysicsCollision.OutputDebugInfo((CPhysCollide *)m_pObject->getCollisionShape()->getUserPointer()); }
void dgBody::Freeze () { if (GetInvMass().m_w > dgFloat32 (0.0f)) { if (!m_freeze) { m_freeze = true; for (dgBodyMasterListRow::dgListNode* node = m_masterNode->GetInfo().GetFirst(); node; node = node->GetNext()) { dgBody* const body = node->GetInfo().m_bodyNode; body->Freeze (); } } } }
void dgBody::Unfreeze () { if (GetInvMass().m_w > dgFloat32 (0.0f)) { // note this is in observation (to prevent bodies from not going to sleep inside triggers // m_equilibrium = false; if (m_freeze) { m_freeze = false; for (dgBodyMasterListRow::dgListNode* node = m_masterNode->GetInfo().GetFirst(); node; node = node->GetNext()) { dgBody* const body = node->GetInfo().m_bodyNode; body->Unfreeze (); } } } }
void CompoundBody::AddImpulse(AglVector3 pImpulse) { if (!mStatic && !mTempStatic) mVelocity += pImpulse * GetInvMass(); }
void CPhysicsObject::Init( IVP_Real_Object *pObject, int materialIndex, float volume, float drag, float angDrag, const Vector *massCenterOverride ) { m_materialIndex = materialIndex; m_pObject = pObject; pObject->client_data = (void *)this; m_pGameData = NULL; m_gameFlags = 0; m_sleepState = OBJ_SLEEP; // objects start asleep m_callbacks = CALLBACK_GLOBAL_COLLISION|CALLBACK_GLOBAL_FRICTION|CALLBACK_FLUID_TOUCH|CALLBACK_GLOBAL_TOUCH|CALLBACK_GLOBAL_COLLIDE_STATIC|CALLBACK_DO_FLUID_SIMULATION; m_activeIndex = 0xFFFF; m_pShadow = NULL; m_shadowTempGravityDisable = false; m_dragBasis = vec3_origin; m_angDragBasis = vec3_origin; if ( massCenterOverride ) { m_massCenterOverride = *massCenterOverride; } if ( !IsStatic() && GetCollide() ) { // Basically we are computing drag as an OBB. Get OBB extents for projection // scale those extents by appropriate mass/inertia to compute velocity directly (not force) // in the controller // NOTE: Compute these even if drag coefficients are zero, because the drag coefficient could change later // Get an AABB for this object and use the area of each side as a basis for approximating cross-section area for drag Vector dragMins, dragMaxs; // NOTE: coordinates in/out of physcollision are in HL units, not IVP physcollision->CollideGetAABB( dragMins, dragMaxs, GetCollide(), vec3_origin, vec3_angle ); Vector delta = dragMaxs - dragMins; ConvertPositionToIVP( delta.x, delta.y, delta.z ); delta.x = fabsf(delta.x); delta.y = fabsf(delta.y); delta.z = fabsf(delta.z); // dragBasis is now the area of each side m_dragBasis.x = delta.y * delta.z; m_dragBasis.y = delta.x * delta.z; m_dragBasis.z = delta.x * delta.y; m_dragBasis *= GetInvMass(); const IVP_U_Float_Point *pInvRI = m_pObject->get_core()->get_inv_rot_inertia(); // This angular basis is the integral of each differential drag area's torque over the whole OBB // need half lengths for this integral delta *= 0.5; // rotation about the x axis m_angDragBasis.x = AngDragIntegral( pInvRI->k[0], delta.x, delta.y, delta.z ) + AngDragIntegral( pInvRI->k[0], delta.x, delta.z, delta.y ); // rotation about the y axis m_angDragBasis.y = AngDragIntegral( pInvRI->k[1], delta.y, delta.x, delta.z ) + AngDragIntegral( pInvRI->k[1], delta.y, delta.z, delta.x ); // rotation about the z axis m_angDragBasis.z = AngDragIntegral( pInvRI->k[2], delta.z, delta.x, delta.y ) + AngDragIntegral( pInvRI->k[2], delta.z, delta.y, delta.x ); } else { drag = 0; angDrag = 0; } m_dragCoefficient = drag; m_angDragCoefficient = angDrag; SetVolume( volume ); }