diff --git a/apps/openmw/mwgui/layouts.hpp b/apps/openmw/mwgui/layouts.hpp index 7b7c842252..9cf22685ab 100644 --- a/apps/openmw/mwgui/layouts.hpp +++ b/apps/openmw/mwgui/layouts.hpp @@ -84,7 +84,7 @@ namespace MWGui mPrefix = prefix; } - void setActiveCell(const int x, const int y) + void setActiveCell(const int x, const int y, bool interior=false) { for (int mx=0; mx<3; ++mx) { @@ -94,7 +94,7 @@ namespace MWGui + boost::lexical_cast(my); std::string image = mPrefix+"_"+ boost::lexical_cast(x + (mx-1)) + "_" - + boost::lexical_cast(y - (my-1)); + + boost::lexical_cast(y + (interior ? (my-1) : -1*(my-1))); setImage(name, image); setImage(name+"_fog", image+"_fog"); } diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index 014aa81083..c8c518a93b 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -420,3 +420,8 @@ void WindowManager::changeCell(MWWorld::Ptr::CellStore* cell) } } + +void WindowManager::setInteriorMapTexture(const int x, const int y) +{ + map->setActiveCell(x,y, true); +} diff --git a/apps/openmw/mwgui/window_manager.hpp b/apps/openmw/mwgui/window_manager.hpp index c867fedbed..0345cb99d2 100644 --- a/apps/openmw/mwgui/window_manager.hpp +++ b/apps/openmw/mwgui/window_manager.hpp @@ -152,6 +152,9 @@ namespace MWGui void updateSkillArea(); ///< update display of skills, factions, birth sign, reputation and bounty void changeCell(MWWorld::Ptr::CellStore* cell); ///< change the active cell + + void setInteriorMapTexture(const int x, const int y); + ///< set the index of the map texture that should be used (for interiors) template void removeDialog(T*& dialog); ///< Casts to OEngine::GUI::Layout and calls removeDialog, then resets pointer to nullptr. diff --git a/apps/openmw/mwrender/localmap.cpp b/apps/openmw/mwrender/localmap.cpp index ee5413caba..d4a25750f8 100644 --- a/apps/openmw/mwrender/localmap.cpp +++ b/apps/openmw/mwrender/localmap.cpp @@ -1,6 +1,9 @@ #include "localmap.hpp" #include "renderingmanager.hpp" +#include "../mwworld/environment.hpp" +#include "../mwgui/window_manager.hpp" + #include #include @@ -19,61 +22,16 @@ using namespace Ogre; // size of a map segment (for exterior regions, this equals 1 cell) #define SIZE 8192.f -LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) +LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend, MWWorld::Environment* env) { mRendering = rend; - + mEnvironment = env; + mCellCamera = mRendering->getScene()->createCamera("CellCamera"); mCellCamera->setProjectionType(PT_ORTHOGRAPHIC); // look down -y const float sqrt0pt5 = 0.707106781; mCellCamera->setOrientation(Quaternion(sqrt0pt5, -sqrt0pt5, 0, 0)); - - // Debug overlay to view the maps - - render(0, 0, 10000, 10000, SIZE, SIZE, "Cell_0_0_"); - - MaterialPtr mat = MaterialManager::getSingleton().create("testMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); - mat->getTechnique(0)->getPass(0)->createTextureUnitState("Cell_0_0_"); - mat->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); - mat->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); - mat->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); - - mat = MaterialManager::getSingleton().create("testMaterial2", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); - mat->getTechnique(0)->getPass(0)->createTextureUnitState("Cell_0_0_"); - mat->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); - mat->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); - mat->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); - - OverlayManager& ovm = OverlayManager::getSingleton(); - - Overlay* mOverlay = ovm.create( "testOverlay" ); - mOverlay->setZOrder(0); - OverlayContainer* overlay_panel; - overlay_panel = (OverlayContainer*)ovm.createOverlayElement("Panel", "testPanel"); - - overlay_panel->_setPosition(0, 0); - overlay_panel->_setDimensions(0.5, 0.5); - - overlay_panel->setMaterialName( "testMaterial" ); - overlay_panel->show(); - mOverlay->add2D(overlay_panel); - //mOverlay->show(); - - Overlay* mOverlay2 = ovm.create( "testOverlay2" ); - mOverlay2->setZOrder(1); - OverlayContainer* overlay_panel2; - overlay_panel2 = (OverlayContainer*)ovm.createOverlayElement("Panel", "testPanel2"); - - overlay_panel2->_setPosition(0, 0); - overlay_panel2->_setDimensions(0.5, 0.5); - - overlay_panel2->setMaterialName( "testMaterial2" ); - overlay_panel2->show(); - mOverlay2->add2D(overlay_panel2); - - //mOverlay2->show(); - } LocalMap::~LocalMap() @@ -304,6 +262,8 @@ void LocalMap::setPlayerPosition (const Ogre::Vector3& position) x = std::ceil((pos.x - min.x)/SIZE)-1; y = std::ceil((pos.y - min.y)/SIZE)-1; + + mEnvironment->mWindowManager->setInteriorMapTexture(x,y); } // convert from world coordinates to texture UV coordinates @@ -355,17 +315,5 @@ void LocalMap::setPlayerPosition (const Ogre::Vector3& position) // copy to the texture memcpy(tex->getBuffer()->lock(HardwareBuffer::HBL_DISCARD), buffer, FOGOFWAR_RESOLUTION*FOGOFWAR_RESOLUTION*4); tex->getBuffer()->unlock(); - - if (!MaterialManager::getSingleton().getByName("testMaterial").isNull()) - { - MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial"); - mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(texName); - } - if (!MaterialManager::getSingleton().getByName("testMaterial2").isNull()) - { - MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial2"); - mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(tex->getName()); - } - } } diff --git a/apps/openmw/mwrender/localmap.hpp b/apps/openmw/mwrender/localmap.hpp index 9e06200c17..fd5d4770bc 100644 --- a/apps/openmw/mwrender/localmap.hpp +++ b/apps/openmw/mwrender/localmap.hpp @@ -5,6 +5,11 @@ #include +namespace MWWorld +{ + class Environment; +} + namespace MWRender { /// @@ -13,7 +18,7 @@ namespace MWRender class LocalMap { public: - LocalMap(OEngine::Render::OgreRenderer*); + LocalMap(OEngine::Render::OgreRenderer*, MWWorld::Environment* env); ~LocalMap(); /** @@ -52,6 +57,7 @@ namespace MWRender private: OEngine::Render::OgreRenderer* mRendering; + MWWorld::Environment* mEnvironment; Ogre::Camera* mCellCamera; diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index f83e16717a..e25a6a7a0f 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -56,7 +56,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const mPlayer = new MWRender::Player (mRendering.getCamera(), playerNode); mSun = 0; - mLocalMap = new MWRender::LocalMap(&mRendering); + mLocalMap = new MWRender::LocalMap(&mRendering, &environment); } RenderingManager::~RenderingManager ()