void CcdPhysicsEnvironment::CallbackTriggers() { CcdPhysicsController* ctrl0=0,*ctrl1=0; if (m_triggerCallbacks[PHY_OBJECT_RESPONSE] || (m_debugDrawer && (m_debugDrawer->GetDebugMode() & IDebugDraw::DBG_DrawContactPoints))) { //walk over all overlapping pairs, and if one of the involved bodies is registered for trigger callback, perform callback int numManifolds = m_collisionWorld->GetDispatcher()->GetNumManifolds(); for (int i=0;i<numManifolds;i++) { PersistentManifold* manifold = m_collisionWorld->GetDispatcher()->GetManifoldByIndexInternal(i); int numContacts = manifold->GetNumContacts(); if (numContacts) { if (m_debugDrawer && (m_debugDrawer->GetDebugMode() & IDebugDraw::DBG_DrawContactPoints)) { for (int j=0;j<numContacts;j++) { SimdVector3 color(1,0,0); const ManifoldPoint& cp = manifold->GetContactPoint(j); if (m_debugDrawer) m_debugDrawer->DrawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.GetDistance(),cp.GetLifeTime(),color); } } RigidBody* obj0 = static_cast<RigidBody* >(manifold->GetBody0()); RigidBody* obj1 = static_cast<RigidBody* >(manifold->GetBody1()); //m_userPointer is set in 'addPhysicsController CcdPhysicsController* ctrl0 = static_cast<CcdPhysicsController*>(obj0->m_userPointer); CcdPhysicsController* ctrl1 = static_cast<CcdPhysicsController*>(obj1->m_userPointer); std::vector<CcdPhysicsController*>::iterator i = std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl0); if (i == m_triggerControllers.end()) { i = std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl1); } if (!(i == m_triggerControllers.end())) { m_triggerCallbacks[PHY_OBJECT_RESPONSE](m_triggerCallbacksUserPtrs[PHY_OBJECT_RESPONSE], ctrl0,ctrl1,0); } } } } }
// // todo: this is random access, it can be walked 'cache friendly'! // void ParallelIslandDispatcher::BuildAndProcessIslands(CollisionObjectArray& collisionObjects, IslandCallback* callback) { int numBodies = collisionObjects.size(); for (int islandId=0;islandId<numBodies;islandId++) { std::vector<PersistentManifold*> islandmanifold; //int numSleeping = 0; bool allSleeping = true; int i; for (i=0;i<numBodies;i++) { CollisionObject* colObj0 = collisionObjects[i]; if (colObj0->m_islandTag1 == islandId) { if (colObj0->GetActivationState()== ACTIVE_TAG) { allSleeping = false; } if (colObj0->GetActivationState()== DISABLE_DEACTIVATION) { allSleeping = false; } } } for (i=0;i<GetNumManifolds();i++) { PersistentManifold* manifold = this->GetManifoldByIndexInternal(i); //filtering for response CollisionObject* colObj0 = static_cast<CollisionObject*>(manifold->GetBody0()); CollisionObject* colObj1 = static_cast<CollisionObject*>(manifold->GetBody1()); { if (((colObj0) && (colObj0)->m_islandTag1 == (islandId)) || ((colObj1) && (colObj1)->m_islandTag1 == (islandId))) { if (NeedsResponse(*colObj0,*colObj1)) islandmanifold.push_back(manifold); } } } if (allSleeping) { int i; for (i=0;i<numBodies;i++) { CollisionObject* colObj0 = collisionObjects[i]; if (colObj0->m_islandTag1 == islandId) { colObj0->SetActivationState( ISLAND_SLEEPING ); } } } else { int i; for (i=0;i<numBodies;i++) { CollisionObject* colObj0 = collisionObjects[i]; if (colObj0->m_islandTag1 == islandId) { if ( colObj0->GetActivationState() == ISLAND_SLEEPING) { colObj0->SetActivationState( WANTS_DEACTIVATION); } } } /// Process the actual simulation, only if not sleeping/deactivated if (islandmanifold.size()) { callback->ProcessIsland(&islandmanifold[0],islandmanifold.size()); } } } }
void clientDisplay(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_LIGHTING); if (collisionWorld) collisionWorld->PerformDiscreteCollisionDetection(); ///one way to draw all the contact points is iterating over contact manifolds / points: int i; int numManifolds = collisionWorld->GetDispatcher()->GetNumManifolds(); for (i=0;i<numManifolds;i++) { PersistentManifold* contactManifold = collisionWorld->GetDispatcher()->GetManifoldByIndexInternal(i); CollisionObject* obA = static_cast<CollisionObject*>(contactManifold->GetBody0()); CollisionObject* obB = static_cast<CollisionObject*>(contactManifold->GetBody1()); contactManifold->RefreshContactPoints(obA->m_worldTransform,obB->m_worldTransform); int numContacts = contactManifold->GetNumContacts(); for (int j=0;j<numContacts;j++) { ManifoldPoint& pt = contactManifold->GetContactPoint(j); glBegin(GL_LINES); glColor3f(1, 0, 1); SimdVector3 ptA = pt.GetPositionWorldOnA(); SimdVector3 ptB = pt.GetPositionWorldOnB(); glVertex3d(ptA.x(),ptA.y(),ptA.z()); glVertex3d(ptB.x(),ptB.y(),ptB.z()); glEnd(); } } //GL_ShapeDrawer::DrawCoordSystem(); float m[16]; for (i=0;i<numObjects;i++) { objects[i].m_worldTransform.getOpenGLMatrix( m ); GL_ShapeDrawer::DrawOpenGL(m,objects[i].m_collisionShape,SimdVector3(1,1,1),getDebugMode()); } SimdQuaternion orn; orn.setEuler(yaw,pitch,roll); objects[1].m_worldTransform.setOrigin(objects[1].m_worldTransform.getOrigin()+SimdVector3(0,-0.01,0)); //objects[0].m_worldTransform.setRotation(orn); pitch += 0.005f; yaw += 0.01f; glFlush(); glutSwapBuffers(); }