ScreenSpaceRenderables can be creates through scripts, ScreenSpaceRenderable is now a factory

This commit is contained in:
Michael Nilsson
2016-05-03 10:39:32 -04:00
parent 40cd7e98ec
commit 4d61694f75
13 changed files with 118 additions and 6 deletions
+7 -1
View File
@@ -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"
},
},
};
}
+23
View File
@@ -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<ScreenSpaceRenderable> s( ScreenSpaceRenderable::createFromDictionary(d) );
OsEng.renderEngine().registerScreenSpaceRenderable(s);
return 1;
}
} // namespace luascriptfunctions
}// namespace openspace
+29
View File
@@ -23,8 +23,37 @@
****************************************************************************************/
#include <openspace/engine/openspaceengine.h>
#include <openspace/rendering/screenspacerenderable.h>
#include <openspace/util/factorymanager.h>
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<ScreenSpaceRenderable>* factory
= FactoryManager::ref().factory<ScreenSpaceRenderable>();
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)