|
|
@@ -1,8 +1,10 @@
|
|
|
#version 430 core
|
|
|
|
|
|
struct particle_t {
|
|
|
- vec2 pos;
|
|
|
- vec2 dir;
|
|
|
+ float pos_x;
|
|
|
+ float pos_y;
|
|
|
+ float dir_x;
|
|
|
+ float dir_y;
|
|
|
};
|
|
|
|
|
|
struct cell_t {
|
|
|
@@ -61,24 +63,30 @@ void main(){
|
|
|
|
|
|
// Update particle position
|
|
|
particle_t p = particles[particle_id];
|
|
|
- particles[particle_id].pos = wrap_coord(p.pos + dt * speed * p.dir);
|
|
|
+ vec2 pos = vec2(p.pos_x, p.pos_y);
|
|
|
+ vec2 dir = vec2(p.dir_x, p.dir_y);
|
|
|
+ pos = wrap_coord(pos + dt * speed * dir);
|
|
|
+ particles[particle_id].pos_x = pos.x;
|
|
|
+ particles[particle_id].pos_y = pos.y;
|
|
|
|
|
|
// Count particle
|
|
|
- uint p_cell_id = cell_id(p.pos);
|
|
|
+ uint p_cell_id = cell_id(pos);
|
|
|
atomicAdd(map[p_cell_id].population, 1);
|
|
|
|
|
|
// Sense and turn
|
|
|
- vec2 look_ahead = wrap_coord(ahead(p.pos, p.dir, sensing_distance));
|
|
|
- vec2 look_left = wrap_coord(ahead(p.pos, rotate(p.dir, sensing_angle), sensing_distance));
|
|
|
- vec2 look_right = wrap_coord(ahead(p.pos, rotate(p.dir, -sensing_angle), sensing_distance));
|
|
|
+ vec2 look_ahead = wrap_coord(ahead(pos, dir, sensing_distance));
|
|
|
+ vec2 look_left = wrap_coord(ahead(pos, rotate(dir, sensing_angle), sensing_distance));
|
|
|
+ vec2 look_right = wrap_coord(ahead(pos, rotate(dir, -sensing_angle), sensing_distance));
|
|
|
|
|
|
float pheromone_ahead = map[cell_id(look_ahead)].pheromone;
|
|
|
float pheromone_left = map[cell_id(look_left )].pheromone;
|
|
|
float pheromone_right = map[cell_id(look_right)].pheromone;
|
|
|
|
|
|
if(pheromone_left > pheromone_ahead && pheromone_left > pheromone_right){
|
|
|
- particles[particle_id].dir = rotate(p.dir, steering * dt);
|
|
|
+ dir = rotate(dir, steering * dt);
|
|
|
}else if(pheromone_right > pheromone_ahead && pheromone_right > pheromone_left){
|
|
|
- particles[particle_id].dir = rotate(p.dir, -steering * dt);
|
|
|
+ dir = rotate(dir, -steering * dt);
|
|
|
}
|
|
|
+ particles[particle_id].dir_x = dir.x;
|
|
|
+ particles[particle_id].dir_y = dir.y;
|
|
|
}
|