LuaScript.cpp 72 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025
  1. #include <ImGuiFileDialog/ImGuiFileDialog.h>
  2. #include "ComponentConstructorInfo.h"
  3. #include "GUISystem.h"
  4. #include "LuaScript.h"
  5. #include "Loaders.h"
  6. namespace LuaDefinitions
  7. {
  8. DEFINE_ENUM(UserTypes, LUA_USER_TYPES)
  9. DEFINE_ENUM(SpatialChanges, LUA_SPATIAL_CHANGES)
  10. }
  11. LuaScript::~LuaScript()
  12. {
  13. terminate();
  14. }
  15. void LuaScript::terminate()
  16. {
  17. // Unbind all created key commands
  18. for(decltype(m_keyCommands.size()) i = 0; i < m_keyCommands.size(); i++)
  19. {
  20. if(m_keyCommands[i].second != nullptr)
  21. {
  22. m_keyCommands[i].second->unbindAll();
  23. delete m_keyCommands[i].second;
  24. }
  25. }
  26. m_keyCommands.clear();
  27. // Delete all created conditionals
  28. for(decltype(m_conditionals.size()) i = 0; i < m_conditionals.size(); i++)
  29. delete m_conditionals[i];
  30. m_conditionals.clear();
  31. // Delete all created component construction info objects
  32. for(decltype(m_componentsConstructionInfo.size()) i = 0; i < m_componentsConstructionInfo.size(); i++)
  33. {
  34. m_componentsConstructionInfo[i]->deleteConstructionInfo();
  35. delete m_componentsConstructionInfo[i];
  36. }
  37. m_componentsConstructionInfo.clear();
  38. }
  39. void LuaScript::setDefinitions()
  40. {
  41. // Create a table for user types that are supported by Lua scripts
  42. m_userTypesTable = m_luaState[Config::scriptVar().userTypeTableName].get_or_create<sol::table>();
  43. // Create a table for error types
  44. sol::table errorTypes = m_luaState["ErrorType"].get_or_create<sol::table>();
  45. for(unsigned int i = 0; i < ErrorType::NumberOfErrorTypes; i++)
  46. errorTypes[sol::update_if_empty][GetString(static_cast<ErrorType>(i))] = i;
  47. // Create a table for error codes
  48. sol::table errorCodes = m_luaState["ErrorCode"].get_or_create<sol::table>();
  49. for(unsigned int i = 0; i < ErrorCode::NumberOfErrorCodes; i++)
  50. errorCodes[sol::update_if_empty][GetString(static_cast<ErrorCode>(i))] = i;
  51. // Create a table for error sources
  52. sol::table errorSources = m_luaState["ErrorSource"].get_or_create<sol::table>();
  53. for(unsigned int i = 0; i < ErrorSource::Source_NumberOfErrorSources; i++)
  54. errorSources[sol::update_if_empty][GetString(static_cast<ErrorSource>(i))] = i;
  55. // Create a table for ImGUI window flags
  56. sol::table imGuiWindowFlag = m_luaState["ImGuiWindowFlags"].get_or_create<sol::table>();
  57. imGuiWindowFlag[sol::update_if_empty]["None"] = ImGuiWindowFlags_::ImGuiWindowFlags_None;
  58. imGuiWindowFlag[sol::update_if_empty]["NoTitleBar"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoTitleBar;
  59. imGuiWindowFlag[sol::update_if_empty]["NoResize"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoResize;
  60. imGuiWindowFlag[sol::update_if_empty]["NoMove"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoMove;
  61. imGuiWindowFlag[sol::update_if_empty]["NoScrollbar"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoScrollbar;
  62. imGuiWindowFlag[sol::update_if_empty]["NoScrollWithMouse"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoScrollWithMouse;
  63. imGuiWindowFlag[sol::update_if_empty]["NoCollapse"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoCollapse;
  64. imGuiWindowFlag[sol::update_if_empty]["AlwaysAutoResize"] = ImGuiWindowFlags_::ImGuiWindowFlags_AlwaysAutoResize;
  65. imGuiWindowFlag[sol::update_if_empty]["NoBackground"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoBackground;
  66. imGuiWindowFlag[sol::update_if_empty]["NoSavedSettings"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoSavedSettings;
  67. imGuiWindowFlag[sol::update_if_empty]["NoMouseInputs"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoMouseInputs;
  68. imGuiWindowFlag[sol::update_if_empty]["MenuBar"] = ImGuiWindowFlags_::ImGuiWindowFlags_MenuBar;
  69. imGuiWindowFlag[sol::update_if_empty]["HorizontalScrollbar"] = ImGuiWindowFlags_::ImGuiWindowFlags_HorizontalScrollbar;
  70. imGuiWindowFlag[sol::update_if_empty]["NoFocusOnAppearing"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoFocusOnAppearing;
  71. imGuiWindowFlag[sol::update_if_empty]["NoBringToFrontOnFocus"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoBringToFrontOnFocus;
  72. imGuiWindowFlag[sol::update_if_empty]["AlwaysVerticalScrollbar"] = ImGuiWindowFlags_::ImGuiWindowFlags_AlwaysVerticalScrollbar;
  73. imGuiWindowFlag[sol::update_if_empty]["AlwaysHorizontalScrollbar"] = ImGuiWindowFlags_::ImGuiWindowFlags_AlwaysHorizontalScrollbar;
  74. imGuiWindowFlag[sol::update_if_empty]["AlwaysUseWindowPadding"] = ImGuiWindowFlags_::ImGuiWindowFlags_AlwaysUseWindowPadding;
  75. imGuiWindowFlag[sol::update_if_empty]["NoNavInputs"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoNavInputs;
  76. imGuiWindowFlag[sol::update_if_empty]["NoNavFocus"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoNavFocus;
  77. imGuiWindowFlag[sol::update_if_empty]["UnsavedDocument"] = ImGuiWindowFlags_::ImGuiWindowFlags_UnsavedDocument;
  78. imGuiWindowFlag[sol::update_if_empty]["NoNav"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoNav;
  79. imGuiWindowFlag[sol::update_if_empty]["NoDecoration"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoDecoration;
  80. imGuiWindowFlag[sol::update_if_empty]["NoInputs"] = ImGuiWindowFlags_::ImGuiWindowFlags_NoInputs;
  81. // Create a table for ImGUI color flags
  82. sol::table imGuiColFlag = m_luaState["ImGuiCol"].get_or_create<sol::table>();
  83. imGuiColFlag[sol::update_if_empty]["Text"] = ImGuiCol_::ImGuiCol_Text;
  84. imGuiColFlag[sol::update_if_empty]["TextDisabled"] = ImGuiCol_::ImGuiCol_TextDisabled;
  85. imGuiColFlag[sol::update_if_empty]["WindowBg"] = ImGuiCol_::ImGuiCol_WindowBg;
  86. imGuiColFlag[sol::update_if_empty]["ChildBg"] = ImGuiCol_::ImGuiCol_ChildBg;
  87. imGuiColFlag[sol::update_if_empty]["PopupBg"] = ImGuiCol_::ImGuiCol_PopupBg;
  88. imGuiColFlag[sol::update_if_empty]["Border"] = ImGuiCol_::ImGuiCol_Border;
  89. imGuiColFlag[sol::update_if_empty]["BorderShadow"] = ImGuiCol_::ImGuiCol_BorderShadow;
  90. imGuiColFlag[sol::update_if_empty]["FrameBg"] = ImGuiCol_::ImGuiCol_FrameBg;
  91. imGuiColFlag[sol::update_if_empty]["FrameBgHovered"] = ImGuiCol_::ImGuiCol_FrameBgHovered;
  92. imGuiColFlag[sol::update_if_empty]["FrameBgActive"] = ImGuiCol_::ImGuiCol_FrameBgActive;
  93. imGuiColFlag[sol::update_if_empty]["TitleBg"] = ImGuiCol_::ImGuiCol_TitleBg;
  94. imGuiColFlag[sol::update_if_empty]["TitleBgActive"] = ImGuiCol_::ImGuiCol_TitleBgActive;
  95. imGuiColFlag[sol::update_if_empty]["TitleBgCollapsed"] = ImGuiCol_::ImGuiCol_TitleBgCollapsed;
  96. imGuiColFlag[sol::update_if_empty]["MenuBarBg"] = ImGuiCol_::ImGuiCol_MenuBarBg;
  97. imGuiColFlag[sol::update_if_empty]["ScrollbarBg"] = ImGuiCol_::ImGuiCol_ScrollbarBg;
  98. imGuiColFlag[sol::update_if_empty]["ScrollbarGrab"] = ImGuiCol_::ImGuiCol_ScrollbarGrab;
  99. imGuiColFlag[sol::update_if_empty]["ScrollbarGrabHovered"] = ImGuiCol_::ImGuiCol_ScrollbarGrabHovered;
  100. imGuiColFlag[sol::update_if_empty]["ScrollbarGrabActive"] = ImGuiCol_::ImGuiCol_ScrollbarGrabActive;
  101. imGuiColFlag[sol::update_if_empty]["CheckMark"] = ImGuiCol_::ImGuiCol_CheckMark;
  102. imGuiColFlag[sol::update_if_empty]["SliderGrab"] = ImGuiCol_::ImGuiCol_SliderGrab;
  103. imGuiColFlag[sol::update_if_empty]["SliderGrabActive"] = ImGuiCol_::ImGuiCol_SliderGrabActive;
  104. imGuiColFlag[sol::update_if_empty]["Button"] = ImGuiCol_::ImGuiCol_Button;
  105. imGuiColFlag[sol::update_if_empty]["ButtonHovered"] = ImGuiCol_::ImGuiCol_ButtonHovered;
  106. imGuiColFlag[sol::update_if_empty]["ButtonActive"] = ImGuiCol_::ImGuiCol_ButtonActive;
  107. imGuiColFlag[sol::update_if_empty]["Header"] = ImGuiCol_::ImGuiCol_Header;
  108. imGuiColFlag[sol::update_if_empty]["HeaderHovered"] = ImGuiCol_::ImGuiCol_HeaderHovered;
  109. imGuiColFlag[sol::update_if_empty]["HeaderActive"] = ImGuiCol_::ImGuiCol_HeaderActive;
  110. imGuiColFlag[sol::update_if_empty]["Separator"] = ImGuiCol_::ImGuiCol_Separator;
  111. imGuiColFlag[sol::update_if_empty]["SeparatorHovered"] = ImGuiCol_::ImGuiCol_SeparatorHovered;
  112. imGuiColFlag[sol::update_if_empty]["SeparatorActive"] = ImGuiCol_::ImGuiCol_SeparatorActive;
  113. imGuiColFlag[sol::update_if_empty]["ResizeGrip"] = ImGuiCol_::ImGuiCol_ResizeGrip;
  114. imGuiColFlag[sol::update_if_empty]["ResizeGripHovered"] = ImGuiCol_::ImGuiCol_ResizeGripHovered;
  115. imGuiColFlag[sol::update_if_empty]["ResizeGripActive"] = ImGuiCol_::ImGuiCol_ResizeGripActive;
  116. imGuiColFlag[sol::update_if_empty]["Tab"] = ImGuiCol_::ImGuiCol_Tab;
  117. imGuiColFlag[sol::update_if_empty]["TabHovered"] = ImGuiCol_::ImGuiCol_TabHovered;
  118. imGuiColFlag[sol::update_if_empty]["TabActive"] = ImGuiCol_::ImGuiCol_TabActive;
  119. imGuiColFlag[sol::update_if_empty]["TabUnfocused"] = ImGuiCol_::ImGuiCol_TabUnfocused;
  120. imGuiColFlag[sol::update_if_empty]["TabUnfocusedActive"] = ImGuiCol_::ImGuiCol_TabUnfocusedActive;
  121. imGuiColFlag[sol::update_if_empty]["PlotLines"] = ImGuiCol_::ImGuiCol_PlotLines;
  122. imGuiColFlag[sol::update_if_empty]["PlotLinesHovered"] = ImGuiCol_::ImGuiCol_PlotLinesHovered;
  123. imGuiColFlag[sol::update_if_empty]["PlotHistogram"] = ImGuiCol_::ImGuiCol_PlotHistogram;
  124. imGuiColFlag[sol::update_if_empty]["PlotHistogramHovered"] = ImGuiCol_::ImGuiCol_PlotHistogramHovered;
  125. imGuiColFlag[sol::update_if_empty]["TableHeaderBg"] = ImGuiCol_::ImGuiCol_TableHeaderBg;
  126. imGuiColFlag[sol::update_if_empty]["TableBorderStrong"] = ImGuiCol_::ImGuiCol_TableBorderStrong;
  127. imGuiColFlag[sol::update_if_empty]["TableBorderLight"] = ImGuiCol_::ImGuiCol_TableBorderLight;
  128. imGuiColFlag[sol::update_if_empty]["TableRowBg"] = ImGuiCol_::ImGuiCol_TableRowBg;
  129. imGuiColFlag[sol::update_if_empty]["TableRowBgAlt"] = ImGuiCol_::ImGuiCol_TableRowBgAlt;
  130. imGuiColFlag[sol::update_if_empty]["TextSelectedBg"] = ImGuiCol_::ImGuiCol_TextSelectedBg;
  131. imGuiColFlag[sol::update_if_empty]["DragDropTarget"] = ImGuiCol_::ImGuiCol_DragDropTarget;
  132. imGuiColFlag[sol::update_if_empty]["NavHighlight"] = ImGuiCol_::ImGuiCol_NavHighlight;
  133. imGuiColFlag[sol::update_if_empty]["NavWindowingHighlight"] = ImGuiCol_::ImGuiCol_NavWindowingHighlight;
  134. imGuiColFlag[sol::update_if_empty]["NavWindowingDimBg"] = ImGuiCol_::ImGuiCol_NavWindowingDimBg;
  135. imGuiColFlag[sol::update_if_empty]["ModalWindowDimBg"] = ImGuiCol_::ImGuiCol_ModalWindowDimBg;
  136. // Create a table for ImGUI file dialog flags
  137. sol::table imGuiFileDialogFlag = m_luaState["ImGuiStyleVar"].get_or_create<sol::table>();
  138. imGuiFileDialogFlag[sol::update_if_empty]["ConfirmOverwrite"] = ImGuiFileDialogFlags_::ImGuiFileDialogFlags_ConfirmOverwrite;
  139. imGuiFileDialogFlag[sol::update_if_empty]["DontShowHiddenFiles"] = ImGuiFileDialogFlags_::ImGuiFileDialogFlags_DontShowHiddenFiles;
  140. imGuiFileDialogFlag[sol::update_if_empty]["DisableCreateDirectoryButton"] = ImGuiFileDialogFlags_::ImGuiFileDialogFlags_DisableCreateDirectoryButton;
  141. imGuiFileDialogFlag[sol::update_if_empty]["HideColumnType"] = ImGuiFileDialogFlags_::ImGuiFileDialogFlags_HideColumnType;
  142. imGuiFileDialogFlag[sol::update_if_empty]["HideColumnSize"] = ImGuiFileDialogFlags_::ImGuiFileDialogFlags_HideColumnSize;
  143. imGuiFileDialogFlag[sol::update_if_empty]["HideColumnDate"] = ImGuiFileDialogFlags_::ImGuiFileDialogFlags_HideColumnDate;
  144. imGuiFileDialogFlag[sol::update_if_empty]["NoDialog"] = ImGuiFileDialogFlags_::ImGuiFileDialogFlags_NoDialog;
  145. imGuiFileDialogFlag[sol::update_if_empty]["ReadOnlyFileNameField"] = ImGuiFileDialogFlags_::ImGuiFileDialogFlags_ReadOnlyFileNameField;
  146. imGuiFileDialogFlag[sol::update_if_empty]["CaseInsensitiveExtention"] = ImGuiFileDialogFlags_::ImGuiFileDialogFlags_CaseInsensitiveExtention;
  147. // Create a table for ImGUI style flags
  148. sol::table imGuiStyleFlag = m_luaState["ImGuiStyleVar"].get_or_create<sol::table>();
  149. imGuiStyleFlag[sol::update_if_empty]["Alpha"] = ImGuiStyleVar_::ImGuiStyleVar_Alpha;
  150. imGuiStyleFlag[sol::update_if_empty]["DisabledAlpha"] = ImGuiStyleVar_::ImGuiStyleVar_DisabledAlpha;
  151. imGuiStyleFlag[sol::update_if_empty]["WindowPadding"] = ImGuiStyleVar_::ImGuiStyleVar_WindowPadding;
  152. imGuiStyleFlag[sol::update_if_empty]["WindowRounding"] = ImGuiStyleVar_::ImGuiStyleVar_WindowRounding;
  153. imGuiStyleFlag[sol::update_if_empty]["WindowBorderSize"] = ImGuiStyleVar_::ImGuiStyleVar_WindowBorderSize;
  154. imGuiStyleFlag[sol::update_if_empty]["WindowMinSize"] = ImGuiStyleVar_::ImGuiStyleVar_WindowMinSize;
  155. imGuiStyleFlag[sol::update_if_empty]["WindowTitleAlign"] = ImGuiStyleVar_::ImGuiStyleVar_WindowTitleAlign;
  156. imGuiStyleFlag[sol::update_if_empty]["ChildRounding"] = ImGuiStyleVar_::ImGuiStyleVar_ChildRounding;
  157. imGuiStyleFlag[sol::update_if_empty]["ChildBorderSize"] = ImGuiStyleVar_::ImGuiStyleVar_ChildBorderSize;
  158. imGuiStyleFlag[sol::update_if_empty]["PopupRounding"] = ImGuiStyleVar_::ImGuiStyleVar_PopupRounding;
  159. imGuiStyleFlag[sol::update_if_empty]["PopupBorderSize"] = ImGuiStyleVar_::ImGuiStyleVar_PopupBorderSize;
  160. imGuiStyleFlag[sol::update_if_empty]["FramePadding"] = ImGuiStyleVar_::ImGuiStyleVar_FramePadding;
  161. imGuiStyleFlag[sol::update_if_empty]["FrameRounding"] = ImGuiStyleVar_::ImGuiStyleVar_FrameRounding;
  162. imGuiStyleFlag[sol::update_if_empty]["FrameBorderSize"] = ImGuiStyleVar_::ImGuiStyleVar_FrameBorderSize;
  163. imGuiStyleFlag[sol::update_if_empty]["ItemSpacing"] = ImGuiStyleVar_::ImGuiStyleVar_ItemSpacing;
  164. imGuiStyleFlag[sol::update_if_empty]["ItemInnerSpacing"] = ImGuiStyleVar_::ImGuiStyleVar_ItemInnerSpacing;
  165. imGuiStyleFlag[sol::update_if_empty]["IndentSpacing"] = ImGuiStyleVar_::ImGuiStyleVar_IndentSpacing;
  166. imGuiStyleFlag[sol::update_if_empty]["CellPadding"] = ImGuiStyleVar_::ImGuiStyleVar_CellPadding;
  167. imGuiStyleFlag[sol::update_if_empty]["ScrollbarSize"] = ImGuiStyleVar_::ImGuiStyleVar_ScrollbarSize;
  168. imGuiStyleFlag[sol::update_if_empty]["ScrollbarRounding"] = ImGuiStyleVar_::ImGuiStyleVar_ScrollbarRounding;
  169. imGuiStyleFlag[sol::update_if_empty]["GrabMinSize"] = ImGuiStyleVar_::ImGuiStyleVar_GrabMinSize;
  170. imGuiStyleFlag[sol::update_if_empty]["GrabRounding"] = ImGuiStyleVar_::ImGuiStyleVar_GrabRounding;
  171. imGuiStyleFlag[sol::update_if_empty]["TabRounding"] = ImGuiStyleVar_::ImGuiStyleVar_TabRounding;
  172. imGuiStyleFlag[sol::update_if_empty]["ButtonTextAlign"] = ImGuiStyleVar_::ImGuiStyleVar_ButtonTextAlign;
  173. imGuiStyleFlag[sol::update_if_empty]["SelectableTextAlign"] = ImGuiStyleVar_::ImGuiStyleVar_SelectableTextAlign;
  174. // Create a table for ImGui fonts
  175. sol::table imGuiFont = m_luaState["ImGuiFont"].get_or_create<sol::table>();
  176. imGuiFont[sol::update_if_empty]["Default"] = GuiFontType::GuiFontType_Default;
  177. imGuiFont[sol::update_if_empty]["AboutWindow"] = GuiFontType::GuiFontType_AboutWindow;
  178. // Add each object type to the user type table
  179. for(int i = 0; i < LuaDefinitions::UserTypes::NumOfTypes; i++)
  180. m_userTypesTable[sol::update_if_empty][GetString(static_cast<LuaDefinitions::UserTypes>(i))] = i;
  181. // Create a table for different types of changes
  182. m_changeTypesTable = m_luaState["Changes"].get_or_create<sol::table>();
  183. // Create entries for AUDIO changes
  184. m_changeTypesTable[sol::update_if_empty]["Audio"]["Volume"] = Int64Packer(Systems::Changes::Audio::Volume);
  185. // Create entries for GUI changes
  186. m_changeTypesTable[sol::update_if_empty]["GUI"]["Sequence"] = Int64Packer(Systems::Changes::GUI::Sequence);
  187. // Create entries for PHYSICS changes
  188. sol::table physicsChanges = m_changeTypesTable["Physics"].get_or_create<sol::table>();
  189. physicsChanges[sol::update_if_empty]["Impulse"] = Int64Packer(Systems::Changes::Physics::Impulse);
  190. physicsChanges[sol::update_if_empty]["Torque"] = Int64Packer(Systems::Changes::Physics::Torque);
  191. }
  192. void LuaScript::setFunctions()
  193. {
  194. // Change controller functions
  195. m_luaState.set_function("sendData", [this](const Systems::TypeID p_v1, const DataType p_v2, bool p_v3) -> const void { m_scriptScene->getSceneLoader()->getChangeController()->sendData(m_scriptScene->getSceneLoader()->getSystemScene(p_v1), p_v2, (void *)p_v3, false); });
  196. m_luaState.set_function("sendChange", sol::overload(
  197. [this](SystemObject *p_observer, const Int64Packer &p_changeType, const bool p_v1) -> const void { this->queueChange(p_observer, p_changeType.get(), p_v1); },
  198. [this](SystemObject *p_observer, const Int64Packer &p_changeType, const int p_v1) -> const void { this->queueChange(p_observer, p_changeType.get(), p_v1); },
  199. [this](SystemObject *p_observer, const Int64Packer &p_changeType, const float p_v1) -> const void { this->queueChange(p_observer, p_changeType.get(), p_v1); },
  200. [this](SystemObject *p_observer, const Int64Packer &p_changeType, const glm::vec3 p_v1) -> const void { this->queueChange(p_observer, p_changeType.get(), p_v1); },
  201. [this](SystemObject *p_observer, const Int64Packer &p_changeType, const std::string &p_v1) -> const void { this->queueChange(p_observer, p_changeType.get(), p_v1); }));
  202. // Entity functions
  203. m_luaState.set_function("getEntityID", [this](const std::string &p_filename) -> EntityID { return static_cast<WorldScene *>(m_scriptScene->getSceneLoader()->getSystemScene(Systems::World))->getEntity(p_filename); });
  204. m_luaState.set_function("isEntityIDValid", [](const EntityID p_entityID) -> bool { return p_entityID != NULL_ENTITY_ID; });
  205. m_luaState.set_function("createEntity", [this](const ComponentsConstructionInfo &p_constructionInfo) -> EntityID { return static_cast<WorldScene *>(m_scriptScene->getSceneLoader()->getSystemScene(Systems::World))->createEntity(p_constructionInfo); });
  206. m_luaState.set_function("importPrefab", sol::overload(
  207. [this](ComponentsConstructionInfo &p_constructionInfo, const std::string &p_filename) -> bool { return m_scriptScene->getSceneLoader()->importPrefab(p_constructionInfo, p_filename, false) == ErrorCode::Success; },
  208. [this](ComponentsConstructionInfo &p_constructionInfo, const std::string &p_filename, const bool p_forceReload) -> bool { return m_scriptScene->getSceneLoader()->importPrefab(p_constructionInfo, p_filename, p_forceReload) == ErrorCode::Success; }));
  209. // Entity component functions
  210. m_luaState.set_function("getRigidBodyComponent", [this](const EntityID p_entityID) -> RigidBodyComponent *{ return static_cast<WorldScene *>(m_scriptScene->getSceneLoader()->getSystemScene(Systems::World))->getEntityRegistry().try_get<RigidBodyComponent>(p_entityID); });
  211. m_luaState.set_function("getSoundComponent", [this](const EntityID p_entityID) -> SoundComponent *{ return static_cast<WorldScene *>(m_scriptScene->getSceneLoader()->getSystemScene(Systems::World))->getEntityRegistry().try_get<SoundComponent>(p_entityID); });
  212. m_luaState.set_function("getSpatialComponent", [this](const EntityID p_entityID) -> SpatialComponent *{ return static_cast<WorldScene *>(m_scriptScene->getSceneLoader()->getSystemScene(Systems::World))->getEntityRegistry().try_get<SpatialComponent>(p_entityID); });
  213. // Entity component system object functions
  214. m_luaState.set_function("getRigidBodyComponentSystemObject", [this](const EntityID p_entityID) -> SystemObject *{ return static_cast<WorldScene *>(m_scriptScene->getSceneLoader()->getSystemScene(Systems::World))->getEntityRegistry().try_get<RigidBodyComponent>(p_entityID); });
  215. m_luaState.set_function("getSoundComponentSystemObject", [this](const EntityID p_entityID) -> SystemObject * { return static_cast<WorldScene *>(m_scriptScene->getSceneLoader()->getSystemScene(Systems::World))->getEntityRegistry().try_get<SoundComponent>(p_entityID); });
  216. m_luaState.set_function("getSpatialComponentSystemObject", [this](const EntityID p_entityID) -> SystemObject *{ return static_cast<WorldScene *>(m_scriptScene->getSceneLoader()->getSystemScene(Systems::World))->getEntityRegistry().try_get<SpatialComponent>(p_entityID); });
  217. // Engine functions
  218. m_luaState.set_function("setEngineRunning", [](const bool p_v1) -> const void {Config::m_engineVar.running = p_v1; });
  219. m_luaState.set_function("setEngineState", [this](const EngineStateType p_v1) -> const void { m_scriptScene->getSceneLoader()->getChangeController()->sendEngineChange(EngineChangeData(EngineChangeType::EngineChangeType_StateChange, p_v1)); });
  220. m_luaState.set_function("getEngineState", [this]() -> EngineStateType { return m_scriptScene->getSceneLoader()->getEngineState(); });
  221. m_luaState.set_function("sendEngineChange", sol::overload([this](const EngineChangeType p_v1) -> const void { m_scriptScene->getSceneLoader()->getChangeController()->sendEngineChange(EngineChangeData(p_v1)); },
  222. [this](const EngineChangeType p_v1, const EngineStateType p_v2) -> const void { m_scriptScene->getSceneLoader()->getChangeController()->sendEngineChange(EngineChangeData(p_v1, p_v2)); },
  223. [this](const EngineChangeType p_v1, const EngineStateType p_v2, const std::string p_v3) -> const void { m_scriptScene->getSceneLoader()->getChangeController()->sendEngineChange(EngineChangeData(p_v1, p_v2, p_v3)); }));
  224. // Error handler functions
  225. auto errorTable = m_luaState.create_table("ErrHandlerLoc");
  226. errorTable.set_function("log", sol::overload(
  227. [this](const ErrorCode p_v1) -> const void { ErrHandlerLoc::get().log(p_v1); },
  228. [this](const ErrorCode p_v1, const ErrorSource p_v2) -> const void { ErrHandlerLoc::get().log(p_v1, p_v2); },
  229. [this](const ErrorCode p_v1, const std::string p_v2, const ErrorSource p_v3) -> const void { ErrHandlerLoc::get().log(p_v1, p_v2, p_v3); }));
  230. errorTable.set_function("logErrorType", sol::overload(
  231. [this](const ErrorType p_v1, const std::string p_v2) -> const void { ErrHandlerLoc::get().log(p_v1, ErrorSource::Source_LuaScript, p_v2); },
  232. [this](const ErrorType p_v1, const ErrorSource p_v2, const std::string p_v3) -> const void { ErrHandlerLoc::get().log(p_v1, p_v2, p_v3); }));
  233. errorTable.set_function("logErrorCode", sol::overload(
  234. [this](const ErrorCode p_v1, const std::string p_v2) -> const void { ErrHandlerLoc::get().log(p_v1, ErrorSource::Source_LuaScript, p_v2); },
  235. [this](const ErrorCode p_v1, const ErrorSource p_v2, const std::string p_v3) -> const void { ErrHandlerLoc::get().log(p_v1, p_v2, p_v3); }));
  236. // GUI functions
  237. auto GUITable = m_luaState.create_table("GUI");
  238. GUITable.set_function("Begin", sol::overload([this](const std::string &p_v1) -> const void { m_GUIData.addFunctor([=] { ImGui::Begin(p_v1.c_str()); }); },
  239. [this](const std::string &p_v1, const int p_v2) -> const void { m_GUIData.addFunctor([=] { ImGui::Begin(p_v1.c_str(), 0, p_v2); }); },
  240. [this](const std::string &p_v1, Conditional *p_v2, const int p_v3) -> const void { m_GUIData.addFunctor([=] { ImGui::Begin(p_v1.c_str(), &p_v2->m_flag, p_v3); }); }));
  241. GUITable.set_function("BeginChild", sol::overload([this](const std::string &p_v1) -> const void { m_GUIData.addFunctor([=] { ImGui::BeginChild(p_v1.c_str()); }); },
  242. [this](const std::string &p_v1, const glm::vec2 p_size) -> const void { m_GUIData.addFunctor([=] { ImGui::BeginChild(p_v1.c_str(), ImVec2(p_size.x, p_size.y)); }); },
  243. [this](const std::string &p_v1, const glm::vec2 p_size, const bool p_border) -> const void { m_GUIData.addFunctor([=] { ImGui::BeginChild(p_v1.c_str(), ImVec2(p_size.x, p_size.y), p_border); }); },
  244. [this](const std::string &p_v1, const glm::vec2 p_size, const bool p_border, const int p_flags) -> const void { m_GUIData.addFunctor([=] { ImGui::BeginChild(p_v1.c_str(), ImVec2(p_size.x, p_size.y), p_border, p_flags); }); }));
  245. GUITable.set_function("BeginMenu", [this](const std::string &p_v1) -> const void { m_GUIData.addFunctor([=] { ImGui::BeginMenu(p_v1.c_str()); }); });
  246. GUITable.set_function("Button", sol::overload([this](const std::string &p_v1, Conditional *p_v2) -> void { m_GUIData.addFunctor([=] { p_v2->m_flag = ImGui::Button(p_v1.c_str()); }); },
  247. [this](const std::string &p_v1, const float p_v2, const float p_v3, Conditional *p_v4) -> void { m_GUIData.addFunctor([=] { p_v4->m_flag = ImGui::Button(p_v1.c_str(), ImVec2(p_v2, p_v3)); }); }));
  248. GUITable.set_function("CalcTextSize", [this](const std::string &p_v1) -> const glm::vec2 { const auto textSize = ImGui::CalcTextSize(p_v1.c_str()); return glm::vec2(textSize.x, textSize.y); });
  249. GUITable.set_function("Checkbox", [this](const std::string &p_v1, Conditional *p_v2) -> void { m_GUIData.addFunctor([=] { ImGui::Checkbox(p_v1.c_str(), &p_v2->m_flag); }); });
  250. GUITable.set_function("ColorEdit3", [this](const std::string &p_v1, glm::vec3 *p_v2) -> void { m_GUIData.addFunctor([=] { ImGui::ColorEdit3(p_v1.c_str(), &(p_v2->x)); }); });
  251. GUITable.set_function("ColorEdit4", [this](const std::string &p_v1, glm::vec4 *p_v2) -> void { m_GUIData.addFunctor([=] { ImGui::ColorEdit4(p_v1.c_str(), &(p_v2->x)); }); });
  252. GUITable.set_function("End", [this]() -> const void { m_GUIData.addFunctor([=] { ImGui::End(); }); });
  253. GUITable.set_function("EndChild", [this]() -> const void { m_GUIData.addFunctor([=] { ImGui::EndChild(); }); });
  254. GUITable.set_function("EndMenu", [this]() -> const void { m_GUIData.addFunctor([=] { ImGui::EndMenu(); }); });
  255. GUITable.set_function("EndMenuBar", [this]() -> const void { m_GUIData.addFunctor([=] { ImGui::EndMenuBar(); }); });
  256. GUITable.set_function("FileDialog", [this](FileBrowserDialog *p_v1) -> const void { m_scriptScene->getSceneLoader()->getChangeController()->sendData(m_scriptScene->getSceneLoader()->getSystemScene(Systems::GUI), DataType::DataType_FileBrowserDialog, (void *)p_v1); });
  257. GUITable.set_function("GetContentRegionAvail", [this]() -> const glm::vec2 { const auto regionSize = ImGui::GetContentRegionAvail(); return glm::vec2(regionSize.x, regionSize.y); });
  258. GUITable.set_function("GetContentRegionAvailX", [this]() -> const float { return ImGui::GetContentRegionAvail().x; });
  259. GUITable.set_function("GetContentRegionAvailY", [this]() -> const float { return ImGui::GetContentRegionAvail().y; });
  260. GUITable.set_function("GetScreenSize", [this]() -> const glm::vec2 { return glm::vec2(Config::rendererVar().current_viewport_size_x, Config::rendererVar().current_viewport_size_y); });
  261. GUITable.set_function("Image", sol::overload([this](TextureLoader2D::Texture2DHandle *p_v1) -> void { m_GUIData.addFunctor([=] { ImGui::Image((ImTextureID)(uint64_t)p_v1->getHandle(), ImVec2((float)p_v1->getTextureWidth(), (float)p_v1->getTextureHeight()), ImVec2(0.0f, 1.0f), ImVec2(1.0f, 0.0f)); }); },
  262. [this](TextureLoader2D::Texture2DHandle *p_v1, const float p_v2, const float p_v3) -> void { m_GUIData.addFunctor([=] { ImGui::Image((ImTextureID)(uint64_t)p_v1->getHandle(), ImVec2(p_v2, p_v3), ImVec2(0.0f, 1.0f), ImVec2(1.0f, 0.0f)); }); },
  263. [this](TextureLoader2D::Texture2DHandle *p_v1, const float p_v2, const float p_v3, const float p_v4, const float p_v5, const float p_v6, const float p_v7) -> void { m_GUIData.addFunctor([=] { ImGui::Image((ImTextureID)(uint64_t)p_v1->getHandle(), ImVec2(p_v2, p_v3), ImVec2(p_v4, p_v5), ImVec2(p_v6, p_v7)); }); }));
  264. GUITable.set_function("ImageButton", sol::overload([this](TextureLoader2D::Texture2DHandle *p_v1, Conditional *p_v2) -> void { m_GUIData.addFunctor([=] { p_v2->m_flag = ImGui::ImageButton((ImTextureID)(uint64_t)p_v1->getHandle(), ImVec2((float)p_v1->getTextureWidth(), (float)p_v1->getTextureHeight()), ImVec2(0.0f, 1.0f), ImVec2(1.0f, 0.0f), 0, ImVec4(0.0f, 0.0f, 0.0f, 0.0f)); }); },
  265. [this](TextureLoader2D::Texture2DHandle *p_v1, const float p_v2, const float p_v3, Conditional *p_v4) -> void { m_GUIData.addFunctor([=] { p_v4->m_flag = ImGui::ImageButton((ImTextureID)(uint64_t)p_v1->getHandle(), ImVec2(p_v2, p_v3), ImVec2(0.0f, 1.0f), ImVec2(1.0f, 0.0f)); }); },
  266. [this](TextureLoader2D::Texture2DHandle *p_v1, const float p_v2, const float p_v3, const float p_v4, const float p_v5, const float p_v6, const float p_v7, Conditional *p_v8) -> void { m_GUIData.addFunctor([=] { p_v8->m_flag = ImGui::ImageButton((ImTextureID)(uint64_t)p_v1->getHandle(), ImVec2(p_v2, p_v3), ImVec2(p_v4, p_v5), ImVec2(p_v6, p_v7)); }); }));
  267. GUITable.set_function("IsItemHovered", [this](Conditional *p_v1) -> const void { m_GUIData.addFunctor([=] { p_v1->m_flag = ImGui::IsItemHovered(); }); });
  268. GUITable.set_function("MenuItem", [this](const std::string &p_v1, const std::string &p_v2, Conditional *p_v3) -> void { m_GUIData.addFunctor([=] { p_v3->m_flag = ImGui::MenuItem(p_v1.c_str(), p_v2.c_str()); }); });
  269. GUITable.set_function("NewLine", [this]() -> const void { m_GUIData.addFunctor([=] { ImGui::NewLine(); }); });
  270. GUITable.set_function("PlotLines", [this](const std::string &p_v1, const float *p_v2, int p_v3) -> const void { m_GUIData.addFunctor([=] { ImGui::PlotLines(p_v1.c_str(), p_v2, p_v3); }); });
  271. GUITable.set_function("PopFont", [this]() -> const void { m_GUIData.addFunctor([=] { ImGui::PopFont(); }); });
  272. GUITable.set_function("PopStyleColor", sol::overload([this](const int p_v1) -> const void { m_GUIData.addFunctor([=] { ImGui::PopStyleColor(p_v1); }); },
  273. [this]() -> const void { m_GUIData.addFunctor([=] { ImGui::PopStyleColor(1); }); }));
  274. GUITable.set_function("PopStyleVar", sol::overload([this](const int p_v1) -> const void { m_GUIData.addFunctor([=] { ImGui::PopStyleVar(p_v1); }); },
  275. [this]() -> const void { m_GUIData.addFunctor([=] { ImGui::PopStyleVar(1); }); }));
  276. GUITable.set_function("PushFont", [this](const GuiFontType p_fontType) -> const void { auto *font = static_cast<GUISystem *>(m_scriptScene->getSceneLoader()->getSystemScene(Systems::GUI)->getSystem())->getFont(p_fontType); m_GUIData.addFunctor([=] { ImGui::PushFont(font); }); });
  277. GUITable.set_function("PushStyleColor", [this](const int p_v1, const float p_v2, const float p_v3, const float p_v4, const float p_v5) -> const void { m_GUIData.addFunctor([=] { ImGui::PushStyleColor(p_v1, ImVec4(p_v2, p_v3, p_v4, p_v5)); }); });
  278. GUITable.set_function("PushStyleVar", sol::overload([this](const int p_v1, const float p_v2) -> const void { m_GUIData.addFunctor([=] { ImGui::PushStyleVar(p_v1, p_v2); }); },
  279. [this](const int p_v1, const float p_v2, const float p_v3) -> const void { m_GUIData.addFunctor([=] { ImGui::PushStyleVar(p_v1, ImVec2(p_v2, p_v3)); }); }));
  280. GUITable.set_function("SetCursorPosX", [this](const float p_v1) -> const void { m_GUIData.addFunctor([=] { ImGui::SetCursorPosX(p_v1); }); });
  281. GUITable.set_function("SetCursorPosY", [this](const float p_v1) -> const void { m_GUIData.addFunctor([=] { ImGui::SetCursorPosY(p_v1); }); });
  282. GUITable.set_function("SetNextWindowPos", [this](const float p_v1, const float p_v2) -> const void { m_GUIData.addFunctor([=] { ImGui::SetNextWindowPos(ImVec2(Config::rendererVar().current_viewport_position_x + p_v1, Config::rendererVar().current_viewport_position_y + p_v2)); }); });
  283. GUITable.set_function("SetNextWindowContentSize", [this](const float p_v1, const float p_v2) -> const void { m_GUIData.addFunctor([=] { ImGui::SetNextWindowContentSize(ImVec2(p_v1, p_v2)); }); });
  284. GUITable.set_function("SetNextWindowSize", [this](const float p_v1, const float p_v2) -> const void { m_GUIData.addFunctor([=] { ImGui::SetNextWindowSize(ImVec2(p_v1, p_v2)); }); });
  285. GUITable.set_function("SetNextWindowSizeFullscreen", [this]() -> const void { m_GUIData.addFunctor([=] { ImGui::SetNextWindowSize(ImVec2((float)Config::rendererVar().current_viewport_size_x, (float)Config::rendererVar().current_viewport_size_y)); }); });
  286. GUITable.set_function("SetNextWindowSizeFullscreenScale", [this](const float p_scaleX, const float p_scaleY) -> const void { m_GUIData.addFunctor([=] { ImGui::SetNextWindowSize(ImVec2((float)Config::rendererVar().current_viewport_size_x * p_scaleX, (float)Config::rendererVar().current_viewport_size_y * p_scaleY)); }); });
  287. GUITable.set_function("SetWindowFontScale", [this](const float p_fontScale) -> const void { m_GUIData.addFunctor([=] { ImGui::SetWindowFontScale(p_fontScale); }); });
  288. GUITable.set_function("ShowMetricsWindow", [this](bool p_v1) -> void { m_GUIData.addFunctor([=] { bool open = p_v1; ImGui::ShowMetricsWindow(&open); }); });
  289. GUITable.set_function("SliderFloat", [this](const std::string &p_v1, float *p_v2, const float p_v3, const float p_v4) -> const void { m_GUIData.addFunctor([=] { ImGui::SliderFloat(p_v1.c_str(), p_v2, p_v3, p_v4); }); });
  290. GUITable.set_function("SameLine", [this]() -> const void { m_GUIData.addFunctor([=] { ImGui::SameLine(); }); });
  291. GUITable.set_function("Text", sol::overload([this](const std::string &p_v1) -> const void { m_GUIData.addFunctor([=] { ImGui::Text(p_v1.c_str()); }); },
  292. [this](const std::string &p_v1, const float p_v2) -> const void { m_GUIData.addFunctor([=] { ImGui::Text(p_v1.c_str(), p_v2); }); },
  293. [this](const std::string &p_v1, const float p_v2, const float p_v3) -> const void { m_GUIData.addFunctor([=] { ImGui::Text(p_v1.c_str(), p_v2, p_v3); }); }));
  294. GUITable.set_function("TextCenterAligned", sol::overload([this](const std::string &p_text) -> const void { m_GUIData.addFunctor([=] { ImGui::SetCursorPosX((ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(p_text.c_str()).x) / 2.0f); ImGui::Text(p_text.c_str()); }); },
  295. [this](const std::string &p_text, const float p_screenSizeX) -> const void { m_GUIData.addFunctor([=] { ImGui::SetCursorPosX((p_screenSizeX - ImGui::CalcTextSize(p_text.c_str()).x) - 2.0f); ImGui::Text(p_text.c_str()); }); }));
  296. GUITable.set_function("TextColored", sol::overload([this](const glm::vec4 p_v1, const std::string &p_v2) -> const void { m_GUIData.addFunctor([=] { ImGui::TextColored(ImVec4(p_v1.x, p_v1.y, p_v1.z, p_v1.w), p_v2.c_str()); }); },
  297. [this](const glm::vec4 p_v1, const std::string &p_v2, const float p_v3) -> const void { m_GUIData.addFunctor([=] { ImGui::TextColored(ImVec4(p_v1.x, p_v1.y, p_v1.z, p_v1.w), p_v2.c_str(), p_v3); }); },
  298. [this](const glm::vec4 p_v1, const std::string &p_v2, const float p_v3, const float p_v4) -> const void { m_GUIData.addFunctor([=] { ImGui::TextColored(ImVec4(p_v1.x, p_v1.y, p_v1.z, p_v1.w), p_v2.c_str(), p_v3, p_v4); }); }));
  299. // Input / Window functions
  300. m_luaState.set_function("getMouseInfo", []() -> const Window::MouseInfo { return WindowLocator::get().getMouseInfo(); });
  301. m_luaState.set_function("getMouseCapture", []() -> const bool { return Config::windowVar().mouse_captured; });
  302. m_luaState.set_function("setFullscreen", [](const bool p_v1) -> const void { WindowLocator::get().setFullscreen(p_v1); });
  303. m_luaState.set_function("setMouseCapture", [](const bool p_v1) -> const void { WindowLocator::get().setMouseCapture(p_v1); });
  304. m_luaState.set_function("setVerticalSync", [](const bool p_v1) -> const void { WindowLocator::get().setVerticalSync(p_v1); });
  305. m_luaState.set_function("setWindowTitle", [](const std::string &p_v1) -> const void { WindowLocator::get().setWindowTitle(p_v1); });
  306. // Loader functions
  307. m_luaState.set_function("loadTexture2D", [](const std::string &p_v1) -> TextureLoader2D::Texture2DHandle { return Loaders::texture2D().load(p_v1, MaterialType::MaterialType_Diffuse); });
  308. // LuaScript callbacks
  309. m_luaState.set_function("getLuaFilename", &LuaScript::getLuaScriptFilename, this);
  310. m_luaState.set_function("postChanges", &LuaScript::registerChange, this);
  311. m_luaState.set_function(Config::scriptVar().createObjectFunctionName, &LuaScript::createObjectInLua, this);
  312. // Math functions
  313. m_luaState.set_function("angleAxisQuat", sol::resolve<glm::quat(const float &, const glm::vec3 &)>(&glm::angleAxis));
  314. m_luaState.set_function("bitwiseOr", sol::overload([](const int p_v1, const int p_v2) -> const int { return p_v1 | p_v2; },
  315. [](const int p_v1, const int p_v2, const int p_v3) -> const int { return p_v1 | p_v2 | p_v3; },
  316. [](const int p_v1, const int p_v2, const int p_v3, const int p_v4) -> const int { return p_v1 | p_v2 | p_v3 | p_v4; },
  317. [](const int p_v1, const int p_v2, const int p_v3, const int p_v4, const int p_v5) -> const int { return p_v1 | p_v2 | p_v3 | p_v4 | p_v5; }));
  318. m_luaState.set_function("clamp", [](const float p_value, const float p_min, const float p_max) -> float { return glm::clamp(p_value, p_min, p_max); });
  319. m_luaState.set_function("dot", sol::overload([this](const glm::vec3 &p_v1, const glm::vec3 &p_v2) -> float { return glm::dot(p_v1, p_v2); },
  320. [this](const glm::vec4 &p_v1, const glm::vec4 &p_v2) -> float { return glm::dot(p_v1, p_v2); }));
  321. m_luaState.set_function("linearInterpolation", sol::overload([](const float p_value, const float p_domainMin, const float p_domainMax) -> const float { return (p_value - p_domainMin) / (p_domainMax - p_domainMin); },
  322. [this](const float p_value, const float p_domainMin, const float p_domainMax, const float p_rangeMin, const float p_rangeMax) -> const float { return glm::mix(p_rangeMin, p_rangeMax, (p_value - p_domainMin) / (p_domainMax - p_domainMin)); }));
  323. m_luaState.set_function("rand", [=]() -> int { return rand(); } );
  324. m_luaState.set_function("toRadianF", sol::resolve<float(const float)>(&glm::radians));
  325. m_luaState.set_function("toRadianVec3", sol::resolve<glm::vec3(const glm::vec3 &)>(&glm::radians));
  326. m_luaState.set_function("toRadianVec4", sol::resolve<glm::vec4(const glm::vec4 &)>(&glm::radians));
  327. m_luaState.set_function("toDegreesF", sol::resolve<float(const float)>(&glm::degrees));
  328. m_luaState.set_function("toDegreesVec3", sol::resolve<glm::vec3(const glm::vec3 &)>(&glm::degrees));
  329. m_luaState.set_function("toDegreesVec4", sol::resolve<glm::vec4(const glm::vec4 &)>(&glm::degrees));
  330. // Misc
  331. m_luaState.set_function("time", [=]() -> int { return (int)time(NULL); });
  332. // Physics functions
  333. m_luaState.set_function("getPhysicsSimulationRunning", [this]() -> const bool { return static_cast<PhysicsScene *>(m_scriptScene->getSceneLoader()->getSystemScene(Systems::Physics))->getSimulationRunning(); });
  334. }
  335. void LuaScript::setUsertypes()
  336. {
  337. // Enums
  338. m_luaState.new_enum("DataType",
  339. "DataType_AboutWindow", DataType::DataType_AboutWindow,
  340. "DataType_EnableGUISequence", DataType::DataType_EnableGUISequence,
  341. "DataType_SettingsWindow", DataType::DataType_SettingsWindow,
  342. "DataType_SimulationActive", DataType::DataType_SimulationActive,
  343. "DataType_EnableLuaScripting", DataType::DataType_EnableLuaScripting);
  344. m_luaState.new_enum("EngineStateType",
  345. "MainMenu", EngineStateType::EngineStateType_MainMenu,
  346. "Play", EngineStateType::EngineStateType_Play,
  347. "Editor", EngineStateType::EngineStateType_Editor);
  348. m_luaState.new_enum("EngineChangeType",
  349. "None", EngineChangeType::EngineChangeType_None,
  350. "SceneFilename", EngineChangeType::EngineChangeType_SceneFilename,
  351. "SceneLoad", EngineChangeType::EngineChangeType_SceneLoad,
  352. "SceneUnload", EngineChangeType::EngineChangeType_SceneUnload,
  353. "SceneReload", EngineChangeType::EngineChangeType_SceneReload,
  354. "StateChange", EngineChangeType::EngineChangeType_StateChange);
  355. m_luaState.new_enum("MaterialType",
  356. "Diffuse", MaterialType::MaterialType_Diffuse,
  357. "Normal", MaterialType::MaterialType_Normal,
  358. "Emissive", MaterialType::MaterialType_Emissive,
  359. "Combined", MaterialType::MaterialType_Combined);
  360. m_luaState.new_enum("SystemType",
  361. GetString(Systems::TypeID::Null), Systems::TypeID::Null,
  362. GetString(Systems::TypeID::Audio), Systems::TypeID::Audio,
  363. GetString(Systems::TypeID::Graphics), Systems::TypeID::Graphics,
  364. GetString(Systems::TypeID::GUI), Systems::TypeID::GUI,
  365. GetString(Systems::TypeID::Physics), Systems::TypeID::Physics,
  366. GetString(Systems::TypeID::Script), Systems::TypeID::Script,
  367. GetString(Systems::TypeID::World), Systems::TypeID::World);
  368. // Components
  369. m_luaState.new_usertype<SpatialComponent>("SpatialComponent",
  370. "getSpatialDataChangeManager", &SpatialComponent::getSpatialDataChangeManager);
  371. // Config variables
  372. m_luaState.new_usertype<Config::EngineVariables>("EngineVariables",
  373. "change_ctrl_cml_notify_list_reserv", &Config::EngineVariables::change_ctrl_cml_notify_list_reserv,
  374. "change_ctrl_grain_size", &Config::EngineVariables::change_ctrl_grain_size,
  375. "change_ctrl_notify_list_reserv", &Config::EngineVariables::change_ctrl_notify_list_reserv,
  376. "change_ctrl_oneoff_notify_list_reserv", &Config::EngineVariables::change_ctrl_oneoff_notify_list_reserv,
  377. "change_ctrl_subject_list_reserv", &Config::EngineVariables::change_ctrl_subject_list_reserv,
  378. "delta_time_divider", &Config::EngineVariables::delta_time_divider,
  379. "gl_context_major_version", &Config::EngineVariables::gl_context_major_version,
  380. "gl_context_minor_version", &Config::EngineVariables::gl_context_minor_version,
  381. "object_directory_init_pool_size", &Config::EngineVariables::object_directory_init_pool_size,
  382. "smoothing_tick_samples", &Config::EngineVariables::smoothing_tick_samples,
  383. "running", &Config::EngineVariables::running,
  384. "engineState", &Config::EngineVariables::engineState);
  385. m_luaState.new_usertype<Config::GameplayVariables>("GameplayVariables",
  386. "camera_freelook_speed", &Config::GameplayVariables::camera_freelook_speed);
  387. m_luaState.new_usertype<Config::GraphicsVariables>("GraphicsVariables",
  388. "current_resolution_x", &Config::GraphicsVariables::current_resolution_x,
  389. "current_resolution_y", &Config::GraphicsVariables::current_resolution_y);
  390. m_luaState.new_usertype<Config::InputVariables>("InputVariables",
  391. "back_key", &Config::InputVariables::back_key,
  392. "backward_editor_key", &Config::InputVariables::backward_editor_key,
  393. "backward_key", &Config::InputVariables::backward_key,
  394. "center_key", &Config::InputVariables::center_key,
  395. "clip_mouse_key", &Config::InputVariables::clip_mouse_key,
  396. "close_window_key", &Config::InputVariables::close_window_key,
  397. "debug_1_key", &Config::InputVariables::debug_1_key,
  398. "debug_2_key", &Config::InputVariables::debug_2_key,
  399. "down_editor_key", &Config::InputVariables::down_editor_key,
  400. "down_key", &Config::InputVariables::down_key,
  401. "escape_key", &Config::InputVariables::escape_key,
  402. "forward_editor_key", &Config::InputVariables::forward_editor_key,
  403. "forward_key", &Config::InputVariables::forward_key,
  404. "fullscreen_key", &Config::InputVariables::fullscreen_key,
  405. "jump_key", &Config::InputVariables::jump_key,
  406. "left_editor_key", &Config::InputVariables::left_editor_key,
  407. "left_strafe_key", &Config::InputVariables::left_strafe_key,
  408. "modifier_editor_key", &Config::InputVariables::modifier_editor_key,
  409. "next_editor_key", &Config::InputVariables::next_editor_key,
  410. "num_preallocated_keybinds", &Config::InputVariables::num_preallocated_keybinds,
  411. "previous_editor_key", &Config::InputVariables::previous_editor_key,
  412. "right_editor_key", &Config::InputVariables::right_editor_key,
  413. "right_strafe_key", &Config::InputVariables::right_strafe_key,
  414. "save_editor_key", &Config::InputVariables::save_editor_key,
  415. "sprint_key", &Config::InputVariables::sprint_key,
  416. "up_editor_key", &Config::InputVariables::up_editor_key,
  417. "up_key", &Config::InputVariables::up_key,
  418. "vsync_key", &Config::InputVariables::vsync_key,
  419. "mouse_filter", &Config::InputVariables::mouse_filter,
  420. "mouse_warp_mode", &Config::InputVariables::mouse_warp_mode,
  421. "mouse_jaw", &Config::InputVariables::mouse_jaw,
  422. "mouse_pitch", &Config::InputVariables::mouse_pitch,
  423. "mouse_pitch_clip", &Config::InputVariables::mouse_pitch_clip,
  424. "mouse_sensitivity", &Config::InputVariables::mouse_sensitivity);
  425. m_luaState.new_usertype<Config::PathsVariables>("PathsVariables",
  426. "config_path", &Config::PathsVariables::config_path,
  427. "engine_assets_path", &Config::PathsVariables::engine_assets_path,
  428. "gui_assets_path", &Config::PathsVariables::gui_assets_path,
  429. "map_path", &Config::PathsVariables::map_path,
  430. "model_path", &Config::PathsVariables::model_path,
  431. "object_path", &Config::PathsVariables::object_path,
  432. "prefab_path", &Config::PathsVariables::prefab_path,
  433. "script_path", &Config::PathsVariables::script_path,
  434. "shader_path", &Config::PathsVariables::shader_path,
  435. "sound_path", &Config::PathsVariables::sound_path,
  436. "texture_path", &Config::PathsVariables::texture_path);
  437. m_luaState.new_usertype<Config::WindowVariables>("WindowVariables",
  438. "name", &Config::WindowVariables::name,
  439. "default_display", &Config::WindowVariables::default_display,
  440. "window_position_x", &Config::WindowVariables::window_position_x,
  441. "window_position_y", &Config::WindowVariables::window_position_y,
  442. "window_size_fullscreen_x", &Config::WindowVariables::window_size_fullscreen_x,
  443. "window_size_fullscreen_y", &Config::WindowVariables::window_size_fullscreen_y,
  444. "window_size_windowed_x", &Config::WindowVariables::window_size_windowed_x,
  445. "window_size_windowed_y", &Config::WindowVariables::window_size_windowed_y,
  446. "fullscreen", &Config::WindowVariables::fullscreen,
  447. "fullscreen_borderless", &Config::WindowVariables::fullscreen_borderless,
  448. "mouse_captured", &Config::WindowVariables::mouse_captured,
  449. "mouse_release_on_lost_focus", &Config::WindowVariables::mouse_release_on_lost_focus,
  450. "resizable", &Config::WindowVariables::resizable,
  451. "vertical_sync", &Config::WindowVariables::vertical_sync,
  452. "window_in_focus", &Config::WindowVariables::window_in_focus);
  453. // Math types
  454. m_luaState.new_usertype<Int64Packer>("Int64");
  455. m_luaState.new_usertype<glm::ivec2>("Ivec2",
  456. sol::constructors<glm::ivec2(), glm::ivec2(int), glm::ivec2(int, int), glm::ivec2(glm::vec2)>(),
  457. "x", &glm::ivec2::x,
  458. "y", &glm::ivec2::y,
  459. "addF", [](const glm::ivec2 &v1, const int f) -> glm::ivec2 { return v1 + f; },
  460. "subF", [](const glm::ivec2 &v1, const int f) -> glm::ivec2 { return v1 - f; },
  461. "mulF", [](const glm::ivec2 &v1, const int f) -> glm::ivec2 { return v1 * f; },
  462. "divF", [](const glm::ivec2 &v1, const int f) -> glm::ivec2 { return v1 / f; },
  463. "addIvec2", [](const glm::ivec2 &v1, const glm::ivec2 &v2) -> glm::ivec2 { return v1 + v2; },
  464. "subIvec2", [](const glm::ivec2 &v1, const glm::ivec2 &v2) -> glm::ivec2 { return v1 - v2; },
  465. "mulIvec2", [](const glm::ivec2 &v1, const glm::ivec2 &v2) -> glm::ivec2 { return v1 * v2; },
  466. "divIvec2", [](const glm::ivec2 &v1, const glm::ivec2 &v2) -> glm::ivec2 { return v1 / v2; },
  467. sol::meta_function::addition, [](const glm::ivec2 &v1, glm::ivec2 &v2) -> glm::ivec2 { return v1 + v2; },
  468. sol::meta_function::subtraction, [](const glm::ivec2 &v1, glm::ivec2 &v2) -> glm::ivec2 { return v1 - v2; },
  469. sol::meta_function::multiplication, [](const glm::ivec2 &v1, glm::ivec2 &v2) -> glm::ivec2 { return v1 * v2; },
  470. sol::meta_function::division, [](const glm::ivec2 &v1, glm::ivec2 &v2) -> glm::ivec2 { return v1 / v2; });
  471. m_luaState.new_usertype<glm::vec2>("Vec2",
  472. sol::constructors<glm::vec2(), glm::vec2(float), glm::vec2(float, float), glm::vec2(glm::vec3), glm::vec2(glm::ivec2)>(),
  473. "x", &glm::vec2::x,
  474. "y", &glm::vec2::y,
  475. "addF", [](const glm::vec2 &v1, const float f) -> glm::vec2 { return v1 + f; },
  476. "subF", [](const glm::vec2 &v1, const float f) -> glm::vec2 { return v1 - f; },
  477. "mulF", [](const glm::vec2 &v1, const float f) -> glm::vec2 { return v1 * f; },
  478. "divF", [](const glm::vec2 &v1, const float f) -> glm::vec2 { return v1 / f; },
  479. "addVec2", [](const glm::vec2 &v1, const glm::vec2 &v2) -> glm::vec2 { return v1 + v2; },
  480. "subVec2", [](const glm::vec2 &v1, const glm::vec2 &v2) -> glm::vec2 { return v1 - v2; },
  481. "mulVec2", [](const glm::vec2 &v1, const glm::vec2 &v2) -> glm::vec2 { return v1 * v2; },
  482. "divVec2", [](const glm::vec2 &v1, const glm::vec2 &v2) -> glm::vec2 { return v1 / v2; },
  483. sol::meta_function::addition, [](const glm::vec2 &v1, glm::vec2 &v2) -> glm::vec2 { return v1 + v2; },
  484. sol::meta_function::subtraction, [](const glm::vec2 &v1, glm::vec2 &v2) -> glm::vec2 { return v1 - v2; },
  485. sol::meta_function::multiplication, [](const glm::vec2 &v1, glm::vec2 &v2) -> glm::vec2 { return v1 * v2; },
  486. sol::meta_function::division, [](const glm::vec2 &v1, glm::vec2 &v2) -> glm::vec2 { return v1 / v2; });
  487. m_luaState.new_usertype<glm::vec3>("Vec3",
  488. sol::constructors<glm::vec3(), glm::vec3(float), glm::vec3(float, float, float), glm::vec3(glm::vec4)>(),
  489. "x", &glm::vec3::x,
  490. "y", &glm::vec3::y,
  491. "z", &glm::vec3::z,
  492. "addF", [](const glm::vec3 &v1, const float f) -> glm::vec3 { return v1 + f; },
  493. "subF", [](const glm::vec3 &v1, const float f) -> glm::vec3 { return v1 - f; },
  494. "mulF", [](const glm::vec3 &v1, const float f) -> glm::vec3 { return v1 * f; },
  495. "divF", [](const glm::vec3 &v1, const float f) -> glm::vec3 { return v1 / f; },
  496. "addVec3", [](const glm::vec3 &v1, const glm::vec3 &v2) -> glm::vec3 { return v1 + v2; },
  497. "subVec3", [](const glm::vec3 &v1, const glm::vec3 &v2) -> glm::vec3 { return v1 - v2; },
  498. "mulVec3", [](const glm::vec3 &v1, const glm::vec3 &v2) -> glm::vec3 { return v1 * v2; },
  499. "divVec3", [](const glm::vec3 &v1, const glm::vec3 &v2) -> glm::vec3 { return v1 / v2; },
  500. "dot", [](const glm::vec3 &v1, const glm::vec3 &v2) -> float { return glm::dot(v1, v2); },
  501. "normalize", [](const glm::vec3 &v1) -> glm::vec3 { return glm::normalize(v1); },
  502. sol::meta_function::addition, [](const glm::vec3 &v1, glm::vec3 &v2) -> glm::vec3 { return v1 + v2; },
  503. sol::meta_function::subtraction, [](const glm::vec3 &v1, glm::vec3 &v2) -> glm::vec3 { return v1 - v2; },
  504. sol::meta_function::multiplication, [](const glm::vec3 &v1, glm::vec3 &v2) -> glm::vec3 { return v1 * v2; },
  505. sol::meta_function::division, [](const glm::vec3 &v1, glm::vec3 &v2) -> glm::vec3 { return v1 / v2; });
  506. m_luaState.new_usertype<glm::vec4>("Vec4",
  507. sol::constructors<glm::vec4(), glm::vec4(float), glm::vec4(glm::vec3, float), glm::vec4(float, float, float, float)>(),
  508. "x", &glm::vec4::x,
  509. "y", &glm::vec4::y,
  510. "z", &glm::vec4::z,
  511. "w", &glm::vec4::w,
  512. "addF", [](const glm::vec4 &v1, const float f) -> glm::vec4 { return v1 + f; },
  513. "subF", [](const glm::vec4 &v1, const float f) -> glm::vec4 { return v1 - f; },
  514. "mulF", [](const glm::vec4 &v1, const float f) -> glm::vec4 { return v1 * f; },
  515. "divF", [](const glm::vec4 &v1, const float f) -> glm::vec4 { return v1 / f; },
  516. "addVec4", [](const glm::vec4 &v1, const glm::vec4 &v2) -> glm::vec4 { return v1 + v2; },
  517. "subVec4", [](const glm::vec4 &v1, const glm::vec4 &v2) -> glm::vec4 { return v1 - v2; },
  518. "mulVec4", [](const glm::vec4 &v1, const glm::vec4 &v2) -> glm::vec4 { return v1 * v2; },
  519. "divVec4", [](const glm::vec4 &v1, const glm::vec4 &v2) -> glm::vec4 { return v1 / v2; },
  520. "normalize", [](const glm::vec4 &v1) -> glm::vec4 { return glm::normalize(v1); },
  521. sol::meta_function::addition, [](const glm::vec4 &v1, glm::vec4 &v2) -> glm::vec4 { return v1 + v2; },
  522. sol::meta_function::subtraction, [](const glm::vec4 &v1, glm::vec4 &v2) -> glm::vec4 { return v1 - v2; },
  523. sol::meta_function::multiplication, [](const glm::vec4 &v1, glm::vec4 &v2) -> glm::vec4 { return v1 * v2; },
  524. sol::meta_function::division, [](const glm::vec4 &v1, glm::vec4 &v2) -> glm::vec4 { return v1 / v2; });
  525. m_luaState.new_usertype<glm::quat>("Quat",
  526. sol::constructors<glm::quat(), glm::quat(glm::vec4)>(),
  527. "x", &glm::quat::x,
  528. "y", &glm::quat::y,
  529. "z", &glm::quat::z,
  530. "w", &glm::quat::w,
  531. "mulF", [](const glm::quat &q1, const float f) -> glm::quat { return q1 * f; },
  532. "divF", [](const glm::quat &q1, const float f) -> glm::quat { return q1 / f; },
  533. "mulVec3", [](const glm::quat &q1, const glm::vec3 &v2) -> glm::quat { return q1 * v2; },
  534. "normalize", [](const glm::quat &q1) -> glm::quat { return glm::normalize(q1); },
  535. "inverse", [](const glm::quat &q1) -> glm::quat { return glm::inverse(q1); },
  536. "rotateVec3", [](const glm::quat &q1, const glm::vec3 &v2) -> glm::vec3 { return glm::rotate(q1, v2); },
  537. "toMat4", [](const glm::quat &q1) -> glm::mat4 { return glm::toMat4(q1); },
  538. sol::meta_function::addition, [](const glm::quat &q1, glm::quat &q2) -> glm::quat { return q1 + q2; },
  539. sol::meta_function::subtraction, [](const glm::quat &q1, glm::quat &q2) -> glm::quat { return q1 - q2; },
  540. sol::meta_function::multiplication, [](const glm::quat &q1, glm::quat &q2) -> glm::quat { return q1 * q2; });
  541. m_luaState.new_usertype<glm::mat4>("Mat4",
  542. sol::constructors<glm::mat4(), glm::mat4(float)>(),
  543. "mulF", [](const glm::mat4 &v1, const float f) -> glm::mat4 { return v1 * f; },
  544. "divF", [](const glm::mat4 &v1, const float f) -> glm::mat4 { return v1 / f; },
  545. "mulVec3", [](const glm::mat4 &m1, const glm::vec3 &v2) -> glm::vec4 { return m1 * glm::vec4(v2, 1.0f); },
  546. "divVec3", [](const glm::mat4 &m1, const glm::vec3 &v2) -> glm::vec4 { return m1 / glm::vec4(v2, 1.0f); },
  547. "mulVec4", [](const glm::mat4 &m1, const glm::vec4 &v2) -> glm::vec4 { return m1 * v2; },
  548. "divVec4", [](const glm::mat4 &m1, const glm::vec4 &v2) -> glm::vec4 { return m1 / v2; },
  549. "inverse", [](const glm::mat4 &m1) -> glm::mat4 { return glm::inverse(m1); },
  550. "rotate", [](const glm::mat4 &m1, const float f1, const glm::vec3 &v1) -> glm::mat4 { return glm::rotate(m1, f1, v1); },
  551. "toQuat", [](const glm::mat4 &m1) -> glm::quat { return glm::toQuat(m1); },
  552. "getRotXVec3", [](const glm::mat4 &m1) -> glm::vec3 { return m1[0]; },
  553. "getRotYVec3", [](const glm::mat4 &m1) -> glm::vec3 { return m1[1]; },
  554. "getRotZVec3", [](const glm::mat4 &m1) -> glm::vec3 { return m1[2]; },
  555. "getPosVec3", [](const glm::mat4 &m1) -> glm::vec3 { return m1[3]; },
  556. "getRotXVec4", [](const glm::mat4 &m1) -> glm::vec4 { return m1[0]; },
  557. "getRotYVec4", [](const glm::mat4 &m1) -> glm::vec4 { return m1[1]; },
  558. "getRotZVec4", [](const glm::mat4 &m1) -> glm::vec4 { return m1[2]; },
  559. "getPosVec4", [](const glm::mat4 &m1) -> glm::vec4 { return m1[3]; },
  560. "setPosVec3", [](glm::mat4 &m1, const glm::vec3 &v2) -> void { m1[3] = glm::vec4(v2, 1.0f); },
  561. "setPosVec4", [](glm::mat4 &m1, const glm::vec4 &v2) -> void { m1[3] = v2; },
  562. sol::meta_function::addition, [](const glm::mat4 &m1, glm::mat4 &m2) -> glm::mat4 { return m1 + m2; },
  563. sol::meta_function::subtraction, [](const glm::mat4 &m1, glm::mat4 &m2) -> glm::mat4 { return m1 - m2; },
  564. sol::meta_function::multiplication, [](const glm::mat4 &m1, glm::mat4 &m2) -> glm::mat4 { return m1 * m2; },
  565. sol::meta_function::division, [](const glm::mat4 &m1, glm::mat4 &m2) -> glm::mat4 { return m1 / m2; });
  566. m_luaState.new_usertype<SpatialData>("SpatialData",
  567. "clear", &SpatialData::clear,
  568. "m_position", &SpatialData::m_position,
  569. "m_rotationEuler", &SpatialData::m_rotationEuler,
  570. "m_rotationQuaternion", &SpatialData::m_rotationQuat,
  571. "m_scale", &SpatialData::m_scale);
  572. m_luaState.new_usertype<SpatialTransformData>("SpatialTransformData",
  573. "clear", &SpatialTransformData::clear,
  574. "m_spatialData", &SpatialTransformData::m_spatialData);
  575. m_luaState.new_usertype<SpatialDataManager>("SpatialDataManager",
  576. "update", &SpatialDataManager::update,
  577. "getLocalSpaceData", &SpatialDataManager::getLocalSpaceData,
  578. "getLocalTransform", &SpatialDataManager::getLocalTransform,
  579. "getParemtTransform", &SpatialDataManager::getParentTransform,
  580. "getWorldTransform", &SpatialDataManager::getWorldTransform,
  581. "setLocalPosition", &SpatialDataManager::setLocalPosition,
  582. "setLocalRotationEuler", sol::resolve<const void(const glm::vec3)>(&SpatialDataManager::setLocalRotation),
  583. "setLocalRotationQuat", sol::resolve<const void(const glm::quat)>(&SpatialDataManager::setLocalRotation),
  584. "setLocalScale", &SpatialDataManager::setLocalScale,
  585. "setLocalTransform", &SpatialDataManager::setLocalTransform,
  586. "setParentTransform", &SpatialDataManager::setParentTransform,
  587. "setWorldTransform", &SpatialDataManager::setWorldTransform,
  588. "calculateLocalRotationEuler", &SpatialDataManager::calculateLocalRotationEuler,
  589. "calculateLocalRotationQuaternion", &SpatialDataManager::calculateLocalRotationQuaternion);
  590. // Random numbers
  591. m_luaState.new_usertype<RandomIntGenerator>("RandomIntGenerator",
  592. sol::constructors<RandomIntGenerator(int, int), RandomIntGenerator(int, int, int)>(),
  593. "generate", &RandomIntGenerator::generate);
  594. m_luaState.new_usertype<RandomFloatGenerator>("RandomFloatGenerator",
  595. sol::constructors<RandomFloatGenerator(float, float), RandomFloatGenerator(float, float, int)>(),
  596. "generate", &RandomFloatGenerator::generate);
  597. // Input types
  598. m_luaState.new_usertype<Window::MouseInfo>("MouseInfo",
  599. "m_movementCurrentFrameX", &Window::MouseInfo::m_movementCurrentFrameX,
  600. "m_movementCurrentFrameY", &Window::MouseInfo::m_movementCurrentFrameY,
  601. "m_movementPrevFrameX", &Window::MouseInfo::m_movementPrevFrameX,
  602. "m_movementPrevFrameY", &Window::MouseInfo::m_movementPrevFrameY,
  603. "m_wheelX", &Window::MouseInfo::m_wheelX,
  604. "m_wheelY", &Window::MouseInfo::m_wheelY,
  605. "m_movementX", &Window::MouseInfo::m_movementX,
  606. "m_movementY", &Window::MouseInfo::m_movementY);
  607. m_luaState.new_usertype<KeyCommand>("KeyCommand",
  608. "activate", &KeyCommand::activate,
  609. "deactivate", &KeyCommand::deactivate,
  610. "isActivated", &KeyCommand::isActivated,
  611. "bind", sol::resolve<void(const Scancode)>(&KeyCommand::bind),
  612. "bindByName", sol::resolve<void(const std::string &)>(&KeyCommand::bind),
  613. "unbind", &KeyCommand::unbind,
  614. "unbindAll", &KeyCommand::unbindAll);
  615. // Component construction info
  616. m_luaState.new_usertype<ComponentsConstructionInfo>("ComponentsConstructionInfo",
  617. sol::constructors<ComponentsConstructionInfo()>(),
  618. sol::meta_function::garbage_collect, sol::destructor(&ComponentsConstructionInfo::deleteConstructionInfo),
  619. "m_name", &ComponentsConstructionInfo::m_name,
  620. "m_id", &ComponentsConstructionInfo::m_id,
  621. "m_parent", &ComponentsConstructionInfo::m_parent,
  622. "m_graphicsComponents", &ComponentsConstructionInfo::m_graphicsComponents,
  623. "m_guiComponents", &ComponentsConstructionInfo::m_guiComponents,
  624. "m_physicsComponents", &ComponentsConstructionInfo::m_physicsComponents,
  625. "m_scriptComponents", &ComponentsConstructionInfo::m_scriptComponents,
  626. "m_worldComponents", &ComponentsConstructionInfo::m_worldComponents);
  627. m_luaState.new_usertype<GraphicsComponentsConstructionInfo>("GraphicsComponentsConstructionInfo",
  628. sol::meta_function::garbage_collect, sol::destructor(&GraphicsComponentsConstructionInfo::deleteConstructionInfo),
  629. "m_cameraConstructionInfo", &GraphicsComponentsConstructionInfo::m_cameraConstructionInfo,
  630. "m_lightConstructionInfo", &GraphicsComponentsConstructionInfo::m_lightConstructionInfo,
  631. "m_modelConstructionInfo", &GraphicsComponentsConstructionInfo::m_modelConstructionInfo,
  632. "m_shaderConstructionInfo", &GraphicsComponentsConstructionInfo::m_shaderConstructionInfo,
  633. "cameraPresent", [](const GraphicsComponentsConstructionInfo &c1) -> bool { return c1.m_cameraConstructionInfo != nullptr; },
  634. "lightPresent", [](const GraphicsComponentsConstructionInfo &c1) -> bool { return c1.m_lightConstructionInfo != nullptr; },
  635. "modelPresent", [](const GraphicsComponentsConstructionInfo &c1) -> bool { return c1.m_modelConstructionInfo != nullptr; },
  636. "shaderPresent", [](const GraphicsComponentsConstructionInfo &c1) -> bool { return c1.m_shaderConstructionInfo != nullptr; },
  637. "createCamera", [](GraphicsComponentsConstructionInfo &c1) -> void { if(c1.m_cameraConstructionInfo != nullptr) delete c1.m_cameraConstructionInfo; c1.m_cameraConstructionInfo = new CameraComponent::CameraComponentConstructionInfo(); },
  638. "createLight", [](GraphicsComponentsConstructionInfo &c1) -> void { if(c1.m_lightConstructionInfo != nullptr) delete c1.m_lightConstructionInfo; c1.m_lightConstructionInfo = new LightComponent::LightComponentConstructionInfo(); },
  639. "createModel", [](GraphicsComponentsConstructionInfo &c1) -> void { if(c1.m_modelConstructionInfo != nullptr) delete c1.m_modelConstructionInfo; c1.m_modelConstructionInfo = new ModelComponent::ModelComponentConstructionInfo(); },
  640. "createShader", [](GraphicsComponentsConstructionInfo &c1) -> void { if(c1.m_shaderConstructionInfo != nullptr) delete c1.m_shaderConstructionInfo; c1.m_shaderConstructionInfo = new ShaderComponent::ShaderComponentConstructionInfo(); });
  641. m_luaState.new_usertype<GUIComponentsConstructionInfo>("GUIComponentsConstructionInfo",
  642. sol::meta_function::garbage_collect, sol::destructor(&GUIComponentsConstructionInfo::deleteConstructionInfo),
  643. "m_guiSequenceConstructionInfo", &GUIComponentsConstructionInfo::m_guiSequenceConstructionInfo,
  644. "guiSequencePresent", [](const GUIComponentsConstructionInfo &c1) -> bool { return c1.m_guiSequenceConstructionInfo != nullptr; },
  645. "createGUISequence", [](GUIComponentsConstructionInfo &c1) -> void { if(c1.m_guiSequenceConstructionInfo != nullptr) delete c1.m_guiSequenceConstructionInfo; c1.m_guiSequenceConstructionInfo = new GUISequenceComponent::GUISequenceComponentConstructionInfo(); });
  646. m_luaState.new_usertype<PhysicsComponentsConstructionInfo>("PhysicsComponentsConstructionInfo",
  647. sol::meta_function::garbage_collect, sol::destructor(&PhysicsComponentsConstructionInfo::deleteConstructionInfo),
  648. "m_rigidBodyConstructionInfo", &PhysicsComponentsConstructionInfo::m_rigidBodyConstructionInfo,
  649. "rigidBodyPresent", [](const PhysicsComponentsConstructionInfo &c1) -> bool { return c1.m_rigidBodyConstructionInfo != nullptr; },
  650. "createRigidBody", [](PhysicsComponentsConstructionInfo &c1) -> void { if(c1.m_rigidBodyConstructionInfo != nullptr) delete c1.m_rigidBodyConstructionInfo; c1.m_rigidBodyConstructionInfo = new RigidBodyComponent::RigidBodyComponentConstructionInfo(); });
  651. m_luaState.new_usertype<ScriptComponentsConstructionInfo>("ScriptComponentsConstructionInfo",
  652. sol::meta_function::garbage_collect, sol::destructor(&ScriptComponentsConstructionInfo::deleteConstructionInfo),
  653. "m_luaConstructionInfo", &ScriptComponentsConstructionInfo::m_luaConstructionInfo,
  654. "luaPresent", [](const ScriptComponentsConstructionInfo &c1) -> bool { return c1.m_luaConstructionInfo != nullptr; },
  655. "createLua", [](ScriptComponentsConstructionInfo &c1) -> void { if(c1.m_luaConstructionInfo != nullptr) delete c1.m_luaConstructionInfo; c1.m_luaConstructionInfo = new LuaComponent::LuaComponentConstructionInfo(); });
  656. m_luaState.new_usertype<WorldComponentsConstructionInfo>("WorldComponentsConstructionInfo",
  657. sol::meta_function::garbage_collect, sol::destructor(&WorldComponentsConstructionInfo::deleteConstructionInfo),
  658. "m_spatialConstructionInfo", &WorldComponentsConstructionInfo::m_spatialConstructionInfo,
  659. "spatialPresent", [](const WorldComponentsConstructionInfo &c1) -> bool { return c1.m_spatialConstructionInfo != nullptr; },
  660. "createSpatial", [](WorldComponentsConstructionInfo &c1) -> void { if(c1.m_spatialConstructionInfo != nullptr) delete c1.m_spatialConstructionInfo; c1.m_spatialConstructionInfo = new SpatialComponent::SpatialComponentConstructionInfo(); });
  661. m_luaState.new_usertype<CameraComponent::CameraComponentConstructionInfo>("CameraComponentConstructionInfo",
  662. "m_active", &CameraComponent::CameraComponentConstructionInfo::m_active,
  663. "m_name", &CameraComponent::CameraComponentConstructionInfo::m_name,
  664. "m_fov", &CameraComponent::CameraComponentConstructionInfo::m_fov);
  665. m_luaState.new_usertype<LightComponent::LightComponentConstructionInfo>("LightComponentConstructionInfo",
  666. "m_active", &LightComponent::LightComponentConstructionInfo::m_active,
  667. "m_name", &LightComponent::LightComponentConstructionInfo::m_name,
  668. "m_color", &LightComponent::LightComponentConstructionInfo::m_color,
  669. "m_direction", &LightComponent::LightComponentConstructionInfo::m_direction,
  670. "m_position", &LightComponent::LightComponentConstructionInfo::m_position,
  671. "m_intensity", &LightComponent::LightComponentConstructionInfo::m_intensity,
  672. "m_cutoffAngle", &LightComponent::LightComponentConstructionInfo::m_cutoffAngle,
  673. "m_lightComponentType", &LightComponent::LightComponentConstructionInfo::m_lightComponentType);
  674. m_luaState.new_usertype<ModelComponent::ModelComponentConstructionInfo>("ModelComponentConstructionInfo",
  675. "m_active", &ModelComponent::ModelComponentConstructionInfo::m_active,
  676. "m_name", &ModelComponent::ModelComponentConstructionInfo::m_name,
  677. "setMaterialColor", [=](ModelComponent::ModelComponentConstructionInfo &p_this, const int p_modelIndex, const int p_meshIndex, const MaterialType p_materialType, const glm::vec4 &p_color) -> void { p_this.m_modelsProperties.m_models[p_modelIndex].m_meshData[p_meshIndex].m_meshMaterialColors[p_materialType] = p_color; });
  678. m_luaState.new_usertype<ShaderComponent::ShaderComponentConstructionInfo>("ShaderComponentConstructionInfo",
  679. "m_active", &ShaderComponent::ShaderComponentConstructionInfo::m_active,
  680. "m_name", &ShaderComponent::ShaderComponentConstructionInfo::m_name,
  681. "m_geometryShaderFilename", &ShaderComponent::ShaderComponentConstructionInfo::m_geometryShaderFilename,
  682. "m_vetexShaderFilename", &ShaderComponent::ShaderComponentConstructionInfo::m_vetexShaderFilename,
  683. "m_fragmentShaderFilename", &ShaderComponent::ShaderComponentConstructionInfo::m_fragmentShaderFilename);
  684. m_luaState.new_usertype<RigidBodyComponent::RigidBodyComponentConstructionInfo>("RigidBodyComponentConstructionInfo",
  685. "m_active", &RigidBodyComponent::RigidBodyComponentConstructionInfo::m_active,
  686. "m_name", &RigidBodyComponent::RigidBodyComponentConstructionInfo::m_name,
  687. "m_friction", &RigidBodyComponent::RigidBodyComponentConstructionInfo::m_friction,
  688. "m_mass", &RigidBodyComponent::RigidBodyComponentConstructionInfo::m_mass,
  689. "m_restitution", &RigidBodyComponent::RigidBodyComponentConstructionInfo::m_restitution,
  690. "m_kinematic", &RigidBodyComponent::RigidBodyComponentConstructionInfo::m_kinematic,
  691. "m_linearVelocity", &RigidBodyComponent::RigidBodyComponentConstructionInfo::m_linearVelocity,
  692. "m_collisionShapeType", &RigidBodyComponent::RigidBodyComponentConstructionInfo::m_collisionShapeType,
  693. "m_collisionShapeSize", &RigidBodyComponent::RigidBodyComponentConstructionInfo::m_collisionShapeSize);
  694. m_luaState.new_usertype<LuaComponent::LuaComponentConstructionInfo>("LuaComponentConstructionInfo",
  695. "m_active", &LuaComponent::LuaComponentConstructionInfo::m_active,
  696. "m_name", &LuaComponent::LuaComponentConstructionInfo::m_name,
  697. "m_luaScriptFilename", &LuaComponent::LuaComponentConstructionInfo::m_luaScriptFilename);
  698. m_luaState.new_usertype<SpatialComponent::SpatialComponentConstructionInfo>("SpatialComponentConstructionInfo",
  699. "m_active", &SpatialComponent::SpatialComponentConstructionInfo::m_active,
  700. "m_name", &SpatialComponent::SpatialComponentConstructionInfo::m_name,
  701. "m_localPosition", &SpatialComponent::SpatialComponentConstructionInfo::m_localPosition,
  702. "m_localRotationEuler", &SpatialComponent::SpatialComponentConstructionInfo::m_localRotationEuler,
  703. "m_localRotationQuaternion", &SpatialComponent::SpatialComponentConstructionInfo::m_localRotationQuaternion,
  704. "m_localScale", &SpatialComponent::SpatialComponentConstructionInfo::m_localScale);
  705. // Graphics types
  706. m_luaState.new_usertype<TextureLoader2D::Texture2DHandle>("Texture2DHandle",
  707. "loadToMemory", &TextureLoader2D::Texture2DHandle::loadToMemory,
  708. "loadToVideoMemory", [this](TextureLoader2D::Texture2DHandle &p_v1) -> void { m_scriptScene->getSceneLoader()->getChangeController()->sendData(m_scriptScene->getSceneLoader()->getSystemScene(Systems::Graphics), DataType::DataType_LoadTexture2D, (void*)&p_v1); },
  709. "isLoadedToMemory", &TextureLoader2D::Texture2DHandle::isLoadedToMemory,
  710. "isLoadedToVideoMemory", &TextureLoader2D::Texture2DHandle::isLoadedToVideoMemory,
  711. "getTextureHeight", &TextureLoader2D::Texture2DHandle::getTextureHeight,
  712. "getTextureWidth", &TextureLoader2D::Texture2DHandle::getTextureWidth,
  713. "getFilename", &TextureLoader2D::Texture2DHandle::getFilename,
  714. "getEnableMipmap", &TextureLoader2D::Texture2DHandle::getEnableMipmap,
  715. "getHandle", &TextureLoader2D::Texture2DHandle::getHandle,
  716. "setEnableCompression", &TextureLoader2D::Texture2DHandle::setEnableCompression,
  717. "setEnableDownsampling", &TextureLoader2D::Texture2DHandle::setEnableDownsampling,
  718. "setEnableMipmapping", &TextureLoader2D::Texture2DHandle::setEnableMipmapping);
  719. // GUI types
  720. m_luaState.new_usertype<FileBrowserDialog>("FileBrowserDialog",
  721. //sol::meta_function::garbage_collect, sol::destructor(),
  722. sol::constructors<FileBrowserDialog()>(),
  723. "m_name", &FileBrowserDialog::m_name,
  724. "m_title", &FileBrowserDialog::m_title,
  725. "m_filter", &FileBrowserDialog::m_filter,
  726. "m_rootPath", &FileBrowserDialog::m_rootPath,
  727. "m_definedFilename", &FileBrowserDialog::m_definedFilename,
  728. "m_filePath", &FileBrowserDialog::m_filePath,
  729. "m_filename", &FileBrowserDialog::m_filename,
  730. "m_filePathName", &FileBrowserDialog::m_filePathName,
  731. "m_numOfSelectableFiles", &FileBrowserDialog::m_numOfSelectableFiles,
  732. "m_flags", &FileBrowserDialog::m_flags,
  733. "m_opened", &FileBrowserDialog::m_opened,
  734. "m_closed", &FileBrowserDialog::m_closed,
  735. "m_success", &FileBrowserDialog::m_success,
  736. "reset", &FileBrowserDialog::reset);
  737. // Misc types
  738. m_luaState.new_usertype<Conditional>("Conditional",
  739. "isChecked", &Conditional::isChecked,
  740. "check", &Conditional::check,
  741. "uncheck", &Conditional::uncheck,
  742. "set", &Conditional::set);
  743. }
  744. void LuaScript::setLuaVariables()
  745. {
  746. // Iterate over variables array and set each variable depending on its type
  747. for(decltype(m_variables.size()) i = 0, size = m_variables.size(); i < size; i++)
  748. {
  749. switch(m_variables[i].second.getVariableType())
  750. {
  751. case Property::Type_bool:
  752. m_luaState.set(m_variables[i].first, m_variables[i].second.getBool());
  753. break;
  754. case Property::Type_int:
  755. m_luaState.set(m_variables[i].first, m_variables[i].second.getInt());
  756. break;
  757. case Property::Type_float:
  758. m_luaState.set(m_variables[i].first, m_variables[i].second.getFloat());
  759. break;
  760. case Property::Type_double:
  761. m_luaState.set(m_variables[i].first, m_variables[i].second.getDouble());
  762. break;
  763. case Property::Type_vec2i:
  764. m_luaState.set(m_variables[i].first, m_variables[i].second.getVec2i());
  765. break;
  766. case Property::Type_vec2f:
  767. m_luaState.set(m_variables[i].first, m_variables[i].second.getVec2f());
  768. break;
  769. case Property::Type_vec3f:
  770. m_luaState.set(m_variables[i].first, m_variables[i].second.getVec3f());
  771. break;
  772. case Property::Type_vec4f:
  773. m_luaState.set(m_variables[i].first, m_variables[i].second.getVec4f());
  774. break;
  775. case Property::Type_string:
  776. m_luaState.set(m_variables[i].first, m_variables[i].second.getString());
  777. break;
  778. case Property::Type_propertyID:
  779. m_luaState.set(m_variables[i].first, GetString(m_variables[i].second.getID()));
  780. break;
  781. }
  782. }
  783. }
  784. void LuaScript::createObjectInLua(const unsigned int p_objectType, const std::string p_variableName)
  785. {
  786. // Check if the object type is in a valid range and if the variable name isn't empty
  787. if(p_objectType >= 0 && p_objectType < LuaDefinitions::UserTypes::NumOfTypes && !p_variableName.empty())
  788. {
  789. switch(p_objectType)
  790. {
  791. case LuaDefinitions::Conditional:
  792. {
  793. // Create a new Conditional
  794. Conditional *newConditional = new Conditional();
  795. // Set the given variable name in Lua to point to the created Conditional
  796. m_luaState.set(p_variableName, newConditional);
  797. // Add the conditional pointer to an array so it is not lost
  798. m_conditionals.push_back(newConditional);
  799. }
  800. break;
  801. case LuaDefinitions::EngineVariables:
  802. // Set the given variable name in Lua to point to the EngineVariables object
  803. m_luaState.set(p_variableName, &Config::engineVar());
  804. break;
  805. case LuaDefinitions::GameplayVariables:
  806. // Set the given variable name in Lua to point to the GameplayVariables object
  807. m_luaState.set(p_variableName, &Config::gameplayVar());
  808. break;
  809. case LuaDefinitions::GraphicsVariables:
  810. // Set the given variable name in Lua to point to the GraphicsVariables object
  811. m_luaState.set(p_variableName, &Config::graphicsVar());
  812. break;
  813. case LuaDefinitions::InputVariables:
  814. // Set the given variable name in Lua to point to the InputVariables object
  815. m_luaState.set(p_variableName, &Config::inputVar());
  816. break;
  817. case LuaDefinitions::KeyCommand:
  818. {
  819. // Create new key command
  820. KeyCommand *keyCommand = new KeyCommand();
  821. // Set the given variable name in Lua to point to the created key command
  822. m_luaState.set(p_variableName, keyCommand);
  823. // Add key command pointer to an array so it is not lost
  824. m_keyCommands.push_back(std::make_pair(p_variableName, keyCommand));
  825. }
  826. break;
  827. case LuaDefinitions::MouseInfo:
  828. // Set the given variable name in Lua to point to the MouseInfo object
  829. m_luaState.set(p_variableName, WindowLocator::get().getMouseInfo());
  830. break;
  831. case LuaDefinitions::PathsVariables:
  832. // Set the given variable name in Lua to point to the PathsVariables object
  833. m_luaState.set(p_variableName, &Config::filepathVar());
  834. break;
  835. case LuaDefinitions::SpatialDataManager:
  836. // Set the given variable name in Lua to point to the Spatial Data Manager object
  837. m_luaState.set(p_variableName, &m_spatialData);
  838. break;
  839. case LuaDefinitions::WindowVariables:
  840. // Set the given variable name in Lua to point to the WindowVariables object
  841. m_luaState.set(p_variableName, &Config::windowVar());
  842. break;
  843. case LuaDefinitions::ComponentsInfo:
  844. {
  845. // Create a new object
  846. ComponentsConstructionInfo *newConstructionInfo = new ComponentsConstructionInfo();
  847. // Set the given variable name in Lua to point to the created object
  848. m_luaState.set(p_variableName, newConstructionInfo);
  849. // Add the object pointer to an array so it is not lost
  850. m_componentsConstructionInfo.push_back(newConstructionInfo);
  851. }
  852. break;
  853. case LuaDefinitions::GraphicsComponentInfo:
  854. {
  855. // Create a new Conditional
  856. GraphicsComponentsConstructionInfo *newConstructionInfo = new GraphicsComponentsConstructionInfo();
  857. // Set the given variable name in Lua to point to the created Conditional
  858. m_luaState.set(p_variableName, newConstructionInfo);
  859. }
  860. break;
  861. case LuaDefinitions::GUIComponentInfo:
  862. {
  863. // Create a new Conditional
  864. GUIComponentsConstructionInfo *newConstructionInfo = new GUIComponentsConstructionInfo();
  865. // Set the given variable name in Lua to point to the created Conditional
  866. m_luaState.set(p_variableName, newConstructionInfo);
  867. }
  868. break;
  869. case LuaDefinitions::PhysicsComponentInfo:
  870. {
  871. // Create a new Conditional
  872. PhysicsComponentsConstructionInfo *newConstructionInfo = new PhysicsComponentsConstructionInfo();
  873. // Set the given variable name in Lua to point to the created Conditional
  874. m_luaState.set(p_variableName, newConstructionInfo);
  875. }
  876. break;
  877. case LuaDefinitions::ScriptComponentInfo:
  878. {
  879. // Create a new Conditional
  880. ScriptComponentsConstructionInfo *newConstructionInfo = new ScriptComponentsConstructionInfo();
  881. // Set the given variable name in Lua to point to the created Conditional
  882. m_luaState.set(p_variableName, newConstructionInfo);
  883. }
  884. break;
  885. case LuaDefinitions::WorldComponentInfo:
  886. {
  887. // Create a new Conditional
  888. WorldComponentsConstructionInfo *newConstructionInfo = new WorldComponentsConstructionInfo();
  889. // Set the given variable name in Lua to point to the created Conditional
  890. m_luaState.set(p_variableName, newConstructionInfo);
  891. }
  892. break;
  893. default:
  894. break;
  895. }
  896. }
  897. }