Skip to content
Snippets Groups Projects
projectile.cpp 1.51 KiB
Newer Older
#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 };
		}
	}
}