Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

308 rindas
16 KiB

  1. //
  2. // Lol Engine — EasyMesh Lua loader
  3. //
  4. // Copyright © 2009—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com>
  5. //
  6. // Lol Engine is free software. It comes without any warranty, to
  7. // the extent permitted by applicable law. You can redistribute it
  8. // and/or modify it under the terms of the Do What the Fuck You Want
  9. // to Public License, Version 2, as published by the WTFPL Task Force.
  10. // See http://www.wtfpl.net/ for more details.
  11. //
  12. #if HAVE_CONFIG_H
  13. # include "config.h"
  14. #endif
  15. #include <cstdio>
  16. #include <lol/engine.h>
  17. #include "loldebug.h"
  18. using namespace lol;
  19. //-----------------------------------------------------------------------------
  20. EasyMeshLuaLoader::EasyMeshLuaLoader() : LuaLoader()
  21. {
  22. lua_State* l = GetLuaState();
  23. //Registering demo object
  24. LuaObjectHelper::Register<EasyMeshLuaObject>(l);
  25. }
  26. //-----------------------------------------------------------------------------
  27. EasyMeshLuaLoader::~EasyMeshLuaLoader()
  28. {
  29. }
  30. //-----------------------------------------------------------------------------
  31. static array<EasyMeshLuaObject*> g_instances;
  32. void EasyMeshLuaLoader::Store(LuaObject* obj)
  33. {
  34. EasyMeshLuaObject* ezm = static_cast<EasyMeshLuaObject*>(obj);
  35. g_instances << ezm;
  36. }
  37. //-----------------------------------------------------------------------------
  38. array<EasyMeshLuaObject*>& EasyMeshLuaLoader::GetInstances()
  39. {
  40. return g_instances;
  41. }
  42. //-----------------------------------------------------------------------------
  43. map<String, EasyMeshLuaObject*> EasyMeshLuaLoader::m_meshes;
  44. void EasyMeshLuaLoader::RegisterMesh(EasyMeshLuaObject* mesh, String const& name)
  45. {
  46. m_meshes[name] = mesh;
  47. }
  48. //-----------------------------------------------------------------------------
  49. bool EasyMeshLuaLoader::GetRegisteredMeshes(map<String, EasyMeshLuaObject*>& meshes)
  50. {
  51. meshes = m_meshes;
  52. return !!m_meshes.count();
  53. }
  54. //-----------------------------------------------------------------------------
  55. EasyMeshLuaObject::EasyMeshLuaObject(String const& name) : LuaObject()
  56. {
  57. if (!!name.count())
  58. EasyMeshLuaLoader::RegisterMesh(this, name);
  59. }
  60. //-----------------------------------------------------------------------------
  61. EasyMeshLuaObject::~EasyMeshLuaObject()
  62. {
  63. }
  64. //-----------------------------------------------------------------------------
  65. EasyMeshLuaObject* EasyMeshLuaObject::New(lua_State* l, int arg_nb)
  66. {
  67. UNUSED(l);
  68. UNUSED(arg_nb);
  69. LuaStack s = LuaStack::Begin(l);
  70. String str = s.Get<String>("");
  71. return new EasyMeshLuaObject(str);
  72. }
  73. //-----------------------------------------------------------------------------
  74. const LuaObjectLibrary* EasyMeshLuaObject::GetLib()
  75. {
  76. #define EMLO EasyMeshLuaObject
  77. static const LuaObjectLibrary lib = LuaObjectLibrary(
  78. "EasyMesh",
  79. //Statics
  80. { { nullptr, nullptr } },
  81. //Methods
  82. {
  83. //-----------------------------------------------------------------
  84. { "AddCylinder", &EMLO::AppendCylinder }, { "ac", &EMLO::AppendCylinder },
  85. { "AddSphere", &EMLO::AppendSphere }, { "asph", &EMLO::AppendSphere },
  86. { "AddCapsule", &EMLO::AppendCapsule }, { "acap", &EMLO::AppendCapsule },
  87. { "AddTorus", &EMLO::AppendTorus }, { "ato", &EMLO::AppendTorus },
  88. { "AddBox", &EMLO::AppendBox }, { "ab", &EMLO::AppendBox },
  89. { "AddStar", &EMLO::AppendStar }, { "as", &EMLO::AppendStar },
  90. { "AddExpandedStar", &EMLO::AppendExpandedStar }, { "aes", &EMLO::AppendExpandedStar },
  91. { "AddDisc", &EMLO::AppendDisc }, { "ad", &EMLO::AppendDisc },
  92. { "AddTriangle", &EMLO::AppendSimpleTriangle }, { "at", &EMLO::AppendSimpleTriangle },
  93. { "AddQuad", &EMLO::AppendSimpleQuad }, { "aq", &EMLO::AppendSimpleQuad },
  94. { "AddCog", &EMLO::AppendCog }, { "acog", &EMLO::AppendCog },
  95. //-----------------------------------------------------------------
  96. { "SetColor", &EMLO::SetCurColor }, { "sc", &EMLO::SetCurColor },
  97. { "SetColorA", &EMLO::SetCurColorA }, { "sca", &EMLO::SetCurColorA },
  98. { "SetColorB", &EMLO::SetCurColorB }, { "scb", &EMLO::SetCurColorB },
  99. { "SetColorV", &EMLO::SetVertColor }, { "scv", &EMLO::SetVertColor },
  100. //-----------------------------------------------------------------
  101. { "TranslateX", &EMLO::TranslateX }, { "tx", &EMLO::TranslateX },
  102. { "TranslateY", &EMLO::TranslateY }, { "ty", &EMLO::TranslateY },
  103. { "TranslateZ", &EMLO::TranslateZ }, { "tz", &EMLO::TranslateZ },
  104. { "Translate", &Translate }, { "t", &Translate },
  105. //-----------------------------------------------------------------
  106. { "RotateX", &EMLO::RotateX }, { "rx", &EMLO::RotateX },
  107. { "RotateY", &EMLO::RotateY }, { "ry", &EMLO::RotateY },
  108. { "RotateZ", &EMLO::RotateZ }, { "rz", &EMLO::RotateZ },
  109. { "Rotate", &Rotate }, { "r", &Rotate },
  110. //-----------------------------------------------------------------
  111. { "ScaleX", &EMLO::ScaleX }, { "sx", &EMLO::ScaleX },
  112. { "ScaleY", &EMLO::ScaleY }, { "sy", &EMLO::ScaleY },
  113. { "ScaleZ", &EMLO::ScaleZ }, { "sz", &EMLO::ScaleZ },
  114. { "Scale", &EMLO::Scale }, { "s", &EMLO::Scale },
  115. //-----------------------------------------------------------------
  116. { "RadialJitter", &EMLO::RadialJitter }, { "rj", &EMLO::RadialJitter },
  117. //-----------------------------------------------------------------
  118. { "TaperX", &EMLO::TaperX }, { "tax", &EMLO::TaperX },
  119. { "TaperY", &EMLO::TaperY }, { "tay", &EMLO::TaperY },
  120. { "TaperZ", &EMLO::TaperZ }, { "taz", &EMLO::TaperZ },
  121. //-----------------------------------------------------------------
  122. { "TwistX", &EMLO::TwistX }, { "twx", &EMLO::TwistX },
  123. { "TwistY", &EMLO::TwistY }, { "twy", &EMLO::TwistY },
  124. { "TwistZ", &EMLO::TwistZ }, { "twz", &EMLO::TwistZ },
  125. //-----------------------------------------------------------------
  126. { "ShearX", &EMLO::ShearX }, { "shx", &EMLO::ShearX },
  127. { "ShearY", &EMLO::ShearY }, { "shy", &EMLO::ShearY },
  128. { "ShearZ", &EMLO::ShearZ }, { "shz", &EMLO::ShearZ },
  129. //-----------------------------------------------------------------
  130. { "StretchX", &EMLO::StretchX }, { "stx", &EMLO::StretchX },
  131. { "StretchY", &EMLO::StretchY }, { "sty", &EMLO::StretchY },
  132. { "StretchZ", &EMLO::StretchZ }, { "stz", &EMLO::StretchZ },
  133. //-----------------------------------------------------------------
  134. { "BendXY", &EMLO::BendXY }, { "bdxy", &EMLO::BendXY },
  135. { "BendXZ", &EMLO::BendXZ }, { "bdxz", &EMLO::BendXZ },
  136. { "BendYX", &EMLO::BendYX }, { "bdyx", &EMLO::BendYX },
  137. { "BendYZ", &EMLO::BendYZ }, { "bdyz", &EMLO::BendYZ },
  138. { "BendZX", &EMLO::BendZX }, { "bdzx", &EMLO::BendZX },
  139. { "BendZY", &EMLO::BendZY }, { "bdzy", &EMLO::BendZY },
  140. //-----------------------------------------------------------------
  141. { "MirrorX", &EMLO::MirrorX }, { "mx", &EMLO::MirrorX },
  142. { "MirrorY", &EMLO::MirrorY }, { "my", &EMLO::MirrorY },
  143. { "MirrorZ", &EMLO::MirrorZ }, { "mz", &EMLO::MirrorZ },
  144. //-----------------------------------------------------------------
  145. { "Loop", &EMLO::LoopStart }, { "lp", &EMLO::LoopStart },
  146. { "LoopDo", &EMLO::LoopEnd }, { "ld", &EMLO::LoopEnd },
  147. { "BraceOpen", &EMLO::OpenBrace }, { "bop", &EMLO::OpenBrace },
  148. { "BraceClose", &EMLO::CloseBrace }, { "bcl", &EMLO::CloseBrace },
  149. //-----------------------------------------------------------------
  150. { "VerticeMerge", &EMLO::VerticesMerge }, { "vm", &EMLO::VerticesMerge },
  151. { "VerticeSeparate", &EMLO::VerticesSeparate }, { "vs", &EMLO::VerticesSeparate },
  152. { "VerticesCleanup", &EMLO::VerticesCleanup }, { "vc", &EMLO::VerticesCleanup },
  153. //-----------------------------------------------------------------
  154. { "Duplicate", &EMLO::Duplicate }, { "dup", &EMLO::Duplicate },
  155. { "Smooth", &EMLO::Smooth }, { "smth", &EMLO::Smooth },
  156. { "SplitTriangles", &EMLO::SplitTriangles }, { "splt", &EMLO::SplitTriangles },
  157. { "Chamfer", &EMLO::Chamfer }, { "cf", &EMLO::Chamfer },
  158. //-----------------------------------------------------------------
  159. { "ToggleScaleWinding", &EMLO::ToggleScaleWinding }, { "tsw", &EMLO::ToggleScaleWinding },
  160. { "ToggleQuadWeighting", &EMLO::ToggleQuadWeighting }, { "tqw", &EMLO::ToggleQuadWeighting },
  161. { "TogglePostBuildNormal", &EMLO::TogglePostBuildNormal }, { "tpbn", &EMLO::TogglePostBuildNormal },
  162. { "ToggleVerticeNoCleanup", &EMLO::ToggleVerticeNoCleanup }, { "tvnc", &EMLO::ToggleVerticeNoCleanup },
  163. //-----------------------------------------------------------------
  164. },
  165. //Variables
  166. { { nullptr, nullptr, nullptr } });
  167. return &lib;
  168. #undef EMLO
  169. }
  170. //-----------------------------------------------------------------------------
  171. bool EasyMesh::Compile(char const *command, bool execute)
  172. {
  173. bool res = false;
  174. // FIXME: make this work again
  175. UNUSED(command, execute);
  176. #if 0
  177. EasyMeshCompiler mc(*this);
  178. BD()->Enable(MeshBuildOperation::CommandRecording);
  179. if ((res = mc.ParseString(command)))
  180. {
  181. BD()->Disable(MeshBuildOperation::CommandRecording);
  182. if (execute)
  183. ExecuteCmdStack();
  184. }
  185. #endif
  186. return res;
  187. }
  188. //-----------------------------------------------------------------------------
  189. #define EZSET(M0) BD()->CmdStack().GetValue(M0);
  190. #define EZDEF_1(T0) T0 m0; EZSET(m0)
  191. #define EZDEF_2(T0, T1) EZDEF_1(T0) T1 m1; EZSET(m1)
  192. #define EZDEF_3(T0, T1, T2) EZDEF_2(T0, T1) T2 m2; EZSET(m2)
  193. #define EZDEF_4(T0, T1, T2, T3) EZDEF_3(T0, T1, T2) T3 m3; EZSET(m3)
  194. #define EZDEF_5(T0, T1, T2, T3, T4) EZDEF_4(T0, T1, T2, T3) T4 m4; EZSET(m4)
  195. #define EZDEF_6(T0, T1, T2, T3, T4, T5) EZDEF_5(T0, T1, T2, T3, T4) T5 m5; EZSET(m5)
  196. #define EZDEF_7(T0, T1, T2, T3, T4, T5, T6) EZDEF_6(T0, T1, T2, T3, T4, T5) T6 m6; EZSET(m6)
  197. #define EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) EZDEF_7(T0, T1, T2, T3, T4, T5, T6) T7 m7; EZSET(m7)
  198. #define EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) T8 m8; EZSET(m8)
  199. #define EZDEF_10(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) T9 m9; EZSET(m9)
  200. //----
  201. #define EZCALL_1(F) F();
  202. #define EZCALL_2(F, T0) EZDEF_1(T0) F(m0);
  203. #define EZCALL_3(F, T0, T1) EZDEF_2(T0, T1) F(m0, m1);
  204. #define EZCALL_4(F, T0, T1, T2) EZDEF_3(T0, T1, T2) F(m0, m1, m2);
  205. #define EZCALL_5(F, T0, T1, T2, T3) EZDEF_4(T0, T1, T2, T3) F(m0, m1, m2, m3);
  206. #define EZCALL_6(F, T0, T1, T2, T3, T4) EZDEF_5(T0, T1, T2, T3, T4) F(m0, m1, m2, m3, m4);
  207. #define EZCALL_7(F, T0, T1, T2, T3, T4, T5) EZDEF_6(T0, T1, T2, T3, T4, T5) F(m0, m1, m2, m3, m4, m5);
  208. #define EZCALL_8(F, T0, T1, T2, T3, T4, T5, T6) EZDEF_7(T0, T1, T2, T3, T4, T5, T6) F(m0, m1, m2, m3, m4, m5, m6);
  209. #define EZCALL_9(F, T0, T1, T2, T3, T4, T5, T6, T7) EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) F(m0, m1, m2, m3, m4, m5, m6, m7);
  210. #define EZCALL_10(F, T0, T1, T2, T3, T4, T5, T6, T7, T8) EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) F(m0, m1, m2, m3, m4, m5, m6, m7, m8);
  211. #define EZCALL_11(F, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) EZDEF_10(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) F(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9);
  212. //----
  213. #define EZM_CALL_FUNC(...) \
  214. LOL_CALL(LOL_CAT(EZCALL_, LOL_CALL(LOL_COUNT_TO_12, (__VA_ARGS__))), (__VA_ARGS__))
  215. //-----------------------------------------------------------------------------
  216. void EasyMesh::ExecuteCmdStack(bool ExecAllStack)
  217. {
  218. #define DO_EXEC_CMD(MESH_CMD, FUNC_PARAMS) \
  219. case EasyMeshCmdType::MESH_CMD: \
  220. { EZM_CALL_FUNC FUNC_PARAMS; break; }
  221. BD()->Enable(MeshBuildOperation::CommandExecution);
  222. if (ExecAllStack)
  223. BD()->Cmdi() = 0;
  224. for (; BD()->Cmdi() < BD()->CmdStack().GetCmdNb() && BD()->CmdExecNb() != 0; ++BD()->Cmdi())
  225. {
  226. if (BD()->CmdExecNb() > 0)
  227. --BD()->CmdExecNb();
  228. switch (BD()->CmdStack().GetCmd(BD()->Cmdi()))
  229. {
  230. DO_EXEC_CMD(MeshCsg, (MeshCsg, CSGUsage))
  231. DO_EXEC_CMD(LoopStart, (LoopStart, int))
  232. DO_EXEC_CMD(LoopEnd, (LoopEnd))
  233. DO_EXEC_CMD(OpenBrace, (OpenBrace))
  234. DO_EXEC_CMD(CloseBrace, (CloseBrace))
  235. DO_EXEC_CMD(ScaleWinding, (ToggleScaleWinding))
  236. DO_EXEC_CMD(QuadWeighting, (ToggleQuadWeighting))
  237. DO_EXEC_CMD(PostBuildNormal, (TogglePostBuildNormal))
  238. DO_EXEC_CMD(PreventVertCleanup, (ToggleVerticeNoCleanup))
  239. DO_EXEC_CMD(VerticesMerge, (VerticesMerge))
  240. DO_EXEC_CMD(VerticesSeparate, (VerticesSeparate))
  241. DO_EXEC_CMD(SetColorA, (SetCurColorA, vec4))
  242. DO_EXEC_CMD(SetColorB, (SetCurColorB, vec4))
  243. DO_EXEC_CMD(SetVertColor, (SetVertColor, vec4))
  244. DO_EXEC_CMD(Translate, (Translate, vec3))
  245. DO_EXEC_CMD(Rotate, (Rotate, float, vec3))
  246. DO_EXEC_CMD(RadialJitter, (RadialJitter, float))
  247. DO_EXEC_CMD(MeshTranform, (DoMeshTransform, MeshTransform, Axis, Axis, float, float, float, bool))
  248. DO_EXEC_CMD(Scale, (Scale, vec3))
  249. DO_EXEC_CMD(DupAndScale, (DupAndScale, vec3, bool))
  250. DO_EXEC_CMD(Chamfer, (Chamfer, float))
  251. DO_EXEC_CMD(SplitTriangles, (SplitTriangles, int))
  252. DO_EXEC_CMD(SmoothMesh, (SmoothMesh, int, int, int))
  253. DO_EXEC_CMD(AppendCylinder, (AppendCylinder, int, float, float, float, bool, bool, bool))
  254. DO_EXEC_CMD(AppendCapsule, (AppendCapsule, int, float, float))
  255. DO_EXEC_CMD(AppendTorus, (AppendTorus, int, float, float))
  256. DO_EXEC_CMD(AppendBox, (AppendBox, vec3, float, bool))
  257. DO_EXEC_CMD(AppendStar, (AppendStar, int, float, float, bool, bool))
  258. DO_EXEC_CMD(AppendExpandedStar, (AppendExpandedStar, int, float, float, float))
  259. DO_EXEC_CMD(AppendDisc, (AppendDisc, int, float, bool))
  260. DO_EXEC_CMD(AppendSimpleTriangle, (AppendSimpleTriangle, float, bool))
  261. DO_EXEC_CMD(AppendSimpleQuad, (AppendSimpleQuad, vec2, vec2, float, bool))
  262. DO_EXEC_CMD(AppendCog, (AppendCog, int, float, float, float, float, float, float, float, float, bool))
  263. default:
  264. ASSERT(0, "Unknown command pseudo bytecode");
  265. }
  266. }
  267. BD()->Disable(MeshBuildOperation::CommandExecution);
  268. if (!BD()->IsEnabled(MeshBuildOperation::PreventVertCleanup))
  269. VerticesCleanup();
  270. if (BD()->IsEnabled(MeshBuildOperation::PostBuildComputeNormals))
  271. ComputeNormals(0, m_indices.count());
  272. BD()->Disable(MeshBuildOperation::PostBuildComputeNormals);
  273. BD()->Disable(MeshBuildOperation::PreventVertCleanup);
  274. if (BD()->CmdExecNb() > 0)
  275. BD()->CmdExecNb() = -1;
  276. }