305 řádky
15 KiB

  1. //
  2. // MY CLASS TYPE
  3. //
  4. // Copyright © 2009-2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com>
  5. //
  6. // This program 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. LuaState* l = GetLuaState();
  23. //Registering demo object
  24. LuaObjectDef::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(LuaState* l, int arg_nb)
  66. {
  67. UNUSED(l);
  68. UNUSED(arg_nb);
  69. LuaStack s(l);
  70. LuaString n("", true);
  71. s >> n;
  72. return new EasyMeshLuaObject(n());
  73. }
  74. //-----------------------------------------------------------------------------
  75. const LuaObjectLib* EasyMeshLuaObject::GetLib()
  76. {
  77. typedef EasyMeshLuaObject EMLO;
  78. static const LuaObjectLib lib = LuaObjectLib(
  79. "EasyMesh",
  80. //Statics
  81. { { nullptr, nullptr } },
  82. //Methods
  83. {
  84. //-----------------------------------------------------------------
  85. { "AddCylinder", &EMLO::AppendCylinder }, { "ac", &EMLO::AppendCylinder },
  86. { "AddSphere", &EMLO::AppendSphere }, { "asph", &EMLO::AppendSphere },
  87. { "AddCapsule", &EMLO::AppendCapsule }, { "acap", &EMLO::AppendCapsule },
  88. { "AddTorus", &EMLO::AppendTorus }, { "ato", &EMLO::AppendTorus },
  89. { "AddBox", &EMLO::AppendBox }, { "ab", &EMLO::AppendBox },
  90. { "AddStar", &EMLO::AppendStar }, { "as", &EMLO::AppendStar },
  91. { "AddExpandedStar", &EMLO::AppendExpandedStar }, { "aes", &EMLO::AppendExpandedStar },
  92. { "AddDisc", &EMLO::AppendDisc }, { "ad", &EMLO::AppendDisc },
  93. { "AddTriangle", &EMLO::AppendSimpleTriangle }, { "at", &EMLO::AppendSimpleTriangle },
  94. { "AddQuad", &EMLO::AppendSimpleQuad }, { "aq", &EMLO::AppendSimpleQuad },
  95. { "AddCog", &EMLO::AppendCog }, { "acog", &EMLO::AppendCog },
  96. //-----------------------------------------------------------------
  97. { "SetColor", &EMLO::SetCurColor }, { "sc", &EMLO::SetCurColor },
  98. { "SetColorA", &EMLO::SetCurColorA }, { "sca", &EMLO::SetCurColorA },
  99. { "SetColorB", &EMLO::SetCurColorB }, { "scb", &EMLO::SetCurColorB },
  100. { "SetColorV", &EMLO::SetVertColor }, { "scv", &EMLO::SetVertColor },
  101. //-----------------------------------------------------------------
  102. { "TranslateX", &EMLO::TranslateX }, { "tx", &EMLO::TranslateX },
  103. { "TranslateY", &EMLO::TranslateY }, { "ty", &EMLO::TranslateY },
  104. { "TranslateZ", &EMLO::TranslateZ }, { "tz", &EMLO::TranslateZ },
  105. { "Translate", &Translate }, { "t", &Translate },
  106. //-----------------------------------------------------------------
  107. { "RotateX", &EMLO::RotateX }, { "rx", &EMLO::RotateX },
  108. { "RotateY", &EMLO::RotateY }, { "ry", &EMLO::RotateY },
  109. { "RotateZ", &EMLO::RotateZ }, { "rz", &EMLO::RotateZ },
  110. { "Rotate", &Rotate }, { "r", &Rotate },
  111. //-----------------------------------------------------------------
  112. { "ScaleX", &EMLO::ScaleX }, { "sx", &EMLO::ScaleX },
  113. { "ScaleY", &EMLO::ScaleY }, { "sy", &EMLO::ScaleY },
  114. { "ScaleZ", &EMLO::ScaleZ }, { "sz", &EMLO::ScaleZ },
  115. { "Scale", &EMLO::Scale }, { "s", &EMLO::Scale },
  116. //-----------------------------------------------------------------
  117. { "RadialJitter", &EMLO::RadialJitter }, { "rj", &EMLO::RadialJitter },
  118. //-----------------------------------------------------------------
  119. { "TaperX", &EMLO::TaperX }, { "tax", &EMLO::TaperX },
  120. { "TaperY", &EMLO::TaperY }, { "tay", &EMLO::TaperY },
  121. { "TaperZ", &EMLO::TaperZ }, { "taz", &EMLO::TaperZ },
  122. //-----------------------------------------------------------------
  123. { "TwistX", &EMLO::TwistX }, { "twx", &EMLO::TwistX },
  124. { "TwistY", &EMLO::TwistY }, { "twy", &EMLO::TwistY },
  125. { "TwistZ", &EMLO::TwistZ }, { "twz", &EMLO::TwistZ },
  126. //-----------------------------------------------------------------
  127. { "ShearX", &EMLO::ShearX }, { "shx", &EMLO::ShearX },
  128. { "ShearY", &EMLO::ShearY }, { "shy", &EMLO::ShearY },
  129. { "ShearZ", &EMLO::ShearZ }, { "shz", &EMLO::ShearZ },
  130. //-----------------------------------------------------------------
  131. { "StretchX", &EMLO::StretchX }, { "stx", &EMLO::StretchX },
  132. { "StretchY", &EMLO::StretchY }, { "sty", &EMLO::StretchY },
  133. { "StretchZ", &EMLO::StretchZ }, { "stz", &EMLO::StretchZ },
  134. //-----------------------------------------------------------------
  135. { "BendXY", &EMLO::BendXY }, { "bdxy", &EMLO::BendXY },
  136. { "BendXZ", &EMLO::BendXZ }, { "bdxz", &EMLO::BendXZ },
  137. { "BendYX", &EMLO::BendYX }, { "bdyx", &EMLO::BendYX },
  138. { "BendYZ", &EMLO::BendYZ }, { "bdyz", &EMLO::BendYZ },
  139. { "BendZX", &EMLO::BendZX }, { "bdzx", &EMLO::BendZX },
  140. { "BendZY", &EMLO::BendZY }, { "bdzy", &EMLO::BendZY },
  141. //-----------------------------------------------------------------
  142. { "MirrorX", &EMLO::MirrorX }, { "mx", &EMLO::MirrorX },
  143. { "MirrorY", &EMLO::MirrorY }, { "my", &EMLO::MirrorY },
  144. { "MirrorZ", &EMLO::MirrorZ }, { "mz", &EMLO::MirrorZ },
  145. //-----------------------------------------------------------------
  146. { "Loop", &EMLO::LoopStart }, { "lp", &EMLO::LoopStart },
  147. { "LoopDo", &EMLO::LoopEnd }, { "ld", &EMLO::LoopEnd },
  148. { "BraceOpen", &EMLO::OpenBrace }, { "bop", &EMLO::OpenBrace },
  149. { "BraceClose", &EMLO::CloseBrace }, { "bcl", &EMLO::CloseBrace },
  150. //-----------------------------------------------------------------
  151. { "VerticeMerge", &EMLO::VerticesMerge }, { "vm", &EMLO::VerticesMerge },
  152. { "VerticeSeparate", &EMLO::VerticesSeparate }, { "vs", &EMLO::VerticesSeparate },
  153. { "VerticesCleanup", &EMLO::VerticesCleanup }, { "vc", &EMLO::VerticesCleanup },
  154. //-----------------------------------------------------------------
  155. { "Duplicate", &EMLO::Duplicate }, { "dup", &EMLO::Duplicate },
  156. { "Smooth", &EMLO::Smooth }, { "smth", &EMLO::Smooth },
  157. { "SplitTriangles", &EMLO::SplitTriangles }, { "splt", &EMLO::SplitTriangles },
  158. { "Chamfer", &EMLO::Chamfer }, { "cf", &EMLO::Chamfer },
  159. //-----------------------------------------------------------------
  160. { "ToggleScaleWinding", &EMLO::ToggleScaleWinding }, { "tsw", &EMLO::ToggleScaleWinding },
  161. { "ToggleQuadWeighting", &EMLO::ToggleQuadWeighting }, { "tqw", &EMLO::ToggleQuadWeighting },
  162. { "TogglePostBuildNormal", &EMLO::TogglePostBuildNormal }, { "tpbn", &EMLO::TogglePostBuildNormal },
  163. { "ToggleVerticeNoCleanup", &EMLO::ToggleVerticeNoCleanup }, { "tvnc", &EMLO::ToggleVerticeNoCleanup },
  164. //-----------------------------------------------------------------
  165. },
  166. //Variables
  167. { { nullptr, nullptr, nullptr } });
  168. return &lib;
  169. }
  170. //-----------------------------------------------------------------------------
  171. bool EasyMesh::Compile(char const *command, bool Execute)
  172. {
  173. bool res = false;
  174. // FIXME: make this work again
  175. #if 0
  176. EasyMeshCompiler mc(*this);
  177. BD()->Enable(MeshBuildOperation::CommandRecording);
  178. if ((res = mc.ParseString(command)))
  179. {
  180. BD()->Disable(MeshBuildOperation::CommandRecording);
  181. if (Execute)
  182. ExecuteCmdStack();
  183. }
  184. #endif
  185. return res;
  186. }
  187. //-----------------------------------------------------------------------------
  188. #define EZSET(M0) BD()->CmdStack().GetValue(M0);
  189. #define EZDEF_1(T0) T0 m0; EZSET(m0)
  190. #define EZDEF_2(T0, T1) EZDEF_1(T0) T1 m1; EZSET(m1)
  191. #define EZDEF_3(T0, T1, T2) EZDEF_2(T0, T1) T2 m2; EZSET(m2)
  192. #define EZDEF_4(T0, T1, T2, T3) EZDEF_3(T0, T1, T2) T3 m3; EZSET(m3)
  193. #define EZDEF_5(T0, T1, T2, T3, T4) EZDEF_4(T0, T1, T2, T3) T4 m4; EZSET(m4)
  194. #define EZDEF_6(T0, T1, T2, T3, T4, T5) EZDEF_5(T0, T1, T2, T3, T4) T5 m5; EZSET(m5)
  195. #define EZDEF_7(T0, T1, T2, T3, T4, T5, T6) EZDEF_6(T0, T1, T2, T3, T4, T5) T6 m6; EZSET(m6)
  196. #define EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) EZDEF_7(T0, T1, T2, T3, T4, T5, T6) T7 m7; EZSET(m7)
  197. #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)
  198. #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)
  199. //----
  200. #define EZCALL_1(F) F();
  201. #define EZCALL_2(F, T0) EZDEF_1(T0) F(m0);
  202. #define EZCALL_3(F, T0, T1) EZDEF_2(T0, T1) F(m0, m1);
  203. #define EZCALL_4(F, T0, T1, T2) EZDEF_3(T0, T1, T2) F(m0, m1, m2);
  204. #define EZCALL_5(F, T0, T1, T2, T3) EZDEF_4(T0, T1, T2, T3) F(m0, m1, m2, m3);
  205. #define EZCALL_6(F, T0, T1, T2, T3, T4) EZDEF_5(T0, T1, T2, T3, T4) F(m0, m1, m2, m3, m4);
  206. #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);
  207. #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);
  208. #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);
  209. #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);
  210. #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);
  211. //----
  212. #define EZM_CALL_FUNC(...) \
  213. LOL_CALL(LOL_CAT(EZCALL_, LOL_CALL(LOL_COUNT_TO_12, (__VA_ARGS__))), (__VA_ARGS__))
  214. //-----------------------------------------------------------------------------
  215. void EasyMesh::ExecuteCmdStack(bool ExecAllStack)
  216. {
  217. #define DO_EXEC_CMD(MESH_CMD, FUNC_PARAMS) \
  218. case EasyMeshCmdType::MESH_CMD: \
  219. { EZM_CALL_FUNC FUNC_PARAMS; break; }
  220. BD()->Enable(MeshBuildOperation::CommandExecution);
  221. if (ExecAllStack)
  222. BD()->Cmdi() = 0;
  223. for (; BD()->Cmdi() < BD()->CmdStack().GetCmdNb() && BD()->CmdExecNb() != 0; ++BD()->Cmdi())
  224. {
  225. if (BD()->CmdExecNb() > 0)
  226. --BD()->CmdExecNb();
  227. switch (BD()->CmdStack().GetCmd(BD()->Cmdi()))
  228. {
  229. DO_EXEC_CMD(MeshCsg, (MeshCsg, CSGUsage))
  230. DO_EXEC_CMD(LoopStart, (LoopStart, int))
  231. DO_EXEC_CMD(LoopEnd, (LoopEnd))
  232. DO_EXEC_CMD(OpenBrace, (OpenBrace))
  233. DO_EXEC_CMD(CloseBrace, (CloseBrace))
  234. DO_EXEC_CMD(ScaleWinding, (ToggleScaleWinding))
  235. DO_EXEC_CMD(QuadWeighting, (ToggleQuadWeighting))
  236. DO_EXEC_CMD(PostBuildNormal, (TogglePostBuildNormal))
  237. DO_EXEC_CMD(PreventVertCleanup, (ToggleVerticeNoCleanup))
  238. DO_EXEC_CMD(VerticesMerge, (VerticesMerge))
  239. DO_EXEC_CMD(VerticesSeparate, (VerticesSeparate))
  240. DO_EXEC_CMD(SetColorA, (SetCurColorA, vec4))
  241. DO_EXEC_CMD(SetColorB, (SetCurColorB, vec4))
  242. DO_EXEC_CMD(SetVertColor, (SetVertColor, vec4))
  243. DO_EXEC_CMD(Translate, (Translate, vec3))
  244. DO_EXEC_CMD(Rotate, (Rotate, float, vec3))
  245. DO_EXEC_CMD(RadialJitter, (RadialJitter, float))
  246. DO_EXEC_CMD(MeshTranform, (DoMeshTransform, MeshTransform, Axis, Axis, float, float, float, bool))
  247. DO_EXEC_CMD(Scale, (Scale, vec3))
  248. DO_EXEC_CMD(DupAndScale, (DupAndScale, vec3, bool))
  249. DO_EXEC_CMD(Chamfer, (Chamfer, float))
  250. DO_EXEC_CMD(SplitTriangles, (SplitTriangles, int))
  251. DO_EXEC_CMD(SmoothMesh, (SmoothMesh, int, int, int))
  252. DO_EXEC_CMD(AppendCylinder, (AppendCylinder, int, float, float, float, bool, bool, bool))
  253. DO_EXEC_CMD(AppendCapsule, (AppendCapsule, int, float, float))
  254. DO_EXEC_CMD(AppendTorus, (AppendTorus, int, float, float))
  255. DO_EXEC_CMD(AppendBox, (AppendBox, vec3, float, bool))
  256. DO_EXEC_CMD(AppendStar, (AppendStar, int, float, float, bool, bool))
  257. DO_EXEC_CMD(AppendExpandedStar, (AppendExpandedStar, int, float, float, float))
  258. DO_EXEC_CMD(AppendDisc, (AppendDisc, int, float, bool))
  259. DO_EXEC_CMD(AppendSimpleTriangle, (AppendSimpleTriangle, float, bool))
  260. DO_EXEC_CMD(AppendSimpleQuad, (AppendSimpleQuad, vec2, vec2, float, bool))
  261. DO_EXEC_CMD(AppendCog, (AppendCog, int, float, float, float, float, float, float, float, float, bool))
  262. default:
  263. ASSERT(0, "Unknown command pseudo bytecode");
  264. }
  265. }
  266. BD()->Disable(MeshBuildOperation::CommandExecution);
  267. if (!BD()->IsEnabled(MeshBuildOperation::PreventVertCleanup))
  268. VerticesCleanup();
  269. if (BD()->IsEnabled(MeshBuildOperation::PostBuildComputeNormals))
  270. ComputeNormals(0, m_indices.count());
  271. BD()->Disable(MeshBuildOperation::PostBuildComputeNormals);
  272. BD()->Disable(MeshBuildOperation::PreventVertCleanup);
  273. if (BD()->CmdExecNb() > 0)
  274. BD()->CmdExecNb() = -1;
  275. }