summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/3rdParty/Lua51/loadlib.c2
-rw-r--r--Source/3rdParty/Luax/luax.h1
-rw-r--r--Source/3rdParty/Luax/luax_class.hpp34
-rw-r--r--Source/3rdParty/Luax/luax_class.inl161
-rw-r--r--Source/3rdParty/Luax/luax_context.cpp19
-rw-r--r--Source/3rdParty/Luax/luax_context.h8
-rw-r--r--Source/3rdParty/Luax/luax_enum.cpp8
-rw-r--r--Source/3rdParty/Luax/luax_memberref.h2
-rw-r--r--Source/3rdParty/Luax/luax_ref.h4
-rw-r--r--Source/3rdParty/Luax/luax_runtime.cpp20
-rw-r--r--Source/3rdParty/Luax/luax_runtime.h4
-rw-r--r--Source/3rdParty/Luax/luax_state.cpp87
-rw-r--r--Source/3rdParty/Luax/luax_state.h39
-rw-r--r--Source/3rdParty/Luax/luax_state.inl56
-rw-r--r--Source/Asura.Editor/source/events/events.h24
-rw-r--r--Source/Asura.Engine/Graphics/Image.h22
-rw-r--r--Source/Asura.Engine/Graphics/Shader.h6
-rw-r--r--Source/Asura.Engine/graphics/binding/canvas.binding.cpp (renamed from Source/Asura.Engine/graphics/binding/canvas.cpp)0
-rw-r--r--Source/Asura.Engine/graphics/binding/color.binding.cpp (renamed from Source/Asura.Engine/graphics/binding/color.cpp)0
-rw-r--r--Source/Asura.Engine/graphics/binding/image.binding.cpp (renamed from Source/Asura.Engine/graphics/binding/image.cpp)0
-rw-r--r--Source/Asura.Engine/graphics/binding/image_data.binding.cpp35
-rw-r--r--Source/Asura.Engine/graphics/binding/mesh2d.binding.cpp (renamed from Source/Asura.Engine/graphics/binding/image_data.cpp)0
-rw-r--r--Source/Asura.Engine/graphics/binding/mesh2d_data.binding.cpp (renamed from Source/Asura.Engine/graphics/binding/mesh2d.cpp)0
-rw-r--r--Source/Asura.Engine/graphics/binding/shader.binding.cpp (renamed from Source/Asura.Engine/graphics/binding/shader.cpp)10
-rw-r--r--Source/Asura.Engine/graphics/binding/sprite_batch.binding.cpp (renamed from Source/Asura.Engine/graphics/binding/mesh2d_data.cpp)0
-rw-r--r--Source/Asura.Engine/graphics/binding/sprite_batch.cpp0
-rw-r--r--Source/Asura.Engine/graphics/binding/window.binding.cpp (renamed from Source/Asura.Engine/graphics/binding/window.cpp)0
-rw-r--r--Source/Asura.Engine/graphics/image.h22
-rw-r--r--Source/Asura.Engine/graphics/shader.h6
-rw-r--r--Source/Samples/LuaxTest/main.cpp64
-rw-r--r--Source/Samples/LuaxTest/script.lua63
31 files changed, 443 insertions, 254 deletions
diff --git a/Source/3rdParty/Lua51/loadlib.c b/Source/3rdParty/Lua51/loadlib.c
index 6158c53..9455c53 100644
--- a/Source/3rdParty/Lua51/loadlib.c
+++ b/Source/3rdParty/Lua51/loadlib.c
@@ -654,7 +654,7 @@ LUALIB_API int luaopen_package (lua_State *L) {
lua_setfield(L, -2, "config");
/* set field `loaded' */
luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2);
- lua_setfield(L, -2, "loaded");
+ lua_setfield(L, -2, "loaded"); // LUA_REGISTRYINDEX["_LOADED"]Ϊpackage.loaded\LUA_ENVIRONINDEX["loaded"]
/* set field `preload' */
lua_newtable(L);
lua_setfield(L, -2, "preload");
diff --git a/Source/3rdParty/Luax/luax.h b/Source/3rdParty/Luax/luax.h
index ed67bdc..9a6b0b9 100644
--- a/Source/3rdParty/Luax/luax.h
+++ b/Source/3rdParty/Luax/luax.h
@@ -6,6 +6,7 @@
#include "luax_namespace.h"
#include "luax_ref.h"
#include "luax_reftable.h"
+#include "luax_memberref.h"
#include "luax_enum.h"
#include "luax_class.hpp"
#include "luax_class.inl"
diff --git a/Source/3rdParty/Luax/luax_class.hpp b/Source/3rdParty/Luax/luax_class.hpp
index 0d3dc5b..a76d501 100644
--- a/Source/3rdParty/Luax/luax_class.hpp
+++ b/Source/3rdParty/Luax/luax_class.hpp
@@ -53,7 +53,9 @@ namespace Luax
///
/// userdata pushջûгʼmUserdataʼúԪѳʼõuserdataջһá
///
- bool PushLuaUserdata(LuaxState& state);
+ bool PushLuaxUserdata(LuaxState& state);
+ bool PushLuaxMemberTable(LuaxState& state);
+ bool PushLuaxRefTable(LuaxState& state);
private:
@@ -62,15 +64,15 @@ namespace Luax
static void RegisterLuaxClass(LuaxState& state);
static void RegisterLuaxFactoryClass(LuaxState& state);
static void RegisterLuaxSingletonClass(LuaxState& state);
- static void RegisterLuaxInterface(LuaxState& state);
- static void SetInterfaceTableRef(LuaxState& state, int idx);
- static void SetClassTableRef(LuaxState& state, int idx);
+ static void RegisterLuaxInterface(LuaxState& state);
- static void PushInterfaceTable(LuaxState& state);
- static void PushClassTable(LuaxState& state);
- static void PushRefTable(LuaxState& state);
+ static void SetLuaxInterfaceTableRef(LuaxState& state, int idx);
+ static void SetLuaxClassTableRef(LuaxState& state, int idx);
+ static void PushLuaxInterfaceTable(LuaxState& state);
+ static void PushLuaxClassTable(LuaxState& state);
+
///
/// ȡַҪַֻͨڶϴʵõջϺ;̬ıȡַ֤ü׼ȷ
/// ҪãʹôݶǴݵַ
@@ -87,12 +89,16 @@ namespace Luax
///
/// LuaxClass<T>͵ʵ
///
- static LuaxStrongRef mInterfaceTable; // interface table
- static LuaxStrongRef mClassTable; // class table
- static LuaxStrongRef mRefTable; //
-
+ static LuaxStrongRef mClassTable; // class table͵
+ static LuaxStrongRef mInterfaceTable; // ǹinterface tableʵĶĹз
+ static LuaxStrongRef mSingletonRefTable; // ǵsingletonijԱԱ֤ᱻͨ
+ // ref tableijԱȫڵģֱ_LUAX_STRONGREF_TABLE
+
///
- /// ͨuserdataõref table\member table\interface table
+ /// ͨuserdataõ:
+ /// 1: ref table
+ /// 2: member table
+ /// 3: interface table
///
LuaxWeakRef mUserdata;
@@ -113,13 +119,13 @@ namespace Luax
LUAX_DECL_METHOD( l_GetClassName );
LUAX_DECL_METHOD( l_GetInterfaceTable );
- LUAX_DECL_METHOD( l_ToString );
+ LUAX_DECL_METHOD( l___tostring );
//------------------------------------------------------------------------------------------------------------
//
LUAX_DECL_METHOD( l_ExtendFactory );
- LUAX_DECL_METHOD( l_GC );
+ LUAX_DECL_METHOD( l___gc );
//------------------------------------------------------------------------------------------------------------
//
diff --git a/Source/3rdParty/Luax/luax_class.inl b/Source/3rdParty/Luax/luax_class.inl
index 2d28d68..8cf0f55 100644
--- a/Source/3rdParty/Luax/luax_class.inl
+++ b/Source/3rdParty/Luax/luax_class.inl
@@ -56,8 +56,8 @@ namespace Luax
void LuaxClass<T>::RegisterLuaxInterface(LuaxState& state)
{
luaL_Reg regTable[] = {
- { "__gc", l_GC },
- { NULL, NULL }
+ { "__gc", l___gc },
+ { NULL, NULL }
};
state.RegisterMethods(regTable);
@@ -78,7 +78,7 @@ namespace Luax
}
template<typename T>
- void LuaxClass<T>::PushInterfaceTable(LuaxState& state)
+ void LuaxClass<T>::PushLuaxInterfaceTable(LuaxState& state)
{
assert(mInterfaceTable);
@@ -86,7 +86,7 @@ namespace Luax
}
template<typename T>
- void LuaxClass<T>::PushClassTable(LuaxState& state)
+ void LuaxClass<T>::PushLuaxClassTable(LuaxState& state)
{
assert(mClassTable);
@@ -94,21 +94,13 @@ namespace Luax
}
template<typename T>
- void LuaxClass<T>::PushRefTable(LuaxState& state)
- {
- assert(mRefTable);
-
- mRefTable.Push(state);
- }
-
- template<typename T>
- void LuaxClass<T>::SetInterfaceTableRef(LuaxState& state, int idx)
+ void LuaxClass<T>::SetLuaxInterfaceTableRef(LuaxState& state, int idx)
{
mInterfaceTable.SetRef(state, idx);
}
template<typename T>
- void LuaxClass<T>::SetClassTableRef(LuaxState& state, int idx)
+ void LuaxClass<T>::SetLuaxClassTableRef(LuaxState& state, int idx)
{
mClassTable.SetRef(state, idx);
}
@@ -143,8 +135,9 @@ namespace Luax
}
template<typename T>
- bool LuaxClass<T>::PushLuaUserdata(LuaxState& state)
+ bool LuaxClass<T>::PushLuaxUserdata(LuaxState& state)
{
+ assert(!T::IsLuaxClassSingleton());
if (!mUserdata)
{
BindToLua(state);
@@ -154,58 +147,102 @@ namespace Luax
}
template<typename T>
+ bool LuaxClass<T>::PushLuaxMemberTable(LuaxState& state)
+ {
+ int top = state.GetTop();
+ if (this->PushLuaxUserdata(state))
+ {
+ if (lua_getmetatable(state, -1)) // ref table
+ {
+ lua_replace(state, -2);
+ if (lua_getmetatable(state, -1)) // member table
+ {
+ lua_replace(state, -2);
+ return true;
+ }
+ }
+ }
+ state.SetTop(top);
+ lua_pushnil(state);
+ return false;
+ }
+
+ template<typename T>
+ bool LuaxClass<T>::PushLuaxRefTable(LuaxState& state)
+ {
+ // Singleton
+ if (T::IsLuaxClassSingleton())
+ {
+ if (!this->mSingletonRefTable) {
+ lua_newtable(state);
+ this->mSingletonRefTable.SetRef(state, -1); // strong ref to member table won't be garbage collected
+ }
+ else {
+ this->mSingletonRefTable.PushRef(state);
+ }
+ return true;
+ }
+ // Factory
+ else
+ {
+ if (this->PushLuaxUserdata(state))
+ {
+ if (lua_getmetatable(state, -1))
+ {
+ lua_replace(state, -2);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ template<typename T>
void LuaxClass<T>::BindToLua(LuaxState& state)
{
+ // ܰuserdata
+ assert(!T::IsLuaxClassSingleton());
assert(!mUserdata);
// userdataջ
state.PushPtrUserData(this);
- //
- if (!T::IsLuaxClassSingleton())
- {
- lua_newtable(state); // ref table
- lua_newtable(state); // member table
- LuaxClass<T>::PushInterfaceTable(state); // interface table
-
- // stack:
- // -1: interface table
- // -2: member table
- // -3: ref table
- // -4: userdata
-
- int top = state.GetTop();
- int memberTable = top - 1;
- int refTable = top - 2;
-
- // ref table ע __gc__tostring
- lua_pushcfunction(state, LuaxClass<T>::l_GC);
- lua_setfield(state, refTable, "__gc");
-
- lua_pushcfunction(state, LuaxClass<T>::l_ToString);
- lua_setfield(state, refTable, "__tostring");
-
- // member table Ϊ ref table __index __newindex
- lua_pushvalue(state, memberTable);
- lua_setfield(state, refTable, "__index");
-
- lua_pushvalue(state, memberTable);
- lua_setfield(state, refTable, "__newindex");
-
- // Ԫ
- lua_setmetatable(state, -2); // interface is meta of member
- lua_setmetatable(state, -2); // member is meta of ref
- lua_setmetatable(state, -2); // ref is meta of userdata
- }
+ lua_newtable(state); // ref table޷luaʣC
+ lua_newtable(state); // member tableluaдĶԱ
+ PushLuaxInterfaceTable(state); // interface tablemember tableûԱinterface tableҡ
- // һuserdataãͨnativeָ뷵lua
- mUserdata.SetRef(state, -1);
- assert(mUserdata);
+ // stack:
+ // -1: interface table
+ // -2: member table
+ // -3: ref table
+ // -4: userdata
- if (T::IsLuaxClassSingleton())
- {
+ int top = state.GetTop();
+ int memberTable = top - 1;
+ int refTable = top - 2;
- }
+ // ref table ע __gc__tostring
+ lua_pushcfunction(state, l___gc);
+ lua_setfield(state, refTable, "__gc");
+
+ lua_pushcfunction(state, l___tostring);
+ lua_setfield(state, refTable, "__tostring");
+
+ // member table Ϊ ref table __index __newindex
+ lua_pushvalue(state, memberTable);
+ lua_setfield(state, refTable, "__index");
+
+ lua_pushvalue(state, memberTable);
+ lua_setfield(state, refTable, "__newindex");
+
+ // Ԫ
+ lua_setmetatable(state, -2); // interface is meta of member
+ lua_setmetatable(state, -2); // member is meta of ref
+ lua_setmetatable(state, -2); // ref is meta of userdata
+
+ // һuserdataãͨPushLuaUserdatalua
+ mUserdata.SetRef(state, -1);
+ assert(mUserdata);
}
//--------------------------------------------------------------------------------------------------------------
@@ -214,7 +251,7 @@ namespace Luax
/// ͷŹʵ
///
template<typename T>
- int LuaxClass<T>::l_GC(lua_State* L)
+ int LuaxClass<T>::l___gc(lua_State* L)
{
LUAX_SETUP(L, "U");
@@ -222,7 +259,7 @@ namespace Luax
}
template<typename T>
- int LuaxClass<T>::l_ToString(lua_State* L)
+ int LuaxClass<T>::l___tostring(lua_State* L)
{
return 0;
}
@@ -242,8 +279,8 @@ namespace Luax
return 0;
}
- template<typename T> LuaxStrongRef LuaxClass<T>::mInterfaceTable; // interface table
- template<typename T> LuaxStrongRef LuaxClass<T>::mClassTable; // class table
- template<typename T> LuaxStrongRef LuaxClass<T>::mRefTable; //
+ template<typename T> LuaxStrongRef LuaxClass<T>::mInterfaceTable; // interface table
+ template<typename T> LuaxStrongRef LuaxClass<T>::mClassTable; // class table
+ template<typename T> LuaxStrongRef LuaxClass<T>::mSingletonRefTable; //
} \ No newline at end of file
diff --git a/Source/3rdParty/Luax/luax_context.cpp b/Source/3rdParty/Luax/luax_context.cpp
index c0fb2f5..d41c24f 100644
--- a/Source/3rdParty/Luax/luax_context.cpp
+++ b/Source/3rdParty/Luax/luax_context.cpp
@@ -3,34 +3,27 @@
namespace Luax
{
- // ˴˺
- int l_Errfunc(lua_State* L)
- {
- cc8* err = lua_tostring(L, lua_upvalueindex(1));
- return luaL_error(L, err);
- }
-
- Context::Context(lua_State* L)
+ LuaxContext::LuaxContext(lua_State* L)
: state(L)
{
assert(state);
}
- Context::~Context()
+ LuaxContext::~LuaxContext()
{
}
// ʼcontext
- void Context::Setup()
+ void LuaxContext::Setup()
{
SetupRefTables();
}
- void Context::SetupRefTables()
+ void LuaxContext::SetupRefTables()
{
// strong ref weak ref
- strongRefTable.Init(state, "LUAX_STRONGREF_TABLE");
- weakRefTable.Init(state, "LUAX_WEAKREF_TABLE", "v");
+ strongRefTable.Init(state, "_LUAX_STRONGREF_TABLE");
+ weakRefTable.Init(state, "_LUAX_WEAKREF_TABLE", "v");
}
} \ No newline at end of file
diff --git a/Source/3rdParty/Luax/luax_context.h b/Source/3rdParty/Luax/luax_context.h
index 5746cf1..01c5937 100644
--- a/Source/3rdParty/Luax/luax_context.h
+++ b/Source/3rdParty/Luax/luax_context.h
@@ -11,11 +11,11 @@ namespace Luax
///
/// lua_stateصcontextһϵдļϣҲûϵҪΪ˽Լڴ档
///
- class Context
+ class LuaxContext
{
public:
- Context(lua_State* L);
- ~Context();
+ LuaxContext(lua_State* L);
+ ~LuaxContext();
void Setup();
@@ -23,7 +23,7 @@ namespace Luax
LuaxRefTable strongRefTable; // strong ref table
LuaxRefTable weakRefTable; // weak ref table
- size_t objectCount; // ͳڴstateдʵ
+ size_t objectCount; // ͳڴstateдʵ
private:
diff --git a/Source/3rdParty/Luax/luax_enum.cpp b/Source/3rdParty/Luax/luax_enum.cpp
index 1ccc900..a58593a 100644
--- a/Source/3rdParty/Luax/luax_enum.cpp
+++ b/Source/3rdParty/Luax/luax_enum.cpp
@@ -11,11 +11,11 @@ namespace Luax
int l_rmt__index(lua_State* L)
{
// params:
- // 1. enum table
- // 2. key
+ // 1: enum table
+ // 2: key
// upvalues:
- // 1. metatable
+ // 1: metatable
int mt = lua_upvalueindex(1);
lua_pushvalue(L, 2);
@@ -27,7 +27,7 @@ namespace Luax
int l_rmt__newindex(lua_State* L)
{
// upvalue:
- // 1. enum table name
+ // 1: enum table name
cc8* name = lua_tostring(L, lua_upvalueindex(1));
diff --git a/Source/3rdParty/Luax/luax_memberref.h b/Source/3rdParty/Luax/luax_memberref.h
index baebd06..a7ff1f6 100644
--- a/Source/3rdParty/Luax/luax_memberref.h
+++ b/Source/3rdParty/Luax/luax_memberref.h
@@ -5,7 +5,7 @@ namespace Luax
{
///
- /// LuaxClassijԱãinterface table֤ȷͷţǿá
+ /// LuaxClassijԱãref table֤ȷͷţǿá
///
class LuaxMemberRef
{
diff --git a/Source/3rdParty/Luax/luax_ref.h b/Source/3rdParty/Luax/luax_ref.h
index 7b484e9..b7aabe5 100644
--- a/Source/3rdParty/Luax/luax_ref.h
+++ b/Source/3rdParty/Luax/luax_ref.h
@@ -38,7 +38,7 @@ namespace Luax
};
///
- /// ǿãLUA_REGISTRYINDEX["LUAX_STRONGREF_TABLE"]
+ /// ǿãLUA_REGISTRYINDEX["_LUAX_STRONGREF_TABLE"]֤lua objectᱻա
///
class LuaxStrongRef: public LuaxRef
{
@@ -48,7 +48,7 @@ namespace Luax
};
///
- /// ãLUA_REGISTRYINDEX["LUAX_WEAKREF_TABLE"]
+ /// ãLUA_REGISTRYINDEX["_LUAX_WEAKREF_TABLE"]Ӱlua objectĻգֻΪһȡlua objectӳ䡣
///
class LuaxWeakRef : public LuaxRef
{
diff --git a/Source/3rdParty/Luax/luax_runtime.cpp b/Source/3rdParty/Luax/luax_runtime.cpp
index 47b20cb..b45d36a 100644
--- a/Source/3rdParty/Luax/luax_runtime.cpp
+++ b/Source/3rdParty/Luax/luax_runtime.cpp
@@ -26,9 +26,9 @@ namespace Luax
lua_State* L = lua_open();
assert(L);
- // 1.
- mContexts.insert(pair<lua_State*, Context>(L, Context(L)));
- // 2. ʼcontext
+ // 1)
+ mContexts.insert(pair<lua_State*, LuaxContext>(L, LuaxContext(L)));
+ // 2) ʼcontext
(*this)[L].Setup();
return L;
@@ -36,7 +36,7 @@ namespace Luax
void LuaxRuntime::Close(lua_State* L)
{
- map<lua_State*, Context>::iterator it = mContexts.find(L);
+ map<lua_State*, LuaxContext>::iterator it = mContexts.find(L);
if (it != mContexts.end())
{
lua_close(it->second.state);
@@ -46,13 +46,13 @@ namespace Luax
bool LuaxRuntime::HasLuaxState(lua_State* L)
{
- map<lua_State*, Context>::iterator it = mContexts.find(L);
+ map<lua_State*, LuaxContext>::iterator it = mContexts.find(L);
return it != mContexts.end();
}
LuaxState& LuaxRuntime::GetLuaxState(lua_State* L)
{
- map<lua_State*, Context>::iterator it = mContexts.find(L);
+ map<lua_State*, LuaxContext>::iterator it = mContexts.find(L);
if (it != mContexts.end())
{
return it->second.state;
@@ -61,7 +61,7 @@ namespace Luax
LuaxRefTable& LuaxRuntime::GetStrongRefTable(lua_State* L)
{
- map<lua_State*, Context>::iterator it = mContexts.find(L);
+ map<lua_State*, LuaxContext>::iterator it = mContexts.find(L);
if (it != mContexts.end())
{
return it->second.strongRefTable;
@@ -70,16 +70,16 @@ namespace Luax
LuaxRefTable& LuaxRuntime::GetWeaksRefTable(lua_State* L)
{
- map<lua_State*, Context>::iterator it = mContexts.find(L);
+ map<lua_State*, LuaxContext>::iterator it = mContexts.find(L);
if (it != mContexts.end())
{
return it->second.weakRefTable;
}
}
- Context& LuaxRuntime::operator[](lua_State* L)
+ LuaxContext& LuaxRuntime::operator[](lua_State* L)
{
- map<lua_State*, Context>::iterator it = mContexts.find(L);
+ map<lua_State*, LuaxContext>::iterator it = mContexts.find(L);
assert(it != mContexts.end());
return it->second;
}
diff --git a/Source/3rdParty/Luax/luax_runtime.h b/Source/3rdParty/Luax/luax_runtime.h
index cb8b66b..1234627 100644
--- a/Source/3rdParty/Luax/luax_runtime.h
+++ b/Source/3rdParty/Luax/luax_runtime.h
@@ -35,7 +35,7 @@ namespace Luax
LuaxRefTable& GetStrongRefTable(lua_State* L);
LuaxRefTable& GetWeaksRefTable(lua_State* L);
- Context& operator[](lua_State* L);
+ LuaxContext& operator[](lua_State* L);
private:
@@ -47,7 +47,7 @@ namespace Luax
///
/// lua_State handlecontextӳ
///
- std::map<lua_State*, Context> mContexts;
+ std::map<lua_State*, LuaxContext> mContexts;
};
diff --git a/Source/3rdParty/Luax/luax_state.cpp b/Source/3rdParty/Luax/luax_state.cpp
index 5253a2c..1414591 100644
--- a/Source/3rdParty/Luax/luax_state.cpp
+++ b/Source/3rdParty/Luax/luax_state.cpp
@@ -27,23 +27,47 @@ namespace Luax
luaL_openlibs(mState);
}
+ void LuaxState::PushGlobalNamespace()
+ {
+ int top = GetTop();
+
+ lua_newtable(mState); // pseudo namespace table
+ int pnt = GetTop();
+
+ lua_newtable(mState); // metatable
+ int mt = GetTop();
+
+ // __index = _G
+ // __newindex = _G
+ lua_pushvalue(mState, LUA_GLOBALSINDEX);
+ lua_pushvalue(mState, LUA_GLOBALSINDEX);
+ lua_setfield(mState, mt, "__index");
+ lua_setfield(mState, mt, "__newindex");
+
+ lua_setmetatable(mState, pnt);
+
+ // stack:
+ // -1 pseudo global namespace
+ }
+
void LuaxState::PushNamespace(cc8* name)
{
- bool isG = !lua_istable(mState, -1);
- int idx = isG ? LUA_GLOBALSINDEX : -1;
- lua_getfield(mState, idx, name);
+ assert(IsNamespace(-1));
+
+ int top = GetTop();
+
+ lua_getfield(mState, -1, name);
if (lua_isnil(mState, -1))
{
lua_pop(mState, 1);
+
lua_newtable(mState);
- assert(lua_istable(mState, -1));
lua_pushvalue(mState, -1);
- int t = isG ? LUA_GLOBALSINDEX : -3;
- lua_setfield(mState, t, name);
+ lua_setfield(mState, top, name);
}
// stack:
- // -1 namespace
+ // -1 namespace
}
void LuaxState::PopNamespace()
@@ -52,6 +76,11 @@ namespace Luax
lua_pop(mState, 1);
}
+ bool LuaxState::IsNamespace(int idx)
+ {
+ return lua_istable(mState, idx);
+ }
+
void LuaxState::DoString(const std::string& code)
{
luaL_dostring(mState, code.c_str());
@@ -146,11 +175,6 @@ namespace Luax
lua_pop(mState, n);
}
- void LuaxState::Settop(int idx)
- {
- lua_settop(mState, idx);
- }
-
bool LuaxState::IsNil(int idx)
{
return lua_isnil(mState, idx);
@@ -191,6 +215,11 @@ namespace Luax
return (mState != 0);
}
+ void LuaxState::Settop(int idx)
+ {
+ lua_settop(mState, idx);
+ }
+
int LuaxState::GetTop()
{
return lua_gettop(mState);
@@ -244,11 +273,6 @@ namespace Luax
return false;
}
- void LuaxState::RegisterMethods(const luaL_Reg *l)
- {
- luaL_register(mState, 0, l);
- }
-
void LuaxState::GetField(int idx, cc8* name)
{
lua_getfield(mState, idx, name);
@@ -646,4 +670,33 @@ namespace Luax
lua_setfield(L, top, name);
}
+
+ void LuaxState::RegisterMethods(const luaL_Reg *l)
+ {
+ assert(lua_istable(mState, -1));
+ // luaL_registerڶΪգ-1λעluaL_RegЩ
+ luaL_register(mState, 0, l);
+ }
+
+ void LuaxState::RegisterMethod(cc8* fname, lua_CFunction func)
+ {
+ assert(lua_istable(mState, -1));
+ lua_pushcfunction(mState, func);
+ lua_setfield(mState, -1, fname);
+ }
+
+ void LuaxState::RegisterPreloader(cc8* libname, lua_CFunction preloader)
+ {
+ lua_getglobal(mState, "package");
+ lua_getfield(mState, -1, "preload");
+ lua_pushcfunction(mState, preloader);
+ lua_setfield(mState, -2, libname);
+ lua_pop(mState, 2);
+ }
+
+ void LuaxState::RegisterLib(cc8* libname, const luaL_Reg* l)
+ {
+ luaL_register(mState, libname, l);
+ }
+
} \ No newline at end of file
diff --git a/Source/3rdParty/Luax/luax_state.h b/Source/3rdParty/Luax/luax_state.h
index 166ac26..a936ea6 100644
--- a/Source/3rdParty/Luax/luax_state.h
+++ b/Source/3rdParty/Luax/luax_state.h
@@ -9,7 +9,7 @@
namespace Luax
{
- class Context;
+ class LuaxContext;
class LuaxEnum;
class LuaxStrongRef;
class LuaxWeakRef;
@@ -43,11 +43,14 @@ namespace Luax
//------------------------------------------------------------------------------------------------------------
// ƿռƿռһ_Gı
+ void PushGlobalNamespace();
void PushNamespace(cc8* name);
void PopNamespace();
-
+ bool IsNamespace(int idx);
+
//------------------------------------------------------------------------------------------------------------
+ void SetTop(int top);
int GetTop();
bool CheckParams(int idx, cc8* format);
int AbsIndex(int idx);
@@ -55,11 +58,6 @@ namespace Luax
//------------------------------------------------------------------------------------------------------------
- ///
- /// עCעһ{0 0}
- ///
- void RegisterMethods(const luaL_Reg *l);
-
void GetField(int idx, cc8* name);
void GetField(int idx, int key);
std::string GetField(int idx, cc8* key, cc8* value);
@@ -126,6 +124,7 @@ namespace Luax
void DoFile(const std::string& file);
//------------------------------------------------------------------------------------------------------------
+ // ע᷽
///
/// עṤͨ࣬New
@@ -142,9 +141,33 @@ namespace Luax
///
void RegisterEnum(cc8* name, LuaxEnum* enums);
+ ///
+ /// עCעһ{0 0}
+ ///
+ void RegisterMethods(const luaL_Reg *l);
+
+ ///
+ /// עᵥC
+ ///
+ void RegisterMethod(cc8* fname, lua_CFunction func);
+
+ ///
+ /// preloaderӵpackage.preloadrequire"libname"ʱlualoader_preloadlibnameҵpreloaderֱӼء
+ /// ʵҪrequireʱżأҼعһκpackage.loaded¼´βټءͨrequire
+ /// preloader
+ ///
+ void RegisterPreloader(cc8* libname, lua_CFunction preloader);
+
+ ///
+ /// luaL_Reglib table_Gpackage.loadedlibnameָlib table
+ ///
+ void RegisterLib(cc8* libname, const luaL_Reg* l);
+
+ //------------------------------------------------------------------------------------------------------------
+
private:
- friend class Context;
+ friend class LuaxContext;
LuaxState(lua_State* state);
LuaxState(const LuaxState& state);
diff --git a/Source/3rdParty/Luax/luax_state.inl b/Source/3rdParty/Luax/luax_state.inl
index b5ee5aa..bd7ca9a 100644
--- a/Source/3rdParty/Luax/luax_state.inl
+++ b/Source/3rdParty/Luax/luax_state.inl
@@ -1,10 +1,10 @@
namespace Luax
{
- // ͨ͵вͬע̣ͨLuaxStateRegister_ʵ
-
- // עṤΪעinterface tableclass tabletype nameΪƿռϡע׶βԪȵNewõʱŻᡣ
-
+ ///
+ /// עṤΪעinterface tableclass tabletype nameΪƿռϡע׶βԪȵNew
+ /// õʱŻᡣ
+ ///
template<typename T>
void LuaxState::RegisterFactory()
{
@@ -12,56 +12,51 @@ namespace Luax
LuaxState& state = *this;
int top = lua_gettop(L); // namespace table
-
assert(lua_istable(L, top));
- const char* type = T::GetLuaxFactoryName();
-
- // interface table
+ // 1) interface table
lua_newtable(L);
+ LuaxClass<T>::RegisterLuaxInterface(state);
+ T::RegisterLuaxInterface(state);
// interface table[__index] = interface table
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index");
- LuaxClass<T>::RegisterLuaxInterface(state);
- T::RegisterLuaxInterface(state);
-
- LuaxClass<T>::SetInterfaceTableRef(state, -1);
+ LuaxClass<T>::SetLuaxInterfaceTableRef(state, -1);
lua_settop(L, top);
- // class table
+ // 2) class table
lua_newtable(L);
-
LuaxClass<T>::RegisterLuaxClass(state);
LuaxClass<T>::RegisterLuaxFactoryClass(state);
T::RegisterLuaxClass(state);
// TǷûעķ
-#define _assertmethod(I, NAME) \
- GetField(I, NAME); \
- assert(IsType(-1, LUA_TFUNCTION)); \
- Pop();
+ #define _assertmethod(I, NAME) \
+ GetField(I, NAME); \
+ assert(IsType(-1, LUA_TFUNCTION)); \
+ Pop();
- // NewûУûеĻʾһ
- //_assertmethod(-1, "New");
+ _assertmethod(-1, "New");
-#undef _assertmethod
+ #undef _assertmethod
// .Extend()
lua_pushvalue(state, -1); // class table
- LuaxClass<T>::PushInterfaceTable(state); // interface table
+ LuaxClass<T>::PushLuaxInterfaceTable(state); // interface table
lua_pushcclosure(state, LuaxClass<T>::l_ExtendFactory, 2);
lua_setfield(state, -2, "Extend");
// .GetInterfaceTable()
- LuaxClass<T>::PushInterfaceTable(state); // interface table
+ LuaxClass<T>::PushLuaxInterfaceTable(state); // interface table
lua_pushcclosure(state, LuaxClass<T>::l_GetInterfaceTable, 1);
lua_setfield(state, -2, "GetInterfaceTable");
- LuaxClass<T>::SetClassTableRef(state, -1);
+ LuaxClass<T>::SetLuaxClassTableRef(state, -1);
+ const char* type = T::GetLuaxFactoryName();
SetField(top, type);
// reset top
@@ -71,7 +66,9 @@ namespace Luax
T::RegisterLuaxPostprocess(state);
}
- // עᵥ
+ ///
+ /// Singletonֻһclass tableûinterface table
+ ///
template<typename T>
void LuaxState::RegisterSingleton()
{
@@ -85,11 +82,18 @@ namespace Luax
// class table.
lua_newtable(L);
-
LuaxClass<T>::RegisterLuaxClass(state);
LuaxClass<T>::RegisterLuaxFactoryClass(state);
T::RegisterLuaxClass(state);
+ LuaxClass<T>::SetLuaxClassTableRef(state, -1);
+
+ // class table__index__newindexָ
+ lua_pushvalue(state, -1);
+ lua_setfield(state, -2, "__index");
+ lua_pushvalue(state, -1);
+ lua_setfield(state, -2, "__newindex");
+
SetField(top, type);
// reset top
diff --git a/Source/Asura.Editor/source/events/events.h b/Source/Asura.Editor/source/events/events.h
new file mode 100644
index 0000000..bbe5cc3
--- /dev/null
+++ b/Source/Asura.Editor/source/events/events.h
@@ -0,0 +1,24 @@
+#ifndef __ASUSRA_EDITOR_EVENT_H__
+#define __ASUSRA_EDITOR_EVENT_H__
+
+namespace AsuraEditor
+{
+ namespace Events
+ {
+
+ enum EventType
+ {
+ GRAPHIC_EVENT,
+ KEYBOARD_EVENT,
+ MOUSE_EVENT
+ };
+
+ enum GraphicEvent
+ {
+ EVENT_PAINT,
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/Source/Asura.Engine/Graphics/Image.h b/Source/Asura.Engine/Graphics/Image.h
index 66c7ae1..2607969 100644
--- a/Source/Asura.Engine/Graphics/Image.h
+++ b/Source/Asura.Engine/Graphics/Image.h
@@ -1,14 +1,14 @@
#ifndef __ASURA_ENGINE_IMAGE_H__
#define __ASURA_ENGINE_IMAGE_H__
-#include "Math/Vector2.hpp"
-#include "Scripting/Portable.h"
-#include "FileSystem/Reloadable.h"
-#include "StringMap.hpp"
-#include "Manager.hpp"
-#include "Texture.h"
-#include "Color.h"
-#include "ImageData.h"
+#include "math/vector2.hpp"
+#include "scripting/portable.h"
+#include "fileSystem/reloadable.h"
+#include "stringmap.hpp"
+#include "manager.hpp"
+#include "texture.h"
+#include "color.h"
+#include "image_data.h"
namespace AsuraEngine
{
@@ -23,7 +23,7 @@ namespace AsuraEngine
///
class Image ASURA_FINAL
: public Drawable
- , public Scripting::Portable
+ , public Scripting::Portable<Image>
, public Filesystem::Reloadable
{
public:
@@ -59,8 +59,6 @@ namespace AsuraEngine
public:
- //----------------------------------------------------------------------------------------------------------
-
LUAX_DECL_FACTORY(SimImage);
LUAX_DECL_METHOD(l_Load);
@@ -68,8 +66,6 @@ namespace AsuraEngine
LUAX_DECL_METHOD(l_GetHeight);
LUAX_DECL_METHOD(l_GetSize);
- //----------------------------------------------------------------------------------------------------------
-
};
}
diff --git a/Source/Asura.Engine/Graphics/Shader.h b/Source/Asura.Engine/Graphics/Shader.h
index 7c00dda..4976106 100644
--- a/Source/Asura.Engine/Graphics/Shader.h
+++ b/Source/Asura.Engine/Graphics/Shader.h
@@ -94,6 +94,8 @@ namespace AsuraEngine
///
GLuint mProgramHandle;
+ //------------------------------------------------------------------------------------------------------------
+
public:
LUAX_DECL_FACTORY(SimShader);
@@ -111,6 +113,10 @@ namespace AsuraEngine
LUAX_DECL_METHOD(l_SetUniformVector4);
LUAX_DECL_METHOD(l_SetUniformColor);
+ private:
+
+ Luax::LuaxMemberRef mCodeLuaRef;
+
};
}
diff --git a/Source/Asura.Engine/graphics/binding/canvas.cpp b/Source/Asura.Engine/graphics/binding/canvas.binding.cpp
index e69de29..e69de29 100644
--- a/Source/Asura.Engine/graphics/binding/canvas.cpp
+++ b/Source/Asura.Engine/graphics/binding/canvas.binding.cpp
diff --git a/Source/Asura.Engine/graphics/binding/color.cpp b/Source/Asura.Engine/graphics/binding/color.binding.cpp
index e69de29..e69de29 100644
--- a/Source/Asura.Engine/graphics/binding/color.cpp
+++ b/Source/Asura.Engine/graphics/binding/color.binding.cpp
diff --git a/Source/Asura.Engine/graphics/binding/image.cpp b/Source/Asura.Engine/graphics/binding/image.binding.cpp
index e69de29..e69de29 100644
--- a/Source/Asura.Engine/graphics/binding/image.cpp
+++ b/Source/Asura.Engine/graphics/binding/image.binding.cpp
diff --git a/Source/Asura.Engine/graphics/binding/image_data.binding.cpp b/Source/Asura.Engine/graphics/binding/image_data.binding.cpp
new file mode 100644
index 0000000..d576718
--- /dev/null
+++ b/Source/Asura.Engine/graphics/binding/image_data.binding.cpp
@@ -0,0 +1,35 @@
+#include "../image.h"
+
+using namespace Luax;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ void Image::RegisterLuaxInterface(LuaxState& state)
+ {
+
+ }
+
+ void Image::RegisterLuaxClass(LuaxState& state)
+ {
+
+ }
+
+ void Image::RegisterLuaxPostprocess(LuaxState& state)
+ {
+ // blendö٣AsuraEngine.EBlendMode
+ LuaxEnum EBlendMode[] = {
+ { "Additive", 1 },
+ { "PreBlend", 2 },
+ { "Substruction", 3 },
+ { "Multiplied", 4 },
+ {0, 0}
+ };
+
+ state.RegisterEnum("EBlendMode", EBlendMode);
+ }
+
+ }
+} \ No newline at end of file
diff --git a/Source/Asura.Engine/graphics/binding/image_data.cpp b/Source/Asura.Engine/graphics/binding/mesh2d.binding.cpp
index e69de29..e69de29 100644
--- a/Source/Asura.Engine/graphics/binding/image_data.cpp
+++ b/Source/Asura.Engine/graphics/binding/mesh2d.binding.cpp
diff --git a/Source/Asura.Engine/graphics/binding/mesh2d.cpp b/Source/Asura.Engine/graphics/binding/mesh2d_data.binding.cpp
index e69de29..e69de29 100644
--- a/Source/Asura.Engine/graphics/binding/mesh2d.cpp
+++ b/Source/Asura.Engine/graphics/binding/mesh2d_data.binding.cpp
diff --git a/Source/Asura.Engine/graphics/binding/shader.cpp b/Source/Asura.Engine/graphics/binding/shader.binding.cpp
index 27ed856..3f24bb7 100644
--- a/Source/Asura.Engine/graphics/binding/shader.cpp
+++ b/Source/Asura.Engine/graphics/binding/shader.binding.cpp
@@ -94,11 +94,6 @@ namespace AsuraEngine
}
- void Shader::RegisterLuaxClass(LuaxState& state)
- {
-
- }
-
void Shader::RegisterLuaxInterface(LuaxState& state)
{
@@ -115,5 +110,10 @@ namespace AsuraEngine
}
+ void Shader::RegisterLuaxPostprocess(LuaxState& state)
+ {
+
+ }
+
}
} \ No newline at end of file
diff --git a/Source/Asura.Engine/graphics/binding/mesh2d_data.cpp b/Source/Asura.Engine/graphics/binding/sprite_batch.binding.cpp
index e69de29..e69de29 100644
--- a/Source/Asura.Engine/graphics/binding/mesh2d_data.cpp
+++ b/Source/Asura.Engine/graphics/binding/sprite_batch.binding.cpp
diff --git a/Source/Asura.Engine/graphics/binding/sprite_batch.cpp b/Source/Asura.Engine/graphics/binding/sprite_batch.cpp
deleted file mode 100644
index e69de29..0000000
--- a/Source/Asura.Engine/graphics/binding/sprite_batch.cpp
+++ /dev/null
diff --git a/Source/Asura.Engine/graphics/binding/window.cpp b/Source/Asura.Engine/graphics/binding/window.binding.cpp
index 3befc8c..3befc8c 100644
--- a/Source/Asura.Engine/graphics/binding/window.cpp
+++ b/Source/Asura.Engine/graphics/binding/window.binding.cpp
diff --git a/Source/Asura.Engine/graphics/image.h b/Source/Asura.Engine/graphics/image.h
index 66c7ae1..2607969 100644
--- a/Source/Asura.Engine/graphics/image.h
+++ b/Source/Asura.Engine/graphics/image.h
@@ -1,14 +1,14 @@
#ifndef __ASURA_ENGINE_IMAGE_H__
#define __ASURA_ENGINE_IMAGE_H__
-#include "Math/Vector2.hpp"
-#include "Scripting/Portable.h"
-#include "FileSystem/Reloadable.h"
-#include "StringMap.hpp"
-#include "Manager.hpp"
-#include "Texture.h"
-#include "Color.h"
-#include "ImageData.h"
+#include "math/vector2.hpp"
+#include "scripting/portable.h"
+#include "fileSystem/reloadable.h"
+#include "stringmap.hpp"
+#include "manager.hpp"
+#include "texture.h"
+#include "color.h"
+#include "image_data.h"
namespace AsuraEngine
{
@@ -23,7 +23,7 @@ namespace AsuraEngine
///
class Image ASURA_FINAL
: public Drawable
- , public Scripting::Portable
+ , public Scripting::Portable<Image>
, public Filesystem::Reloadable
{
public:
@@ -59,8 +59,6 @@ namespace AsuraEngine
public:
- //----------------------------------------------------------------------------------------------------------
-
LUAX_DECL_FACTORY(SimImage);
LUAX_DECL_METHOD(l_Load);
@@ -68,8 +66,6 @@ namespace AsuraEngine
LUAX_DECL_METHOD(l_GetHeight);
LUAX_DECL_METHOD(l_GetSize);
- //----------------------------------------------------------------------------------------------------------
-
};
}
diff --git a/Source/Asura.Engine/graphics/shader.h b/Source/Asura.Engine/graphics/shader.h
index 7c00dda..4976106 100644
--- a/Source/Asura.Engine/graphics/shader.h
+++ b/Source/Asura.Engine/graphics/shader.h
@@ -94,6 +94,8 @@ namespace AsuraEngine
///
GLuint mProgramHandle;
+ //------------------------------------------------------------------------------------------------------------
+
public:
LUAX_DECL_FACTORY(SimShader);
@@ -111,6 +113,10 @@ namespace AsuraEngine
LUAX_DECL_METHOD(l_SetUniformVector4);
LUAX_DECL_METHOD(l_SetUniformColor);
+ private:
+
+ Luax::LuaxMemberRef mCodeLuaRef;
+
};
}
diff --git a/Source/Samples/LuaxTest/main.cpp b/Source/Samples/LuaxTest/main.cpp
index 3d5eb34..63daa1c 100644
--- a/Source/Samples/LuaxTest/main.cpp
+++ b/Source/Samples/LuaxTest/main.cpp
@@ -93,7 +93,7 @@ int Boy::l_New(lua_State* L)
const char* name = state.GetValue(2, "");
Boy* boy = new Boy(age, name);
- boy->PushLuaUserdata(state);
+ boy->PushLuaxUserdata(state);
return 1;
}
@@ -179,64 +179,8 @@ class Girl : public LuaxClass<Girl>
};
//----------------------------------------------------------------------------------------------------------------
-string script = R"(
-function main()
- local a = 19
- print(Asura.version)
- print(Asura.author.name)
- print("ok")
- print(Asura.author.func())
--- local boy = Asura.SimBoy.New("I am peter!", 19)
--- boy:Say()
--- print(Asura.SimSchool.GetName())
- print(Asura.SimBoy.Class)
- print(Asura.SimBoy.Gender)
- print(Asura.SimBoy.GetClassName())
- print(Asura.School.GetName())
- print(Asura.School.Region)
---[[
- local Kid = Asura.SimBoy.Extend()
- Asura.Kid = Kid
- Kid.New = function(self, height, age)
- self.base(age)
- self.height = height
- end
- Kid.GetHeight = function(self)
- print(self.height)
- end
- local kid = Kid.New(110, 12)
- kid:GetHeight()
- ]]
- local kid = Asura.SimBoy.New(23, "Chai")
- print(kid:GetAge())
- print(kid:GetName())
- kid.fruit = function()
- return "apple"
- end
- print(kid.fruit())
- print(Asura.SimBoy.GetGender())
- Asura.SimBoy.Havefun = function()
- return "Boys have some fun!"
- end
- print(Asura.SimBoy.Havefun())
-
--- ޸෽
- Asura.SimBoy.Foo = function()
- return "SimBoy.Foo"
- end
- print(Asura.SimBoy.Foo())
-
- print(Asura.EGender.BOY)
- Asura.EGender.BOY = 2
- print(Asura.EGender.BOY)
- print(Asura.SimBoy.EHabits.Girls)
- print(Asura.EHabits.Girls)
-end
-function err(msg)
- print(msg)
-end
-xpcall(main, err)
-)";
+
+#include "script.lua"
//----------------------------------------------------------------------------------------------------------------
@@ -254,6 +198,7 @@ int main()
Luax::LuaxState& state = runtime[L].state;
state.OpenLibs();
+ state.PushGlobalNamespace();
state.PushNamespace("Asura");
//עenum
@@ -277,6 +222,7 @@ int main()
state.RegisterFactory<Boy>();
state.PopNamespace(); // Asura
+ state.PopNamespace(); // Global
state.DoString(script);
runtime.Close(L);
diff --git a/Source/Samples/LuaxTest/script.lua b/Source/Samples/LuaxTest/script.lua
new file mode 100644
index 0000000..84bcba9
--- /dev/null
+++ b/Source/Samples/LuaxTest/script.lua
@@ -0,0 +1,63 @@
+string script = R"scriptcode(
+-- start script
+
+function main()
+ local a = 19
+ print(Asura.version)
+ print(Asura.author.name)
+ print("ok")
+ print(Asura.author.func())
+-- local boy = Asura.SimBoy.New("I am peter!", 19)
+-- boy:Say()
+-- print(Asura.SimSchool.GetName())
+ print(Asura.SimBoy.Class)
+ print(Asura.SimBoy.Gender)
+ print(Asura.SimBoy.GetClassName())
+ print(Asura.School.GetName())
+ print(Asura.School.Region)
+--[[
+ local Kid = Asura.SimBoy.Extend()
+ Asura.Kid = Kid
+ Kid.New = function(self, height, age)
+ self.base(age)
+ self.height = height
+ end
+ Kid.GetHeight = function(self)
+ print(self.height)
+ end
+ local kid = Kid.New(110, 12)
+ kid:GetHeight()
+ ]]
+ local kid = Asura.SimBoy.New(23, "Chai")
+ print(kid:GetAge())
+ print(kid:GetName())
+ kid.fruit = function()
+ return "apple"
+ end
+ print(kid.fruit())
+ print(Asura.SimBoy.GetGender())
+ Asura.SimBoy.Havefun = function()
+ return "Boys have some fun!"
+ end
+ print(Asura.SimBoy.Havefun())
+
+-- ޸෽
+ Asura.SimBoy.Foo = function()
+ return "SimBoy.Foo"
+ end
+ print(Asura.SimBoy.Foo())
+
+ print(Asura.EGender.BOY)
+ --Asura.EGender.BOY = 2
+ print(Asura.EGender.BOY)
+ print(Asura.SimBoy.EHabits.Girls)
+ print(Asura.EHabits.Girls)
+end
+function err(msg)
+ print(msg)
+end
+xpcall(main, err)
+
+
+-- end script
+)scriptcode"; \ No newline at end of file