~ubuntu-branches/debian/sid/astromenace/sid

« back to all changes in this revision

Viewing changes to AstroMenaceSource/Core/ParticleSystem/ParticleSystem.h

  • Committer: Package Import Robot
  • Author(s): Boris Pek
  • Date: 2013-04-09 02:04:25 UTC
  • Revision ID: package-import@ubuntu.com-20130409020425-a7fl9xk4diamw6di
Tags: upstream-1.3.1+repack
Import upstream version 1.3.1+repack

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/************************************************************************************
 
2
 
 
3
        AstroMenace (Hardcore 3D space shooter with spaceship upgrade possibilities)
 
4
        Copyright © 2006-2012 Michael Kurinnoy, Viewizard
 
5
 
 
6
 
 
7
        AstroMenace is free software: you can redistribute it and/or modify
 
8
        it under the terms of the GNU General Public License as published by
 
9
        the Free Software Foundation, either version 3 of the License, or
 
10
        (at your option) any later version.
 
11
 
 
12
        AstroMenace is distributed in the hope that it will be useful,
 
13
        but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 
15
        GNU General Public License for more details.
 
16
 
 
17
        You should have received a copy of the GNU General Public License
 
18
        along with AstroMenace. If not, see <http://www.gnu.org/licenses/>.
 
19
 
 
20
 
 
21
        Web Site: http://www.viewizard.com/
 
22
        Project: http://sourceforge.net/projects/openastromenace/
 
23
        E-mail: viewizard@viewizard.com
 
24
 
 
25
*************************************************************************************/
 
26
 
 
27
 
 
28
#ifndef PARTICLESYSTEM_H
 
29
#define PARTICLESYSTEM_H
 
30
 
 
31
 
 
32
#include "Particle.h"
 
33
#include "../Light/Light.h"
 
34
#include "../Texture/Texture.h"
 
35
 
 
36
 
 
37
 
 
38
 
 
39
class eParticleSystem
 
40
{
 
41
public:
 
42
        eParticleSystem();
 
43
        ~eParticleSystem();
 
44
 
 
45
        // нужно удалить
 
46
        bool            NeedDestroy;
 
47
 
 
48
        // обновить все частицы в этой системе, по времени
 
49
        bool Update(float Time);
 
50
        // прорисовка всех частиц
 
51
        void Draw(eTexture **CurrentTexture);
 
52
        // базовая текстура частиц
 
53
        eTexture        *Texture[5];
 
54
        int                     TextureQuantity;
 
55
        // последовательность прорисовки
 
56
        float           *tmpDATA;
 
57
 
 
58
        // тип смешивания
 
59
        int                     BlendType;
 
60
 
 
61
        // начальный установки, или установки где пред. и текушее положения равны
 
62
        void            SetStartLocation(VECTOR3D NewLocation);
 
63
        // передвинуть все частици на указаное значение
 
64
        void            MoveSystem(VECTOR3D NewLocation);
 
65
        // сдвинуть только центр системы
 
66
        void            MoveSystemLocation(VECTOR3D NewLocation);
 
67
        // развернуть направление системы
 
68
        void            RotateSystemByAngle(VECTOR3D NewDirection);
 
69
        void            RotateSystemAndParticlesByAngle(VECTOR3D NewAngle);
 
70
        // разворот только частиц
 
71
        void            RotateParticlesByAngle(VECTOR3D NewAngle);
 
72
 
 
73
        // остановить все частицы в системе
 
74
        void            StopAllParticles();
 
75
 
 
76
        // поставить правильный полет частиц, т.е. учет внешней скорости
 
77
        void            ChangeSpeed(VECTOR3D Vel);
 
78
 
 
79
 
 
80
        // текущее направление системы (используется для создания частиц+некоторые вариации)
 
81
        VECTOR3D                Direction;
 
82
        // угол поворота системы
 
83
        VECTOR3D                Angle;
 
84
 
 
85
 
 
86
        // кол-во создаваемых частиц в секунду
 
87
        int             ParticlesPerSec;
 
88
        // кол-во частиц активных в настоящий момент
 
89
        int             ParticlesAlive;
 
90
        // сколько создавать
 
91
        int ParticlesCreated;
 
92
 
 
93
        // если нужно замедлять и остановить
 
94
        bool    NeedStop;
 
95
 
 
96
        // размер частиц в мировых координатах
 
97
        float SizeStart;
 
98
        float SizeVar;
 
99
        float SizeEnd;
 
100
 
 
101
        // Прозрачность частиц. Alpha 0 = невидем, Alpha 1 = видемость 100%
 
102
        float AlphaStart;
 
103
        float AlphaVar;
 
104
        float AlphaEnd;
 
105
        bool  AlphaShowHide; // если нужно сначало ув. потом ум.
 
106
 
 
107
        // Цвет частиц при старте и завершении
 
108
        // линейно интерполируется
 
109
        COLORVALUE3D    ColorStart;
 
110
        COLORVALUE3D    ColorVar;
 
111
        COLORVALUE3D    ColorEnd;
 
112
 
 
113
        // Скалярная скорость, с вектором направления получаем вектор движения
 
114
        float Speed;
 
115
        float SpeedVar;
 
116
        // Скорость при создании, сохраняем, если будут менять скорость в процессе
 
117
        float SpeedOnCreation;
 
118
 
 
119
 
 
120
        // тип создания... 0-точка, 1-куб, 2-сфера
 
121
        int                     CreationType;
 
122
        VECTOR3D        CreationSize;
 
123
 
 
124
 
 
125
        // если нужно - корректировка размера частицы при создании относительно камеры
 
126
        // мертвая зона (радиус, где вообще не рисуем)
 
127
        float   DeadZone;
 
128
        // коэффициент уменьшения от расстояния (чем ближе к камере - тем меньше)
 
129
        float   Resize; // если 0, то у самой камеры будет нулевой, у крайней точки системы - Size
 
130
 
 
131
 
 
132
        // жизнь частицы в секундах
 
133
        float Life;
 
134
        float LifeVar;
 
135
 
 
136
        // показывает, насколько отличным будет выбор направления у создаваемой частицы
 
137
        // с направлением системы
 
138
        float Theta;
 
139
 
 
140
        // система притягивает частицы или нет
 
141
        bool IsAttractive;
 
142
        float AttractiveValue;
 
143
 
 
144
        // можем ли мы создавать частицы или нет
 
145
        bool IsSuppressed;
 
146
        bool DestroyIfNoParticles;
 
147
 
 
148
        // возраст системы в секундах
 
149
        float Age;
 
150
 
 
151
        // последнее время обновления системы
 
152
        float TimeLastUpdate;
 
153
 
 
154
        // остаток создания частицы (если к примеру 0.5 частиц в секунду стоит)
 
155
        float EmissionResidue;
 
156
 
 
157
        // для проверки вхождения в видимую область
 
158
        VECTOR3D AABB[8];
 
159
 
 
160
 
 
161
        // подвязка к динамическому массиву
 
162
        eParticle * Start;
 
163
        eParticle * End;
 
164
        void Attach(eParticle * NewParticle);
 
165
        void Detach(eParticle * OldParticle);
 
166
        // указатели на цепь систем, для менеджера
 
167
        eParticleSystem *Next;
 
168
        eParticleSystem *Prev;
 
169
 
 
170
 
 
171
        // источник света, если он нужен
 
172
        eLight *Light;
 
173
        bool LightNeedDeviation;
 
174
        float LightDeviation;
 
175
        float NextLightDeviation;
 
176
        float LightDeviationSpeed;
 
177
 
 
178
        // доступ к private данным
 
179
        void GetLocation(VECTOR3D *Vec){*Vec = Location;};
 
180
 
 
181
private:
 
182
 
 
183
 
 
184
        // последнее положение системы (для интерполяции)
 
185
        VECTOR3D                PrevLocation;
 
186
        // текущее положение частиц в пространстве
 
187
        VECTOR3D                Location;
 
188
 
 
189
        // матрицы поворота, для оптимизации просчетов
 
190
        float   CurrentRotationMat[9];
 
191
        float   OldInvRotationMat[9];
 
192
};
 
193
 
 
194
 
 
195
 
 
196
 
 
197
 
 
198
 
 
199
 
 
200
//-----------------------------------------------------------------------------
 
201
// Менеджер CParticleSystem
 
202
//-----------------------------------------------------------------------------
 
203
 
 
204
// Инициализация менеджера частиц
 
205
void    vw_InitParticleSystems(bool UseGLSL, float Quality);
 
206
// Включаем в список
 
207
void    vw_AttachParticleSystem(eParticleSystem * NewParticleSystem);
 
208
// Исключаем из списка
 
209
void    vw_DetachParticleSystem(eParticleSystem * OldParticleSystem);
 
210
// Удаляем все объекты в списке
 
211
void    vw_ReleaseAllParticleSystems();
 
212
// Прорисовываем все системы
 
213
void    vw_DrawAllParticleSystems();
 
214
//      Прорисовываем блок ParticleSystems
 
215
void    vw_DrawParticleSystems(eParticleSystem **DrawParticleSystem, int Quantity);
 
216
// Проверяем все объекты, обновляем данные
 
217
void    vw_UpdateAllParticleSystems(float Time);
 
218
 
 
219
 
 
220
 
 
221
 
 
222
#endif //PARTICLESYSTEM_H