diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index cce23407f..b5bb4b773 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -32,6 +32,7 @@ namespace MWClass void Npc::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { + renderingInterface.getActors().insertNPC(ptr); /* ESMS::LiveCellRef *ref = ptr.get(); diff --git a/apps/openmw/mwmechanics/mechanicsmanager.cpp b/apps/openmw/mwmechanics/mechanicsmanager.cpp index 417a062f3..7ed81f785 100644 --- a/apps/openmw/mwmechanics/mechanicsmanager.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanager.cpp @@ -250,7 +250,7 @@ namespace MWMechanics while (iter!=mActors.end()) if (iter->getCell()==cellStore) { - std::cout << "Erasing an actor"; + //std::cout << "Erasing an actor"; mActors.erase (iter++); } else diff --git a/apps/openmw/mwrender/actors.cpp b/apps/openmw/mwrender/actors.cpp index b14d1344e..6fbbd755f 100644 --- a/apps/openmw/mwrender/actors.cpp +++ b/apps/openmw/mwrender/actors.cpp @@ -4,10 +4,76 @@ using namespace Ogre; using namespace MWRender; +using namespace NifOgre; void Actors::setMwRoot(Ogre::SceneNode* root){ mMwRoot = root; } +void Actors::insertNPC(const MWWorld::Ptr& ptr){ +/* + ESMS::LiveCellRef *ref = + ptr.get(); + assert (ref->base != NULL); + + insertBegin(ptr, true, true); + + //Part selection on last character of the file string + // " Tri Chest + // * Tri Tail + // : Tri Left Foot + // < Tri Right Foot + // > Tri Left Hand + // ? Tri Right Hand + // | Normal + + //Mirroring Parts on second to last character + //suffix == '*' + // vector = Ogre::Vector3(-1,1,1); + // suffix == '?' + // vector = Ogre::Vector3(1,-1,1); + // suffix == '<' + // vector = Ogre::Vector3(1,1,-1); + + + + std::string hairID = ref->base->hair; + std::string headID = ref->base->head; + std::string npcName = ref->base->name; + + std::string bodyRaceID = headID.substr(0, headID.find_last_of("head_") - 4); + char secondtolast = bodyRaceID.at(bodyRaceID.length() - 2); + bool female = tolower(secondtolast) == 'f'; + bool beast = bodyRaceID == "b_n_khajiit_m_" || bodyRaceID == "b_n_khajiit_f_" || bodyRaceID == "b_n_argonian_m_" || bodyRaceID == "b_n_argonian_f_"; + + std::string headModel = "meshes\\" + + mEnvironment.mWorld->getStore().bodyParts.find(headID)->model; + + std::string hairModel = "meshes\\" + + mEnvironment.mWorld->getStore().bodyParts.find(hairID)->model; + + const ESM::BodyPart *upperleg = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "upper leg"); + const ESM::BodyPart *groin = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "groin"); + const ESM::BodyPart *arml = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "upper arm"); //We need two + const ESM::BodyPart *neck = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "neck"); + const ESM::BodyPart *knee = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "knee"); + const ESM::BodyPart *ankle = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "ankle"); + const ESM::BodyPart *foot = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "foot"); + const ESM::BodyPart *feet = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "feet"); + const ESM::BodyPart *tail = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "tail"); + const ESM::BodyPart *wristl = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "wrist"); //We need two + const ESM::BodyPart *forearml = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "forearm"); //We need two + const ESM::BodyPart *handl = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "hand"); //We need two + const ESM::BodyPart *hair = mEnvironment.mWorld->getStore().bodyParts.search(hairID); + const ESM::BodyPart *head = mEnvironment.mWorld->getStore().bodyParts.search(headID); + if(!handl) + handl = mEnvironment.mWorld->getStore().bodyParts.search (bodyRaceID + "hands"); + //const ESM::BodyPart* claviclel = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "clavicle"); + //const ESM::BodyPart* clavicler = claviclel; + const ESM::BodyPart* handr = handl; + const ESM::BodyPart* forearmr = forearml; + const ESM::BodyPart* wristr = wristl; + const ESM::BodyPart* armr = arml;*/ +} void Actors::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ Ogre::SceneNode* cellnode; if(mCellSceneNodes.find(ptr.getCell()) == mCellSceneNodes.end()) @@ -45,6 +111,11 @@ void Actors::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ ptr.getRefData().setBaseNode(insert); +} +void Actors::insertFreePart(const MWWorld::Ptr& ptr, const std::string& mesh){ + MeshPtr meshp = NIFLoader::load(mesh); + Entity *ent = mRend.getScene()->createEntity(mesh); + NIFLoader::getSingletonPtr()->addInMesh(ent->getMesh().getPointer()); } void Actors::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ Ogre::SceneNode* insert = ptr.getRefData().getBaseNode(); diff --git a/apps/openmw/mwrender/actors.hpp b/apps/openmw/mwrender/actors.hpp index abcc2a28b..5096c453d 100644 --- a/apps/openmw/mwrender/actors.hpp +++ b/apps/openmw/mwrender/actors.hpp @@ -7,20 +7,25 @@ #include "../mwworld/refdata.hpp" #include "../mwworld/ptr.hpp" #include +#include "components/nifogre/ogre_nif_loader.hpp" +#include "../mwworld/environment.hpp" namespace MWRender{ class Actors{ OEngine::Render::OgreRenderer &mRend; std::map mCellSceneNodes; Ogre::SceneNode* mMwRoot; + MWWorld::Environment& mEnvironment; public: - Actors(OEngine::Render::OgreRenderer& _rend): mRend(_rend){} + Actors(OEngine::Render::OgreRenderer& _rend, MWWorld::Environment& _env): mRend(_rend), mEnvironment(_env){} ~Actors(){} void setMwRoot(Ogre::SceneNode* root); void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_); void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); + void insertFreePart(const MWWorld::Ptr& ptr, const std::string& mesh); + void insertNPC(const MWWorld::Ptr& ptr); bool deleteObject (const MWWorld::Ptr& ptr); ///< \return found? diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 206dfbfd0..6f21db2b3 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -21,8 +21,8 @@ namespace MWRender { -RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine) -:mRendering(_rend), mObjects(mRendering), mDebugging(engine), mActors(mRendering) +RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine, MWWorld::Environment& environment) +:mRendering(_rend), mObjects(mRendering), mDebugging(engine), mActors(mRendering, environment) { mRendering.createScene("PlayerCam", 55, 5); mSkyManager = MWRender::SkyManager::create(mRendering.getWindow(), mRendering.getCamera(), resDir); diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 5189db870..77a1f4a55 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -54,7 +54,7 @@ class RenderingManager: private RenderingInterface { virtual MWRender::Actors& getActors(); public: - RenderingManager(OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine); + RenderingManager(OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine, MWWorld::Environment& environment); virtual ~RenderingManager(); virtual MWRender::Player& getPlayer(); /// \todo move this to private again as soon as diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 126bdaf38..6f41804c2 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -147,7 +147,7 @@ namespace MWWorld const Files::Collections& fileCollections, const std::string& master, const boost::filesystem::path& resDir, bool newGame, Environment& environment, const std::string& encoding) - : mRendering (renderer,resDir, physEng),mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), + : mRendering (renderer,resDir, physEng, environment),mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this) { mPhysEngine = physEng;