mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-01-04 18:51:17 -06:00
Fix so backend can handle layer ordering
This commit is contained in:
@@ -61,7 +61,7 @@ namespace openspace {
|
||||
void setIdInBrowser(std::string id);
|
||||
float fieldOfView() const;
|
||||
std::deque<int>& selectedImages();
|
||||
void setImageLayerOrder(int i, int order);
|
||||
void setImageLayerOrder(int i, int order, int version);
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace openspace {
|
||||
std::deque<int>& selectedImages();
|
||||
void addSelectedImage(ImageData& image, int i);
|
||||
void removeSelectedImage(ImageData& image, int i);
|
||||
void setImageLayerOrder(int i, int order);
|
||||
void setImageLayerOrder(int i, int order, int version);
|
||||
|
||||
// Translation
|
||||
//void translate(glm::vec2 translation);
|
||||
|
||||
@@ -46,11 +46,11 @@ namespace openspace {
|
||||
const double fov, const double roll, const bool moveInstantly = true);
|
||||
ghoul::Dictionary loadCollection(const std::string& url);
|
||||
ghoul::Dictionary setForeground(const std::string& name);
|
||||
ghoul::Dictionary createImageLayer(const std::string& imageUrl, const std::string& id);
|
||||
ghoul::Dictionary removeImageLayer(const std::string& imageId);
|
||||
ghoul::Dictionary setLayerOpacity(const std::string& imageId, double opacity);
|
||||
ghoul::Dictionary createImageLayer(const std::string& id, const std::string& url);
|
||||
ghoul::Dictionary removeImageLayer(const std::string& id);
|
||||
ghoul::Dictionary setLayerOpacity(const std::string& id, double opacity);
|
||||
ghoul::Dictionary setForegroundOpacity(double val);
|
||||
ghoul::Dictionary setLayerOrder(const std::string& id, int order);
|
||||
ghoul::Dictionary setLayerOrder(const std::string& id, int order, int version);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -256,6 +256,9 @@ SkyBrowserModule::SkyBrowserModule()
|
||||
, resizeVector(0.f, 0.f)
|
||||
, changeViewWithinBrowser(false)
|
||||
, _browser3d(nullptr)
|
||||
, _layerOrderCounter(0)
|
||||
, _cameraInSolarSystem(true)
|
||||
, highlightAddition(35, 35, 35)
|
||||
{
|
||||
global::callback::mousePosition->emplace_back(
|
||||
[&](double x, double y) {
|
||||
@@ -513,6 +516,10 @@ glm::vec2 SkyBrowserModule::getMousePositionInScreenSpaceCoords(glm::vec2& mouse
|
||||
return screenSpacePos;
|
||||
}
|
||||
|
||||
int SkyBrowserModule::getAndIncrementLayerOrder() {
|
||||
return _layerOrderCounter++;
|
||||
}
|
||||
|
||||
void SkyBrowserModule::addRenderable(ScreenSpaceRenderable* object) {
|
||||
renderables.push_back(object);
|
||||
// Sort on z coordinate, objects closer to camera are in beginning of list
|
||||
|
||||
@@ -76,6 +76,7 @@ public:
|
||||
void removeTargetBrowserPair(std::string& browserId);
|
||||
void place3dBrowser(ImageData& image);
|
||||
void lookAt3dBrowser();
|
||||
int getAndIncrementLayerOrder();
|
||||
|
||||
scripting::LuaLibrary luaLibrary() const override;
|
||||
//std::vector<documentation::Documentation> documentations() const override;
|
||||
@@ -116,9 +117,10 @@ protected:
|
||||
bool isRotating = false;
|
||||
// For tracking the currently selected browser
|
||||
std::string selectedBrowser;
|
||||
glm::ivec3 highlightAddition{ 35, 35, 35 };
|
||||
glm::ivec3 highlightAddition;
|
||||
// Mode of browsing
|
||||
bool _cameraInSolarSystem{ true };
|
||||
bool _cameraInSolarSystem;
|
||||
int _layerOrderCounter;
|
||||
};
|
||||
|
||||
} // namespace openspace
|
||||
|
||||
@@ -150,18 +150,17 @@ namespace openspace::skybrowser::luascriptfunctions {
|
||||
const int i = ghoul::lua::value<int>(L, 2);
|
||||
int order = ghoul::lua::value<int>(L, 3);
|
||||
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
|
||||
ghoul::Dictionary message = wwtmessage::setLayerOrder(std::to_string(i), order);
|
||||
int version = module->getAndIncrementLayerOrder();
|
||||
|
||||
if (module->browserIdExists(browserId)) {
|
||||
ScreenSpaceSkyBrowser* browser = module->getSkyBrowsers()[browserId];
|
||||
browser->sendMessageToWWT(message);
|
||||
browser->setImageLayerOrder(i, order);
|
||||
|
||||
browser->setImageLayerOrder(i, order, version);
|
||||
}
|
||||
else if (module->get3dBrowser() != nullptr) {
|
||||
RenderableSkyBrowser* browser3d = dynamic_cast<RenderableSkyBrowser*>(
|
||||
module->get3dBrowser()->renderable());
|
||||
browser3d->sendMessageToWWT(message);
|
||||
browser3d->setImageLayerOrder(i, order);
|
||||
browser3d->setImageLayerOrder(i, order, version);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -197,7 +197,7 @@ namespace openspace {
|
||||
// Push newly selected image to front
|
||||
_selectedImages.push_front(i);
|
||||
// Create image layer and center WWT app on the image
|
||||
sendMessageToWWT(wwtmessage::createImageLayer(image.imageUrl, std::to_string(i)));
|
||||
sendMessageToWWT(wwtmessage::createImageLayer(std::to_string(i), image.imageUrl));
|
||||
LINFO("Image has been loaded to " + identifier());
|
||||
}
|
||||
}
|
||||
@@ -249,13 +249,23 @@ namespace openspace {
|
||||
return _selectedImages;
|
||||
}
|
||||
|
||||
void RenderableSkyBrowser::setImageLayerOrder(int i, int order) {
|
||||
void RenderableSkyBrowser::setImageLayerOrder(int i, int order, int version) {
|
||||
// Remove from selected list
|
||||
auto it = std::find(std::begin(_selectedImages), std::end(_selectedImages), i);
|
||||
if (it != std::end(_selectedImages)) {
|
||||
_selectedImages.erase(it);
|
||||
_selectedImages.insert(std::begin(_selectedImages) + order, i);
|
||||
auto current = std::find(std::begin(_selectedImages), std::end(_selectedImages), i);
|
||||
auto target = std::begin(_selectedImages) + order;
|
||||
|
||||
// Make sure the image was found in the list
|
||||
if (current != std::end(_selectedImages) && target != std::end(_selectedImages)) {
|
||||
// Swap the two images
|
||||
std::iter_swap(current, target);
|
||||
}
|
||||
|
||||
int reverseOrder = _selectedImages.size() - order - 1;
|
||||
ghoul::Dictionary message = wwtmessage::setLayerOrder(std::to_string(i),
|
||||
reverseOrder, version);
|
||||
sendMessageToWWT(message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -341,7 +341,7 @@ namespace openspace {
|
||||
// Push newly selected image to front
|
||||
_selectedImages.push_front(i);
|
||||
// Index of image is used as layer ID as it is unique in the image data set
|
||||
sendMessageToWWT(wwtmessage::createImageLayer(image.imageUrl, std::to_string(i)));
|
||||
sendMessageToWWT(wwtmessage::createImageLayer(std::to_string(i), image.imageUrl));
|
||||
sendMessageToWWT(wwtmessage::setLayerOpacity(std::to_string(i), 1.0));
|
||||
}
|
||||
}
|
||||
@@ -355,13 +355,20 @@ namespace openspace {
|
||||
}
|
||||
}
|
||||
|
||||
void ScreenSpaceSkyBrowser::setImageLayerOrder(int i, int order) {
|
||||
void ScreenSpaceSkyBrowser::setImageLayerOrder(int i, int order, int version) {
|
||||
// Remove from selected list
|
||||
auto it = std::find(std::begin(_selectedImages), std::end(_selectedImages), i);
|
||||
if (it != std::end(_selectedImages)) {
|
||||
_selectedImages.erase(it);
|
||||
if(_selectedImages.size())
|
||||
_selectedImages.insert(std::begin(_selectedImages) + order, i);
|
||||
auto current = std::find(std::begin(_selectedImages), std::end(_selectedImages), i);
|
||||
auto target = std::begin(_selectedImages) + order;
|
||||
|
||||
// Make sure the image was found in the list
|
||||
if (current != std::end(_selectedImages) && target != std::end(_selectedImages)) {
|
||||
// Swap the two images
|
||||
std::iter_swap(current, target);
|
||||
}
|
||||
|
||||
int reverseOrder = _selectedImages.size() - order - 1;
|
||||
ghoul::Dictionary message = wwtmessage::setLayerOrder(std::to_string(i),
|
||||
reverseOrder, version);
|
||||
sendMessageToWWT(message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,12 +150,12 @@ namespace openspace::wwtmessage {
|
||||
return msg;
|
||||
}
|
||||
|
||||
ghoul::Dictionary createImageLayer(const std::string& imageUrl, const std::string& id) {
|
||||
ghoul::Dictionary createImageLayer(const std::string& id, const std::string& url) {
|
||||
using namespace std::string_literals;
|
||||
ghoul::Dictionary msg;
|
||||
msg.setValue("event", "image_layer_create"s);
|
||||
msg.setValue("id", id);
|
||||
msg.setValue("url", imageUrl);
|
||||
msg.setValue("url", url);
|
||||
msg.setValue("mode", "preloaded"s);
|
||||
msg.setValue("goto", false);
|
||||
|
||||
@@ -191,7 +191,7 @@ namespace openspace::wwtmessage {
|
||||
return msg;
|
||||
}
|
||||
|
||||
ghoul::Dictionary setLayerOrder(const std::string& id, int order) {
|
||||
ghoul::Dictionary setLayerOrder(const std::string& id, int order, int version) {
|
||||
// The lower the layer order, the more towards the back the image is placed
|
||||
// 0 is the background
|
||||
using namespace std::string_literals;
|
||||
@@ -199,6 +199,7 @@ namespace openspace::wwtmessage {
|
||||
msg.setValue("event", "image_layer_order"s);
|
||||
msg.setValue("id", id);
|
||||
msg.setValue("order", order);
|
||||
msg.setValue("version", version);
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user