From b05f7806751505f12545630ace76d9bcfac5384f Mon Sep 17 00:00:00 2001 From: gugus Date: Mon, 23 May 2011 14:56:19 +0200 Subject: [PATCH 1/9] fix a compiler error under window --- components/files/multidircollection.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/files/multidircollection.hpp b/components/files/multidircollection.hpp index bd0304e40..cb709d9b9 100644 --- a/components/files/multidircollection.hpp +++ b/components/files/multidircollection.hpp @@ -24,8 +24,8 @@ namespace Files for (std::size_t i=0; i Date: Mon, 23 May 2011 14:59:36 +0200 Subject: [PATCH 2/9] experimental: each material with the same texture is loaded only once. Problem: it doesn't take into account other material properties (which seems to be always the same anyway) --- components/nifogre/ogre_nif_loader.cpp | 23 +++++++++++++++++++++-- components/nifogre/ogre_nif_loader.hpp | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp index a33fde55a..2db51b003 100644 --- a/components/nifogre/ogre_nif_loader.cpp +++ b/components/nifogre/ogre_nif_loader.cpp @@ -581,8 +581,27 @@ void NIFLoader::handleNiTriShape(NiTriShape *shape, int flags, BoundsFinder &bou { // Use NiMaterialProperty data to create the data const S_MaterialProperty *d = m->data; - createMaterial(material, d->ambient, d->diffuse, d->specular, d->emissive, - d->glossiness, d->alpha, alphaFlags, alphaTest, texName); + + std::multimap::iterator itr = MaterialMap.find(texName); + std::multimap::iterator lastElement; + lastElement = MaterialMap.upper_bound(texName); + if (itr != MaterialMap.end()) + { + for ( ; itr != lastElement; ++itr) + { + //std::cout << "OK!"; + //MaterialPtr mat = MaterialManager::getSingleton().getByName(itr->second,recourceGroup); + material = itr->second; + //if( mat->getA + } + } + else + { + //std::cout << "new"; + createMaterial(material, d->ambient, d->diffuse, d->specular, d->emissive, + d->glossiness, d->alpha, alphaFlags, alphaTest, texName); + MaterialMap.insert(std::make_pair(texName,material)); + } } else { diff --git a/components/nifogre/ogre_nif_loader.hpp b/components/nifogre/ogre_nif_loader.hpp index 6ab22aa2f..cec9d95d7 100644 --- a/components/nifogre/ogre_nif_loader.hpp +++ b/components/nifogre/ogre_nif_loader.hpp @@ -132,6 +132,7 @@ class NIFLoader : Ogre::ManualResourceLoader int numbers; int stack; + std::multimap MaterialMap; // pointer to the ogre mesh which is currently build Ogre::Mesh *mesh; From 41d283a3aabda4143ca277cd0d75e658744b1506 Mon Sep 17 00:00:00 2001 From: gugus Date: Mon, 23 May 2011 15:00:01 +0200 Subject: [PATCH 3/9] very experimental: static geometry. --- apps/openmw/mwrender/exterior.cpp | 24 ++++++++++++++++++++++-- apps/openmw/mwrender/exterior.hpp | 6 ++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp index fe54af84a..01e2fc627 100644 --- a/apps/openmw/mwrender/exterior.cpp +++ b/apps/openmw/mwrender/exterior.cpp @@ -31,8 +31,21 @@ float ExteriorCellRender::lightQuadraticRadiusMult = 1; bool ExteriorCellRender::lightOutQuadInLin = false; -// start inserting a new reference. +ExteriorCellRender::ExteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, + MWScene &_scene) + : mCell(_cell), mEnvironment (environment), mScene(_scene), mBase(NULL), mInsert(NULL), mAmbientMode (0) +{ + //char a = mCell.cell->name; + //char *rand1; + srand (150); + //itoa(rand(),rand1,10); + int a; + Ogre::StringConverter::toString(rand()); + sg = Ogre::Root::getSingleton().getSceneManagerIterator().getNext()->createStaticGeometry( Ogre::StringConverter::toString(a)); +} + +// start inserting a new reference. void ExteriorCellRender::insertBegin (ESM::CellRef &ref) { assert (!mInsert); @@ -202,9 +215,12 @@ void ExteriorCellRender::insertMesh(const std::string &mesh) assert (mInsert); NIFLoader::load(mesh); - MovableObject *ent = mScene.getMgr()->createEntity(mesh); + Entity *ent = mScene.getMgr()->createEntity(mesh); mInsert->attachObject(ent); + /*sg->addEntity(ent,mInsert->_getDerivedPosition(),mInsert->_getDerivedOrientation(),mInsert->_getDerivedScale()); + sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000));*/ + if (mInsertMesh.empty()) mInsertMesh = mesh; } @@ -333,6 +349,8 @@ void ExteriorCellRender::show() configureFog(); insertCell(mCell, mEnvironment); + + sg->build(); } void ExteriorCellRender::hide() @@ -350,6 +368,8 @@ void ExteriorCellRender::destroy() } mBase = NULL; + std::cout << "destroy"; + Ogre::Root::getSingleton().getSceneManagerIterator().getNext()->destroyStaticGeometry(sg); } // Switch through lighting modes. diff --git a/apps/openmw/mwrender/exterior.hpp b/apps/openmw/mwrender/exterior.hpp index 93491f263..c4ce065c2 100644 --- a/apps/openmw/mwrender/exterior.hpp +++ b/apps/openmw/mwrender/exterior.hpp @@ -57,6 +57,9 @@ namespace MWRender std::string mInsertMesh; Ogre::SceneNode *mNpcPart; + //the static geometry + Ogre::StaticGeometry *sg; + // 0 normal, 1 more bright, 2 max int mAmbientMode; @@ -95,8 +98,7 @@ namespace MWRender public: ExteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, - MWScene &_scene) - : mCell(_cell), mEnvironment (environment), mScene(_scene), mBase(NULL), mInsert(NULL), mAmbientMode (0) {} + MWScene &_scene); virtual ~ExteriorCellRender() { destroy(); } From 7192bc4f89d907391698ff61f9206ecfef16ec42 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Mon, 23 May 2011 19:12:28 +0200 Subject: [PATCH 4/9] added static flag --- apps/openmw/mwclass/static.cpp | 2 +- apps/openmw/mwrender/cellimp.hpp | 6 +++--- apps/openmw/mwrender/exterior.cpp | 2 +- apps/openmw/mwrender/exterior.hpp | 2 +- apps/openmw/mwrender/interior.cpp | 2 +- apps/openmw/mwrender/interior.hpp | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwclass/static.cpp b/apps/openmw/mwclass/static.cpp index 851b4d7bf..cf0be9499 100644 --- a/apps/openmw/mwclass/static.cpp +++ b/apps/openmw/mwclass/static.cpp @@ -19,7 +19,7 @@ namespace MWClass const std::string &model = ref->base->model; if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref); + MWRender::Rendering rendering (cellRender, ref->ref, true); cellRender.insertMesh ("meshes\\" + model); cellRender.insertObjectPhysics(); ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); diff --git a/apps/openmw/mwrender/cellimp.hpp b/apps/openmw/mwrender/cellimp.hpp index 272bfeeab..664fed64f 100644 --- a/apps/openmw/mwrender/cellimp.hpp +++ b/apps/openmw/mwrender/cellimp.hpp @@ -35,7 +35,7 @@ namespace MWRender virtual ~CellRenderImp() {} /// start inserting a new reference. - virtual void insertBegin (ESM::CellRef &ref) = 0; + virtual void insertBegin (ESM::CellRef &ref, bool static_ = false) = 0; virtual void rotateMesh(Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName[], int elements) = 0; /// insert a mesh related to the most recent insertBegin call. @@ -71,10 +71,10 @@ namespace MWRender public: - Rendering (CellRenderImp& cellRender, ESM::CellRef &ref) + Rendering (CellRenderImp& cellRender, ESM::CellRef &ref, bool static_ = false) : mCellRender (cellRender), mEnd (false) { - mCellRender.insertBegin (ref); + mCellRender.insertBegin (ref, static_); } ~Rendering() diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp index fe54af84a..a8b1aad20 100644 --- a/apps/openmw/mwrender/exterior.cpp +++ b/apps/openmw/mwrender/exterior.cpp @@ -33,7 +33,7 @@ bool ExteriorCellRender::lightOutQuadInLin = false; // start inserting a new reference. -void ExteriorCellRender::insertBegin (ESM::CellRef &ref) +void ExteriorCellRender::insertBegin (ESM::CellRef &ref, bool static_) { assert (!mInsert); diff --git a/apps/openmw/mwrender/exterior.hpp b/apps/openmw/mwrender/exterior.hpp index 93491f263..489662862 100644 --- a/apps/openmw/mwrender/exterior.hpp +++ b/apps/openmw/mwrender/exterior.hpp @@ -63,7 +63,7 @@ namespace MWRender Ogre::ColourValue mAmbientColor; /// start inserting a new reference. - virtual void insertBegin (ESM::CellRef &ref); + virtual void insertBegin (ESM::CellRef &ref, bool static_ = false); /// insert a mesh related to the most recent insertBegin call. virtual void insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements); diff --git a/apps/openmw/mwrender/interior.cpp b/apps/openmw/mwrender/interior.cpp index dbacaacf9..ad0ecf69d 100644 --- a/apps/openmw/mwrender/interior.cpp +++ b/apps/openmw/mwrender/interior.cpp @@ -35,7 +35,7 @@ bool InteriorCellRender::lightOutQuadInLin = false; // start inserting a new reference. -void InteriorCellRender::insertBegin (ESM::CellRef &ref) +void InteriorCellRender::insertBegin (ESM::CellRef &ref, bool static_) { assert (!insert); diff --git a/apps/openmw/mwrender/interior.hpp b/apps/openmw/mwrender/interior.hpp index 7c4b2aaf1..295eaa475 100644 --- a/apps/openmw/mwrender/interior.hpp +++ b/apps/openmw/mwrender/interior.hpp @@ -63,7 +63,7 @@ namespace MWRender Ogre::ColourValue ambientColor; /// start inserting a new reference. - virtual void insertBegin (ESM::CellRef &ref); + virtual void insertBegin (ESM::CellRef &ref, bool static_ = false); virtual void rotateMesh(Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName[], int elements); virtual void scaleMesh(Ogre::Vector3 axis, std::string sceneNodeName[], int elements); /// insert a mesh related to the most recent insertBegin call. From 4546ca3863e0a152aa6cc15ea0ff48da94cc54eb Mon Sep 17 00:00:00 2001 From: gugus Date: Mon, 23 May 2011 19:39:10 +0200 Subject: [PATCH 5/9] static Objects goes inside the static geometry --- apps/openmw/mwrender/exterior.cpp | 21 ++++++++++++++------- apps/openmw/mwrender/exterior.hpp | 1 + 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp index c90123334..3171e1455 100644 --- a/apps/openmw/mwrender/exterior.cpp +++ b/apps/openmw/mwrender/exterior.cpp @@ -50,6 +50,8 @@ void ExteriorCellRender::insertBegin (ESM::CellRef &ref, bool static_) { assert (!mInsert); + isStatic = static_; + // Create and place scene node for this object mInsert = mBase->createChildSceneNode(); @@ -72,7 +74,7 @@ void ExteriorCellRender::insertBegin (ESM::CellRef &ref, bool static_) // Rotates first around z, then y, then x mInsert->setOrientation(xr*yr*zr); - mInsertMesh.clear(); + mInsertMesh.clear(); } @@ -216,13 +218,18 @@ void ExteriorCellRender::insertMesh(const std::string &mesh) NIFLoader::load(mesh); Entity *ent = mScene.getMgr()->createEntity(mesh); - mInsert->attachObject(ent); - /*sg->addEntity(ent,mInsert->_getDerivedPosition(),mInsert->_getDerivedOrientation(),mInsert->_getDerivedScale()); - sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000));*/ - - if (mInsertMesh.empty()) - mInsertMesh = mesh; + if(!isStatic) + { + mInsert->attachObject(ent); + } + else + { + sg->addEntity(ent,mInsert->_getDerivedPosition(),mInsert->_getDerivedOrientation(),mInsert->_getDerivedScale()); + sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); + } + if (mInsertMesh.empty()) + mInsertMesh = mesh; } void ExteriorCellRender::insertObjectPhysics() diff --git a/apps/openmw/mwrender/exterior.hpp b/apps/openmw/mwrender/exterior.hpp index 6ffcf7d92..f8cef45fa 100644 --- a/apps/openmw/mwrender/exterior.hpp +++ b/apps/openmw/mwrender/exterior.hpp @@ -59,6 +59,7 @@ namespace MWRender //the static geometry Ogre::StaticGeometry *sg; + bool isStatic; // 0 normal, 1 more bright, 2 max int mAmbientMode; From faaa08d6d04f546ed04ceeeedb889183a3716313 Mon Sep 17 00:00:00 2001 From: gugus Date: Mon, 23 May 2011 19:47:27 +0200 Subject: [PATCH 6/9] removed this stupide methode to generate unique ID. --- apps/openmw/mwrender/exterior.cpp | 11 ++++------- apps/openmw/mwrender/exterior.hpp | 2 ++ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp index 3171e1455..3a17357bd 100644 --- a/apps/openmw/mwrender/exterior.cpp +++ b/apps/openmw/mwrender/exterior.cpp @@ -31,17 +31,14 @@ float ExteriorCellRender::lightQuadraticRadiusMult = 1; bool ExteriorCellRender::lightOutQuadInLin = false; +int ExteriorCellRender::uniqueID = 0; + ExteriorCellRender::ExteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, MWScene &_scene) : mCell(_cell), mEnvironment (environment), mScene(_scene), mBase(NULL), mInsert(NULL), mAmbientMode (0) { - //char a = mCell.cell->name; - //char *rand1; - srand (150); - //itoa(rand(),rand1,10); - int a; - Ogre::StringConverter::toString(rand()); - sg = Ogre::Root::getSingleton().getSceneManagerIterator().getNext()->createStaticGeometry( Ogre::StringConverter::toString(a)); + uniqueID = uniqueID +1; + sg = Ogre::Root::getSingleton().getSceneManagerIterator().getNext()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); } diff --git a/apps/openmw/mwrender/exterior.hpp b/apps/openmw/mwrender/exterior.hpp index f8cef45fa..4de421f44 100644 --- a/apps/openmw/mwrender/exterior.hpp +++ b/apps/openmw/mwrender/exterior.hpp @@ -124,6 +124,8 @@ namespace MWRender /// Remove the reference with the given handle permanently from the scene. virtual void deleteObject (const std::string& handle); + + static int uniqueID; }; } From c7fb27e801cca9d4d24ad912afc3d2a354ee437e Mon Sep 17 00:00:00 2001 From: gugus Date: Mon, 23 May 2011 20:22:12 +0200 Subject: [PATCH 7/9] Clean up wasn't done properly when deleting a Cell. --- apps/openmw/mwrender/exterior.cpp | 29 +++++++++++++++++++++++++++++ apps/openmw/mwrender/exterior.hpp | 2 ++ 2 files changed, 31 insertions(+) diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp index 3a17357bd..8f3bccdb5 100644 --- a/apps/openmw/mwrender/exterior.cpp +++ b/apps/openmw/mwrender/exterior.cpp @@ -224,6 +224,7 @@ void ExteriorCellRender::insertMesh(const std::string &mesh) { sg->addEntity(ent,mInsert->_getDerivedPosition(),mInsert->_getDerivedOrientation(),mInsert->_getDerivedScale()); sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); + mScene.getMgr()->destroyEntity(ent); } if (mInsertMesh.empty()) mInsertMesh = mesh; @@ -363,10 +364,38 @@ void ExteriorCellRender::hide() mBase->setVisible(false); } +void ExteriorCellRender::destroyAllAttachedMovableObjects(Ogre::SceneNode* i_pSceneNode) +{ + if ( !i_pSceneNode ) + { + assert( false ); + return; + } + + // Destroy all the attached objects + SceneNode::ObjectIterator itObject = i_pSceneNode->getAttachedObjectIterator(); + + while ( itObject.hasMoreElements() ) + { + MovableObject* pObject = static_cast(itObject.getNext()); + i_pSceneNode->getCreator()->destroyMovableObject( pObject ); + } + + // Recurse to child SceneNodes + SceneNode::ChildNodeIterator itChild = i_pSceneNode->getChildIterator(); + + while ( itChild.hasMoreElements() ) + { + SceneNode* pChildNode = static_cast(itChild.getNext()); + destroyAllAttachedMovableObjects( pChildNode ); + } +} + void ExteriorCellRender::destroy() { if(mBase) { + destroyAllAttachedMovableObjects(mBase); mBase->removeAndDestroyAllChildren(); mScene.getMgr()->destroySceneNode(mBase); } diff --git a/apps/openmw/mwrender/exterior.hpp b/apps/openmw/mwrender/exterior.hpp index 4de421f44..40d9c60ae 100644 --- a/apps/openmw/mwrender/exterior.hpp +++ b/apps/openmw/mwrender/exterior.hpp @@ -125,6 +125,8 @@ namespace MWRender /// Remove the reference with the given handle permanently from the scene. virtual void deleteObject (const std::string& handle); + void destroyAllAttachedMovableObjects(Ogre::SceneNode* i_pSceneNode); + static int uniqueID; }; } From bed45a936edc5a28d5fbec844aa1759b2f9251a3 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Mon, 30 May 2011 14:21:55 +0200 Subject: [PATCH 8/9] fixed cell change crash --- apps/openmw/mwrender/exterior.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp index 8f3bccdb5..626ca8f1e 100644 --- a/apps/openmw/mwrender/exterior.cpp +++ b/apps/openmw/mwrender/exterior.cpp @@ -35,7 +35,7 @@ int ExteriorCellRender::uniqueID = 0; ExteriorCellRender::ExteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, MWScene &_scene) - : mCell(_cell), mEnvironment (environment), mScene(_scene), mBase(NULL), mInsert(NULL), mAmbientMode (0) + : mCell(_cell), mEnvironment (environment), mScene(_scene), mBase(NULL), mInsert(NULL), mAmbientMode (0) { uniqueID = uniqueID +1; sg = Ogre::Root::getSingleton().getSceneManagerIterator().getNext()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); @@ -402,7 +402,11 @@ void ExteriorCellRender::destroy() mBase = NULL; std::cout << "destroy"; + if (sg) + { Ogre::Root::getSingleton().getSceneManagerIterator().getNext()->destroyStaticGeometry(sg); + sg = 0; + } } // Switch through lighting modes. From 7d2956329a5be52544ff88f490ae2515a73059ea Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Mon, 30 May 2011 14:27:04 +0200 Subject: [PATCH 9/9] some cleanup --- apps/openmw/mwrender/exterior.cpp | 16 ++++++++-------- apps/openmw/mwworld/world.cpp | 1 - 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp index 626ca8f1e..1cdc51c98 100644 --- a/apps/openmw/mwrender/exterior.cpp +++ b/apps/openmw/mwrender/exterior.cpp @@ -38,7 +38,7 @@ ExteriorCellRender::ExteriorCellRender(ESMS::CellStore &_cell, : mCell(_cell), mEnvironment (environment), mScene(_scene), mBase(NULL), mInsert(NULL), mAmbientMode (0) { uniqueID = uniqueID +1; - sg = Ogre::Root::getSingleton().getSceneManagerIterator().getNext()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); + sg = mScene.getMgr()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); } @@ -400,13 +400,13 @@ void ExteriorCellRender::destroy() mScene.getMgr()->destroySceneNode(mBase); } - mBase = NULL; - std::cout << "destroy"; - if (sg) - { - Ogre::Root::getSingleton().getSceneManagerIterator().getNext()->destroyStaticGeometry(sg); - sg = 0; - } + mBase = 0; + + if (sg) + { + mScene.getMgr()->destroyStaticGeometry (sg); + sg = 0; + } } // Switch through lighting modes. diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 68e3a745d..f1563e621 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -284,7 +284,6 @@ namespace MWWorld removeScripts (iter->first); mEnvironment.mMechanicsManager->dropActors (iter->first); - iter->second->destroy(); mEnvironment.mSoundManager->stopSound (iter->first); delete iter->second; mActiveCells.erase (iter);