forked from mirror/openmw-tes3mp
Many bugs fixed related to changing cells
This commit is contained in:
parent
15fcdc8b72
commit
7319f7a8c6
25 changed files with 64 additions and 57 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}*/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}*/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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){
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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_ =
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -187,7 +187,7 @@ namespace ESMS
|
|||
++iter)
|
||||
if (!functor (iter->ref, iter->mData))
|
||||
return false;
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue