diff --git a/include/irrDynamics.h b/include/irrDynamics.h index b10bef0..a10069c 100644 --- a/include/irrDynamics.h +++ b/include/irrDynamics.h @@ -89,8 +89,14 @@ class irrDynamics * \param node The scene node the force should be applied to. * \param force The force to apply, the vector represents its direction, the vector length its power.*/ static void applyCentralForce(irr::scene::ISceneNode* node, const irr::core::vector3df& force); + static void applyCentralImpulse(irr::scene::ISceneNode* node, const irr::core::vector3df& force); static void setDamping(irr::scene::ISceneNode* node, irr::f32 linearDamping, irr::f32 angularDamping); static void setPosition(irr::scene::ISceneNode* node, const irr::core::vector3df& newPos); + //! Change default gravity + /** Per default, irrDynamics is set to an earth-like gravitational force. Modify that for other planets + * or your space sim game. + * \param newGravity New gravitational force in m/s^2.*/ + static void setGravity(irr::f32 newGravity); // static IRigidBody* createRigidBodyByBB(scene::ISceneNode* node, f32 mass); static void debugDraw(); @@ -112,7 +118,6 @@ class irrDynamics class btSequentialImpulseConstraintSolver *solver; class btDiscreteDynamicsWorld* world; -// irrBulletWorld* bWorld; irr::u32 lastStep; }; diff --git a/src/irrDynamics.cpp b/src/irrDynamics.cpp index 91ef997..f89204b 100644 --- a/src/irrDynamics.cpp +++ b/src/irrDynamics.cpp @@ -118,6 +118,11 @@ void irrDynamics::debugDraw() // getInstance()->bWorld->debugDrawWorld(true); } +void irrDynamics::setGravity(f32 newGravity) +{ + getInstance()->world->setGravity(btVector3(0.f, newGravity, 0.f)); +} + void irrDynamics::updateObjects() { for (std::map::iterator iter = objects.begin(); iter != objects.end(); iter++) @@ -354,6 +359,23 @@ void irrDynamics::applyCentralForce(scene::ISceneNode* node, const core::vector3 } iter->second->applyCentralForce(btVector3(force.X, force.Y, force.Z)); + iter->second->activate(); +} + +void irrDynamics::applyCentralImpulse(scene::ISceneNode* node, const core::vector3df& force) +{ + irrDynamics* inst = getInstance(); + //find the corresponding rigid body: + std::map::iterator iter; + iter = inst->objects.find(node); + if (iter == inst->objects.end()) + { + printf("irrdynamics: Unable to find node in list. Impulse application aborted.\n"); + return; + } + + iter->second->applyCentralImpulse(btVector3(force.X, force.Y, force.Z)); + iter->second->activate(); } btRigidBody* irrDynamics::addFloor(const core::vector3df& normal, const core::vector3df& offset)