You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

668 lines
17 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. #pragma once
  13. namespace lol
  14. {
  15. //-----------------------------------------------------------------------------
  16. class EasyMeshLuaObject : public LuaObject
  17. {
  18. typedef Lolua::VarPtr<EasyMeshLuaObject> EzMeshPtr;
  19. EasyMesh m_instance;
  20. public:
  21. //-------------------------------------------------------------------------
  22. EasyMeshLuaObject(String const& name);
  23. virtual ~EasyMeshLuaObject();
  24. EasyMesh& GetMesh() { return m_instance; }
  25. //-------------------------------------------------------------------------
  26. static EasyMeshLuaObject* New(lua_State* l, int arg_nb);
  27. static const LuaObjectLibrary* GetLib();
  28. //-------------------------------------------------------------------------
  29. static int AppendCylinder(lua_State* l)
  30. {
  31. LuaStack s(l);
  32. EzMeshPtr m;
  33. LuaInt32 nsides;
  34. LuaFloat h, d1, d2;
  35. LuaBool dualside(false, true), smooth(false, true), close(false, true);
  36. s >> m >> nsides >> h >> d1 >> d2 >> dualside >> smooth >> close;
  37. m->m_instance.AppendCylinder(nsides, h, d1, d2, dualside, smooth, close);
  38. return 0;
  39. }
  40. static int AppendSphere(lua_State* l)
  41. {
  42. LuaStack s(l);
  43. EzMeshPtr m;
  44. LuaInt32 ndivisions;
  45. LuaFloat d;
  46. s >> m >> ndivisions >> d;
  47. m->m_instance.AppendSphere(ndivisions, d);
  48. return 0;
  49. }
  50. static int AppendCapsule(lua_State* l)
  51. {
  52. LuaStack s(l);
  53. EzMeshPtr m;
  54. LuaInt32 ndivisions;
  55. LuaFloat h, d;
  56. s >> m >> ndivisions >> h >> d;
  57. m->m_instance.AppendCapsule(ndivisions, h, d);
  58. return 0;
  59. }
  60. static int AppendTorus(lua_State* l)
  61. {
  62. LuaStack s(l);
  63. EzMeshPtr m;
  64. LuaInt32 ndivisions;
  65. LuaFloat d1, d2;
  66. s >> m >> ndivisions >> d1 >> d2;
  67. m->m_instance.AppendTorus(ndivisions, d1, d2);
  68. return 0;
  69. }
  70. static int AppendBox(lua_State* l)
  71. {
  72. LuaStack s(l);
  73. EzMeshPtr m;
  74. LuaVec3 size;
  75. LuaFloat chamf(0.f, true);
  76. LuaBool smooth(false, true);
  77. s >> m >> size >> chamf >> smooth;
  78. m->m_instance.AppendBox(size, chamf, smooth);
  79. return 0;
  80. }
  81. static int AppendStar(lua_State* l)
  82. {
  83. LuaStack s(l);
  84. EzMeshPtr m;
  85. LuaInt32 nbranches;
  86. LuaFloat d1, d2;
  87. LuaBool fade(false, true), fade2(false, true);
  88. s >> m >> nbranches >> d1 >> d2 >> fade >> fade2;
  89. m->m_instance.AppendStar(nbranches, d1, d2, fade, fade2);
  90. return 0;
  91. }
  92. static int AppendExpandedStar(lua_State* l)
  93. {
  94. LuaStack s(l);
  95. EzMeshPtr m;
  96. LuaInt32 nbranches;
  97. LuaFloat d1, d2, extrad(0.f, true);
  98. s >> m >> nbranches >> d1 >> d2 >> extrad;
  99. m->m_instance.AppendExpandedStar(nbranches, d1, d2, extrad);
  100. return 0;
  101. }
  102. static int AppendDisc(lua_State* l)
  103. {
  104. LuaStack s(l);
  105. EzMeshPtr m;
  106. LuaInt32 nsides;
  107. LuaFloat d;
  108. LuaBool fade(false, true);
  109. s >> m >> nsides >> d >> fade;
  110. m->m_instance.AppendDisc(nsides, d, fade);
  111. return 0;
  112. }
  113. static int AppendSimpleTriangle(lua_State* l)
  114. {
  115. LuaStack s(l);
  116. EzMeshPtr m;
  117. LuaFloat d;
  118. LuaBool fade(false, true);
  119. s >> m >> d >> fade;
  120. m->m_instance.AppendSimpleTriangle(d, fade);
  121. return 0;
  122. }
  123. static int AppendSimpleQuad(lua_State* l)
  124. {
  125. LuaStack s(l);
  126. EzMeshPtr m;
  127. LuaFloat size;
  128. LuaBool fade(false, true);
  129. s >> m >> size >> fade;
  130. m->m_instance.AppendSimpleQuad(size, fade);
  131. return 0;
  132. }
  133. static int AppendCog(lua_State* l)
  134. {
  135. LuaStack s(l);
  136. EzMeshPtr m;
  137. LuaInt32 nbsides;
  138. LuaFloat h, sidemul(0.f, true);
  139. LuaVec2 d0, d1, d2;
  140. LuaBool offset(false, true);
  141. s >> m >> nbsides >> h >> d0 >> d1 >> d2 >> sidemul >> offset;
  142. m->m_instance.AppendCog(nbsides, h, d0().x, d0().y, d1().x, d1().y, d2().x, d2().y, sidemul, offset);
  143. return 0;
  144. }
  145. //-------------------------------------------------------------------------
  146. static int TranslateX(lua_State* l)
  147. {
  148. LuaStack s(l);
  149. EzMeshPtr m;
  150. LuaFloat f;
  151. s >> m >> f;
  152. m->m_instance.TranslateX(f);
  153. return 0;
  154. }
  155. static int TranslateY(lua_State* l)
  156. {
  157. LuaStack s(l);
  158. EzMeshPtr m;
  159. LuaFloat f;
  160. s >> m >> f;
  161. m->m_instance.TranslateY(f);
  162. return 0;
  163. }
  164. static int TranslateZ(lua_State* l)
  165. {
  166. LuaStack s(l);
  167. EzMeshPtr m;
  168. LuaFloat f;
  169. s >> m >> f;
  170. m->m_instance.TranslateZ(f);
  171. return 0;
  172. }
  173. static int Translate(lua_State* l)
  174. {
  175. LuaStack s(l);
  176. EzMeshPtr m;
  177. LuaVec3 v;
  178. s >> m >> v;
  179. m->m_instance.Translate(v);
  180. return 0;
  181. }
  182. //-------------------------------------------------------------------------
  183. static int RotateX(lua_State* l)
  184. {
  185. LuaStack s(l);
  186. EzMeshPtr m;
  187. LuaFloat a;
  188. s >> m >> a;
  189. m->m_instance.RotateX(a);
  190. return 0;
  191. }
  192. static int RotateY(lua_State* l)
  193. {
  194. LuaStack s(l);
  195. EzMeshPtr m;
  196. LuaFloat a;
  197. s >> m >> a;
  198. m->m_instance.RotateY(a);
  199. return 0;
  200. }
  201. static int RotateZ(lua_State* l)
  202. {
  203. LuaStack s(l);
  204. EzMeshPtr m;
  205. LuaFloat a;
  206. s >> m >> a;
  207. m->m_instance.RotateZ(a);
  208. return 0;
  209. }
  210. static int Rotate(lua_State* l)
  211. {
  212. LuaStack s(l);
  213. EzMeshPtr m;
  214. LuaFloat a;
  215. LuaVec3 v;
  216. s >> m >> a >> v;
  217. m->m_instance.Rotate(a, v);
  218. return 0;
  219. }
  220. //-------------------------------------------------------------------------
  221. static int ScaleX(lua_State* l)
  222. {
  223. LuaStack s(l);
  224. EzMeshPtr m;
  225. LuaFloat x;
  226. s >> m >> x;
  227. m->m_instance.ScaleX(x);
  228. return 0;
  229. }
  230. static int ScaleY(lua_State* l)
  231. {
  232. LuaStack s(l);
  233. EzMeshPtr m;
  234. LuaFloat y;
  235. s >> m >> y;
  236. m->m_instance.ScaleY(y);
  237. return 0;
  238. }
  239. static int ScaleZ(lua_State* l)
  240. {
  241. LuaStack s(l);
  242. EzMeshPtr m;
  243. LuaFloat z;
  244. s >> m >> z;
  245. m->m_instance.ScaleZ(z);
  246. return 0;
  247. }
  248. static int Scale(lua_State* l)
  249. {
  250. LuaStack s(l);
  251. EzMeshPtr m;
  252. LuaVec3 v;
  253. s >> m >> v;
  254. m->m_instance.Scale(v);
  255. return 0;
  256. }
  257. //-------------------------------------------------------------------------
  258. static int RadialJitter(lua_State* l)
  259. {
  260. LuaStack s(l);
  261. EzMeshPtr m;
  262. LuaFloat f;
  263. s >> m >> f;
  264. m->m_instance.RadialJitter(f);
  265. return 0;
  266. }
  267. //-------------------------------------------------------------------------
  268. static int TaperX(lua_State* l)
  269. {
  270. LuaStack s(l);
  271. EzMeshPtr m;
  272. LuaFloat y, z, xoff(0.f, true);
  273. LuaBool abs(true, true);
  274. s >> m >> y >> z >> xoff >> abs;
  275. m->m_instance.TaperX(y, z, xoff, abs);
  276. return 0;
  277. }
  278. static int TaperY(lua_State* l)
  279. {
  280. LuaStack s(l);
  281. EzMeshPtr m;
  282. LuaFloat x, z, yoff(0.f, true);
  283. LuaBool abs(true, true);
  284. s >> m >> x >> z >> yoff >> abs;
  285. m->m_instance.TaperY(x, z, yoff, abs);
  286. return 0;
  287. }
  288. static int TaperZ(lua_State* l)
  289. {
  290. LuaStack s(l);
  291. EzMeshPtr m;
  292. LuaFloat x, y, zoff(0.f, true);
  293. LuaBool abs(true, true);
  294. s >> m >> x >> y >> zoff >> abs;
  295. m->m_instance.TaperZ(x, y, zoff, abs);
  296. return 0;
  297. }
  298. //-------------------------------------------------------------------------
  299. static int TwistX(lua_State* l)
  300. {
  301. LuaStack s(l);
  302. EzMeshPtr m;
  303. LuaFloat t, toff(0.f, true);
  304. s >> m >> t >> toff;
  305. m->m_instance.TwistX(t, toff);
  306. return 0;
  307. }
  308. static int TwistY(lua_State* l)
  309. {
  310. LuaStack s(l);
  311. EzMeshPtr m;
  312. LuaFloat t, toff(0.f, true);
  313. s >> m >> t >> toff;
  314. m->m_instance.TwistY(t, toff);
  315. return 0;
  316. }
  317. static int TwistZ(lua_State* l)
  318. {
  319. LuaStack s(l);
  320. EzMeshPtr m;
  321. LuaFloat t, toff(0.f, true);
  322. s >> m >> t >> toff;
  323. m->m_instance.TwistZ(t, toff);
  324. return 0;
  325. }
  326. //-------------------------------------------------------------------------
  327. static int ShearX(lua_State* l)
  328. {
  329. LuaStack s(l);
  330. EzMeshPtr m;
  331. LuaFloat y, z, xoff(0.f, true);
  332. LuaBool abs(true, true);
  333. s >> m >> y >> z >> xoff >> abs;
  334. m->m_instance.ShearX(y, z, xoff, abs);
  335. return 0;
  336. }
  337. static int ShearY(lua_State* l)
  338. {
  339. LuaStack s(l);
  340. EzMeshPtr m;
  341. LuaFloat x, z, yoff(0.f, true);
  342. LuaBool abs(true, true);
  343. s >> m >> x >> z >> yoff >> abs;
  344. m->m_instance.ShearY(x, z, yoff, abs);
  345. return 0;
  346. }
  347. static int ShearZ(lua_State* l)
  348. {
  349. LuaStack s(l);
  350. EzMeshPtr m;
  351. LuaFloat x, y, zoff(0.f, true);
  352. LuaBool abs(true, true);
  353. s >> m >> x >> y >> zoff >> abs;
  354. m->m_instance.ShearZ(x, y, zoff, abs);
  355. return 0;
  356. }
  357. //-------------------------------------------------------------------------
  358. static int StretchX(lua_State* l)
  359. {
  360. LuaStack s(l);
  361. EzMeshPtr m;
  362. LuaFloat y, z, xoff(0.f, true);
  363. s >> m >> y >> z >> xoff;
  364. m->m_instance.StretchX(y, z, xoff);
  365. return 0;
  366. }
  367. static int StretchY(lua_State* l)
  368. {
  369. LuaStack s(l);
  370. EzMeshPtr m;
  371. LuaFloat x, z, yoff(0.f, true);
  372. s >> m >> x >> z >> yoff;
  373. m->m_instance.StretchY(x, z, yoff);
  374. return 0;
  375. }
  376. static int StretchZ(lua_State* l)
  377. {
  378. LuaStack s(l);
  379. EzMeshPtr m;
  380. LuaFloat x, y, zoff(0.f, true);
  381. s >> m >> x >> y >> zoff;
  382. m->m_instance.StretchZ(x, y, zoff);
  383. return 0;
  384. }
  385. //-------------------------------------------------------------------------
  386. static int BendXY(lua_State* l)
  387. {
  388. LuaStack s(l);
  389. EzMeshPtr m;
  390. LuaFloat t, toff(0.f, true);
  391. s >> m >> t >> toff;
  392. m->m_instance.BendXY(t, toff);
  393. return 0;
  394. }
  395. static int BendXZ(lua_State* l)
  396. {
  397. LuaStack s(l);
  398. EzMeshPtr m;
  399. LuaFloat t, toff(0.f, true);
  400. s >> m >> t >> toff;
  401. m->m_instance.BendXZ(t, toff);
  402. return 0;
  403. }
  404. static int BendYX(lua_State* l)
  405. {
  406. LuaStack s(l);
  407. EzMeshPtr m;
  408. LuaFloat t, toff(0.f, true);
  409. s >> m >> t >> toff;
  410. m->m_instance.BendYX(t, toff);
  411. return 0;
  412. }
  413. static int BendYZ(lua_State* l)
  414. {
  415. LuaStack s(l);
  416. EzMeshPtr m;
  417. LuaFloat t, toff(0.f, true);
  418. s >> m >> t >> toff;
  419. m->m_instance.BendYZ(t, toff);
  420. return 0;
  421. }
  422. static int BendZX(lua_State* l)
  423. {
  424. LuaStack s(l);
  425. EzMeshPtr m;
  426. LuaFloat t, toff(0.f, true);
  427. s >> m >> t >> toff;
  428. m->m_instance.BendZX(t, toff);
  429. return 0;
  430. }
  431. static int BendZY(lua_State* l)
  432. {
  433. LuaStack s(l);
  434. EzMeshPtr m;
  435. LuaFloat t, toff(0.f, true);
  436. s >> m >> t >> toff;
  437. m->m_instance.BendZY(t, toff);
  438. return 0;
  439. }
  440. //-------------------------------------------------------------------------
  441. static int MirrorX(lua_State* l)
  442. {
  443. LuaStack s(l);
  444. EzMeshPtr m;
  445. s >> m;
  446. m->m_instance.MirrorX();
  447. return 0;
  448. }
  449. static int MirrorY(lua_State* l)
  450. {
  451. LuaStack s(l);
  452. EzMeshPtr m;
  453. s >> m;
  454. m->m_instance.MirrorY();
  455. return 0;
  456. }
  457. static int MirrorZ(lua_State* l)
  458. {
  459. LuaStack s(l);
  460. EzMeshPtr m;
  461. s >> m;
  462. m->m_instance.MirrorZ();
  463. return 0;
  464. }
  465. //-------------------------------------------------------------------------
  466. static int LoopStart(lua_State* l)
  467. {
  468. LuaStack s(l);
  469. EzMeshPtr m;
  470. LuaInt32 loopnb;
  471. s >> m >> loopnb;
  472. m->m_instance.LoopStart(loopnb);
  473. return 0;
  474. }
  475. static int LoopEnd(lua_State* l)
  476. {
  477. LuaStack s(l);
  478. EzMeshPtr m;
  479. s >> m;
  480. m->m_instance.LoopEnd();
  481. return 0;
  482. }
  483. static int OpenBrace(lua_State* l)
  484. {
  485. LuaStack s(l);
  486. EzMeshPtr m;
  487. s >> m;
  488. m->m_instance.OpenBrace();
  489. return 0;
  490. }
  491. static int CloseBrace(lua_State* l)
  492. {
  493. LuaStack s(l);
  494. EzMeshPtr m;
  495. s >> m;
  496. m->m_instance.CloseBrace();
  497. return 0;
  498. }
  499. //-------------------------------------------------------------------------
  500. static int ToggleScaleWinding(lua_State* l)
  501. {
  502. LuaStack s(l);
  503. EzMeshPtr m;
  504. s >> m;
  505. m->m_instance.ToggleScaleWinding();
  506. return 0;
  507. }
  508. static int ToggleQuadWeighting(lua_State* l)
  509. {
  510. LuaStack s(l);
  511. EzMeshPtr m;
  512. s >> m;
  513. m->m_instance.ToggleQuadWeighting();
  514. return 0;
  515. }
  516. static int TogglePostBuildNormal(lua_State* l)
  517. {
  518. LuaStack s(l);
  519. EzMeshPtr m;
  520. s >> m;
  521. m->m_instance.TogglePostBuildNormal();
  522. return 0;
  523. }
  524. static int ToggleVerticeNoCleanup(lua_State* l)
  525. {
  526. LuaStack s(l);
  527. EzMeshPtr m;
  528. s >> m;
  529. m->m_instance.ToggleVerticeNoCleanup();
  530. return 0;
  531. }
  532. //-------------------------------------------------------------------------
  533. static int VerticesMerge(lua_State* l)
  534. {
  535. LuaStack s(l);
  536. EzMeshPtr m;
  537. s >> m;
  538. m->m_instance.VerticesMerge();
  539. return 0;
  540. }
  541. static int VerticesSeparate(lua_State* l)
  542. {
  543. LuaStack s(l);
  544. EzMeshPtr m;
  545. s >> m;
  546. m->m_instance.VerticesSeparate();
  547. return 0;
  548. }
  549. static int VerticesCleanup(lua_State* l)
  550. {
  551. LuaStack s(l);
  552. EzMeshPtr m;
  553. s >> m;
  554. m->m_instance.VerticesCleanup();
  555. return 0;
  556. }
  557. //-------------------------------------------------------------------------
  558. static int Duplicate(lua_State* l)
  559. {
  560. LuaStack s(l);
  561. EzMeshPtr m;
  562. LuaVec3 ds(vec3(1.f));
  563. s >> m >> ds;
  564. m->m_instance.DupAndScale(ds, true);
  565. return 0;
  566. }
  567. static int Smooth(lua_State* l)
  568. {
  569. LuaStack s(l);
  570. EzMeshPtr m;
  571. LuaInt32 pass, split_per_pass, smooth_per_pass;
  572. s >> m >> pass >> split_per_pass >> smooth_per_pass;
  573. m->m_instance.SmoothMesh(pass, split_per_pass, smooth_per_pass);
  574. return 0;
  575. }
  576. static int SplitTriangles(lua_State* l)
  577. {
  578. LuaStack s(l);
  579. EzMeshPtr m;
  580. LuaInt32 pass;
  581. s >> m >> pass;
  582. m->m_instance.SplitTriangles(pass);
  583. return 0;
  584. }
  585. static int Chamfer(lua_State* l)
  586. {
  587. LuaStack s(l);
  588. EzMeshPtr m;
  589. LuaFloat f;
  590. s >> m >> f;
  591. m->m_instance.Chamfer(f);
  592. return 0;
  593. }
  594. //-------------------------------------------------------------------------
  595. static int SetCurColor(lua_State* l)
  596. {
  597. LuaStack s(l);
  598. EzMeshPtr m;
  599. LuaColor c;
  600. s >> m >> c;
  601. m->m_instance.SetCurColor(c);
  602. return 0;
  603. }
  604. static int SetCurColorA(lua_State* l)
  605. {
  606. LuaStack s(l);
  607. EzMeshPtr m;
  608. LuaColor c;
  609. s >> m >> c;
  610. m->m_instance.SetCurColorA(c);
  611. return 0;
  612. }
  613. static int SetCurColorB(lua_State* l)
  614. {
  615. LuaStack s(l);
  616. EzMeshPtr m;
  617. LuaColor c;
  618. m->m_instance.SetCurColorB(c);
  619. return 0;
  620. }
  621. static int SetVertColor(lua_State* l)
  622. {
  623. LuaStack s(l);
  624. EzMeshPtr m;
  625. LuaColor c;
  626. s >> m >> c;
  627. m->m_instance.SetVertColor(c);
  628. return 0;
  629. }
  630. /*
  631. (csgu|csgunion) { return token::T_CSGUNION; }
  632. (csgs|CsgSub) { return token::T_CSGSUBSTRACT; }
  633. (csgsl|CsgSubL) { return token::T_CSGSUBSTRACTLOSS; }
  634. (csga|csgand) { return token::T_CSGAND; }
  635. (csgx|csgxor) { return token::T_CSGXOR; }
  636. */
  637. };
  638. //-----------------------------------------------------------------------------
  639. class EasyMeshLuaLoader : public LuaLoader
  640. {
  641. friend class EasyMeshLuaObject;
  642. public:
  643. EasyMeshLuaLoader();
  644. virtual ~EasyMeshLuaLoader();
  645. //Virtual Store lua object ------------------------------------------------
  646. virtual void Store(LuaObject* obj);
  647. array<EasyMeshLuaObject*>& GetInstances();
  648. //-------------------------------------------------------------------------
  649. protected:
  650. static void RegisterMesh(EasyMeshLuaObject* mesh, String const& name);
  651. public:
  652. static bool GetRegisteredMeshes(map<String, EasyMeshLuaObject*>& meshes);
  653. private:
  654. static map<String, EasyMeshLuaObject*> m_meshes;
  655. };
  656. } /* namespace lol */