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