313 rader
8.7 KiB

  1. //
  2. // Lol Engine — Mesh viewer
  3. //
  4. // Copyright © 2003—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com>
  5. // © 2013—2018 Sam Hocevar <sam@hocevar.net>
  6. //
  7. // Lol Engine is free software. It comes without any warranty, to
  8. // the extent permitted by applicable law. You can redistribute it
  9. // and/or modify it under the terms of the Do What the Fuck You Want
  10. // to Public License, Version 2, as published by the WTFPL Task Force.
  11. // See http://www.wtfpl.net/ for more details.
  12. //
  13. #if HAVE_CONFIG_H
  14. # include "config.h"
  15. #endif
  16. #include <lol/engine.h>
  17. #include <lol/lua.h>
  18. #include <string>
  19. #include "scenesetup.h"
  20. namespace lol
  21. {
  22. //-----------------------------------------------------------------------------
  23. //CTor/DTor
  24. SceneSetup::SceneSetup(std::string const& name)
  25. {
  26. m_name = name;
  27. m_clear_color = vec4(vec3::zero, 1.f);
  28. m_show_gizmo = true;
  29. m_show_lights = true;
  30. }
  31. //----
  32. SceneSetup::~SceneSetup()
  33. {
  34. Shutdown(true);
  35. }
  36. //-----------------------------------------------------------------------------
  37. bool SceneSetup::Startup()
  38. {
  39. for (int i = 0; i < m_lights.count(); i++)
  40. Ticker::Ref(m_lights[i]);
  41. return true;
  42. }
  43. //-----------------------------------------------------------------------------
  44. bool SceneSetup::Shutdown(bool destroy)
  45. {
  46. for (int i = 0; i < m_lights.count(); i++)
  47. if (m_lights[i]->IsTicked())
  48. Ticker::Unref(m_lights[i]);
  49. if (destroy)
  50. m_lights.empty();
  51. return true;
  52. }
  53. //-----------------------------------------------------------------------------
  54. void SceneSetup::AddLight(LightType type)
  55. {
  56. m_last_cmd = SceneSetup::Command::AddLight;
  57. m_lights << new Light();
  58. m_lights.last()->SetType(type);
  59. }
  60. //-----------------------------------------------------------------------------
  61. void SceneSetup::SetupScene()
  62. {
  63. m_last_cmd = SceneSetup::Command::SetupScene;
  64. }
  65. //-----------------------------------------------------------------------------
  66. void SceneSetup::SetPosition(vec3 const& v)
  67. {
  68. switch (m_last_cmd.ToScalar())
  69. {
  70. case SceneSetup::Command::AddLight:
  71. m_lights.last()->SetPosition(v);
  72. break;
  73. }
  74. }
  75. //-----------------------------------------------------------------------------
  76. void SceneSetup::SetLookAt(vec3 const& v)
  77. {
  78. switch (m_last_cmd.ToScalar())
  79. {
  80. case SceneSetup::Command::AddLight:
  81. //TODO: Do better
  82. m_lights.last()->SetPosition(v - m_lights.last()->GetPosition());
  83. break;
  84. }
  85. }
  86. //-----------------------------------------------------------------------------
  87. void SceneSetup::SetColor(vec4 const& c)
  88. {
  89. switch (m_last_cmd.ToScalar())
  90. {
  91. case SceneSetup::Command::AddLight:
  92. m_lights.last()->SetColor(c);
  93. break;
  94. case SceneSetup::Command::SetupScene:
  95. m_clear_color = c;
  96. break;
  97. }
  98. }
  99. //-----------------------------------------------------------------------------
  100. void SceneSetup::Show(SceneSetup::Display const& d)
  101. {
  102. Set(d, DisplayFlag::On);
  103. }
  104. //-----------------------------------------------------------------------------
  105. void SceneSetup::Hide(SceneSetup::Display const& d)
  106. {
  107. Set(d, DisplayFlag::Off);
  108. }
  109. //-----------------------------------------------------------------------------
  110. void SceneSetup::Toggle(SceneSetup::Display const& d)
  111. {
  112. Set(d, DisplayFlag::Toggle);
  113. }
  114. //-----------------------------------------------------------------------------
  115. void SceneSetup::Set(SceneSetup::Display const& d, DisplayFlag const& f)
  116. {
  117. bool value = f == DisplayFlag::On ? true : false;
  118. switch (m_last_cmd.ToScalar())
  119. {
  120. case SceneSetup::Command::SetupScene:
  121. switch (d.ToScalar())
  122. {
  123. case SceneSetup::Display::Gizmo:
  124. m_show_gizmo = f == DisplayFlag::Toggle ? !m_show_gizmo : value;
  125. break;
  126. case SceneSetup::Display::Light:
  127. m_show_lights = f == DisplayFlag::Toggle ? !m_show_lights : value;
  128. break;
  129. }
  130. break;
  131. }
  132. }
  133. //-----------------------------------------------------------------------------
  134. SceneSetupLuaObject::SceneSetupLuaObject(std::string const& name) : LuaObject()
  135. {
  136. m_setup = new SceneSetup(name);
  137. SceneSetupLuaLoader::RegisterSetup(m_setup);
  138. }
  139. //-----------------------------------------------------------------------------
  140. SceneSetupLuaObject::~SceneSetupLuaObject()
  141. {
  142. }
  143. //-----------------------------------------------------------------------------
  144. SceneSetupLuaObject* SceneSetupLuaObject::New(lua_State* l, int arg_nb)
  145. {
  146. UNUSED(arg_nb);
  147. auto s = LuaStack::Begin(l);
  148. auto n = s.Get<std::string>();
  149. return new SceneSetupLuaObject(n);
  150. }
  151. //-- Setup command ------------------------------------------------------------
  152. int SceneSetupLuaObject::AddLight(lua_State* l)
  153. {
  154. auto s = LuaStack::Begin(l);
  155. auto o = s.GetPtr<SceneSetupLuaObject>();
  156. auto t = s.Get<std::string>();
  157. o->m_setup->AddLight(FindValue<LightType>(t));
  158. return s.End();
  159. }
  160. int SceneSetupLuaObject::SetupScene(lua_State* l)
  161. {
  162. auto s = LuaStack::Begin(l);
  163. auto o = s.GetPtr<SceneSetupLuaObject>();
  164. o->m_setup->SetupScene();
  165. return s.End();
  166. }
  167. //-- main funcs ---------------------------------------------------------------
  168. int SceneSetupLuaObject::SetPosition(lua_State* l)
  169. {
  170. auto s = LuaStack::Begin(l);
  171. auto o = s.GetPtr<SceneSetupLuaObject>();
  172. auto c = s.Get<vec3>();
  173. o->m_setup->SetPosition(c);
  174. return s.End();
  175. }
  176. int SceneSetupLuaObject::SetLookAt(lua_State* l)
  177. {
  178. auto s = LuaStack::Begin(l);
  179. auto o = s.GetPtr<SceneSetupLuaObject>();
  180. auto c = s.Get<vec3>();
  181. o->m_setup->SetLookAt(c);
  182. return s.End();
  183. }
  184. int SceneSetupLuaObject::SetColor(lua_State* l)
  185. {
  186. auto s = LuaStack::Begin(l);
  187. auto o = s.GetPtr<SceneSetupLuaObject>();
  188. auto c = s.Get<vec4>();
  189. o->m_setup->SetColor(c);
  190. return s.End();
  191. }
  192. int SceneSetupLuaObject::Show(lua_State* l)
  193. {
  194. auto s = LuaStack::Begin(l);
  195. auto o = s.GetPtr<SceneSetupLuaObject>();
  196. auto e = s.GetEnum<SceneSetup::DisplayBase>();
  197. o->m_setup->Show(e);
  198. return s.End();
  199. }
  200. int SceneSetupLuaObject::Hide(lua_State* l)
  201. {
  202. auto s = LuaStack::Begin(l);
  203. auto o = s.GetPtr<SceneSetupLuaObject>();
  204. auto e = s.GetEnum<SceneSetup::DisplayBase>();
  205. o->m_setup->Hide(e);
  206. return s.End();
  207. }
  208. int SceneSetupLuaObject::Toggle(lua_State* l)
  209. {
  210. auto s = LuaStack::Begin(l);
  211. auto o = s.GetPtr<SceneSetupLuaObject>();
  212. auto e = s.GetEnum<SceneSetup::DisplayBase>();
  213. o->m_setup->Toggle(e);
  214. return s.End();
  215. }
  216. //-----------------------------------------------------------------------------
  217. const LuaObjectLibrary* SceneSetupLuaObject::GetLib()
  218. {
  219. typedef SceneSetupLuaObject SSLO;
  220. static const LuaObjectLibrary lib = LuaObjectLibrary(
  221. "SceneSetup",
  222. //Statics
  223. { { nullptr, nullptr } },
  224. //Methods
  225. {
  226. //-----------------------------------------------------------------
  227. { "AddLight", AddLight },
  228. { "Setup", SetupScene },
  229. //-- main funcs
  230. { "Position", SetPosition },
  231. { "LookAt", SetLookAt },
  232. { "Color", SetColor },
  233. { "Show", Show },
  234. { "Hide", Hide },
  235. { "Toggle", Toggle },
  236. },
  237. //Variables
  238. { { nullptr, nullptr, nullptr } });
  239. return &lib;
  240. }
  241. //-----------------------------------------------------------------------------
  242. map<std::string, SceneSetup*> SceneSetupLuaLoader::m_setups;
  243. SceneSetupLuaLoader::SceneSetupLuaLoader() : LuaLoader()
  244. {
  245. lua_State* l = GetLuaState();
  246. LuaObjectHelper::Register<SceneSetupLuaObject>(l);
  247. }
  248. //-----------------------------------------------------------------------------
  249. SceneSetupLuaLoader::~SceneSetupLuaLoader() { }
  250. //-----------------------------------------------------------------------------
  251. static array<SceneSetupLuaObject*> g_instances;
  252. void SceneSetupLuaLoader::Store(LuaObject* obj)
  253. {
  254. SceneSetupLuaObject* ezm = static_cast<SceneSetupLuaObject*>(obj);
  255. g_instances << ezm;
  256. }
  257. //-----------------------------------------------------------------------------
  258. array<SceneSetupLuaObject*>& SceneSetupLuaLoader::GetInstances()
  259. {
  260. return g_instances;
  261. }
  262. //-----------------------------------------------------------------------------
  263. void SceneSetupLuaLoader::RegisterSetup(SceneSetup* setup)
  264. {
  265. m_setups[setup->m_name] = setup;
  266. }
  267. //-----------------------------------------------------------------------------
  268. bool SceneSetupLuaLoader::GetRegisteredSetups(map<std::string, SceneSetup*>& setups)
  269. {
  270. setups = m_setups;
  271. return !!m_setups.count();
  272. }
  273. //-----------------------------------------------------------------------------
  274. bool SceneSetupLuaLoader::GetLoadedSetups(map<std::string, SceneSetup*>& setups)
  275. {
  276. return GetRegisteredSetups(setups);
  277. }
  278. } /* namespace lol */