Rename goToGeo -> jumpToGeo (#3296)

* Remove unused bool argument in globebrowsing functions
* Refactor some globe browsing functions
* Start updating goToGeo function to fade instead of just jump
* Add choice for whtehr to use default or arrival height when flying to a geo2
* Update / add docs for fly-to and go-to functions
* Rename function and add deprecated version of `goToGeo`
This commit is contained in:
Emma Broman
2024-06-04 16:18:03 +02:00
committed by GitHub
parent aaab3fae46
commit 09a40f62dc
6 changed files with 204 additions and 115 deletions

View File

@@ -356,8 +356,7 @@ void GlobeBrowsingModule::goToChunk(const globebrowsing::RenderableGlobe& globe,
goToChunk(
globe,
globebrowsing::TileIndex(x, y, static_cast<uint8_t>(level)),
glm::vec2(0.5f, 0.5f),
true
glm::vec2(0.5f, 0.5f)
);
}
@@ -367,8 +366,7 @@ void GlobeBrowsingModule::goToGeo(const globebrowsing::RenderableGlobe& globe,
using namespace globebrowsing;
goToGeodetic2(
globe,
Geodetic2{ glm::radians(latitude), glm::radians(longitude) },
true
Geodetic2{ glm::radians(latitude), glm::radians(longitude) }
);
}
@@ -381,20 +379,19 @@ void GlobeBrowsingModule::goToGeo(const globebrowsing::RenderableGlobe& globe,
{
Geodetic2{ glm::radians(latitude), glm::radians(longitude) },
altitude
},
true
}
);
}
glm::vec3 GlobeBrowsingModule::cartesianCoordinatesFromGeo(
const globebrowsing::RenderableGlobe& globe,
double latitude, double longitude, double altitude)
double latitude, double longitude, std::optional<double> altitude)
{
using namespace globebrowsing;
const Geodetic3 pos = {
{ .lat = glm::radians(latitude), .lon = glm::radians(longitude) },
altitude
altitude.value_or(altitudeFromCamera(globe))
};
return glm::vec3(globe.ellipsoid().cartesianPosition(pos));
@@ -440,9 +437,43 @@ glm::dvec3 GlobeBrowsingModule::geoPosition() const {
return glm::dvec3(lat, lon, altitude);
}
double GlobeBrowsingModule::altitudeFromCamera(
const globebrowsing::RenderableGlobe& globe,
bool useHeightMap) const
{
using namespace globebrowsing;
const glm::dvec3 cameraPosition = global::navigationHandler->camera()->positionVec3();
SceneGraphNode* sgn = dynamic_cast<SceneGraphNode*>(globe.owner());
if (!sgn) {
LERROR("Could not find scene graph node for globe");
return 0.0;
}
const glm::dmat4 inverseModelTransform = glm::inverse(sgn->modelTransform());
const glm::dvec3 cameraPositionModelSpace =
glm::dvec3(inverseModelTransform * glm::dvec4(cameraPosition, 1.0));
SurfacePositionHandle posHandle = globe.calculateSurfacePositionHandle(
cameraPositionModelSpace
);
if (useHeightMap) {
const glm::dvec3 centerToActualSurface = posHandle.centerToReferenceSurface +
posHandle.referenceSurfaceOutDirection * posHandle.heightToSurface;
return glm::length(cameraPositionModelSpace - centerToActualSurface);
}
else {
// Do not use height map => compute distance to reference surface
return glm::length(cameraPositionModelSpace - posHandle.centerToReferenceSurface);
}
}
void GlobeBrowsingModule::goToChunk(const globebrowsing::RenderableGlobe& globe,
const globebrowsing::TileIndex& ti,
const glm::vec2& uv, bool doResetCameraDirection)
const glm::vec2& uv)
{
using namespace globebrowsing;
@@ -456,61 +487,23 @@ void GlobeBrowsingModule::goToChunk(const globebrowsing::RenderableGlobe& globe,
.lon = corner.lon + positionOnPatch.lon
};
// Compute altitude
const glm::dvec3 cameraPosition = global::navigationHandler->camera()->positionVec3();
SceneGraphNode* globeSceneGraphNode = dynamic_cast<SceneGraphNode*>(globe.owner());
if (!globeSceneGraphNode) {
LERROR("Cannot go to chunk. The renderable is not attached to scene graph node");
return;
}
const glm::dmat4 inverseModelTransform = glm::inverse(
globeSceneGraphNode->modelTransform()
);
const glm::dvec3 cameraPositionModelSpace =
glm::dvec3(inverseModelTransform * glm::dvec4(cameraPosition, 1.0));
const SurfacePositionHandle posHandle = globe.calculateSurfacePositionHandle(
cameraPositionModelSpace
);
const double altitude = altitudeFromCamera(globe);
const double altitude = glm::length(
cameraPositionModelSpace - posHandle.centerToReferenceSurface
);
goToGeodetic3(globe, { pointPosition, altitude }, doResetCameraDirection);
goToGeodetic3(globe, { pointPosition, altitude });
}
void GlobeBrowsingModule::goToGeodetic2(const globebrowsing::RenderableGlobe& globe,
globebrowsing::Geodetic2 geo2,
bool doResetCameraDirection)
globebrowsing::Geodetic2 geo2)
{
using namespace globebrowsing;
const glm::dvec3 cameraPosition = global::navigationHandler->camera()->positionVec3();
SceneGraphNode* globeSceneGraphNode = dynamic_cast<SceneGraphNode*>(globe.owner());
if (!globeSceneGraphNode) {
LERROR("Error when going to Geodetic2");
return;
}
const double altitude = altitudeFromCamera(globe);
const glm::dmat4 inverseModelTransform = glm::inverse(
globeSceneGraphNode->modelTransform()
);
const glm::dvec3 cameraPositionModelSpace =
glm::dvec3(inverseModelTransform * glm::dvec4(cameraPosition, 1.0));
const SurfacePositionHandle posHandle = globe.calculateSurfacePositionHandle(
cameraPositionModelSpace
);
const glm::dvec3 centerToActualSurface = posHandle.centerToReferenceSurface +
posHandle.referenceSurfaceOutDirection * posHandle.heightToSurface;
const double altitude = glm::length(cameraPositionModelSpace - centerToActualSurface);
goToGeodetic3(globe, { geo2, altitude }, doResetCameraDirection);
goToGeodetic3(globe, { geo2, altitude });
}
void GlobeBrowsingModule::goToGeodetic3(const globebrowsing::RenderableGlobe& globe,
globebrowsing::Geodetic3 geo3, bool)
globebrowsing::Geodetic3 geo3)
{
using namespace globebrowsing;
const glm::dvec3 positionModelSpace = globe.ellipsoid().cartesianPosition(geo3);
@@ -671,9 +664,9 @@ scripting::LuaLibrary GlobeBrowsingModule::luaLibrary() const {
codegen::lua::LayersDeprecated,
codegen::lua::MoveLayer,
codegen::lua::GoToChunk,
codegen::lua::GoToGeo,
// @TODO (2021-06-23, emmbr) Combine with the above function when the camera
// paths work really well close to surfaces
codegen::lua::JumpToGeo,
codegen::lua::GoToGeoDeprecated,
codegen::lua::FlyToGeo2,
codegen::lua::FlyToGeo,
codegen::lua::LocalPositionFromGeo,
codegen::lua::LocalPositionFromGeoDeprecated,