-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathParticleEmitter.cpp
More file actions
102 lines (90 loc) · 2.72 KB
/
ParticleEmitter.cpp
File metadata and controls
102 lines (90 loc) · 2.72 KB
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
#include <time.h>
#include "ParticleEmitter.h"
#include <iostream>
ParticleEmitter::ParticleEmitter(int numParticles) : numParticles(numParticles)
{
particles = std::vector<Particle>(numParticles, Particle());
for (auto &particle : particles) {
particle.position = Vector3{ nd(el), 2 * nd(el), nd(el) }.normalize() * 0.2 * spreadScale;
particle.velocity = Vector3{ nd(el) / 2, 10, nd(el) } * pow(10.0, -2.0) * velocityScale;
particle.acceleration = Vector3{ 0.0, -2.0, 0.0 } * pow(10.0, -5.0);
particle.lifespan = lifetime;
}
}
ParticleEmitter::~ParticleEmitter()
{
}
void ParticleEmitter::render(Matrix4 matrix)
{
update();
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glDepthMask(GL_FALSE);
glDisable(GL_CULL_FACE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glBindTexture(GL_TEXTURE_2D, textureId);
glLoadMatrixd((matrix * transform).glMatrix());
glBegin(GL_QUADS);
for (auto &particle : particles) {
if (particle.alive) {
Vector3 position = particle.acceleration * particle.age * particle.age + particle.velocity * particle.age + particle.position;
// front/back
glTexCoord2d(0.0, 0.0);
glVertex3d(position.x - particleRadius, position.y - particleRadius, position.z);
glTexCoord2d(1.0, 0.0);
glVertex3d(position.x + particleRadius, position.y - particleRadius, position.z);
glTexCoord2d(1.0, 1.0);
glVertex3d(position.x + particleRadius, position.y + particleRadius, position.z);
glTexCoord2d(0.0, 1.0);
glVertex3d(position.x - particleRadius, position.y + particleRadius, position.z);
// sides
glTexCoord2d(0.0, 0.0);
glVertex3d(position.x, position.y - particleRadius, position.z + particleRadius);
glTexCoord2d(1.0, 0.0);
glVertex3d(position.x, position.y - particleRadius, position.z - particleRadius);
glTexCoord2d(1.0, 1.0);
glVertex3d(position.x, position.y + particleRadius, position.z - particleRadius);
glTexCoord2d(0.0, 1.0);
glVertex3d(position.x, position.y + particleRadius, position.z + particleRadius);
}
}
glEnd();
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);
glEnable(GL_CULL_FACE);
}
void ParticleEmitter::update()
{
int time = glutGet(GLUT_ELAPSED_TIME);
double timeElapsed = (time - lastEmitTime) / 1000.0;
int test = 1 * 0.5;
int numToEmit = emitRate * timeElapsed;
if (numToEmit > 0) {
lastEmitTime = time;
}
if (!enabled) {
numToEmit = 0;
}
for (auto &particle : particles) {
if (!particle.alive) {
if (numToEmit > 0) {
particle.age = 0;
particle.alive = true;
--numToEmit;
}
} else {
++particle.age;
if (particle.age > particle.lifespan) {
particle.alive = false;
}
}
}
}
void ParticleEmitter::reset()
{
for (auto &particle : particles) {
particle.alive = false;
particle.age = 0;
}
}