From 0ff7b2ff11313987019759e583d28a7f1481f109 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sat, 25 Apr 2015 15:19:17 +0200 Subject: [PATCH] MechanicsManager, frame update --- apps/openmw/engine.cpp | 24 +------ apps/openmw/engine.hpp | 7 +- apps/openmw/main.cpp | 2 + apps/openmw/mwmechanics/actor.cpp | 8 +-- apps/openmw/mwmechanics/actors.cpp | 2 + apps/openmw/mwmechanics/character.cpp | 1 - .../mwmechanics/mechanicsmanagerimp.cpp | 70 ++++++++----------- .../mwmechanics/mechanicsmanagerimp.hpp | 8 +-- apps/openmw/mwrender/objects.cpp | 4 +- apps/openmw/mwrender/renderingmanager.cpp | 5 ++ apps/openmw/mwrender/renderingmanager.hpp | 2 + apps/openmw/mwworld/physicssystem.cpp | 14 ++-- apps/openmw/mwworld/scene.cpp | 32 ++++----- apps/openmw/mwworld/scene.hpp | 2 +- apps/openmw/mwworld/worldimp.cpp | 31 ++++---- 15 files changed, 95 insertions(+), 117 deletions(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index 7dac03c34..582172bff 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -69,23 +69,10 @@ void OMW::Engine::executeLocalScripts() localScripts.setIgnore (MWWorld::Ptr()); } -bool OMW::Engine::frameStarted (const Ogre::FrameEvent& evt) -{ - if (MWBase::Environment::get().getStateManager()->getState()!= - MWBase::StateManager::State_NoGame) - { - bool paused = MWBase::Environment::get().getWindowManager()->isGuiMode(); - MWBase::Environment::get().getWorld()->frameStarted(evt.timeSinceLastFrame, paused); - MWBase::Environment::get().getWindowManager ()->frameStarted(evt.timeSinceLastFrame); - } - return true; -} - -bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt) +void OMW::Engine::frame(float frametime) { try { - float frametime = evt.timeSinceLastFrame; mEnvironment.setFrameDuration (frametime); // update input @@ -173,8 +160,6 @@ bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt) { std::cerr << "Error in framelistener: " << e.what() << std::endl; } - - return true; } OMW::Engine::Engine(Files::ConfigurationManager& configurationManager) @@ -486,12 +471,7 @@ void OMW::Engine::go() frameTimer.setStartTick(); //dt = std::min(dt, 0.2f); - // frameRenderingQueued(dt); - MWBase::Environment::get().getWorld()->update(dt, false); - - MWBase::Environment::get().getWorld()->advanceTime( - dt*MWBase::Environment::get().getWorld()->getTimeScaleFactor()/3600); - + frame(dt); mViewer->frame(/*simulationTime*/); } diff --git a/apps/openmw/engine.hpp b/apps/openmw/engine.hpp index f3b3a8fbf..b47a7bb76 100644 --- a/apps/openmw/engine.hpp +++ b/apps/openmw/engine.hpp @@ -1,8 +1,6 @@ #ifndef ENGINE_H #define ENGINE_H -#include - #include #include #include @@ -58,7 +56,7 @@ namespace Files namespace OMW { /// \brief Main engine class, that brings together all the components of OpenMW - class Engine : private Ogre::FrameListener + class Engine { std::auto_ptr mVFS; std::auto_ptr mResourceSystem; @@ -104,8 +102,7 @@ namespace OMW void executeLocalScripts(); - virtual bool frameRenderingQueued (const Ogre::FrameEvent& evt); - virtual bool frameStarted (const Ogre::FrameEvent& evt); + void frame (float dt); /// Load settings from various files, returns the path to the user settings file std::string loadSettings (Settings::Manager & settings); diff --git a/apps/openmw/main.cpp b/apps/openmw/main.cpp index 070136dfd..792a2674e 100644 --- a/apps/openmw/main.cpp +++ b/apps/openmw/main.cpp @@ -12,6 +12,8 @@ #include #include +#include + #if defined(_WIN32) // For OutputDebugString #define WIN32_LEAN_AND_MEAN diff --git a/apps/openmw/mwmechanics/actor.cpp b/apps/openmw/mwmechanics/actor.cpp index 3161bb413..675bd160a 100644 --- a/apps/openmw/mwmechanics/actor.cpp +++ b/apps/openmw/mwmechanics/actor.cpp @@ -1,23 +1,23 @@ #include "actor.hpp" -//#include "character.hpp" +#include "character.hpp" namespace MWMechanics { Actor::Actor(const MWWorld::Ptr &ptr, MWRender::Animation *animation) { - //mCharacterController.reset(new CharacterController(ptr, animation)); + mCharacterController.reset(new CharacterController(ptr, animation)); } void Actor::updatePtr(const MWWorld::Ptr &newPtr) { - //mCharacterController->updatePtr(newPtr); + mCharacterController->updatePtr(newPtr); } CharacterController* Actor::getCharacterController() { - return 0;//mCharacterController.get(); + return mCharacterController.get(); } AiState& Actor::getAiState() diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index bab022d94..bb59d46c0 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -1014,6 +1014,8 @@ namespace MWMechanics removeActor(ptr); MWRender::Animation *anim = MWBase::Environment::get().getWorld()->getAnimation(ptr); + if (!anim) + return; mActors.insert(std::make_pair(ptr, new Actor(ptr, anim))); if (updateImmediately) mActors[ptr]->getCharacterController()->update(0); diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index c989e3f45..98a420ba6 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -20,7 +20,6 @@ #include "character.hpp" #include -#include #include "movement.hpp" #include "npcstats.hpp" diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index 0e3220cf8..7e6e29670 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -294,27 +294,22 @@ namespace MWMechanics void MechanicsManager::add(const MWWorld::Ptr& ptr) { - /* if(ptr.getClass().isActor()) mActors.addActor(ptr); else mObjects.addObject(ptr); - */ } void MechanicsManager::remove(const MWWorld::Ptr& ptr) { - /* if(ptr == mWatched) mWatched = MWWorld::Ptr(); mActors.removeActor(ptr); mObjects.removeObject(ptr); - */ } void MechanicsManager::updateCell(const MWWorld::Ptr &old, const MWWorld::Ptr &ptr) { - /* if(old == mWatched) mWatched = ptr; @@ -322,16 +317,13 @@ namespace MWMechanics mActors.updateActor(old, ptr); else mObjects.updateObject(old, ptr); - */ } void MechanicsManager::drop(const MWWorld::CellStore *cellStore) { - /* mActors.dropActors(cellStore, mWatched); mObjects.dropObjects(cellStore); - */ } @@ -472,24 +464,24 @@ namespace MWMechanics // HACK? The player has been changed, so a new Animation object may // have been made for them. Make sure they're properly updated. - //MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->getPlayerPtr(); - //mActors.removeActor(ptr); - //mActors.addActor(ptr, true); + MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->getPlayerPtr(); + mActors.removeActor(ptr); + mActors.addActor(ptr, true); } - //mActors.update(duration, paused); - //mObjects.update(duration, paused); + mActors.update(duration, paused); + mObjects.update(duration, paused); } void MechanicsManager::rest(bool sleep) { - //mActors.restoreDynamicStats (sleep); - //mActors.fastForwardAi(); + mActors.restoreDynamicStats (sleep); + mActors.fastForwardAi(); } int MechanicsManager::getHoursToRest() const { - return 0;//mActors.getHoursToRest(mWatched); + return mActors.getHoursToRest(mWatched); } void MechanicsManager::setPlayerName (const std::string& name) @@ -679,7 +671,7 @@ namespace MWMechanics int MechanicsManager::countDeaths (const std::string& id) const { - return 0;//mActors.countDeaths (id); + return mActors.countDeaths (id); } void MechanicsManager::getPersuasionDispositionChange (const MWWorld::Ptr& npc, PersuasionType type, @@ -835,39 +827,35 @@ namespace MWMechanics void MechanicsManager::forceStateUpdate(const MWWorld::Ptr &ptr) { - //if(ptr.getClass().isActor()) - //mActors.forceStateUpdate(ptr); + if(ptr.getClass().isActor()) + mActors.forceStateUpdate(ptr); } void MechanicsManager::playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number) { - /* if(ptr.getClass().isActor()) mActors.playAnimationGroup(ptr, groupName, mode, number); else mObjects.playAnimationGroup(ptr, groupName, mode, number); - */ } void MechanicsManager::skipAnimation(const MWWorld::Ptr& ptr) { - /* if(ptr.getClass().isActor()) mActors.skipAnimation(ptr); else mObjects.skipAnimation(ptr); - */ } bool MechanicsManager::checkAnimationPlaying(const MWWorld::Ptr& ptr, const std::string &groupName) { - //if(ptr.getClass().isActor()) - // return mActors.checkAnimationPlaying(ptr, groupName); - //else + if(ptr.getClass().isActor()) + return mActors.checkAnimationPlaying(ptr, groupName); + else return false; } void MechanicsManager::updateMagicEffects(const MWWorld::Ptr &ptr) { - //mActors.updateMagicEffects(ptr); + mActors.updateMagicEffects(ptr); } bool MechanicsManager::toggleAI() @@ -1062,7 +1050,7 @@ namespace MWMechanics const MWWorld::ESMStore& esmStore = MWBase::Environment::get().getWorld()->getStore(); float radius = esmStore.get().find("fAlarmRadius")->getFloat(); - //mActors.getObjectsInRange(from, radius, neighbors); + mActors.getObjectsInRange(from, radius, neighbors); // victim should be considered even beyond alarm radius if (!victim.isEmpty() && from.squaredDistance(Ogre::Vector3(victim.getRefData().getPosition().pos)) > radius*radius) @@ -1151,7 +1139,7 @@ namespace MWMechanics Ogre::Vector3 from = Ogre::Vector3(player.getRefData().getPosition().pos); float radius = esmStore.get().find("fAlarmRadius")->getFloat(); - //mActors.getObjectsInRange(from, radius, neighbors); + mActors.getObjectsInRange(from, radius, neighbors); // victim should be considered even beyond alarm radius if (!victim.isEmpty() && from.squaredDistance(Ogre::Vector3(victim.getRefData().getPosition().pos)) > radius*radius) @@ -1406,7 +1394,6 @@ namespace MWMechanics // if guard starts combat with player, guards pursuing player should do the same if (ptr.getClass().isClass(ptr, "Guard")) { - /* for (Actors::PtrActorMap::const_iterator iter = mActors.begin(); iter != mActors.end(); ++iter) { if (iter->first.getClass().isClass(iter->first, "Guard")) @@ -1419,7 +1406,6 @@ namespace MWMechanics } } } - */ } } @@ -1430,27 +1416,27 @@ namespace MWMechanics void MechanicsManager::getObjectsInRange(const Ogre::Vector3 &position, float radius, std::vector &objects) { - //mActors.getObjectsInRange(position, radius, objects); - //mObjects.getObjectsInRange(position, radius, objects); + mActors.getObjectsInRange(position, radius, objects); + mObjects.getObjectsInRange(position, radius, objects); } void MechanicsManager::getActorsInRange(const Ogre::Vector3 &position, float radius, std::vector &objects) { - //mActors.getObjectsInRange(position, radius, objects); + mActors.getObjectsInRange(position, radius, objects); } std::list MechanicsManager::getActorsFollowing(const MWWorld::Ptr& actor) { - return std::list();//mActors.getActorsFollowing(actor); + return mActors.getActorsFollowing(actor); } std::list MechanicsManager::getActorsFollowingIndices(const MWWorld::Ptr& actor) { - return std::list(); //mActors.getActorsFollowingIndices(actor); + return mActors.getActorsFollowingIndices(actor); } std::list MechanicsManager::getActorsFighting(const MWWorld::Ptr& actor) { - return std::list();// mActors.getActorsFighting(actor); + return mActors.getActorsFighting(actor); } int MechanicsManager::countSavedGameRecords() const @@ -1461,7 +1447,7 @@ namespace MWMechanics void MechanicsManager::write(ESM::ESMWriter &writer, Loading::Listener &listener) const { - //mActors.write(writer, listener); + mActors.write(writer, listener); ESM::StolenItems items; items.mStolenItems = mStolenItems; @@ -1478,13 +1464,13 @@ namespace MWMechanics items.load(reader); mStolenItems = items.mStolenItems; } - //else - //mActors.readRecord(reader, type); + else + mActors.readRecord(reader, type); } void MechanicsManager::clear() { - //mActors.clear(); + mActors.clear(); mStolenItems.clear(); } @@ -1530,6 +1516,6 @@ namespace MWMechanics bool MechanicsManager::isReadyToBlock(const MWWorld::Ptr &ptr) const { - return 0;//mActors.isReadyToBlock(ptr); + return mActors.isReadyToBlock(ptr); } } diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp index 30cc207f7..d08334ae8 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp @@ -7,8 +7,8 @@ #include "creaturestats.hpp" #include "npcstats.hpp" -//#include "objects.hpp" -//#include "actors.hpp" +#include "objects.hpp" +#include "actors.hpp" namespace Ogre { @@ -32,8 +32,8 @@ namespace MWMechanics bool mRaceSelected; bool mAI;///< is AI active? - //Objects mObjects; - //Actors mActors; + Objects mObjects; + Actors mActors; typedef std::pair Owner; // < Owner id, bool isFaction > typedef std::map OwnerMap; // < Owner, number of stolen items with this id from this owner > diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index be21b2bec..f77865634 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -197,9 +197,7 @@ void Objects::removeCell(const MWWorld::CellStore* store) void Objects::update(float dt) { - PtrAnimationMap::const_iterator it = mObjects.begin(); - for(;it != mObjects.end();++it) - it->second->runAnimation(dt); + } void Objects::updateObjectCell(const MWWorld::Ptr &old, const MWWorld::Ptr &cur) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 32afc73c2..d68620f8a 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -248,4 +248,9 @@ namespace MWRender notifyWorldSpaceChanged(); } + MWRender::Animation* RenderingManager::getAnimation(const MWWorld::Ptr &ptr) + { + return mObjects->getAnimation(ptr); + } + } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index c47317608..005100701 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -78,6 +78,8 @@ namespace MWRender void update(float dt, bool paused); + MWRender::Animation* getAnimation(const MWWorld::Ptr& ptr); + private: osgViewer::Viewer& mViewer; osg::ref_ptr mRootNode; diff --git a/apps/openmw/mwworld/physicssystem.cpp b/apps/openmw/mwworld/physicssystem.cpp index 623a79576..a1b37a275 100644 --- a/apps/openmw/mwworld/physicssystem.cpp +++ b/apps/openmw/mwworld/physicssystem.cpp @@ -503,15 +503,15 @@ namespace MWWorld { // Create physics. shapeLoader is deleted by the physic engine //NifBullet::ManualBulletShapeLoader* shapeLoader = new NifBullet::ManualBulletShapeLoader(); - mEngine = new OEngine::Physic::PhysicEngine(0);//shapeLoader); + //mEngine = new OEngine::Physic::PhysicEngine(0);//shapeLoader); } PhysicsSystem::~PhysicsSystem() { - if (mWaterCollisionObject.get()) - mEngine->mDynamicsWorld->removeCollisionObject(mWaterCollisionObject.get()); - delete mEngine; - delete OEngine::Physic::BulletShapeManager::getSingletonPtr(); + //if (mWaterCollisionObject.get()) + // mEngine->mDynamicsWorld->removeCollisionObject(mWaterCollisionObject.get()); + //delete mEngine; + //delete OEngine::Physic::BulletShapeManager::getSingletonPtr(); } OEngine::Physic::PhysicEngine* PhysicsSystem::getEngine() @@ -674,19 +674,23 @@ namespace MWWorld void PhysicsSystem::addObject (const Ptr& ptr, const std::string& mesh, bool placeable) { + /* Ogre::SceneNode* node = ptr.getRefData().getBaseNodeOld(); handleToMesh[node->getName()] = mesh; mEngine->createAndAdjustRigidBody( mesh, node->getName(), ptr.getCellRef().getScale(), node->getPosition(), node->getOrientation(), 0, 0, false, placeable); mEngine->createAndAdjustRigidBody( mesh, node->getName(), ptr.getCellRef().getScale(), node->getPosition(), node->getOrientation(), 0, 0, true, placeable); + */ } void PhysicsSystem::addActor (const Ptr& ptr, const std::string& mesh) { + /* Ogre::SceneNode* node = ptr.getRefData().getBaseNodeOld(); //TODO:optimize this. Searching the std::map isn't very efficient i think. mEngine->addCharacter(node->getName(), mesh, node->getPosition(), node->getScale().x, node->getOrientation()); + */ } void PhysicsSystem::removeObject (const std::string& handle) diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 191a8ffef..e61e5d84e 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -31,7 +31,7 @@ namespace { - void addObject(const MWWorld::Ptr& ptr, //MWWorld::PhysicsSystem& physics, + void addObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWRender::RenderingManager& rendering) { std::string model = Misc::ResourceHelpers::correctActorModelPath(ptr.getClass().getModel(ptr), rendering.getResourceSystem()->getVFS()); @@ -39,10 +39,10 @@ namespace if (id == "prisonmarker" || id == "divinemarker" || id == "templemarker" || id == "northmarker") model = ""; // marker objects that have a hardcoded function in the game logic, should be hidden from the player ptr.getClass().insertObjectRendering(ptr, model, rendering); - //ptr.getClass().insertObject (ptr, model, physics); + ptr.getClass().insertObject (ptr, model, physics); } - void updateObjectLocalRotation (const MWWorld::Ptr& ptr, /*MWWorld::PhysicsSystem& physics,*/ + void updateObjectLocalRotation (const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWRender::RenderingManager& rendering) { if (ptr.getRefData().getBaseNode() != NULL) @@ -65,7 +65,7 @@ namespace } } - void updateObjectScale(const MWWorld::Ptr& ptr, /*MWWorld::PhysicsSystem& physics,*/ + void updateObjectScale(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWRender::RenderingManager& rendering) { if (ptr.getRefData().getBaseNode() != NULL) @@ -82,20 +82,20 @@ namespace MWWorld::CellStore& mCell; bool mRescale; Loading::Listener& mLoadingListener; - //MWWorld::PhysicsSystem& mPhysics; + MWWorld::PhysicsSystem& mPhysics; MWRender::RenderingManager& mRendering; InsertFunctor (MWWorld::CellStore& cell, bool rescale, Loading::Listener& loadingListener, - /*MWWorld::PhysicsSystem& physics, */MWRender::RenderingManager& rendering); + MWWorld::PhysicsSystem& physics, MWRender::RenderingManager& rendering); bool operator() (const MWWorld::Ptr& ptr); }; InsertFunctor::InsertFunctor (MWWorld::CellStore& cell, bool rescale, - Loading::Listener& loadingListener, /*MWWorld::PhysicsSystem& physics,*/ + Loading::Listener& loadingListener, MWWorld::PhysicsSystem& physics, MWRender::RenderingManager& rendering) : mCell (cell), mRescale (rescale), mLoadingListener (loadingListener), - //mPhysics (physics), + mPhysics (physics), mRendering (rendering) {} @@ -113,9 +113,9 @@ namespace { try { - addObject(ptr, /*mPhysics, */mRendering); - updateObjectLocalRotation(ptr, /*mPhysics,*/ mRendering); - updateObjectScale(ptr, /*mPhysics,*/ mRendering); + addObject(ptr, mPhysics, mRendering); + updateObjectLocalRotation(ptr, mPhysics, mRendering); + updateObjectScale(ptr, mPhysics, mRendering); ptr.getClass().adjustPosition (ptr, false); } catch (const std::exception& e) @@ -137,12 +137,12 @@ namespace MWWorld void Scene::updateObjectLocalRotation (const Ptr& ptr) { - ::updateObjectLocalRotation(ptr, /* *mPhysics,*/ mRendering); + ::updateObjectLocalRotation(ptr, *mPhysics, mRendering); } void Scene::updateObjectScale(const Ptr &ptr) { - ::updateObjectScale(ptr, /* *mPhysics,*/ mRendering); + ::updateObjectScale(ptr, *mPhysics, mRendering); } void Scene::getGridCenter(int &cellX, int &cellY) @@ -447,7 +447,7 @@ namespace MWWorld //We need the ogre renderer and a scene node. Scene::Scene (MWRender::RenderingManager& rendering, PhysicsSystem *physics) - : mCurrentCell (0), mCellChanged (false), /*mPhysics(physics),*/ mRendering(rendering), mNeedMapUpdate(false) + : mCurrentCell (0), mCellChanged (false), mPhysics(physics), mRendering(rendering), mNeedMapUpdate(false) { } @@ -557,7 +557,7 @@ namespace MWWorld void Scene::insertCell (CellStore &cell, bool rescale, Loading::Listener* loadingListener) { - InsertFunctor functor (cell, rescale, *loadingListener, /* *mPhysics, */mRendering); + InsertFunctor functor (cell, rescale, *loadingListener, *mPhysics, mRendering); cell.forEach (functor); } @@ -565,7 +565,7 @@ namespace MWWorld { try { - addObject(ptr, /* *mPhysics, */mRendering); + addObject(ptr, *mPhysics, mRendering); MWBase::Environment::get().getWorld()->rotateObject(ptr, 0, 0, 0, true); MWBase::Environment::get().getWorld()->scaleObject(ptr, ptr.getCellRef().getScale()); } diff --git a/apps/openmw/mwworld/scene.hpp b/apps/openmw/mwworld/scene.hpp index ea1a56d63..26590c796 100644 --- a/apps/openmw/mwworld/scene.hpp +++ b/apps/openmw/mwworld/scene.hpp @@ -63,7 +63,7 @@ namespace MWWorld CellStore* mCurrentCell; // the cell the player is in CellStoreCollection mActiveCells; bool mCellChanged; - //PhysicsSystem *mPhysics; + PhysicsSystem *mPhysics; MWRender::RenderingManager& mRendering; bool mNeedMapUpdate; diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 4b1946d1c..77028aaff 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -54,6 +54,7 @@ #include "actionteleport.hpp" //#include "projectilemanager.hpp" #include "weather.hpp" +#include "physicssystem.hpp" #include "contentloader.hpp" #include "esmloader.hpp" @@ -160,7 +161,7 @@ namespace MWWorld mStartCell (startCell), mStartupScript(startupScript), mScriptsEnabled(true) { - //mPhysics = new PhysicsSystem(renderer); + mPhysics = new PhysicsSystem(); //mPhysEngine = mPhysics->getEngine(); #if 0 mProjectileManager.reset(new ProjectileManager(renderer.getScene(), *mPhysEngine)); @@ -199,7 +200,7 @@ namespace MWWorld mGlobalVariables.fill (mStore); - mWorldScene = new Scene(*mRendering, NULL/*mPhysics*/); + mWorldScene = new Scene(*mRendering, mPhysics); } void World::startNewGame (bool bypass) @@ -480,7 +481,7 @@ namespace MWWorld delete mWeatherManager; delete mWorldScene; delete mRendering; - //delete mPhysics; + delete mPhysics; delete mPlayer; } @@ -2000,7 +2001,7 @@ namespace MWWorld && isLevitationEnabled()) return true; - const OEngine::Physic::PhysicActor *actor = mPhysEngine->getCharacter(ptr.getRefData().getHandle()); + const OEngine::Physic::PhysicActor *actor = 0;//mPhysEngine->getCharacter(ptr.getRefData().getHandle()); if(!actor || !actor->getCollisionMode()) return true; @@ -2040,7 +2041,7 @@ namespace MWWorld const float *fpos = object.getRefData().getPosition().pos; Ogre::Vector3 pos(fpos[0], fpos[1], fpos[2]); - const OEngine::Physic::PhysicActor *actor = mPhysEngine->getCharacter(object.getRefData().getHandle()); + const OEngine::Physic::PhysicActor *actor = 0;//mPhysEngine->getCharacter(object.getRefData().getHandle()); if (actor) { pos.z += heightRatio*2*actor->getHalfExtents().z; @@ -2069,8 +2070,8 @@ namespace MWWorld // TODO: There might be better places to update PhysicActor::mOnGround. bool World::isOnGround(const MWWorld::Ptr &ptr) const { - RefData &refdata = ptr.getRefData(); - OEngine::Physic::PhysicActor *physactor = mPhysEngine->getCharacter(refdata.getHandle()); + //RefData &refdata = ptr.getRefData(); + OEngine::Physic::PhysicActor *physactor = 0;//mPhysEngine->getCharacter(refdata.getHandle()); if(!physactor) return false; @@ -2142,15 +2143,17 @@ namespace MWWorld CellStore *currentCell = mWorldScene->getCurrentCell(); Ptr player = mPlayer->getPlayer(); - RefData &refdata = player.getRefData(); - Ogre::Vector3 playerPos(refdata.getPosition().pos); + //RefData &refdata = player.getRefData(); + //Ogre::Vector3 playerPos(refdata.getPosition().pos); + /* const OEngine::Physic::PhysicActor *physactor = mPhysEngine->getCharacter(refdata.getHandle()); if (!physactor) throw std::runtime_error("can't find player"); if((!physactor->getOnGround()&&physactor->getCollisionMode()) || isUnderwater(currentCell, playerPos) || isWalkingOnWater(player)) return 2; + */ if((currentCell->getCell()->mData.mFlags&ESM::Cell::NoSleep) || player.getClass().getNpcStats(player).isWerewolf()) return 1; @@ -2160,7 +2163,7 @@ namespace MWWorld MWRender::Animation* World::getAnimation(const MWWorld::Ptr &ptr) { - return 0;//return mRendering->getAnimation(ptr); + return mRendering->getAnimation(ptr); } void World::frameStarted (float dt, bool paused) @@ -2295,7 +2298,7 @@ namespace MWWorld float World::getWindSpeed() { if (isCellExterior() || isCellQuasiExterior()) - return 0;//mWeatherManager->getWindSpeed(); + return mWeatherManager->getWindSpeed(); else return 0.f; } @@ -2303,7 +2306,7 @@ namespace MWWorld bool World::isInStorm() const { if (isCellExterior() || isCellQuasiExterior()) - return 0;//mWeatherManager->isInStorm(); + return mWeatherManager->isInStorm(); else return false; } @@ -2311,7 +2314,7 @@ namespace MWWorld Ogre::Vector3 World::getStormDirection() const { if (isCellExterior() || isCellQuasiExterior()) - return Ogre::Vector3();//mWeatherManager->getStormDirection(); + return mWeatherManager->getStormDirection(); else return Ogre::Vector3(0,1,0); } @@ -2800,7 +2803,7 @@ namespace MWWorld { MWWorld::CellStore* cell = mPlayer->getPlayer().getCell(); if (cell->isExterior()) - return 0;//mWeatherManager->isDark(); + return mWeatherManager->isDark(); else { uint32_t ambient = cell->getCell()->mAmbi.mAmbient;