diff --git a/apps/openmw/mwworld/physicssystem.cpp b/apps/openmw/mwworld/physicssystem.cpp index 1beb5a7e5..0ae3e6fb2 100644 --- a/apps/openmw/mwworld/physicssystem.cpp +++ b/apps/openmw/mwworld/physicssystem.cpp @@ -427,8 +427,6 @@ namespace MWWorld void PhysicsSystem::removeObject (const std::string& handle) { - //TODO:check if actor??? - mEngine->removeCharacter(handle); mEngine->removeRigidBody(handle); mEngine->deleteRigidBody(handle); @@ -540,4 +538,39 @@ namespace MWWorld return true; } + + + void PhysicsSystem::queueObjectMovement(const Ptr &ptr, const Ogre::Vector3 &movement) + { + PtrVelocityList::iterator iter = mMovementQueue.begin(); + for(;iter != mMovementQueue.end();iter++) + { + if(iter->first == ptr) + { + iter->second = movement; + return; + } + } + + mMovementQueue.push_back(std::make_pair(ptr, movement)); + } + + const PtrVelocityList& PhysicsSystem::applyQueuedMovement(float dt) + { + mMovementResults.clear(); + + const MWBase::World *world = MWBase::Environment::get().getWorld(); + PtrVelocityList::iterator iter = mMovementQueue.begin(); + for(;iter != mMovementQueue.end();iter++) + { + Ogre::Vector3 newpos; + newpos = move(iter->first, iter->second, dt, + !world->isSwimming(iter->first) && !world->isFlying(iter->first)); + mMovementResults.push_back(std::make_pair(iter->first, newpos)); + } + + mMovementQueue.clear(); + + return mMovementResults; + } } diff --git a/apps/openmw/mwworld/physicssystem.hpp b/apps/openmw/mwworld/physicssystem.hpp index 2b8cb00af..438e2ada6 100644 --- a/apps/openmw/mwworld/physicssystem.hpp +++ b/apps/openmw/mwworld/physicssystem.hpp @@ -5,6 +5,8 @@ #include +#include "ptr.hpp" + namespace OEngine { @@ -21,7 +23,8 @@ namespace OEngine namespace MWWorld { class World; - class Ptr; + + typedef std::vector > PtrVelocityList; class PhysicsSystem { @@ -80,12 +83,21 @@ namespace MWWorld bool getObjectAABB(const MWWorld::Ptr &ptr, Ogre::Vector3 &min, Ogre::Vector3 &max); + /// Queues velocity movement for a Ptr. If a Ptr is already queued, its velocity will + /// be overwritten. Valid until the next call to applyQueuedMovement. + void queueObjectMovement(const Ptr &ptr, const Ogre::Vector3 &velocity); + + const PtrVelocityList& applyQueuedMovement(float dt); + private: OEngine::Render::OgreRenderer &mRender; OEngine::Physic::PhysicEngine* mEngine; std::map handleToMesh; + PtrVelocityList mMovementQueue; + PtrVelocityList mMovementResults; + PhysicsSystem (const PhysicsSystem&); PhysicsSystem& operator= (const PhysicsSystem&); };