diff --git a/modules/globebrowsing/globebrowsingmodule.cpp b/modules/globebrowsing/globebrowsingmodule.cpp index b9074cda6b..3454f2d394 100644 --- a/modules/globebrowsing/globebrowsingmodule.cpp +++ b/modules/globebrowsing/globebrowsingmodule.cpp @@ -421,6 +421,46 @@ glm::vec3 GlobeBrowsingModule::cartesianCoordinatesFromGeo( return glm::vec3(globe.ellipsoid().cartesianPosition(pos)); } +glm::dvec3 GlobeBrowsingModule::geoPosition() const { + using namespace globebrowsing; + + const SceneGraphNode* n = global::navigationHandler->orbitalNavigator().anchorNode(); + if (!n) { + return glm::dvec3(0); + } + const RenderableGlobe* globe = dynamic_cast(n->renderable()); + if (!globe) { + return glm::dvec3(0); + } + + const glm::dvec3 cameraPosition = global::navigationHandler->camera()->positionVec3(); + const glm::dmat4 inverseModelTransform = glm::inverse(n->modelTransform()); + const glm::dvec3 cameraPositionModelSpace = + glm::dvec3(inverseModelTransform * glm::dvec4(cameraPosition, 1.0)); + const SurfacePositionHandle posHandle = globe->calculateSurfacePositionHandle( + cameraPositionModelSpace + ); + + const Geodetic2 geo2 = globe->ellipsoid().cartesianToGeodetic2( + posHandle.centerToReferenceSurface + ); + + double lat = glm::degrees(geo2.lat); + double lon = glm::degrees(geo2.lon); + + double altitude = glm::length( + cameraPositionModelSpace - posHandle.centerToReferenceSurface + ); + + if (glm::length(cameraPositionModelSpace) < + glm::length(posHandle.centerToReferenceSurface)) + { + altitude = -altitude; + } + + return glm::dvec3(lat, lon, altitude); +} + void GlobeBrowsingModule::goToChunk(const globebrowsing::RenderableGlobe& globe, const globebrowsing::TileIndex& ti, glm::vec2 uv, bool doResetCameraDirection) diff --git a/modules/globebrowsing/globebrowsingmodule.h b/modules/globebrowsing/globebrowsingmodule.h index 756525843b..678558fb14 100644 --- a/modules/globebrowsing/globebrowsingmodule.h +++ b/modules/globebrowsing/globebrowsingmodule.h @@ -63,6 +63,8 @@ public: glm::vec3 cartesianCoordinatesFromGeo(const globebrowsing::RenderableGlobe& globe, double latitude, double longitude, double altitude); + glm::dvec3 geoPosition() const; + globebrowsing::cache::MemoryAwareTileCache* tileCache(); scripting::LuaLibrary luaLibrary() const override; std::vector documentations() const override; diff --git a/modules/globebrowsing/src/dashboarditemglobelocation.cpp b/modules/globebrowsing/src/dashboarditemglobelocation.cpp index 55a1e34316..4b6ab7d0ad 100644 --- a/modules/globebrowsing/src/dashboarditemglobelocation.cpp +++ b/modules/globebrowsing/src/dashboarditemglobelocation.cpp @@ -24,11 +24,13 @@ #include +#include #include #include #include #include #include +#include #include #include #include @@ -171,42 +173,13 @@ DashboardItemGlobeLocation::DashboardItemGlobeLocation( void DashboardItemGlobeLocation::render(glm::vec2& penPosition) { ZoneScoped + + GlobeBrowsingModule* module = global::moduleEngine->module(); - using namespace globebrowsing; - - const SceneGraphNode* n = global::navigationHandler->orbitalNavigator().anchorNode(); - if (!n) { - return; - } - const RenderableGlobe* globe = dynamic_cast(n->renderable()); - if (!globe) { - return; - } - - const glm::dvec3 cameraPosition = global::navigationHandler->camera()->positionVec3(); - const glm::dmat4 inverseModelTransform = glm::inverse(n->modelTransform()); - const glm::dvec3 cameraPositionModelSpace = - glm::dvec3(inverseModelTransform * glm::dvec4(cameraPosition, 1.0)); - const SurfacePositionHandle posHandle = globe->calculateSurfacePositionHandle( - cameraPositionModelSpace - ); - - const Geodetic2 geo2 = globe->ellipsoid().cartesianToGeodetic2( - posHandle.centerToReferenceSurface - ); - - double lat = glm::degrees(geo2.lat); - double lon = glm::degrees(geo2.lon); - - double altitude = glm::length( - cameraPositionModelSpace - posHandle.centerToReferenceSurface - ); - - if (glm::length(cameraPositionModelSpace) < - glm::length(posHandle.centerToReferenceSurface)) - { - altitude = -altitude; - } + glm::dvec3 position = module->geoPosition(); + double lat = position.x; + double lon = position.y; + double altitude = position.z; std::pair dist = simplifyDistance(altitude);