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.

преди 14 години
преди 14 години
преди 14 години
преди 14 години
преди 14 години
преди 14 години
преди 14 години
преди 14 години
преди 14 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2012 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://sam.zoy.org/projects/COPYING.WTFPL for more details.
  9. //
  10. #if defined HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #include <cmath>
  14. #include "core.h"
  15. namespace lol
  16. {
  17. /*
  18. * Emitter implementation class
  19. */
  20. class EmitterData
  21. {
  22. friend class Emitter;
  23. static const int MAX_PARTICLES = 1000;
  24. private:
  25. TileSet *tileset;
  26. vec3 gravity;
  27. int particles[MAX_PARTICLES];
  28. vec3 positions[MAX_PARTICLES];
  29. vec3 velocities[MAX_PARTICLES];
  30. int nparticles;
  31. };
  32. /*
  33. * Public Emitter class
  34. */
  35. Emitter::Emitter(TileSet *tileset, vec3 gravity)
  36. : data(new EmitterData())
  37. {
  38. data->tileset = tileset;
  39. data->gravity = gravity;
  40. data->nparticles = 0;
  41. }
  42. void Emitter::TickGame(float seconds)
  43. {
  44. for (int i = 0; i < data->nparticles; i++)
  45. {
  46. vec3 oldvelocity = data->velocities[i];
  47. data->velocities[i] += seconds * data->gravity;
  48. data->positions[i] += seconds * 0.5f
  49. * (oldvelocity + data->velocities[i]);
  50. if (data->positions[i].y < -100)
  51. {
  52. data->particles[i] = data->particles[data->nparticles - 1];
  53. data->positions[i] = data->positions[data->nparticles - 1];
  54. data->velocities[i] = data->velocities[data->nparticles - 1];
  55. data->nparticles--;
  56. }
  57. }
  58. Entity::TickGame(seconds);
  59. }
  60. void Emitter::TickDraw(float seconds)
  61. {
  62. Entity::TickDraw(seconds);
  63. for (int i = 0; i < data->nparticles; i++)
  64. Scene::GetDefault()->AddTile(data->tileset, data->particles[i],
  65. data->positions[i], 0, vec2(1.0f));
  66. }
  67. void Emitter::AddParticle(int id, vec3 pos, vec3 vel)
  68. {
  69. if (data->nparticles >= EmitterData::MAX_PARTICLES)
  70. return;
  71. data->particles[data->nparticles] = id;
  72. data->positions[data->nparticles] = pos;
  73. data->velocities[data->nparticles] = vel;
  74. data->nparticles++;
  75. }
  76. Emitter::~Emitter()
  77. {
  78. delete data;
  79. }
  80. } /* namespace lol */