Fix so backend can handle layer ordering

This commit is contained in:
Ylva Selling
2021-06-09 09:56:02 +02:00
parent 86fbde2af8
commit 01c393ab8b
9 changed files with 55 additions and 29 deletions

View File

@@ -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:

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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;
}