mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-01-07 04:00:37 -06:00
Add selection functionality to send index from and to GUI and move capping of scroll too browser
This commit is contained in:
@@ -59,6 +59,9 @@ namespace openspace {
|
||||
bool _camIsSyncedWWT;
|
||||
ScreenSpaceSkyTarget* _skyTarget;
|
||||
std::thread _threadWWTMessages;
|
||||
// For capping the calls to change the zoom from scrolling
|
||||
constexpr static const std::chrono::milliseconds TimeUpdateInterval{ 25 };
|
||||
std::chrono::system_clock::time_point _lastUpdateTime;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -120,6 +120,14 @@ namespace openspace {
|
||||
"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"
|
||||
},
|
||||
{
|
||||
"setSelectedBrowser",
|
||||
& skybrowser::luascriptfunctions::setSelectedBrowser,
|
||||
{},
|
||||
"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"
|
||||
},
|
||||
{
|
||||
"getTargetData",
|
||||
&skybrowser::luascriptfunctions::getTargetData,
|
||||
@@ -234,7 +242,6 @@ SkyBrowserModule::SkyBrowserModule()
|
||||
|
||||
// Selection has changed
|
||||
if (lastObj != _mouseOnObject) {
|
||||
glm::ivec3 highlightAddition{ 35, 35, 35 };
|
||||
// Remove highlight
|
||||
if (to_browser(lastObj)) {
|
||||
to_browser(lastObj)->setBorderColor(to_browser(lastObj)->getColor() - highlightAddition);
|
||||
@@ -258,19 +265,16 @@ SkyBrowserModule::SkyBrowserModule()
|
||||
|
||||
global::callback::mouseScrollWheel->emplace_back(
|
||||
[&](double, double scroll) -> bool {
|
||||
// Cap how often the zoom is allowed to update
|
||||
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
|
||||
if (now - _lastUpdateTime > TimeUpdateInterval) {
|
||||
// If mouse is on browser or target, apply zoom
|
||||
if (to_browser(_mouseOnObject)) {
|
||||
to_browser(_mouseOnObject)->scrollZoom(scroll);
|
||||
return true;
|
||||
}
|
||||
else if (to_target(_mouseOnObject) && to_target(_mouseOnObject)->getSkyBrowser()) {
|
||||
to_target(_mouseOnObject)->getSkyBrowser()->scrollZoom(scroll);
|
||||
}
|
||||
_lastUpdateTime = std::chrono::system_clock::now();
|
||||
|
||||
// If mouse is on browser or target, apply zoom
|
||||
if (to_browser(_mouseOnObject)) {
|
||||
to_browser(_mouseOnObject)->scrollZoom(scroll);
|
||||
return true;
|
||||
}
|
||||
else if (to_target(_mouseOnObject) && to_target(_mouseOnObject)->getSkyBrowser()) {
|
||||
to_target(_mouseOnObject)->getSkyBrowser()->scrollZoom(scroll);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
);
|
||||
@@ -278,9 +282,13 @@ SkyBrowserModule::SkyBrowserModule()
|
||||
global::callback::mouseButton->emplace_back(
|
||||
[&](MouseButton button, MouseAction action, KeyModifier modifier) -> bool {
|
||||
|
||||
if (action == MouseAction::Press) {
|
||||
if (_mouseOnObject && action == MouseAction::Press) {
|
||||
|
||||
if (_mouseOnObject && button == MouseButton::Left) {
|
||||
// Get the currently selected browser
|
||||
setSelectedBrowser(_mouseOnObject);
|
||||
|
||||
|
||||
if (button == MouseButton::Left) {
|
||||
startDragMousePos = _mousePosition;
|
||||
startDragObjectPos = _mouseOnObject->getScreenSpacePosition();
|
||||
|
||||
@@ -435,6 +443,21 @@ void SkyBrowserModule::rotateCamera(double deltaTime) {
|
||||
}
|
||||
}
|
||||
|
||||
void SkyBrowserModule::setSelectedBrowser(ScreenSpaceRenderable* ptr) {
|
||||
ScreenSpaceSkyBrowser* browser = to_browser(ptr) ? to_browser(ptr) : to_target(ptr)->getSkyBrowser();
|
||||
std::vector<ScreenSpaceSkyBrowser*> browsers = getSkyBrowsers();
|
||||
auto it = std::find(browsers.begin(), browsers.end(), browser);
|
||||
// Get index
|
||||
selectedBrowser = std::distance(browsers.begin(), it);
|
||||
}
|
||||
|
||||
void SkyBrowserModule::setSelectedBrowser(int i) {
|
||||
selectedBrowser = i;
|
||||
}
|
||||
|
||||
int SkyBrowserModule::getSelectedBrowserIndex() {
|
||||
return selectedBrowser;
|
||||
}
|
||||
/*
|
||||
std::vector<documentation::Documentation> SkyBrowserModule::documentations() const {
|
||||
return {
|
||||
|
||||
@@ -57,6 +57,9 @@ public:
|
||||
std::vector<ScreenSpaceSkyBrowser*> getSkyBrowsers();
|
||||
void startRotation(glm::dvec2 coordsEnd);
|
||||
void rotateCamera(double deltaTime);
|
||||
void setSelectedBrowser(ScreenSpaceRenderable* ptr);
|
||||
void setSelectedBrowser(int i);
|
||||
int getSelectedBrowserIndex();
|
||||
|
||||
scripting::LuaLibrary luaLibrary() const override;
|
||||
//std::vector<documentation::Documentation> documentations() const override;
|
||||
@@ -86,14 +89,16 @@ protected:
|
||||
// Current interaction status
|
||||
bool currentlyResizingBrowser;
|
||||
bool currentlyDraggingObject;
|
||||
// Data handler
|
||||
WWTDataHandler* dataHandler;
|
||||
// For capping the calls to change the zoom from scrolling
|
||||
constexpr static const std::chrono::milliseconds TimeUpdateInterval{ 50 };
|
||||
std::chrono::system_clock::time_point _lastUpdateTime;
|
||||
|
||||
// For animating rotation of camera to look at coordinate
|
||||
glm::dvec3 _coordsToAnimateTo;
|
||||
glm::dvec3 _coordsStartAnimation;
|
||||
bool isRotating = false;
|
||||
// For tracking the currently selected browser
|
||||
int selectedBrowser{ -1 };
|
||||
glm::ivec3 highlightAddition{ 35, 35, 35 };
|
||||
};
|
||||
|
||||
} // namespace openspace
|
||||
|
||||
@@ -36,9 +36,9 @@ namespace openspace::skybrowser::luascriptfunctions {
|
||||
// Load image
|
||||
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::selectImage");
|
||||
const int i = ghoul::lua::value<int>(L, 1);
|
||||
|
||||
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable("SkyBrowser1"));
|
||||
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
|
||||
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
|
||||
ScreenSpaceSkyBrowser* browser = module->getSkyBrowsers()[module->getSelectedBrowserIndex()];
|
||||
|
||||
const ImageData& resultImage = module->getWWTDataHandler()->getLoadedImages()[i];
|
||||
// Load image collection, if it isn't loaded already
|
||||
// TODO: Update or remove with new WWT API
|
||||
@@ -252,6 +252,8 @@ namespace openspace::skybrowser::luascriptfunctions {
|
||||
lua_settable(L, -3);
|
||||
ghoul::lua::push(L, "Dec", sphericalJ2000.y);
|
||||
lua_settable(L, -3);
|
||||
ghoul::lua::push(L, "SelectedBrowserIndex", module->getSelectedBrowserIndex());
|
||||
lua_settable(L, -3);
|
||||
// Set table for the current ImageData
|
||||
lua_settable(L, -3);
|
||||
|
||||
@@ -296,13 +298,22 @@ namespace openspace::skybrowser::luascriptfunctions {
|
||||
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::adjustCamera");
|
||||
const int i = ghoul::lua::value<int>(L, 1);
|
||||
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
|
||||
//module->getSkyBrowsers()[0]->getSkyTarget()->lock();
|
||||
if (module->getSkyBrowsers().size() > i) {
|
||||
module->startRotation(module->getSkyBrowsers()[i]->getSkyTarget()->getTargetDirectionCelestial());
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int setSelectedBrowser(lua_State* L) {
|
||||
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::setSelectedBrowser");
|
||||
const int i = ghoul::lua::value<int>(L, 1);
|
||||
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
|
||||
if (module->getSkyBrowsers().size() < i) {
|
||||
module->setSelectedBrowser(i);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -184,11 +184,16 @@ namespace openspace {
|
||||
}
|
||||
|
||||
void ScreenSpaceSkyBrowser::scrollZoom(float scroll) {
|
||||
// Make scroll more sensitive the smaller the FOV
|
||||
float x = _vfieldOfView;
|
||||
float zoomFactor = atan(x / 50.0) + exp(x / 40) - 0.999999;
|
||||
float zoom = scroll > 0.0 ? -zoomFactor : zoomFactor;
|
||||
_vfieldOfView = std::clamp(_vfieldOfView + zoom, 0.001f, 70.0f);
|
||||
// Cap how often the zoom is allowed to update
|
||||
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
|
||||
if (now - _lastUpdateTime > TimeUpdateInterval) {
|
||||
// Make scroll more sensitive the smaller the FOV
|
||||
float x = _vfieldOfView;
|
||||
float zoomFactor = atan(x / 50.0) + exp(x / 40) - 0.999999;
|
||||
float zoom = scroll > 0.0 ? -zoomFactor : zoomFactor;
|
||||
_vfieldOfView = std::clamp(_vfieldOfView + zoom, 0.001f, 70.0f);
|
||||
_lastUpdateTime = std::chrono::system_clock::now();
|
||||
}
|
||||
}
|
||||
|
||||
void ScreenSpaceSkyBrowser::executeJavascript(std::string script) const {
|
||||
|
||||
@@ -367,14 +367,18 @@ namespace openspace {
|
||||
}
|
||||
|
||||
bool ScreenSpaceSkyTarget::animateFOV(float endFOV, float deltaTime) {
|
||||
double distance = static_cast<double>(_skyBrowser->_vfieldOfView.value()) - endFOV;
|
||||
// If distance is too large, keep animating
|
||||
if (abs(distance) > 0.01) {
|
||||
_skyBrowser->setVerticalFieldOfView(_skyBrowser->_vfieldOfView.value() - (distance * deltaTime * 2.0));
|
||||
return false;
|
||||
if (_skyBrowser) {
|
||||
double distance = static_cast<double>(_skyBrowser->_vfieldOfView.value()) - endFOV;
|
||||
// If distance is too large, keep animating
|
||||
if (abs(distance) > 0.01) {
|
||||
_skyBrowser->scrollZoom(distance);
|
||||
return false;
|
||||
}
|
||||
// Animation is finished
|
||||
return true;
|
||||
}
|
||||
// Animation is finished
|
||||
return true;
|
||||
LINFO("Browser not connected to target!");
|
||||
return true;
|
||||
}
|
||||
|
||||
void ScreenSpaceSkyTarget::startAnimation(glm::dvec2 coordsEnd, float FOVEnd) {
|
||||
|
||||
Reference in New Issue
Block a user