diff --git a/include/openspace/rendering/screenspacerenderable.h b/include/openspace/rendering/screenspacerenderable.h index 86d0fd4668..7c271b381d 100644 --- a/include/openspace/rendering/screenspacerenderable.h +++ b/include/openspace/rendering/screenspacerenderable.h @@ -53,6 +53,7 @@ namespace openspace { */ class ScreenSpaceRenderable : public properties::PropertyOwner { public: + static ScreenSpaceRenderable* createFromDictionary(const ghoul::Dictionary& dictionary); ScreenSpaceRenderable(); ~ScreenSpaceRenderable(); diff --git a/modules/base/basemodule.cpp b/modules/base/basemodule.cpp index 1a7c095bdf..7e6c1148a7 100644 --- a/modules/base/basemodule.cpp +++ b/modules/base/basemodule.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -42,6 +43,8 @@ #include #include #include +#include +#include #include #include @@ -59,6 +62,12 @@ void BaseModule::internalInitialize() { FactoryManager::ref().addFactory(std::make_unique>()); FactoryManager::ref().addFactory(std::make_unique>()); + auto fScreenSpaceRenderable = FactoryManager::ref().factory(); + ghoul_assert(fScreenSpaceRenderable, "ScreenSpaceRenderable factory was not created"); + + fScreenSpaceRenderable->registerClass("ScreenSpaceImage"); + fScreenSpaceRenderable->registerClass("ScreenSpaceFramebuffer"); + auto fRenderable = FactoryManager::ref().factory(); ghoul_assert(fRenderable, "Renderable factory was not created"); diff --git a/modules/base/rendering/screenspaceframebuffer.cpp b/modules/base/rendering/screenspaceframebuffer.cpp index 9f042bafd4..835883fda4 100644 --- a/modules/base/rendering/screenspaceframebuffer.cpp +++ b/modules/base/rendering/screenspaceframebuffer.cpp @@ -32,7 +32,7 @@ #include namespace openspace { -ScreenSpaceFramebuffer::ScreenSpaceFramebuffer() +ScreenSpaceFramebuffer::ScreenSpaceFramebuffer(const ghoul::Dictionary& dictionary) :ScreenSpaceRenderable() ,_size("size", "Size", glm::vec4(0), glm::vec4(0), glm::vec4(2000)) ,_framebuffer(nullptr) diff --git a/modules/base/rendering/screenspaceframebuffer.h b/modules/base/rendering/screenspaceframebuffer.h index 98972c88f2..e9f6586bb1 100644 --- a/modules/base/rendering/screenspaceframebuffer.h +++ b/modules/base/rendering/screenspaceframebuffer.h @@ -38,7 +38,7 @@ namespace openspace { */ class ScreenSpaceFramebuffer : public ScreenSpaceRenderable { public: - ScreenSpaceFramebuffer(); + ScreenSpaceFramebuffer(const ghoul::Dictionary& dictionary = ghoul::Dictionary()); ~ScreenSpaceFramebuffer(); bool initialize() override; diff --git a/modules/base/rendering/screenspaceimage.cpp b/modules/base/rendering/screenspaceimage.cpp index a3dbc8c2b1..fad0a4f16f 100644 --- a/modules/base/rendering/screenspaceimage.cpp +++ b/modules/base/rendering/screenspaceimage.cpp @@ -33,7 +33,6 @@ namespace openspace { ScreenSpaceImage::ScreenSpaceImage(std::string texturePath) :ScreenSpaceRenderable() ,_texturePath("texturePath", "Texture path", texturePath) - { _id = id(); setName("ScreenSpaceImage" + std::to_string(_id)); @@ -45,6 +44,24 @@ ScreenSpaceImage::ScreenSpaceImage(std::string texturePath) _texturePath.onChange([this](){ loadTexture(); }); } +ScreenSpaceImage::ScreenSpaceImage(const ghoul::Dictionary& dictionary) + :ScreenSpaceRenderable() + ,_texturePath("texturePath", "Texture path", "") +{ + _id = id(); + setName("ScreenSpaceImage" + std::to_string(_id)); + + std::string texturePath; + dictionary.getValue("TexturePath", texturePath); + _texturePath.set(texturePath); + + registerProperties(); + + addProperty(_texturePath); + OsEng.gui()._screenSpaceProperty.registerProperty(&_texturePath); + _texturePath.onChange([this](){ loadTexture(); }); +} + ScreenSpaceImage::~ScreenSpaceImage(){} bool ScreenSpaceImage::initialize(){ diff --git a/modules/base/rendering/screenspaceimage.h b/modules/base/rendering/screenspaceimage.h index 108340b9fd..58a693384e 100644 --- a/modules/base/rendering/screenspaceimage.h +++ b/modules/base/rendering/screenspaceimage.h @@ -39,6 +39,7 @@ class ScreenSpaceImage : public ScreenSpaceRenderable { public: ScreenSpaceImage(std::string texturePath); + ScreenSpaceImage(const ghoul::Dictionary& dictionary); ~ScreenSpaceImage(); bool initialize() override; diff --git a/modules/iswa/iswamodule.cpp b/modules/iswa/iswamodule.cpp index 861c58be89..dd7be548e9 100644 --- a/modules/iswa/iswamodule.cpp +++ b/modules/iswa/iswamodule.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -33,6 +34,7 @@ #include #include #include +#include namespace openspace { @@ -41,6 +43,7 @@ namespace openspace { {} void ISWAModule::internalInitialize(){ + FactoryManager::ref().addFactory(std::make_unique>()); auto fRenderable = FactoryManager::ref().factory(); ghoul_assert(fRenderable, "No renderable factory existed"); @@ -48,5 +51,10 @@ namespace openspace { fRenderable->registerClass("TexturePlane"); fRenderable->registerClass("DataPlane"); fRenderable->registerClass("KameleonPlane"); + + auto fScreenSpaceRenderable = FactoryManager::ref().factory(); + ghoul_assert(fScreenSpaceRenderable, "No fScreenSpaceRenderable factory existed"); + + fScreenSpaceRenderable->registerClass("ScreenSpaceCygnet"); } } \ No newline at end of file diff --git a/modules/iswa/rendering/screenspacecygnet.cpp b/modules/iswa/rendering/screenspacecygnet.cpp index 4adba01aa1..8cc5447715 100644 --- a/modules/iswa/rendering/screenspacecygnet.cpp +++ b/modules/iswa/rendering/screenspacecygnet.cpp @@ -45,6 +45,21 @@ ScreenSpaceCygnet::ScreenSpaceCygnet(int cygnetId) registerProperties(); } +ScreenSpaceCygnet::ScreenSpaceCygnet(const ghoul::Dictionary& dictionary) + : ScreenSpaceRenderable() + , _updateInterval("updateInterval", "Update Interval", 1.0, 0.0 , 10.0) +{ + // hacky, have to first get as float and the cast to int. + float cygnetid; + dictionary.getValue("CygnetId", cygnetid); + _cygnetId = (int)cygnetid; + + setName("iSWACygnet" + std::to_string(_cygnetId)); + addProperty(_updateInterval); + + registerProperties(); +} + ScreenSpaceCygnet::~ScreenSpaceCygnet(){} bool ScreenSpaceCygnet::initialize(){ diff --git a/modules/iswa/rendering/screenspacecygnet.h b/modules/iswa/rendering/screenspacecygnet.h index 7c1b0c0a99..60d4ff8c75 100644 --- a/modules/iswa/rendering/screenspacecygnet.h +++ b/modules/iswa/rendering/screenspacecygnet.h @@ -35,6 +35,7 @@ namespace openspace{ class ScreenSpaceCygnet : public ScreenSpaceRenderable { public: ScreenSpaceCygnet(int cygnetId); + ScreenSpaceCygnet(const ghoul::Dictionary& dictionary); ~ScreenSpaceCygnet(); void render() override; @@ -47,7 +48,7 @@ private: void updateTexture(); void loadTexture(); - const int _cygnetId; + int _cygnetId; properties::FloatProperty _updateInterval; std::chrono::milliseconds _realTime; diff --git a/modules/iswa/util/iswamanager.cpp b/modules/iswa/util/iswamanager.cpp index e4e941d2d1..a9004f94d1 100644 --- a/modules/iswa/util/iswamanager.cpp +++ b/modules/iswa/util/iswamanager.cpp @@ -305,7 +305,9 @@ namespace openspace{ } void ISWAManager::createScreenSpace(int id){ - OsEng.renderEngine().registerScreenSpaceRenderable(std::make_shared(id)); + std::string luaTable = "{ Type='ScreenSpaceCygnet', CygnetId = "+std::to_string(id)+"}"; + std::string script = "openspace.registerScreenSpaceRenderable(" + luaTable + ");"; + OsEng.scriptEngine().queueScript(script); } void ISWAManager::createKameleonPlane(std::string kwPath){ diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index a91df7e46c..c1b79fd039 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -380,7 +380,7 @@ void RenderEngine::postSynchronizationPreDraw() { _deletedScreenSpaceRenderables.clear(); for (auto screenspacerenderable : _screenSpaceRenderables) { - screenspacerenderable->update(); + screenspacerenderable->update(); } //Allow focus node to update camera (enables camera-following) //FIX LATER: THIS CAUSES MASTER NODE TO BE ONE FRAME AHEAD OF SLAVES @@ -646,6 +646,12 @@ scripting::ScriptEngine::LuaLibrary RenderEngine::luaLibrary() { "", true }, + { + "registerScreenSpaceRenderable", + &luascriptfunctions::registerScreenSpaceRenderable, + "table", + "Will create a ScreenSpaceRenderable from a lua Table and register it in the RenderEngine" + }, }, }; } diff --git a/src/rendering/renderengine_lua.inl b/src/rendering/renderengine_lua.inl index cd7b78885d..b11388dc43 100644 --- a/src/rendering/renderengine_lua.inl +++ b/src/rendering/renderengine_lua.inl @@ -133,6 +133,29 @@ int fadeOut(lua_State* L) { return 0; } +int registerScreenSpaceRenderable(lua_State* L) { + static const std::string _loggerCat = "registerScreenSpaceRenderable"; + using ghoul::lua::errorLocation; + + int nArguments = lua_gettop(L); + if (nArguments != 1) + return luaL_error(L, "Expected %i arguments, got %i", 1, nArguments); + + ghoul::Dictionary d; + try { + ghoul::lua::luaDictionaryFromState(L, d); + } + catch (const ghoul::lua::LuaFormatException& e) { + LERROR(e.what()); + return 0; + } + + std::shared_ptr s( ScreenSpaceRenderable::createFromDictionary(d) ); + OsEng.renderEngine().registerScreenSpaceRenderable(s); + + return 1; +} + } // namespace luascriptfunctions }// namespace openspace diff --git a/src/rendering/screenspacerenderable.cpp b/src/rendering/screenspacerenderable.cpp index 013a3485a2..6016f060fc 100644 --- a/src/rendering/screenspacerenderable.cpp +++ b/src/rendering/screenspacerenderable.cpp @@ -23,8 +23,37 @@ ****************************************************************************************/ #include #include +#include + +namespace { + const std::string _loggerCat = "ScreenSpaceRenderable"; + const std::string KeyType = "Type"; +} namespace openspace { + +ScreenSpaceRenderable* ScreenSpaceRenderable::createFromDictionary(const ghoul::Dictionary& dictionary) { + + std::string renderableType; + bool success = dictionary.getValue(KeyType, renderableType); + + if (!success) { + LERROR("ScreenSpaceRenderable did not have key '" << KeyType << "'"); + return nullptr; + } + + ghoul::TemplateFactory* factory + = FactoryManager::ref().factory(); + ScreenSpaceRenderable* result = factory->create(renderableType, dictionary); + if (result == nullptr) { + LERROR("Failed to create a ScreenSpaceRenderable object of type '" << renderableType << "'"); + return nullptr; + } + + return result; +} + + ScreenSpaceRenderable::ScreenSpaceRenderable() :_enabled("enabled", "Is Enabled", true) ,_useFlatScreen("flatScreen", "Flat Screen", true)