use templated classes instead of macros for easier debugging

This commit is contained in:
Chris Danford
2005-01-31 08:05:27 +00:00
parent 505dab87c2
commit 68dd253720
11 changed files with 183 additions and 171 deletions
-4
View File
@@ -979,10 +979,6 @@ void Actor::PlayCommand( const CString &sCommandName )
RunCommands( *it->second ); RunCommands( *it->second );
} }
void Actor::PushSelf( lua_State *L )
{
Luna<Actor,LuaActor>::Push( L, this );
}
/* /*
* (c) 2001-2004 Chris Danford * (c) 2001-2004 Chris Danford
+99 -91
View File
@@ -9,13 +9,19 @@
#include <map> #include <map>
struct XNode; struct XNode;
struct lua_State; struct lua_State;
#include "LuaBinding.h"
#define DRAW_ORDER_BEFORE_EVERYTHING -100 #define DRAW_ORDER_BEFORE_EVERYTHING -100
#define DRAW_ORDER_TRANSITIONS 100 #define DRAW_ORDER_TRANSITIONS 100
#define DRAW_ORDER_AFTER_EVERYTHING 200 #define DRAW_ORDER_AFTER_EVERYTHING 200
template<class T>
class LunaActor : public Luna<T>
{
public:
LunaActor() { LUA->Register( Register ); }
#define LUA_Actor_METHODS( T ) \
static int sleep( T* p, lua_State *L ) { p->Sleep(FArg(1)); return 0; } \ static int sleep( T* p, lua_State *L ) { p->Sleep(FArg(1)); return 0; } \
static int linear( T* p, lua_State *L ) { p->BeginTweening(FArg(1),Actor::TWEEN_LINEAR); return 0; } \ static int linear( T* p, lua_State *L ) { p->BeginTweening(FArg(1),Actor::TWEEN_LINEAR); return 0; } \
static int accelerate( T* p, lua_State *L ) { p->BeginTweening(FArg(1),Actor::TWEEN_ACCELERATE); return 0; } \ static int accelerate( T* p, lua_State *L ) { p->BeginTweening(FArg(1),Actor::TWEEN_ACCELERATE); return 0; } \
@@ -105,96 +111,98 @@ struct lua_State;
static int playcommand( T* p, lua_State *L ) { p->PlayCommand(SArg(1)); return 0; } \ static int playcommand( T* p, lua_State *L ) { p->PlayCommand(SArg(1)); return 0; } \
static int queuecommand( T* p, lua_State *L ) { p->QueueCommand(SArg(1)); return 0; } \ static int queuecommand( T* p, lua_State *L ) { p->QueueCommand(SArg(1)); return 0; } \
#define LUA_Actor_METHODS_MAP( T ) \ static void Register(lua_State *L) {
LUA_METHOD_MAP( T, sleep ) \ ADD_METHOD( sleep ) \
LUA_METHOD_MAP( T, linear ) \ ADD_METHOD( linear ) \
LUA_METHOD_MAP( T, accelerate ) \ ADD_METHOD( accelerate ) \
LUA_METHOD_MAP( T, decelerate ) \ ADD_METHOD( decelerate ) \
LUA_METHOD_MAP( T, bouncebegin ) \ ADD_METHOD( bouncebegin ) \
LUA_METHOD_MAP( T, bounceend ) \ ADD_METHOD( bounceend ) \
LUA_METHOD_MAP( T, spring ) \ ADD_METHOD( spring ) \
LUA_METHOD_MAP( T, stoptweening ) \ ADD_METHOD( stoptweening ) \
LUA_METHOD_MAP( T, finishtweening ) \ ADD_METHOD( finishtweening ) \
LUA_METHOD_MAP( T, hurrytweening ) \ ADD_METHOD( hurrytweening ) \
LUA_METHOD_MAP( T, x ) \ ADD_METHOD( x ) \
LUA_METHOD_MAP( T, y ) \ ADD_METHOD( y ) \
LUA_METHOD_MAP( T, z ) \ ADD_METHOD( z ) \
LUA_METHOD_MAP( T, addx ) \ ADD_METHOD( addx ) \
LUA_METHOD_MAP( T, addy ) \ ADD_METHOD( addy ) \
LUA_METHOD_MAP( T, addz ) \ ADD_METHOD( addz ) \
LUA_METHOD_MAP( T, zoom ) \ ADD_METHOD( zoom ) \
LUA_METHOD_MAP( T, zoomx ) \ ADD_METHOD( zoomx ) \
LUA_METHOD_MAP( T, zoomy ) \ ADD_METHOD( zoomy ) \
LUA_METHOD_MAP( T, zoomz ) \ ADD_METHOD( zoomz ) \
LUA_METHOD_MAP( T, zoomtowidth ) \ ADD_METHOD( zoomtowidth ) \
LUA_METHOD_MAP( T, zoomtoheight ) \ ADD_METHOD( zoomtoheight ) \
LUA_METHOD_MAP( T, stretchto ) \ ADD_METHOD( stretchto ) \
LUA_METHOD_MAP( T, cropleft ) \ ADD_METHOD( cropleft ) \
LUA_METHOD_MAP( T, croptop ) \ ADD_METHOD( croptop ) \
LUA_METHOD_MAP( T, cropright ) \ ADD_METHOD( cropright ) \
LUA_METHOD_MAP( T, cropbottom ) \ ADD_METHOD( cropbottom ) \
LUA_METHOD_MAP( T, fadeleft ) \ ADD_METHOD( fadeleft ) \
LUA_METHOD_MAP( T, fadetop ) \ ADD_METHOD( fadetop ) \
LUA_METHOD_MAP( T, faderight ) \ ADD_METHOD( faderight ) \
LUA_METHOD_MAP( T, fadebottom ) \ ADD_METHOD( fadebottom ) \
LUA_METHOD_MAP( T, diffuse ) \ ADD_METHOD( diffuse ) \
LUA_METHOD_MAP( T, diffuseleftedge ) \ ADD_METHOD( diffuseleftedge ) \
LUA_METHOD_MAP( T, diffuserightedge ) \ ADD_METHOD( diffuserightedge ) \
LUA_METHOD_MAP( T, diffusetopedge ) \ ADD_METHOD( diffusetopedge ) \
LUA_METHOD_MAP( T, diffusebottomedge ) \ ADD_METHOD( diffusebottomedge ) \
LUA_METHOD_MAP( T, diffusealpha ) \ ADD_METHOD( diffusealpha ) \
LUA_METHOD_MAP( T, diffusecolor ) \ ADD_METHOD( diffusecolor ) \
LUA_METHOD_MAP( T, glow ) \ ADD_METHOD( glow ) \
LUA_METHOD_MAP( T, rotationx ) \ ADD_METHOD( rotationx ) \
LUA_METHOD_MAP( T, rotationy ) \ ADD_METHOD( rotationy ) \
LUA_METHOD_MAP( T, rotationz ) \ ADD_METHOD( rotationz ) \
LUA_METHOD_MAP( T, heading ) \ ADD_METHOD( heading ) \
LUA_METHOD_MAP( T, pitch ) \ ADD_METHOD( pitch ) \
LUA_METHOD_MAP( T, roll ) \ ADD_METHOD( roll ) \
LUA_METHOD_MAP( T, shadowlength ) \ ADD_METHOD( shadowlength ) \
LUA_METHOD_MAP( T, horizalign ) \ ADD_METHOD( horizalign ) \
LUA_METHOD_MAP( T, vertalign ) \ ADD_METHOD( vertalign ) \
LUA_METHOD_MAP( T, diffuseblink ) \ ADD_METHOD( diffuseblink ) \
LUA_METHOD_MAP( T, diffuseshift ) \ ADD_METHOD( diffuseshift ) \
LUA_METHOD_MAP( T, glowblink ) \ ADD_METHOD( glowblink ) \
LUA_METHOD_MAP( T, glowshift ) \ ADD_METHOD( glowshift ) \
LUA_METHOD_MAP( T, rainbow ) \ ADD_METHOD( rainbow ) \
LUA_METHOD_MAP( T, wag ) \ ADD_METHOD( wag ) \
LUA_METHOD_MAP( T, bounce ) \ ADD_METHOD( bounce ) \
LUA_METHOD_MAP( T, bob ) \ ADD_METHOD( bob ) \
LUA_METHOD_MAP( T, pulse ) \ ADD_METHOD( pulse ) \
LUA_METHOD_MAP( T, spin ) \ ADD_METHOD( spin ) \
LUA_METHOD_MAP( T, vibrate ) \ ADD_METHOD( vibrate ) \
LUA_METHOD_MAP( T, stopeffect ) \ ADD_METHOD( stopeffect ) \
LUA_METHOD_MAP( T, effectcolor1 ) \ ADD_METHOD( effectcolor1 ) \
LUA_METHOD_MAP( T, effectcolor2 ) \ ADD_METHOD( effectcolor2 ) \
LUA_METHOD_MAP( T, effectperiod ) \ ADD_METHOD( effectperiod ) \
LUA_METHOD_MAP( T, effectoffset ) \ ADD_METHOD( effectoffset ) \
LUA_METHOD_MAP( T, effectdelay ) \ ADD_METHOD( effectdelay ) \
LUA_METHOD_MAP( T, effectclock ) \ ADD_METHOD( effectclock ) \
LUA_METHOD_MAP( T, effectmagnitude ) \ ADD_METHOD( effectmagnitude ) \
LUA_METHOD_MAP( T, scaletocover ) \ ADD_METHOD( scaletocover ) \
LUA_METHOD_MAP( T, scaletofit ) \ ADD_METHOD( scaletofit ) \
LUA_METHOD_MAP( T, animate ) \ ADD_METHOD( animate ) \
LUA_METHOD_MAP( T, play ) \ ADD_METHOD( play ) \
LUA_METHOD_MAP( T, pause ) \ ADD_METHOD( pause ) \
LUA_METHOD_MAP( T, setstate ) \ ADD_METHOD( setstate ) \
LUA_METHOD_MAP( T, texturewrapping ) \ ADD_METHOD( texturewrapping ) \
LUA_METHOD_MAP( T, additiveblend ) \ ADD_METHOD( additiveblend ) \
LUA_METHOD_MAP( T, blend ) \ ADD_METHOD( blend ) \
LUA_METHOD_MAP( T, zbuffer ) \ ADD_METHOD( zbuffer ) \
LUA_METHOD_MAP( T, ztest ) \ ADD_METHOD( ztest ) \
LUA_METHOD_MAP( T, ztestmode ) \ ADD_METHOD( ztestmode ) \
LUA_METHOD_MAP( T, zwrite ) \ ADD_METHOD( zwrite ) \
LUA_METHOD_MAP( T, clearzbuffer ) \ ADD_METHOD( clearzbuffer ) \
LUA_METHOD_MAP( T, backfacecull ) \ ADD_METHOD( backfacecull ) \
LUA_METHOD_MAP( T, cullmode ) \ ADD_METHOD( cullmode ) \
LUA_METHOD_MAP( T, hidden ) \ ADD_METHOD( hidden ) \
LUA_METHOD_MAP( T, hibernate ) \ ADD_METHOD( hibernate ) \
LUA_METHOD_MAP( T, draworder ) \ ADD_METHOD( draworder ) \
LUA_METHOD_MAP( T, playcommand ) \ ADD_METHOD( playcommand ) \
LUA_METHOD_MAP( T, queuecommand ) \ ADD_METHOD( queuecommand ) \
Luna<T>::Register( L );
}
};
class Actor class Actor
{ {
-5
View File
@@ -254,11 +254,6 @@ void ActorFrame::PlayCommand( const CString &sCommandName )
} }
} }
void ActorFrame::PushSelf( lua_State *L )
{
Luna<ActorFrame,LuaActorFrame>::Push( L, this );
}
/* /*
* (c) 2001-2004 Chris Danford * (c) 2001-2004 Chris Danford
* All rights reserved. * All rights reserved.
+12 -5
View File
@@ -5,13 +5,20 @@
#include "Actor.h" #include "Actor.h"
#define LUA_ActorFrame_METHODS( T ) \ template<class T>
LUA_Actor_METHODS( T ) \ class LunaActorFrame : public LunaActor<T>
{
public:
LunaActorFrame() { LUA->Register( Register ); }
static int propagate( T* p, lua_State *L ) { p->SetPropagateCommands( BArg(1) ); return 0; } \ static int propagate( T* p, lua_State *L ) { p->SetPropagateCommands( BArg(1) ); return 0; } \
#define LUA_ActorFrame_METHODS_MAP( T ) \ static void Register(lua_State *L)
LUA_Actor_METHODS_MAP( T ) \ {
LUA_METHOD_MAP( T, propagate ) \ ADD_METHOD( propagate ) \
LunaActor<T>::Register( L );
}
};
class ActorFrame : public Actor class ActorFrame : public Actor
{ {
-5
View File
@@ -551,11 +551,6 @@ void BitmapText::SetWrapWidthPixels( int iWrapWidthPixels )
SetText( m_sText, "", iWrapWidthPixels ); SetText( m_sText, "", iWrapWidthPixels );
} }
void BitmapText::PushSelf( lua_State *L )
{
Luna<BitmapText,LuaBitmapText>::Push( L, this );
}
/* /*
* (c) 2003-2004 Chris Danford * (c) 2003-2004 Chris Danford
* All rights reserved. * All rights reserved.
+13 -6
View File
@@ -6,15 +6,22 @@
#include "Actor.h" #include "Actor.h"
class RageTexture; class RageTexture;
#define LUA_BitmapText_METHODS( T ) \ template<class T>
LUA_Actor_METHODS( T ) \ class LunaBitmapText : public LunaActor<T>
{
public:
LunaBitmapText() { LUA->Register( Register ); }
static int wrapwidthpixels( T* p, lua_State *L ) { p->SetWrapWidthPixels( IArg(1) ); return 0; } \ static int wrapwidthpixels( T* p, lua_State *L ) { p->SetWrapWidthPixels( IArg(1) ); return 0; } \
static int maxwidth( T* p, lua_State *L ) { p->SetMaxWidth( FArg(1) ); return 0; } \ static int maxwidth( T* p, lua_State *L ) { p->SetMaxWidth( FArg(1) ); return 0; } \
#define LUA_BitmapText_METHODS_MAP( T ) \ static void Register(lua_State *L)
LUA_Actor_METHODS_MAP( T ) \ {
LUA_METHOD_MAP( T, wrapwidthpixels ) \ ADD_METHOD( wrapwidthpixels ) \
LUA_METHOD_MAP( T, maxwidth ) \ ADD_METHOD( maxwidth ) \
LunaActor<T>::Register( L );
}
};
class Font; class Font;
+31 -28
View File
@@ -2,6 +2,9 @@
* Modified by Chris. * Modified by Chris.
*/ */
#ifndef LuaBinding_H
#define LuaBinding_H
extern "C" extern "C"
{ {
#include <lua.h> #include <lua.h>
@@ -9,6 +12,7 @@ extern "C"
} }
#include "LuaManager.h" #include "LuaManager.h"
#include <vector>
#define SArg(n) (luaL_checkstring(L,n)) #define SArg(n) (luaL_checkstring(L,n))
@@ -17,27 +21,10 @@ extern "C"
#define FArg(n) ((float) luaL_checknumber(L,n)) #define FArg(n) ((float) luaL_checknumber(L,n))
#define LUA_REGISTER_CLASS( T ) \
class Lua##T { \
public: \
Lua##T() { LUA->Register( Register ); } \
static const char className[]; \
static Luna<T,Lua##T>::RegType methods[]; \
static void Register( lua_State* L ) { \
Luna<T,Lua##T>::Register(L); \
} \
LUA_##T##_METHODS( T ) \
}; \
static Lua##T registera; \
const char Lua##T::className[] = #T; \
Luna<T,Lua##T>::RegType Lua##T::methods[] = { \
LUA_##T##_METHODS_MAP( T ) \
{0,0} \
};
#define LUA_METHOD_MAP( T, Method ) { #Method, Lua##T::Method },
template <typename T>
template <typename T, typename TInfo> class Luna { class Luna
{
typedef struct { T *pT; } userdataType; typedef struct { T *pT; } userdataType;
public: public:
typedef int (*mfp)(T *p, lua_State *L); typedef int (*mfp)(T *p, lua_State *L);
@@ -47,12 +34,12 @@ public:
lua_newtable(L); lua_newtable(L);
int methods = lua_gettop(L); int methods = lua_gettop(L);
luaL_newmetatable(L, TInfo::className); luaL_newmetatable(L, s_className);
int metatable = lua_gettop(L); int metatable = lua_gettop(L);
// store method table in globals so that // store method table in globals so that
// scripts can add functions written in Lua. // scripts can add functions written in Lua.
lua_pushstring(L, TInfo::className); lua_pushstring(L, s_className);
lua_pushvalue(L, methods); lua_pushvalue(L, methods);
lua_settable(L, LUA_GLOBALSINDEX); lua_settable(L, LUA_GLOBALSINDEX);
@@ -69,7 +56,8 @@ public:
lua_settable(L, metatable); lua_settable(L, metatable);
// fill method table with methods from class T // fill method table with methods from class T
for (RegType *l = TInfo::methods; l->name; l++) { for (vector<RegType>::const_iterator i = s_pvMethods->begin(); i != s_pvMethods->end(); i++) {
const RegType *l = &(*i);
lua_pushstring(L, l->name); lua_pushstring(L, l->name);
lua_pushlightuserdata(L, (void*)l); lua_pushlightuserdata(L, (void*)l);
lua_pushcclosure(L, thunk, 1); lua_pushcclosure(L, thunk, 1);
@@ -82,13 +70,12 @@ public:
// get userdata from Lua stack and return pointer to T object // get userdata from Lua stack and return pointer to T object
static T *check(lua_State *L, int narg) { static T *check(lua_State *L, int narg) {
userdataType *ud = userdataType *ud =
static_cast<userdataType*>(luaL_checkudata(L, narg, TInfo::className)); static_cast<userdataType*>(luaL_checkudata(L, narg, s_className));
if(!ud) luaL_typerror(L, narg, TInfo::className); if(!ud) luaL_typerror(L, narg, s_className);
return ud->pT; // pointer to T object return ud->pT; // pointer to T object
} }
private: private:
Luna(); // hide default constructor
// member function dispatcher // member function dispatcher
static int thunk(lua_State *L) { static int thunk(lua_State *L) {
@@ -106,23 +93,39 @@ public:
static int Push(lua_State *L, T* p ) { static int Push(lua_State *L, T* p ) {
userdataType *ud = static_cast<userdataType*>(lua_newuserdata(L, sizeof(userdataType))); userdataType *ud = static_cast<userdataType*>(lua_newuserdata(L, sizeof(userdataType)));
ud->pT = p; // store pointer to object in userdata ud->pT = p; // store pointer to object in userdata
luaL_getmetatable(L, TInfo::className); // lookup metatable in Lua registry luaL_getmetatable(L, s_className); // lookup metatable in Lua registry
lua_setmetatable(L, -2); lua_setmetatable(L, -2);
return 1; // userdata containing pointer to T object return 1; // userdata containing pointer to T object
} }
typedef vector<RegType> RegTypeVector;
static RegTypeVector *s_pvMethods;
private: private:
static const char s_className[];
static int tostring_T (lua_State *L) { static int tostring_T (lua_State *L) {
char buff[32]; char buff[32];
userdataType *ud = static_cast<userdataType*>(lua_touserdata(L, 1)); userdataType *ud = static_cast<userdataType*>(lua_touserdata(L, 1));
T *obj = ud->pT; T *obj = ud->pT;
sprintf(buff, "%p", obj); sprintf(buff, "%p", obj);
lua_pushfstring(L, "%s (%s)", TInfo::className, buff); lua_pushfstring(L, "%s (%s)", s_className, buff);
return 1; return 1;
} }
}; };
#define LUA_REGISTER_CLASS( T ) \
const char Luna##T<T>::s_className[] = #T; \
Luna##T<T>::RegTypeVector* Luna##T<T>::s_pvMethods = NULL; \
static Luna##T<T> registera; \
void T::PushSelf( lua_State *L ) { Luna##T<T>::Push( L, this ); }
#define ADD_METHOD( method_name ) \
{ if(s_pvMethods==NULL) s_pvMethods = new RegTypeVector; RegType r = {#method_name,method_name}; s_pvMethods->push_back(r); }
#endif
/* /*
* (c) 2001-2005 lua-users.org, Chris Danford * (c) 2001-2005 lua-users.org, Chris Danford
* All rights reserved. * All rights reserved.
-5
View File
@@ -785,11 +785,6 @@ bool Model::MaterialsNeedNormals() const
return false; return false;
} }
void Model::PushSelf( lua_State *L )
{
Luna<Model,LuaModel>::Push( L, this );
}
/* /*
* (c) 2003-2004 Chris Danford * (c) 2003-2004 Chris Danford
* All rights reserved. * All rights reserved.
+12 -5
View File
@@ -10,13 +10,20 @@
#include <map> #include <map>
#include "RageModelGeometry.h" #include "RageModelGeometry.h"
#define LUA_Model_METHODS( T ) \ template<class T>
LUA_Actor_METHODS( T ) \ class LunaModel : public LunaActor<T>
{
public:
LunaModel() { LUA->Register( Register ); }
static int playanimation( T* p, lua_State *L ) { p->PlayAnimation(SArg(1),FArg(2)); return 0; } \ static int playanimation( T* p, lua_State *L ) { p->PlayAnimation(SArg(1),FArg(2)); return 0; } \
#define LUA_Model_METHODS_MAP( T ) \ static void Register(lua_State *L)
LUA_Actor_METHODS_MAP( T ) \ {
LUA_METHOD_MAP( T, playanimation ) \ ADD_METHOD( playanimation ) \
LunaActor<T>::Register( L );
}
};
class Model : public Actor class Model : public Actor
{ {
-6
View File
@@ -976,12 +976,6 @@ void Sprite::LoseFocus()
Actor::LoseFocus(); Actor::LoseFocus();
} }
void Sprite::PushSelf( lua_State *L )
{
Luna<Sprite,LuaSprite>::Push( L, this );
}
/* /*
* (c) 2001-2004 Chris Danford * (c) 2001-2004 Chris Danford
* All rights reserved. * All rights reserved.
+16 -11
View File
@@ -8,9 +8,12 @@
class RageTexture; class RageTexture;
template<class T>
class LunaSprite : public LunaActor<T>
{
public:
LunaSprite() { LUA->Register( Register ); }
#define LUA_Sprite_METHODS( T ) \
LUA_Actor_METHODS( T ) \
/* Commands that go in the tweening queue: /* Commands that go in the tweening queue:
* Commands that take effect immediately (ignoring the tweening queue): */ \ * Commands that take effect immediately (ignoring the tweening queue): */ \
static int customtexturerect( T* p, lua_State *L ) { p->SetCustomTextureRect( RectF(FArg(1),FArg(2),FArg(3),FArg(4)) ); return 0; } \ static int customtexturerect( T* p, lua_State *L ) { p->SetCustomTextureRect( RectF(FArg(1),FArg(2),FArg(3),FArg(4)) ); return 0; } \
@@ -25,15 +28,17 @@ class RageTexture;
static int loop( T* p, lua_State *L ) { p->SetLooping(BArg(1)); return 0; } \ static int loop( T* p, lua_State *L ) { p->SetLooping(BArg(1)); return 0; } \
static int rate( T* p, lua_State *L ) { p->SetPlaybackRate(FArg(1)); return 0; } \ static int rate( T* p, lua_State *L ) { p->SetPlaybackRate(FArg(1)); return 0; } \
#define LUA_Sprite_METHODS_MAP( T ) \ static void Register(lua_State *L) {
LUA_Actor_METHODS_MAP( T ) \ ADD_METHOD( customtexturerect ) \
LUA_METHOD_MAP( T, customtexturerect ) \ ADD_METHOD( texcoordvelocity ) \
LUA_METHOD_MAP( T, texcoordvelocity ) \ ADD_METHOD( scaletoclipped ) \
LUA_METHOD_MAP( T, scaletoclipped ) \ ADD_METHOD( stretchtexcoords ) \
LUA_METHOD_MAP( T, stretchtexcoords ) \ ADD_METHOD( position ) \
LUA_METHOD_MAP( T, position ) \ ADD_METHOD( loop ) \
LUA_METHOD_MAP( T, loop ) \ ADD_METHOD( rate ) \
LUA_METHOD_MAP( T, rate ) \ LunaActor<T>::Register( L );
}
};
class Sprite: public Actor class Sprite: public Actor