mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-02-25 14:29:03 -06:00
Add functionality to center target on screen, when it has been lost locked somewhere for example
This commit is contained in:
@@ -51,7 +51,7 @@ namespace openspace {
|
||||
void lock();
|
||||
bool isLocked();
|
||||
void animateToCoord(double deltaTime);
|
||||
void startAnimation(glm::dvec2 coordsEnd, float FOVEnd);
|
||||
void startAnimation(glm::dvec2 coordsEnd, float FOVEnd, bool lockAfterwards = true);
|
||||
bool animateFOV(float endFOV, float deltaTime);
|
||||
|
||||
glm::mat4 scaleMatrix() override;
|
||||
@@ -82,7 +82,7 @@ namespace openspace {
|
||||
glm::dvec3 _coordsStartAnimation;
|
||||
double animationTime = 1.0;
|
||||
float FOVToAnimateTo;
|
||||
float currentFOV;
|
||||
bool _lockAfterwards;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ namespace openspace {
|
||||
glm::dvec3 J2000CartesianToScreenSpace(glm::dvec3 coords);
|
||||
glm::dvec3 galacticToScreenSpace(glm::dvec3 galacticCoord);
|
||||
double calculateRoll(glm::dvec3 upWorld, glm::dvec3 forwardWorld);
|
||||
glm::dvec3 cameraDirectionJ2000Cartesian();
|
||||
}
|
||||
namespace wwtmessage {
|
||||
// WWT messages
|
||||
|
||||
@@ -225,6 +225,14 @@ namespace openspace {
|
||||
"string or list of strings",
|
||||
"Add one or multiple exoplanet systems to the scene, as specified by the "
|
||||
"input. An input string should be the name of the system host star"
|
||||
},
|
||||
{
|
||||
"centerTargetOnScreen",
|
||||
&skybrowser::luascriptfunctions::centerTargetOnScreen,
|
||||
{},
|
||||
"string or list of strings",
|
||||
"Add one or multiple exoplanet systems to the scene, as specified by the "
|
||||
"input. An input string should be the name of the system host star"
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -337,11 +337,7 @@ namespace openspace::skybrowser::luascriptfunctions {
|
||||
// Add the window data for OpenSpace
|
||||
ghoul::lua::push(L, "OpenSpace");
|
||||
lua_newtable(L);
|
||||
// Get the view direction of the screen in cartesian J2000 coordinates
|
||||
glm::dvec3 camPos = global::navigationHandler->camera()->positionVec3();
|
||||
constexpr double infinity = std::numeric_limits<float>::max();
|
||||
glm::dvec3 galCoord = camPos + (infinity * global::navigationHandler->camera()->viewDirectionWorldSpace());
|
||||
glm::dvec3 cartesianJ2000 = skybrowser::galacticCartesianToJ2000Cartesian(galCoord);
|
||||
glm::dvec3 cartesianJ2000 = skybrowser::cameraDirectionJ2000Cartesian();
|
||||
glm::dvec2 sphericalJ2000 = skybrowser::cartesianToSpherical(cartesianJ2000);
|
||||
// Convert to vector so ghoul can read it
|
||||
std::vector<double> viewDirCelestVec = { cartesianJ2000.x, cartesianJ2000.y, cartesianJ2000.z };
|
||||
@@ -526,6 +522,28 @@ namespace openspace::skybrowser::luascriptfunctions {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int centerTargetOnScreen(lua_State* L) {
|
||||
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::centerTargetOnScreen");
|
||||
const std::string id = ghoul::lua::value<std::string>(L, 1);
|
||||
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
|
||||
if (module->browserIdExists(id)) {
|
||||
ScreenSpaceSkyBrowser* browser = module->getSkyBrowsers()[id];
|
||||
if (browser && browser->getSkyTarget()) {
|
||||
// Animate the target to the center of the screen
|
||||
browser->getSkyTarget()->unlock();
|
||||
// Get camera direction in celestial spherical coordinates
|
||||
glm::dvec3 viewDirection = skybrowser::cameraDirectionJ2000Cartesian();
|
||||
glm::dvec2 centerOfScreen = skybrowser::cartesianToSpherical(
|
||||
viewDirection);
|
||||
// Keep the current fov
|
||||
float fov = browser->fieldOfView();
|
||||
browser->getSkyTarget()->startAnimation(centerOfScreen, fov, false);
|
||||
browser->getSkyTarget()->unlock();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int setSelectedBrowser(lua_State* L) {
|
||||
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::setSelectedBrowser");
|
||||
const std::string id = ghoul::lua::value<std::string>(L, 1);
|
||||
|
||||
@@ -362,10 +362,10 @@ namespace openspace {
|
||||
_coordsStartAnimation = glm::normalize(newDir);
|
||||
}
|
||||
else {
|
||||
// Set the exact target position and lock target when it first arrives
|
||||
// to the position
|
||||
if (!_isLocked) {
|
||||
_cartesianPosition = skybrowser::J2000CartesianToScreenSpace(_coordsToAnimateTo);
|
||||
// Set the exact target position
|
||||
_cartesianPosition = skybrowser::J2000CartesianToScreenSpace(_coordsToAnimateTo);
|
||||
// Lock target when it first arrives to the position
|
||||
if (!_isLocked && _lockAfterwards) {
|
||||
lock();
|
||||
}
|
||||
// When target is in position, animate the FOV until it has finished
|
||||
@@ -378,7 +378,8 @@ namespace openspace {
|
||||
|
||||
bool ScreenSpaceSkyTarget::animateFOV(float endFOV, float deltaTime) {
|
||||
if (!_skyBrowser) {
|
||||
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable(_skyBrowserID.value()));
|
||||
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(
|
||||
global::renderEngine->screenSpaceRenderable(_skyBrowserID.value()));
|
||||
setBrowser(browser);
|
||||
}
|
||||
if (_skyBrowser) {
|
||||
@@ -398,13 +399,16 @@ namespace openspace {
|
||||
return true;
|
||||
}
|
||||
|
||||
void ScreenSpaceSkyTarget::startAnimation(glm::dvec2 coordsEnd, float FOVEnd) {
|
||||
void ScreenSpaceSkyTarget::startAnimation(glm::dvec2 coordsEnd, float FOVEnd,
|
||||
bool lockAfterwards) {
|
||||
// Save the Cartesian celestial coordinates for animation
|
||||
// to make sure wrap around works
|
||||
_coordsToAnimateTo = glm::normalize(skybrowser::sphericalToCartesian(coordsEnd));
|
||||
_coordsStartAnimation = glm::normalize(skybrowser::sphericalToCartesian(getTargetDirectionCelestial()));
|
||||
_coordsStartAnimation = glm::normalize(skybrowser::sphericalToCartesian(
|
||||
getTargetDirectionCelestial()));
|
||||
FOVToAnimateTo = FOVEnd;
|
||||
isAnimated = true;
|
||||
_lockAfterwards = lockAfterwards;
|
||||
}
|
||||
properties::FloatProperty& ScreenSpaceSkyTarget::getOpacity() {
|
||||
return _opacity;
|
||||
|
||||
@@ -101,6 +101,15 @@ namespace openspace::skybrowser {
|
||||
double roll = glm::degrees(atan2(dotCrossUpNorthForward, dotNorthUp));
|
||||
return roll;
|
||||
}
|
||||
|
||||
glm::dvec3 cameraDirectionJ2000Cartesian() {
|
||||
// Get the view direction of the screen in cartesian J2000 coordinates
|
||||
glm::dvec3 camPos = global::navigationHandler->camera()->positionVec3();
|
||||
constexpr double infinity = std::numeric_limits<float>::max();
|
||||
glm::dvec3 galCoord = camPos + (infinity * global::navigationHandler->camera()->viewDirectionWorldSpace());
|
||||
glm::dvec3 cartesianJ2000 = skybrowser::galacticCartesianToJ2000Cartesian(galCoord);
|
||||
return cartesianJ2000;
|
||||
}
|
||||
}
|
||||
|
||||
// WWT messages
|
||||
|
||||
Reference in New Issue
Block a user