#include "projectile.hpp" #include "terrain.hpp" void projectile::initialize() { N = 0; pos.resize(N); v.resize(N); color.resize(N); elemental_types.resize(N); mesh.initialize_data_on_gpu(mesh_primitive_sphere(0.1f)); } void projectile::reset() { N = 0; pos.resize(N); v.resize(N); color.resize(N); } void projectile::add_ball(vec3 new_pos, vec3 new_dir) { N++; pos.resize(N); v.resize(N); color.resize(N); elemental_types.resize(N); pos[N-1] = new_pos; v[N-1] = new_dir; elemental_types[N - 1] = types[N%5]; if (elemental_types[N - 1] == projectile_type::fire) { color[N - 1] = {0.886, 0.345, 0.133}; }else if (elemental_types[N - 1] == projectile_type::ice) { color[N - 1] = {1,1,1}; }else if (elemental_types[N - 1] == projectile_type::rock) { color[N - 1] = {0.3,0.22,0.2}; }else if (elemental_types[N - 1] == projectile_type::electric) { color[N - 1] = {1, 1, 0.2 }; }else if (elemental_types[N - 1] == projectile_type::water) { color[N - 1] = {0, 0, 1 }; } } void projectile::simulate(float dt, float terrain_length) { for (int i = 0; i < N; i++) { if (pos[i][2] < -1 || cgp::abs(pos[i][0]) > terrain_length / 2 || cgp::abs(pos[i][1]) > terrain_length / 2) { pos[i] = { 0,0, evaluate_terrain_height(0,0, terrain_length) }; v[i] = { 3 * rand_interval(), 3 * rand_interval(), 4 + i }; } else { pos[i] += v[i] * dt; v[i][2] -= 10 * dt; } if (pos[i][2] < evaluate_terrain_height(pos[i][0], pos[i][1], terrain_length)) { pos[i] = { 0, 0, -1}; v[i] = { 0,0,0 }; } } }