PolyPhysicsScene.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * PolyPhysicsScene.cpp
  3. * Modules
  4. *
  5. * Created by Ivan Safrin on 12/22/10.
  6. * Copyright 2010 Local Projects. All rights reserved.
  7. *
  8. */
  9. #include "PolyPhysicsScene.h"
  10. PhysicsScene::PhysicsScene() : CollisionScene() {
  11. initPhysicsScene();
  12. }
  13. PhysicsScene::~PhysicsScene() {
  14. }
  15. void PhysicsScene::initPhysicsScene() {
  16. btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
  17. // btDbvtBroadphase* broadphase = new btDbvtBroadphase();
  18. btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
  19. btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver();
  20. btVector3 worldMin(-1000,-1000,-1000);
  21. btVector3 worldMax(1000,1000,1000);
  22. btAxisSweep3* sweepBP = new btAxisSweep3(worldMin,worldMax);
  23. physicsWorld = new btDiscreteDynamicsWorld(dispatcher,sweepBP,solver,collisionConfiguration);
  24. physicsWorld->getSolverInfo().m_solverMode |= SOLVER_RANDMIZE_ORDER;
  25. physicsWorld->setGravity(btVector3(0,-10,0));
  26. sweepBP->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
  27. world = physicsWorld;
  28. }
  29. void PhysicsScene::Update() {
  30. for(int i=0; i < physicsChildren.size(); i++) {
  31. // if(physicsChildren[i]->enabled)
  32. physicsChildren[i]->Update();
  33. }
  34. float elapsed = CoreServices::getInstance()->getCore()->getElapsed();
  35. physicsWorld->stepSimulation(elapsed);
  36. CollisionScene::Update();
  37. }
  38. PhysicsCharacter *PhysicsScene::addCharacterChild(SceneEntity *newEntity,float mass, float friction, float stepSize) {
  39. addEntity(newEntity);
  40. PhysicsCharacter *newPhysicsEntity = new PhysicsCharacter(newEntity, mass, friction, stepSize);
  41. physicsWorld->addCollisionObject(newPhysicsEntity->ghostObject,btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);
  42. physicsWorld->addAction(newPhysicsEntity->character);
  43. physicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(newPhysicsEntity->ghostObject->getBroadphaseHandle(),physicsWorld->getDispatcher());
  44. newPhysicsEntity->character->reset ();
  45. newPhysicsEntity->character->setUseGhostSweepTest(false);
  46. physicsChildren.push_back(newPhysicsEntity);
  47. return newPhysicsEntity;
  48. }
  49. PhysicsSceneEntity *PhysicsScene::addPhysicsChild(SceneEntity *newEntity, int type, float mass, float friction, float restitution) {
  50. addEntity(newEntity);
  51. PhysicsSceneEntity *newPhysicsEntity = new PhysicsSceneEntity(newEntity, type, mass, friction,restitution);
  52. physicsWorld->addRigidBody(newPhysicsEntity->rigidBody);
  53. newPhysicsEntity->rigidBody->setActivationState(ISLAND_SLEEPING);
  54. physicsChildren.push_back(newPhysicsEntity);
  55. return newPhysicsEntity;
  56. }