ParticleEmitter.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "core/particles/ParticleEmitter.h"
  2. #include <OgreLogManager.h>
  3. #include <OgreString.h>
  4. #include <OgreStringConverter.h>
  5. #include "core/particles/ParticleTechnique.h"
  6. //------------------------------------------------------------------------------
  7. ParticleEmitterDictionary::EmissionRate ParticleEmitter::m_EmissionRateDictionary;
  8. ParticleEmitterDictionary::TotalTimeToLive ParticleEmitter::m_TotalTimeToLiveDictionary;
  9. ParticleEmitterDictionary::Direction ParticleEmitter::m_DirectionDictionary;
  10. //------------------------------------------------------------------------------
  11. ParticleEmitter::ParticleEmitter(void) :
  12. Particle(),
  13. m_ParentTechnique(nullptr),
  14. m_Name(Ogre::StringUtil::BLANK),
  15. m_EmitsName(Ogre::StringUtil::BLANK),
  16. m_EmitsType(PT_VISUAL),
  17. m_EmissionRate(1),
  18. m_EmissionRemainder(0),
  19. m_EmitDirection1(Ogre::Vector3::ZERO),
  20. m_EmitDirection2(Ogre::Vector3::ZERO),
  21. m_EmitTotalTimeToLive(10)
  22. {
  23. m_ParticleType = PT_EMITTER;
  24. if (createParamDictionary("ParticleEmitter"))
  25. {
  26. Ogre::ParamDictionary* dict = getParamDictionary();
  27. dict->addParameter(Ogre::ParameterDef("emission_rate", "", Ogre::PT_INT), &m_EmissionRateDictionary);
  28. dict->addParameter(Ogre::ParameterDef("time_to_live", "", Ogre::PT_REAL), &m_TotalTimeToLiveDictionary);
  29. dict->addParameter(Ogre::ParameterDef("direction", "", Ogre::PT_STRING), &m_DirectionDictionary);
  30. }
  31. }
  32. //------------------------------------------------------------------------------
  33. ParticleEmitter::~ParticleEmitter()
  34. {
  35. }
  36. //------------------------------------------------------------------------------
  37. void
  38. ParticleEmitter::CopyAttributesTo(ParticleEmitter* emitter)
  39. {
  40. Particle::CopyAttributesTo(emitter);
  41. emitter->SetParentTechnique(m_ParentTechnique);
  42. emitter->SetName(m_Name);
  43. emitter->SetEmitterType(m_EmitterType);
  44. emitter->SetEmitsName(m_EmitsName);
  45. emitter->SetEmitsType(m_EmitsType);
  46. emitter->SetEmissionRate(m_EmissionRate);
  47. emitter->SetEmitDirectionRange(m_EmitDirection1, m_EmitDirection2);
  48. emitter->SetEmitTotalTimeToLive(m_EmitTotalTimeToLive);
  49. }
  50. //------------------------------------------------------------------------------
  51. void
  52. ParticleEmitter::InitForEmission()
  53. {
  54. m_EmissionRemainder = 0;
  55. }
  56. //------------------------------------------------------------------------------
  57. int
  58. ParticleEmitter::CalculateRequestedParticles(Ogre::Real time_elapsed)
  59. {
  60. int request = 0;
  61. Ogre::LogManager::getSingletonPtr()->logMessage("ParticleEmitter::CalculateRequestedParticles time:" +
  62. Ogre::StringConverter::toString(time_elapsed) +
  63. " emission rate:" +
  64. Ogre::StringConverter::toString(m_EmissionRate) +
  65. " reminder:" +
  66. Ogre::StringConverter::toString(m_EmissionRemainder));
  67. if (m_Enabled && m_EmissionRate > 0)
  68. {
  69. m_EmissionRemainder += m_EmissionRate * time_elapsed;
  70. request = (int)m_EmissionRemainder;
  71. m_EmissionRemainder -= request;
  72. }
  73. return request;
  74. }
  75. //------------------------------------------------------------------------------
  76. void
  77. ParticleEmitter::InitParticleForEmission(Particle* particle)
  78. {
  79. particle->SetParentEmitter(this);
  80. particle->position = position; // particle emits from emitter position
  81. particle->direction.x = Ogre::Math::RangeRandom(m_EmitDirection1.x, m_EmitDirection2.x);
  82. particle->direction.y = Ogre::Math::RangeRandom(m_EmitDirection1.y, m_EmitDirection2.y);
  83. particle->direction.z = Ogre::Math::RangeRandom(m_EmitDirection1.z, m_EmitDirection2.z);
  84. particle->time_to_live = m_EmitTotalTimeToLive;
  85. particle->total_time_to_live = m_EmitTotalTimeToLive;
  86. }
  87. //------------------------------------------------------------------------------
  88. void
  89. ParticleEmitter::SetEmitsName(const Ogre::String& emits_name)
  90. {
  91. m_EmitsName = emits_name;
  92. if (m_ParentTechnique && m_EmitsName != Ogre::StringUtil::BLANK)
  93. {
  94. // Notify the Technique that something changed
  95. m_ParentTechnique->EmissionChange();
  96. }
  97. }
  98. //------------------------------------------------------------------------------