1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-12-27 07:06:00 +00:00

Add shader interface API to Lua API

This commit is contained in:
fgenesis 2013-05-12 00:06:26 +02:00
parent 2ac3ad9fb1
commit 8c80cf6318
3 changed files with 102 additions and 1 deletions

View file

@ -361,7 +361,7 @@ static void scriptError(lua_State *L, const std::string& msg)
// - The C++ standard allows offsetof() only on POD-types. Oh well, it probably works anyways. // - The C++ standard allows offsetof() only on POD-types. Oh well, it probably works anyways.
// If it does not compile for some reason, comment it out, hope for the best, and go ahead. // If it does not compile for some reason, comment it out, hope for the best, and go ahead.
#if !(defined(__GNUC__) && __GNUC__ <= 2) #if !(defined(__GNUC__) && __GNUC__ <= 2)
void compile_time_assertions() static void compile_time_assertions()
{ {
#define oo(cls) offsetof(cls, _objtype) #define oo(cls) offsetof(cls, _objtype)
compile_assert(oo(Path) == oo(RenderObject)); compile_assert(oo(Path) == oo(RenderObject));
@ -378,6 +378,7 @@ void compile_time_assertions()
compile_assert(oo(Path) == oo(Avatar)); compile_assert(oo(Path) == oo(Avatar));
compile_assert(oo(Path) == oo(BaseText)); compile_assert(oo(Path) == oo(BaseText));
compile_assert(oo(Path) == oo(PauseQuad)); compile_assert(oo(Path) == oo(PauseQuad));
compile_assert(oo(Path) == oo(Shader));
#undef oo #undef oo
} }
#endif #endif
@ -458,6 +459,12 @@ std::string getString(lua_State *L, int slot = 1)
return sr; return sr;
} }
static inline
const char *getCString(lua_State *L, int slot = 1)
{
return lua_isstring(L, slot) ? lua_tostring(L, slot) : NULL;
}
static inline static inline
Shot *getShot(lua_State *L, int slot = 1) Shot *getShot(lua_State *L, int slot = 1)
{ {
@ -579,6 +586,16 @@ BaseText *getText(lua_State *L, int slot = 1)
return q; return q;
} }
static inline
Shader *getShader(lua_State *L, int slot = 1)
{
Shader *q = (Shader*)lua_touserdata(L, slot);
ENSURE_TYPE(q, SCO_SHADER);
if (!q)
scriptDebug(L, "Invalid Shader");
return q;
}
static SkeletalSprite *getSkeletalSprite(Entity *e) static SkeletalSprite *getSkeletalSprite(Entity *e)
{ {
return e ? &e->skeletalSprite : NULL; return e ? &e->skeletalSprite : NULL;
@ -7680,6 +7697,70 @@ luaFunc(text_setWidth)
luaReturnNil(); luaReturnNil();
} }
luaFunc(loadShader)
{
const char *vertRaw = getCString(L, 1);
const char *fragRaw = getCString(L, 2);
std::string vert, frag;
if(vertRaw)
findFile_helper(vertRaw, vert);
if(fragRaw)
findFile_helper(fragRaw, frag);
Shader *sh = new Shader();
sh->load(vert, frag);
if(!sh->isLoaded())
{
delete sh;
sh = NULL;
}
luaReturnPtr(sh);
}
luaFunc(createShader)
{
Shader *sh = new Shader();
sh->loadSrc(getCString(L, 1), getCString(L, 2));
if(!sh->isLoaded())
{
delete sh;
sh = NULL;
}
luaReturnPtr(sh);
}
luaFunc(shader_setAsAfterEffect)
{
core->afterEffectManager->scriptShader = lua_isuserdata(L, 1) ? getShader(L, 1) : NULL;
luaReturnNil();
}
luaFunc(shader_setInt)
{
Shader *sh = getShader(L, 1);
const char *name = getCString(L, 2);
if(sh && name)
sh->setInt(name, lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5), lua_tointeger(L, 6));
luaReturnNil();
}
luaFunc(shader_setFloat)
{
Shader *sh = getShader(L, 1);
const char *name = getCString(L, 2);
if(sh && name)
sh->setFloat(name, lua_tonumber(L, 3), lua_tonumber(L, 4), lua_tonumber(L, 5), lua_tonumber(L, 6));
luaReturnNil();
}
luaFunc(shader_delete)
{
Shader *sh = getShader(L);
delete sh;
if(core->afterEffectManager->scriptShader == sh)
core->afterEffectManager->scriptShader = NULL;
luaReturnNil();
}
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
@ -8550,6 +8631,13 @@ static const struct {
luaRegister(text_setFontSize), luaRegister(text_setFontSize),
luaRegister(text_setWidth), luaRegister(text_setWidth),
luaRegister(loadShader),
luaRegister(createShader),
luaRegister(shader_setAsAfterEffect),
luaRegister(shader_setFloat),
luaRegister(shader_setInt),
luaRegister(shader_delete),
luaRegister(isQuad), luaRegister(isQuad),
luaRegister(isNode), luaRegister(isNode),
luaRegister(isObject), luaRegister(isObject),

View file

@ -35,6 +35,7 @@ AfterEffectManager::AfterEffectManager(int xDivs, int yDivs)
activeShader = AS_NONE; activeShader = AS_NONE;
numEffects = 0; numEffects = 0;
bRenderGridPoints = true; bRenderGridPoints = true;
scriptShader = 0;
screenWidth = core->getWindowWidth(); screenWidth = core->getWindowWidth();
screenHeight = core->getWindowHeight(); screenHeight = core->getWindowHeight();
@ -245,6 +246,7 @@ void AfterEffectManager::setActiveShader(ActiveShader as)
activeShader = as; activeShader = as;
} }
void AfterEffectManager::renderGrid() void AfterEffectManager::renderGrid()
{ {
#ifdef BBGE_BUILD_OPENGL #ifdef BBGE_BUILD_OPENGL
@ -278,11 +280,21 @@ void AfterEffectManager::renderGrid()
activeShader = &glowShader; activeShader = &glowShader;
break; break;
} }
if(scriptShader)
activeShader = scriptShader;
} }
if (activeShader) if (activeShader)
{
//while(glGetError() != GL_NO_ERROR) {}
activeShader->bind(); activeShader->bind();
activeShader->setInt("tex", 0);
}
screenWidth = core->getWindowWidth(); screenWidth = core->getWindowWidth();
screenHeight = core->getWindowHeight(); screenHeight = core->getWindowHeight();

View file

@ -125,6 +125,7 @@ public:
int textureWidth, textureHeight; int textureWidth, textureHeight;
Shader blurShader, bwShader, washoutShader, motionBlurShader, glowShader; Shader blurShader, bwShader, washoutShader, motionBlurShader, glowShader;
Shader *scriptShader;
Vector ** drawGrid; Vector ** drawGrid;