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.
 
 
 

96 lines
2.2 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net>
  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. #include <lol/engine-internal.h>
  13. namespace lol
  14. {
  15. /*
  16. * Emitter implementation class
  17. */
  18. class EmitterData
  19. {
  20. friend class Emitter;
  21. static const int MAX_PARTICLES = 1000;
  22. private:
  23. TileSet *tileset;
  24. vec3 gravity;
  25. int particles[MAX_PARTICLES];
  26. vec3 positions[MAX_PARTICLES];
  27. vec3 velocities[MAX_PARTICLES];
  28. int nparticles;
  29. };
  30. /*
  31. * Public Emitter class
  32. */
  33. Emitter::Emitter(TileSet *tileset, vec3 gravity)
  34. : data(new EmitterData())
  35. {
  36. data->tileset = tileset;
  37. data->gravity = gravity;
  38. data->nparticles = 0;
  39. }
  40. void Emitter::tick_game(float seconds)
  41. {
  42. for (int i = 0; i < data->nparticles; i++)
  43. {
  44. vec3 oldvelocity = data->velocities[i];
  45. data->velocities[i] += seconds * data->gravity;
  46. data->positions[i] += seconds * 0.5f
  47. * (oldvelocity + data->velocities[i]);
  48. if (data->positions[i].y < -100)
  49. {
  50. data->particles[i] = data->particles[data->nparticles - 1];
  51. data->positions[i] = data->positions[data->nparticles - 1];
  52. data->velocities[i] = data->velocities[data->nparticles - 1];
  53. data->nparticles--;
  54. }
  55. }
  56. entity::tick_game(seconds);
  57. }
  58. void Emitter::tick_draw(float seconds, Scene &scene)
  59. {
  60. entity::tick_draw(seconds, scene);
  61. for (int i = 0; i < data->nparticles; i++)
  62. scene.AddTile(data->tileset, data->particles[i],
  63. data->positions[i], vec2(1.0f), 0.0f);
  64. }
  65. void Emitter::AddParticle(int id, vec3 pos, vec3 vel)
  66. {
  67. if (data->nparticles >= EmitterData::MAX_PARTICLES)
  68. return;
  69. data->particles[data->nparticles] = id;
  70. data->positions[data->nparticles] = pos;
  71. data->velocities[data->nparticles] = vel;
  72. data->nparticles++;
  73. }
  74. Emitter::~Emitter()
  75. {
  76. delete data;
  77. }
  78. } /* namespace lol */