|
|
@@ -36,19 +36,19 @@ int main(int argc, char *argv[]){
|
|
|
Canvas canvas;
|
|
|
|
|
|
config = {
|
|
|
- .map_width=800,
|
|
|
- .map_height=600,
|
|
|
+ .map_width=1500,
|
|
|
+ .map_height=1200,
|
|
|
|
|
|
- .population=100,
|
|
|
+ .population=5000000,
|
|
|
|
|
|
.increase=10.0f,
|
|
|
- .decay=5.0f,
|
|
|
- .diffusion=2.0f,
|
|
|
+ .decay=0.5f,
|
|
|
+ .diffusion=5.0f,
|
|
|
|
|
|
- .speed=0.5f,
|
|
|
- .steering=90.0f * deg_to_rad,
|
|
|
- .sensing_distance=1.0f,
|
|
|
- .sensing_angle=60.0f * deg_to_rad,
|
|
|
+ .speed=60.0f,
|
|
|
+ .steering=180.0f * deg_to_rad,
|
|
|
+ .sensing_distance=3.0f,
|
|
|
+ .sensing_angle=45.0f * deg_to_rad,
|
|
|
};
|
|
|
float average_population = (float)config.population / (float)(config.map_width * config.map_height);
|
|
|
float average_pheromone = (float)config.increase * average_population;
|
|
|
@@ -57,28 +57,23 @@ int main(int argc, char *argv[]){
|
|
|
|
|
|
app = Application(config.map_width, config.map_height);
|
|
|
app.init();
|
|
|
- app.createWindow();
|
|
|
+ app.create_window();
|
|
|
|
|
|
/* Load and compile particles update shader */
|
|
|
cs_particles_update.load("./shaders/particles_update.glsl");
|
|
|
cs_particles_update.compile();
|
|
|
- particle_uniform(config, cs_particles_update);
|
|
|
|
|
|
/* Load and compile map update shader */
|
|
|
cs_map_update.load("./shaders/map_update.glsl");
|
|
|
cs_map_update.compile();
|
|
|
- map_update_uniform(config, cs_map_update);
|
|
|
|
|
|
/* Load and compile map reset shader */
|
|
|
cs_map_reset.load("./shaders/map_reset.glsl");
|
|
|
cs_map_reset.compile();
|
|
|
- map_reset_uniform(config, cs_map_reset);
|
|
|
|
|
|
/* Load and compile draw shader */
|
|
|
cs_draw.load("./shaders/draw.glsl");
|
|
|
cs_draw.compile();
|
|
|
- cs_draw.set_uniform("map_width", config.map_width);
|
|
|
- cs_draw.set_uniform("map_height", config.map_height);
|
|
|
|
|
|
/* Particles init */
|
|
|
std::vector<Particle> particles(config.population);
|
|
|
@@ -90,11 +85,6 @@ int main(int argc, char *argv[]){
|
|
|
particle.dir_x = cosf(angle);
|
|
|
particle.dir_y = sinf(angle);
|
|
|
}
|
|
|
- particles[0].pos_x = 0.5;
|
|
|
- particles[0].pos_y = 0.5;
|
|
|
- particles[0].dir_x = 1;
|
|
|
- particles[0].dir_y = 0;
|
|
|
- printf("Bob %f, %f\n", particles[0].pos_x, particles[0].pos_y);
|
|
|
|
|
|
/* Create and fill particles buffer */
|
|
|
particles_buffer.create();
|
|
|
@@ -132,12 +122,22 @@ int main(int argc, char *argv[]){
|
|
|
/* Main loop */
|
|
|
float pervious_time;
|
|
|
float current_time = app.time();
|
|
|
+ int key_previous_status;
|
|
|
+ int key_current_status = GLFW_RELEASE;
|
|
|
while(app.running()){
|
|
|
pervious_time = current_time;
|
|
|
current_time = app.time();
|
|
|
|
|
|
float dt = current_time - pervious_time;
|
|
|
- // printf("[% 6f]\n", dt * 1000);
|
|
|
+
|
|
|
+ /* Update uniforms */
|
|
|
+ particle_uniform(config, cs_particles_update);
|
|
|
+ map_update_uniform(config, cs_map_update);
|
|
|
+ map_reset_uniform(config, cs_map_reset);
|
|
|
+ cs_draw.set_uniform("map_width", config.map_width);
|
|
|
+ cs_draw.set_uniform("map_height", config.map_height);
|
|
|
+ cs_draw.set_uniform("display_population_value", average_population);
|
|
|
+ cs_draw.set_uniform("display_pheromone_value", average_pheromone);
|
|
|
|
|
|
/* Update particles */
|
|
|
cs_particles_update.set_uniform("dt", dt);
|
|
|
@@ -162,16 +162,25 @@ int main(int argc, char *argv[]){
|
|
|
canvas.bind();
|
|
|
cs_draw.execute(config.map_width, config.map_height, 16, 16);
|
|
|
ComputeShader::wait();
|
|
|
- cs_draw.set_uniform("display_population_value", 10*average_population);
|
|
|
- cs_draw.set_uniform("display_pheromone_value", 1000*average_pheromone);
|
|
|
canvas.draw();
|
|
|
|
|
|
- app.update();
|
|
|
-
|
|
|
/* Reset map */
|
|
|
- cs_map_reset.execute(config.population, 256);
|
|
|
+ cs_map_reset.execute(config.map_width * config.map_height, 256);
|
|
|
ComputeShader::wait();
|
|
|
|
|
|
+ /* Display, move on */
|
|
|
+ app.update();
|
|
|
+
|
|
|
+ key_previous_status = key_current_status;
|
|
|
+ key_current_status = app.key_status(GLFW_KEY_R);
|
|
|
+ if(key_current_status != key_previous_status
|
|
|
+ && key_current_status == GLFW_RELEASE){
|
|
|
+ printf("Reloading draw Shader\n");
|
|
|
+ cs_draw.load("./shaders/draw.glsl");
|
|
|
+ cs_draw.compile();
|
|
|
+ particles_buffer.bind_base(cs_draw.get_program(), "particles_buffer", 1);
|
|
|
+ map_buffer.bind_base(cs_draw.get_program(), "map_buffer", 2);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
cs_particles_update.release();
|