aboutsummaryrefslogtreecommitdiff
path: root/engines/sword25/gfx/graphicengine_script.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sword25/gfx/graphicengine_script.cpp')
-rwxr-xr-xengines/sword25/gfx/graphicengine_script.cpp1722
1 files changed, 1722 insertions, 0 deletions
diff --git a/engines/sword25/gfx/graphicengine_script.cpp b/engines/sword25/gfx/graphicengine_script.cpp
new file mode 100755
index 0000000000..5419f09f2c
--- /dev/null
+++ b/engines/sword25/gfx/graphicengine_script.cpp
@@ -0,0 +1,1722 @@
+// -----------------------------------------------------------------------------
+// This file is part of Broken Sword 2.5
+// Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdörfer
+//
+// Broken Sword 2.5 is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// Broken Sword 2.5 is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Broken Sword 2.5; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// Includes
+// -----------------------------------------------------------------------------
+
+#include <algorithm>
+#include <string>
+
+#include "kernel/common.h"
+#include "kernel/kernel.h"
+#include "kernel/callbackregistry.h"
+#include "script/script.h"
+#include "script/luabindhelper.h"
+#include "script/luacallback.h"
+#include "math/vertex.h"
+
+#include "graphicengine.h"
+#include "renderobject.h"
+#include "bitmap.h"
+#include "animation.h"
+#include "panel.h"
+#include "text.h"
+#include "animationtemplate.h"
+#include "animationtemplateregistry.h"
+
+#define BS_LOG_PREFIX "GRAPHICENGINE"
+
+// -----------------------------------------------------------------------------
+// Callback-Objekte
+// -----------------------------------------------------------------------------
+
+static bool AnimationDeleteCallback(unsigned int Data);
+static bool AnimationActionCallback(unsigned int Data);
+static bool AnimationLoopPointCallback(unsigned int Data);
+
+namespace
+{
+ // -------------------------------------------------------------------------
+
+ class ActionCallback : public BS_LuaCallback
+ {
+ public:
+ ActionCallback(lua_State * L) : BS_LuaCallback(L) {};
+
+ std::string Action;
+
+ protected:
+ virtual int PreFunctionInvokation(lua_State * L)
+ {
+ lua_pushstring(L, Action.c_str());
+ return 1;
+ }
+ };
+
+ std::auto_ptr<BS_LuaCallback> LoopPointCallbackPtr;
+ std::auto_ptr<ActionCallback> ActionCallbackPtr;
+
+ // -------------------------------------------------------------------------
+
+ struct CallbackfunctionRegisterer
+ {
+ CallbackfunctionRegisterer()
+ {
+ BS_CallbackRegistry::GetInstance().RegisterCallbackFunction("LuaLoopPointCB", AnimationLoopPointCallback);
+ BS_CallbackRegistry::GetInstance().RegisterCallbackFunction("LuaActionCB", AnimationActionCallback);
+ BS_CallbackRegistry::GetInstance().RegisterCallbackFunction("LuaDeleteCB", AnimationDeleteCallback);
+ }
+ };
+ static CallbackfunctionRegisterer Instance;
+}
+
+// -----------------------------------------------------------------------------
+// Constants
+// -----------------------------------------------------------------------------
+
+// Die Strings werden als #defines definiert um Stringkomposition zur Compilezeit zu ermöglichen.
+#define RENDEROBJECT_CLASS_NAME "Gfx.RenderObject"
+#define BITMAP_CLASS_NAME "Gfx.Bitmap"
+#define PANEL_CLASS_NAME "Gfx.Panel"
+#define TEXT_CLASS_NAME "Gfx.Text"
+#define ANIMATION_CLASS_NAME "Gfx.Animation"
+#define ANIMATION_TEMPLATE_CLASS_NAME "Gfx.AnimationTemplate"
+static const char * GFX_LIBRARY_NAME = "Gfx";
+
+// -----------------------------------------------------------------------------
+
+// Wie luaL_checkudata, nur ohne dass kein Fehler erzeugt wird.
+static void * my_checkudata (lua_State *L, int ud, const char *tname)
+{
+ int top = lua_gettop(L);
+
+ void * p = lua_touserdata(L, ud);
+ if (p != NULL) /* value is a userdata? */
+ {
+ if (lua_getmetatable(L, ud)) /* does it have a metatable? */
+ {
+ // lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */
+ BS_LuaBindhelper::GetMetatable(L, tname);
+ if (lua_rawequal(L, -1, -2)) /* does it have the correct mt? */
+ {
+ lua_settop(L, top);
+ return p;
+ }
+ }
+ }
+
+ lua_settop(L, top);
+ return NULL;
+}
+
+// -----------------------------------------------------------------------------
+
+static void NewUintUserData(lua_State * L, unsigned int Value)
+{
+ void * UserData = lua_newuserdata(L, sizeof(Value));
+ memcpy(UserData, &Value, sizeof(Value));
+}
+
+// -----------------------------------------------------------------------------
+
+static BS_AnimationTemplate * CheckAnimationTemplate(lua_State * L, int idx = 1)
+{
+ // Der erste Parameter muss vom Typ userdata sein und die Metatable der Klasse Gfx.AnimationTemplate
+ unsigned int AnimationTemplateHandle;
+ if ((AnimationTemplateHandle = *reinterpret_cast<unsigned int *>(my_checkudata(L, idx, ANIMATION_TEMPLATE_CLASS_NAME))) != 0)
+ {
+ BS_AnimationTemplate * AnimationTemplatePtr = BS_AnimationTemplateRegistry::GetInstance().ResolveHandle(AnimationTemplateHandle);
+ if (!AnimationTemplatePtr)
+ luaL_error(L, "The animation template with the handle %d does no longer exist.", AnimationTemplateHandle);
+ return AnimationTemplatePtr;
+ }
+ else
+ {
+ luaL_argcheck(L, 0, idx, "'" ANIMATION_TEMPLATE_CLASS_NAME "' expected");
+ return 0;
+ }
+}
+
+
+// -----------------------------------------------------------------------------
+
+static int NewAnimationTemplate(lua_State * L)
+{
+ unsigned int AnimationTemplateHandle = BS_AnimationTemplate::Create(luaL_checkstring(L, 1));
+ BS_AnimationTemplate * AnimationTemplatePtr = BS_AnimationTemplateRegistry::GetInstance().ResolveHandle(AnimationTemplateHandle);
+ if (AnimationTemplatePtr && AnimationTemplatePtr->IsValid())
+ {
+ NewUintUserData(L, AnimationTemplateHandle);
+ //luaL_getmetatable(L, ANIMATION_TEMPLATE_CLASS_NAME);
+ BS_LuaBindhelper::GetMetatable(L, ANIMATION_TEMPLATE_CLASS_NAME);
+ BS_ASSERT(!lua_isnil(L, -1));
+ lua_setmetatable(L, -2);
+ }
+ else
+ {
+ lua_pushnil(L);
+ }
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int AT_AddFrame(lua_State * L)
+{
+ BS_AnimationTemplate * pAT = CheckAnimationTemplate(L);
+ pAT->AddFrame(static_cast<int>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int AT_SetFrame(lua_State * L)
+{
+ BS_AnimationTemplate * pAT = CheckAnimationTemplate(L);
+ pAT->SetFrame(static_cast<int>(luaL_checknumber(L, 2)), static_cast<int>(luaL_checknumber(L, 3)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static bool AnimationTypeStringToNumber(const char * TypeString, BS_Animation::ANIMATION_TYPES & Result)
+{
+ if (strcmp(TypeString, "jojo") == 0)
+ {
+ Result = BS_Animation::AT_JOJO;
+ return true;
+ }
+ else if (strcmp(TypeString, "loop") == 0)
+ {
+ Result = BS_Animation::AT_LOOP;
+ return true;
+ }
+ else if (strcmp(TypeString, "oneshot") == 0)
+ {
+ Result = BS_Animation::AT_ONESHOT;
+ return true;
+ }
+ else
+ return false;
+}
+
+// -----------------------------------------------------------------------------
+
+static int AT_SetAnimationType(lua_State * L)
+{
+ BS_AnimationTemplate * pAT = CheckAnimationTemplate(L);
+ BS_Animation::ANIMATION_TYPES AnimationType;
+ if (AnimationTypeStringToNumber(luaL_checkstring(L, 2), AnimationType))
+ {
+ pAT->SetAnimationType(AnimationType);
+ }
+ else
+ {
+ luaL_argcheck(L, 0, 2, "Invalid animation type");
+ }
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int AT_SetFPS(lua_State * L)
+{
+ BS_AnimationTemplate * pAT = CheckAnimationTemplate(L);
+ pAT->SetFPS(static_cast<int>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int AT_Finalize(lua_State * L)
+{
+ BS_AnimationTemplate * pAT = CheckAnimationTemplate(L);
+ delete pAT;
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static const luaL_reg ANIMATION_TEMPLATE_METHODS[] =
+{
+ "AddFrame", AT_AddFrame,
+ "SetFrame", AT_SetFrame,
+ "SetAnimationType", AT_SetAnimationType,
+ "SetFPS", AT_SetFPS,
+ "__gc", AT_Finalize,
+ 0, 0,
+};
+
+// -----------------------------------------------------------------------------
+
+static BS_GraphicEngine * GetGE()
+{
+ BS_Kernel * pKernel = BS_Kernel::GetInstance();
+ BS_ASSERT(pKernel);
+ BS_GraphicEngine * pGE = static_cast<BS_GraphicEngine *>(pKernel->GetService("gfx"));
+ BS_ASSERT(pGE);
+ return pGE;
+}
+
+// -----------------------------------------------------------------------------
+
+static int Init(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ switch (lua_gettop(L))
+ {
+ case 0:
+ lua_pushbooleancpp(L, pGE->Init());
+ break;
+ case 1:
+ lua_pushbooleancpp(L, pGE->Init(static_cast<int>(luaL_checknumber(L, 1))));
+ break;
+ case 2:
+ lua_pushbooleancpp(L, pGE->Init(static_cast<int>(luaL_checknumber(L,1)), static_cast<int>(luaL_checknumber(L, 2))));
+ break;
+ case 3:
+ lua_pushbooleancpp(L, pGE->Init(static_cast<int>(luaL_checknumber(L,1)), static_cast<int>(luaL_checknumber(L, 2)),
+ static_cast<int>(luaL_checknumber(L, 3))));
+ break;
+ case 4:
+ lua_pushbooleancpp(L, pGE->Init(static_cast<int>(luaL_checknumber(L,1)), static_cast<int>(luaL_checknumber(L, 2)),
+ static_cast<int>(luaL_checknumber(L, 3)), static_cast<int>(luaL_checknumber(L, 4))));
+ break;
+ default:
+ lua_pushbooleancpp(L, pGE->Init(static_cast<int>(luaL_checknumber(L,1)), static_cast<int>(luaL_checknumber(L, 2)),
+ static_cast<int>(luaL_checknumber(L, 3)), static_cast<int>(luaL_checknumber(L, 4)),
+ lua_tobooleancpp(L, 5)));
+ }
+
+
+#ifdef DEBUG
+ int __startStackDepth = lua_gettop(L);
+#endif
+
+ // Main-Panel zum Gfx-Modul hinzufügen
+ BS_RenderObjectPtr<BS_Panel> MainPanelPtr(GetGE()->GetMainPanel());
+ BS_ASSERT(MainPanelPtr.IsValid());
+
+ lua_pushstring(L, GFX_LIBRARY_NAME);
+ lua_gettable(L, LUA_GLOBALSINDEX);
+ BS_ASSERT(!lua_isnil(L, -1));
+
+ NewUintUserData(L, MainPanelPtr->GetHandle());
+ BS_ASSERT(!lua_isnil(L, -1));
+ // luaL_getmetatable(L, PANEL_CLASS_NAME);
+ BS_LuaBindhelper::GetMetatable(L, PANEL_CLASS_NAME);
+ BS_ASSERT(!lua_isnil(L, -1));
+ lua_setmetatable(L, -2);
+
+ lua_pushstring(L, "MainPanel");
+ lua_insert(L, -2);
+ lua_settable(L, -3);
+
+ lua_pop(L, 1);
+
+#ifdef DEBUG
+ BS_ASSERT(__startStackDepth == lua_gettop(L));
+#endif
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int StartFrame(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ if (lua_gettop(L) == 0)
+ lua_pushbooleancpp(L, pGE->StartFrame());
+ else
+ lua_pushbooleancpp(L, pGE->StartFrame(lua_tobooleancpp(L, 1)));
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int EndFrame(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ lua_pushbooleancpp(L, pGE->EndFrame());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int DrawDebugLine(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ BS_Vertex Start;
+ BS_Vertex End;
+ BS_Vertex::LuaVertexToVertex(L, 1, Start);
+ BS_Vertex::LuaVertexToVertex(L, 2, End);
+ pGE->DrawDebugLine(Start, End, BS_GraphicEngine::LuaColorToARGBColor(L, 3));
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int GetDisplayWidth(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ lua_pushnumber(L, pGE->GetDisplayWidth());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int GetDisplayHeight(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ lua_pushnumber(L, pGE->GetDisplayHeight());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int GetBitDepth(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ lua_pushnumber(L, pGE->GetBitDepth());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int SetVsync(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ pGE->SetVsync(lua_tobooleancpp(L, 1));
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int IsVsync(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ lua_pushbooleancpp(L, pGE->GetVsync());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int IsWindowed(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ lua_pushbooleancpp(L, pGE->IsWindowed());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int GetFPSCount(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ lua_pushnumber(L, pGE->GetFPSCount());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int GetLastFrameDuration(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ lua_pushnumber(L, pGE->GetLastFrameDuration());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int StopMainTimer(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+ pGE->StopMainTimer();
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int ResumeMainTimer(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+ pGE->ResumeMainTimer();
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int GetSecondaryFrameDuration(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+
+ lua_pushnumber(L, pGE->GetSecondaryFrameDuration());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int SaveScreenshot(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+ lua_pushbooleancpp(L, pGE->SaveScreenshot(luaL_checkstring(L, 1)));
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int SaveThumbnailScreenshot(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+ lua_pushbooleancpp(L, pGE->SaveThumbnailScreenshot(luaL_checkstring(L, 1)));
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int GetRepaintedPixels(lua_State * L)
+{
+ BS_GraphicEngine * pGE = GetGE();
+ lua_pushnumber(L, static_cast<lua_Number>(pGE->GetRepaintedPixels()));
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static const luaL_reg GFX_FUNCTIONS[] =
+{
+ "Init", Init,
+ "StartFrame", StartFrame,
+ "EndFrame", EndFrame,
+ "DrawDebugLine", DrawDebugLine,
+ "SetVsync", SetVsync,
+ "GetDisplayWidth", GetDisplayWidth,
+ "GetDisplayHeight", GetDisplayHeight,
+ "GetBitDepth", GetBitDepth,
+ "IsVsync", IsVsync,
+ "IsWindowed", IsWindowed,
+ "GetFPSCount", GetFPSCount,
+ "GetLastFrameDuration", GetLastFrameDuration,
+ "StopMainTimer", StopMainTimer,
+ "ResumeMainTimer", ResumeMainTimer,
+ "GetSecondaryFrameDuration", GetSecondaryFrameDuration,
+ "SaveScreenshot", SaveScreenshot,
+ "NewAnimationTemplate", NewAnimationTemplate,
+ "GetRepaintedPixels", GetRepaintedPixels,
+ "SaveThumbnailScreenshot", SaveThumbnailScreenshot,
+ 0, 0,
+};
+
+// -----------------------------------------------------------------------------
+
+static BS_RenderObjectPtr<BS_RenderObject> CheckRenderObject(lua_State * L, bool ErrorIfRemoved = true)
+{
+ // Der erste Parameter muss vom Typ userdata sein und die Metatable einer Klasse haben, die von Gfx.RenderObject "erbt".
+ unsigned int * UserDataPtr;
+ if ((UserDataPtr = (unsigned int *) my_checkudata(L, 1, BITMAP_CLASS_NAME)) != 0 ||
+ (UserDataPtr = (unsigned int *) my_checkudata(L, 1, ANIMATION_CLASS_NAME)) != 0 ||
+ (UserDataPtr = (unsigned int *) my_checkudata(L, 1, PANEL_CLASS_NAME)) != 0 ||
+ (UserDataPtr = (unsigned int *) my_checkudata(L, 1, TEXT_CLASS_NAME)) != 0)
+ {
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr(* UserDataPtr);
+ if (ROPtr.IsValid())
+ return ROPtr;
+ else
+ {
+ if (ErrorIfRemoved)
+ luaL_error(L, "The renderobject with the handle %d does no longer exist.", * UserDataPtr);
+ }
+ }
+ else
+ {
+ luaL_argcheck(L, 0, 1, "'" RENDEROBJECT_CLASS_NAME "' expected");
+ }
+
+ return BS_RenderObjectPtr<BS_RenderObject>();
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_SetPos(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ BS_Vertex Pos;
+ BS_Vertex::LuaVertexToVertex(L, 2, Pos);
+ ROPtr->SetPos(Pos.X, Pos.Y);
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_SetX(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ ROPtr->SetX(static_cast<int>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_SetY(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ ROPtr->SetY(static_cast<int>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_SetZ(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ ROPtr->SetZ(static_cast<int>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_SetVisible(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ ROPtr->SetVisible(lua_tobooleancpp(L, 2));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_GetX(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ lua_pushnumber(L, ROPtr->GetX());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_GetY(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ lua_pushnumber(L, ROPtr->GetY());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_GetZ(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ lua_pushnumber(L, ROPtr->GetZ());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_GetAbsoluteX(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ lua_pushnumber(L, ROPtr->GetAbsoluteX());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_GetAbsoluteY(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ lua_pushnumber(L, ROPtr->GetAbsoluteY());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_GetWidth(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ lua_pushnumber(L, ROPtr->GetWidth());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_GetHeight(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ lua_pushnumber(L, ROPtr->GetHeight());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_IsVisible(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ lua_pushbooleancpp(L, ROPtr->IsVisible());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_AddPanel(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ BS_RenderObjectPtr<BS_Panel> PanelPtr = ROPtr->AddPanel(static_cast<int>(luaL_checknumber(L, 2)),
+ static_cast<int>(luaL_checknumber(L, 3)),
+ BS_GraphicEngine::LuaColorToARGBColor(L, 4));
+ if (PanelPtr.IsValid())
+ {
+ NewUintUserData(L, PanelPtr->GetHandle());
+ // luaL_getmetatable(L, PANEL_CLASS_NAME);
+ BS_LuaBindhelper::GetMetatable(L, PANEL_CLASS_NAME);
+ BS_ASSERT(!lua_isnil(L, -1));
+ lua_setmetatable(L, -2);
+ }
+ else
+ lua_pushnil(L);
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_AddBitmap(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ BS_RenderObjectPtr<BS_Bitmap> BitmaPtr = ROPtr->AddBitmap(luaL_checkstring(L, 2));
+ if (BitmaPtr.IsValid())
+ {
+ NewUintUserData(L, BitmaPtr->GetHandle());
+ // luaL_getmetatable(L, BITMAP_CLASS_NAME);
+ BS_LuaBindhelper::GetMetatable(L, BITMAP_CLASS_NAME);
+ BS_ASSERT(!lua_isnil(L, -1));
+ lua_setmetatable(L, -2);
+ }
+ else
+ lua_pushnil(L);
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_AddText(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+
+ BS_RenderObjectPtr<BS_Text> TextPtr;
+ if (lua_gettop(L) >= 3) TextPtr = ROPtr->AddText(luaL_checkstring(L, 2), luaL_checkstring(L, 3));
+ else TextPtr = ROPtr->AddText(luaL_checkstring(L, 2));
+
+ if (TextPtr.IsValid())
+ {
+ NewUintUserData(L, TextPtr->GetHandle());
+ // luaL_getmetatable(L, TEXT_CLASS_NAME);
+ BS_LuaBindhelper::GetMetatable(L, TEXT_CLASS_NAME);
+ BS_ASSERT(!lua_isnil(L, -1));
+ lua_setmetatable(L, -2);
+ }
+ else
+ lua_pushnil(L);
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_AddAnimation(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr;
+ if (lua_type(L, 2) == LUA_TUSERDATA)
+ AnimationPtr = ROPtr->AddAnimation(*CheckAnimationTemplate(L, 2));
+ else
+ AnimationPtr = ROPtr->AddAnimation(luaL_checkstring(L, 2));
+
+ if (AnimationPtr.IsValid())
+ {
+ NewUintUserData(L, AnimationPtr->GetHandle());
+ // luaL_getmetatable(L, ANIMATION_CLASS_NAME);
+ BS_LuaBindhelper::GetMetatable(L, ANIMATION_CLASS_NAME);
+ BS_ASSERT(!lua_isnil(L, -1));
+ lua_setmetatable(L, -2);
+
+ // Alle Animationscallbacks registrieren.
+ AnimationPtr->RegisterDeleteCallback(AnimationDeleteCallback, AnimationPtr->GetHandle());
+ AnimationPtr->RegisterLoopPointCallback(AnimationLoopPointCallback, AnimationPtr->GetHandle());
+ AnimationPtr->RegisterActionCallback(AnimationActionCallback, AnimationPtr->GetHandle());
+ }
+ else
+ lua_pushnil(L);
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int RO_Remove(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ ROPtr.Erase();
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static const luaL_reg RENDEROBJECT_METHODS[] =
+{
+ "AddAnimation", RO_AddAnimation,
+ "AddText", RO_AddText,
+ "AddBitmap", RO_AddBitmap,
+ "AddPanel", RO_AddPanel,
+ "SetPos", RO_SetPos,
+ "SetX", RO_SetX,
+ "SetY", RO_SetY,
+ "SetZ", RO_SetZ,
+ "SetVisible", RO_SetVisible,
+ "GetX", RO_GetX,
+ "GetY", RO_GetY,
+ "GetZ", RO_GetZ,
+ "GetAbsoluteX", RO_GetAbsoluteX,
+ "GetAbsoluteY", RO_GetAbsoluteY,
+ "GetWidth", RO_GetWidth,
+ "GetHeight", RO_GetHeight,
+ "IsVisible", RO_IsVisible,
+ 0, 0,
+};
+
+// -----------------------------------------------------------------------------
+
+static BS_RenderObjectPtr<BS_Panel> CheckPanel(lua_State * L)
+{
+ // Der erste Parameter muss vom Typ userdata sein und die Metatable der Klasse Gfx.Panel
+ unsigned int * UserDataPtr;
+ if ((UserDataPtr = (unsigned int *) my_checkudata(L, 1, PANEL_CLASS_NAME)) != 0)
+ {
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr(*UserDataPtr);
+ if (ROPtr.IsValid())
+ {
+ return ROPtr->ToPanel();
+ }
+ else
+ luaL_error(L, "The panel with the handle %d does no longer exist.", *UserDataPtr);
+ }
+ else
+ {
+ luaL_argcheck(L, 0, 1, "'" PANEL_CLASS_NAME "' expected");
+ }
+
+ return BS_RenderObjectPtr<BS_Panel>();
+}
+
+// -----------------------------------------------------------------------------
+
+static int P_GetColor(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Panel> PanelPtr = CheckPanel(L);
+ BS_ASSERT(PanelPtr.IsValid());
+ BS_GraphicEngine::ARGBColorToLuaColor(L, PanelPtr->GetColor());
+
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int P_SetColor(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Panel> PanelPtr = CheckPanel(L);
+ BS_ASSERT(PanelPtr.IsValid());
+ PanelPtr->SetColor(BS_GraphicEngine::LuaColorToARGBColor(L, 2));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int P_Remove(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ ROPtr.Erase();
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static const luaL_reg PANEL_METHODS[] =
+{
+ "GetColor", P_GetColor,
+ "SetColor", P_SetColor,
+ "Remove", P_Remove,
+ 0, 0,
+};
+
+// -----------------------------------------------------------------------------
+
+static BS_RenderObjectPtr<BS_Bitmap> CheckBitmap(lua_State * L)
+{
+ // Der erste Parameter muss vom Typ userdata sein und die Metatable der Klasse Gfx.Bitmap
+ unsigned int * UserDataPtr;
+ if ((UserDataPtr = (unsigned int *) my_checkudata(L, 1, BITMAP_CLASS_NAME)) != 0)
+ {
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr(*UserDataPtr);
+ if (ROPtr.IsValid())
+ {
+ return ROPtr->ToBitmap();
+ }
+ else
+ luaL_error(L, "The bitmap with the handle %d does no longer exist.", *UserDataPtr);
+ }
+ else
+ {
+ luaL_argcheck(L, 0, 1, "'" BITMAP_CLASS_NAME "' expected");
+ }
+
+ return BS_RenderObjectPtr<BS_Bitmap>();
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_SetAlpha(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ BitmapPtr->SetAlpha(static_cast<unsigned int>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_SetTintColor(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ BitmapPtr->SetModulationColor(BS_GraphicEngine::LuaColorToARGBColor(L, 2));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_SetScaleFactor(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ BitmapPtr->SetScaleFactor(static_cast<float>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_SetScaleFactorX(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ BitmapPtr->SetScaleFactorX(static_cast<float>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_SetScaleFactorY(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ BitmapPtr->SetScaleFactorY(static_cast<float>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_SetFlipH(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ BitmapPtr->SetFlipH(lua_tobooleancpp(L, 2));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_SetFlipV(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ BitmapPtr->SetFlipV(lua_tobooleancpp(L, 2));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_GetAlpha(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ lua_pushnumber(L, BitmapPtr->GetAlpha());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_GetTintColor(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ BS_GraphicEngine::ARGBColorToLuaColor(L, BitmapPtr->GetModulationColor());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_GetScaleFactorX(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ lua_pushnumber(L, BitmapPtr->GetScaleFactorX());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_GetScaleFactorY(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ lua_pushnumber(L, BitmapPtr->GetScaleFactorY());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_IsFlipH(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ lua_pushbooleancpp(L, BitmapPtr->IsFlipH());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_IsFlipV(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ lua_pushbooleancpp(L, BitmapPtr->IsFlipV());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_GetPixel(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ BS_Vertex Pos;
+ BS_Vertex::LuaVertexToVertex(L, 2, Pos);
+ BS_GraphicEngine::ARGBColorToLuaColor(L, BitmapPtr->GetPixel(Pos.X, Pos.Y));
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_IsScalingAllowed(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ lua_pushbooleancpp(L, BitmapPtr->IsScalingAllowed());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_IsAlphaAllowed(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ lua_pushbooleancpp(L, BitmapPtr->IsAlphaAllowed());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int B_IsTintingAllowed(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Bitmap> BitmapPtr = CheckBitmap(L);
+ BS_ASSERT(BitmapPtr.IsValid());
+ lua_pushbooleancpp(L, BitmapPtr->IsColorModulationAllowed());
+ return 1;
+}
+// -----------------------------------------------------------------------------
+
+static int B_Remove(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr = CheckRenderObject(L);
+ BS_ASSERT(ROPtr.IsValid());
+ ROPtr.Erase();
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static const luaL_reg BITMAP_METHODS[] =
+{
+ "SetAlpha", B_SetAlpha,
+ "SetTintColor", B_SetTintColor,
+ "SetScaleFactor", B_SetScaleFactor,
+ "SetScaleFactorX", B_SetScaleFactorX,
+ "SetScaleFactorY", B_SetScaleFactorY,
+ "SetFlipH", B_SetFlipH,
+ "SetFlipV", B_SetFlipV,
+ "GetAlpha", B_GetAlpha,
+ "GetTintColor", B_GetTintColor,
+ "GetScaleFactorX", B_GetScaleFactorX,
+ "GetScaleFactorY", B_GetScaleFactorY,
+ "IsFlipH", B_IsFlipH,
+ "IsFlipV", B_IsFlipV,
+ "GetPixel", B_GetPixel,
+ "IsScalingAllowed", B_IsScalingAllowed,
+ "IsAlphaAllowed", B_IsAlphaAllowed,
+ "IsTintingAllowed", B_IsTintingAllowed,
+ "Remove", B_Remove,
+ 0, 0,
+};
+
+// -----------------------------------------------------------------------------
+
+static BS_RenderObjectPtr<BS_Animation> CheckAnimation(lua_State * L)
+{
+ // Der erste Parameter muss vom Typ userdata sein und die Metatable der Klasse Gfx.Animation
+ unsigned int * UserDataPtr;
+ if ((UserDataPtr = (unsigned int *) my_checkudata(L, 1, ANIMATION_CLASS_NAME)) != 0)
+ {
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr(*UserDataPtr);
+ if (ROPtr.IsValid())
+ return ROPtr->ToAnimation();
+ else
+ {
+ luaL_error(L, "The animation with the handle %d does no longer exist.", *UserDataPtr);
+ }
+ }
+ else
+ {
+ luaL_argcheck(L, 0, 1, "'" ANIMATION_CLASS_NAME "' expected");
+ }
+
+ return BS_RenderObjectPtr<BS_Animation>();
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_Play(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ AnimationPtr->Play();
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_Pause(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ AnimationPtr->Pause();
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_Stop(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ AnimationPtr->Stop();
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_SetFrame(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ AnimationPtr->SetFrame(static_cast<unsigned int>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_SetAlpha(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ AnimationPtr->SetAlpha(static_cast<int>(luaL_checknumber(L, 2)));
+ return 0;
+}
+// -----------------------------------------------------------------------------
+
+static int A_SetTintColor(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ AnimationPtr->SetModulationColor(BS_GraphicEngine::LuaColorToARGBColor(L, 2));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_SetScaleFactor(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ AnimationPtr->SetScaleFactor(static_cast<float>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_SetScaleFactorX(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ AnimationPtr->SetScaleFactorX(static_cast<float>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_SetScaleFactorY(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ AnimationPtr->SetScaleFactorY(static_cast<float>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_GetScaleFactorX(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ lua_pushnumber(L, AnimationPtr->GetScaleFactorX());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_GetScaleFactorY(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ lua_pushnumber(L, AnimationPtr->GetScaleFactorY());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_GetAnimationType(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ switch (AnimationPtr->GetAnimationType())
+ {
+ case BS_Animation::AT_JOJO:
+ lua_pushstring(L, "jojo");
+ break;
+ case BS_Animation::AT_LOOP:
+ lua_pushstring(L, "loop");
+ break;
+ case BS_Animation::AT_ONESHOT:
+ lua_pushstring(L, "oneshot");
+ break;
+ default:
+ BS_ASSERT(false);
+ }
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_GetFPS(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ lua_pushnumber(L, AnimationPtr->GetFPS());
+ return 1;
+}
+
+
+// -----------------------------------------------------------------------------
+
+static int A_GetFrameCount(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ lua_pushnumber(L, AnimationPtr->GetFrameCount());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_IsScalingAllowed(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ lua_pushbooleancpp(L, AnimationPtr->IsScalingAllowed());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_IsAlphaAllowed(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ lua_pushbooleancpp(L, AnimationPtr->IsAlphaAllowed());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_IsTintingAllowed(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ lua_pushbooleancpp(L, AnimationPtr->IsColorModulationAllowed());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_GetCurrentFrame(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ lua_pushnumber(L, AnimationPtr->GetCurrentFrame());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_GetCurrentAction(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ lua_pushstring(L, AnimationPtr->GetCurrentAction().c_str());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_IsPlaying(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ lua_pushbooleancpp(L, AnimationPtr->IsRunning());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static bool AnimationLoopPointCallback(unsigned int Handle)
+{
+ lua_State * L = static_cast<lua_State *>(BS_Kernel::GetInstance()->GetScript()->GetScriptObject());
+ LoopPointCallbackPtr->InvokeCallbackFunctions(L, Handle);
+
+ return true;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_RegisterLoopPointCallback(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ luaL_checktype(L, 2, LUA_TFUNCTION);
+
+ lua_pushvalue(L, 2);
+ LoopPointCallbackPtr->RegisterCallbackFunction(L, AnimationPtr->GetHandle());
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_UnregisterLoopPointCallback(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ luaL_checktype(L, 2, LUA_TFUNCTION);
+
+ lua_pushvalue(L, 2);
+ LoopPointCallbackPtr->UnregisterCallbackFunction(L, AnimationPtr->GetHandle());
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static bool AnimationActionCallback(unsigned int Handle)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr(Handle);
+ if (AnimationPtr.IsValid())
+ {
+ ActionCallbackPtr->Action = AnimationPtr->GetCurrentAction();
+ lua_State * L = static_cast<lua_State *>(BS_Kernel::GetInstance()->GetScript()->GetScriptObject());
+ ActionCallbackPtr->InvokeCallbackFunctions(L, AnimationPtr->GetHandle());
+ }
+
+ return true;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_RegisterActionCallback(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ luaL_checktype(L, 2, LUA_TFUNCTION);
+
+ lua_pushvalue(L, 2);
+ ActionCallbackPtr->RegisterCallbackFunction(L, AnimationPtr->GetHandle());
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_UnregisterActionCallback(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ luaL_checktype(L, 2, LUA_TFUNCTION);
+
+ lua_pushvalue(L, 2);
+ ActionCallbackPtr->UnregisterCallbackFunction(L, AnimationPtr->GetHandle());
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static bool AnimationDeleteCallback(unsigned int Handle)
+{
+ lua_State * L = static_cast<lua_State *>(BS_Kernel::GetInstance()->GetScript()->GetScriptObject());
+ LoopPointCallbackPtr->RemoveAllObjectCallbacks(L, Handle);
+
+ return true;
+}
+
+// -----------------------------------------------------------------------------
+
+static int A_Remove(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Animation> AnimationPtr = CheckAnimation(L);
+ BS_ASSERT(AnimationPtr.IsValid());
+ AnimationPtr.Erase();
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static const luaL_reg ANIMATION_METHODS[] =
+{
+ "Play", A_Play,
+ "Pause", A_Pause,
+ "Stop", A_Stop,
+ "SetFrame", A_SetFrame,
+ "SetAlpha", A_SetAlpha,
+ "SetTintColor", A_SetTintColor,
+ "SetScaleFactor", A_SetScaleFactor,
+ "SetScaleFactorX", A_SetScaleFactorX,
+ "SetScaleFactorY", A_SetScaleFactorY,
+ "GetScaleFactorX", A_GetScaleFactorX,
+ "GetScaleFactorY", A_GetScaleFactorY,
+ "GetAnimationType", A_GetAnimationType,
+ "GetFPS", A_GetFPS,
+ "GetFrameCount", A_GetFrameCount,
+ "IsScalingAllowed", A_IsScalingAllowed,
+ "IsAlphaAllowed", A_IsAlphaAllowed,
+ "IsTintingAllowed", A_IsTintingAllowed,
+ "GetCurrentFrame", A_GetCurrentFrame,
+ "GetCurrentAction", A_GetCurrentAction,
+ "IsPlaying", A_IsPlaying,
+ "RegisterLoopPointCallback", A_RegisterLoopPointCallback,
+ "UnregisterLoopPointCallback", A_UnregisterLoopPointCallback,
+ "RegisterActionCallback", A_RegisterActionCallback,
+ "UnregisterActionCallback", A_UnregisterActionCallback,
+ "Remove", A_Remove,
+ 0, 0,
+};
+
+// -----------------------------------------------------------------------------
+
+static BS_RenderObjectPtr<BS_Text> CheckText(lua_State * L)
+{
+ // Der erste Parameter muss vom Typ userdata sein und die Metatable der Klasse Gfx.Text
+ unsigned int * UserDataPtr;
+ if ((UserDataPtr = (unsigned int *) my_checkudata(L, 1, TEXT_CLASS_NAME)) != 0)
+ {
+ BS_RenderObjectPtr<BS_RenderObject> ROPtr(*UserDataPtr);
+ if (ROPtr.IsValid())
+ return ROPtr->ToText();
+ else
+ luaL_error(L, "The text with the handle %d does no longer exist.", *UserDataPtr);
+ }
+ else
+ {
+ luaL_argcheck(L, 0, 1, "'" TEXT_CLASS_NAME "' expected");
+ }
+
+ return BS_RenderObjectPtr<BS_Text>();
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_SetFont(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ TextPtr->SetFont(luaL_checkstring(L, 2));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_SetText(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ TextPtr->SetText(luaL_checkstring(L, 2));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_SetAlpha(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ TextPtr->SetAlpha(static_cast<int>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_SetColor(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ TextPtr->SetColor(BS_GraphicEngine::LuaColorToARGBColor(L, 2));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_SetAutoWrap(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ TextPtr->SetAutoWrap(lua_tobooleancpp(L, 2));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_SetAutoWrapThreshold(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ TextPtr->SetAutoWrapThreshold(static_cast<unsigned int>(luaL_checknumber(L, 2)));
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_GetText(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ lua_pushstring(L, TextPtr->GetText().c_str());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_GetFont(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ lua_pushstring(L, TextPtr->GetFont().c_str());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_GetAlpha(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ lua_pushnumber(L, TextPtr->GetAlpha());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_GetColor(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ lua_pushnumber(L, TextPtr->GetColor());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_IsAutoWrap(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ lua_pushbooleancpp(L, TextPtr->IsAutoWrapActive());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_GetAutoWrapThreshold(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ lua_pushnumber(L, TextPtr->GetAutoWrapThreshold());
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+static int T_Remove(lua_State * L)
+{
+ BS_RenderObjectPtr<BS_Text> TextPtr = CheckText(L);
+ BS_ASSERT(TextPtr.IsValid());
+ TextPtr.Erase();
+ return 0;
+}
+
+// -----------------------------------------------------------------------------
+
+static const luaL_reg TEXT_METHODS[] =
+{
+ "SetFont", T_SetFont,
+ "SetText", T_SetText,
+ "SetAlpha", T_SetAlpha,
+ "SetColor", T_SetColor,
+ "SetAutoWrap", T_SetAutoWrap,
+ "SetAutoWrapThreshold", T_SetAutoWrapThreshold,
+ "GetText", T_GetText,
+ "GetFont", T_GetFont,
+ "GetAlpha", T_GetAlpha,
+ "GetColor", T_GetColor,
+ "IsAutoWrap", T_IsAutoWrap,
+ "GetAutoWrapThreshold", T_GetAutoWrapThreshold,
+ "Remove", T_Remove,
+ 0, 0,
+};
+
+// -----------------------------------------------------------------------------
+
+bool BS_GraphicEngine::RegisterScriptBindings()
+{
+ BS_Kernel * pKernel = BS_Kernel::GetInstance();
+ BS_ASSERT(pKernel);
+ BS_ScriptEngine * pScript = static_cast<BS_ScriptEngine *>(pKernel->GetService("script"));
+ BS_ASSERT(pScript);
+ lua_State * L = static_cast<lua_State *>(pScript->GetScriptObject());
+ BS_ASSERT(L);
+
+ if (!BS_LuaBindhelper::AddMethodsToClass(L, BITMAP_CLASS_NAME, RENDEROBJECT_METHODS)) return false;
+ if (!BS_LuaBindhelper::AddMethodsToClass(L, ANIMATION_CLASS_NAME, RENDEROBJECT_METHODS)) return false;
+ if (!BS_LuaBindhelper::AddMethodsToClass(L, PANEL_CLASS_NAME, RENDEROBJECT_METHODS)) return false;
+ if (!BS_LuaBindhelper::AddMethodsToClass(L, TEXT_CLASS_NAME, RENDEROBJECT_METHODS)) return false;
+
+ if (!BS_LuaBindhelper::AddMethodsToClass(L, PANEL_CLASS_NAME, PANEL_METHODS)) return false;
+ if (!BS_LuaBindhelper::AddMethodsToClass(L, BITMAP_CLASS_NAME, BITMAP_METHODS)) return false;
+ if (!BS_LuaBindhelper::AddMethodsToClass(L, TEXT_CLASS_NAME, TEXT_METHODS)) return false;
+ if (!BS_LuaBindhelper::AddMethodsToClass(L, ANIMATION_CLASS_NAME, ANIMATION_METHODS)) return false;
+
+ if (!BS_LuaBindhelper::AddMethodsToClass(L, ANIMATION_TEMPLATE_CLASS_NAME, ANIMATION_TEMPLATE_METHODS)) return false;
+
+ if (!BS_LuaBindhelper::AddFunctionsToLib(L, GFX_LIBRARY_NAME, GFX_FUNCTIONS)) return false;
+
+ LoopPointCallbackPtr.reset(new BS_LuaCallback(L));
+ ActionCallbackPtr.reset(new ActionCallback(L));
+
+ return true;
+}