From 35571bb10856403c88661b62b9b40a5ffc35cf9a Mon Sep 17 00:00:00 2001 From: Ragora Date: Fri, 12 Sep 2014 17:31:37 -0400 Subject: [PATCH 1/2] Global compass arrow rotates regardless of indoor or outdoor presence --- apps/openmw/mwgui/mapwindow.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwgui/mapwindow.cpp b/apps/openmw/mwgui/mapwindow.cpp index 1968181ceb..724ea0fbea 100644 --- a/apps/openmw/mwgui/mapwindow.cpp +++ b/apps/openmw/mwgui/mapwindow.cpp @@ -754,12 +754,14 @@ namespace MWGui void MapWindow::globalMapUpdatePlayer () { + Ogre::Quaternion orient = MWBase::Environment::get().getWorld ()->getPlayerPtr().getRefData ().getBaseNode ()->_getDerivedOrientation (); + Ogre::Vector2 dir (orient.yAxis ().x, orient.yAxis().y); + float globalPlayerArrowAngle = std::atan2(dir.x, dir.y); + // For interiors, position is set by WindowManager via setGlobalMapPlayerPosition if (MWBase::Environment::get().getWorld ()->isCellExterior ()) { Ogre::Vector3 pos = MWBase::Environment::get().getWorld ()->getPlayerPtr().getRefData ().getBaseNode ()->_getDerivedPosition (); - Ogre::Quaternion orient = MWBase::Environment::get().getWorld ()->getPlayerPtr().getRefData ().getBaseNode ()->_getDerivedOrientation (); - Ogre::Vector2 dir (orient.yAxis ().x, orient.yAxis().y); float worldX, worldY; mGlobalMapRender->worldPosToImageSpace (pos.x, pos.y, worldX, worldY); @@ -768,17 +770,19 @@ namespace MWGui mPlayerArrowGlobal->setPosition(MyGUI::IntPoint(worldX - 16, worldY - 16)); - MyGUI::ISubWidget* main = mPlayerArrowGlobal->getSubWidgetMain(); - MyGUI::RotatingSkin* rotatingSubskin = main->castType(); - rotatingSubskin->setCenter(MyGUI::IntPoint(16,16)); - float angle = std::atan2(dir.x, dir.y); - rotatingSubskin->setAngle(angle); - // set the view offset so that player is in the center MyGUI::IntSize viewsize = mGlobalMap->getSize(); MyGUI::IntPoint viewoffs(0.5*viewsize.width - worldX, 0.5*viewsize.height - worldY); mGlobalMap->setViewOffset(viewoffs); } + else + globalPlayerArrowAngle -= M_PI/2; // If we're indoors, apparently the angle is +90 degrees off. + + // Always rotate the global map compass + MyGUI::ISubWidget* main = mPlayerArrowGlobal->getSubWidgetMain(); + MyGUI::RotatingSkin* rotatingSubskin = main->castType(); + rotatingSubskin->setCenter(MyGUI::IntPoint(16,16)); + rotatingSubskin->setAngle(globalPlayerArrowAngle); } void MapWindow::notifyPlayerUpdate () From 282e7abd166babd46fac9db02410d87102db0620 Mon Sep 17 00:00:00 2001 From: Ragora Date: Fri, 12 Sep 2014 18:26:38 -0400 Subject: [PATCH 2/2] Map Arrow Correction; now rotate global map arrow to whatever the local map arrow orientation is --- apps/openmw/mwgui/mapwindow.cpp | 21 +++++++++------------ apps/openmw/mwgui/mapwindow.hpp | 1 + apps/openmw/mwgui/windowmanagerimp.cpp | 1 + 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/apps/openmw/mwgui/mapwindow.cpp b/apps/openmw/mwgui/mapwindow.cpp index 724ea0fbea..0282b3da33 100644 --- a/apps/openmw/mwgui/mapwindow.cpp +++ b/apps/openmw/mwgui/mapwindow.cpp @@ -754,10 +754,6 @@ namespace MWGui void MapWindow::globalMapUpdatePlayer () { - Ogre::Quaternion orient = MWBase::Environment::get().getWorld ()->getPlayerPtr().getRefData ().getBaseNode ()->_getDerivedOrientation (); - Ogre::Vector2 dir (orient.yAxis ().x, orient.yAxis().y); - float globalPlayerArrowAngle = std::atan2(dir.x, dir.y); - // For interiors, position is set by WindowManager via setGlobalMapPlayerPosition if (MWBase::Environment::get().getWorld ()->isCellExterior ()) { @@ -775,14 +771,6 @@ namespace MWGui MyGUI::IntPoint viewoffs(0.5*viewsize.width - worldX, 0.5*viewsize.height - worldY); mGlobalMap->setViewOffset(viewoffs); } - else - globalPlayerArrowAngle -= M_PI/2; // If we're indoors, apparently the angle is +90 degrees off. - - // Always rotate the global map compass - MyGUI::ISubWidget* main = mPlayerArrowGlobal->getSubWidgetMain(); - MyGUI::RotatingSkin* rotatingSubskin = main->castType(); - rotatingSubskin->setCenter(MyGUI::IntPoint(16,16)); - rotatingSubskin->setAngle(globalPlayerArrowAngle); } void MapWindow::notifyPlayerUpdate () @@ -805,6 +793,15 @@ namespace MWGui mGlobalMap->setViewOffset(viewoffs); } + void MapWindow::setGlobalMapPlayerDir(const float x, const float y) + { + MyGUI::ISubWidget* main = mPlayerArrowGlobal->getSubWidgetMain(); + MyGUI::RotatingSkin* rotatingSubskin = main->castType(); + rotatingSubskin->setCenter(MyGUI::IntPoint(16,16)); + float angle = std::atan2(x,y); + rotatingSubskin->setAngle(angle); + } + void MapWindow::clear() { mMarkers.clear(); diff --git a/apps/openmw/mwgui/mapwindow.hpp b/apps/openmw/mwgui/mapwindow.hpp index a9edbe0b1e..77d31ca4c5 100644 --- a/apps/openmw/mwgui/mapwindow.hpp +++ b/apps/openmw/mwgui/mapwindow.hpp @@ -180,6 +180,7 @@ namespace MWGui void cellExplored(int x, int y); void setGlobalMapPlayerPosition (float worldX, float worldY); + void setGlobalMapPlayerDir(const float x, const float y); virtual void open(); diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index f6ad6500cc..756656e04e 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -909,6 +909,7 @@ namespace MWGui void WindowManager::setPlayerDir(const float x, const float y) { mMap->setPlayerDir(x,y); + mMap->setGlobalMapPlayerDir(x, y); mHud->setPlayerDir(x,y); }