You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

236 lines
6.6 KiB

  1. //
  2. // Lol Engine — Lua tutorial
  3. //
  4. // Copyright © 2014—2017 Benjamin “Touky” Huet <huet.benjamin@gmail.com>
  5. //
  6. // Lol Engine is free software. It comes without any warranty, to
  7. // the extent permitted by applicable law. You can redistribute it
  8. // and/or modify it under the terms of the Do What the Fuck You Want
  9. // to Public License, Version 2, as published by the WTFPL Task Force.
  10. // See http://www.wtfpl.net/ for more details.
  11. //
  12. #if HAVE_CONFIG_H
  13. # include "config.h"
  14. #endif
  15. #include <lol/engine.h>
  16. #include <lol/lua.h>
  17. #include "loldebug.h"
  18. #include <cstdio>
  19. using namespace lol;
  20. //-----------------------------------------------------------------------------
  21. class DemoObject : public LuaObject
  22. {
  23. public:
  24. DemoObject() : LuaObject() {}
  25. virtual ~DemoObject() {}
  26. static DemoObject* New(lua_State* l, int arg_nb)
  27. {
  28. UNUSED(l);
  29. UNUSED(arg_nb);
  30. return new DemoObject();
  31. }
  32. //-------------------------------------------------------------------------
  33. static int AddFive(lua_State* l)
  34. {
  35. auto stack = LuaStack::Begin(l);
  36. int32_t i = stack.Get<int32_t>();
  37. i += 5;
  38. return (stack << i).End();
  39. }
  40. LOLUA_DECLARE_RETURN_METHOD_ARGS(AddTenInstance, GetPtr<DemoObject>(), AddTenMethod, Get<float>(), Get<int32_t>(), Get<int32_t>());
  41. static int _AddTenInstance(lua_State* l)
  42. {
  43. auto stack = LuaStack::Begin(l);
  44. DemoObject* obj = stack.GetPtr<DemoObject>();
  45. float f = stack.Get<float>();
  46. int32_t i = stack.Get<int32_t>();
  47. int32_t i2 = stack.Get<int32_t>();
  48. f = obj->AddTenMethod(f, i, i2);
  49. return (stack << f).End();
  50. }
  51. float AddTenMethod(float f, int32_t i, int32_t i2)
  52. {
  53. UNUSED(i, i2);
  54. return (f + 10);
  55. }
  56. static int GetX(lua_State* l)
  57. {
  58. auto stack = LuaStack::Begin(l);
  59. DemoObject* obj = stack.GetPtr<DemoObject>();
  60. auto i = stack.Get<int32_t>();
  61. i = obj->m_x;
  62. return (stack << i).End();
  63. }
  64. LOLUA_DECLARE_VOID_METHOD_ARGS(SetX, GetPtr<DemoObject>(), SetXMethod, Get<int32_t>());
  65. static int _SetX(lua_State* l)
  66. {
  67. auto stack = LuaStack::Begin(l);
  68. DemoObject* obj = stack.GetPtr<DemoObject>();
  69. auto i = stack.Get<int32_t>();
  70. obj->m_x = i;
  71. return stack.End();
  72. }
  73. void SetXMethod(int32_t i)
  74. {
  75. m_x = i;
  76. }
  77. //-------------------------------------------------------------------------
  78. static const LuaObjectLibrary* GetLib()
  79. {
  80. static const LuaObjectLibrary lib = LuaObjectLibrary(
  81. "LoluaDemo",
  82. { { "AddFive", &DemoObject::AddFive } },
  83. { { "AddTenInstance", &DemoObject::AddTenInstance } },
  84. { { "X", &DemoObject::GetX, &DemoObject::SetX } });
  85. return &lib;
  86. }
  87. int m_x = 0;
  88. };
  89. //-----------------------------------------------------------------------------
  90. static int GlobalAddString(lua_State* l)
  91. {
  92. auto stack = LuaStack::Begin(l);
  93. auto s = stack.Get<String>();
  94. s += "_added";
  95. return (stack << s).End();
  96. }
  97. //-----------------------------------------------------------------------------
  98. class LoluaDemoLoader : public LuaLoader
  99. {
  100. public:
  101. LoluaDemoLoader() : LuaLoader()
  102. {
  103. lua_State* l = GetLuaState();
  104. //Registering demo object
  105. LuaObjectHelper::Register<DemoObject>(l);
  106. //Registering function
  107. LuaFunction add_string(l, "GlobalAddString", &GlobalAddString);
  108. }
  109. virtual ~LoluaDemoLoader()
  110. {
  111. }
  112. void TestStuff()
  113. {
  114. /*
  115. lua_State* l = GetLuaState();
  116. //create property
  117. lua_pushnumber(l, 5.0);
  118. lua_setfield(l, -2, "x");
  119. lua_getglobal(l, "vector");
  120. int table = lua_istable(l, -1);
  121. lua_getfield(l, -1, "x");
  122. Lolua::Var<float> var(l, -1);
  123. lua_pop(l, 2);
  124. vec3 t;
  125. */
  126. //table = lua_isuserdata(l, -1);
  127. //Var<T> var(m_lua_state, -1);
  128. //lua_pop(m_lua_state, 1);
  129. //lua_getfield (lua_State *L, int index, const char *k);
  130. //return var.V();
  131. }
  132. };
  133. //-----------------------------------------------------------------------------
  134. class LoluaDemo : public WorldEntity
  135. {
  136. public:
  137. LoluaDemo()
  138. {
  139. }
  140. virtual void TickGame(float seconds)
  141. {
  142. WorldEntity::TickGame(seconds);
  143. LoluaDemoLoader* demo_loader = new LoluaDemoLoader();
  144. //Execute script
  145. demo_loader->ExecLuaFile("14_lol_lua.lua");
  146. demo_loader->TestStuff();
  147. //Grab global test values
  148. float testvalue_num = demo_loader->Get<float>("testvalue_num");
  149. int32_t testvalue_int = demo_loader->Get<int32_t>("testvalue_int");
  150. uint32_t testvalue_uint = demo_loader->Get<uint32_t>("testvalue_uint");
  151. String testvalue_str = demo_loader->Get<String>("testvalue_str");
  152. //Grab string modified with function
  153. String function_return = demo_loader->Get<String>("function_return");
  154. //Grab global values modified with DemoObject
  155. int32_t loluademo_return = demo_loader->Get<int32_t>("loluademo_return");
  156. int32_t loluademo_getx = demo_loader->Get<int32_t>("loluademo_getx");
  157. float loluademo_inst_return = demo_loader->Get<float>("loluademo_inst_return");
  158. DemoObject* loluademo_inst = demo_loader->GetPtr<DemoObject>("loluademo_inst");
  159. msg::info("Lua Vars: \
  160. testvalue_num: %.2f, testvalue_int: %i, testvalue_uint: %i, testvalue_str: %s.\n",
  161. testvalue_num, testvalue_int, testvalue_uint, testvalue_str.C());
  162. msg::info("Lua Vars: \
  163. function_return: %s, loluademo_return: %i, loluademo_inst_return: %.2f, loluademo_getx: %i, loluademo_inst->m_x: %i.\n",
  164. function_return.C(), loluademo_return, loluademo_inst_return, loluademo_getx, loluademo_inst->m_x);
  165. #define /***/ _LOLUA_ARG_1(a00) (float)a00
  166. #define /***/ _LOLUA_ARG_2(a00, a01) _LOLUA_ARG_1(a00), _LOLUA_ARG_1(a01)
  167. #define /***/ _LOLUA_ARG_3(a00, a01, a02) _LOLUA_ARG_1(a00), _LOLUA_ARG_2(a01, a02)
  168. #define /***/ _LOLUA_ARG_4(a00, a01, a02, a03) _LOLUA_ARG_1(a00), _LOLUA_ARG_3(a01, a02, a03)
  169. msg::info("_LOLUA_ARG_1: %f, %f, %f, %f\n", _LOLUA_ARG_4(0, 1, 2, 3));
  170. delete demo_loader;
  171. Ticker::Shutdown();
  172. }
  173. virtual void TickDraw(float seconds, Scene &scene)
  174. {
  175. WorldEntity::TickDraw(seconds, scene);
  176. }
  177. };
  178. //-----------------------------------------------------------------------------
  179. int main(int argc, char **argv)
  180. {
  181. sys::init(argc, argv);
  182. Application app("Tutorial 14: Lolua Demo", ivec2(800, 600), 60.0f);
  183. new LoluaDemo();
  184. app.Run();
  185. return EXIT_SUCCESS;
  186. }