This commit is contained in:
sylvass
2021-11-15 15:30:58 -05:00
parent 513cee8705
commit 21cdc9d5cb
6 changed files with 153 additions and 131 deletions

View File

@@ -104,7 +104,7 @@ namespace openspace {
// Target & images
ScreenSpaceSkyTarget* _skyTarget{ nullptr };
std::thread _threadWwtMessages;
std::thread _wwtMessages;
std::deque<int> _selectedImages;
// Time variables

View File

@@ -25,6 +25,7 @@
#include <modules/skybrowser/skybrowsermodule.h>
#include <modules/skybrowser/include/renderableskybrowser.h>
#include <modules/skybrowser/include/screenspaceskybrowser.h>
#include "skybrowsermodule_lua.inl"
#include <openspace/engine/globalscallbacks.h>
@@ -243,6 +244,11 @@ namespace openspace {
SkyBrowserModule::SkyBrowserModule()
: OpenSpaceModule(SkyBrowserModule::Name)
{
// Find the hover circle
_hoverCircle = dynamic_cast<ScreenSpaceImageLocal*>(
global::renderEngine->screenSpaceRenderable("HoverCircle"));
// Set callback functions
global::callback::mouseButton->emplace_back(
[&](MouseButton button, MouseAction action, KeyModifier modifier) -> bool {
@@ -400,8 +406,8 @@ SkyBrowserModule::SkyBrowserModule()
_isTransitioningVizMode = true;
// Select the 3D browser when moving out of the solar system
if (!_isCameraInSolarSystem && _browser3d != nullptr) {
_selectedBrowser = _browser3d->renderable()->identifier();
if (!_isCameraInSolarSystem && _browser3dNode) {
_selectedBrowser = _browser3dNode->renderable()->identifier();
}
}
@@ -423,8 +429,7 @@ SkyBrowserModule::SkyBrowserModule()
}
});
_hoverCircle = dynamic_cast<ScreenSpaceImageLocal*>(
global::renderEngine->screenSpaceRenderable("HoverCircle"));
}
SkyBrowserModule::~SkyBrowserModule() {
@@ -594,9 +599,14 @@ void SkyBrowserModule::removeTargetBrowserPair(std::string& id) {
_mouseOnPair = nullptr;
}
void SkyBrowserModule::set3dBrowser(SceneGraphNode* node) {
_browser3d = node;
void SkyBrowserModule::set3dBrowser(const std::string& id)
{
SceneGraphNode* node = global::renderEngine->scene()->sceneGraphNode(id);
if (node) {
// Add to module
_browser3dNode = node;
_browser3d = dynamic_cast<RenderableSkyBrowser*>(_browser3dNode->renderable());
}
}
void SkyBrowserModule::selectImage2dBrowser(int i)
@@ -623,11 +633,11 @@ void SkyBrowserModule::selectImage2dBrowser(int i)
void SkyBrowserModule::selectImage3dBrowser(int i)
{
if (!_browser3d) {
if (!_browser3dNode) {
return;
}
RenderableSkyBrowser* renderable = dynamic_cast<RenderableSkyBrowser*>(
_browser3d->renderable());
_browser3dNode->renderable());
if (renderable) {
const ImageData& image = _dataHandler->getImage(i);
renderable->displayImage(image, i);
@@ -660,6 +670,13 @@ void SkyBrowserModule::moveHoverCircle(int i)
}
}
void SkyBrowserModule::disableHoverCircle()
{
if (_hoverCircle && _hoverCircle->isEnabled()) {
_hoverCircle->property("Enabled")->set(false);
}
}
void SkyBrowserModule::loadImages(const std::string& root, const std::string& directory,
std::vector<std::filesystem::path>& speckFiles)
{
@@ -671,6 +688,23 @@ int SkyBrowserModule::nLoadedImages()
return _dataHandler->nLoadedImages();
}
void SkyBrowserModule::add2dSelectedImagesTo3d(const std::string& pairId)
{
Pair* pair = getPair(pairId);
if (pair && get3dBrowser()) {
// Empty 3D browser selection
get3dBrowser()->getSelectedImages().clear();
// Copy 2D selection of images to 3D browser
const std::deque<int> images = pair->getSelectedImages();
std::for_each(std::begin(images), std::end(images), [&](const int i) {
const ImageData& image = _dataHandler->getImage(i);
get3dBrowser()->displayImage(image, i);
});
}
}
const std::unique_ptr<WwtDataHandler>& SkyBrowserModule::getWWTDataHandler() {
return _dataHandler;
}
@@ -691,15 +725,31 @@ Pair* SkyBrowserModule::getPair(std::string id)
return &(*it);
}
SceneGraphNode* SkyBrowserModule::get3dBrowser() {
SceneGraphNode* SkyBrowserModule::get3dBrowserNode() {
return _browser3dNode;
}
RenderableSkyBrowser* SkyBrowserModule::get3dBrowser(const std::string& id)
{
if (_browser3dNode->identifier() == id || _browser3d->identifier() == id) {
return _browser3d;
}
else {
return nullptr;
}
}
RenderableSkyBrowser* SkyBrowserModule::get3dBrowser()
{
return _browser3d;
}
void SkyBrowserModule::lookAt3dBrowser() {
if (!_browser3d) {
if (!_browser3dNode) {
return;
}
std::string id = _browser3d->identifier();
std::string id = _browser3dNode->identifier();
// Target camera on the 3D sky browser
openspace::global::scriptEngine->queueScript(
"openspace.setPropertyValueSingle(\"NavigationHandler.OrbitalNavigator."
@@ -718,6 +768,18 @@ void SkyBrowserModule::lookAt3dBrowser() {
);
}
void SkyBrowserModule::place3dBrowser(const ImageData& image, const int i)
{
// If the image has a 3D position, add it to the scene graph
if (image.has3dCoords && get3dBrowser()) {
get3dBrowser()->displayImage(image, i);
get3dBrowser()->placeAt3dPosition(image);
}
else {
LINFO("Image has no 3D coordinate!");
}
}
void SkyBrowserModule::startRotatingCamera(glm::dvec3 endAnimation) {
// Save coordinates to rotate to in galactic world coordinates
_endAnimation = endAnimation;
@@ -756,10 +818,11 @@ void SkyBrowserModule::incrementallyFadeBrowserTargets(Transparency goal, float
bool isAllFinished{ false };
for (Pair& pair : _targetsBrowsers) {
if (pair.isEnabled()) {
pair.incrementallyFade(transparency, _fadingTime, deltaTime);
bool isPairFinished = pair.hasFinishedFading(transparency);
if (isPairFinished && goal == Transparency::Transparent) {
if (!isPairFinished) {
pair.incrementallyFade(transparency, _fadingTime, deltaTime);
}
else if (isPairFinished && goal == Transparency::Transparent) {
pair.disable();
}
isAllFinished &= isPairFinished;
@@ -787,8 +850,10 @@ void SkyBrowserModule::setSelectedBrowser(ScreenSpaceSkyBrowser* browser) {
}
}
void SkyBrowserModule::setSelectedBrowser(std::string id) {
_selectedBrowser = id;
void SkyBrowserModule::setSelectedBrowser(const std::string& id) {
if (getPair(id) || _browser3dNode->identifier() == id) {
_selectedBrowser = id;
}
}
std::string SkyBrowserModule::selectedBrowserId() {

View File

@@ -40,6 +40,7 @@
namespace openspace {
class ScreenSpaceSkyBrowser;
class RenderableSkyBrowser;
enum class Transparency {
Transparent = 0,
@@ -59,46 +60,49 @@ public:
// Getters
std::vector<Pair>& getPairs();
Pair* getPair(std::string id);
SceneGraphNode* get3dBrowser();
SceneGraphNode* get3dBrowserNode();
RenderableSkyBrowser* get3dBrowser();
RenderableSkyBrowser* get3dBrowser(const std::string& id);
const std::unique_ptr<WwtDataHandler>& getWWTDataHandler();
std::string selectedBrowserId();
// Setters
void set3dBrowser(const std::string& id);
void setSelectedBrowser(ScreenSpaceSkyBrowser* ptr);
void setSelectedBrowser(std::string id);
void set3dBrowser(SceneGraphNode* node);
void setSelectedBrowser(const std::string& id);
void selectImage2dBrowser(int i);
void selectImage3dBrowser(int i);
void setSelectedObject(); // Manage mouse interactions
// Rotation and animation
// Rotation, animation, placement
void lookAtTarget(std::string id);
void incrementallyRotateCamera(double deltaTime);
void incrementallyFadeBrowserTargets(Transparency goal, float deltaTime);
void incrementallyAnimateTargets(double deltaTime);
void lookAt3dBrowser();
void place3dBrowser(const ImageData& image, const int i);
// Boolean functions
bool isCameraInSolarSystem();
// Managing the browsers
// Managing the target browser pairs
void createTargetBrowserPair();
void removeTargetBrowserPair(std::string& browserId);
void addTargetBrowserPair(std::string targetId, std::string browserId);
// Hover circle
void moveHoverCircle(int i);
void disableHoverCircle();
// Image collection handling
void loadImages(const std::string& root, const std::string& directory,
std::vector<std::filesystem::path>& speckFiles);
int nLoadedImages();
// Manage mouse interactions
void setSelectedObject();
void add2dSelectedImagesTo3d(const std::string& pairId);
scripting::LuaLibrary luaLibrary() const override;
//std::vector<documentation::Documentation> documentations() const override;
protected:
void internalInitialize(const ghoul::Dictionary& dict) override;
void internalDeinitialize() override;
@@ -112,7 +116,8 @@ private:
Pair* _selectedPair{ nullptr };
bool _isBrowser{ false };
ScreenSpaceImageLocal* _hoverCircle{ nullptr };
SceneGraphNode* _browser3d{ nullptr };
SceneGraphNode* _browser3dNode{ nullptr };
RenderableSkyBrowser* _browser3d{ nullptr };
std::string _selectedBrowser{ "" }; // Currently selected browser (2D or 3D)
// Fading

View File

@@ -1,7 +1,6 @@
#include <modules/skybrowser/skybrowsermodule.h>
#include <modules/skybrowser/include/renderableskybrowser.h>
#include <modules/skybrowser/include/utility.h>
#include <openspace/engine/moduleengine.h>
#include <openspace/engine/globals.h>
@@ -45,11 +44,8 @@ namespace openspace::skybrowser::luascriptfunctions {
int disableHoverCircle(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::disableHoverCircle");
ScreenSpaceImageLocal* hoverCircle = dynamic_cast<ScreenSpaceImageLocal*>(
global::renderEngine->screenSpaceRenderable("HoverCircle"));
if (hoverCircle->isEnabled()) {
hoverCircle->property("Enabled")->set(false);
}
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
module->disableHoverCircle();
return 0;
}
@@ -85,10 +81,8 @@ namespace openspace::skybrowser::luascriptfunctions {
if (module->getPair(id)) {
module->getPair(id)->setImageOrder(i, order);
}
else if (module->get3dBrowser() != nullptr) {
RenderableSkyBrowser* browser3d = dynamic_cast<RenderableSkyBrowser*>(
module->get3dBrowser()->renderable());
browser3d->setImageLayerOrder(i, order);
else if (module->get3dBrowser(id)) {
module->get3dBrowser(id)->setImageLayerOrder(i, order);
}
return 0;
@@ -111,19 +105,14 @@ namespace openspace::skybrowser::luascriptfunctions {
if (module->getPair(id)) {
module->getPair(id)->loadImages(root);
}
else {
SceneGraphNode* node = global::renderEngine->scene()->sceneGraphNode(id);
if (node) {
RenderableSkyBrowser* browser3d = dynamic_cast<RenderableSkyBrowser*>(
node->renderable());
if (browser3d) {
// Load Image collections
browser3d->stopSyncingWwtView();
LINFO("Load images to " + browser3d->identifier());
browser3d->sendMessageToWwt(wwtmessage::loadCollection(root));
LINFO("Image collection loaded in " + browser3d->identifier());
}
}
else if (module->get3dBrowser(id)) {
// Load Image collections
module->get3dBrowser(id)->stopSyncingWwtView();
LINFO("Load images to " + module->get3dBrowser(id)->identifier());
module->get3dBrowser(id)->sendMessageToWwt(wwtmessage::loadCollection(root));
LINFO("Image collection loaded in " + module->get3dBrowser(id)->identifier());
}
return 0;
@@ -139,12 +128,9 @@ namespace openspace::skybrowser::luascriptfunctions {
for (Pair pair : pairs) {
pair.sendIdToBrowser();
}
SceneGraphNode* node = module->get3dBrowser();
if(node) {
std::string id = node->identifier();
RenderableSkyBrowser* browsers3d = dynamic_cast<RenderableSkyBrowser*>(
node->renderable());
browsers3d->setIdInBrowser(id);
if(module->get3dBrowser()) {
std::string id = module->get3dBrowserNode()->identifier();
module->get3dBrowser()->setIdInBrowser(id);
}
return 0;
}
@@ -172,17 +158,10 @@ namespace openspace::skybrowser::luascriptfunctions {
if (module->getPair(id)) {
module->getPair(id)->synchronizeWithWwt();
}
else {
SceneGraphNode* node = global::renderEngine->scene()->sceneGraphNode(id);
if (node) {
RenderableSkyBrowser* browser3d = dynamic_cast<RenderableSkyBrowser*>(
node->renderable());
if (browser3d && id == node->identifier()) {
// Initialize
LINFO("Initializing 3D sky browsers");
browser3d->syncWwtView();
}
}
else if(module->get3dBrowser(id)) {
// Initialize
LINFO("Initializing 3D sky browsers");
module->get3dBrowser()->syncWwtView();
}
return 0;
@@ -194,11 +173,7 @@ namespace openspace::skybrowser::luascriptfunctions {
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
LINFO("Add to sky browser module id " + id);
SceneGraphNode* node = global::renderEngine->scene()->sceneGraphNode(id);
if (node) {
// Add to module
module->set3dBrowser(node);
}
module->set3dBrowser(id);
return 0;
}
@@ -302,11 +277,14 @@ namespace openspace::skybrowser::luascriptfunctions {
// Add the window data for OpenSpace
ghoul::lua::push(L, "OpenSpace");
lua_newtable(L);
glm::dvec3 cartesian = skybrowser::cameraDirectionEquatorial();
glm::dvec2 spherical = skybrowser::cartesianToSpherical(cartesian);
glm::dvec3 cartesianCam = skybrowser::cameraDirectionEquatorial();
glm::dvec2 sphericalCam = skybrowser::cartesianToSpherical(cartesianCam);
// Convert to vector so ghoul can read it
std::vector<double> viewDirCelestVec = { cartesian.x, cartesian.y, cartesian.z };
std::vector<double> viewDirCelestVec = {
cartesianCam.x,
cartesianCam.y,
cartesianCam.z
};
// Calculate the smallest FOV of vertical and horizontal
glm::dvec2 fovs = skybrowser::fovWindow();
@@ -316,9 +294,9 @@ namespace openspace::skybrowser::luascriptfunctions {
lua_settable(L, -3);
ghoul::lua::push(L, "cartesianDirection", viewDirCelestVec);
lua_settable(L, -3);
ghoul::lua::push(L, "ra", spherical.x);
ghoul::lua::push(L, "ra", sphericalCam.x);
lua_settable(L, -3);
ghoul::lua::push(L, "dec", spherical.y);
ghoul::lua::push(L, "dec", sphericalCam.y);
lua_settable(L, -3);
ghoul::lua::push(L, "selectedBrowserId", module->selectedBrowserId());
lua_settable(L, -3);
@@ -379,17 +357,14 @@ namespace openspace::skybrowser::luascriptfunctions {
}
}
else if(module->get3dBrowser()){
SceneGraphNode* node = module->get3dBrowser();
RenderableSkyBrowser* browser3d = dynamic_cast<RenderableSkyBrowser*>(
node->renderable());
else if(module->get3dBrowser()){
// Convert deque to vector so ghoul can read it
std::vector<int> selectedImagesVector;
std::deque<int> selectedImages = browser3d->getSelectedImages();
std::deque<int> selectedImages = module->get3dBrowser()->getSelectedImages();
std::for_each(selectedImages.begin(), selectedImages.end(), [&](int index) {
selectedImagesVector.push_back(index);
});
glm::dvec3 position3dBrowser = node->position();
glm::dvec3 position3dBrowser = module->get3dBrowserNode()->position();
glm::dvec3 cartesian = skybrowser::galacticToEquatorial(position3dBrowser);
glm::dvec2 spherical = skybrowser::cartesianToSpherical(cartesian);
std::vector<double> celestialCartVec = {
@@ -401,14 +376,14 @@ namespace openspace::skybrowser::luascriptfunctions {
//glm::ivec3 color = browser->_borderColor.value();
std::vector<int> colorVec = { 200, 200, 200 };
ghoul::lua::push(L, browser3d->identifier());
ghoul::lua::push(L, module->get3dBrowser()->identifier());
lua_newtable(L);
// Push ("Key", value)
ghoul::lua::push(L, "id", browser3d->identifier());
ghoul::lua::push(L, "id", module->get3dBrowser()->identifier());
lua_settable(L, -3);
ghoul::lua::push(L, "name", node->guiName());
ghoul::lua::push(L, "name", module->get3dBrowserNode()->guiName());
lua_settable(L, -3);
ghoul::lua::push(L, "FOV", browser3d->verticalFov());
ghoul::lua::push(L, "FOV", module->get3dBrowser()->verticalFov());
lua_settable(L, -3);
ghoul::lua::push(L, "selectedImages", selectedImagesVector);
lua_settable(L, -3);
@@ -445,22 +420,9 @@ namespace openspace::skybrowser::luascriptfunctions {
int set3dSelectedImagesAs2dSelection(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::set3dSelectedImagesAs2dSelection");
const std::string id = ghoul::lua::value<std::string>(L, 1);
const std::string pairId = ghoul::lua::value<std::string>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
Pair* pair = module->getPair(id);
if (pair && module->get3dBrowser()) {
RenderableSkyBrowser* browser3d = dynamic_cast<RenderableSkyBrowser*>(
module->get3dBrowser()->renderable());
// Empty 3D browser selection
browser3d->getSelectedImages().clear();
// Copy 2D selection of images to 3D browser
const std::deque<int> images = pair->getSelectedImages();
std::for_each(std::begin(images), std::end(images), [&](const int i) {
const ImageData& image = module->getWWTDataHandler()->getImage(i);
browser3d->displayImage(image, i);
});
}
module->add2dSelectedImagesTo3d(pairId);
return 0;
}
@@ -480,10 +442,8 @@ namespace openspace::skybrowser::luascriptfunctions {
module->getPair(id)->setImageOpacity(i, opacity);
}
else if (module->get3dBrowser() != nullptr) {
RenderableSkyBrowser* browser3d = dynamic_cast<RenderableSkyBrowser*>(
module->get3dBrowser()->renderable());
browser3d->sendMessageToWwt(message);
else if (module->get3dBrowser(id)) {
module->get3dBrowser(id)->sendMessageToWwt(message);
}
return 0;
@@ -505,9 +465,9 @@ namespace openspace::skybrowser::luascriptfunctions {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::setSelectedBrowser");
const std::string id = ghoul::lua::value<std::string>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
if (module->getPair(id)) {
module->setSelectedBrowser(id);
}
module->setSelectedBrowser(id);
return 0;
}
@@ -535,16 +495,7 @@ namespace openspace::skybrowser::luascriptfunctions {
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
const ImageData image = module->getWWTDataHandler()->getImage(i);
// If the image has a 3D position, add it to the scene graph
if (image.has3dCoords && module->get3dBrowser()) {
RenderableSkyBrowser* browser = dynamic_cast<RenderableSkyBrowser*>(
module->get3dBrowser()->renderable());
browser->displayImage(image, i);
browser->placeAt3dPosition(image);
}
else {
LINFO("Image has no 3D coordinate!");
}
module->place3dBrowser(image, i);
return 0;
}
@@ -562,10 +513,8 @@ namespace openspace::skybrowser::luascriptfunctions {
if (pair) {
pair->removeSelectedImage(i);
}
else if (module->get3dBrowser() != nullptr) {
RenderableSkyBrowser* browser3d = dynamic_cast<RenderableSkyBrowser*>(
module->get3dBrowser()->renderable());
browser3d->removeSelectedImage(image, i);
else if (module->get3dBrowser(id)) {
module->get3dBrowser(id)->removeSelectedImage(image, i);
}
return 0;
}

View File

@@ -243,6 +243,9 @@ namespace openspace {
void Pair::incrementallyFade(float goalState, float fadeTime, float deltaTime)
{
float opacityDelta = static_cast<float>(deltaTime / fadeTime);
if (_target->opacity() > goalState) {
opacityDelta *= -1.f;
}
if (!isTargetFadeFinished(goalState)) {
_target->setOpacity(_target->opacity() + opacityDelta);

View File

@@ -138,8 +138,8 @@ namespace openspace {
ScreenSpaceSkyBrowser::~ScreenSpaceSkyBrowser() {
// Set flag to false so the thread can exit
_isSyncedWithWwt = false;
if (_threadWwtMessages.joinable()) {
_threadWwtMessages.join();
if (_wwtMessages.joinable()) {
_wwtMessages.join();
LINFO("Joined thread");
}
}
@@ -198,8 +198,8 @@ namespace openspace {
bool ScreenSpaceSkyBrowser::deinitializeGL() {
// Set flag to false so the thread can exit
_isSyncedWithWwt = false;
if (_threadWwtMessages.joinable()) {
_threadWwtMessages.join();
if (_wwtMessages.joinable()) {
_wwtMessages.join();
LINFO("Joined thread");
}
return ScreenSpaceBrowser::deinitializeGL();
@@ -311,7 +311,7 @@ namespace openspace {
void ScreenSpaceSkyBrowser::syncWwtView() {
// Start a thread to enable user interaction while sending the calls to WWT
_threadWwtMessages = std::thread([&] {
_wwtMessages = std::thread([&] {
while (_isSyncedWithWwt) {
if (_skyTarget) {
// Message WorldWide Telescope current view