custom_particle_system.hpp 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120
  1. // SuperTux
  2. // Copyright (C) 2020 A. Semphris <semphris@protonmail.com>
  3. //
  4. // This program is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. #ifndef HEADER_SUPERTUX_OBJECT_CUSTOM_PARTICLE_SYSTEM_HPP
  17. #define HEADER_SUPERTUX_OBJECT_CUSTOM_PARTICLE_SYSTEM_HPP
  18. #include "object/particlesystem_interactive.hpp"
  19. #include "math/easing.hpp"
  20. #include "math/vector.hpp"
  21. #include "object/particle_zone.hpp"
  22. #include "video/surface.hpp"
  23. #include "video/surface_ptr.hpp"
  24. /**
  25. * @scripting
  26. * @summary A ""CustomParticleSystem"" that was given a name can be controlled by scripts.
  27. * @instances A ""CustomParticleSystem"" is instantiated by placing a definition inside a level.
  28. It can then be accessed by its name from a script or via ""sector.name"" from the console.
  29. */
  30. class CustomParticleSystem : public ParticleSystem_Interactive
  31. {
  32. friend class ParticleEditor;
  33. public:
  34. static void register_class(ssq::VM& vm);
  35. public:
  36. CustomParticleSystem();
  37. CustomParticleSystem(const ReaderMapping& reader);
  38. ~CustomParticleSystem() override;
  39. virtual void draw(DrawingContext& context) override;
  40. void reinit_textures();
  41. virtual void update(float dt_sec) override;
  42. static std::string class_name() { return "particles-custom"; }
  43. virtual std::string get_class_name() const override { return class_name(); }
  44. virtual std::string get_exposed_class_name() const override { return "CustomParticleSystem"; }
  45. static std::string display_name() { return _("Custom Particles"); }
  46. virtual std::string get_display_name() const override { return display_name(); }
  47. virtual GameObjectClasses get_class_types() const override { return ParticleSystem_Interactive::get_class_types().add(typeid(CustomParticleSystem)); }
  48. virtual void save(Writer& writer) override;
  49. virtual ObjectSettings get_settings() override;
  50. virtual const std::string get_icon_path() const override {
  51. return "images/engine/editor/particle.png";
  52. }
  53. //void fade_amount(int new_amount, float fade_time);
  54. protected:
  55. virtual int collision(Particle* particle, const Vector& movement) override;
  56. CollisionHit get_collision(Particle* particle, const Vector& movement);
  57. private:
  58. struct ease_request
  59. {
  60. float* value;
  61. float begin;
  62. float end;
  63. float time_total;
  64. float time_remain;
  65. easing func;
  66. };
  67. // Local
  68. void add_particle(float lifetime, float x, float y);
  69. void spawn_particles(float lifetime);
  70. std::vector<ParticleZone::ZoneDetails> get_zones() const;
  71. float get_abs_x() const;
  72. float get_abs_y() const;
  73. float texture_sum_odds;
  74. float time_last_remaining;
  75. public:
  76. // Scripting
  77. void ease_value(float* value, float target, float time, easing func);
  78. /**
  79. * @scripting
  80. * @description Instantly removes all particles of that type on the screen.
  81. */
  82. inline void clear() { custom_particles.clear(); }
  83. /**
  84. * @scripting
  85. * @description Spawns particles, regardless of whether or not particles are enabled.
  86. * @param int $amount
  87. * @param bool $instantly If ""true"", disregard the delay settings.
  88. */
  89. void spawn_particles(int amount, bool instantly);
  90. /**
  91. * @scripting
  92. */
  93. inline int get_max_amount() const { return m_max_amount; }
  94. /**
  95. * @scripting
  96. * @param int $amount
  97. */
  98. inline void set_max_amount(int amount) { m_max_amount = amount; }
  99. /**
  100. * @scripting
  101. * @description Returns "None", "Fade", "Shrink".
  102. */
  103. std::string get_birth_mode() const;
  104. /**
  105. * @scripting
  106. * @param string $mode Possible values: "None", "Fade", "Shrink".
  107. */
  108. void set_birth_mode(const std::string& mode);
  109. /**
  110. * @scripting
  111. * @description Returns "None", "Fade", "Shrink".
  112. */
  113. std::string get_death_mode() const;
  114. /**
  115. * @scripting
  116. * @param string $mode Possible values: "None", "Fade", "Shrink".
  117. */
  118. void set_death_mode(const std::string& mode);
  119. /**
  120. * @scripting
  121. * @description Returns "Fixed", "Facing", "Wiggling".
  122. */
  123. std::string get_rotation_mode() const;
  124. /**
  125. * @scripting
  126. * @param string $mode Possible values: "Fixed", "Facing", "Wiggling".
  127. */
  128. void set_rotation_mode(const std::string& mode);
  129. /**
  130. * @scripting
  131. * @description Returns "Ignore", "Stick", "StickForever", "BounceHeavy", "BounceLight", "Destroy".
  132. */
  133. std::string get_collision_mode() const;
  134. /**
  135. * @scripting
  136. * @param string $mode Possible values: "Ignore", "Stick", "StickForever", "BounceHeavy", "BounceLight", "Destroy".
  137. */
  138. void set_collision_mode(const std::string& mode);
  139. /**
  140. * @scripting
  141. * @description Returns "Never", "OnlyOnExit", "Always".
  142. */
  143. std::string get_offscreen_mode() const;
  144. /**
  145. * @scripting
  146. * @param string $mode Possible values: "Never", "OnlyOnExit", "Always".
  147. */
  148. void set_offscreen_mode(const std::string& mode);
  149. /**
  150. * @scripting
  151. */
  152. inline bool get_cover_screen() const { return m_cover_screen; }
  153. /**
  154. * @scripting
  155. * @param bool $cover
  156. */
  157. inline void set_cover_screen(bool cover) { m_cover_screen = cover; }
  158. /**
  159. * @scripting
  160. */
  161. inline float get_delay() const { return m_delay; }
  162. /**
  163. * @scripting
  164. * @param float $delay
  165. */
  166. inline void set_delay(float delay) { m_delay = delay; }
  167. /**
  168. * @scripting
  169. * @param float $delay
  170. * @param float $time
  171. */
  172. void fade_delay(float delay, float time);
  173. /**
  174. * @scripting
  175. * @param float $delay
  176. * @param float $time
  177. * @param string $easing
  178. */
  179. void ease_delay(float delay, float time, const std::string& easing);
  180. /**
  181. * @scripting
  182. */
  183. inline float get_lifetime() const { return m_particle_lifetime; }
  184. /**
  185. * @scripting
  186. * @param float $lifetime
  187. */
  188. inline void set_lifetime(float lifetime) { m_particle_lifetime = lifetime; }
  189. /**
  190. * @scripting
  191. * @param float $lifetime
  192. * @param float $time
  193. */
  194. void fade_lifetime(float lifetime, float time);
  195. /**
  196. * @scripting
  197. * @param float $lifetime
  198. * @param float $time
  199. * @param string $easing
  200. */
  201. void ease_lifetime(float lifetime, float time, const std::string& easing);
  202. /**
  203. * @scripting
  204. */
  205. inline float get_lifetime_variation() const { return m_particle_lifetime_variation; }
  206. /**
  207. * @scripting
  208. * @param float $lifetime_variation
  209. */
  210. inline void set_lifetime_variation(float lifetime_variation) { m_particle_lifetime_variation = lifetime_variation; }
  211. /**
  212. * @scripting
  213. * @param float $lifetime_variation
  214. * @param float $time
  215. */
  216. void fade_lifetime_variation(float lifetime_variation, float time);
  217. /**
  218. * @scripting
  219. * @param float $lifetime_variation
  220. * @param float $time
  221. * @param string $easing
  222. */
  223. void ease_lifetime_variation(float lifetime_variation, float time, const std::string& easing);
  224. /**
  225. * @scripting
  226. */
  227. inline float get_birth_time() const { return m_particle_birth_time; }
  228. /**
  229. * @scripting
  230. * @param float $birth_time
  231. */
  232. inline void set_birth_time(float birth_time) { m_particle_birth_time = birth_time; }
  233. /**
  234. * @scripting
  235. * @param float $birth_time
  236. * @param float $time
  237. */
  238. void fade_birth_time(float birth_time, float time);
  239. /**
  240. * @scripting
  241. * @param float $birth_time
  242. * @param float $time
  243. * @param string $easing
  244. */
  245. void ease_birth_time(float birth_time, float time, const std::string& easing);
  246. /**
  247. * @scripting
  248. */
  249. inline float get_birth_time_variation() const { return m_particle_birth_time_variation; }
  250. /**
  251. * @scripting
  252. * @param float $birth_time_variation
  253. */
  254. inline void set_birth_time_variation(float birth_time_variation) { m_particle_birth_time_variation = birth_time_variation; }
  255. /**
  256. * @scripting
  257. * @param float $birth_time_variation
  258. * @param float $time
  259. */
  260. void fade_birth_time_variation(float birth_time_variation, float time);
  261. /**
  262. * @scripting
  263. * @param float $birth_time_variation
  264. * @param float $time
  265. * @param string $easing
  266. */
  267. void ease_birth_time_variation(float birth_time_variation, float time, const std::string& easing);
  268. /**
  269. * @scripting
  270. */
  271. inline float get_death_time() const { return m_particle_death_time; }
  272. /**
  273. * @scripting
  274. * @param float $death_time
  275. */
  276. inline void set_death_time(float death_time) { m_particle_death_time = death_time; }
  277. /**
  278. * @scripting
  279. * @param float $death_time
  280. * @param float $time
  281. */
  282. void fade_death_time(float death_time, float time);
  283. /**
  284. * @scripting
  285. * @param float $death_time
  286. * @param float $time
  287. * @param string $easing
  288. */
  289. void ease_death_time(float death_time, float time, const std::string& easing);
  290. /**
  291. * @scripting
  292. */
  293. inline float get_death_time_variation() const { return m_particle_death_time_variation; }
  294. /**
  295. * @scripting
  296. * @param float $death_time_variation
  297. */
  298. inline void set_death_time_variation(float death_time_variation) { m_particle_death_time_variation = death_time_variation; }
  299. /**
  300. * @scripting
  301. * @param float $death_time_variation
  302. * @param float $time
  303. */
  304. void fade_death_time_variation(float death_time_variation, float time);
  305. /**
  306. * @scripting
  307. * @param float $death_time_variation
  308. * @param float $time
  309. * @param string $easing
  310. */
  311. void ease_death_time_variation(float death_time_variation, float time, const std::string& easing);
  312. /**
  313. * @scripting
  314. */
  315. inline float get_speed_x() const { return m_particle_speed_x; }
  316. /**
  317. * @scripting
  318. * @param float $speed_x
  319. */
  320. inline void set_speed_x(float speed_x) { m_particle_speed_x = speed_x; }
  321. /**
  322. * @scripting
  323. * @param float $speed_x
  324. * @param float $time
  325. */
  326. void fade_speed_x(float speed_x, float time);
  327. /**
  328. * @scripting
  329. * @param float $speed_x
  330. * @param float $time
  331. * @param string $easing
  332. */
  333. void ease_speed_x(float speed_x, float time, const std::string& easing);
  334. /**
  335. * @scripting
  336. */
  337. inline float get_speed_y() const { return m_particle_speed_y; }
  338. /**
  339. * @scripting
  340. * @param float $speed_y
  341. */
  342. inline void set_speed_y(float speed_y) { m_particle_speed_y = speed_y; }
  343. /**
  344. * @scripting
  345. * @param float $speed_y
  346. * @param float $time
  347. */
  348. void fade_speed_y(float speed_y, float time);
  349. /**
  350. * @scripting
  351. * @param float $speed_y
  352. * @param float $time
  353. * @param string $easing
  354. */
  355. void ease_speed_y(float speed_y, float time, const std::string& easing);
  356. /**
  357. * @scripting
  358. */
  359. inline float get_speed_variation_x() const { return m_particle_speed_variation_x; }
  360. /**
  361. * @scripting
  362. * @param float $speed_variation_x
  363. */
  364. inline void set_speed_variation_x(float speed_variation_x) { m_particle_speed_variation_x = speed_variation_x; }
  365. /**
  366. * @scripting
  367. * @param float $speed_variation_x
  368. * @param float $time
  369. */
  370. void fade_speed_variation_x(float speed_variation_x, float time);
  371. /**
  372. * @scripting
  373. * @param float $speed_variation_x
  374. * @param float $time
  375. * @param string $easing
  376. */
  377. void ease_speed_variation_x(float speed_variation_x, float time, const std::string& easing);
  378. /**
  379. * @scripting
  380. */
  381. inline float get_speed_variation_y() const { return m_particle_speed_variation_y; }
  382. /**
  383. * @scripting
  384. * @param float $speed_variation_y
  385. */
  386. inline void set_speed_variation_y(float speed_variation_y) { m_particle_speed_variation_y = speed_variation_y; }
  387. /**
  388. * @scripting
  389. * @param float $speed_variation_y
  390. * @param float $time
  391. */
  392. void fade_speed_variation_y(float speed_variation_y, float time);
  393. /**
  394. * @scripting
  395. * @param float $speed_variation_y
  396. * @param float $time
  397. * @param string $easing
  398. */
  399. void ease_speed_variation_y(float speed_variation_y, float time, const std::string& easing);
  400. /**
  401. * @scripting
  402. */
  403. inline float get_acceleration_x() const { return m_particle_acceleration_x; }
  404. /**
  405. * @scripting
  406. * @param float $acceleration_x
  407. */
  408. inline void set_acceleration_x(float acceleration_x) { m_particle_acceleration_x = acceleration_x; }
  409. /**
  410. * @scripting
  411. * @param float $acceleration_x
  412. * @param float $time
  413. */
  414. void fade_acceleration_x(float acceleration_x, float time);
  415. /**
  416. * @scripting
  417. * @param float $acceleration_x
  418. * @param float $time
  419. * @param string $easing
  420. */
  421. void ease_acceleration_x(float acceleration_x, float time, const std::string& easing);
  422. /**
  423. * @scripting
  424. */
  425. inline float get_acceleration_y() const { return m_particle_acceleration_y; }
  426. /**
  427. * @scripting
  428. * @param float $acceleration_y
  429. */
  430. inline void set_acceleration_y(float acceleration_y) { m_particle_acceleration_y = acceleration_y; }
  431. /**
  432. * @scripting
  433. * @param float $acceleration_y
  434. * @param float $time
  435. */
  436. void fade_acceleration_y(float acceleration_y, float time);
  437. /**
  438. * @scripting
  439. * @param float $acceleration_y
  440. * @param float $time
  441. * @param string $easing
  442. */
  443. void ease_acceleration_y(float acceleration_y, float time, const std::string& easing);
  444. /**
  445. * @scripting
  446. */
  447. inline float get_friction_x() const { return m_particle_friction_x; }
  448. /**
  449. * @scripting
  450. * @param float $friction_x
  451. */
  452. inline void set_friction_x(float friction_x) { m_particle_friction_x = friction_x; }
  453. /**
  454. * @scripting
  455. * @param float $friction_x
  456. * @param float $time
  457. */
  458. void fade_friction_x(float friction_x, float time);
  459. /**
  460. * @scripting
  461. * @param float $friction_x
  462. * @param float $time
  463. * @param string $easing
  464. */
  465. void ease_friction_x(float friction_x, float time, const std::string& easing);
  466. /**
  467. * @scripting
  468. */
  469. inline float get_friction_y() const { return m_particle_friction_y; }
  470. /**
  471. * @scripting
  472. * @param float $friction_y
  473. */
  474. inline void set_friction_y(float friction_y) { m_particle_friction_y = friction_y; }
  475. /**
  476. * @scripting
  477. * @param float $friction_y
  478. * @param float $time
  479. */
  480. void fade_friction_y(float friction_y, float time);
  481. /**
  482. * @scripting
  483. * @param float $friction_y
  484. * @param float $time
  485. * @param string $easing
  486. */
  487. void ease_friction_y(float friction_y, float time, const std::string& easing);
  488. /**
  489. * @scripting
  490. */
  491. inline float get_feather_factor() const { return m_particle_feather_factor; }
  492. /**
  493. * @scripting
  494. * @param float $feather_factor
  495. */
  496. inline void set_feather_factor(float feather_factor) { m_particle_feather_factor = feather_factor; }
  497. /**
  498. * @scripting
  499. * @param float $feather_factor
  500. * @param float $time
  501. */
  502. void fade_feather_factor(float feather_factor, float time);
  503. /**
  504. * @scripting
  505. * @param float $feather_factor
  506. * @param float $time
  507. * @param string $easing
  508. */
  509. void ease_feather_factor(float feather_factor, float time, const std::string& easing);
  510. /**
  511. * @scripting
  512. */
  513. inline float get_rotation() const { return m_particle_rotation; }
  514. /**
  515. * @scripting
  516. * @param float $rotation
  517. */
  518. inline void set_rotation(float rotation) { m_particle_rotation = rotation; }
  519. /**
  520. * @scripting
  521. * @param float $rotation
  522. * @param float $time
  523. */
  524. void fade_rotation(float rotation, float time);
  525. /**
  526. * @scripting
  527. * @param float $rotation
  528. * @param float $time
  529. * @param string $easing
  530. */
  531. void ease_rotation(float rotation, float time, const std::string& easing);
  532. /**
  533. * @scripting
  534. */
  535. inline float get_rotation_variation() const { return m_particle_rotation_variation; }
  536. /**
  537. * @scripting
  538. * @param float $rotation_variation
  539. */
  540. inline void set_rotation_variation(float rotation_variation) { m_particle_rotation_variation = rotation_variation; }
  541. /**
  542. * @scripting
  543. * @param float $rotation_variation
  544. * @param float $time
  545. */
  546. void fade_rotation_variation(float rotation_variation, float time);
  547. /**
  548. * @scripting
  549. * @param float $rotation_variation
  550. * @param float $time
  551. * @param string $easing
  552. */
  553. void ease_rotation_variation(float rotation_variation, float time, const std::string& easing);
  554. /**
  555. * @scripting
  556. */
  557. inline float get_rotation_speed() const { return m_particle_rotation_speed; }
  558. /**
  559. * @scripting
  560. * @param float $rotation_speed
  561. */
  562. inline void set_rotation_speed(float rotation_speed) { m_particle_rotation_speed = rotation_speed; }
  563. /**
  564. * @scripting
  565. * @param float $rotation_speed
  566. * @param float $time
  567. */
  568. void fade_rotation_speed(float rotation_speed, float time);
  569. /**
  570. * @scripting
  571. * @param float $rotation_speed
  572. * @param float $time
  573. * @param string $easing
  574. */
  575. void ease_rotation_speed(float rotation_speed, float time, const std::string& easing);
  576. /**
  577. * @scripting
  578. */
  579. inline float get_rotation_speed_variation() const { return m_particle_rotation_speed_variation; }
  580. /**
  581. * @scripting
  582. * @param float $rotation_speed_variation
  583. */
  584. inline void set_rotation_speed_variation(float rotation_speed_variation) { m_particle_rotation_speed_variation = rotation_speed_variation; }
  585. /**
  586. * @scripting
  587. * @param float $rotation_speed_variation
  588. * @param float $time
  589. */
  590. void fade_rotation_speed_variation(float rotation_speed_variation, float time);
  591. /**
  592. * @scripting
  593. * @param float $rotation_speed_variation
  594. * @param float $time
  595. * @param string $easing
  596. */
  597. void ease_rotation_speed_variation(float rotation_speed_variation, float time, const std::string& easing);
  598. /**
  599. * @scripting
  600. */
  601. inline float get_rotation_acceleration() const { return m_particle_rotation_acceleration; }
  602. /**
  603. * @scripting
  604. * @param float $rotation_acceleration
  605. */
  606. inline void set_rotation_acceleration(float rotation_acceleration) { m_particle_rotation_acceleration = rotation_acceleration; }
  607. /**
  608. * @scripting
  609. * @param float $rotation_acceleration
  610. * @param float $time
  611. */
  612. void fade_rotation_acceleration(float rotation_acceleration, float time);
  613. /**
  614. * @scripting
  615. * @param float $rotation_acceleration
  616. * @param float $time
  617. * @param string $easing
  618. */
  619. void ease_rotation_acceleration(float rotation_acceleration, float time, const std::string& easing);
  620. /**
  621. * @scripting
  622. */
  623. inline float get_rotation_decceleration() const { return m_particle_rotation_decceleration; }
  624. /**
  625. * @scripting
  626. * @param float $rotation_decceleration
  627. */
  628. inline void set_rotation_decceleration(float rotation_decceleration) { m_particle_rotation_decceleration = rotation_decceleration; }
  629. /**
  630. * @scripting
  631. * @param float $rotation_decceleration
  632. * @param float $time
  633. */
  634. void fade_rotation_decceleration(float rotation_decceleration, float time);
  635. /**
  636. * @scripting
  637. * @param float $rotation_decceleration
  638. * @param float $time
  639. * @param string $easing
  640. */
  641. void ease_rotation_decceleration(float rotation_decceleration, float time, const std::string& easing);
  642. private:
  643. std::vector<ease_request> script_easings;
  644. enum class RotationMode {
  645. Fixed,
  646. Facing,
  647. Wiggling
  648. };
  649. enum class FadeMode {
  650. None,
  651. Fade,
  652. Shrink
  653. };
  654. enum class CollisionMode {
  655. Ignore,
  656. Stick,
  657. StickForever,
  658. BounceHeavy,
  659. BounceLight,
  660. Destroy,
  661. FadeOut
  662. };
  663. enum class OffscreenMode {
  664. Never,
  665. OnlyOnExit,
  666. Always
  667. };
  668. class SpriteProperties final
  669. {
  670. public:
  671. float likeliness;
  672. Color color;
  673. SurfacePtr texture;
  674. Vector scale;
  675. Vector hb_scale;
  676. Vector hb_offset;
  677. SpriteProperties() :
  678. likeliness(1.f),
  679. color(1.f, 1.f, 1.f, 1.f),
  680. texture(Surface::from_file("images/engine/editor/particle.png")),
  681. scale(1.f, 1.f),
  682. hb_scale(1.f, 1.f),
  683. hb_offset(0.f, 0.f)
  684. {
  685. }
  686. SpriteProperties(const SurfacePtr& surface) :
  687. likeliness(1.f),
  688. color(1.f, 1.f, 1.f, 1.f),
  689. texture(surface),
  690. scale(1.f, 1.f),
  691. hb_scale(1.f, 1.f),
  692. hb_offset(0.f, 0.f)
  693. {
  694. }
  695. SpriteProperties(const SpriteProperties& sp, float alpha) :
  696. likeliness(sp.likeliness),
  697. color(sp.color.red, sp.color.green, sp.color.blue, sp.color.alpha * alpha),
  698. texture(sp.texture),
  699. scale(sp.scale),
  700. hb_scale(sp.hb_scale),
  701. hb_offset(sp.hb_offset)
  702. {
  703. }
  704. inline bool operator==(const SpriteProperties& sp)
  705. {
  706. return this->likeliness == sp.likeliness
  707. && this->color == sp.color
  708. && this->texture == sp.texture
  709. && this->scale == sp.scale
  710. && this->hb_scale == sp.hb_scale
  711. && this->hb_offset == sp.hb_offset;
  712. }
  713. inline bool operator!=(const SpriteProperties& sp)
  714. {
  715. return !operator==(sp);
  716. }
  717. };
  718. SpriteProperties get_random_texture() const;
  719. class CustomParticle : public Particle
  720. {
  721. public:
  722. SpriteProperties original_props, props;
  723. float lifetime, birth_time, death_time,
  724. total_birth, total_death;
  725. FadeMode birth_mode, death_mode;
  726. EasingMode birth_easing, death_easing;
  727. bool ready_for_deletion;
  728. float speedX, speedY,
  729. accX, accY,
  730. frictionX, frictionY;
  731. float feather_factor;
  732. float angle_speed, angle_acc,
  733. angle_decc;
  734. RotationMode angle_mode;
  735. CollisionMode collision_mode;
  736. OffscreenMode offscreen_mode;
  737. bool has_been_on_screen;
  738. bool has_been_in_life_zone;
  739. bool last_life_zone_required_instakill;
  740. bool stuck;
  741. CustomParticle() :
  742. original_props(),
  743. props(),
  744. lifetime(),
  745. birth_time(),
  746. death_time(),
  747. total_birth(),
  748. total_death(),
  749. birth_mode(),
  750. death_mode(),
  751. birth_easing(),
  752. death_easing(),
  753. ready_for_deletion(false),
  754. speedX(),
  755. speedY(),
  756. accX(),
  757. accY(),
  758. frictionX(),
  759. frictionY(),
  760. feather_factor(),
  761. angle_speed(),
  762. angle_acc(),
  763. angle_decc(),
  764. angle_mode(),
  765. collision_mode(),
  766. offscreen_mode(),
  767. has_been_on_screen(),
  768. has_been_in_life_zone(false),
  769. last_life_zone_required_instakill(false),
  770. stuck(false)
  771. {}
  772. };
  773. std::vector<SpriteProperties> m_textures;
  774. std::vector<std::unique_ptr<CustomParticle> > custom_particles;
  775. std::string m_particle_main_texture;
  776. /**
  777. * @scripting
  778. */
  779. int m_max_amount;
  780. /**
  781. * @scripting
  782. */
  783. float m_delay;
  784. /**
  785. * @scripting
  786. */
  787. float m_particle_lifetime;
  788. /**
  789. * @scripting
  790. */
  791. float m_particle_lifetime_variation;
  792. /**
  793. * @scripting
  794. */
  795. float m_particle_birth_time;
  796. /**
  797. * @scripting
  798. */
  799. float m_particle_birth_time_variation;
  800. /**
  801. * @scripting
  802. */
  803. float m_particle_death_time;
  804. /**
  805. * @scripting
  806. */
  807. float m_particle_death_time_variation;
  808. FadeMode m_particle_birth_mode,
  809. m_particle_death_mode;
  810. EasingMode m_particle_birth_easing,
  811. m_particle_death_easing;
  812. /**
  813. * @scripting
  814. */
  815. float m_particle_speed_x;
  816. /**
  817. * @scripting
  818. */
  819. float m_particle_speed_y;
  820. /**
  821. * @scripting
  822. */
  823. float m_particle_speed_variation_x;
  824. /**
  825. * @scripting
  826. */
  827. float m_particle_speed_variation_y;
  828. /**
  829. * @scripting
  830. */
  831. float m_particle_acceleration_x;
  832. /**
  833. * @scripting
  834. */
  835. float m_particle_acceleration_y;
  836. /**
  837. * @scripting
  838. */
  839. float m_particle_friction_x;
  840. /**
  841. * @scripting
  842. */
  843. float m_particle_friction_y;
  844. /**
  845. * @scripting
  846. */
  847. float m_particle_feather_factor;
  848. /**
  849. * @scripting
  850. */
  851. float m_particle_rotation;
  852. /**
  853. * @scripting
  854. */
  855. float m_particle_rotation_variation;
  856. /**
  857. * @scripting
  858. */
  859. float m_particle_rotation_speed;
  860. /**
  861. * @scripting
  862. */
  863. float m_particle_rotation_speed_variation;
  864. /**
  865. * @scripting
  866. */
  867. float m_particle_rotation_acceleration;
  868. /**
  869. * @scripting
  870. */
  871. float m_particle_rotation_decceleration;
  872. RotationMode m_particle_rotation_mode;
  873. CollisionMode m_particle_collision_mode;
  874. OffscreenMode m_particle_offscreen_mode;
  875. /**
  876. * @scripting
  877. */
  878. bool m_cover_screen;
  879. public:
  880. // TODO: Put all those member variables in some (abstract?) class of which
  881. // both CustomParticlesSystem and ParticleProbs will inherit (so that
  882. // I don't have to write all the variables 4 times just in the header)
  883. // For the particle editor
  884. class ParticleProps final
  885. {
  886. public:
  887. std::vector<SpriteProperties> m_textures;
  888. std::string m_particle_main_texture;
  889. int m_max_amount;
  890. float m_delay;
  891. float m_particle_lifetime;
  892. float m_particle_lifetime_variation;
  893. float m_particle_birth_time,
  894. m_particle_birth_time_variation,
  895. m_particle_death_time,
  896. m_particle_death_time_variation;
  897. FadeMode m_particle_birth_mode,
  898. m_particle_death_mode;
  899. EasingMode m_particle_birth_easing,
  900. m_particle_death_easing;
  901. float m_particle_speed_x,
  902. m_particle_speed_y,
  903. m_particle_speed_variation_x,
  904. m_particle_speed_variation_y,
  905. m_particle_acceleration_x,
  906. m_particle_acceleration_y,
  907. m_particle_friction_x,
  908. m_particle_friction_y;
  909. float m_particle_feather_factor;
  910. float m_particle_rotation,
  911. m_particle_rotation_variation,
  912. m_particle_rotation_speed,
  913. m_particle_rotation_speed_variation,
  914. m_particle_rotation_acceleration,
  915. m_particle_rotation_decceleration;
  916. RotationMode m_particle_rotation_mode;
  917. CollisionMode m_particle_collision_mode;
  918. OffscreenMode m_particle_offscreen_mode;
  919. bool m_cover_screen;
  920. ParticleProps() :
  921. m_textures(),
  922. m_particle_main_texture(),
  923. m_max_amount(25),
  924. m_delay(0.1f),
  925. m_particle_lifetime(5.f),
  926. m_particle_lifetime_variation(0.f),
  927. m_particle_birth_time(0.f),
  928. m_particle_birth_time_variation(0.f),
  929. m_particle_death_time(0.f),
  930. m_particle_death_time_variation(0.f),
  931. m_particle_birth_mode(),
  932. m_particle_death_mode(),
  933. m_particle_birth_easing(),
  934. m_particle_death_easing(),
  935. m_particle_speed_x(0.f),
  936. m_particle_speed_y(0.f),
  937. m_particle_speed_variation_x(0.f),
  938. m_particle_speed_variation_y(0.f),
  939. m_particle_acceleration_x(0.f),
  940. m_particle_acceleration_y(0.f),
  941. m_particle_friction_x(0.f),
  942. m_particle_friction_y(0.f),
  943. m_particle_feather_factor(0.f),
  944. m_particle_rotation(0.f),
  945. m_particle_rotation_variation(0.f),
  946. m_particle_rotation_speed(0.f),
  947. m_particle_rotation_speed_variation(0.f),
  948. m_particle_rotation_acceleration(0.f),
  949. m_particle_rotation_decceleration(0.f),
  950. m_particle_rotation_mode(),
  951. m_particle_collision_mode(),
  952. m_particle_offscreen_mode(),
  953. m_cover_screen(true)
  954. {
  955. }
  956. };
  957. std::unique_ptr<ParticleProps> get_props() const
  958. {
  959. std::unique_ptr<ParticleProps> props = std::make_unique<ParticleProps>();
  960. for (auto& texture : m_textures)
  961. props->m_textures.push_back(texture);
  962. props->m_particle_main_texture = m_particle_main_texture;
  963. props->m_max_amount = m_max_amount;
  964. props->m_delay = m_delay;
  965. props->m_particle_lifetime = m_particle_lifetime;
  966. props->m_particle_lifetime_variation = m_particle_lifetime_variation;
  967. props->m_particle_birth_time = m_particle_birth_time;
  968. props->m_particle_birth_time_variation = m_particle_birth_time_variation;
  969. props->m_particle_death_time = m_particle_death_time;
  970. props->m_particle_death_time_variation = m_particle_death_time_variation;
  971. props->m_particle_birth_mode = m_particle_birth_mode;
  972. props->m_particle_death_mode = m_particle_death_mode;
  973. props->m_particle_birth_easing = m_particle_birth_easing;
  974. props->m_particle_death_easing = m_particle_death_easing;
  975. props->m_particle_speed_x = m_particle_speed_x;
  976. props->m_particle_speed_y = m_particle_speed_y;
  977. props->m_particle_speed_variation_x = m_particle_speed_variation_x;
  978. props->m_particle_speed_variation_y = m_particle_speed_variation_y;
  979. props->m_particle_acceleration_x = m_particle_acceleration_x;
  980. props->m_particle_acceleration_y = m_particle_acceleration_y;
  981. props->m_particle_friction_x = m_particle_friction_x;
  982. props->m_particle_friction_y = m_particle_friction_y;
  983. props->m_particle_feather_factor = m_particle_feather_factor;
  984. props->m_particle_rotation = m_particle_rotation;
  985. props->m_particle_rotation_variation = m_particle_rotation_variation;
  986. props->m_particle_rotation_speed = m_particle_rotation_speed;
  987. props->m_particle_rotation_speed_variation = m_particle_rotation_speed_variation;
  988. props->m_particle_rotation_acceleration = m_particle_rotation_acceleration;
  989. props->m_particle_rotation_decceleration = m_particle_rotation_decceleration;
  990. props->m_particle_rotation_mode = m_particle_rotation_mode;
  991. props->m_particle_collision_mode = m_particle_collision_mode;
  992. props->m_particle_offscreen_mode = m_particle_offscreen_mode;
  993. props->m_cover_screen = m_cover_screen;
  994. return props;
  995. }
  996. void set_props(ParticleProps* props)
  997. {
  998. m_textures.clear();
  999. for (auto& texture : props->m_textures)
  1000. m_textures.push_back(texture);
  1001. m_particle_main_texture = props->m_particle_main_texture;
  1002. m_max_amount = props->m_max_amount;
  1003. m_delay = props->m_delay;
  1004. m_particle_lifetime = props->m_particle_lifetime;
  1005. m_particle_lifetime_variation = props->m_particle_lifetime_variation;
  1006. m_particle_birth_time = props->m_particle_birth_time;
  1007. m_particle_birth_time_variation = props->m_particle_birth_time_variation;
  1008. m_particle_death_time = props->m_particle_death_time;
  1009. m_particle_death_time_variation = props->m_particle_death_time_variation;
  1010. m_particle_birth_mode = props->m_particle_birth_mode;
  1011. m_particle_death_mode = props->m_particle_death_mode;
  1012. m_particle_birth_easing = props->m_particle_birth_easing;
  1013. m_particle_death_easing = props->m_particle_death_easing;
  1014. m_particle_speed_x = props->m_particle_speed_x;
  1015. m_particle_speed_y = props->m_particle_speed_y;
  1016. m_particle_speed_variation_x = props->m_particle_speed_variation_x;
  1017. m_particle_speed_variation_y = props->m_particle_speed_variation_y;
  1018. m_particle_acceleration_x = props->m_particle_acceleration_x;
  1019. m_particle_acceleration_y = props->m_particle_acceleration_y;
  1020. m_particle_friction_x = props->m_particle_friction_x;
  1021. m_particle_friction_y = props->m_particle_friction_y;
  1022. m_particle_feather_factor = props->m_particle_feather_factor;
  1023. m_particle_rotation = props->m_particle_rotation;
  1024. m_particle_rotation_variation = props->m_particle_rotation_variation;
  1025. m_particle_rotation_speed = props->m_particle_rotation_speed;
  1026. m_particle_rotation_speed_variation = props->m_particle_rotation_speed_variation;
  1027. m_particle_rotation_acceleration = props->m_particle_rotation_acceleration;
  1028. m_particle_rotation_decceleration = props->m_particle_rotation_decceleration;
  1029. m_particle_rotation_mode = props->m_particle_rotation_mode;
  1030. m_particle_collision_mode = props->m_particle_collision_mode;
  1031. m_particle_offscreen_mode = props->m_particle_offscreen_mode;
  1032. m_cover_screen = props->m_cover_screen;
  1033. }
  1034. private:
  1035. CustomParticleSystem(const CustomParticleSystem&) = delete;
  1036. CustomParticleSystem& operator=(const CustomParticleSystem&) = delete;
  1037. };
  1038. #endif
  1039. /* EOF */