diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index ffbcf590f..465e485e4 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -14,16 +14,18 @@ set(GAMEREND mwrender/cellimp.cpp mwrender/interior.cpp mwrender/exterior.cpp - mwrender/playerpos.cpp - mwrender/sky.cpp) + mwrender/sky.cpp + mwrender/player.cpp + ) set(GAMEREND_HEADER mwrender/cell.hpp mwrender/cellimp.hpp mwrender/mwscene.hpp mwrender/interior.hpp mwrender/exterior.hpp - mwrender/playerpos.hpp - mwrender/sky.hpp) + mwrender/sky.hpp + mwrender/player.hpp + ) source_group(apps\\openmw\\mwrender FILES ${GAMEREND} ${GAMEREND_HEADER}) set(GAMEINPUT @@ -121,6 +123,7 @@ set(GAMEWORLD mwworld/actiontalk.cpp mwworld/actiontake.cpp mwworld/containerutil.cpp + mwworld/player.cpp ) set(GAMEWORLD_HEADER mwworld/refdata.hpp @@ -138,6 +141,7 @@ set(GAMEWORLD_HEADER mwworld/containerstore.hpp mwworld/manualref.hpp mwworld/containerutil.hpp + mwworld/player.hpp ) source_group(apps\\openmw\\mwworld FILES ${GAMEWORLD} ${GAMEWORLD_HEADER}) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index 9e14c119b..e6aed692a 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -29,6 +29,7 @@ #include "mwworld/ptr.hpp" #include "mwworld/environment.hpp" #include "mwworld/class.hpp" +#include "mwworld/player.hpp" #include "mwclass/classes.hpp" @@ -77,7 +78,7 @@ bool OMW::Engine::frameStarted(const Ogre::FrameEvent& evt) - MWWorld::Ptr::CellStore *current = mEnvironment.mWorld->getPlayerPos().getPlayer().getCell(); + MWWorld::Ptr::CellStore *current = mEnvironment.mWorld->getPlayer().getPlayer().getCell(); //If the region has changed if(!(current->cell->data.flags & current->cell->Interior) && timer.elapsed() >= 10){ timer.restart(); @@ -377,7 +378,7 @@ void OMW::Engine::go() } // Sets up the input system - MWInput::MWInputManager input(mOgre, mEnvironment.mWorld->getPlayerPos(), + MWInput::MWInputManager input(mOgre, mEnvironment.mWorld->getPlayer(), *mEnvironment.mWindowManager, mDebug, *this); mEnvironment.mInputManager = &input; @@ -439,7 +440,7 @@ void OMW::Engine::activate() &ptr.getRefData().getLocals(), ptr); boost::shared_ptr action = - MWWorld::Class::get (ptr).activate (ptr, mEnvironment.mWorld->getPlayerPos().getPlayer(), + MWWorld::Class::get (ptr).activate (ptr, mEnvironment.mWorld->getPlayer().getPlayer(), mEnvironment); interpreterContext.activate (ptr, action); diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index 32b33e95a..4f294ce87 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -5,8 +5,7 @@ #include -#include "../mwrender/playerpos.hpp" - +#include "../mwworld/player.hpp" #include "../mwworld/ptr.hpp" #include "../mwworld/nullaction.hpp" #include "../mwworld/actionteleport.hpp" @@ -65,7 +64,7 @@ namespace MWClass if (ref->ref.teleport) { // teleport door - if (environment.mWorld->getPlayerPos().getPlayer()==actor) + if (environment.mWorld->getPlayer().getPlayer()==actor) { // the player is using the door return boost::shared_ptr ( diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index de8b6ffff..c277832ab 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -41,7 +41,7 @@ namespace MWClass std::string hairID = ref->base->hair; std::string headID = ref->base->head; std::string npcName = ref->base->name; - std::cout << "NPC: " << npcName << "\n"; + //std::cout << "NPC: " << npcName << "\n"; //get the part of the bodypart id which describes the race and the gender std::string bodyRaceID = headID.substr(0, headID.find_last_of("head_") - 4); @@ -101,7 +101,7 @@ namespace MWClass const ESM::BodyPart *hands = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "hands.1st"); - std::cout << "RACE" << bodyRaceID << "\n"; + //std::cout << "RACE" << bodyRaceID << "\n"; Ogre::Vector3 pos2 = Ogre::Vector3( 0, .5, 75); std::string upperarmpath[2] = {npcName + "chest", npcName + "upper arm"}; @@ -118,25 +118,25 @@ namespace MWClass //addresses[1] = npcName + "groin"; if(upperleg){ - cellRender.insertMesh ("meshes\\" + upperleg->model, Ogre::Vector3( 6, 0, -14), axis, Ogre::Radian(3.14), npcName + "upper leg", addresses, numbers); //-18 - cellRender.insertMesh ("meshes\\" + upperleg->model, Ogre::Vector3( -6, 0, -14), axis, Ogre::Radian(0), npcName + "upper leg2", addresses2, numbers); + cellRender.insertMesh ("meshes\\" + upperleg->model, Ogre::Vector3( 6, 0, -16), axis, Ogre::Radian(3.14), npcName + "upper leg", addresses, numbers); //-18 + cellRender.insertMesh ("meshes\\" + upperleg->model, Ogre::Vector3( -6, 0, -16), axis, Ogre::Radian(0), npcName + "upper leg2", addresses2, numbers); addresses2[numbers] = npcName + "upper leg2"; addresses[numbers++] = npcName + "upper leg"; cellRender.scaleMesh(Ogre::Vector3(1, -1, 1), addresses, numbers); } if(knee) { - cellRender.insertMesh ("meshes\\" + knee->model, Ogre::Vector3( 0, -2, -18), axis, Ogre::Radian(0), npcName + "knee", addresses, numbers); + cellRender.insertMesh ("meshes\\" + knee->model, Ogre::Vector3( 0, -1, -23), axis, Ogre::Radian(0), npcName + "knee", addresses, numbers); //cellRender.rotateMesh(Ogre::Vector3(0, 1, 0), Ogre::Radian (1), npcName + "upper arm"); - cellRender.insertMesh ("meshes\\" + knee->model, Ogre::Vector3( 0, -2, -18), axis, Ogre::Radian(0), npcName + "knee2", addresses2, numbers); + cellRender.insertMesh ("meshes\\" + knee->model, Ogre::Vector3( 0, -1, -23), axis, Ogre::Radian(0), npcName + "knee2", addresses2, numbers); addresses2[numbers] = npcName + "knee2"; addresses[numbers++] = npcName + "knee"; } if(ankle){ - cellRender.insertMesh ("meshes\\" + ankle->model, Ogre::Vector3( 0, -1, -18), axis, Ogre::Radian(0), npcName + "ankle", addresses, numbers); //-1 - cellRender.insertMesh ("meshes\\" + ankle->model, Ogre::Vector3( 0, -1, -18), axis, Ogre::Radian(0), npcName + "ankle2", addresses2, numbers); //-1 + cellRender.insertMesh ("meshes\\" + ankle->model, Ogre::Vector3( 0, 0, -20), axis, Ogre::Radian(0), npcName + "ankle", addresses, numbers); //-1 + cellRender.insertMesh ("meshes\\" + ankle->model, Ogre::Vector3( 0,0, -20), axis, Ogre::Radian(0), npcName + "ankle2", addresses2, numbers); //-1 addresses2[numbers] = npcName + "ankle2"; addresses[numbers++] = npcName + "ankle"; diff --git a/apps/openmw/mwclass/npc.hpp b/apps/openmw/mwclass/npc.hpp index d030da20a..946c30733 100644 --- a/apps/openmw/mwclass/npc.hpp +++ b/apps/openmw/mwclass/npc.hpp @@ -5,8 +5,6 @@ namespace MWClass { - static bool isChest; - //static ;bool isChest = false; class Npc : public MWWorld::Class { public: diff --git a/apps/openmw/mwdialogue/dialoguemanager.cpp b/apps/openmw/mwdialogue/dialoguemanager.cpp index 0f6e73276..f78160cd7 100644 --- a/apps/openmw/mwdialogue/dialoguemanager.cpp +++ b/apps/openmw/mwdialogue/dialoguemanager.cpp @@ -13,6 +13,7 @@ #include "../mwworld/environment.hpp" #include "../mwworld/world.hpp" #include "../mwworld/refdata.hpp" +#include "../mwworld/player.hpp" #include "../mwinput/inputmanager.hpp" @@ -225,7 +226,7 @@ namespace MWDialogue // check cell if (!info.cell.empty()) - if (mEnvironment.mWorld->getPlayerPos().getPlayer().getCell()->cell->name != info.cell) + if (mEnvironment.mWorld->getPlayer().getPlayer().getCell()->cell->name != info.cell) return false; // TODO check DATAstruct diff --git a/apps/openmw/mwgui/layouts.cpp b/apps/openmw/mwgui/layouts.cpp index 501b234d1..581a5a576 100644 --- a/apps/openmw/mwgui/layouts.cpp +++ b/apps/openmw/mwgui/layouts.cpp @@ -4,6 +4,7 @@ #include "../mwmechanics/mechanicsmanager.hpp" #include "../mwgui/window_manager.hpp" +#include #include #include #include diff --git a/apps/openmw/mwgui/review.cpp b/apps/openmw/mwgui/review.cpp index 9eb6092ce..456849ed3 100644 --- a/apps/openmw/mwgui/review.cpp +++ b/apps/openmw/mwgui/review.cpp @@ -8,6 +8,8 @@ #include #include +#include + using namespace MWGui; using namespace Widgets; diff --git a/apps/openmw/mwinput/inputmanager.cpp b/apps/openmw/mwinput/inputmanager.cpp index 0544df6f0..31623fb58 100644 --- a/apps/openmw/mwinput/inputmanager.cpp +++ b/apps/openmw/mwinput/inputmanager.cpp @@ -15,10 +15,13 @@ #include #include -#include "../mwrender/playerpos.hpp" #include "../engine.hpp" +#include "../mwworld/player.hpp" + +#include "../mwrender/player.hpp" + #include #include #include @@ -58,7 +61,7 @@ namespace MWInput OEngine::Input::Poller poller; OEngine::Render::MouseLookEventPtr mouse; OEngine::GUI::EventInjectorPtr guiEvents; - MWRender::PlayerPos &player; + MWWorld::Player &player; MWGui::WindowManager &windows; OMW::Engine& mEngine; @@ -124,7 +127,7 @@ namespace MWInput public: InputImpl(OEngine::Render::OgreRenderer &_ogre, - MWRender::PlayerPos &_player, + MWWorld::Player &_player, MWGui::WindowManager &_windows, bool debug, OMW::Engine& engine) @@ -164,7 +167,7 @@ namespace MWInput ogre.getRoot()->addFrameListener(this); // Set up the mouse handler and tell it about the player camera - mouse = MouseLookEventPtr(new MouseLookEvent(player.getCamera())); + mouse = MouseLookEventPtr(new MouseLookEvent(player.getRenderer()->getCamera())); // This event handler pumps events into MyGUI guiEvents = EventInjectorPtr(new EventInjector(windows.getGui())); @@ -277,7 +280,7 @@ namespace MWInput { // Start mouse-looking again. TODO: This should also allow // for other ways to disable mouselook, like paralyzation. - mouse->setCamera(player.getCamera()); + mouse->setCamera(player.getRenderer()->getCamera()); // Disable GUI events guiEvents->enabled = false; @@ -286,7 +289,7 @@ namespace MWInput }; MWInputManager::MWInputManager(OEngine::Render::OgreRenderer &ogre, - MWRender::PlayerPos &player, + MWWorld::Player &player, MWGui::WindowManager &windows, bool debug, OMW::Engine& engine) @@ -300,7 +303,7 @@ namespace MWInput } void MWInputManager::setGuiMode(MWGui::GuiMode mode) - { + { impl->setGuiMode(mode); } } diff --git a/apps/openmw/mwinput/inputmanager.hpp b/apps/openmw/mwinput/inputmanager.hpp index 0e0c4650f..6b8034c8b 100644 --- a/apps/openmw/mwinput/inputmanager.hpp +++ b/apps/openmw/mwinput/inputmanager.hpp @@ -11,9 +11,9 @@ namespace OEngine } } -namespace MWRender +namespace MWWorld { - class PlayerPos; + class Player; } namespace MWGui @@ -42,7 +42,7 @@ namespace MWInput public: MWInputManager(OEngine::Render::OgreRenderer &_ogre, - MWRender::PlayerPos &_player, + MWWorld::Player&_player, MWGui::WindowManager &_windows, bool debug, OMW::Engine& engine); diff --git a/apps/openmw/mwmechanics/mechanicsmanager.cpp b/apps/openmw/mwmechanics/mechanicsmanager.cpp index 23c0fe3b4..05219d6aa 100644 --- a/apps/openmw/mwmechanics/mechanicsmanager.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanager.cpp @@ -8,12 +8,13 @@ #include "../mwworld/class.hpp" #include "../mwworld/environment.hpp" #include "../mwworld/world.hpp" +#include "../mwworld/player.hpp" namespace MWMechanics { void MechanicsManager::buildPlayer() { - MWWorld::Ptr ptr = mEnvironment.mWorld->getPlayerPos().getPlayer(); + MWWorld::Ptr ptr = mEnvironment.mWorld->getPlayer().getPlayer(); MWMechanics::CreatureStats& creatureStats = MWWorld::Class::get (ptr).getCreatureStats (ptr); MWMechanics::NpcStats& npcStats = MWWorld::Class::get (ptr).getNpcStats (ptr); @@ -33,9 +34,9 @@ namespace MWMechanics { const ESM::Race *race = mEnvironment.mWorld->getStore().races.find ( - mEnvironment.mWorld->getPlayerPos().getRace()); + mEnvironment.mWorld->getPlayer().getRace()); - bool male = mEnvironment.mWorld->getPlayerPos().isMale(); + bool male = mEnvironment.mWorld->getPlayer().isMale(); for (int i=0; i<8; ++i) { @@ -75,11 +76,11 @@ namespace MWMechanics } // birthsign - if (!mEnvironment.mWorld->getPlayerPos().getBirthsign().empty()) + if (!mEnvironment.mWorld->getPlayer().getBirthsign().empty()) { const ESM::BirthSign *sign = mEnvironment.mWorld->getStore().birthSigns.find ( - mEnvironment.mWorld->getPlayerPos().getBirthsign()); + mEnvironment.mWorld->getPlayer().getBirthsign()); for (std::vector::const_iterator iter (sign->powers.list.begin()); iter!=sign->powers.list.end(); ++iter) @@ -91,7 +92,7 @@ namespace MWMechanics // class if (mClassSelected) { - const ESM::Class& class_ = mEnvironment.mWorld->getPlayerPos().getClass(); + const ESM::Class& class_ = mEnvironment.mWorld->getPlayer().getClass(); for (int i=0; i<2; ++i) { @@ -330,12 +331,12 @@ namespace MWMechanics if (mUpdatePlayer) { // basic player profile; should not change anymore after the creation phase is finished. - mEnvironment.mWindowManager->setValue ("name", mEnvironment.mWorld->getPlayerPos().getName()); + mEnvironment.mWindowManager->setValue ("name", mEnvironment.mWorld->getPlayer().getName()); mEnvironment.mWindowManager->setValue ("race", - mEnvironment.mWorld->getStore().races.find (mEnvironment.mWorld->getPlayerPos(). + mEnvironment.mWorld->getStore().races.find (mEnvironment.mWorld->getPlayer(). getRace())->name); mEnvironment.mWindowManager->setValue ("class", - mEnvironment.mWorld->getPlayerPos().getClass().name); + mEnvironment.mWorld->getPlayer().getClass().name); mUpdatePlayer = false; MWGui::WindowManager::SkillList majorSkills (5); @@ -343,8 +344,8 @@ namespace MWMechanics for (int i=0; i<5; ++i) { - minorSkills[i] = mEnvironment.mWorld->getPlayerPos().getClass().data.skills[i][0]; - majorSkills[i] = mEnvironment.mWorld->getPlayerPos().getClass().data.skills[i][1]; + minorSkills[i] = mEnvironment.mWorld->getPlayer().getClass().data.skills[i][0]; + majorSkills[i] = mEnvironment.mWorld->getPlayer().getClass().data.skills[i][1]; } mEnvironment.mWindowManager->configureSkills (majorSkills, minorSkills); @@ -353,14 +354,14 @@ namespace MWMechanics void MechanicsManager::setPlayerName (const std::string& name) { - mEnvironment.mWorld->getPlayerPos().setName (name); + mEnvironment.mWorld->getPlayer().setName (name); mUpdatePlayer = true; } void MechanicsManager::setPlayerRace (const std::string& race, bool male) { - mEnvironment.mWorld->getPlayerPos().setGender (male); - mEnvironment.mWorld->getPlayerPos().setRace (race); + mEnvironment.mWorld->getPlayer().setGender (male); + mEnvironment.mWorld->getPlayer().setRace (race); mRaceSelected = true; buildPlayer(); mUpdatePlayer = true; @@ -368,14 +369,14 @@ namespace MWMechanics void MechanicsManager::setPlayerBirthsign (const std::string& id) { - mEnvironment.mWorld->getPlayerPos().setBirthsign (id); + mEnvironment.mWorld->getPlayer().setBirthsign (id); buildPlayer(); mUpdatePlayer = true; } void MechanicsManager::setPlayerClass (const std::string& id) { - mEnvironment.mWorld->getPlayerPos().setClass (*mEnvironment.mWorld->getStore().classes.find (id)); + mEnvironment.mWorld->getPlayer().setClass (*mEnvironment.mWorld->getStore().classes.find (id)); mClassSelected = true; buildPlayer(); mUpdatePlayer = true; @@ -383,7 +384,7 @@ namespace MWMechanics void MechanicsManager::setPlayerClass (const ESM::Class& class_) { - mEnvironment.mWorld->getPlayerPos().setClass (class_); + mEnvironment.mWorld->getPlayer().setClass (class_); mClassSelected = true; buildPlayer(); mUpdatePlayer = true; diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp index 28986d6d7..d3bc680bf 100644 --- a/apps/openmw/mwrender/exterior.cpp +++ b/apps/openmw/mwrender/exterior.cpp @@ -115,8 +115,15 @@ void ExteriorCellRender::insertMesh(const std::string &mesh, Ogre::Vector3 vec, MovableObject *ent = scene.getMgr()->createEntity(mesh); + if(translateFirst){ npcPart->translate(vec); npcPart->rotate(axis, angle); + } + else{ + + npcPart->rotate(axis, angle); + npcPart->translate(vec); + } npcPart->attachObject(ent); Ogre::MeshManager *m = MeshManager::getSingletonPtr(); diff --git a/apps/openmw/mwrender/mwscene.cpp b/apps/openmw/mwrender/mwscene.cpp index 133607797..5fff2c295 100644 --- a/apps/openmw/mwrender/mwscene.cpp +++ b/apps/openmw/mwrender/mwscene.cpp @@ -13,6 +13,8 @@ #include "../mwworld/ptr.hpp" #include +#include "player.hpp" + using namespace MWRender; using namespace Ogre; @@ -38,6 +40,13 @@ MWScene::MWScene(OEngine::Render::OgreRenderer &_rend) //used to obtain ingame information of ogre objects (which are faced or selected) mRaySceneQuery = rend.getScene()->createRayQuery(Ray()); + + mPlayer = new MWRender::Player (getCamera()); +} + +MWScene::~MWScene() +{ + delete mPlayer; } std::pair MWScene::getFacedHandle (MWWorld::World& world) diff --git a/apps/openmw/mwrender/mwscene.hpp b/apps/openmw/mwrender/mwscene.hpp index 9d2a51bae..b4c8357cf 100644 --- a/apps/openmw/mwrender/mwscene.hpp +++ b/apps/openmw/mwrender/mwscene.hpp @@ -20,36 +20,41 @@ namespace MWWorld namespace MWRender { - /** Class responsible for Morrowind-specific interfaces to OGRE. + class Player; - This might be refactored partially into a non-mw specific - counterpart in ogre/ at some point. - */ - class MWScene - { - OEngine::Render::OgreRenderer &rend; + /// \brief 3D-scene (rendering and physics) - // Root node for all objects added to the scene. This is rotated so - // that the OGRE coordinate system matches that used internally in - // Morrowind. - Ogre::SceneNode *mwRoot; - Ogre::RaySceneQuery *mRaySceneQuery; + class MWScene + { + OEngine::Render::OgreRenderer &rend; - public: - MWScene(OEngine::Render::OgreRenderer &_rend); + /// Root node for all objects added to the scene. This is rotated so + /// that the OGRE coordinate system matches that used internally in + /// Morrowind. + Ogre::SceneNode *mwRoot; + Ogre::RaySceneQuery *mRaySceneQuery; - Ogre::Camera *getCamera() { return rend.getCamera(); } - Ogre::SceneNode *getRoot() { return mwRoot; } - Ogre::SceneManager *getMgr() { return rend.getScene(); } - Ogre::Viewport *getViewport() { return rend.getViewport(); } - Ogre::RaySceneQuery *getRaySceneQuery() { return mRaySceneQuery; } + MWRender::Player *mPlayer; - //gets the handle of the object the player is looking at - //pair - //name is empty and distance = -1 if there is no object which - //can be faced - std::pair getFacedHandle (MWWorld::World& world); - }; + public: + + MWScene (OEngine::Render::OgreRenderer &_rend); + + ~MWScene(); + + Ogre::Camera *getCamera() { return rend.getCamera(); } + Ogre::SceneNode *getRoot() { return mwRoot; } + Ogre::SceneManager *getMgr() { return rend.getScene(); } + Ogre::Viewport *getViewport() { return rend.getViewport(); } + Ogre::RaySceneQuery *getRaySceneQuery() { return mRaySceneQuery; } + MWRender::Player *getPlayer() { return mPlayer; } + + /// Gets the handle of the object the player is looking at + /// pair + /// name is empty and distance = -1 if there is no object which + /// can be faced + std::pair getFacedHandle (MWWorld::World& world); + }; } #endif diff --git a/apps/openmw/mwrender/player.cpp b/apps/openmw/mwrender/player.cpp new file mode 100644 index 000000000..badc77bda --- /dev/null +++ b/apps/openmw/mwrender/player.cpp @@ -0,0 +1,8 @@ + +#include "player.hpp" + +namespace MWRender +{ + Player::Player (Ogre::Camera *camera) : mCamera (camera) + {} +} diff --git a/apps/openmw/mwrender/player.hpp b/apps/openmw/mwrender/player.hpp new file mode 100644 index 000000000..a8f8d24fe --- /dev/null +++ b/apps/openmw/mwrender/player.hpp @@ -0,0 +1,24 @@ +#ifndef GAME_MWRENDER_PLAYER_H +#define GAME_MWRENDER_PLAYER_H + +namespace Ogre +{ + class Camera; +} + +namespace MWRender +{ + /// \brief Player character rendering and camera control + class Player + { + Ogre::Camera *mCamera; + + public: + + Player (Ogre::Camera *camera); + + Ogre::Camera *getCamera() { return mCamera; } + }; +} + +#endif diff --git a/apps/openmw/mwrender/playerpos.cpp b/apps/openmw/mwrender/playerpos.cpp deleted file mode 100644 index a1410e57b..000000000 --- a/apps/openmw/mwrender/playerpos.cpp +++ /dev/null @@ -1,41 +0,0 @@ - -#include "playerpos.hpp" - -#include "../mwworld/world.hpp" - -namespace MWRender -{ - PlayerPos::PlayerPos (Ogre::Camera *cam, const ESM::NPC *player, MWWorld::World& world) : - mCellStore (0), camera(cam), mWorld (world), mClass (0) - { - mPlayer.base = player; - mName = player->name; - mMale = !(player->flags & ESM::NPC::Female); - mRace = player->race; - mPlayer.ref.pos.pos[0] = mPlayer.ref.pos.pos[1] = mPlayer.ref.pos.pos[2] = 0; - mClass = new ESM::Class (*world.getStore().classes.find (player->cls)); - } - - PlayerPos::~PlayerPos() - { - delete mClass; - } - - void PlayerPos::setPos(float x, float y, float z, bool updateCamera) - { - mWorld.moveObject (getPlayer(), x, y, z); - - if (updateCamera) - camera->setPosition (Ogre::Vector3 ( - mPlayer.ref.pos.pos[0], - mPlayer.ref.pos.pos[2], - -mPlayer.ref.pos.pos[1])); - } - - void PlayerPos::setClass (const ESM::Class& class_) - { - ESM::Class *new_class = new ESM::Class (class_); - delete mClass; - mClass = new_class; - } -} diff --git a/apps/openmw/mwrender/playerpos.hpp b/apps/openmw/mwrender/playerpos.hpp deleted file mode 100644 index b694a72c3..000000000 --- a/apps/openmw/mwrender/playerpos.hpp +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef _MWRENDER_PLAYERPOS_H -#define _MWRENDER_PLAYERPOS_H - -#include "OgreCamera.h" - -#include - -#include "../mwworld/refdata.hpp" -#include "../mwworld/ptr.hpp" - -namespace MWWorld -{ - class World; -} - -namespace MWRender -{ - // This class keeps track of the player position. It takes care of - // camera movement, sound listener updates, and collision handling - // (to be done). - class PlayerPos - { - ESMS::LiveCellRef mPlayer; - MWWorld::Ptr::CellStore *mCellStore; - Ogre::Camera *camera; - MWWorld::World& mWorld; - std::string mName; - bool mMale; - std::string mRace; - std::string mBirthsign; - ESM::Class *mClass; - - public: - - PlayerPos(Ogre::Camera *cam, const ESM::NPC *player, MWWorld::World& world); - - ~PlayerPos(); - - // Set the player position. Uses Morrowind coordinates. - void setPos(float _x, float _y, float _z, bool updateCamera = false); - - void setCell (MWWorld::Ptr::CellStore *cellStore) - { - mCellStore = cellStore; - } - - Ogre::Camera *getCamera() { return camera; } - - // Move the player relative to her own position and - // orientation. After the call, the new position is returned. - void moveRel(float &relX, float &relY, float &relZ) - { - using namespace Ogre; - - // Move camera relative to its own direction - camera->moveRelative(Vector3(relX,0,relZ)); - - // Up/down movement is always done relative the world axis. - camera->move(Vector3(0,relY,0)); - - // Get new camera position, converting back to MW coords. - Vector3 pos = camera->getPosition(); - relX = pos[0]; - relY = -pos[2]; - relZ = pos[1]; - - // TODO: Collision detection must be used to find the REAL new - // position. - - // Set the position - setPos(relX, relY, relZ); - } - - MWWorld::Ptr getPlayer() - { - MWWorld::Ptr ptr (&mPlayer, mCellStore); - return ptr; - } - - void setName (const std::string& name) - { - mName = name; - } - - void setGender (bool male) - { - mMale = male; - } - - void setRace (const std::string& race) - { - mRace = race; - } - - void setBirthsign (const std::string& birthsign) - { - mBirthsign = birthsign; - } - - void setClass (const ESM::Class& class_); - - std::string getName() const - { - return mName; - } - - bool isMale() const - { - return mMale; - } - - std::string getRace() const - { - return mRace; - } - - std::string getBirthsign() const - { - return mBirthsign; - } - - const ESM::Class& getClass() const - { - return *mClass; - } - }; -} -#endif diff --git a/apps/openmw/mwworld/player.cpp b/apps/openmw/mwworld/player.cpp new file mode 100644 index 000000000..1c27dbe77 --- /dev/null +++ b/apps/openmw/mwworld/player.cpp @@ -0,0 +1,64 @@ + +#include "player.hpp" + +#include "../mwrender/player.hpp" + +#include "world.hpp" + +namespace MWWorld +{ + Player::Player (MWRender::Player *renderer, const ESM::NPC *player, MWWorld::World& world) : + mCellStore (0), mRenderer (renderer), mWorld (world), mClass (0) + { + mPlayer.base = player; + mName = player->name; + mMale = !(player->flags & ESM::NPC::Female); + mRace = player->race; + mPlayer.ref.pos.pos[0] = mPlayer.ref.pos.pos[1] = mPlayer.ref.pos.pos[2] = 0; + mClass = new ESM::Class (*world.getStore().classes.find (player->cls)); + } + + Player::~Player() + { + delete mClass; + } + + void Player::setPos(float x, float y, float z, bool updateCamera) + { + mWorld.moveObject (getPlayer(), x, y, z); + + if (updateCamera) + mRenderer->getCamera()->setPosition (Ogre::Vector3 ( + mPlayer.ref.pos.pos[0], + mPlayer.ref.pos.pos[2], + -mPlayer.ref.pos.pos[1])); + } + + void Player::moveRel (float &relX, float &relY, float &relZ) + { + // Move camera relative to its own direction + mRenderer->getCamera()->moveRelative (Ogre::Vector3(relX,0,relZ)); + + // Up/down movement is always done relative the world axis. + mRenderer->getCamera()->move (Ogre::Vector3(0,relY,0)); + + // Get new camera position, converting back to MW coords. + Ogre::Vector3 pos = mRenderer->getCamera()->getPosition(); + relX = pos[0]; + relY = -pos[2]; + relZ = pos[1]; + + // TODO: Collision detection must be used to find the REAL new + // position. + + // Set the position + setPos(relX, relY, relZ); + } + + void Player::setClass (const ESM::Class& class_) + { + ESM::Class *new_class = new ESM::Class (class_); + delete mClass; + mClass = new_class; + } +} diff --git a/apps/openmw/mwworld/player.hpp b/apps/openmw/mwworld/player.hpp new file mode 100644 index 000000000..27bc3138b --- /dev/null +++ b/apps/openmw/mwworld/player.hpp @@ -0,0 +1,107 @@ +#ifndef GAME_MWWORLD_PLAYER_H +#define GAME_MWWORLD_PLAYER_H + +#include "OgreCamera.h" + +#include + +#include "../mwworld/refdata.hpp" +#include "../mwworld/ptr.hpp" + +namespace MWRender +{ + class Player; +} + +namespace MWWorld +{ + class World; + + /// \brief NPC object representing the player and additional player data + class Player + { + ESMS::LiveCellRef mPlayer; + MWWorld::Ptr::CellStore *mCellStore; + MWRender::Player *mRenderer; + MWWorld::World& mWorld; + std::string mName; + bool mMale; + std::string mRace; + std::string mBirthsign; + ESM::Class *mClass; + + public: + + Player(MWRender::Player *renderer, const ESM::NPC *player, MWWorld::World& world); + + ~Player(); + + /// Set the player position. Uses Morrowind coordinates. + void setPos(float _x, float _y, float _z, bool updateCamera = false); + + void setCell (MWWorld::Ptr::CellStore *cellStore) + { + mCellStore = cellStore; + } + + /// Move the player relative to her own position and + /// orientation. After the call, the new position is returned. + void moveRel (float &relX, float &relY, float &relZ); + + MWWorld::Ptr getPlayer() + { + MWWorld::Ptr ptr (&mPlayer, mCellStore); + return ptr; + } + + MWRender::Player *getRenderer() { return mRenderer; } + + void setName (const std::string& name) + { + mName = name; + } + + void setGender (bool male) + { + mMale = male; + } + + void setRace (const std::string& race) + { + mRace = race; + } + + void setBirthsign (const std::string& birthsign) + { + mBirthsign = birthsign; + } + + void setClass (const ESM::Class& class_); + + std::string getName() const + { + return mName; + } + + bool isMale() const + { + return mMale; + } + + std::string getRace() const + { + return mRace; + } + + std::string getBirthsign() const + { + return mBirthsign; + } + + const ESM::Class& getClass() const + { + return *mClass; + } + }; +} +#endif diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 317dc2361..d8d7b3d6a 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -17,7 +17,7 @@ #include "ptr.hpp" #include "environment.hpp" #include "class.hpp" - +#include "player.hpp" #include "refdata.hpp" #include "globals.hpp" @@ -296,12 +296,12 @@ namespace MWWorld void World::playerCellChange (Ptr::CellStore *cell, const ESM::Position& position) { - mPlayerPos->setPos (position.pos[0], position.pos[1], position.pos[2], true); - mPlayerPos->setCell (cell); + mPlayer->setPos (position.pos[0], position.pos[1], position.pos[2], true); + mPlayer->setCell (cell); // TODO orientation - mEnvironment.mMechanicsManager->addActor (mPlayerPos->getPlayer()); - mEnvironment.mMechanicsManager->watchActor (mPlayerPos->getPlayer()); + mEnvironment.mMechanicsManager->addActor (mPlayer->getPlayer()); + mEnvironment.mMechanicsManager->watchActor (mPlayer->getPlayer()); } @@ -317,7 +317,7 @@ namespace MWWorld World::World (OEngine::Render::OgreRenderer& renderer, const boost::filesystem::path& dataDir, const std::string& master, bool newGame, Environment& environment) - : mSkyManager (0), mScene (renderer), mPlayerPos (0), mCurrentCell (0), mGlobalVariables (0), + : mSkyManager (0), mScene (renderer), mPlayer (0), mCurrentCell (0), mGlobalVariables (0), mSky (false), mCellChanged (false), mEnvironment (environment) { boost::filesystem::path masterPath (dataDir); @@ -329,7 +329,7 @@ namespace MWWorld mEsm.open (masterPath.file_string()); mStore.load (mEsm); - mPlayerPos = new MWRender::PlayerPos (mScene.getCamera(), mStore.npcs.find ("player"), *this); + mPlayer = new MWWorld::Player (mScene.getPlayer(), mStore.npcs.find ("player"), *this); // global variables mGlobalVariables = new Globals (mStore); @@ -354,14 +354,14 @@ namespace MWWorld iter!=mBufferedCells.end(); ++iter) delete iter->second; - delete mPlayerPos; + delete mPlayer; delete mSkyManager; delete mGlobalVariables; } - MWRender::PlayerPos& World::getPlayerPos() + MWWorld::Player& World::getPlayer() { - return *mPlayerPos; + return *mPlayer; } ESMS::ESMStore& World::getStore() @@ -394,7 +394,7 @@ namespace MWWorld // the player is always in an active cell. if (name=="player") { - return mPlayerPos->getPlayer(); + return mPlayer->getPlayer(); } // active cells @@ -763,7 +763,7 @@ namespace MWWorld ptr.getCellRef().pos.pos[1] = y; ptr.getCellRef().pos.pos[2] = z; - if (ptr==mPlayerPos->getPlayer()) + if (ptr==mPlayer->getPlayer()) { if (mCurrentCell) { @@ -777,7 +777,7 @@ namespace MWWorld if (mCurrentCell->cell->data.gridX!=cellX || mCurrentCell->cell->data.gridY!=cellY) { - changeCell (cellX, cellY, mPlayerPos->getPlayer().getCellRef().pos); + changeCell (cellX, cellY, mPlayer->getPlayer().getCellRef().pos); } } } @@ -800,7 +800,7 @@ namespace MWWorld } } - + void World::positionToIndex (float x, float y, int &cellX, int &cellY) const { diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index f774cd68e..b2b80a847 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -8,7 +8,6 @@ #include -#include "../mwrender/playerpos.hpp" #include "../mwrender/mwscene.hpp" #include "refdata.hpp" @@ -34,12 +33,13 @@ namespace MWRender namespace MWWorld { class Environment; + class Player; /// \brief The game world and its visual representation class World { - + public: typedef std::list > ScriptList; @@ -49,7 +49,7 @@ namespace MWWorld MWRender::SkyManager* mSkyManager; MWRender::MWScene mScene; - MWRender::PlayerPos *mPlayerPos; + MWWorld::Player *mPlayer; Ptr::CellStore *mCurrentCell; // the cell, the player is in CellRenderCollection mActiveCells; CellRenderCollection mBufferedCells; // loaded, but not active (buffering not implementd yet) @@ -94,7 +94,7 @@ namespace MWWorld ~World(); - MWRender::PlayerPos& getPlayerPos(); + MWWorld::Player& getPlayer(); ESMS::ESMStore& getStore(); diff --git a/components/nifogre/oldnpccode.txt b/components/nifogre/oldnpccode.txt deleted file mode 100644 index eec9ef11e..000000000 --- a/components/nifogre/oldnpccode.txt +++ /dev/null @@ -1,256 +0,0 @@ -/* //This is old - if (pieces > 1){ //pieces > 1 - MeshPtr justChest = MeshManager::getSingleton().createManual("justchest", group, NIFLoader::getSingletonPtr()); - Ogre::AxisAlignedBox bounds = resize->getBounds(); - Ogre::Vector3 width2 = bounds.getCorner(bounds.NEAR_RIGHT_BOTTOM) - bounds.getCorner(bounds.NEAR_LEFT_BOTTOM); - Ogre::Vector3 depth2 = (bounds.getCorner(bounds.FAR_LEFT_BOTTOM) - bounds.getCorner(bounds.NEAR_LEFT_BOTTOM)); - Ogre::Vector3 height2 = bounds.getCorner(bounds.NEAR_LEFT_TOP) - bounds.getCorner(bounds.NEAR_LEFT_BOTTOM); - cout << "Width:" << width2; cout << "Height:" << height2; cout << "Depth:" << depth2; - /*int width = bounds.getMaximum().x - bounds.getMinimum().x; - int height = bounds.getMaximum().y - bounds.getMinimum().y; - int depth = bounds.getMaximum().z - bounds.getMinimum().z; - int xinc = width / pieces; - int yinc = height / pieces; - int zinc = depth / pieces; - int xmincorner = bounds.getMinimum().x + xinc*pieceIndex; - int ymincorner = bounds.getMinimum().y + yinc*pieceIndex; - int zmincorner = bounds.getMinimum().z + xinc*pieceIndex;*/ - //Ogre::Vector3 bottom_left = bounds.getCorner(bounds.NEAR_LEFT_BOTTOM) + (width2 / pieces) * pieceIndex; //width2 - //Ogre::Vector3 top_right = bottom_left + (width2 / pieces) + height2 + depth2; - //Ogre::AxisAlignedBox set = AxisAlignedBox ( Ogre::Vector3(xmincorner, bounds.getMinimum().y, bounds.getMinimum().z), Ogre::Vector3(xmincorner + xinc, bounds.getMaximum().y, bounds.getMaximum().z)); - //Ogre::AxisAlignedBox set = bounds;//AxisAlignedBox(bottom_left, top_right); - //bounds.setMinimumX(xmincorner); - //bounds.setMaximumX(xmincorner + xinc); - //bounds.setMinimumY(ymincorner); - //bounds.setMaximumY(ymincorner + yinc); - //bounds.setMinimumZ(zmincorner); - //bounds.setMaximumZ(zmincorner + zinc); - //bounds.setMinimumY(bounds.getMinimum().y); - //bounds.setMaximumY( bounds.getMaximum().y; - //resize->_setBounds(set, true); - //resize->reload(); - - //Ogre::Mesh::SubMeshIterator subMeshIterator = resize->getSubMeshIterator(); - /*Ogre::Vector3* point; - Ogre::SubMesh* subMesh; - - - - size_t vertex_count = 0; - Vector3* vertices; - size_t index_count = 0; - unsigned* indices; - Vector3 position = Vector3::ZERO; - Quaternion orient = Quaternion::IDENTITY; - Vector3 scale = Vector3::UNIT_SCALE; - - - // int vertex_count = 0; - //int index_count = 0; - - bool added_shared = false; - size_t current_offset = vertex_count; - size_t shared_offset = vertex_count; - size_t next_offset = vertex_count; - size_t index_offset = index_count; - size_t prev_vert = vertex_count; - size_t prev_ind = index_count; - // Calculate how many vertices and indices we're going to need - /* - std::cout <<"FIRST CYCLE\n"; - for(int i = 0;i < resize->getNumSubMeshes();i++) - { - std::cout<< "WEHAVEMESHES\n"; - SubMesh* submesh = resize->getSubMesh(i); - - // We only need to add the shared vertices once - if(submesh->useSharedVertices) - { - if(!added_shared) - { - VertexData* vertex_data = resize->sharedVertexData; - vertex_count += vertex_data->vertexCount; - added_shared = true; - } - } - else - { - VertexData* vertex_data = submesh->vertexData; - vertex_count += vertex_data->vertexCount; - } - - // Add the indices - Ogre::IndexData* index_data = submesh->indexData; - index_count += index_data->indexCount; - } - - */ -// Vector3* vertices; - // Allocate space for the vertices and indices - /*vertices = new Vector3[vertex_count]; - indices = new unsigned[index_count]; - - int meshcounter = 0; - added_shared = false; - std::cout <<"SECOND CYCLE: " << resize->getNumSubMeshes() << "\n"; - // Run through the submeshes again, adding the data into the arrays - int i; - for(i = 0;i < resize->getNumSubMeshes();i++) - { - - SubMesh* submesh = resize->getSubMesh(i); - - Ogre::VertexData* vertex_data = submesh->useSharedVertices ? resize->sharedVertexData : submesh->vertexData; - /* - if((!submesh->useSharedVertices)||(submesh->useSharedVertices && !added_shared)) - { - if(submesh->useSharedVertices) - { - added_shared = true; - shared_offset = current_offset; - } - - const Ogre::VertexElement* posElem = vertex_data->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION); - Ogre::HardwareVertexBufferSharedPtr vbuf = vertex_data->vertexBufferBinding->getBuffer(posElem->getSource()); - unsigned char* vertex = static_cast(vbuf->lock(Ogre::HardwareBuffer::HBL_NORMAL)); - Ogre::Real* pReal; - - bool onepointexists = true; - Vector3 lastpoint; - for(size_t j = 0; j < vertex_data->vertexCount; ++j, vertex += vbuf->getVertexSize()) - { - posElem->baseVertexPointerToElement(vertex, &pReal); - - Vector3 pt; - pt.x = (*(pReal++)); - pt.y = (*(pReal++)); - pt.z = (*(pReal++)); - //cout << "X:" << pt.x << "Y:" <getMaterialName() << "\n"; - - if(meshcounter <= 2) - resize->destroySubMesh(i); - else if(meshcounter > 3 && meshcounter < 7) - resize->destroySubMesh(i); - //submesh->setMaterialName("BaseWhiteNoLighting"); //red - //submesh->updateMaterialUsingTextureAliases(); - //resize-> - meshcounter++; - //delete submesh; - //reakb; - }*/ - /* - vbuf->unlock(); - next_offset += vertex_data->vertexCount; - } - - Ogre::IndexData* index_data = submesh->indexData; - - size_t numTris = index_data->indexCount / 3; - unsigned short* pShort; - unsigned int* pInt; - Ogre::HardwareIndexBufferSharedPtr ibuf = index_data->indexBuffer; - bool use32bitindexes = (ibuf->getType() == Ogre::HardwareIndexBuffer::IT_32BIT); - if (use32bitindexes) pInt = static_cast(ibuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY)); - else pShort = static_cast(ibuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY)); - - for(size_t k = 0; k < numTris; ++k) - { - size_t offset = (submesh->useSharedVertices)?shared_offset:current_offset; - - unsigned int vindex = use32bitindexes? *pInt++ : *pShort++; - indices[index_offset + 0] = vindex + offset; - vindex = use32bitindexes? *pInt++ : *pShort++; - indices[index_offset + 1] = vindex + offset; - vindex = use32bitindexes? *pInt++ : *pShort++; - indices[index_offset + 2] = vindex + offset; - - index_offset += 3; - } - ibuf->unlock(); - current_offset = next_offset;*/ - //if (i == 3) //i!=3 i!=5 - //{ - //cout << "RETURNINGJUST\n"; - //SubMesh* test = - //test = resize->getSubMesh(i); - // cout << "s:" << shape << "\n"; - //NiTriShapeData *data = shape->data.getPtr(); - // SubMesh *sub = justChest->createSubMesh(name + "2"); - //sub = resize->getSubMesh(i); - - // int nextBuf = 0; - - // This function is just one long stream of Ogre-barf, but it works - // great. - - // Add vertices - //int numVerts = data->vertices.length / 3; - //sub->vertexData = new VertexData(); - //sub->vertexData->vertexCount = numVerts; - - //justChest->load(); - //return resize; - //} - // 0 hand thumb - // 1 hand thumb no chest on dunmer - //} - //resize->destroySubMesh(1); - /* while (subMeshIterator.hasMoreElements()) - { - resize->getNum - //resize->d - std::cout << "CHEST"; - subMesh = subMeshIterator.getNext();*/ - //std::vector::type test = - //std::vector::iterator fileIter = subMesh->extremityPoints.begin(); - - //std::vector::type test = subMesh->extremityPoints; - //void* pData = subMesh->vertexData->vertexBufferBinding->getBuffer(1)->lock(0, 1000, HardwareBuffer::HBL_DISCARD); - - - // if(set.contains( subMesh->vertexData->vertexStart)) - //delete subMesh; - //subMeshIterator.getNext(); - //delete[] subMesh; - //subMesh->extremityPoints.clear(); - //subMesh->mLodFaceList.clear(); - //resize->destroySubMesh(subMesh->indexData->indexStart); - //resize->destroySubMesh(subMesh->indexData->); - //subMesh-> - //std::cout << "THIS" << subMesh; - ///} - //subMesh->vertexData->vertexBufferBinding->getBuffer(0)->readData(subMesh->vertexData->vertexStart, sizeof Ogre::Vector3, point); - - - - //boost::filesystem::directory_iterator dir_iter(dir), dir_end; - - //return resize;