ParticleSystemManager.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #include "core/particles/ParticleSystemManager.h"
  2. #include <OgreLogManager.h>
  3. #include <OgreRoot.h>
  4. #include "core/particles/ParticleSystemFactory.h"
  5. #include "core/particles/emitters/ParticlePointEmitterFactory.h"
  6. #include "core/particles/renderer/ParticleEntityRendererFactory.h"
  7. //------------------------------------------------------------------------------
  8. template<> ParticleSystemManager* Ogre::Singleton<ParticleSystemManager>::msSingleton = nullptr;
  9. //------------------------------------------------------------------------------
  10. ParticleSystemManager::ParticleSystemManager()
  11. {
  12. m_TranslatorManager = new ParticleSystemTranslatorManager();
  13. Ogre::ScriptCompilerManager::getSingleton().addTranslatorManager(m_TranslatorManager);
  14. Ogre::ScriptCompilerManager::getSingleton().addScriptPattern("*.effects");
  15. m_ParticleSystemFactory = new ParticleSystemFactory();
  16. Ogre::Root::getSingleton().addMovableObjectFactory(m_ParticleSystemFactory);
  17. AddEmitterFactory(new PointEmitterFactory());
  18. AddRendererFactory(new ParticleEntityRendererFactory());
  19. }
  20. //------------------------------------------------------------------------------
  21. ParticleSystemManager::~ParticleSystemManager()
  22. {
  23. Ogre::ScriptCompilerManager::getSingleton().removeTranslatorManager(m_TranslatorManager);
  24. delete m_TranslatorManager;
  25. if (m_ParticleSystemFactory)
  26. {
  27. Ogre::Root::getSingleton().removeMovableObjectFactory(m_ParticleSystemFactory);
  28. delete m_ParticleSystemFactory;
  29. m_ParticleSystemFactory = 0;
  30. }
  31. // Delete all Particle System Templates
  32. ParticleSystemTemplateMap::iterator t;
  33. for (t = m_ParticleSystemTemplates.begin(); t != m_ParticleSystemTemplates.end(); ++t)
  34. {
  35. delete t->second;
  36. }
  37. m_ParticleSystemTemplates.clear();
  38. EmitterFactoryMap::iterator efi;
  39. for (efi = m_EmitterFactories.begin(); efi != m_EmitterFactories.end(); ++efi)
  40. {
  41. delete efi->second;
  42. }
  43. RendererFactoryMap::iterator rfi;
  44. for (rfi = m_RendererFactories.begin(); rfi != m_RendererFactories.end(); ++rfi)
  45. {
  46. delete rfi->second;
  47. }
  48. }
  49. //------------------------------------------------------------------------------
  50. ParticleSystem*
  51. ParticleSystemManager::CreateParticleSystemTemplate(const Ogre::String& name)
  52. {
  53. // Validate name
  54. if (m_ParticleSystemTemplates.find(name) != m_ParticleSystemTemplates.end())
  55. {
  56. OGRE_EXCEPT(Ogre::Exception::ERR_DUPLICATE_ITEM, "ParticleSystem template with name '" + name + "' already exists.", "ParticleSystemManager::CreateParticleSystemTemplate");
  57. }
  58. ParticleSystem* particle_system_template = new ParticleSystem(name);
  59. m_ParticleSystemTemplates[name] = particle_system_template;
  60. return particle_system_template;
  61. }
  62. //------------------------------------------------------------------------------
  63. ParticleSystem*
  64. ParticleSystemManager::GetParticleSystemTemplate(const Ogre::String& template_name)
  65. {
  66. ParticleSystemTemplateMap::iterator i = m_ParticleSystemTemplates.find(template_name);
  67. if (i != m_ParticleSystemTemplates.end())
  68. {
  69. return i->second;
  70. }
  71. return 0;
  72. }
  73. //------------------------------------------------------------------------------
  74. void
  75. ParticleSystemManager::ParticleSystemTemplateNames(std::vector<Ogre::String>& v)
  76. {
  77. ParticleSystemTemplateMap::iterator it;
  78. ParticleSystemTemplateMap::iterator it_end = m_ParticleSystemTemplates.end();
  79. for (it = m_ParticleSystemTemplates.begin(); it != it_end; ++it)
  80. {
  81. v.push_back((*it).first);
  82. }
  83. }
  84. //------------------------------------------------------------------------------
  85. ParticleSystem*
  86. ParticleSystemManager::CreateParticleSystem(const Ogre::String& name, const Ogre::String& template_name)
  87. {
  88. Ogre::NameValuePairList params;
  89. params["template_name"] = template_name;
  90. ParticleSystem* system = static_cast<ParticleSystem*>(Ogre::Root::getSingleton().getSceneManager("Scene")->createMovableObject(name, ParticleSystemFactory::FACTORY_TYPE_NAME, &params));
  91. return system;
  92. }
  93. //------------------------------------------------------------------------------
  94. void
  95. ParticleSystemManager::DestroyParticleSystem(ParticleSystem* particle_system)
  96. {
  97. Ogre::Root::getSingleton().getSceneManager("Scene")->destroyMovableObject(particle_system);
  98. }
  99. //------------------------------------------------------------------------------
  100. ParticleTechnique*
  101. ParticleSystemManager::CreateTechnique()
  102. {
  103. ParticleTechnique* technique = new ParticleTechnique();
  104. technique->CreateRenderer("Entity"); // Set default renderer
  105. return technique;
  106. }
  107. //------------------------------------------------------------------------------
  108. ParticleTechnique*
  109. ParticleSystemManager::CloneTechnique(ParticleTechnique* technique)
  110. {
  111. if (technique == nullptr)
  112. {
  113. return nullptr;
  114. }
  115. ParticleTechnique* cloned_technique = CreateTechnique();
  116. technique->CopyAttributesTo(cloned_technique);
  117. return cloned_technique;
  118. }
  119. //------------------------------------------------------------------------------
  120. void
  121. ParticleSystemManager::DestroyTechnique(ParticleTechnique* technique)
  122. {
  123. // Deletion must be done by the same object that also created it
  124. delete technique;
  125. }
  126. //------------------------------------------------------------------------------
  127. ParticleEmitter*
  128. ParticleSystemManager::CreateEmitter(const Ogre::String& emitter_type)
  129. {
  130. // Locate emitter type
  131. EmitterFactoryMap::iterator it = m_EmitterFactories.find(emitter_type);
  132. if (it == m_EmitterFactories.end())
  133. {
  134. OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, "Particle System: Cannot find requested emitter type.", "ParticleSystemManager::CreateEmitter");
  135. }
  136. return it->second->CreateEmitter();
  137. }
  138. //------------------------------------------------------------------------------
  139. ParticleEmitter*
  140. ParticleSystemManager::CloneEmitter(ParticleEmitter* emitter)
  141. {
  142. if (!emitter)
  143. {
  144. return nullptr;
  145. }
  146. ParticleEmitter* cloned_emitter = CreateEmitter(emitter->GetEmitterType());
  147. emitter->CopyAttributesTo(cloned_emitter);
  148. return cloned_emitter;
  149. }
  150. //------------------------------------------------------------------------------
  151. void
  152. ParticleSystemManager::DestroyEmitter(ParticleEmitter* emitter)
  153. {
  154. // Locate emitter type
  155. EmitterFactoryMap::iterator it = m_EmitterFactories.find(emitter->GetEmitterType());
  156. if (it == m_EmitterFactories.end())
  157. {
  158. OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, "Particle System: Cannot find requested emitter type.", "ParticleSystemManager::DestroyEmitter");
  159. }
  160. it->second->DestroyEmitter(emitter);
  161. }
  162. //------------------------------------------------------------------------------
  163. ParticleRenderer*
  164. ParticleSystemManager::CreateRenderer(const Ogre::String& renderer_type)
  165. {
  166. // Locate renderer type
  167. RendererFactoryMap::iterator it = m_RendererFactories.find(renderer_type);
  168. if (it == m_RendererFactories.end())
  169. {
  170. OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, "PU: Cannot find requested renderer type.", "ParticleSystemManager::CreateRenderer");
  171. }
  172. return it->second->CreateRenderer();
  173. }
  174. //------------------------------------------------------------------------------
  175. ParticleRenderer*
  176. ParticleSystemManager::CloneRenderer(ParticleRenderer* renderer)
  177. {
  178. if (renderer == nullptr)
  179. {
  180. return nullptr;
  181. }
  182. ParticleRenderer* cloned_renderer = CreateRenderer(renderer->GetRendererType());
  183. renderer->CopyAttributesTo(cloned_renderer);
  184. return cloned_renderer;
  185. }
  186. //------------------------------------------------------------------------------
  187. void
  188. ParticleSystemManager::DestroyRenderer(ParticleRenderer* renderer)
  189. {
  190. // Locate renderer type
  191. RendererFactoryMap::iterator it = m_RendererFactories.find(renderer->GetRendererType());
  192. if (it == m_RendererFactories.end())
  193. {
  194. OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, "PU: Cannot find requested renderer type.", "ParticleSystemManager::DestroyRenderer");
  195. }
  196. it->second->DestroyRenderer(renderer);
  197. }
  198. //------------------------------------------------------------------------------
  199. void
  200. ParticleSystemManager::AddEmitterFactory(ParticleEmitterFactory* factory)
  201. {
  202. Ogre::String type = factory->GetEmitterType();
  203. m_EmitterFactories[type] = factory;
  204. Ogre::LogManager::getSingleton().logMessage("ParticleUniverse: Particle Emitter Type '" + type + "' registered.");
  205. }
  206. //------------------------------------------------------------------------------
  207. void
  208. ParticleSystemManager::AddRendererFactory(ParticleRendererFactory* factory)
  209. {
  210. Ogre::String type = factory->GetRendererType();
  211. m_RendererFactories[type] = factory;
  212. Ogre::LogManager::getSingleton().logMessage("ParticleUniverse: Particle Renderer Type '" + type + "' registered");
  213. }
  214. //------------------------------------------------------------------------------