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.
 
 
 

98 lines
2.2 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://www.wtfpl.net/ for more details.
  9. //
  10. #if defined HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #include <lol/main.h>
  14. namespace lol
  15. {
  16. /*
  17. * Emitter implementation class
  18. */
  19. class EmitterData
  20. {
  21. friend class Emitter;
  22. static const int MAX_PARTICLES = 1000;
  23. private:
  24. TileSet *tileset;
  25. vec3 gravity;
  26. int particles[MAX_PARTICLES];
  27. vec3 positions[MAX_PARTICLES];
  28. vec3 velocities[MAX_PARTICLES];
  29. int nparticles;
  30. };
  31. /*
  32. * Public Emitter class
  33. */
  34. Emitter::Emitter(TileSet *tileset, vec3 gravity)
  35. : data(new EmitterData())
  36. {
  37. data->tileset = tileset;
  38. data->gravity = gravity;
  39. data->nparticles = 0;
  40. }
  41. void Emitter::TickGame(float seconds)
  42. {
  43. for (int i = 0; i < data->nparticles; i++)
  44. {
  45. vec3 oldvelocity = data->velocities[i];
  46. data->velocities[i] += seconds * data->gravity;
  47. data->positions[i] += seconds * 0.5f
  48. * (oldvelocity + data->velocities[i]);
  49. if (data->positions[i].y < -100)
  50. {
  51. data->particles[i] = data->particles[data->nparticles - 1];
  52. data->positions[i] = data->positions[data->nparticles - 1];
  53. data->velocities[i] = data->velocities[data->nparticles - 1];
  54. data->nparticles--;
  55. }
  56. }
  57. Entity::TickGame(seconds);
  58. }
  59. void Emitter::TickDraw(float seconds, Scene &scene)
  60. {
  61. Entity::TickDraw(seconds, scene);
  62. for (int i = 0; i < data->nparticles; i++)
  63. scene.AddTile(data->tileset, data->particles[i],
  64. data->positions[i], 0, vec2(1.0f), 0.0f);
  65. }
  66. void Emitter::AddParticle(int id, vec3 pos, vec3 vel)
  67. {
  68. if (data->nparticles >= EmitterData::MAX_PARTICLES)
  69. return;
  70. data->particles[data->nparticles] = id;
  71. data->positions[data->nparticles] = pos;
  72. data->velocities[data->nparticles] = vel;
  73. data->nparticles++;
  74. }
  75. Emitter::~Emitter()
  76. {
  77. delete data;
  78. }
  79. } /* namespace lol */