diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index a91216e8a6..9f612d6a07 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -63,6 +63,8 @@ public: // Copies rendered void addRenderCopy(const glm::vec3& raePosition, int nCopies); void removeRenderCopy(); + std::vector renderCopies(); + void moveRenderCopy(int i, glm::vec3 raePosition); private: properties::FloatProperty _textureQuality; diff --git a/modules/skybrowser/include/targetbrowserpair.h b/modules/skybrowser/include/targetbrowserpair.h index f9a613133e..cc22254764 100644 --- a/modules/skybrowser/include/targetbrowserpair.h +++ b/modules/skybrowser/include/targetbrowserpair.h @@ -64,6 +64,7 @@ public: // Browser void sendIdToBrowser(); void updateBrowserSize(); + std::vector renderCopies(); // Target void centerTargetOnScreen(); diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 0198396229..a5dbbf83d9 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -564,7 +564,8 @@ scripting::LuaLibrary SkyBrowserModule::luaLibrary() const { codegen::lua::TranslateScreenSpaceRenderable, codegen::lua::AddRenderCopy, codegen::lua::SetScreenSpaceSize, - codegen::lua::RemoveRenderCopy + codegen::lua::RemoveRenderCopy, + codegen::lua::MoveRenderCopy } }; } diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 815e3e668a..32776f098c 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -325,8 +325,13 @@ namespace { target.setValue("dec", spherical.y); target.setValue("color", pair->borderColor()); target.setValue("size", glm::dvec2(pair->size())); - + std::vector copies = pair->renderCopies(); + ghoul::Dictionary copiesData; + for (int i = 0; i < copies.size(); i++) { + copiesData.setValue("Copy" + std::to_string(i), copies[i]); + } // Set table for the current target + target.setValue("renderCopies", copiesData); data.setValue(id, target); } } @@ -618,6 +623,22 @@ namespace { pair->browser()->removeRenderCopy(); } } +/** +* Takes an identifier to a sky browser and the index to a render copy, and sets its RAE +* position. +* \param id Identifier +* \param i Index to the render copy +* \param raePosition Position in [Radius, Azimuth, Elevation] to move the render copy to +*/ +[[codegen::luawrap]] void moveRenderCopy(std::string id, int i, glm::vec3 raePosition) { + // Get module + SkyBrowserModule* module = global::moduleEngine->module(); + + TargetBrowserPair* pair = module->getPair(id); + if (pair) { + pair->browser()->moveRenderCopy(i, raePosition); + } +} #include "skybrowsermodule_lua_codegen.cpp" } // namespace diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index ad3d8e4996..f593a7c890 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -199,8 +199,28 @@ void ScreenSpaceSkyBrowser::addRenderCopy(const glm::vec3& raePosition, int nCop } void ScreenSpaceSkyBrowser::removeRenderCopy() { - removeProperty(_renderCopies.back().get()); - _renderCopies.pop_back(); + if (_renderCopies.size() > 0) { + removeProperty(_renderCopies.back().get()); + _renderCopies.pop_back(); + } +} + +std::vector ScreenSpaceSkyBrowser::renderCopies() +{ + std::vector vec; + std::for_each( + _renderCopies.begin(), + _renderCopies.end(), + [&](const std::unique_ptr& copy) { + vec.push_back(glm::dvec3(copy.get()->value())); + }); + return vec; +} + +void ScreenSpaceSkyBrowser::moveRenderCopy(int i, glm::vec3 raePosition) { + if (i < _renderCopies.size() && i >= 0) { + _renderCopies[i].get()->set(raePosition); + } } bool ScreenSpaceSkyBrowser::deinitializeGL() { diff --git a/modules/skybrowser/src/targetbrowserpair.cpp b/modules/skybrowser/src/targetbrowserpair.cpp index 6825f7daf0..786ef7c6d4 100644 --- a/modules/skybrowser/src/targetbrowserpair.cpp +++ b/modules/skybrowser/src/targetbrowserpair.cpp @@ -259,6 +259,11 @@ void TargetBrowserPair::updateBrowserSize() { _browser->updateBrowserSize(); } +std::vector TargetBrowserPair::renderCopies() +{ + return _browser->renderCopies(); +} + void TargetBrowserPair::setIsSyncedWithWwt(bool isSynced) { _browser->setIsSyncedWithWwt(isSynced); }