From 7319f7a8c6b4b8f8b59de46d90dfdc26372a3bb2 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sat, 19 Nov 2011 01:01:19 -0500 Subject: [PATCH] Many bugs fixed related to changing cells --- apps/openmw/mwclass/activator.cpp | 2 +- apps/openmw/mwclass/apparatus.cpp | 2 +- apps/openmw/mwclass/armor.cpp | 2 +- apps/openmw/mwclass/book.cpp | 2 +- apps/openmw/mwclass/clothing.cpp | 2 +- apps/openmw/mwclass/container.cpp | 2 +- apps/openmw/mwclass/creature.cpp | 2 +- apps/openmw/mwclass/door.cpp | 2 +- apps/openmw/mwclass/ingredient.cpp | 2 +- apps/openmw/mwclass/light.cpp | 2 +- apps/openmw/mwclass/lockpick.cpp | 2 +- apps/openmw/mwclass/misc.cpp | 2 +- apps/openmw/mwclass/npc.cpp | 2 +- apps/openmw/mwclass/potion.cpp | 2 +- apps/openmw/mwclass/probe.cpp | 2 +- apps/openmw/mwclass/repair.cpp | 2 +- apps/openmw/mwclass/static.cpp | 2 +- apps/openmw/mwclass/weapon.cpp | 2 +- apps/openmw/mwrender/objects.cpp | 14 +++--- apps/openmw/mwrender/objects.hpp | 2 +- apps/openmw/mwrender/renderingmanager.cpp | 2 +- apps/openmw/mwrender/renderingmanager.hpp | 7 +-- apps/openmw/mwworld/cellfunctors.hpp | 6 +-- apps/openmw/mwworld/scene.cpp | 52 +++++++++++++---------- components/esm_store/cell_store.hpp | 2 +- 25 files changed, 64 insertions(+), 57 deletions(-) diff --git a/apps/openmw/mwclass/activator.cpp b/apps/openmw/mwclass/activator.cpp index fcec0cccc..6749a2bfd 100644 --- a/apps/openmw/mwclass/activator.cpp +++ b/apps/openmw/mwclass/activator.cpp @@ -21,7 +21,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/apparatus.cpp b/apps/openmw/mwclass/apparatus.cpp index 48ac64137..30b308e70 100644 --- a/apps/openmw/mwclass/apparatus.cpp +++ b/apps/openmw/mwclass/apparatus.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/armor.cpp b/apps/openmw/mwclass/armor.cpp index 477f9659d..a8a431acf 100644 --- a/apps/openmw/mwclass/armor.cpp +++ b/apps/openmw/mwclass/armor.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/book.cpp b/apps/openmw/mwclass/book.cpp index 8e9e2f75c..011fd2c32 100644 --- a/apps/openmw/mwclass/book.cpp +++ b/apps/openmw/mwclass/book.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/clothing.cpp b/apps/openmw/mwclass/clothing.cpp index 293e4a200..0214c72ad 100644 --- a/apps/openmw/mwclass/clothing.cpp +++ b/apps/openmw/mwclass/clothing.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index 359cb10bf..4157ce17a 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -19,7 +19,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index 416378674..852701cce 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -33,7 +33,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Creatures creatures = renderingInterface.getCreatures(); + MWRender::Creatures& creatures = renderingInterface.getCreatures(); //creatures.insertBegin(ptr, ptr.getRefData().isEnabled(), false); //creatures.insertMesh(ptr, "meshes\\" + model); }*/ diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index 04dd7149d..26436a012 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -28,7 +28,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/ingredient.cpp b/apps/openmw/mwclass/ingredient.cpp index 008c50aa4..5e55010eb 100644 --- a/apps/openmw/mwclass/ingredient.cpp +++ b/apps/openmw/mwclass/ingredient.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/light.cpp b/apps/openmw/mwclass/light.cpp index 25fd2dfc3..3890899b0 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -26,7 +26,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); const int color = ref->base->data.color; diff --git a/apps/openmw/mwclass/lockpick.cpp b/apps/openmw/mwclass/lockpick.cpp index 567ba5eed..636a8f0be 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -22,7 +22,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/misc.cpp b/apps/openmw/mwclass/misc.cpp index 163d66959..a2642d8d5 100644 --- a/apps/openmw/mwclass/misc.cpp +++ b/apps/openmw/mwclass/misc.cpp @@ -22,7 +22,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index bc7fc93f8..cce23407f 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -41,7 +41,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Npcs npcs = renderingInterface.getNPCs(); + MWRender::Npcs& npcs = renderingInterface.getNPCs(); //npcs.insertBegin(ptr, ptr.getRefData().isEnabled(), false); //npcs.insertMesh(ptr, "meshes\\" + model); }*/ diff --git a/apps/openmw/mwclass/potion.cpp b/apps/openmw/mwclass/potion.cpp index 50b454fc2..86d1e2a98 100644 --- a/apps/openmw/mwclass/potion.cpp +++ b/apps/openmw/mwclass/potion.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/probe.cpp b/apps/openmw/mwclass/probe.cpp index b626e823d..a09a39e66 100644 --- a/apps/openmw/mwclass/probe.cpp +++ b/apps/openmw/mwclass/probe.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/repair.cpp b/apps/openmw/mwclass/repair.cpp index b8220516b..f8755b2eb 100644 --- a/apps/openmw/mwclass/repair.cpp +++ b/apps/openmw/mwclass/repair.cpp @@ -22,7 +22,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/static.cpp b/apps/openmw/mwclass/static.cpp index 573a64519..946da311d 100644 --- a/apps/openmw/mwclass/static.cpp +++ b/apps/openmw/mwclass/static.cpp @@ -18,7 +18,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/weapon.cpp b/apps/openmw/mwclass/weapon.cpp index bd31a8896..1fbd21f7c 100644 --- a/apps/openmw/mwclass/weapon.cpp +++ b/apps/openmw/mwclass/weapon.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 2e5a07b60..e49e448ae 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -40,8 +40,6 @@ void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ cellnode = mCellSceneNodes[ptr.getCell()]; } - - Ogre::SceneNode* insert = cellnode->createChildSceneNode(); const float *f = ptr.getRefData().getPosition().pos; insert->setPosition(f[0], f[1], f[2]); @@ -100,6 +98,7 @@ void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ mRend.getScene()->destroyEntity(ent); } + } void Objects::insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius){ @@ -146,19 +145,19 @@ void Objects::deleteObject (const std::string& handle) } } -void Objects::removeCell(const MWWorld::Ptr& ptr){ - if(mCellSceneNodes.find(ptr.getCell()) != mCellSceneNodes.end()) +void Objects::removeCell(MWWorld::Ptr::CellStore* store){ + if(mCellSceneNodes.find(store) != mCellSceneNodes.end()) { - Ogre::SceneNode* base = mCellSceneNodes[ptr.getCell()]; + Ogre::SceneNode* base = mCellSceneNodes[store]; base->removeAndDestroyAllChildren(); mRend.getScene()->destroySceneNode(base); base = 0; } - if(mSG.find(ptr.getCell()) != mSG.end()) + if(mSG.find(store) != mSG.end()) { - Ogre::StaticGeometry* sg = mSG[ptr.getCell()]; + Ogre::StaticGeometry* sg = mSG[store]; mRend.getScene()->destroyStaticGeometry (sg); sg = 0; } @@ -171,3 +170,4 @@ void Objects::buildStaticGeometry(ESMS::CellStore& cell){ } } + diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index 9c5f796a1..e7fb716b8 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -37,7 +37,7 @@ public: void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); void insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius); void deleteObject (const std::string& handle); - void removeCell(const MWWorld::Ptr& ptr); + void removeCell(MWWorld::Ptr::CellStore* store); void buildStaticGeometry(ESMS::CellStore &cell); void setMwRoot(Ogre::SceneNode* root); diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 9fb9dd98c..fffa6f3d6 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -82,7 +82,7 @@ MWRender::Player& RenderingManager::getPlayer(){ void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ - + objects.removeCell(store); } void RenderingManager::addObject (const MWWorld::Ptr& ptr){ const MWWorld::Class& class_ = diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 4e51442bd..e4dc5deb4 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -88,11 +88,12 @@ class RenderingManager: private RenderingInterface { OEngine::Render::OgreRenderer& getOgreRenderer(){return rend;} Ogre::SceneManager *getMgr() { return rend.getScene(); } Ogre::SceneNode *getRoot() { return mwRoot; } - - private: - void configureAmbient(ESMS::CellStore &mCell); + void configureAmbient(ESMS::CellStore &mCell); /// configure fog according to cell void configureFog(ESMS::CellStore &mCell); + + private: + void setAmbientMode(); SkyManager* mSkyManager; OEngine::Render::OgreRenderer &rend; diff --git a/apps/openmw/mwworld/cellfunctors.hpp b/apps/openmw/mwworld/cellfunctors.hpp index 5ff801f01..8bba898ce 100644 --- a/apps/openmw/mwworld/cellfunctors.hpp +++ b/apps/openmw/mwworld/cellfunctors.hpp @@ -16,12 +16,12 @@ namespace MWWorld /// List all (Ogre-)handles. struct ListHandles { - std::vector mHandles; + std::vector mHandles; bool operator() (ESM::CellRef& ref, RefData& data) { - std::string handle = data.getHandle(); - if (!handle.empty()) + Ogre::SceneNode* handle = data.getBaseNode(); + if (handle) mHandles.push_back (handle); return true; } diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index f264afde8..c9d477833 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -79,38 +79,46 @@ namespace MWWorld void Scene::unloadCell (CellStoreCollection::iterator iter) { + ListHandles functor; - Ptr::CellStore* cellstore = *iter; - - cellstore->forEach(functor); + + MWWorld::Ptr::CellStore* active = *iter; + mRendering.removeCell(active); + + active->forEach(functor); - { // silence annoying g++ warning - for (std::vector::const_iterator iter (functor.mHandles.begin()); - iter!=functor.mHandles.end(); ++iter) - mPhysics->removeObject (*iter); + { + + + // silence annoying g++ warning + for (std::vector::const_iterator iter (functor.mHandles.begin()); + iter!=functor.mHandles.end(); ++iter){ + Ogre::SceneNode* node = *iter; + mPhysics->removeObject (node->getName()); + } } - - mWorld->getLocalScripts().clearCell (cellstore); - - mEnvironment.mMechanicsManager->dropActors (cellstore); - mEnvironment.mSoundManager->stopSound (cellstore); - //delete iter->second; + mWorld->getLocalScripts().clearCell (active); + mEnvironment.mMechanicsManager->dropActors (active); + mEnvironment.mSoundManager->stopSound (active); mActiveCells.erase (iter); } void Scene::loadCell (Ptr::CellStore *cell) { - std::cout << "Start load\n"; // register local scripts mWorld->getLocalScripts().addCell (cell); - // This connects the cell data with the rendering scene. - mActiveCells.insert(cell); - std::cout << "Before static\n"; - insertCell(*cell, mEnvironment); - mRendering.getObjects().buildStaticGeometry(*cell); - std::cout << "Done loading cell\n"; + + std::pair result = + mActiveCells.insert(cell); + if(result.second){ + insertCell(*cell, mEnvironment); + mRendering.getObjects().buildStaticGeometry(*cell); + mRendering.configureAmbient(*cell); + + } + } @@ -233,7 +241,7 @@ namespace MWWorld std::cout << "Changing to interior\n"; // remove active CellStoreCollection::iterator active = mActiveCells.begin(); - + std::cout << "Size: " << mActiveCells.size() << "\n"; while (active!=mActiveCells.end()) { unloadCell (active++); @@ -312,9 +320,7 @@ void Scene::insertCell(ESMS::CellStore &cell, MWWorld::Environment& environment) { // Loop through all references in the cell - std::cout << "Reflist1\n"; insertCellRefList(mRendering, environment, cell.activators, cell, *mPhysics); - std::cout << "Reflist2\n"; insertCellRefList(mRendering, environment, cell.potions, cell, *mPhysics); insertCellRefList(mRendering, environment, cell.appas, cell, *mPhysics); insertCellRefList(mRendering, environment, cell.armors, cell, *mPhysics); diff --git a/components/esm_store/cell_store.hpp b/components/esm_store/cell_store.hpp index 12f644417..d064312f1 100644 --- a/components/esm_store/cell_store.hpp +++ b/components/esm_store/cell_store.hpp @@ -187,7 +187,7 @@ namespace ESMS ++iter) if (!functor (iter->ref, iter->mData)) return false; - + return true; }