157 lines
4.9 KiB

  1. //
  2. // Lol Engine - Graphing tutorial
  3. //
  4. // Copyright: (c) 2012-2013 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://www.wtfpl.net/ for more details.
  9. //
  10. #if HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #include <lol/engine.h>
  14. #include "loldebug.h"
  15. #include <cstdio>
  16. using namespace lol;
  17. //-----------------------------------------------------------------------------
  18. class DemoObject : public Lolua::ObjectDef
  19. {
  20. public:
  21. DemoObject() : Lolua::ObjectDef() {}
  22. virtual ~DemoObject() {}
  23. static DemoObject* New(Lolua::State* l, int arg_nb)
  24. {
  25. UNUSED(l);
  26. UNUSED(arg_nb);
  27. return new DemoObject();
  28. }
  29. static const char* GetClassName() { static const char name[] = "LoluaDemo"; return name; }
  30. static const char* GetClassLibName() { static const char name[] = "LoluaDemoLib"; return name; }
  31. static const char* GetClassInstName() { static const char name[] = "LoluaDemoInst"; return name; }
  32. static const Lolua::ClassMethod* GetStaticMethods();
  33. static const Lolua::ClassMethod* GetInstanceMethods();
  34. static int AddFive(Lolua::State* l)
  35. {
  36. Lolua::Var<int> i(l, 1);
  37. i += 5;
  38. return i.Return(l);
  39. }
  40. static int AddTenInstance(Lolua::State* l)
  41. {
  42. Lolua::VarPtr<DemoObject> obj(l, 1);
  43. Lolua::Var<float> f(l, 2);
  44. f = obj.V()->AddTenMethod(f.V());
  45. return f.Return(l);
  46. }
  47. float AddTenMethod(float f)
  48. {
  49. return (f + 10);
  50. }
  51. };
  52. //-----------------------------------------------------------------------------
  53. static const Lolua::ClassMethod loluademo_statics[] = { { "AddFive", &DemoObject::AddFive }, { NULL, NULL } };
  54. static const Lolua::ClassMethod loluademo_methods[] = { { "AddTenInstance", &DemoObject::AddTenInstance }, { NULL, NULL } };
  55. const Lolua::ClassMethod* DemoObject::GetStaticMethods() { return loluademo_statics; }
  56. const Lolua::ClassMethod* DemoObject::GetInstanceMethods() { return loluademo_methods; }
  57. //-----------------------------------------------------------------------------
  58. static int GlobalAddString(Lolua::State* l)
  59. {
  60. Lolua::Var<String> s(l, 1);
  61. s += "_added";
  62. return s.Return(l);
  63. }
  64. //-----------------------------------------------------------------------------
  65. class LoluaDemoLoader : public Lolua::Loader
  66. {
  67. public:
  68. LoluaDemoLoader() : Lolua::Loader()
  69. {
  70. Lolua::State* l = GetLuaState();
  71. //Registering demo object
  72. Lolua::Object::Register<DemoObject>(l);
  73. //Registering function
  74. Lolua::Function add_string(l, "GlobalAddString", &GlobalAddString);
  75. }
  76. virtual ~LoluaDemoLoader()
  77. {
  78. }
  79. };
  80. //-----------------------------------------------------------------------------
  81. class LoluaDemo : public WorldEntity
  82. {
  83. public:
  84. LoluaDemo()
  85. {
  86. }
  87. virtual void TickGame(float seconds)
  88. {
  89. WorldEntity::TickGame(seconds);
  90. LoluaDemoLoader* demo_loader = new LoluaDemoLoader();
  91. //Execute script
  92. demo_loader->ExecLua("14_lol_lua.lua");
  93. //Grab global test values
  94. float testvalue_num = demo_loader->GetVar<float>("testvalue_num");
  95. int32_t testvalue_int = demo_loader->GetVar<int32_t>("testvalue_int");
  96. uint32_t testvalue_uint = demo_loader->GetVar<uint32_t>("testvalue_uint");
  97. String testvalue_str = demo_loader->GetVar<String>("testvalue_str");
  98. //Grab string modified with function
  99. String function_return = demo_loader->GetVar<String>("function_return");
  100. //Grab global values modified with DemoObject
  101. int32_t loluademo_return = demo_loader->GetVar<int32_t>("loluademo_return");
  102. float loluademo_inst_return = demo_loader->GetVar<float>("loluademo_inst_return");
  103. DemoObject* loluademo_inst = demo_loader->GetPtr<DemoObject>("loluademo_inst");
  104. String loluademo_inst_name = loluademo_inst->GetClassName();
  105. Log::Info("Lua Vars: \
  106. testvalue_num: %.2f, testvalue_int: %i, testvalue_uint: %i, testvalue_str: %s.\n",
  107. testvalue_num, testvalue_int, testvalue_uint, testvalue_str.C());
  108. Log::Info("Lua Vars: \
  109. function_return: %s, loluademo_return: %i, loluademo_inst_return: %.f, loluademo_inst_name: %s.\n",
  110. function_return.C(), loluademo_return, loluademo_inst_return, loluademo_inst_name.C());
  111. delete demo_loader;
  112. Ticker::Shutdown();
  113. }
  114. virtual void TickDraw(float seconds, Scene &scene)
  115. {
  116. WorldEntity::TickDraw(seconds, scene);
  117. }
  118. };
  119. //-----------------------------------------------------------------------------
  120. int main(int argc, char **argv)
  121. {
  122. System::Init(argc, argv);
  123. Application app("Tutorial 14: Lolua Demo", ivec2(800, 600), 60.0f);
  124. new LoluaDemo();
  125. app.Run();
  126. return EXIT_SUCCESS;
  127. }