1 ///////////////////////////////////////////////////////////////////////////////
2 //            Copyright (C) 2004-2011 by The Allacrost Project
3 //            Copyright (C) 2012-2016 by Bertram (Valyria Tear)
4 //                         All Rights Reserved
5 //
6 // This code is licensed under the GNU GPL version 2. It is free software
7 // and you may modify it and/or redistribute it under the terms of this license.
8 // See http://www.gnu.org/copyleft/gpl.html for details.
9 ///////////////////////////////////////////////////////////////////////////////
10 
11 /** ***************************************************************************
12 *** \file    particle_manager.cpp
13 *** \author  Raj Sharma, roos@allacrost.org
14 *** \author  Yohann Ferreira, yohann ferreira orange fr
15 *** \brief   Source file for particle manager
16 *** **************************************************************************/
17 
18 #include "engine/video/particle_manager.h"
19 
20 #include "engine/video/video.h"
21 #include "engine/video/particle_effect.h"
22 
23 #include "utils/utils_common.h"
24 
25 using namespace vt_script;
26 using namespace vt_video;
27 
28 namespace vt_mode_manager
29 {
30 
AddParticleEffect(const std::string & effect_filename,float x,float y)31 bool ParticleManager::AddParticleEffect(const std::string &effect_filename, float x, float y)
32 {
33 
34     ParticleEffect *effect = new ParticleEffect(effect_filename);
35     if(!effect->IsLoaded()) {
36         PRINT_WARNING << "Failed to add effect to particle manager" <<
37                       " for file: " << effect_filename << std::endl;
38         delete effect;
39         return false;
40     }
41 
42     effect->Move(x, y);
43     _all_effects.push_back(effect);
44     _active_effects.push_back(effect);
45 
46     return true;
47 }
48 
_DEBUG_ShowParticleStats()49 void ParticleManager::_DEBUG_ShowParticleStats()
50 {
51     char text[50];
52     sprintf(text, "Particles: %d", GetNumParticles());
53 
54     VideoManager->Move(896.0f, 690.0f);
55     TextManager->Draw(text);
56 }
57 
Draw() const58 void ParticleManager::Draw() const
59 {
60     VideoManager->PushState();
61     VideoManager->SetStandardCoordSys();
62     VideoManager->DisableScissoring();
63 
64     std::vector<ParticleEffect *>::const_iterator it = _active_effects.begin();
65 
66     glClearStencil(0);
67     glClear(GL_STENCIL_BUFFER_BIT);
68 
69     while(it != _active_effects.end()) {
70         (*it)->Draw();
71         ++it;
72     }
73 
74     VideoManager->PopState();
75 }
76 
Update(int32_t frame_time)77 void ParticleManager::Update(int32_t frame_time)
78 {
79     float frame_time_seconds = static_cast<float>(frame_time) / 1000.0f;
80 
81     std::vector<ParticleEffect *>::iterator it = _active_effects.begin();
82 
83     _num_particles = 0;
84 
85     while(it != _active_effects.end()) {
86         if(!(*it)->IsAlive()) {
87             it = _active_effects.erase(it);
88         } else {
89             (*it)->Update(frame_time_seconds);
90             _num_particles += (*it)->GetNumParticles();
91             ++it;
92         }
93     }
94 }
95 
StopAll(bool kill_immediate)96 void ParticleManager::StopAll(bool kill_immediate)
97 {
98     std::vector<ParticleEffect *>::iterator it = _active_effects.begin();
99 
100     while(it != _active_effects.end()) {
101         (*it)->Stop(kill_immediate);
102         ++it;
103     }
104 }
105 
_Destroy()106 void ParticleManager::_Destroy()
107 {
108     // Clear out every effects.
109     std::vector<ParticleEffect *>::iterator it = _all_effects.begin();
110     for(; it != _all_effects.end(); ++it) {
111         delete(*it);
112     }
113     _all_effects.clear();
114     // Clear the active effect pointer references
115     _active_effects.clear();
116 }
117 
118 }  // namespace vt_mode_manager
119