Many bugs fixed related to changing cells

This commit is contained in:
Jason Hooks 2011-11-19 01:01:19 -05:00
parent 15fcdc8b72
commit 7319f7a8c6
25 changed files with 64 additions and 57 deletions

View file

@ -21,7 +21,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -23,7 +23,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -23,7 +23,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -23,7 +23,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -23,7 +23,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -19,7 +19,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -33,7 +33,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Creatures creatures = renderingInterface.getCreatures(); MWRender::Creatures& creatures = renderingInterface.getCreatures();
//creatures.insertBegin(ptr, ptr.getRefData().isEnabled(), false); //creatures.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
//creatures.insertMesh(ptr, "meshes\\" + model); //creatures.insertMesh(ptr, "meshes\\" + model);
}*/ }*/

View file

@ -28,7 +28,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -23,7 +23,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -26,7 +26,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
const int color = ref->base->data.color; const int color = ref->base->data.color;

View file

@ -22,7 +22,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -22,7 +22,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -41,7 +41,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Npcs npcs = renderingInterface.getNPCs(); MWRender::Npcs& npcs = renderingInterface.getNPCs();
//npcs.insertBegin(ptr, ptr.getRefData().isEnabled(), false); //npcs.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
//npcs.insertMesh(ptr, "meshes\\" + model); //npcs.insertMesh(ptr, "meshes\\" + model);
}*/ }*/

View file

@ -23,7 +23,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -23,7 +23,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -22,7 +22,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -18,7 +18,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -23,7 +23,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
MWRender::Objects objects = renderingInterface.getObjects(); MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model); objects.insertMesh(ptr, "meshes\\" + model);
} }

View file

@ -40,8 +40,6 @@ void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){
cellnode = mCellSceneNodes[ptr.getCell()]; cellnode = mCellSceneNodes[ptr.getCell()];
} }
Ogre::SceneNode* insert = cellnode->createChildSceneNode(); Ogre::SceneNode* insert = cellnode->createChildSceneNode();
const float *f = ptr.getRefData().getPosition().pos; const float *f = ptr.getRefData().getPosition().pos;
insert->setPosition(f[0], f[1], f[2]); 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); mRend.getScene()->destroyEntity(ent);
} }
} }
void Objects::insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius){ 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){ void Objects::removeCell(MWWorld::Ptr::CellStore* store){
if(mCellSceneNodes.find(ptr.getCell()) != mCellSceneNodes.end()) if(mCellSceneNodes.find(store) != mCellSceneNodes.end())
{ {
Ogre::SceneNode* base = mCellSceneNodes[ptr.getCell()]; Ogre::SceneNode* base = mCellSceneNodes[store];
base->removeAndDestroyAllChildren(); base->removeAndDestroyAllChildren();
mRend.getScene()->destroySceneNode(base); mRend.getScene()->destroySceneNode(base);
base = 0; 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); mRend.getScene()->destroyStaticGeometry (sg);
sg = 0; sg = 0;
} }
@ -171,3 +170,4 @@ void Objects::buildStaticGeometry(ESMS::CellStore<MWWorld::RefData>& cell){
} }
} }

View file

@ -37,7 +37,7 @@ public:
void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); 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 insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius);
void deleteObject (const std::string& handle); void deleteObject (const std::string& handle);
void removeCell(const MWWorld::Ptr& ptr); void removeCell(MWWorld::Ptr::CellStore* store);
void buildStaticGeometry(ESMS::CellStore<MWWorld::RefData> &cell); void buildStaticGeometry(ESMS::CellStore<MWWorld::RefData> &cell);
void setMwRoot(Ogre::SceneNode* root); void setMwRoot(Ogre::SceneNode* root);

View file

@ -82,7 +82,7 @@ MWRender::Player& RenderingManager::getPlayer(){
void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){
objects.removeCell(store);
} }
void RenderingManager::addObject (const MWWorld::Ptr& ptr){ void RenderingManager::addObject (const MWWorld::Ptr& ptr){
const MWWorld::Class& class_ = const MWWorld::Class& class_ =

View file

@ -88,11 +88,12 @@ class RenderingManager: private RenderingInterface {
OEngine::Render::OgreRenderer& getOgreRenderer(){return rend;} OEngine::Render::OgreRenderer& getOgreRenderer(){return rend;}
Ogre::SceneManager *getMgr() { return rend.getScene(); } Ogre::SceneManager *getMgr() { return rend.getScene(); }
Ogre::SceneNode *getRoot() { return mwRoot; } Ogre::SceneNode *getRoot() { return mwRoot; }
void configureAmbient(ESMS::CellStore<MWWorld::RefData> &mCell);
private:
void configureAmbient(ESMS::CellStore<MWWorld::RefData> &mCell);
/// configure fog according to cell /// configure fog according to cell
void configureFog(ESMS::CellStore<MWWorld::RefData> &mCell); void configureFog(ESMS::CellStore<MWWorld::RefData> &mCell);
private:
void setAmbientMode(); void setAmbientMode();
SkyManager* mSkyManager; SkyManager* mSkyManager;
OEngine::Render::OgreRenderer &rend; OEngine::Render::OgreRenderer &rend;

View file

@ -16,12 +16,12 @@ namespace MWWorld
/// List all (Ogre-)handles. /// List all (Ogre-)handles.
struct ListHandles struct ListHandles
{ {
std::vector<std::string> mHandles; std::vector<Ogre::SceneNode*> mHandles;
bool operator() (ESM::CellRef& ref, RefData& data) bool operator() (ESM::CellRef& ref, RefData& data)
{ {
std::string handle = data.getHandle(); Ogre::SceneNode* handle = data.getBaseNode();
if (!handle.empty()) if (handle)
mHandles.push_back (handle); mHandles.push_back (handle);
return true; return true;
} }

View file

@ -79,38 +79,46 @@ namespace MWWorld
void Scene::unloadCell (CellStoreCollection::iterator iter) void Scene::unloadCell (CellStoreCollection::iterator iter)
{ {
ListHandles functor; ListHandles functor;
Ptr::CellStore* cellstore = *iter;
MWWorld::Ptr::CellStore* active = *iter;
cellstore->forEach<ListHandles>(functor); mRendering.removeCell(active);
active->forEach<ListHandles>(functor);
{ // silence annoying g++ warning {
for (std::vector<std::string>::const_iterator iter (functor.mHandles.begin());
iter!=functor.mHandles.end(); ++iter)
mPhysics->removeObject (*iter); // silence annoying g++ warning
for (std::vector<Ogre::SceneNode*>::const_iterator iter (functor.mHandles.begin());
iter!=functor.mHandles.end(); ++iter){
Ogre::SceneNode* node = *iter;
mPhysics->removeObject (node->getName());
}
} }
mWorld->getLocalScripts().clearCell (active);
mWorld->getLocalScripts().clearCell (cellstore); mEnvironment.mMechanicsManager->dropActors (active);
mEnvironment.mSoundManager->stopSound (active);
mEnvironment.mMechanicsManager->dropActors (cellstore);
mEnvironment.mSoundManager->stopSound (cellstore);
//delete iter->second;
mActiveCells.erase (iter); mActiveCells.erase (iter);
} }
void Scene::loadCell (Ptr::CellStore *cell) void Scene::loadCell (Ptr::CellStore *cell)
{ {
std::cout << "Start load\n";
// register local scripts // register local scripts
mWorld->getLocalScripts().addCell (cell); 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::pair<CellStoreCollection::iterator, bool> result =
std::cout << "Done loading cell\n"; 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"; std::cout << "Changing to interior\n";
// remove active // remove active
CellStoreCollection::iterator active = mActiveCells.begin(); CellStoreCollection::iterator active = mActiveCells.begin();
std::cout << "Size: " << mActiveCells.size() << "\n";
while (active!=mActiveCells.end()) while (active!=mActiveCells.end())
{ {
unloadCell (active++); unloadCell (active++);
@ -312,9 +320,7 @@ void Scene::insertCell(ESMS::CellStore<MWWorld::RefData> &cell,
MWWorld::Environment& environment) MWWorld::Environment& environment)
{ {
// Loop through all references in the cell // Loop through all references in the cell
std::cout << "Reflist1\n";
insertCellRefList(mRendering, environment, cell.activators, cell, *mPhysics); insertCellRefList(mRendering, environment, cell.activators, cell, *mPhysics);
std::cout << "Reflist2\n";
insertCellRefList(mRendering, environment, cell.potions, cell, *mPhysics); insertCellRefList(mRendering, environment, cell.potions, cell, *mPhysics);
insertCellRefList(mRendering, environment, cell.appas, cell, *mPhysics); insertCellRefList(mRendering, environment, cell.appas, cell, *mPhysics);
insertCellRefList(mRendering, environment, cell.armors, cell, *mPhysics); insertCellRefList(mRendering, environment, cell.armors, cell, *mPhysics);

View file

@ -187,7 +187,7 @@ namespace ESMS
++iter) ++iter)
if (!functor (iter->ref, iter->mData)) if (!functor (iter->ref, iter->mData))
return false; return false;
return true; return true;
} }