AireEngine
A 3D Open-World Game Engine
Loading...
Searching...
No Matches
Particle.h
1#pragma once
2#include"../res-management/texManager.h"
3#include"../res-management/meshManager.h"
4#include"../res-management/terrain.h"
5#include"shaderProgram.h"
6#include"camera.h"
7
8#include <random>
9
10namespace Aire {
11
12 enum GeneratorType
13 {
14 NORMAL,
15 RECTANGLE
16 };
17
19 enum RectangleType
20 {
21 XY_PLANE,
22 XZ_PLANE,
23 YZ_PLANE
24 };
25
27 struct Rectangle
28 {
29 glm::vec3 leftTop;
30 glm::vec3 leftBottom;
31 glm::vec3 rightBottom;
32 glm::vec3 rightTop;
33
34 glm::vec3 getNormal()
35 {
36 glm::vec3 v1 = leftTop - leftBottom;
37 glm::vec3 v2 = leftTop - rightTop;
38 return glm::cross(v1, v2);
39 }
40
41 Rectangle():leftTop(0.0f),leftBottom(0.0f),rightBottom(0.0f),rightTop(0.0f){}
42
49 Rectangle(float width, float length, float height, RectangleType type, glm::vec2 initialPosition = glm::vec2(0.0f))
50 {
51 if (type == XY_PLANE)
52 {
53 leftBottom = glm::vec3(initialPosition.x - width / 2.0f, initialPosition.y - length / 2.0f,height);
54 leftTop = glm::vec3(initialPosition.x - width / 2.0f, initialPosition.y + length / 2.0f, height);
55 rightTop = glm::vec3(initialPosition.x + width / 2.0f, initialPosition.y + length / 2.0f, height);
56 rightBottom = glm::vec3(initialPosition.x + width / 2.0f, initialPosition.y - length / 2.0f, height);
57 }
58 else if (type == XZ_PLANE)
59 {
60 leftBottom = glm::vec3(initialPosition.x - width / 2.0f, height, initialPosition.y - length / 2.0f);
61 leftTop = glm::vec3(initialPosition.x - width / 2.0f, height, initialPosition.y + length / 2.0f);
62 rightTop = glm::vec3(initialPosition.x + width / 2.0f, height, initialPosition.y + length / 2.0f);
63 rightBottom = glm::vec3(initialPosition.x + width / 2.0f, height, initialPosition.y - length / 2.0f);
64 }
65 else if (type == YZ_PLANE)
66 {
67 leftBottom = glm::vec3(height, initialPosition.x - width / 2.0f, initialPosition.y - length / 2.0f);
68 leftTop = glm::vec3(height, initialPosition.x - width / 2.0f, initialPosition.y + length / 2.0f);
69 rightTop = glm::vec3(height, initialPosition.x + width / 2.0f, initialPosition.y + length / 2.0f);
70 rightBottom = glm::vec3(height, initialPosition.x + width / 2.0f, initialPosition.y - length / 2.0f);
71 }
72 }
73 };
74
76 struct Particle {
77 glm::vec3 Velocity;
78 Model* model;
79 glm::vec3 position;
80 float Life;
81 bool isEmitted;
82 Rigidbody* rigidbody = nullptr;
83 Particle(Model* m) : Velocity(0.1f), model(m), position(glm::vec3()), Life(10.0f),isEmitted(false) { }
84 Particle(Model* m, glm::vec3 position, glm::vec3 v, float l) : Velocity(v), model(m), position(position), Life(l), isEmitted(false) { }
85
86 void setRigidbody(float radius) {
88 this->rigidbody = rbHandler->createRigidbodyBall(radius, position);
89 }
90 };
91
92
97 {
98 public:
107 ParticleGenerator(std::vector<Model*> models, Terrain* terrain, unsigned int amount, MeshManager& meshManager, const glm::vec3& position,
108 const glm::vec3& direction, float interval);
109
117 ParticleGenerator(std::vector<Model*> models, Terrain* terrain, unsigned int amount, MeshManager& meshManager, Rectangle range, float interval);
118
121 void setSpeed(float speed);
122
123 std::vector<Particle>& getParticles() { return particles; }
124
125 Terrain* getTerrain() { return terrain; }
126
127 std::vector<Model*> models;
128
131 void Update(float dt);
132
136 void renderParticles(ShaderProgram& shader, Camera& playCamera);
137 private:
138
139 std::vector<Particle> particles;
140
141 unsigned int amount;
142
143 Terrain* terrain;
144
145 float interval;
146
147 float countDown = 0.0f;
148
149 MeshManager* meshManager;
150
151 GeneratorType generatorType;
152
153 glm::vec3 position; //< Position of the generator
154
155 glm::vec3 direction;
156
157 float speed = 1.0f;
158
159 Rectangle range;
160
161 std::default_random_engine generatorOne, generatorTwo;
162
163 // Variable to create floats
164 // Since now we only use two components in vec3, just create two variables
165 std::uniform_real_distribution<float> distributionOne;
166 std::uniform_real_distribution<float> distributionTwo;
167
170 void respawnParticle(Particle& particle);
171 };
172}
Definition camera.h:9
Mesh manager. Handles mesh creation, storage, and deletion.
Definition meshManager.h:28
Definition Model.h:30
Definition Particle.h:97
void Update(float dt)
Definition Particle.cpp:65
void renderParticles(ShaderProgram &shader, Camera &playCamera)
Definition Particle.cpp:104
std::vector< Model * > models
Models for the particles.
Definition Particle.h:127
void setSpeed(float speed)
Definition Particle.cpp:138
ParticleGenerator(std::vector< Model * > models, Terrain *terrain, unsigned int amount, MeshManager &meshManager, const glm::vec3 &position, const glm::vec3 &direction, float interval)
Definition Particle.cpp:4
A singleton class used to handle all rigid bodies in the scene.
Definition rigidbodyHandler.h:13
static RigidbodyHandler * getInstance()
Definition rigidbodyHandler.h:30
Rigidbody * createRigidbodyBall(float aRadius, glm::vec3 pos=glm::vec3(0, 0.1, 0), glm::mat3 rot=glm::mat3(1.0))
Definition rigidbodyHandler.cpp:33
Definition rigidbody.h:8
A linked OpenGL program.
Definition shaderProgram.h:16
A class that represents a terrain object.
Definition terrain.h:28
A particle in the world. It can be animated and has a fixed lifetime, after which it disappears.
Definition Particle.h:76
A 2D rectangle in 3D space.
Definition Particle.h:28
Rectangle(float width, float length, float height, RectangleType type, glm::vec2 initialPosition=glm::vec2(0.0f))
Definition Particle.h:49