#include "objects/projectiles.hpp" #include "terrain.hpp" void projectiles::initialize() { N = 0; projectiles_prop.resize(N); mesh.initialize_data_on_gpu(mesh_primitive_sphere(0.1f)); fire_animation = image_load_file("assets/fireframes.png"); fire_grid = image_split_grid(fire_animation, 4, 3); cgp::mesh sphere_mesh = mesh_primitive_sphere(0.2); fireball.initialize_data_on_gpu(sphere_mesh); fireball.texture.initialize_texture_2d_on_gpu(fire_grid[2]); fireball.texture.update_wrap(GL_REPEAT, GL_REPEAT); water_animation = image_load_file("assets/water.png"); water_grid = image_split_grid(water_animation, 3, 2); waterball.initialize_data_on_gpu(sphere_mesh); waterball.texture.initialize_texture_2d_on_gpu(water_grid[2]); waterball.texture.update_wrap(GL_REPEAT, GL_REPEAT); ice_animation = image_load_file("assets/spriteice.png"); ice_grid = image_split_grid(ice_animation, 4, 4); iceball.initialize_data_on_gpu(sphere_mesh); iceball.texture.initialize_texture_2d_on_gpu(ice_grid[2]); iceball.texture.update_wrap(GL_REPEAT, GL_REPEAT); electro_animation = image_load_file("assets/electroball2.png"); electro_grid = image_split_grid(electro_animation, 1, 1); electroball.initialize_data_on_gpu(sphere_mesh); electroball.texture.initialize_texture_2d_on_gpu(electro_grid[0]); electroball.texture.update_wrap(GL_REPEAT, GL_REPEAT); rock_animation = image_load_file("assets/rock_debris.png"); rock_grid = image_split_grid(rock_animation, 1, 1); rockball.initialize_data_on_gpu(sphere_mesh); rockball.texture.initialize_texture_2d_on_gpu(rock_grid[0]); rockball.texture.update_wrap(GL_REPEAT, GL_REPEAT); } void projectiles::reset() { N = 0; projectiles_prop.resize(N); } void projectiles::add_ball(vec3 new_pos, vec3 new_dir, int element) { N++; projectiles_prop.resize(N); projectiles_prop[N - 1].is_active = true; projectiles_prop[N - 1].pos = new_pos; projectiles_prop[N - 1].v = new_dir; projectiles_prop[N - 1].elemental_type = el_types[element]; if (projectiles_prop[N - 1].elemental_type == projectile::projectile_type::fire) { projectiles_prop[N - 1].color = {0.886, 0.345, 0.133}; }else if (projectiles_prop[N - 1].elemental_type == projectile::projectile_type::ice) { projectiles_prop[N - 1].color = {1,1,1}; }else if (projectiles_prop[N - 1].elemental_type == projectile::projectile_type::rock) { projectiles_prop[N - 1].color = {0.3,0.22,0.2}; }else if (projectiles_prop[N - 1].elemental_type == projectile::projectile_type::electric) { projectiles_prop[N - 1].color = {1, 1, 0.2 }; }else if (projectiles_prop[N - 1].elemental_type == projectile::projectile_type::water) { projectiles_prop[N - 1].color = {0, 0, 1 }; } } void projectiles::simulate(float dt) { for (int i = 0; i < N; i++) { projectiles_prop[i].simulateStraightLine(dt); } for (int i = N-1; i >= 0; i--) { if (!projectiles_prop[i].is_active) remove_ball(i); } } void projectiles::remove_ball(int i) { if (N == 1) reset(); else { projectiles_prop[i] = projectiles_prop[N - 1]; N--; } }