| @@ -30,13 +30,8 @@ public: | |||||
| UNUSED(arg_nb); | UNUSED(arg_nb); | ||||
| return new DemoObject(); | return new DemoObject(); | ||||
| } | } | ||||
| static const char* GetClassName() { static const char name[] = "LoluaDemo"; return name; } | |||||
| static const char* GetClassLibName() { static const char name[] = "LoluaDemoLib"; return name; } | |||||
| static const char* GetClassInstName() { static const char name[] = "LoluaDemoInst"; return name; } | |||||
| static const Lolua::ClassMethod* GetStaticMethods(); | |||||
| static const Lolua::ClassMethod* GetInstanceMethods(); | |||||
| //------------------------------------------------------------------------- | |||||
| static int AddFive(Lolua::State* l) | static int AddFive(Lolua::State* l) | ||||
| { | { | ||||
| Lolua::Var<int> i(l, 1); | Lolua::Var<int> i(l, 1); | ||||
| @@ -54,13 +49,35 @@ public: | |||||
| { | { | ||||
| return (f + 10); | return (f + 10); | ||||
| } | } | ||||
| }; | |||||
| //----------------------------------------------------------------------------- | |||||
| static const Lolua::ClassMethod loluademo_statics[] = { { "AddFive", &DemoObject::AddFive }, { NULL, NULL } }; | |||||
| static const Lolua::ClassMethod loluademo_methods[] = { { "AddTenInstance", &DemoObject::AddTenInstance }, { NULL, NULL } }; | |||||
| const Lolua::ClassMethod* DemoObject::GetStaticMethods() { return loluademo_statics; } | |||||
| const Lolua::ClassMethod* DemoObject::GetInstanceMethods() { return loluademo_methods; } | |||||
| static int GetX(Lolua::State* l) | |||||
| { | |||||
| Lolua::VarPtr<DemoObject> obj(l, 1); | |||||
| Lolua::Var<int32_t> i; | |||||
| i = obj.V()->m_x; | |||||
| return i.Return(l); | |||||
| } | |||||
| static int SetX(Lolua::State* l) | |||||
| { | |||||
| Lolua::VarPtr<DemoObject> obj(l, 1); | |||||
| Lolua::Var<int32_t> i(l, 2); | |||||
| obj.V()->m_x = i.V(); | |||||
| return 0; | |||||
| } | |||||
| //------------------------------------------------------------------------- | |||||
| static const Lolua::ObjectLib* GetLib() | |||||
| { | |||||
| static const Lolua::ObjectLib lib = Lolua::ObjectLib( | |||||
| "LoluaDemo", | |||||
| { { "AddFive", &DemoObject::AddFive } }, | |||||
| { { "AddTenInstance", &DemoObject::AddTenInstance } }, | |||||
| { { "X", &DemoObject::GetX, &DemoObject::SetX } }); | |||||
| return &lib; | |||||
| } | |||||
| int m_x = 0; | |||||
| }; | |||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| static int GlobalAddString(Lolua::State* l) | static int GlobalAddString(Lolua::State* l) | ||||
| @@ -88,6 +105,29 @@ public: | |||||
| { | { | ||||
| } | } | ||||
| void TestStuff() | |||||
| { | |||||
| Lolua::State* l = GetLuaState(); | |||||
| /* | |||||
| //create property | |||||
| lua_pushnumber(l, 5.0); | |||||
| lua_setfield(l, -2, "x"); | |||||
| lua_getglobal(l, "vector"); | |||||
| int table = lua_istable(l, -1); | |||||
| lua_getfield(l, -1, "x"); | |||||
| Lolua::Var<float> var(l, -1); | |||||
| lua_pop(l, 2); | |||||
| vec3 t; | |||||
| */ | |||||
| //table = lua_isuserdata(l, -1); | |||||
| //Var<T> var(m_lua_state, -1); | |||||
| //lua_pop(m_lua_state, 1); | |||||
| //lua_getfield (lua_State *L, int index, const char *k); | |||||
| //return var.V(); | |||||
| } | |||||
| }; | }; | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| @@ -106,6 +146,7 @@ public: | |||||
| //Execute script | //Execute script | ||||
| demo_loader->ExecLua("14_lol_lua.lua"); | demo_loader->ExecLua("14_lol_lua.lua"); | ||||
| demo_loader->TestStuff(); | |||||
| //Grab global test values | //Grab global test values | ||||
| float testvalue_num = demo_loader->GetVar<float>("testvalue_num"); | float testvalue_num = demo_loader->GetVar<float>("testvalue_num"); | ||||
| @@ -118,17 +159,16 @@ public: | |||||
| //Grab global values modified with DemoObject | //Grab global values modified with DemoObject | ||||
| int32_t loluademo_return = demo_loader->GetVar<int32_t>("loluademo_return"); | int32_t loluademo_return = demo_loader->GetVar<int32_t>("loluademo_return"); | ||||
| int32_t loluademo_getx = demo_loader->GetVar<int32_t>("loluademo_getx"); | |||||
| float loluademo_inst_return = demo_loader->GetVar<float>("loluademo_inst_return"); | float loluademo_inst_return = demo_loader->GetVar<float>("loluademo_inst_return"); | ||||
| DemoObject* loluademo_inst = demo_loader->GetPtr<DemoObject>("loluademo_inst"); | DemoObject* loluademo_inst = demo_loader->GetPtr<DemoObject>("loluademo_inst"); | ||||
| String loluademo_inst_name = loluademo_inst->GetClassName(); | |||||
| Log::Info("Lua Vars: \ | Log::Info("Lua Vars: \ | ||||
| testvalue_num: %.2f, testvalue_int: %i, testvalue_uint: %i, testvalue_str: %s.\n", | testvalue_num: %.2f, testvalue_int: %i, testvalue_uint: %i, testvalue_str: %s.\n", | ||||
| testvalue_num, testvalue_int, testvalue_uint, testvalue_str.C()); | testvalue_num, testvalue_int, testvalue_uint, testvalue_str.C()); | ||||
| Log::Info("Lua Vars: \ | Log::Info("Lua Vars: \ | ||||
| function_return: %s, loluademo_return: %i, loluademo_inst_return: %.f, loluademo_inst_name: %s.\n", | |||||
| function_return.C(), loluademo_return, loluademo_inst_return, loluademo_inst_name.C()); | |||||
| function_return: %s, loluademo_return: %i, loluademo_inst_return: %.f, loluademo_getx: %i, loluademo_inst->m_x: %i.\n", | |||||
| function_return.C(), loluademo_return, loluademo_inst_return, loluademo_getx, loluademo_inst->m_x); | |||||
| delete demo_loader; | delete demo_loader; | ||||
| @@ -11,4 +11,6 @@ function_return = GlobalAddString("test"); | |||||
| loluademo_return = LoluaDemo.AddFive(1); | loluademo_return = LoluaDemo.AddFive(1); | ||||
| loluademo_inst = LoluaDemo.New(); | loluademo_inst = LoluaDemo.New(); | ||||
| loluademo_inst:SetX(10); | |||||
| loluademo_getx = loluademo_inst:GetX(); | |||||
| loluademo_inst_return = loluademo_inst:AddTenInstance(2.0); | loluademo_inst_return = loluademo_inst:AddTenInstance(2.0); | ||||
| @@ -75,6 +75,7 @@ liblolcore_sources = \ | |||||
| easymesh/easymeshinternal.cpp easymesh/easymeshcsg.cpp \ | easymesh/easymeshinternal.cpp easymesh/easymeshcsg.cpp \ | ||||
| easymesh/easymeshprimitive.cpp easymesh/easymeshtransform.cpp \ | easymesh/easymeshprimitive.cpp easymesh/easymeshtransform.cpp \ | ||||
| easymesh/easymeshcursor.cpp easymesh/easymesh.h \ | easymesh/easymeshcursor.cpp easymesh/easymesh.h \ | ||||
| easymesh/easymeshlua.cpp easymesh/easymeshlua.h \ | |||||
| easymesh/csgbsp.cpp easymesh/csgbsp.h \ | easymesh/csgbsp.cpp easymesh/csgbsp.h \ | ||||
| easymesh/shiny.lolfx easymesh/shinyflat.lolfx \ | easymesh/shiny.lolfx easymesh/shinyflat.lolfx \ | ||||
| easymesh/shinydebugwireframe.lolfx \ | easymesh/shinydebugwireframe.lolfx \ | ||||
| @@ -25,8 +25,75 @@ namespace Lolua | |||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| typedef luaL_Reg ClassMethod; | typedef luaL_Reg ClassMethod; | ||||
| typedef struct ClassVar | |||||
| { | |||||
| const char *name; | |||||
| lua_CFunction get; | |||||
| lua_CFunction set; | |||||
| } ClassVar; | |||||
| typedef lua_State State; | typedef lua_State State; | ||||
| //----------------------------------------------------------------------------- | |||||
| struct ObjectLib | |||||
| { | |||||
| typedef struct ClassVarStr | |||||
| { | |||||
| ClassVarStr() { } | |||||
| ClassVarStr(String var_name, lua_CFunction get, lua_CFunction set) | |||||
| { | |||||
| m_get_name = String("Get") + var_name; | |||||
| m_set_name = String("Set") + var_name; | |||||
| m_get = get; | |||||
| m_set = set; | |||||
| } | |||||
| String m_get_name = ""; | |||||
| String m_set_name = ""; | |||||
| lua_CFunction m_get = nullptr; | |||||
| lua_CFunction m_set = nullptr; | |||||
| } ClassVarStr; | |||||
| ObjectLib(String class_name, | |||||
| array<ClassMethod> statics, | |||||
| array<ClassMethod> methods, | |||||
| array<ClassVar> variables) | |||||
| { | |||||
| m_class_name = class_name; | |||||
| m_static_name = class_name + "_lib"; | |||||
| m_method_name = class_name + "_inst"; | |||||
| m_statics = statics; | |||||
| if (m_statics.Count() == 0 | |||||
| || m_statics.Last().name != nullptr | |||||
| || m_statics.Last().func != nullptr) | |||||
| m_statics.Push({ nullptr, nullptr }); | |||||
| m_methods = methods; | |||||
| if (m_methods.Count() == 0 | |||||
| || m_methods.Last().name != nullptr | |||||
| || m_methods.Last().func != nullptr) | |||||
| m_methods.Push({ nullptr, nullptr }); | |||||
| for (ClassVar& cv : variables) | |||||
| { | |||||
| if (cv.name && cv.get && cv.set) | |||||
| { | |||||
| m_variables.Push({ cv.name, cv.get, cv.set }); | |||||
| } | |||||
| } | |||||
| if (m_variables.Count() == 0 | |||||
| || variables.Last().name != nullptr | |||||
| || variables.Last().get != nullptr | |||||
| || variables.Last().set != nullptr) | |||||
| m_variables.Push(ClassVarStr()); | |||||
| } | |||||
| String m_class_name = ""; | |||||
| String m_static_name = ""; | |||||
| String m_method_name = ""; | |||||
| array<ClassMethod> m_statics; | |||||
| array<ClassMethod> m_methods; | |||||
| array<ClassVarStr> m_variables; | |||||
| }; | |||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| class ObjectDef | class ObjectDef | ||||
| { | { | ||||
| @@ -40,11 +107,7 @@ public: | |||||
| ASSERT(false); | ASSERT(false); | ||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| static const char* GetClassName() { ASSERT(false); return nullptr; } | |||||
| static const char* GetClassLibName() { ASSERT(false); return nullptr;; } | |||||
| static const char* GetClassInstName() { ASSERT(false); return nullptr; } | |||||
| static const ClassMethod* GetStaticMethods() { ASSERT(false); return nullptr; } | |||||
| static const ClassMethod* GetInstanceMethods() { ASSERT(false); return nullptr; } | |||||
| static const ObjectLib* GetLib() { ASSERT(false); return nullptr; } | |||||
| }; | }; | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| @@ -64,7 +127,7 @@ public: | |||||
| //Default statics | //Default statics | ||||
| static const luaL_Reg default_statics[] | static const luaL_Reg default_statics[] | ||||
| { | { | ||||
| { "New", New<TLuaClass> }, | |||||
| { "New", New<TLuaClass> }, | |||||
| { "__gc", Del<TLuaClass> }, | { "__gc", Del<TLuaClass> }, | ||||
| { NULL, NULL } | { NULL, NULL } | ||||
| }; | }; | ||||
| @@ -82,26 +145,66 @@ public: | |||||
| //__le : Less than or equal to(<= ) | //__le : Less than or equal to(<= ) | ||||
| //Create Static metatable | //Create Static metatable | ||||
| luaL_newmetatable(l, TLuaClass::GetClassLibName()); | |||||
| luaL_newmetatable(l, GetStaticName<TLuaClass>()); | |||||
| //Register default statics and template one | //Register default statics and template one | ||||
| luaL_setfuncs(l, default_statics, 0); | luaL_setfuncs(l, default_statics, 0); | ||||
| luaL_setfuncs(l, TLuaClass::GetStaticMethods(), 0); | |||||
| //Push funcs on metatable | |||||
| luaL_setfuncs(l, GetStaticMethods<TLuaClass>(), 0); | |||||
| //Push metatable on stack | |||||
| lua_pushvalue(l, -1); | lua_pushvalue(l, -1); | ||||
| //Set the "__index" field of the metatable to point to itself, pops the stack | //Set the "__index" field of the metatable to point to itself, pops the stack | ||||
| lua_setfield(l, -1, "__index"); | lua_setfield(l, -1, "__index"); | ||||
| //Set it global to validate the operation | //Set it global to validate the operation | ||||
| lua_setglobal(l, TLuaClass::GetClassName()); | |||||
| lua_setglobal(l, GetObjectName<TLuaClass>()); | |||||
| //Repeat all the operations for instance metatable | //Repeat all the operations for instance metatable | ||||
| luaL_newmetatable(l, TLuaClass::GetClassInstName()); | |||||
| luaL_setfuncs(l, TLuaClass::GetInstanceMethods(), 0); | |||||
| luaL_newmetatable(l, GetMethodName<TLuaClass>()); | |||||
| luaL_setfuncs(l, GetInstanceMethods<TLuaClass>(), 0); | |||||
| lua_pushvalue(l, -1); | lua_pushvalue(l, -1); | ||||
| lua_setfield(l, -1, "__index"); | lua_setfield(l, -1, "__index"); | ||||
| //Create variables Get/Set | |||||
| const array<ObjectLib::ClassVarStr>& variables = GetVariables<TLuaClass>(); | |||||
| for (const ObjectLib::ClassVarStr& var : variables) | |||||
| { | |||||
| if (!var.m_get || !var.m_set) | |||||
| continue; | |||||
| //Add getter | |||||
| lua_pushcfunction(l, var.m_get); | |||||
| lua_setfield(l, -2, var.m_get_name.C()); | |||||
| //Add setter | |||||
| lua_pushcfunction(l, var.m_set); | |||||
| lua_setfield(l, -2, var.m_set_name.C()); | |||||
| } | |||||
| //Don't set it to global, but pop the stack to hide the metatable | //Don't set it to global, but pop the stack to hide the metatable | ||||
| lua_pop(l, 1); | lua_pop(l, 1); | ||||
| } | } | ||||
| private: | |||||
| template <typename TLuaClass> | |||||
| static const ObjectLib* GetLib() | |||||
| { | |||||
| const ObjectLib* lib = TLuaClass::GetLib(); | |||||
| ASSERT(lib); | |||||
| return lib; | |||||
| } | |||||
| public: | |||||
| template <typename TLuaClass> | |||||
| static const char* GetObjectName() { return GetLib<TLuaClass>()->m_class_name.C(); } | |||||
| template <typename TLuaClass> | |||||
| static const char* GetStaticName() { return GetLib<TLuaClass>()->m_static_name.C(); } | |||||
| template <typename TLuaClass> | |||||
| static const char* GetMethodName() { return GetLib<TLuaClass>()->m_method_name.C(); } | |||||
| template <typename TLuaClass> | |||||
| static const ClassMethod* GetStaticMethods() { return GetLib<TLuaClass>()->m_statics.Data(); } | |||||
| template <typename TLuaClass> | |||||
| static const ClassMethod* GetInstanceMethods() { return GetLib<TLuaClass>()->m_methods.Data(); } | |||||
| template <typename TLuaClass> | |||||
| static const array<ObjectLib::ClassVarStr>& GetVariables() { return GetLib<TLuaClass>()->m_variables; } | |||||
| protected: | protected: | ||||
| //------------------------------------------------------------------------- | //------------------------------------------------------------------------- | ||||
| template <typename TLuaClass> | template <typename TLuaClass> | ||||
| @@ -115,7 +218,7 @@ protected: | |||||
| *data = TLuaClass::New(l, n_args); | *data = TLuaClass::New(l, n_args); | ||||
| //Retrieve instance table | //Retrieve instance table | ||||
| luaL_getmetatable(l, TLuaClass::GetClassInstName()); | |||||
| luaL_getmetatable(l, GetMethodName<TLuaClass>()); | |||||
| //Set metatable to instance | //Set metatable to instance | ||||
| lua_setmetatable(l, -2); | lua_setmetatable(l, -2); | ||||
| //Return 1 so Lua will get the UserData and clean the stack. | //Return 1 so Lua will get the UserData and clean the stack. | ||||
| @@ -134,10 +237,9 @@ protected: | |||||
| }; | }; | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| // | |||||
| //-- | |||||
| struct Function | |||||
| class Function | |||||
| { | { | ||||
| public: | |||||
| Function(State* l, const char* name, int(*function)(State*)) | Function(State* l, const char* name, int(*function)(State*)) | ||||
| { | { | ||||
| lua_pushcfunction(l, function); | lua_pushcfunction(l, function); | ||||
| @@ -147,7 +249,7 @@ struct Function | |||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| template<typename T> | template<typename T> | ||||
| struct VarPtr | |||||
| class VarPtr | |||||
| { | { | ||||
| protected: | protected: | ||||
| T* m_value = nullptr; | T* m_value = nullptr; | ||||
| @@ -155,15 +257,15 @@ protected: | |||||
| public: | public: | ||||
| VarPtr() { } | VarPtr() { } | ||||
| VarPtr(T* value) { m_value = value; } | VarPtr(T* value) { m_value = value; } | ||||
| VarPtr(State* l, int index) { InnerGet(l, index); } | |||||
| VarPtr(State* l, int index) { InnerGet(l, index); } | |||||
| inline T* V() { return m_value; } | inline T* V() { return m_value; } | ||||
| inline T* operator=(T* value) { m_value = value; } | inline T* operator=(T* value) { m_value = value; } | ||||
| inline int Return(State* l) { InnerPush(l); return 1; } | |||||
| inline int Return(State* l) { InnerPush(l); return 1; } | |||||
| protected: | protected: | ||||
| virtual void InnerGet(State* l, int index) | virtual void InnerGet(State* l, int index) | ||||
| { | { | ||||
| T** obj = static_cast<T**>(luaL_checkudata(l, index, T::GetClassInstName())); | |||||
| T** obj = static_cast<T**>(luaL_checkudata(l, index, Object::GetMethodName<T>())); | |||||
| m_value = obj ? *obj : nullptr; | m_value = obj ? *obj : nullptr; | ||||
| } | } | ||||
| void InnerPush(State* l) | void InnerPush(State* l) | ||||
| @@ -174,7 +276,7 @@ protected: | |||||
| }; | }; | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| template<typename T> | template<typename T> | ||||
| struct VarPtrLight | |||||
| class VarPtrLight | |||||
| { | { | ||||
| public: | public: | ||||
| VarPtrLight() : VarPtr() { } | VarPtrLight() : VarPtr() { } | ||||
| @@ -183,14 +285,14 @@ public: | |||||
| protected: | protected: | ||||
| virtual void InnerGet(State* l, int index) | virtual void InnerGet(State* l, int index) | ||||
| { | { | ||||
| T** obj = static_cast<T**>(luaL_testudata(l, index, T::GetClassInstName())); | |||||
| T** obj = static_cast<T**>(luaL_testudata(l, index, Object::GetMethodName<T>())); | |||||
| m_value = obj ? *obj : nullptr; | m_value = obj ? *obj : nullptr; | ||||
| } | } | ||||
| }; | }; | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| template<typename T> | template<typename T> | ||||
| struct Var | |||||
| class Var | |||||
| { | { | ||||
| private: | private: | ||||
| T m_value; | T m_value; | ||||
| @@ -201,20 +303,20 @@ public: | |||||
| Var(State* l, int index) { InnerGet(l, index); } | Var(State* l, int index) { InnerGet(l, index); } | ||||
| inline T& V() { return m_value; } | inline T& V() { return m_value; } | ||||
| inline int Return(State* l) { InnerPush(l); return 1; } | inline int Return(State* l) { InnerPush(l); return 1; } | ||||
| inline Var<T>& operator-(const T& value) { m_value - value; return *this; } | |||||
| inline Var<T>& operator+(const T& value) { m_value + value; return *this; } | |||||
| inline Var<T>& operator-(const T& value) { m_value - value; return *this; } | |||||
| inline Var<T>& operator+(const T& value) { m_value + value; return *this; } | |||||
| inline Var<T>& operator*(const T& value) { m_value * value; return *this; } | inline Var<T>& operator*(const T& value) { m_value * value; return *this; } | ||||
| inline Var<T>& operator/(const T& value) { m_value / value; return *this; } | |||||
| inline Var<T>& operator=(const T& value) { m_value = value; return *this; } | |||||
| inline Var<T>& operator/(const T& value) { m_value / value; return *this; } | |||||
| inline Var<T>& operator=(const T& value) { m_value = value; return *this; } | |||||
| inline Var<T>& operator-=(const T& value) { m_value -= value; return *this; } | inline Var<T>& operator-=(const T& value) { m_value -= value; return *this; } | ||||
| inline Var<T>& operator+=(const T& value) { m_value += value; return *this; } | inline Var<T>& operator+=(const T& value) { m_value += value; return *this; } | ||||
| inline Var<T>& operator*=(const T& value) { m_value *= value; return *this; } | inline Var<T>& operator*=(const T& value) { m_value *= value; return *this; } | ||||
| inline Var<T>& operator/=(const T& value) { m_value /= value; return *this; } | inline Var<T>& operator/=(const T& value) { m_value /= value; return *this; } | ||||
| inline Var<T>& operator-(const Var<T>& o) { m_value - o.m_value; return *this; } | |||||
| inline Var<T>& operator+(const Var<T>& o) { m_value + o.m_value; return *this; } | |||||
| inline Var<T>& operator-(const Var<T>& o) { m_value - o.m_value; return *this; } | |||||
| inline Var<T>& operator+(const Var<T>& o) { m_value + o.m_value; return *this; } | |||||
| inline Var<T>& operator*(const Var<T>& o) { m_value * o.m_value; return *this; } | inline Var<T>& operator*(const Var<T>& o) { m_value * o.m_value; return *this; } | ||||
| inline Var<T>& operator/(const Var<T>& o) { m_value / o.m_value; return *this; } | |||||
| inline Var<T>& operator=(const Var<T>& o) { m_value = o.m_value; return *this; } | |||||
| inline Var<T>& operator/(const Var<T>& o) { m_value / o.m_value; return *this; } | |||||
| inline Var<T>& operator=(const Var<T>& o) { m_value = o.m_value; return *this; } | |||||
| inline Var<T>& operator-=(const Var<T>& o) { m_value -= o.m_value; return *this; } | inline Var<T>& operator-=(const Var<T>& o) { m_value -= o.m_value; return *this; } | ||||
| inline Var<T>& operator+=(const Var<T>& o) { m_value += o.m_value; return *this; } | inline Var<T>& operator+=(const Var<T>& o) { m_value += o.m_value; return *this; } | ||||
| inline Var<T>& operator*=(const Var<T>& o) { m_value *= o.m_value; return *this; } | inline Var<T>& operator*=(const Var<T>& o) { m_value *= o.m_value; return *this; } | ||||
| @@ -1,5 +1,5 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh-Csg: The code belonging to CSG operations | |||||
| // | // | ||||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | ||||
| // (c) 2010-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | // (c) 2010-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | ||||
| @@ -9,11 +9,6 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| namespace lol | namespace lol | ||||
| @@ -1,5 +1,5 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh-Csg: The code belonging to CSG operations | |||||
| // | // | ||||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | ||||
| // (c) 2010-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | // (c) 2010-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | ||||
| @@ -11,11 +11,6 @@ | |||||
| #pragma once | #pragma once | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -1,5 +1,6 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh: A class about generating 3D mesh without using the hands | |||||
| // Mesh can be generated using C++ or lua code | |||||
| // | // | ||||
| // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | ||||
| // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | ||||
| @@ -10,11 +11,6 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| LOLFX_RESOURCE_DECLARE(shiny); | LOLFX_RESOURCE_DECLARE(shiny); | ||||
| @@ -45,170 +41,6 @@ EasyMesh::EasyMesh(const EasyMesh& em) | |||||
| m_state = MeshRender::NeedData; | m_state = MeshRender::NeedData; | ||||
| } | } | ||||
| //----------------------------------------------------------------------------- | |||||
| bool EasyMesh::Compile(char const *command, bool Execute) | |||||
| { | |||||
| bool res = false; | |||||
| // FIXME: make this work again | |||||
| #if 0 | |||||
| EasyMeshCompiler mc(*this); | |||||
| BD()->Enable(MeshBuildOperation::CommandRecording); | |||||
| if ((res = mc.ParseString(command))) | |||||
| { | |||||
| BD()->Disable(MeshBuildOperation::CommandRecording); | |||||
| if (Execute) | |||||
| ExecuteCmdStack(); | |||||
| } | |||||
| #endif | |||||
| return res; | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| #define EZSET(M0) BD()->CmdStack().GetValue(M0); | |||||
| #define EZDEF_1(T0) T0 m0; EZSET(m0) | |||||
| #define EZDEF_2(T0, T1) EZDEF_1(T0) T1 m1; EZSET(m1) | |||||
| #define EZDEF_3(T0, T1, T2) EZDEF_2(T0, T1) T2 m2; EZSET(m2) | |||||
| #define EZDEF_4(T0, T1, T2, T3) EZDEF_3(T0, T1, T2) T3 m3; EZSET(m3) | |||||
| #define EZDEF_5(T0, T1, T2, T3, T4) EZDEF_4(T0, T1, T2, T3) T4 m4; EZSET(m4) | |||||
| #define EZDEF_6(T0, T1, T2, T3, T4, T5) EZDEF_5(T0, T1, T2, T3, T4) T5 m5; EZSET(m5) | |||||
| #define EZDEF_7(T0, T1, T2, T3, T4, T5, T6) EZDEF_6(T0, T1, T2, T3, T4, T5) T6 m6; EZSET(m6) | |||||
| #define EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) EZDEF_7(T0, T1, T2, T3, T4, T5, T6) T7 m7; EZSET(m7) | |||||
| #define EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) T8 m8; EZSET(m8) | |||||
| #define EZDEF_10(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) T9 m9; EZSET(m9) | |||||
| //---- | |||||
| #define EZCALL_1(F) F(); | |||||
| #define EZCALL_2(F, T0) EZDEF_1(T0) F(m0); | |||||
| #define EZCALL_3(F, T0, T1) EZDEF_2(T0, T1) F(m0, m1); | |||||
| #define EZCALL_4(F, T0, T1, T2) EZDEF_3(T0, T1, T2) F(m0, m1, m2); | |||||
| #define EZCALL_5(F, T0, T1, T2, T3) EZDEF_4(T0, T1, T2, T3) F(m0, m1, m2, m3); | |||||
| #define EZCALL_6(F, T0, T1, T2, T3, T4) EZDEF_5(T0, T1, T2, T3, T4) F(m0, m1, m2, m3, m4); | |||||
| #define EZCALL_7(F, T0, T1, T2, T3, T4, T5) EZDEF_6(T0, T1, T2, T3, T4, T5) F(m0, m1, m2, m3, m4, m5); | |||||
| #define EZCALL_8(F, T0, T1, T2, T3, T4, T5, T6) EZDEF_7(T0, T1, T2, T3, T4, T5, T6) F(m0, m1, m2, m3, m4, m5, m6); | |||||
| #define EZCALL_9(F, T0, T1, T2, T3, T4, T5, T6, T7) EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) F(m0, m1, m2, m3, m4, m5, m6, m7); | |||||
| #define EZCALL_10(F, T0, T1, T2, T3, T4, T5, T6, T7, T8) EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) F(m0, m1, m2, m3, m4, m5, m6, m7, m8); | |||||
| #define EZCALL_11(F, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) EZDEF_10(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) F(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9); | |||||
| //---- | |||||
| #define EZM_CALL_FUNC(...) \ | |||||
| LOL_CALL(LOL_CAT(EZCALL_, LOL_CALL(LOL_COUNT_TO_12, (__VA_ARGS__))), (__VA_ARGS__)) | |||||
| //----------------------------------------------------------------------------- | |||||
| void EasyMesh::ExecuteCmdStack(bool ExecAllStack) | |||||
| { | |||||
| #define DO_EXEC_CMD(MESH_CMD, FUNC_PARAMS) \ | |||||
| case EasyMeshCmdType::MESH_CMD: \ | |||||
| { EZM_CALL_FUNC FUNC_PARAMS; break; } | |||||
| BD()->Enable(MeshBuildOperation::CommandExecution); | |||||
| if (ExecAllStack) | |||||
| BD()->Cmdi() = 0; | |||||
| for (; BD()->Cmdi() < BD()->CmdStack().GetCmdNb() && BD()->CmdExecNb() != 0; ++BD()->Cmdi()) | |||||
| { | |||||
| if (BD()->CmdExecNb() > 0) | |||||
| --BD()->CmdExecNb(); | |||||
| switch (BD()->CmdStack().GetCmd(BD()->Cmdi())) | |||||
| { | |||||
| DO_EXEC_CMD(MeshCsg, (MeshCsg, CSGUsage)) | |||||
| DO_EXEC_CMD(LoopStart, (LoopStart, int)) | |||||
| DO_EXEC_CMD(LoopEnd, (LoopEnd)) | |||||
| DO_EXEC_CMD(OpenBrace, (OpenBrace)) | |||||
| DO_EXEC_CMD(CloseBrace, (CloseBrace)) | |||||
| DO_EXEC_CMD(ScaleWinding, (ToggleScaleWinding)) | |||||
| DO_EXEC_CMD(QuadWeighting, (ToggleQuadWeighting)) | |||||
| DO_EXEC_CMD(PostBuildNormal, (TogglePostBuildNormal)) | |||||
| DO_EXEC_CMD(PreventVertCleanup, (ToggleVerticeNoCleanup)) | |||||
| DO_EXEC_CMD(VerticesMerge, (VerticesMerge)) | |||||
| DO_EXEC_CMD(VerticesSeparate, (VerticesSeparate)) | |||||
| DO_EXEC_CMD(SetColorA, (SetCurColorA, vec4)) | |||||
| DO_EXEC_CMD(SetColorB, (SetCurColorB, vec4)) | |||||
| DO_EXEC_CMD(SetVertColor, (SetVertColor, vec4)) | |||||
| DO_EXEC_CMD(Translate, (Translate, vec3)) | |||||
| DO_EXEC_CMD(Rotate, (Rotate, float, vec3)) | |||||
| DO_EXEC_CMD(RadialJitter, (RadialJitter, float)) | |||||
| DO_EXEC_CMD(MeshTranform, (DoMeshTransform, MeshTransform, Axis, Axis, float, float, float, bool)) | |||||
| DO_EXEC_CMD(Scale, (Scale, vec3)) | |||||
| DO_EXEC_CMD(DupAndScale, (DupAndScale, vec3, bool)) | |||||
| DO_EXEC_CMD(Chamfer, (Chamfer, float)) | |||||
| DO_EXEC_CMD(SplitTriangles, (SplitTriangles, int)) | |||||
| DO_EXEC_CMD(SmoothMesh, (SmoothMesh, int, int, int)) | |||||
| DO_EXEC_CMD(AppendCylinder, (AppendCylinder, int, float, float, float, bool, bool, bool)) | |||||
| DO_EXEC_CMD(AppendCapsule, (AppendCapsule, int, float, float)) | |||||
| DO_EXEC_CMD(AppendTorus, (AppendTorus, int, float, float)) | |||||
| DO_EXEC_CMD(AppendBox, (AppendBox, vec3, float, bool)) | |||||
| DO_EXEC_CMD(AppendStar, (AppendStar, int, float, float, bool, bool)) | |||||
| DO_EXEC_CMD(AppendExpandedStar, (AppendExpandedStar, int, float, float, float)) | |||||
| DO_EXEC_CMD(AppendDisc, (AppendDisc, int, float, bool)) | |||||
| DO_EXEC_CMD(AppendSimpleTriangle, (AppendSimpleTriangle, float, bool)) | |||||
| DO_EXEC_CMD(AppendSimpleQuad, (AppendSimpleQuad, vec2, vec2, float, bool)) | |||||
| DO_EXEC_CMD(AppendCog, (AppendCog, int, float, float, float, float, float, float, float, float, bool)) | |||||
| default: | |||||
| ASSERT(0, "Unknown command pseudo bytecode"); | |||||
| } | |||||
| } | |||||
| BD()->Disable(MeshBuildOperation::CommandExecution); | |||||
| if (!BD()->IsEnabled(MeshBuildOperation::PreventVertCleanup)) | |||||
| VerticesCleanup(); | |||||
| if (BD()->IsEnabled(MeshBuildOperation::PostBuildComputeNormals)) | |||||
| ComputeNormals(0, (int)m_indices.Count()); | |||||
| BD()->Disable(MeshBuildOperation::PostBuildComputeNormals); | |||||
| BD()->Disable(MeshBuildOperation::PreventVertCleanup); | |||||
| if (BD()->CmdExecNb() > 0) | |||||
| BD()->CmdExecNb() = -1; | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| void EasyMesh::MeshConvert() | |||||
| { | |||||
| /* Default material */ | |||||
| Shader *shader = Shader::Create(LOLFX_RESOURCE_NAME(shiny)); | |||||
| /* Push index buffer to GPU */ | |||||
| IndexBuffer *ibo = new IndexBuffer(m_indices.Count() * sizeof(uint16_t)); | |||||
| uint16_t *indices = (uint16_t *)ibo->Lock(0, 0); | |||||
| for (int i = 0; i < m_indices.Count(); ++i) | |||||
| indices[i] = m_indices[i]; | |||||
| ibo->Unlock(); | |||||
| /* Push vertex buffer to GPU */ | |||||
| struct Vertex | |||||
| { | |||||
| vec3 pos, normal; | |||||
| u8vec4 color; | |||||
| vec4 texcoord; | |||||
| }; | |||||
| VertexDeclaration *vdecl = new VertexDeclaration( | |||||
| VertexStream<vec3, vec3, u8vec4, vec4>(VertexUsage::Position, | |||||
| VertexUsage::Normal, | |||||
| VertexUsage::Color, | |||||
| VertexUsage::TexCoord)); | |||||
| VertexBuffer *vbo = new VertexBuffer(m_vert.Count() * sizeof(Vertex)); | |||||
| Vertex *vert = (Vertex *)vbo->Lock(0, 0); | |||||
| for (int i = 0; i < m_vert.Count(); ++i) | |||||
| { | |||||
| vert[i].pos = m_vert[i].m_coord, | |||||
| vert[i].normal = m_vert[i].m_normal, | |||||
| vert[i].color = (u8vec4)(m_vert[i].m_color * 255.f); | |||||
| vert[i].texcoord = m_vert[i].m_texcoord; | |||||
| } | |||||
| vbo->Unlock(); | |||||
| /* Reference our new data in our submesh */ | |||||
| m_submeshes.Push(new SubMesh(shader, vdecl)); | |||||
| m_submeshes.Last()->SetIndexBuffer(ibo); | |||||
| m_submeshes.Last()->SetVertexBuffer(0, vbo); | |||||
| m_state = MeshRender::CanRender; | |||||
| } | |||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| bool EasyMesh::SetRender(bool should_render) | bool EasyMesh::SetRender(bool should_render) | ||||
| { | { | ||||
| @@ -1,5 +1,6 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh: A class about generating 3D mesh without using the hands | |||||
| // Mesh can be generated using C++ or lua code | |||||
| // | // | ||||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | ||||
| // (c) 2009-2013 Cédric Lecacheur <jordx@free.fr> | // (c) 2009-2013 Cédric Lecacheur <jordx@free.fr> | ||||
| @@ -12,14 +13,10 @@ | |||||
| #pragma once | #pragma once | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| #include "commandstack.h" | #include "commandstack.h" | ||||
| #include "easymeshrender.h" | #include "easymeshrender.h" | ||||
| #include "easymeshbuild.h" | #include "easymeshbuild.h" | ||||
| #include "easymeshlua.h" | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -81,12 +78,19 @@ class EasyMesh : public Mesh | |||||
| public: | public: | ||||
| EasyMesh(); | EasyMesh(); | ||||
| EasyMesh(const EasyMesh& em); | EasyMesh(const EasyMesh& em); | ||||
| MeshRender GetMeshState() { return m_state; } | |||||
| bool SetRender(bool should_render); | |||||
| //------------------------------------------------------------------------- | |||||
| //Render-build operation | |||||
| //------------------------------------------------------------------------- | |||||
| void MeshConvert(); | |||||
| //------------------------------------------------------------------------- | |||||
| //Command-build (lua now) operations | |||||
| //------------------------------------------------------------------------- | |||||
| bool Compile(char const *command, bool Execute = true); | bool Compile(char const *command, bool Execute = true); | ||||
| void ExecuteCmdStack(bool ExecAllStack = true); | void ExecuteCmdStack(bool ExecAllStack = true); | ||||
| void MeshConvert(); | |||||
| MeshRender GetMeshState() { return m_state; } | |||||
| bool SetRender(bool should_render); | |||||
| private: | private: | ||||
| void UpdateVertexDict(array< int, int > &vertex_dict); | void UpdateVertexDict(array< int, int > &vertex_dict); | ||||
| @@ -1,5 +1,5 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh-Build: The code belonging to Vertex build operations | |||||
| // | // | ||||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | ||||
| // (c) 2009-2013 Cédric Lecacheur <jordx@free.fr> | // (c) 2009-2013 Cédric Lecacheur <jordx@free.fr> | ||||
| @@ -10,11 +10,6 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| namespace lol | namespace lol | ||||
| @@ -1,5 +1,5 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh-Build: The code belonging to Vertex build operations | |||||
| // | // | ||||
| // Copyright: (c) 2009-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | // Copyright: (c) 2009-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | ||||
| // (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | // (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | ||||
| @@ -12,11 +12,6 @@ | |||||
| #pragma once | #pragma once | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -1,5 +1,5 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh-Csg: The code belonging to CSG operations | |||||
| // | // | ||||
| // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | ||||
| // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | ||||
| @@ -10,11 +10,6 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| namespace lol | namespace lol | ||||
| @@ -1,5 +1,5 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh-Cursor: The code belonging to Cursor operations | |||||
| // | // | ||||
| // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | ||||
| // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | ||||
| @@ -10,11 +10,6 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| namespace lol | namespace lol | ||||
| @@ -1,5 +1,5 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh-Internal: The code belonging to internal operations | |||||
| // | // | ||||
| // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | ||||
| // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | ||||
| @@ -10,11 +10,6 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| namespace lol | namespace lol | ||||
| @@ -0,0 +1,185 @@ | |||||
| // | |||||
| // MY CLASS TYPE | |||||
| // | |||||
| // Copyright © 2009-2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // | |||||
| // This program is free software. It comes without any warranty, to | |||||
| // the extent permitted by applicable law. You can redistribute it | |||||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||||
| // See http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #if HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include <cstdio> | |||||
| #include <lol/engine.h> | |||||
| #include "loldebug.h" | |||||
| using namespace lol; | |||||
| //----------------------------------------------------------------------------- | |||||
| EasyMeshLuaLoader::EasyMeshLuaLoader() : Lolua::Loader() | |||||
| { | |||||
| Lolua::State* l = GetLuaState(); | |||||
| //Registering demo object | |||||
| Lolua::Object::Register<EasyMeshLuaObject>(l); | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| EasyMeshLuaLoader::~EasyMeshLuaLoader() | |||||
| { | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| EasyMeshLuaObject::EasyMeshLuaObject() : Lolua::ObjectDef() | |||||
| { | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| EasyMeshLuaObject::~EasyMeshLuaObject() | |||||
| { | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| EasyMeshLuaObject* EasyMeshLuaObject::New(Lolua::State* l, int arg_nb) | |||||
| { | |||||
| UNUSED(l); | |||||
| UNUSED(arg_nb); | |||||
| return new EasyMeshLuaObject(); | |||||
| } | |||||
| //------------------------------------------------------------------------- | |||||
| const Lolua::ObjectLib* EasyMeshLuaObject::GetLib() | |||||
| { | |||||
| static const Lolua::ObjectLib lib = Lolua::ObjectLib( | |||||
| "EasyMesh", | |||||
| { { nullptr, nullptr } }, | |||||
| { { nullptr, nullptr } }, | |||||
| { { nullptr, nullptr, nullptr } }); | |||||
| return &lib; | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| bool EasyMesh::Compile(char const *command, bool Execute) | |||||
| { | |||||
| bool res = false; | |||||
| // FIXME: make this work again | |||||
| #if 0 | |||||
| EasyMeshCompiler mc(*this); | |||||
| BD()->Enable(MeshBuildOperation::CommandRecording); | |||||
| if ((res = mc.ParseString(command))) | |||||
| { | |||||
| BD()->Disable(MeshBuildOperation::CommandRecording); | |||||
| if (Execute) | |||||
| ExecuteCmdStack(); | |||||
| } | |||||
| #endif | |||||
| return res; | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| #define EZSET(M0) BD()->CmdStack().GetValue(M0); | |||||
| #define EZDEF_1(T0) T0 m0; EZSET(m0) | |||||
| #define EZDEF_2(T0, T1) EZDEF_1(T0) T1 m1; EZSET(m1) | |||||
| #define EZDEF_3(T0, T1, T2) EZDEF_2(T0, T1) T2 m2; EZSET(m2) | |||||
| #define EZDEF_4(T0, T1, T2, T3) EZDEF_3(T0, T1, T2) T3 m3; EZSET(m3) | |||||
| #define EZDEF_5(T0, T1, T2, T3, T4) EZDEF_4(T0, T1, T2, T3) T4 m4; EZSET(m4) | |||||
| #define EZDEF_6(T0, T1, T2, T3, T4, T5) EZDEF_5(T0, T1, T2, T3, T4) T5 m5; EZSET(m5) | |||||
| #define EZDEF_7(T0, T1, T2, T3, T4, T5, T6) EZDEF_6(T0, T1, T2, T3, T4, T5) T6 m6; EZSET(m6) | |||||
| #define EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) EZDEF_7(T0, T1, T2, T3, T4, T5, T6) T7 m7; EZSET(m7) | |||||
| #define EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) T8 m8; EZSET(m8) | |||||
| #define EZDEF_10(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) T9 m9; EZSET(m9) | |||||
| //---- | |||||
| #define EZCALL_1(F) F(); | |||||
| #define EZCALL_2(F, T0) EZDEF_1(T0) F(m0); | |||||
| #define EZCALL_3(F, T0, T1) EZDEF_2(T0, T1) F(m0, m1); | |||||
| #define EZCALL_4(F, T0, T1, T2) EZDEF_3(T0, T1, T2) F(m0, m1, m2); | |||||
| #define EZCALL_5(F, T0, T1, T2, T3) EZDEF_4(T0, T1, T2, T3) F(m0, m1, m2, m3); | |||||
| #define EZCALL_6(F, T0, T1, T2, T3, T4) EZDEF_5(T0, T1, T2, T3, T4) F(m0, m1, m2, m3, m4); | |||||
| #define EZCALL_7(F, T0, T1, T2, T3, T4, T5) EZDEF_6(T0, T1, T2, T3, T4, T5) F(m0, m1, m2, m3, m4, m5); | |||||
| #define EZCALL_8(F, T0, T1, T2, T3, T4, T5, T6) EZDEF_7(T0, T1, T2, T3, T4, T5, T6) F(m0, m1, m2, m3, m4, m5, m6); | |||||
| #define EZCALL_9(F, T0, T1, T2, T3, T4, T5, T6, T7) EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) F(m0, m1, m2, m3, m4, m5, m6, m7); | |||||
| #define EZCALL_10(F, T0, T1, T2, T3, T4, T5, T6, T7, T8) EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) F(m0, m1, m2, m3, m4, m5, m6, m7, m8); | |||||
| #define EZCALL_11(F, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) EZDEF_10(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) F(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9); | |||||
| //---- | |||||
| #define EZM_CALL_FUNC(...) \ | |||||
| LOL_CALL(LOL_CAT(EZCALL_, LOL_CALL(LOL_COUNT_TO_12, (__VA_ARGS__))), (__VA_ARGS__)) | |||||
| //----------------------------------------------------------------------------- | |||||
| void EasyMesh::ExecuteCmdStack(bool ExecAllStack) | |||||
| { | |||||
| #define DO_EXEC_CMD(MESH_CMD, FUNC_PARAMS) \ | |||||
| case EasyMeshCmdType::MESH_CMD: \ | |||||
| { EZM_CALL_FUNC FUNC_PARAMS; break; } | |||||
| BD()->Enable(MeshBuildOperation::CommandExecution); | |||||
| if (ExecAllStack) | |||||
| BD()->Cmdi() = 0; | |||||
| for (; BD()->Cmdi() < BD()->CmdStack().GetCmdNb() && BD()->CmdExecNb() != 0; ++BD()->Cmdi()) | |||||
| { | |||||
| if (BD()->CmdExecNb() > 0) | |||||
| --BD()->CmdExecNb(); | |||||
| switch (BD()->CmdStack().GetCmd(BD()->Cmdi())) | |||||
| { | |||||
| DO_EXEC_CMD(MeshCsg, (MeshCsg, CSGUsage)) | |||||
| DO_EXEC_CMD(LoopStart, (LoopStart, int)) | |||||
| DO_EXEC_CMD(LoopEnd, (LoopEnd)) | |||||
| DO_EXEC_CMD(OpenBrace, (OpenBrace)) | |||||
| DO_EXEC_CMD(CloseBrace, (CloseBrace)) | |||||
| DO_EXEC_CMD(ScaleWinding, (ToggleScaleWinding)) | |||||
| DO_EXEC_CMD(QuadWeighting, (ToggleQuadWeighting)) | |||||
| DO_EXEC_CMD(PostBuildNormal, (TogglePostBuildNormal)) | |||||
| DO_EXEC_CMD(PreventVertCleanup, (ToggleVerticeNoCleanup)) | |||||
| DO_EXEC_CMD(VerticesMerge, (VerticesMerge)) | |||||
| DO_EXEC_CMD(VerticesSeparate, (VerticesSeparate)) | |||||
| DO_EXEC_CMD(SetColorA, (SetCurColorA, vec4)) | |||||
| DO_EXEC_CMD(SetColorB, (SetCurColorB, vec4)) | |||||
| DO_EXEC_CMD(SetVertColor, (SetVertColor, vec4)) | |||||
| DO_EXEC_CMD(Translate, (Translate, vec3)) | |||||
| DO_EXEC_CMD(Rotate, (Rotate, float, vec3)) | |||||
| DO_EXEC_CMD(RadialJitter, (RadialJitter, float)) | |||||
| DO_EXEC_CMD(MeshTranform, (DoMeshTransform, MeshTransform, Axis, Axis, float, float, float, bool)) | |||||
| DO_EXEC_CMD(Scale, (Scale, vec3)) | |||||
| DO_EXEC_CMD(DupAndScale, (DupAndScale, vec3, bool)) | |||||
| DO_EXEC_CMD(Chamfer, (Chamfer, float)) | |||||
| DO_EXEC_CMD(SplitTriangles, (SplitTriangles, int)) | |||||
| DO_EXEC_CMD(SmoothMesh, (SmoothMesh, int, int, int)) | |||||
| DO_EXEC_CMD(AppendCylinder, (AppendCylinder, int, float, float, float, bool, bool, bool)) | |||||
| DO_EXEC_CMD(AppendCapsule, (AppendCapsule, int, float, float)) | |||||
| DO_EXEC_CMD(AppendTorus, (AppendTorus, int, float, float)) | |||||
| DO_EXEC_CMD(AppendBox, (AppendBox, vec3, float, bool)) | |||||
| DO_EXEC_CMD(AppendStar, (AppendStar, int, float, float, bool, bool)) | |||||
| DO_EXEC_CMD(AppendExpandedStar, (AppendExpandedStar, int, float, float, float)) | |||||
| DO_EXEC_CMD(AppendDisc, (AppendDisc, int, float, bool)) | |||||
| DO_EXEC_CMD(AppendSimpleTriangle, (AppendSimpleTriangle, float, bool)) | |||||
| DO_EXEC_CMD(AppendSimpleQuad, (AppendSimpleQuad, vec2, vec2, float, bool)) | |||||
| DO_EXEC_CMD(AppendCog, (AppendCog, int, float, float, float, float, float, float, float, float, bool)) | |||||
| default: | |||||
| ASSERT(0, "Unknown command pseudo bytecode"); | |||||
| } | |||||
| } | |||||
| BD()->Disable(MeshBuildOperation::CommandExecution); | |||||
| if (!BD()->IsEnabled(MeshBuildOperation::PreventVertCleanup)) | |||||
| VerticesCleanup(); | |||||
| if (BD()->IsEnabled(MeshBuildOperation::PostBuildComputeNormals)) | |||||
| ComputeNormals(0, (int)m_indices.Count()); | |||||
| BD()->Disable(MeshBuildOperation::PostBuildComputeNormals); | |||||
| BD()->Disable(MeshBuildOperation::PreventVertCleanup); | |||||
| if (BD()->CmdExecNb() > 0) | |||||
| BD()->CmdExecNb() = -1; | |||||
| } | |||||
| @@ -0,0 +1,144 @@ | |||||
| // | |||||
| // MY CLASS TYPE | |||||
| // | |||||
| // Copyright © 2009-2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
| // | |||||
| // This program is free software. It comes without any warranty, to | |||||
| // the extent permitted by applicable law. You can redistribute it | |||||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||||
| // See http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #pragma once | |||||
| namespace lol | |||||
| { | |||||
| //----------------------------------------------------------------------------- | |||||
| class EasyMeshLuaLoader : public Lolua::Loader | |||||
| { | |||||
| public: | |||||
| EasyMeshLuaLoader(); | |||||
| virtual ~EasyMeshLuaLoader(); | |||||
| }; | |||||
| //----------------------------------------------------------------------------- | |||||
| class EasyMeshLuaObject : public Lolua::ObjectDef | |||||
| { | |||||
| public: | |||||
| //------------------------------------------------------------------------- | |||||
| EasyMeshLuaObject(); | |||||
| virtual ~EasyMeshLuaObject(); | |||||
| //------------------------------------------------------------------------- | |||||
| static EasyMeshLuaObject* New(Lolua::State* l, int arg_nb); | |||||
| static const Lolua::ObjectLib* GetLib(); | |||||
| //------------------------------------------------------------------------- | |||||
| /* | |||||
| (csgu|csgunion) { return token::T_CSGUNION; } | |||||
| (csgs|CsgSub) { return token::T_CSGSUBSTRACT; } | |||||
| (csgsl|CsgSubL) { return token::T_CSGSUBSTRACTLOSS; } | |||||
| (csga|csgand) { return token::T_CSGAND; } | |||||
| (csgx|csgxor) { return token::T_CSGXOR; } | |||||
| (lp|loop) { return token::T_LOOP; } | |||||
| (sc|setcolor) { return token::T_COLOR; } | |||||
| (sca|setcolora) { return token::T_ACOLOR; } | |||||
| (scb|setcolorb) { return token::T_BCOLOR; } | |||||
| (scv|setcolorv) { return token::T_VCOLOR; } | |||||
| (tsw|tglscalewind) { return token::T_TOGGLESCALEWINDING; } | |||||
| (tqw|tglquadweight) { return token::T_TOGGLEQUADWEIGHTING; } | |||||
| (tpbn|tglpstbuildnormal) { return token::T_TOGGLEPOSTBUILDNORMAL; } | |||||
| (tvnc|tglvertnocleanup) { return token::T_TOGGLEVERTNOCLEANUP; } | |||||
| (vm|vertmerge) { return token::T_VERTMERGE; } | |||||
| (vs|vertseparate) { return token::T_VERTSEPARATE; } | |||||
| (tx|translatex) { return token::T_TRANSLATEX; } | |||||
| (ty|translatey) { return token::T_TRANSLATEY; } | |||||
| (tz|translatez) { return token::T_TRANSLATEZ; } | |||||
| (t|translate) { return token::T_TRANSLATE; } | |||||
| (rx|rotatex) { return token::T_ROTATEX; } | |||||
| (ry|rotatey) { return token::T_ROTATEY; } | |||||
| (rz|rotatez) { return token::T_ROTATEZ; } | |||||
| (r|rotate) { return token::T_ROTATE; } | |||||
| (rj|radialjitter) { return token::T_RADIALJITTER; } | |||||
| (tax|taperx) { return token::T_TAPERX; } | |||||
| (tay|tapery) { return token::T_TAPERY; } | |||||
| (taz|taperz) { return token::T_TAPERZ; } | |||||
| (twx|twistx) { return token::T_TWISTX; } | |||||
| (twy|twisty) { return token::T_TWISTY; } | |||||
| (twz|twistz) { return token::T_TWISTZ; } | |||||
| (shx|shearx) { return token::T_SHEARX; } | |||||
| (shy|sheary) { return token::T_SHEARY; } | |||||
| (shz|shearz) { return token::T_SHEARZ; } | |||||
| (stx|stretchx) { return token::T_STRETCHX; } | |||||
| (sty|stretchy) { return token::T_STRETCHY; } | |||||
| (stz|stretchz) { return token::T_STRETCHZ; } | |||||
| (bdxy|bendxy) { return token::T_BENDXY; } | |||||
| (bdxz|bendxz) { return token::T_BENDXZ; } | |||||
| (bdyx|bendyx) { return token::T_BENDYX; } | |||||
| (bdyz|bendyz) { return token::T_BENDYZ; } | |||||
| (bdzx|bendzx) { return token::T_BENDZX; } | |||||
| (bdzy|bendzy) { return token::T_BENDZY; } | |||||
| (sx|scalex) { return token::T_SCALEX; } | |||||
| (sy|scaley) { return token::T_SCALEY; } | |||||
| (sz|scalez) { return token::T_SCALEZ; } | |||||
| (s|scale) { return token::T_SCALE; } | |||||
| (mx|mirrorx) { return token::T_MIRRORX; } | |||||
| (my|mirrory) { return token::T_MIRRORY; } | |||||
| (mz|mirrorz) { return token::T_MIRRORZ; } | |||||
| (ch|chamfer) { return token::T_CHAMFER; } | |||||
| (splt|splittriangle) { return token::T_SPLITTRIANGLE; } | |||||
| (smth|smooth) { return token::T_SMOOTHMESH; } | |||||
| (dup|duplicate) { return token::T_DUPLICATE; } | |||||
| (ac|addcylinder) { return token::T_CYLINDER; } | |||||
| (asph|addsphere) { return token::T_SPHERE; } | |||||
| (acap|addcapsule) { return token::T_CAPSULE; } | |||||
| (ato|addtorus) { return token::T_TORUS; } | |||||
| (ab|addbox) { return token::T_BOX; } | |||||
| (ascb|addsmoothchamfbox) { return token::T_SMOOTHCHAMFBOX; } | |||||
| (afcb|addflatchamfbox) { return token::T_FLATCHAMFBOX; } | |||||
| (as|addstar) { return token::T_STAR; } | |||||
| (aes|addexpandedstar) { return token::T_EXPANDEDSTAR; } | |||||
| (ad|adddisc) { return token::T_DISC; } | |||||
| (at|addtriangle) { return token::T_TRIANGLE; } | |||||
| (aq|addquad) { return token::T_QUAD; } | |||||
| (acg|addcog) { return token::T_COG; } | |||||
| */ | |||||
| /* | |||||
| %{ *//* ======= BASE COLOR TYPES ========================================= *//* % | |||||
| } | |||||
| %{ *//* COLOR *//* %} | |||||
| #[0-9a-fA-F]{3} { | |||||
| uint32_t tmp = std::strtol(yytext + 1, nullptr, 16); | |||||
| yylval->u32val = 0x11000000u * (tmp >> 8) | |||||
| | 0x00110000u * ((tmp >> 4) & 0xf) | |||||
| | 0x00001100u * (tmp & 0xf) | |||||
| | 0x000000ffu; | |||||
| return token::COLOR; } | |||||
| #[0-9a-fA-F]{4} { | |||||
| uint32_t tmp = std::strtol(yytext + 1, nullptr, 16); | |||||
| yylval->u32val = 0x11000000u * (tmp >> 12) | |||||
| | 0x00110000u * ((tmp >> 8) & 0xf) | |||||
| | 0x00001100u * ((tmp >> 4) & 0xf) | |||||
| | 0x00000011u * (tmp & 0xf); | |||||
| return token::COLOR; } | |||||
| #[0-9a-fA-F]{6} { | |||||
| yylval->u32val = 0xffu | |||||
| | 0x100u * (uint32_t)std::strtol(yytext + 1, nullptr, 16); | |||||
| return token::COLOR; } | |||||
| #[0-9a-fA-F]{8} { | |||||
| yylval->u32val = (uint32_t)std::strtol(yytext + 1, nullptr, 16); | |||||
| return token::COLOR; } | |||||
| */ | |||||
| }; | |||||
| } /* namespace lol */ | |||||
| @@ -1,5 +1,5 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh-Primitive: The code belonging to primitive operations | |||||
| // | // | ||||
| // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | ||||
| // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | ||||
| @@ -10,11 +10,6 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| namespace lol | namespace lol | ||||
| @@ -1,5 +1,5 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh-Render: The code belonging to render operations | |||||
| // | // | ||||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | ||||
| // (c) 2009-2013 Cédric Lecacheur <jordx@free.fr> | // (c) 2009-2013 Cédric Lecacheur <jordx@free.fr> | ||||
| @@ -10,11 +10,6 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| namespace lol | namespace lol | ||||
| @@ -28,6 +23,52 @@ LOLFX_RESOURCE_DECLARE(shinydebugnormal); | |||||
| LOLFX_RESOURCE_DECLARE(shinydebugUV); | LOLFX_RESOURCE_DECLARE(shinydebugUV); | ||||
| LOLFX_RESOURCE_DECLARE(shiny_SK); | LOLFX_RESOURCE_DECLARE(shiny_SK); | ||||
| //----------------------------------------------------------------------------- | |||||
| void EasyMesh::MeshConvert() | |||||
| { | |||||
| /* Default material */ | |||||
| Shader *shader = Shader::Create(LOLFX_RESOURCE_NAME(shiny)); | |||||
| /* Push index buffer to GPU */ | |||||
| IndexBuffer *ibo = new IndexBuffer(m_indices.Count() * sizeof(uint16_t)); | |||||
| uint16_t *indices = (uint16_t *)ibo->Lock(0, 0); | |||||
| for (int i = 0; i < m_indices.Count(); ++i) | |||||
| indices[i] = m_indices[i]; | |||||
| ibo->Unlock(); | |||||
| /* Push vertex buffer to GPU */ | |||||
| struct Vertex | |||||
| { | |||||
| vec3 pos, normal; | |||||
| u8vec4 color; | |||||
| vec4 texcoord; | |||||
| }; | |||||
| VertexDeclaration *vdecl = new VertexDeclaration( | |||||
| VertexStream<vec3, vec3, u8vec4, vec4>(VertexUsage::Position, | |||||
| VertexUsage::Normal, | |||||
| VertexUsage::Color, | |||||
| VertexUsage::TexCoord)); | |||||
| VertexBuffer *vbo = new VertexBuffer(m_vert.Count() * sizeof(Vertex)); | |||||
| Vertex *vert = (Vertex *)vbo->Lock(0, 0); | |||||
| for (int i = 0; i < m_vert.Count(); ++i) | |||||
| { | |||||
| vert[i].pos = m_vert[i].m_coord, | |||||
| vert[i].normal = m_vert[i].m_normal, | |||||
| vert[i].color = (u8vec4)(m_vert[i].m_color * 255.f); | |||||
| vert[i].texcoord = m_vert[i].m_texcoord; | |||||
| } | |||||
| vbo->Unlock(); | |||||
| /* Reference our new data in our submesh */ | |||||
| m_submeshes.Push(new SubMesh(shader, vdecl)); | |||||
| m_submeshes.Last()->SetIndexBuffer(ibo); | |||||
| m_submeshes.Last()->SetVertexBuffer(0, vbo); | |||||
| m_state = MeshRender::CanRender; | |||||
| } | |||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| GpuShaderData::GpuShaderData() | GpuShaderData::GpuShaderData() | ||||
| { | { | ||||
| @@ -1,5 +1,5 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh-Render: The code belonging to render operations | |||||
| // | // | ||||
| // Copyright: (c) 2009-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | // Copyright: (c) 2009-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | ||||
| // (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | // (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | ||||
| @@ -12,11 +12,6 @@ | |||||
| #pragma once | #pragma once | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -1,5 +1,5 @@ | |||||
| // | // | ||||
| // Lol Engine | |||||
| // EasyMesh-Transform: The code belonging to transform operations | |||||
| // | // | ||||
| // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | ||||
| // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | // (c) 2009-2015 Cédric Lecacheur <jordx@free.fr> | ||||
| @@ -10,11 +10,6 @@ | |||||
| // http://www.wtfpl.net/ for more details. | // http://www.wtfpl.net/ for more details. | ||||
| // | // | ||||
| // | |||||
| // The EasyMesh class | |||||
| // ------------------ | |||||
| // | |||||
| #include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
| namespace lol | namespace lol | ||||
| @@ -107,6 +107,7 @@ | |||||
| <ClCompile Include="easymesh\easymeshcsg.cpp" /> | <ClCompile Include="easymesh\easymeshcsg.cpp" /> | ||||
| <ClCompile Include="easymesh\easymeshcursor.cpp" /> | <ClCompile Include="easymesh\easymeshcursor.cpp" /> | ||||
| <ClCompile Include="easymesh\easymeshinternal.cpp" /> | <ClCompile Include="easymesh\easymeshinternal.cpp" /> | ||||
| <ClCompile Include="easymesh\easymeshlua.cpp" /> | |||||
| <ClCompile Include="easymesh\easymeshprimitive.cpp" /> | <ClCompile Include="easymesh\easymeshprimitive.cpp" /> | ||||
| <ClCompile Include="easymesh\easymeshrender.cpp" /> | <ClCompile Include="easymesh\easymeshrender.cpp" /> | ||||
| <ClCompile Include="easymesh\easymeshtransform.cpp" /> | <ClCompile Include="easymesh\easymeshtransform.cpp" /> | ||||
| @@ -243,6 +244,7 @@ | |||||
| <ClInclude Include="easymesh\csgbsp.h" /> | <ClInclude Include="easymesh\csgbsp.h" /> | ||||
| <ClInclude Include="easymesh\easymesh.h" /> | <ClInclude Include="easymesh\easymesh.h" /> | ||||
| <ClInclude Include="easymesh\easymeshbuild.h" /> | <ClInclude Include="easymesh\easymeshbuild.h" /> | ||||
| <ClInclude Include="easymesh\easymeshlua.h" /> | |||||
| <ClInclude Include="easymesh\easymeshrender.h" /> | <ClInclude Include="easymesh\easymeshrender.h" /> | ||||
| <ClInclude Include="eglapp.h" /> | <ClInclude Include="eglapp.h" /> | ||||
| <ClInclude Include="emitter.h" /> | <ClInclude Include="emitter.h" /> | ||||
| @@ -88,6 +88,9 @@ | |||||
| <Filter Include="image\filter"> | <Filter Include="image\filter"> | ||||
| <UniqueIdentifier>{3f420a7d-0538-463a-925b-3f8968bf628e}</UniqueIdentifier> | <UniqueIdentifier>{3f420a7d-0538-463a-925b-3f8968bf628e}</UniqueIdentifier> | ||||
| </Filter> | </Filter> | ||||
| <Filter Include="lua"> | |||||
| <UniqueIdentifier>{25cc0513-ad71-4fbe-bd24-acc88aa66833}</UniqueIdentifier> | |||||
| </Filter> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <ClCompile Include="image\crop.cpp"> | <ClCompile Include="image\crop.cpp"> | ||||
| @@ -403,8 +406,11 @@ | |||||
| <ClCompile Include="easymesh\easymeshcursor.cpp"> | <ClCompile Include="easymesh\easymeshcursor.cpp"> | ||||
| <Filter>easymesh</Filter> | <Filter>easymesh</Filter> | ||||
| </ClCompile> | </ClCompile> | ||||
| <ClCompile Include="easymesh\easymeshlua.cpp"> | |||||
| <Filter>easymesh</Filter> | |||||
| </ClCompile> | |||||
| <ClCompile Include="application\baselua.cpp"> | <ClCompile Include="application\baselua.cpp"> | ||||
| <Filter>application</Filter> | |||||
| <Filter>lua</Filter> | |||||
| </ClCompile> | </ClCompile> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| @@ -757,8 +763,11 @@ | |||||
| <ClInclude Include="lol\algorithm\portal.h"> | <ClInclude Include="lol\algorithm\portal.h"> | ||||
| <Filter>lol\algorithm</Filter> | <Filter>lol\algorithm</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| <ClInclude Include="easymesh\easymeshlua.h"> | |||||
| <Filter>easymesh</Filter> | |||||
| </ClInclude> | |||||
| <ClInclude Include="application\baselua.h"> | <ClInclude Include="application\baselua.h"> | ||||
| <Filter>application</Filter> | |||||
| <Filter>lua</Filter> | |||||
| </ClInclude> | </ClInclude> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||