File: ParticleSystem.h

package info (click to toggle)
astromenace 1.3.2%2Brepack-5
  • links: PTS, VCS
  • area: contrib
  • in suites: buster
  • size: 4,484 kB
  • sloc: cpp: 61,665; makefile: 26; sh: 19
file content (222 lines) | stat: -rwxr-xr-x 7,689 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/************************************************************************************

	AstroMenace (Hardcore 3D space shooter with spaceship upgrade possibilities)
	Copyright © 2006-2013 Michael Kurinnoy, Viewizard


	AstroMenace is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	AstroMenace is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with AstroMenace. If not, see <http://www.gnu.org/licenses/>.


	Web Site: http://www.viewizard.com/
	Project: http://sourceforge.net/projects/openastromenace/
	E-mail: viewizard@viewizard.com

*************************************************************************************/


#ifndef PARTICLESYSTEM_H
#define PARTICLESYSTEM_H


#include "Particle.h"
#include "../Light/Light.h"
#include "../Texture/Texture.h"




class eParticleSystem
{
public:
	eParticleSystem();
	~eParticleSystem();

	// нужно удалить
	bool		NeedDestroy;

	// обновить все частицы в этой системе, по времени
	bool Update(float Time);
	// прорисовка всех частиц
	void Draw(eTexture **CurrentTexture);
	// базовая текстура частиц
	eTexture	*Texture[5];
	int			TextureQuantity;
	// последовательность прорисовки
	float 		*tmpDATA;

	// тип смешивания
	int			BlendType;

	// начальный установки, или установки где пред. и текушее положения равны
	void		SetStartLocation(VECTOR3D NewLocation);
	// передвинуть все частици на указаное значение
	void		MoveSystem(VECTOR3D NewLocation);
	// сдвинуть только центр системы
	void		MoveSystemLocation(VECTOR3D NewLocation);
	// развернуть направление системы
	void		RotateSystemByAngle(VECTOR3D NewDirection);
	void		RotateSystemAndParticlesByAngle(VECTOR3D NewAngle);
	// разворот только частиц
	void		RotateParticlesByAngle(VECTOR3D NewAngle);

	// остановить все частицы в системе
	void		StopAllParticles();

	// поставить правильный полет частиц, т.е. учет внешней скорости
	void		ChangeSpeed(VECTOR3D Vel);


	// текущее направление системы (используется для создания частиц+некоторые вариации)
	VECTOR3D		Direction;
	// угол поворота системы
	VECTOR3D		Angle;


	// кол-во создаваемых частиц в секунду
	int		ParticlesPerSec;
	// кол-во частиц активных в настоящий момент
	int		ParticlesAlive;
	// сколько создавать
	int ParticlesCreated;

	// если нужно замедлять и остановить
	bool	NeedStop;

	// размер частиц в мировых координатах
	float SizeStart;
	float SizeVar;
	float SizeEnd;

	// Прозрачность частиц. Alpha 0 = невидем, Alpha 1 = видемость 100%
	float AlphaStart;
	float AlphaVar;
	float AlphaEnd;
	bool  AlphaShowHide; // если нужно сначало ув. потом ум.

	// Цвет частиц при старте и завершении
	// линейно интерполируется
	COLORVALUE3D	ColorStart;
	COLORVALUE3D	ColorVar;
	COLORVALUE3D	ColorEnd;

	// Скалярная скорость, с вектором направления получаем вектор движения
	float Speed;
	float SpeedVar;
	// Скорость при создании, сохраняем, если будут менять скорость в процессе
	float SpeedOnCreation;


	// тип создания... 0-точка, 1-куб, 2-сфера
	int			CreationType;
	VECTOR3D	CreationSize;


	// если нужно - корректировка размера частицы при создании относительно камеры
	// мертвая зона (радиус, где вообще не рисуем)
	float	DeadZone;
	// коэффициент уменьшения от расстояния (чем ближе к камере - тем меньше)
	float	Resize; // если 0, то у самой камеры будет нулевой, у крайней точки системы - Size


	// жизнь частицы в секундах
	float Life;
	float LifeVar;

	// показывает, насколько отличным будет выбор направления у создаваемой частицы
	// с направлением системы
	float Theta;

	// система притягивает частицы или нет
	bool IsAttractive;
	float AttractiveValue;

	// можем ли мы создавать частицы или нет
	bool IsSuppressed;
	bool DestroyIfNoParticles;

	// возраст системы в секундах
	float Age;

	// последнее время обновления системы
	float TimeLastUpdate;

	// остаток создания частицы (если к примеру 0.5 частиц в секунду стоит)
	float EmissionResidue;

	// для проверки вхождения в видимую область
	VECTOR3D AABB[8];


	// подвязка к динамическому массиву
	eParticle * Start;
	eParticle * End;
	void Attach(eParticle * NewParticle);
	void Detach(eParticle * OldParticle);
	// указатели на цепь систем, для менеджера
	eParticleSystem *Next;
	eParticleSystem *Prev;


	// источник света, если он нужен
	eLight *Light;
	bool LightNeedDeviation;
	float LightDeviation;
	float NextLightDeviation;
	float LightDeviationSpeed;

	// доступ к private данным
	void GetLocation(VECTOR3D *Vec){*Vec = Location;};

private:


	// последнее положение системы (для интерполяции)
	VECTOR3D		PrevLocation;
	// текущее положение частиц в пространстве
	VECTOR3D		Location;

	// матрицы поворота, для оптимизации просчетов
	float	CurrentRotationMat[9];
	float	OldInvRotationMat[9];
};







//-----------------------------------------------------------------------------
// Менеджер CParticleSystem
//-----------------------------------------------------------------------------

// Инициализация менеджера частиц
void	vw_InitParticleSystems(bool UseGLSL, float Quality);
// Включаем в список
void	vw_AttachParticleSystem(eParticleSystem * NewParticleSystem);
// Исключаем из списка
void	vw_DetachParticleSystem(eParticleSystem * OldParticleSystem);
// Удаляем все объекты в списке
void	vw_ReleaseAllParticleSystems();
// Прорисовываем все системы
void	vw_DrawAllParticleSystems();
//	Прорисовываем блок ParticleSystems
void	vw_DrawParticleSystems(eParticleSystem **DrawParticleSystem, int Quantity);
// Проверяем все объекты, обновляем данные
void	vw_UpdateAllParticleSystems(float Time);




#endif //PARTICLESYSTEM_H