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())
{
MWRender::Objects objects = renderingInterface.getObjects();
MWRender::Objects& objects = renderingInterface.getObjects();
objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false);
objects.insertMesh(ptr, "meshes\\" + model);
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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);
}*/

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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);
}*/

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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<MWWorld::RefData>& cell){
}
}

View file

@ -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<MWWorld::RefData> &cell);
void setMwRoot(Ogre::SceneNode* root);

View file

@ -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_ =

View file

@ -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<MWWorld::RefData> &mCell);
void configureAmbient(ESMS::CellStore<MWWorld::RefData> &mCell);
/// configure fog according to cell
void configureFog(ESMS::CellStore<MWWorld::RefData> &mCell);
private:
void setAmbientMode();
SkyManager* mSkyManager;
OEngine::Render::OgreRenderer &rend;

View file

@ -16,12 +16,12 @@ namespace MWWorld
/// List all (Ogre-)handles.
struct ListHandles
{
std::vector<std::string> mHandles;
std::vector<Ogre::SceneNode*> 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;
}

View file

@ -79,38 +79,46 @@ namespace MWWorld
void Scene::unloadCell (CellStoreCollection::iterator iter)
{
ListHandles functor;
Ptr::CellStore* cellstore = *iter;
cellstore->forEach<ListHandles>(functor);
MWWorld::Ptr::CellStore* active = *iter;
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 (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<CellStoreCollection::iterator, bool> 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<MWWorld::RefData> &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);

View file

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