Exemple #1
0
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);
				}
			}
		}



	}


}
Exemple #2
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());
			}

		}
	}
}
Exemple #3
0
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();
}