bool CPlayerController::IsInContact() { CPhysicsEnvironment *pEnv = m_pObject->GetVPhysicsEnvironment(); int numManifolds = pEnv->GetBulletEnvironment()->getDispatcher()->getNumManifolds(); for (int i = 0; i < numManifolds; i++) { btPersistentManifold *contactManifold = pEnv->GetBulletEnvironment()->getDispatcher()->getManifoldByIndexInternal(i); const btCollisionObject *obA = contactManifold->getBody0(); const btCollisionObject *obB = contactManifold->getBody1(); CPhysicsObject *pPhysUs = NULL; CPhysicsObject *pPhysOther = NULL; if (contactManifold->getNumContacts() > 0 && (obA == m_pObject->GetObject() || obB == m_pObject->GetObject())) { if (obA == m_pObject->GetObject()) { pPhysUs = (CPhysicsObject *)obA->getUserPointer(); pPhysOther = (CPhysicsObject *)obB->getUserPointer(); } else if (obB == m_pObject->GetObject()) { pPhysUs = (CPhysicsObject *)obB->getUserPointer(); pPhysOther = (CPhysicsObject *)obA->getUserPointer(); } if (pPhysOther->IsStatic() || !pPhysOther->IsMotionEnabled() || (pPhysOther->GetCallbackFlags() & CALLBACK_SHADOW_COLLISION)) continue; return true; } } return false; }
void SerializeWorld_f(const CCommand &args) { if (args.ArgC() != 3) { Msg("Usage: vphysics_serialize <index> <name>\n"); return; } CPhysicsEnvironment *pEnv = (CPhysicsEnvironment *)g_Physics.GetActiveEnvironmentByIndex(atoi(args.Arg(2))); if (pEnv) { btDiscreteDynamicsWorld *pWorld = (btDiscreteDynamicsWorld *)pEnv->GetBulletEnvironment(); Assert(pWorld); btSerializer *pSerializer = new btDefaultSerializer; pWorld->serialize(pSerializer); // FIXME: We shouldn't be using this. Find the appropiate method from valve interfaces. const char *pName = args.Arg(3); FILE *pFile = fopen(pName, "wb"); if (pFile) { fwrite(pSerializer->getBufferPointer(), pSerializer->getCurrentBufferSize(), 1, pFile); fclose(pFile); } else { Warning("Couldn't open \"%s\" for writing!\n", pName); } } else { Warning("Invalid environment index supplied!\n"); } }
CPhysicsFrictionSnapshot::CPhysicsFrictionSnapshot(CPhysicsObject *pObject) { m_pObject = pObject; m_iCurContactPoint = 0; m_iCurManifold = 0; CPhysicsEnvironment *pEnv = pObject->GetVPhysicsEnvironment(); btRigidBody *pBody = pObject->GetObject(); int numManifolds = pEnv->GetBulletEnvironment()->getDispatcher()->getNumManifolds(); for (int i = 0; i < numManifolds; i++) { btPersistentManifold *pManifold = pEnv->GetBulletEnvironment()->getDispatcher()->getManifoldByIndexInternal(i); const btCollisionObject *pObjA = pManifold->getBody0(); const btCollisionObject *pObjB = pManifold->getBody1(); if (pManifold->getNumContacts() <= 0) continue; if (pObjA == pBody || pObjB == pBody) { m_manifolds.AddToTail(pManifold); } } }