generated from AfonsoCMSousa/CPP-OpenGLTemplate
feat: added multithreading
This commit is contained in:
+85
-5
@@ -1,7 +1,10 @@
|
||||
#ifndef PARTICLE_H
|
||||
#define PARTICLE_H
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdatomic.h>
|
||||
|
||||
#define G_CONSTANT 0.207f
|
||||
|
||||
@@ -18,9 +21,25 @@ typedef struct {
|
||||
Vec3 velocity;
|
||||
Color color;
|
||||
|
||||
float dampening;
|
||||
float life;
|
||||
float size;
|
||||
} Particle;
|
||||
|
||||
typedef struct {
|
||||
Particle *particle;
|
||||
unsigned long long thread_id;
|
||||
unsigned long long interval_start;
|
||||
unsigned long long interval_end;
|
||||
int alive_count;
|
||||
float time;
|
||||
|
||||
pthread_mutex_t *mutex;
|
||||
pthread_cond_t *cond;
|
||||
int *barrier;
|
||||
atomic_int exit;
|
||||
} Physics_params;
|
||||
|
||||
// INFO: This adds adder to out, basicaly out + adder
|
||||
void vec_add(Vec3 &out, Vec3 adder) {
|
||||
out.x += adder.x;
|
||||
@@ -35,6 +54,7 @@ Particle particle_init(Vec3 position, Color color) {
|
||||
p.velocity = {0.0f, 0.0f, 0.0f};
|
||||
|
||||
p.life = 10;
|
||||
p.dampening = 0.97f;
|
||||
return p;
|
||||
}
|
||||
|
||||
@@ -43,19 +63,24 @@ int particle_update(Particle *particles, unsigned long long size, float time) {
|
||||
for (unsigned long long i = 0; i < size; i++) {
|
||||
Particle p = particles[i];
|
||||
if (p.life == 0) {
|
||||
particles[i].position = {0.0f, 0.0f, 0.0f}; // Start at center
|
||||
particles[i].velocity = {(rand() % 100 - 50) / 50.0f, 5.0f, 0.0f}; // Random spray up
|
||||
particles[i].life = 2.0f; // Give it 2 seconds of life
|
||||
continue;
|
||||
}
|
||||
|
||||
p.velocity.y -= (G_CONSTANT * time);
|
||||
// p.velocity.y -= (G_CONSTANT * time);
|
||||
|
||||
p.position.x += p.velocity.x * time;
|
||||
p.position.y += p.velocity.y * time;
|
||||
p.position.z += p.velocity.z * time;
|
||||
|
||||
if (p.life > 0) p.life -= time;
|
||||
if (p.position.y <= 0) {
|
||||
p.position.y = 0;
|
||||
p.velocity.y *= (-1 * p.dampening);
|
||||
}
|
||||
|
||||
if (p.life > 0)
|
||||
p.life -= time;
|
||||
if (p.life < 0 && p.life >= -1.0f)
|
||||
p.life = 0;
|
||||
|
||||
particles[i] = p;
|
||||
alive_count++;
|
||||
@@ -64,4 +89,59 @@ int particle_update(Particle *particles, unsigned long long size, float time) {
|
||||
return alive_count;
|
||||
}
|
||||
|
||||
void *t_update(void *args) {
|
||||
Physics_params *params = (Physics_params *)args;
|
||||
while (params->exit != 1) {
|
||||
pthread_mutex_lock(params->mutex);
|
||||
if (params->(missing) == 0) {
|
||||
sleep(100);
|
||||
}
|
||||
pthread_mutex_unlock(params->mutex);
|
||||
|
||||
params->alive_count = 0;
|
||||
for (unsigned long long i = params->interval_start; i < params->interval_end; i++) {
|
||||
Particle p = params->particle[i];
|
||||
|
||||
if (p.life == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
p.velocity.y -= (G_CONSTANT * params->time);
|
||||
|
||||
p.position.x += p.velocity.x * params->time;
|
||||
p.position.y += p.velocity.y * params->time;
|
||||
p.position.z += p.velocity.z * params->time;
|
||||
|
||||
if (p.position.y <= 0) {
|
||||
p.position.y = 0;
|
||||
p.velocity.y *= (-1 * p.dampening);
|
||||
}
|
||||
|
||||
if (p.life > 0)
|
||||
p.life -= params->time;
|
||||
if (p.life < 0 && p.life >= -1.0f)
|
||||
p.life = 0;
|
||||
|
||||
// DEBUG
|
||||
if (params->thread_id == 0) {
|
||||
p.color = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||
} else if (params->thread_id == 1) {
|
||||
p.color = {1.0f, 0.0f, 0.0f, 1.0f};
|
||||
} else if (params->thread_id == 2) {
|
||||
p.color = {0.0f, 1.0f, 0.0f, 1.0f};
|
||||
} else if (params->thread_id == 3) {
|
||||
p.color = {0.0f, 0.0f, 1.0f, 1.0f};
|
||||
} else {
|
||||
p.color = {0.7f, 0.7f, 0.7f, 1.0f};
|
||||
;
|
||||
}
|
||||
|
||||
params->particle[i] = p;
|
||||
params->alive_count++;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif // PARTICLE_H
|
||||
|
||||
Reference in New Issue
Block a user