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 );
}
void Actor::PushSelf( lua_State *L )
{
Luna<Actor,LuaActor>::Push( L, this );
}
/*
* (c) 2001-2004 Chris Danford
+99 -91
View File
@@ -9,13 +9,19 @@
#include <map>
struct XNode;
struct lua_State;
#include "LuaBinding.h"
#define DRAW_ORDER_BEFORE_EVERYTHING -100
#define DRAW_ORDER_TRANSITIONS 100
#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 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; } \
@@ -105,96 +111,98 @@ struct lua_State;
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; } \
#define LUA_Actor_METHODS_MAP( T ) \
LUA_METHOD_MAP( T, sleep ) \
LUA_METHOD_MAP( T, linear ) \
LUA_METHOD_MAP( T, accelerate ) \
LUA_METHOD_MAP( T, decelerate ) \
LUA_METHOD_MAP( T, bouncebegin ) \
LUA_METHOD_MAP( T, bounceend ) \
LUA_METHOD_MAP( T, spring ) \
LUA_METHOD_MAP( T, stoptweening ) \
LUA_METHOD_MAP( T, finishtweening ) \
LUA_METHOD_MAP( T, hurrytweening ) \
LUA_METHOD_MAP( T, x ) \
LUA_METHOD_MAP( T, y ) \
LUA_METHOD_MAP( T, z ) \
LUA_METHOD_MAP( T, addx ) \
LUA_METHOD_MAP( T, addy ) \
LUA_METHOD_MAP( T, addz ) \
LUA_METHOD_MAP( T, zoom ) \
LUA_METHOD_MAP( T, zoomx ) \
LUA_METHOD_MAP( T, zoomy ) \
LUA_METHOD_MAP( T, zoomz ) \
LUA_METHOD_MAP( T, zoomtowidth ) \
LUA_METHOD_MAP( T, zoomtoheight ) \
LUA_METHOD_MAP( T, stretchto ) \
LUA_METHOD_MAP( T, cropleft ) \
LUA_METHOD_MAP( T, croptop ) \
LUA_METHOD_MAP( T, cropright ) \
LUA_METHOD_MAP( T, cropbottom ) \
LUA_METHOD_MAP( T, fadeleft ) \
LUA_METHOD_MAP( T, fadetop ) \
LUA_METHOD_MAP( T, faderight ) \
LUA_METHOD_MAP( T, fadebottom ) \
LUA_METHOD_MAP( T, diffuse ) \
LUA_METHOD_MAP( T, diffuseleftedge ) \
LUA_METHOD_MAP( T, diffuserightedge ) \
LUA_METHOD_MAP( T, diffusetopedge ) \
LUA_METHOD_MAP( T, diffusebottomedge ) \
LUA_METHOD_MAP( T, diffusealpha ) \
LUA_METHOD_MAP( T, diffusecolor ) \
LUA_METHOD_MAP( T, glow ) \
LUA_METHOD_MAP( T, rotationx ) \
LUA_METHOD_MAP( T, rotationy ) \
LUA_METHOD_MAP( T, rotationz ) \
LUA_METHOD_MAP( T, heading ) \
LUA_METHOD_MAP( T, pitch ) \
LUA_METHOD_MAP( T, roll ) \
LUA_METHOD_MAP( T, shadowlength ) \
LUA_METHOD_MAP( T, horizalign ) \
LUA_METHOD_MAP( T, vertalign ) \
LUA_METHOD_MAP( T, diffuseblink ) \
LUA_METHOD_MAP( T, diffuseshift ) \
LUA_METHOD_MAP( T, glowblink ) \
LUA_METHOD_MAP( T, glowshift ) \
LUA_METHOD_MAP( T, rainbow ) \
LUA_METHOD_MAP( T, wag ) \
LUA_METHOD_MAP( T, bounce ) \
LUA_METHOD_MAP( T, bob ) \
LUA_METHOD_MAP( T, pulse ) \
LUA_METHOD_MAP( T, spin ) \
LUA_METHOD_MAP( T, vibrate ) \
LUA_METHOD_MAP( T, stopeffect ) \
LUA_METHOD_MAP( T, effectcolor1 ) \
LUA_METHOD_MAP( T, effectcolor2 ) \
LUA_METHOD_MAP( T, effectperiod ) \
LUA_METHOD_MAP( T, effectoffset ) \
LUA_METHOD_MAP( T, effectdelay ) \
LUA_METHOD_MAP( T, effectclock ) \
LUA_METHOD_MAP( T, effectmagnitude ) \
LUA_METHOD_MAP( T, scaletocover ) \
LUA_METHOD_MAP( T, scaletofit ) \
LUA_METHOD_MAP( T, animate ) \
LUA_METHOD_MAP( T, play ) \
LUA_METHOD_MAP( T, pause ) \
LUA_METHOD_MAP( T, setstate ) \
LUA_METHOD_MAP( T, texturewrapping ) \
LUA_METHOD_MAP( T, additiveblend ) \
LUA_METHOD_MAP( T, blend ) \
LUA_METHOD_MAP( T, zbuffer ) \
LUA_METHOD_MAP( T, ztest ) \
LUA_METHOD_MAP( T, ztestmode ) \
LUA_METHOD_MAP( T, zwrite ) \
LUA_METHOD_MAP( T, clearzbuffer ) \
LUA_METHOD_MAP( T, backfacecull ) \
LUA_METHOD_MAP( T, cullmode ) \
LUA_METHOD_MAP( T, hidden ) \
LUA_METHOD_MAP( T, hibernate ) \
LUA_METHOD_MAP( T, draworder ) \
LUA_METHOD_MAP( T, playcommand ) \
LUA_METHOD_MAP( T, queuecommand ) \
static void Register(lua_State *L) {
ADD_METHOD( sleep ) \
ADD_METHOD( linear ) \
ADD_METHOD( accelerate ) \
ADD_METHOD( decelerate ) \
ADD_METHOD( bouncebegin ) \
ADD_METHOD( bounceend ) \
ADD_METHOD( spring ) \
ADD_METHOD( stoptweening ) \
ADD_METHOD( finishtweening ) \
ADD_METHOD( hurrytweening ) \
ADD_METHOD( x ) \
ADD_METHOD( y ) \
ADD_METHOD( z ) \
ADD_METHOD( addx ) \
ADD_METHOD( addy ) \
ADD_METHOD( addz ) \
ADD_METHOD( zoom ) \
ADD_METHOD( zoomx ) \
ADD_METHOD( zoomy ) \
ADD_METHOD( zoomz ) \
ADD_METHOD( zoomtowidth ) \
ADD_METHOD( zoomtoheight ) \
ADD_METHOD( stretchto ) \
ADD_METHOD( cropleft ) \
ADD_METHOD( croptop ) \
ADD_METHOD( cropright ) \
ADD_METHOD( cropbottom ) \
ADD_METHOD( fadeleft ) \
ADD_METHOD( fadetop ) \
ADD_METHOD( faderight ) \
ADD_METHOD( fadebottom ) \
ADD_METHOD( diffuse ) \
ADD_METHOD( diffuseleftedge ) \
ADD_METHOD( diffuserightedge ) \
ADD_METHOD( diffusetopedge ) \
ADD_METHOD( diffusebottomedge ) \
ADD_METHOD( diffusealpha ) \
ADD_METHOD( diffusecolor ) \
ADD_METHOD( glow ) \
ADD_METHOD( rotationx ) \
ADD_METHOD( rotationy ) \
ADD_METHOD( rotationz ) \
ADD_METHOD( heading ) \
ADD_METHOD( pitch ) \
ADD_METHOD( roll ) \
ADD_METHOD( shadowlength ) \
ADD_METHOD( horizalign ) \
ADD_METHOD( vertalign ) \
ADD_METHOD( diffuseblink ) \
ADD_METHOD( diffuseshift ) \
ADD_METHOD( glowblink ) \
ADD_METHOD( glowshift ) \
ADD_METHOD( rainbow ) \
ADD_METHOD( wag ) \
ADD_METHOD( bounce ) \
ADD_METHOD( bob ) \
ADD_METHOD( pulse ) \
ADD_METHOD( spin ) \
ADD_METHOD( vibrate ) \
ADD_METHOD( stopeffect ) \
ADD_METHOD( effectcolor1 ) \
ADD_METHOD( effectcolor2 ) \
ADD_METHOD( effectperiod ) \
ADD_METHOD( effectoffset ) \
ADD_METHOD( effectdelay ) \
ADD_METHOD( effectclock ) \
ADD_METHOD( effectmagnitude ) \
ADD_METHOD( scaletocover ) \
ADD_METHOD( scaletofit ) \
ADD_METHOD( animate ) \
ADD_METHOD( play ) \
ADD_METHOD( pause ) \
ADD_METHOD( setstate ) \
ADD_METHOD( texturewrapping ) \
ADD_METHOD( additiveblend ) \
ADD_METHOD( blend ) \
ADD_METHOD( zbuffer ) \
ADD_METHOD( ztest ) \
ADD_METHOD( ztestmode ) \
ADD_METHOD( zwrite ) \
ADD_METHOD( clearzbuffer ) \
ADD_METHOD( backfacecull ) \
ADD_METHOD( cullmode ) \
ADD_METHOD( hidden ) \
ADD_METHOD( hibernate ) \
ADD_METHOD( draworder ) \
ADD_METHOD( playcommand ) \
ADD_METHOD( queuecommand ) \
Luna<T>::Register( L );
}
};
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
* All rights reserved.
+12 -5
View File
@@ -5,13 +5,20 @@
#include "Actor.h"
#define LUA_ActorFrame_METHODS( T ) \
LUA_Actor_METHODS( T ) \
template<class 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; } \
#define LUA_ActorFrame_METHODS_MAP( T ) \
LUA_Actor_METHODS_MAP( T ) \
LUA_METHOD_MAP( T, propagate ) \
static void Register(lua_State *L)
{
ADD_METHOD( propagate ) \
LunaActor<T>::Register( L );
}
};
class ActorFrame : public Actor
{
-5
View File
@@ -551,11 +551,6 @@ void BitmapText::SetWrapWidthPixels( int iWrapWidthPixels )
SetText( m_sText, "", iWrapWidthPixels );
}
void BitmapText::PushSelf( lua_State *L )
{
Luna<BitmapText,LuaBitmapText>::Push( L, this );
}
/*
* (c) 2003-2004 Chris Danford
* All rights reserved.
+13 -6
View File
@@ -6,15 +6,22 @@
#include "Actor.h"
class RageTexture;
#define LUA_BitmapText_METHODS( T ) \
LUA_Actor_METHODS( T ) \
template<class 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 maxwidth( T* p, lua_State *L ) { p->SetMaxWidth( FArg(1) ); return 0; } \
#define LUA_BitmapText_METHODS_MAP( T ) \
LUA_Actor_METHODS_MAP( T ) \
LUA_METHOD_MAP( T, wrapwidthpixels ) \
LUA_METHOD_MAP( T, maxwidth ) \
static void Register(lua_State *L)
{
ADD_METHOD( wrapwidthpixels ) \
ADD_METHOD( maxwidth ) \
LunaActor<T>::Register( L );
}
};
class Font;
+31 -28
View File
@@ -2,6 +2,9 @@
* Modified by Chris.
*/
#ifndef LuaBinding_H
#define LuaBinding_H
extern "C"
{
#include <lua.h>
@@ -9,6 +12,7 @@ extern "C"
}
#include "LuaManager.h"
#include <vector>
#define SArg(n) (luaL_checkstring(L,n))
@@ -17,27 +21,10 @@ extern "C"
#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, typename TInfo> class Luna {
template <typename T>
class Luna
{
typedef struct { T *pT; } userdataType;
public:
typedef int (*mfp)(T *p, lua_State *L);
@@ -47,12 +34,12 @@ public:
lua_newtable(L);
int methods = lua_gettop(L);
luaL_newmetatable(L, TInfo::className);
luaL_newmetatable(L, s_className);
int metatable = lua_gettop(L);
// store method table in globals so that
// scripts can add functions written in Lua.
lua_pushstring(L, TInfo::className);
lua_pushstring(L, s_className);
lua_pushvalue(L, methods);
lua_settable(L, LUA_GLOBALSINDEX);
@@ -69,7 +56,8 @@ public:
lua_settable(L, metatable);
// 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_pushlightuserdata(L, (void*)l);
lua_pushcclosure(L, thunk, 1);
@@ -82,13 +70,12 @@ public:
// get userdata from Lua stack and return pointer to T object
static T *check(lua_State *L, int narg) {
userdataType *ud =
static_cast<userdataType*>(luaL_checkudata(L, narg, TInfo::className));
if(!ud) luaL_typerror(L, narg, TInfo::className);
static_cast<userdataType*>(luaL_checkudata(L, narg, s_className));
if(!ud) luaL_typerror(L, narg, s_className);
return ud->pT; // pointer to T object
}
private:
Luna(); // hide default constructor
// member function dispatcher
static int thunk(lua_State *L) {
@@ -106,23 +93,39 @@ public:
static int Push(lua_State *L, T* p ) {
userdataType *ud = static_cast<userdataType*>(lua_newuserdata(L, sizeof(userdataType)));
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);
return 1; // userdata containing pointer to T object
}
typedef vector<RegType> RegTypeVector;
static RegTypeVector *s_pvMethods;
private:
static const char s_className[];
static int tostring_T (lua_State *L) {
char buff[32];
userdataType *ud = static_cast<userdataType*>(lua_touserdata(L, 1));
T *obj = ud->pT;
sprintf(buff, "%p", obj);
lua_pushfstring(L, "%s (%s)", TInfo::className, buff);
lua_pushfstring(L, "%s (%s)", s_className, buff);
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
* All rights reserved.
-5
View File
@@ -785,11 +785,6 @@ bool Model::MaterialsNeedNormals() const
return false;
}
void Model::PushSelf( lua_State *L )
{
Luna<Model,LuaModel>::Push( L, this );
}
/*
* (c) 2003-2004 Chris Danford
* All rights reserved.
+12 -5
View File
@@ -10,13 +10,20 @@
#include <map>
#include "RageModelGeometry.h"
#define LUA_Model_METHODS( T ) \
LUA_Actor_METHODS( T ) \
template<class 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; } \
#define LUA_Model_METHODS_MAP( T ) \
LUA_Actor_METHODS_MAP( T ) \
LUA_METHOD_MAP( T, playanimation ) \
static void Register(lua_State *L)
{
ADD_METHOD( playanimation ) \
LunaActor<T>::Register( L );
}
};
class Model : public Actor
{
-6
View File
@@ -976,12 +976,6 @@ void Sprite::LoseFocus()
Actor::LoseFocus();
}
void Sprite::PushSelf( lua_State *L )
{
Luna<Sprite,LuaSprite>::Push( L, this );
}
/*
* (c) 2001-2004 Chris Danford
* All rights reserved.
+16 -11
View File
@@ -8,9 +8,12 @@
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 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; } \
@@ -25,15 +28,17 @@ class RageTexture;
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; } \
#define LUA_Sprite_METHODS_MAP( T ) \
LUA_Actor_METHODS_MAP( T ) \
LUA_METHOD_MAP( T, customtexturerect ) \
LUA_METHOD_MAP( T, texcoordvelocity ) \
LUA_METHOD_MAP( T, scaletoclipped ) \
LUA_METHOD_MAP( T, stretchtexcoords ) \
LUA_METHOD_MAP( T, position ) \
LUA_METHOD_MAP( T, loop ) \
LUA_METHOD_MAP( T, rate ) \
static void Register(lua_State *L) {
ADD_METHOD( customtexturerect ) \
ADD_METHOD( texcoordvelocity ) \
ADD_METHOD( scaletoclipped ) \
ADD_METHOD( stretchtexcoords ) \
ADD_METHOD( position ) \
ADD_METHOD( loop ) \
ADD_METHOD( rate ) \
LunaActor<T>::Register( L );
}
};
class Sprite: public Actor