wrap_ParticleSystem.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811
  1. /**
  2. * Copyright (c) 2006-2017 LOVE Development Team
  3. *
  4. * This software is provided 'as-is', without any express or implied
  5. * warranty. In no event will the authors be held liable for any damages
  6. * arising from the use of this software.
  7. *
  8. * Permission is granted to anyone to use this software for any purpose,
  9. * including commercial applications, and to alter it and redistribute it
  10. * freely, subject to the following restrictions:
  11. *
  12. * 1. The origin of this software must not be misrepresented; you must not
  13. * claim that you wrote the original software. If you use this software
  14. * in a product, an acknowledgment in the product documentation would be
  15. * appreciated but is not required.
  16. * 2. Altered source versions must be plainly marked as such, and must not be
  17. * misrepresented as being the original software.
  18. * 3. This notice may not be removed or altered from any source distribution.
  19. **/
  20. // LOVE
  21. #include "wrap_ParticleSystem.h"
  22. #include "common/Vector.h"
  23. #include "Image.h"
  24. #include "Canvas.h"
  25. #include "wrap_Texture.h"
  26. // C
  27. #include <cstring>
  28. namespace love
  29. {
  30. namespace graphics
  31. {
  32. ParticleSystem *luax_checkparticlesystem(lua_State *L, int idx)
  33. {
  34. return luax_checktype<ParticleSystem>(L, idx);
  35. }
  36. int w_ParticleSystem_clone(lua_State *L)
  37. {
  38. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  39. ParticleSystem *clone = nullptr;
  40. luax_catchexcept(L, [&](){ clone = t->clone(); });
  41. luax_pushtype(L, clone);
  42. clone->release();
  43. return 1;
  44. }
  45. int w_ParticleSystem_setTexture(lua_State *L)
  46. {
  47. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  48. Texture *tex = luax_checktexture(L, 2);
  49. luax_catchexcept(L, [&](){ t->setTexture(tex); });
  50. return 0;
  51. }
  52. int w_ParticleSystem_getTexture(lua_State *L)
  53. {
  54. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  55. Texture *tex = t->getTexture();
  56. // FIXME: big hack right here.
  57. if (dynamic_cast<Image *>(tex) != nullptr)
  58. luax_pushtype(L, Image::type, tex);
  59. else if (dynamic_cast<Canvas *>(tex) != nullptr)
  60. luax_pushtype(L, Canvas::type, tex);
  61. else
  62. return luaL_error(L, "Unable to determine texture type.");
  63. return 1;
  64. }
  65. int w_ParticleSystem_setBufferSize(lua_State *L)
  66. {
  67. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  68. lua_Number arg1 = luaL_checknumber(L, 2);
  69. if (arg1 < 1.0 || arg1 > ParticleSystem::MAX_PARTICLES)
  70. return luaL_error(L, "Invalid buffer size");
  71. luax_catchexcept(L, [&](){ t->setBufferSize((uint32) arg1); });
  72. return 0;
  73. }
  74. int w_ParticleSystem_getBufferSize(lua_State *L)
  75. {
  76. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  77. lua_pushinteger(L, t->getBufferSize());
  78. return 1;
  79. }
  80. int w_ParticleSystem_setInsertMode(lua_State *L)
  81. {
  82. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  83. ParticleSystem::InsertMode mode;
  84. const char *str = luaL_checkstring(L, 2);
  85. if (!ParticleSystem::getConstant(str, mode))
  86. return luaL_error(L, "Invalid insert mode: '%s'", str);
  87. t->setInsertMode(mode);
  88. return 0;
  89. }
  90. int w_ParticleSystem_getInsertMode(lua_State *L)
  91. {
  92. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  93. ParticleSystem::InsertMode mode;
  94. mode = t->getInsertMode();
  95. const char *str;
  96. if (!ParticleSystem::getConstant(mode, str))
  97. return luaL_error(L, "Unknown insert mode");
  98. lua_pushstring(L, str);
  99. return 1;
  100. }
  101. int w_ParticleSystem_setEmissionRate(lua_State *L)
  102. {
  103. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  104. float arg1 = (float) luaL_checknumber(L, 2);
  105. luax_catchexcept(L, [&](){ t->setEmissionRate(arg1); });
  106. return 0;
  107. }
  108. int w_ParticleSystem_getEmissionRate(lua_State *L)
  109. {
  110. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  111. lua_pushnumber(L, t->getEmissionRate());
  112. return 1;
  113. }
  114. int w_ParticleSystem_setEmitterLifetime(lua_State *L)
  115. {
  116. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  117. float arg1 = (float)luaL_checknumber(L, 2);
  118. t->setEmitterLifetime(arg1);
  119. return 0;
  120. }
  121. int w_ParticleSystem_getEmitterLifetime(lua_State *L)
  122. {
  123. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  124. lua_pushnumber(L, t->getEmitterLifetime());
  125. return 1;
  126. }
  127. int w_ParticleSystem_setParticleLifetime(lua_State *L)
  128. {
  129. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  130. float arg1 = (float)luaL_checknumber(L, 2);
  131. float arg2 = (float)luaL_optnumber(L, 3, arg1);
  132. t->setParticleLifetime(arg1, arg2);
  133. return 0;
  134. }
  135. int w_ParticleSystem_getParticleLifetime(lua_State *L)
  136. {
  137. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  138. float min, max;
  139. t->getParticleLifetime(min, max);
  140. lua_pushnumber(L, min);
  141. lua_pushnumber(L, max);
  142. return 2;
  143. }
  144. int w_ParticleSystem_setPosition(lua_State *L)
  145. {
  146. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  147. float arg1 = (float)luaL_checknumber(L, 2);
  148. float arg2 = (float)luaL_checknumber(L, 3);
  149. t->setPosition(arg1, arg2);
  150. return 0;
  151. }
  152. int w_ParticleSystem_getPosition(lua_State *L)
  153. {
  154. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  155. love::Vector2 pos = t->getPosition();
  156. lua_pushnumber(L, pos.x);
  157. lua_pushnumber(L, pos.y);
  158. return 2;
  159. }
  160. int w_ParticleSystem_moveTo(lua_State *L)
  161. {
  162. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  163. float arg1 = (float)luaL_checknumber(L, 2);
  164. float arg2 = (float)luaL_checknumber(L, 3);
  165. t->moveTo(arg1, arg2);
  166. return 0;
  167. }
  168. int w_ParticleSystem_setAreaSpread(lua_State *L)
  169. {
  170. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  171. ParticleSystem::AreaSpreadDistribution distribution = ParticleSystem::DISTRIBUTION_NONE;
  172. float x = 0.f, y = 0.f, angle = 0.f;
  173. bool isRelativeDirection = false;
  174. const char *str = lua_isnoneornil(L, 2) ? 0 : luaL_checkstring(L, 2);
  175. if (str && !ParticleSystem::getConstant(str, distribution))
  176. return luaL_error(L, "Invalid particle distribution: %s", str);
  177. if (distribution != ParticleSystem::DISTRIBUTION_NONE)
  178. {
  179. x = (float) luaL_checknumber(L, 3);
  180. y = (float) luaL_checknumber(L, 4);
  181. if (x < 0.0f || y < 0.0f)
  182. return luaL_error(L, "Invalid area spread parameters (must be >= 0)");
  183. angle = (float) luaL_optnumber(L, 5, 0.0);
  184. isRelativeDirection = luax_optboolean(L, 6, false);
  185. }
  186. t->setAreaSpread(distribution, x, y, angle, isRelativeDirection);
  187. return 0;
  188. }
  189. int w_ParticleSystem_getAreaSpread(lua_State *L)
  190. {
  191. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  192. ParticleSystem::AreaSpreadDistribution distribution = t-> getAreaSpreadDistribution();
  193. const char *str;
  194. ParticleSystem::getConstant(distribution, str);
  195. const love::Vector2 &p = t->getAreaSpreadParameters();
  196. lua_pushstring(L, str);
  197. lua_pushnumber(L, p.x);
  198. lua_pushnumber(L, p.y);
  199. return 3;
  200. }
  201. int w_ParticleSystem_setAreaSpreadAngle(lua_State *L)
  202. {
  203. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  204. float arg1 = (float)luaL_checknumber(L, 2);
  205. t->setAreaSpreadAngle(arg1);
  206. return 0;
  207. }
  208. int w_ParticleSystem_getAreaSpreadAngle(lua_State *L)
  209. {
  210. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  211. lua_pushnumber(L, t->getAreaSpreadAngle());
  212. return 1;
  213. }
  214. int w_ParticleSystem_setAreaSpreadIsRelativeDirection(lua_State *L)
  215. {
  216. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  217. bool arg1 = luax_toboolean(L, 2);
  218. t->setAreaSpreadIsRelativeDirection(arg1);
  219. return 0;
  220. }
  221. int w_ParticleSystem_getAreaSpreadIsRelativeDirection(lua_State *L)
  222. {
  223. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  224. lua_pushnumber(L, t->getAreaSpreadIsRelativeDirection());
  225. return 1;
  226. }
  227. int w_ParticleSystem_setDirection(lua_State *L)
  228. {
  229. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  230. float arg1 = (float)luaL_checknumber(L, 2);
  231. t->setDirection(arg1);
  232. return 0;
  233. }
  234. int w_ParticleSystem_getDirection(lua_State *L)
  235. {
  236. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  237. lua_pushnumber(L, t->getDirection());
  238. return 1;
  239. }
  240. int w_ParticleSystem_setSpread(lua_State *L)
  241. {
  242. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  243. float arg1 = (float)luaL_checknumber(L, 2);
  244. t->setSpread(arg1);
  245. return 0;
  246. }
  247. int w_ParticleSystem_getSpread(lua_State *L)
  248. {
  249. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  250. lua_pushnumber(L, t->getSpread());
  251. return 1;
  252. }
  253. int w_ParticleSystem_setSpeed(lua_State *L)
  254. {
  255. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  256. float arg1 = (float)luaL_checknumber(L, 2);
  257. float arg2 = (float)luaL_optnumber(L, 3, arg1);
  258. t->setSpeed(arg1, arg2);
  259. return 0;
  260. }
  261. int w_ParticleSystem_getSpeed(lua_State *L)
  262. {
  263. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  264. float min, max;
  265. t->getSpeed(min, max);
  266. lua_pushnumber(L, min);
  267. lua_pushnumber(L, max);
  268. return 2;
  269. }
  270. int w_ParticleSystem_setLinearAcceleration(lua_State *L)
  271. {
  272. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  273. float xmin = (float) luaL_checknumber(L, 2);
  274. float ymin = (float) luaL_checknumber(L, 3);
  275. float xmax = (float) luaL_optnumber(L, 4, xmin);
  276. float ymax = (float) luaL_optnumber(L, 5, ymin);
  277. t->setLinearAcceleration(xmin, ymin, xmax, ymax);
  278. return 0;
  279. }
  280. int w_ParticleSystem_getLinearAcceleration(lua_State *L)
  281. {
  282. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  283. love::Vector2 min, max;
  284. t->getLinearAcceleration(min, max);
  285. lua_pushnumber(L, min.x);
  286. lua_pushnumber(L, min.y);
  287. lua_pushnumber(L, max.x);
  288. lua_pushnumber(L, max.y);
  289. return 4;
  290. }
  291. int w_ParticleSystem_setRadialAcceleration(lua_State *L)
  292. {
  293. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  294. float arg1 = (float)luaL_checknumber(L, 2);
  295. float arg2 = (float)luaL_optnumber(L, 3, arg1);
  296. t->setRadialAcceleration(arg1, arg2);
  297. return 0;
  298. }
  299. int w_ParticleSystem_getRadialAcceleration(lua_State *L)
  300. {
  301. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  302. float min, max;
  303. t->getRadialAcceleration(min, max);
  304. lua_pushnumber(L, min);
  305. lua_pushnumber(L, max);
  306. return 2;
  307. }
  308. int w_ParticleSystem_setTangentialAcceleration(lua_State *L)
  309. {
  310. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  311. float arg1 = (float)luaL_checknumber(L, 2);
  312. float arg2 = (float)luaL_optnumber(L, 3, arg1);
  313. t->setTangentialAcceleration(arg1, arg2);
  314. return 0;
  315. }
  316. int w_ParticleSystem_getTangentialAcceleration(lua_State *L)
  317. {
  318. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  319. float min, max;
  320. t->getTangentialAcceleration(min, max);
  321. lua_pushnumber(L, min);
  322. lua_pushnumber(L, max);
  323. return 2;
  324. }
  325. int w_ParticleSystem_setLinearDamping(lua_State *L)
  326. {
  327. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  328. float arg1 = (float)luaL_checknumber(L, 2);
  329. float arg2 = (float)luaL_optnumber(L, 3, arg1);
  330. t->setLinearDamping(arg1, arg2);
  331. return 0;
  332. }
  333. int w_ParticleSystem_getLinearDamping(lua_State *L)
  334. {
  335. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  336. float min, max;
  337. t->getLinearDamping(min, max);
  338. lua_pushnumber(L, min);
  339. lua_pushnumber(L, max);
  340. return 2;
  341. }
  342. int w_ParticleSystem_setSizes(lua_State *L)
  343. {
  344. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  345. size_t nSizes = lua_gettop(L) - 1;
  346. if (nSizes > 8)
  347. return luaL_error(L, "At most eight (8) sizes may be used.");
  348. if (nSizes <= 1)
  349. {
  350. float size = luax_checkfloat(L, 2);
  351. t->setSize(size);
  352. }
  353. else
  354. {
  355. std::vector<float> sizes(nSizes);
  356. for (size_t i = 0; i < nSizes; ++i)
  357. sizes[i] = luax_checkfloat(L, (int) (1 + i + 1));
  358. t->setSizes(sizes);
  359. }
  360. return 0;
  361. }
  362. int w_ParticleSystem_getSizes(lua_State *L)
  363. {
  364. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  365. const std::vector<float> &sizes = t->getSizes();
  366. for (size_t i = 0; i < sizes.size(); i++)
  367. lua_pushnumber(L, sizes[i]);
  368. return (int) sizes.size();
  369. }
  370. int w_ParticleSystem_setSizeVariation(lua_State *L)
  371. {
  372. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  373. float arg1 = (float)luaL_checknumber(L, 2);
  374. if (arg1 < 0.0f || arg1 > 1.0f)
  375. return luaL_error(L, "Size variation has to be between 0 and 1, inclusive.");
  376. t->setSizeVariation(arg1);
  377. return 0;
  378. }
  379. int w_ParticleSystem_getSizeVariation(lua_State *L)
  380. {
  381. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  382. lua_pushnumber(L, t->getSizeVariation());
  383. return 1;
  384. }
  385. int w_ParticleSystem_setRotation(lua_State *L)
  386. {
  387. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  388. float arg1 = (float)luaL_checknumber(L, 2);
  389. float arg2 = (float)luaL_optnumber(L, 3, arg1);
  390. t->setRotation(arg1, arg2);
  391. return 0;
  392. }
  393. int w_ParticleSystem_getRotation(lua_State *L)
  394. {
  395. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  396. float min, max;
  397. t->getRotation(min, max);
  398. lua_pushnumber(L, min);
  399. lua_pushnumber(L, max);
  400. return 2;
  401. }
  402. int w_ParticleSystem_setSpin(lua_State *L)
  403. {
  404. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  405. float arg1 = (float)luaL_checknumber(L, 2);
  406. float arg2 = (float)luaL_optnumber(L, 3, arg1);
  407. t->setSpin(arg1, arg2);
  408. return 0;
  409. }
  410. int w_ParticleSystem_getSpin(lua_State *L)
  411. {
  412. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  413. float start, end;
  414. t->getSpin(start, end);
  415. lua_pushnumber(L, start);
  416. lua_pushnumber(L, end);
  417. return 2;
  418. }
  419. int w_ParticleSystem_setSpinVariation(lua_State *L)
  420. {
  421. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  422. float arg1 = (float)luaL_checknumber(L, 2);
  423. t->setSpinVariation(arg1);
  424. return 0;
  425. }
  426. int w_ParticleSystem_getSpinVariation(lua_State *L)
  427. {
  428. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  429. lua_pushnumber(L, t->getSpinVariation());
  430. return 1;
  431. }
  432. int w_ParticleSystem_setOffset(lua_State *L)
  433. {
  434. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  435. float x = (float)luaL_checknumber(L, 2);
  436. float y = (float)luaL_checknumber(L, 3);
  437. t->setOffset(x, y);
  438. return 0;
  439. }
  440. int w_ParticleSystem_getOffset(lua_State *L)
  441. {
  442. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  443. love::Vector2 offset = t->getOffset();
  444. lua_pushnumber(L, offset.x);
  445. lua_pushnumber(L, offset.y);
  446. return 2;
  447. }
  448. int w_ParticleSystem_setColors(lua_State *L)
  449. {
  450. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  451. if (lua_istable(L, 2)) // setColors({r,g,b,a}, {r,g,b,a}, ...)
  452. {
  453. int nColors = (int) lua_gettop(L) - 1;
  454. if (nColors > 8)
  455. return luaL_error(L, "At most eight (8) colors may be used.");
  456. std::vector<Colorf> colors(nColors);
  457. for (int i = 0; i < nColors; i++)
  458. {
  459. luaL_checktype(L, i + 2, LUA_TTABLE);
  460. if (luax_objlen(L, i + 2) < 3)
  461. return luaL_argerror(L, i + 2, "expected 4 color components");
  462. for (int j = 0; j < 4; j++)
  463. // push args[i+2][j+1] onto the stack
  464. lua_rawgeti(L, i + 2, j + 1);
  465. colors[i].r = (float) luaL_checknumber(L, -4);
  466. colors[i].g = (float) luaL_checknumber(L, -3);
  467. colors[i].b = (float) luaL_checknumber(L, -2);
  468. colors[i].a = (float) luaL_optnumber(L, -1, 1.0);
  469. // pop the color components from the stack
  470. lua_pop(L, 4);
  471. }
  472. t->setColor(colors);
  473. }
  474. else // setColors(r,g,b,a, r,g,b,a, ...)
  475. {
  476. int cargs = lua_gettop(L) - 1;
  477. int nColors = (cargs + 3) / 4; // nColors = ceil(color_args / 4)
  478. if (cargs != 3 && (cargs % 4 != 0 || cargs == 0))
  479. return luaL_error(L, "Expected red, green, blue, and alpha. Only got %d of 4 components.", cargs % 4);
  480. if (nColors > 8)
  481. return luaL_error(L, "At most eight (8) colors may be used.");
  482. std::vector<Colorf> colors(nColors);
  483. for (int i = 0; i < nColors; ++i)
  484. {
  485. colors[i].r = (float) luaL_checknumber(L, 1 + i*4 + 1);
  486. colors[i].g = (float) luaL_checknumber(L, 1 + i*4 + 2);
  487. colors[i].b = (float) luaL_checknumber(L, 1 + i*4 + 3);
  488. colors[i].a = (float) luaL_checknumber(L, 1 + i*4 + 4);
  489. }
  490. t->setColor(colors);
  491. }
  492. return 0;
  493. }
  494. int w_ParticleSystem_getColors(lua_State *L)
  495. {
  496. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  497. const std::vector<Colorf> &colors =t->getColor();
  498. for (size_t i = 0; i < colors.size(); i++)
  499. {
  500. lua_createtable(L, 4, 0);
  501. lua_pushnumber(L, colors[i].r);
  502. lua_rawseti(L, -2, 1);
  503. lua_pushnumber(L, colors[i].g);
  504. lua_rawseti(L, -2, 2);
  505. lua_pushnumber(L, colors[i].b);
  506. lua_rawseti(L, -2, 3);
  507. lua_pushnumber(L, colors[i].a);
  508. lua_rawseti(L, -2, 4);
  509. }
  510. return (int) colors.size();
  511. }
  512. int w_ParticleSystem_setQuads(lua_State *L)
  513. {
  514. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  515. std::vector<Quad *> quads;
  516. if (lua_istable(L, 2))
  517. {
  518. for (int i = 1; i <= (int) luax_objlen(L, 2); i++)
  519. {
  520. lua_rawgeti(L, 2, i);
  521. Quad *q = luax_checktype<Quad>(L, -1);
  522. quads.push_back(q);
  523. lua_pop(L, 1);
  524. }
  525. }
  526. else
  527. {
  528. for (int i = 2; i <= lua_gettop(L); i++)
  529. {
  530. Quad *q = luax_checktype<Quad>(L, i);
  531. quads.push_back(q);
  532. }
  533. }
  534. t->setQuads(quads);
  535. return 0;
  536. }
  537. int w_ParticleSystem_getQuads(lua_State *L)
  538. {
  539. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  540. const std::vector<Quad *> quads = t->getQuads();
  541. lua_createtable(L, (int) quads.size(), 0);
  542. for (int i = 0; i < (int) quads.size(); i++)
  543. {
  544. luax_pushtype(L, quads[i]);
  545. lua_rawseti(L, -2, i + 1);
  546. }
  547. return 1;
  548. }
  549. int w_ParticleSystem_setRelativeRotation(lua_State *L)
  550. {
  551. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  552. t->setRelativeRotation(luax_toboolean(L, 2));
  553. return 0;
  554. }
  555. int w_ParticleSystem_hasRelativeRotation(lua_State *L)
  556. {
  557. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  558. luax_pushboolean(L, t->hasRelativeRotation());
  559. return 1;
  560. }
  561. int w_ParticleSystem_getCount(lua_State *L)
  562. {
  563. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  564. lua_pushnumber(L, t->getCount());
  565. return 1;
  566. }
  567. int w_ParticleSystem_start(lua_State *L)
  568. {
  569. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  570. t->start();
  571. return 0;
  572. }
  573. int w_ParticleSystem_stop(lua_State *L)
  574. {
  575. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  576. t->stop();
  577. return 0;
  578. }
  579. int w_ParticleSystem_pause(lua_State *L)
  580. {
  581. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  582. t->pause();
  583. return 0;
  584. }
  585. int w_ParticleSystem_reset(lua_State *L)
  586. {
  587. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  588. t->reset();
  589. return 0;
  590. }
  591. int w_ParticleSystem_emit(lua_State *L)
  592. {
  593. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  594. int num = (int) luaL_checkinteger(L, 2);
  595. t->emit(num);
  596. return 0;
  597. }
  598. int w_ParticleSystem_isActive(lua_State *L)
  599. {
  600. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  601. luax_pushboolean(L, t->isActive());
  602. return 1;
  603. }
  604. int w_ParticleSystem_isPaused(lua_State *L)
  605. {
  606. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  607. luax_pushboolean(L, t->isPaused());
  608. return 1;
  609. }
  610. int w_ParticleSystem_isStopped(lua_State *L)
  611. {
  612. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  613. luax_pushboolean(L, t->isStopped());
  614. return 1;
  615. }
  616. int w_ParticleSystem_update(lua_State *L)
  617. {
  618. ParticleSystem *t = luax_checkparticlesystem(L, 1);
  619. float dt = (float)luaL_checknumber(L, 2);
  620. t->update(dt);
  621. return 0;
  622. }
  623. static const luaL_Reg w_ParticleSystem_functions[] =
  624. {
  625. { "clone", w_ParticleSystem_clone },
  626. { "setTexture", w_ParticleSystem_setTexture },
  627. { "getTexture", w_ParticleSystem_getTexture },
  628. { "setBufferSize", w_ParticleSystem_setBufferSize },
  629. { "getBufferSize", w_ParticleSystem_getBufferSize },
  630. { "setInsertMode", w_ParticleSystem_setInsertMode },
  631. { "getInsertMode", w_ParticleSystem_getInsertMode },
  632. { "setEmissionRate", w_ParticleSystem_setEmissionRate },
  633. { "getEmissionRate", w_ParticleSystem_getEmissionRate },
  634. { "setEmitterLifetime", w_ParticleSystem_setEmitterLifetime },
  635. { "getEmitterLifetime", w_ParticleSystem_getEmitterLifetime },
  636. { "setParticleLifetime", w_ParticleSystem_setParticleLifetime },
  637. { "getParticleLifetime", w_ParticleSystem_getParticleLifetime },
  638. { "setPosition", w_ParticleSystem_setPosition },
  639. { "getPosition", w_ParticleSystem_getPosition },
  640. { "moveTo", w_ParticleSystem_moveTo },
  641. { "setAreaSpread", w_ParticleSystem_setAreaSpread },
  642. { "getAreaSpread", w_ParticleSystem_getAreaSpread },
  643. { "setAreaSpreadAngle", w_ParticleSystem_setAreaSpreadAngle },
  644. { "getAreaSpreadAngle", w_ParticleSystem_getAreaSpreadAngle },
  645. { "setAreaSpreadIsRelativeDirection", w_ParticleSystem_setAreaSpreadIsRelativeDirection },
  646. { "getAreaSpreadIsRelativeDirection", w_ParticleSystem_getAreaSpreadIsRelativeDirection },
  647. { "setDirection", w_ParticleSystem_setDirection },
  648. { "getDirection", w_ParticleSystem_getDirection },
  649. { "setSpread", w_ParticleSystem_setSpread },
  650. { "getSpread", w_ParticleSystem_getSpread },
  651. { "setSpeed", w_ParticleSystem_setSpeed },
  652. { "getSpeed", w_ParticleSystem_getSpeed },
  653. { "setLinearAcceleration", w_ParticleSystem_setLinearAcceleration },
  654. { "getLinearAcceleration", w_ParticleSystem_getLinearAcceleration },
  655. { "setRadialAcceleration", w_ParticleSystem_setRadialAcceleration },
  656. { "getRadialAcceleration", w_ParticleSystem_getRadialAcceleration },
  657. { "setTangentialAcceleration", w_ParticleSystem_setTangentialAcceleration },
  658. { "getTangentialAcceleration", w_ParticleSystem_getTangentialAcceleration },
  659. { "setLinearDamping", w_ParticleSystem_setLinearDamping },
  660. { "getLinearDamping", w_ParticleSystem_getLinearDamping },
  661. { "setSizes", w_ParticleSystem_setSizes },
  662. { "getSizes", w_ParticleSystem_getSizes },
  663. { "setSizeVariation", w_ParticleSystem_setSizeVariation },
  664. { "getSizeVariation", w_ParticleSystem_getSizeVariation },
  665. { "setRotation", w_ParticleSystem_setRotation },
  666. { "getRotation", w_ParticleSystem_getRotation },
  667. { "setSpin", w_ParticleSystem_setSpin },
  668. { "getSpin", w_ParticleSystem_getSpin },
  669. { "setSpinVariation", w_ParticleSystem_setSpinVariation },
  670. { "getSpinVariation", w_ParticleSystem_getSpinVariation },
  671. { "setColors", w_ParticleSystem_setColors },
  672. { "getColors", w_ParticleSystem_getColors },
  673. { "setQuads", w_ParticleSystem_setQuads },
  674. { "getQuads", w_ParticleSystem_getQuads },
  675. { "setOffset", w_ParticleSystem_setOffset },
  676. { "getOffset", w_ParticleSystem_getOffset },
  677. { "setRelativeRotation", w_ParticleSystem_setRelativeRotation },
  678. { "hasRelativeRotation", w_ParticleSystem_hasRelativeRotation },
  679. { "getCount", w_ParticleSystem_getCount },
  680. { "start", w_ParticleSystem_start },
  681. { "stop", w_ParticleSystem_stop },
  682. { "pause", w_ParticleSystem_pause },
  683. { "reset", w_ParticleSystem_reset },
  684. { "emit", w_ParticleSystem_emit },
  685. { "isActive", w_ParticleSystem_isActive },
  686. { "isPaused", w_ParticleSystem_isPaused },
  687. { "isStopped", w_ParticleSystem_isStopped },
  688. { "update", w_ParticleSystem_update },
  689. { 0, 0 }
  690. };
  691. extern "C" int luaopen_particlesystem(lua_State *L)
  692. {
  693. return luax_register_type(L, &ParticleSystem::type, w_ParticleSystem_functions, nullptr);
  694. }
  695. } // graphics
  696. } // love