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.
 
 
 

309 lines
8.5 KiB

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