Skip to content
Snippets Groups Projects
projectiles.cpp 2.97 KiB
#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++) {