diff --git a/apps/openmw/mwrender/actors.cpp b/apps/openmw/mwrender/actors.cpp index 7454261f07..21403d3b2c 100644 --- a/apps/openmw/mwrender/actors.cpp +++ b/apps/openmw/mwrender/actors.cpp @@ -1,6 +1,6 @@ #include "actors.hpp" #include -#include + diff --git a/apps/openmw/mwrender/animation.cpp b/apps/openmw/mwrender/animation.cpp index 78e9b76cd3..4d725b4deb 100644 --- a/apps/openmw/mwrender/animation.cpp +++ b/apps/openmw/mwrender/animation.cpp @@ -1,9 +1,30 @@ #include "animation.hpp" + namespace MWRender{ + std::map Animation::mUniqueIDs; Animation::~Animation(){ base = 0; } + std::string Animation::getUniqueID(std::string mesh){ + int counter; + if(mUniqueIDs.find(mesh) == mUniqueIDs.end()){ + counter = mUniqueIDs[mesh] = 0; + } + else + counter = mUniqueIDs[mesh]++; + + std::stringstream out; + if(counter > 99 && counter < 1000) + out << "0"; + else if(counter > 9) + out << "00"; + else + out << "000"; + out << counter; + return out.str(); +} + void Animation::handleShapes(std::vector* allshapes, Ogre::Entity* creaturemodel, Ogre::SkeletonInstance *skel){ shapeNumber = 0; std::vector::iterator allshapesiter; diff --git a/apps/openmw/mwrender/animation.hpp b/apps/openmw/mwrender/animation.hpp index 31910b8140..19635270c7 100644 --- a/apps/openmw/mwrender/animation.hpp +++ b/apps/openmw/mwrender/animation.hpp @@ -7,13 +7,17 @@ #include "../mwworld/actiontalk.hpp" #include "../mwworld/environment.hpp" #include +#include namespace MWRender{ class Animation{ + protected: + OEngine::Render::OgreRenderer &mRend; - MWWorld::Environment& mEnvironment; + MWWorld::Environment& mEnvironment; + static std::map mUniqueIDs; float time; float startTime; @@ -36,9 +40,12 @@ class Animation{ std::map textmappings; Ogre::Entity* base; void handleShapes(std::vector* allshapes, Ogre::Entity* creaturemodel, Ogre::SkeletonInstance *skel); + bool timeIndex( float time, std::vector times, int & i, int & j, float & x ); + std::string getUniqueID(std::string mesh); public: Animation(MWWorld::Environment& _env, OEngine::Render::OgreRenderer& _rend): mRend(_rend), mEnvironment(_env){}; - bool timeIndex( float time, std::vector times, int & i, int & j, float & x ); + + ~Animation(); }; diff --git a/apps/openmw/mwrender/creatureanimation.cpp b/apps/openmw/mwrender/creatureanimation.cpp index fac54db64d..b2be189931 100644 --- a/apps/openmw/mwrender/creatureanimation.cpp +++ b/apps/openmw/mwrender/creatureanimation.cpp @@ -18,11 +18,12 @@ CreatureAnimation::CreatureAnimation(const MWWorld::Ptr& ptr, MWWorld::Environme assert (ref->base != NULL); if(!ref->base->model.empty()){ const std::string &mesh = "meshes\\" + ref->base->model; + std::string meshNumbered = mesh + getUniqueID(mesh) + ">|"; + NifOgre::NIFLoader::load(meshNumbered); + base = mRend.getScene()->createEntity(meshNumbered); + std::string meshZero = mesh + "0000>|"; - NifOgre::NIFLoader::load(mesh); - base = mRend.getScene()->createEntity(mesh); - - if(transformations = (NIFLoader::getSingletonPtr())->getAnim(mesh)){ + if(transformations = (NIFLoader::getSingletonPtr())->getAnim(meshZero)){ for(int init = 0; init < transformations->size(); init++){ rindexI.push_back(0); diff --git a/apps/openmw/mwrender/npcanimation.cpp b/apps/openmw/mwrender/npcanimation.cpp index 17cb639ce8..4a8bac6559 100644 --- a/apps/openmw/mwrender/npcanimation.cpp +++ b/apps/openmw/mwrender/npcanimation.cpp @@ -173,23 +173,25 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, MWWorld::Environment& _env,O insertBoundedPart("meshes\\" + hair->model, "Head"); if (chest){ - insertFreePart("meshes\\" + chest->model + "|\"", insert); + insertFreePart("meshes\\" + chest->model, ">\"", insert); + } if (handr){ - insertFreePart("meshes\\" + handr->model + "|?", insert); + insertFreePart("meshes\\" + handr->model , ">?", insert); } if (handl){ - insertFreePart("meshes\\" + handl->model + "|>", insert); + insertFreePart("meshes\\" + handl->model, ">>", insert); } if(tail){ - insertFreePart("meshes\\" + tail->model + "|*", insert); + insertFreePart("meshes\\" + tail->model, ">*", insert); } if(feet){ - insertFreePart("meshes\\" + feet->model + "|<", insert); - insertFreePart("meshes\\" + feet->model + "|:", insert); + std::string num = getUniqueID(feet->model); + insertFreePart("meshes\\" + feet->model,"><", insert); + insertFreePart("meshes\\" + feet->model,">:", insert); } } @@ -200,12 +202,14 @@ Ogre::Entity* NpcAnimation::insertBoundedPart(const std::string &mesh, std::stri base->attachObjectToBone(bonename, ent); return ent; } -void NpcAnimation::insertFreePart(const std::string &mesh, Ogre::SceneNode* insert){ - NIFLoader::load(mesh); - Entity* ent = mRend.getScene()->createEntity(mesh); +void NpcAnimation::insertFreePart(const std::string &mesh, const std::string suffix, Ogre::SceneNode* insert){ + std::string meshNumbered = mesh + getUniqueID(mesh + suffix) + suffix; + NIFLoader::load(meshNumbered); + + Entity* ent = mRend.getScene()->createEntity(meshNumbered); insert->attachObject(ent); entityparts.push_back(ent); - std::vector* shapes = ((NIFLoader::getSingletonPtr())->getShapes(mesh)); + std::vector* shapes = ((NIFLoader::getSingletonPtr())->getShapes(mesh + "0000" + suffix)); if(shapes){ shapeparts.push_back(shapes); handleShapes(shapes, ent, skel); diff --git a/apps/openmw/mwrender/npcanimation.hpp b/apps/openmw/mwrender/npcanimation.hpp index 96a2eeb316..9ecabd2548 100644 --- a/apps/openmw/mwrender/npcanimation.hpp +++ b/apps/openmw/mwrender/npcanimation.hpp @@ -22,7 +22,7 @@ class NpcAnimation: public Animation{ NpcAnimation(const MWWorld::Ptr& ptr, MWWorld::Environment& _env, OEngine::Render::OgreRenderer& _rend); ~NpcAnimation(); Ogre::Entity* insertBoundedPart(const std::string &mesh, std::string bonename); - void insertFreePart(const std::string &mesh, Ogre::SceneNode* insert); + void insertFreePart(const std::string &mesh, const std::string suffix, Ogre::SceneNode* insert); }; } #endif \ No newline at end of file diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp index 21dea31b17..cbb137511f 100644 --- a/components/nifogre/ogre_nif_loader.cpp +++ b/components/nifogre/ogre_nif_loader.cpp @@ -1150,7 +1150,7 @@ void NIFLoader::loadResource(Resource *resource) else if(suffix == '>') { baddin = true; - bNiTri = false; + bNiTri = true; std::string sub = name.substr(name.length() - 6, 4); if(sub.compare("0000") != 0) diff --git a/components/nifogre/ogre_nif_loader.hpp b/components/nifogre/ogre_nif_loader.hpp index 7dab61a545..c979685101 100644 --- a/components/nifogre/ogre_nif_loader.hpp +++ b/components/nifogre/ogre_nif_loader.hpp @@ -44,8 +44,7 @@ #include #include // For warning messages -#include - +#include 5 // float infinity #include using namespace boost::algorithm;