fixed issue of idle objects not moved by force application

This commit is contained in:
Otto Naderer 2014-05-04 21:39:53 +02:00
parent ed2822a8f2
commit eb5f199b60
2 changed files with 28 additions and 1 deletions

View File

@ -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;
};

View File

@ -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<scene::ISceneNode*, btRigidBody*>::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<scene::ISceneNode*, btRigidBody*>::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)