lua_stack.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /*
  2. * Copyright (c) 2012-2016 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "debug_line.h"
  6. #include "device.h"
  7. #include "gui.h"
  8. #include "level.h"
  9. #include "lua_environment.h"
  10. #include "lua_stack.h"
  11. #include "physics_world.h"
  12. #include "render_world.h"
  13. #include "resource_package.h"
  14. #include "scene_graph.h"
  15. #include "sound_world.h"
  16. #include "vector2.h"
  17. #include "vector3.h"
  18. #include "world.h"
  19. namespace crown
  20. {
  21. bool LuaStack::is_vector3(int i)
  22. {
  23. return device()->lua_environment()->is_vector3((Vector3*)get_pointer(i));
  24. }
  25. bool LuaStack::is_quaternion(int i)
  26. {
  27. return device()->lua_environment()->is_quaternion((Quaternion*)get_pointer(i));
  28. }
  29. bool LuaStack::is_matrix4x4(int i)
  30. {
  31. return device()->lua_environment()->is_matrix4x4((Matrix4x4*)get_pointer(i));
  32. }
  33. void LuaStack::check_temporary(int i, const Vector3* p)
  34. {
  35. LuaEnvironment* env = device()->lua_environment();
  36. if (!is_pointer(i) || !env->is_vector3(p))
  37. luaL_typerror(L, i, "Vector3");
  38. }
  39. void LuaStack::check_temporary(int i, const Quaternion* p)
  40. {
  41. LuaEnvironment* env = device()->lua_environment();
  42. if (!is_pointer(i) || !env->is_quaternion(p))
  43. luaL_typerror(L, i, "Quaternion");
  44. }
  45. void LuaStack::check_temporary(int i, const Matrix4x4* p)
  46. {
  47. LuaEnvironment* env = device()->lua_environment();
  48. if (!is_pointer(i) || !env->is_matrix4x4(p))
  49. luaL_typerror(L, i, "Matrix4x4");
  50. }
  51. Vector2 LuaStack::get_vector2(int i)
  52. {
  53. Vector3 v = get_vector3(i);
  54. return vector2(v.x, v.y);
  55. }
  56. Vector3& LuaStack::get_vector3(int i)
  57. {
  58. Vector3* v = (Vector3*)get_pointer(i);
  59. check_temporary(i, v);
  60. return *v;
  61. }
  62. Quaternion& LuaStack::get_quaternion(int i)
  63. {
  64. Quaternion* q = (Quaternion*)get_pointer(i);
  65. check_temporary(i, q);
  66. return *q;
  67. }
  68. Matrix4x4& LuaStack::get_matrix4x4(int i)
  69. {
  70. Matrix4x4* m = (Matrix4x4*)get_pointer(i);
  71. check_temporary(i, m);
  72. return *m;
  73. }
  74. Color4 LuaStack::get_color4(int i)
  75. {
  76. Quaternion q = get_quaternion(i);
  77. return color4(q.x, q.y, q.z, q.w);
  78. }
  79. void LuaStack::push_vector2(const Vector2& v)
  80. {
  81. push_vector3(vector3(v.x, v.y, 0.0f));
  82. }
  83. void LuaStack::push_vector3(const Vector3& v)
  84. {
  85. lua_pushlightuserdata(L, device()->lua_environment()->next_vector3(v));
  86. }
  87. void LuaStack::push_quaternion(const Quaternion& q)
  88. {
  89. lua_pushlightuserdata(L, device()->lua_environment()->next_quaternion(q));
  90. }
  91. void LuaStack::push_matrix4x4(const Matrix4x4& m)
  92. {
  93. lua_pushlightuserdata(L, device()->lua_environment()->next_matrix4x4(m));
  94. }
  95. void LuaStack::push_color4(const Color4& c)
  96. {
  97. // Color4 represented as Quaternion
  98. Quaternion q;
  99. q.x = c.x;
  100. q.y = c.y;
  101. q.z = c.z;
  102. q.w = c.w;
  103. push_quaternion(q);
  104. }
  105. void LuaStack::check_type(int i, const DebugLine* p)
  106. {
  107. if (!is_pointer(i) || *(uint32_t*)p != DebugLine::MARKER)
  108. luaL_typerror(L, i, "DebugLine");
  109. }
  110. void LuaStack::check_type(int i, const ResourcePackage* p)
  111. {
  112. if (!is_pointer(i) || *(uint32_t*)p != ResourcePackage::MARKER)
  113. luaL_typerror(L, i, "ResourcePackage");
  114. }
  115. void LuaStack::check_type(int i, const World* p)
  116. {
  117. if (!is_pointer(i) || *(uint32_t*)p != World::MARKER)
  118. luaL_typerror(L, i, "World");
  119. }
  120. void LuaStack::check_type(int i, const SceneGraph* p)
  121. {
  122. if (!is_pointer(i) || *(uint32_t*)p != SceneGraph::MARKER)
  123. luaL_typerror(L, i, "SceneGraph");
  124. }
  125. void LuaStack::check_type(int i, const RenderWorld* p)
  126. {
  127. if (!is_pointer(i) || *(uint32_t*)p != RenderWorld::MARKER)
  128. luaL_typerror(L, i, "RenderWorld");
  129. }
  130. void LuaStack::check_type(int i, const Level* p)
  131. {
  132. if (!is_pointer(i) || *(uint32_t*)p != Level::MARKER)
  133. luaL_typerror(L, i, "Level");
  134. }
  135. } // namespace crown