From fa7b5bab43367de21c2e0bd9176d2fff5e47183c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?No=C3=A9?= <noe.artru@polytechnique.org>
Date: Thu, 4 May 2023 15:03:48 +0200
Subject: [PATCH] Files for new projectile structure

---
 .../scenes_inf443/base/src/projectile.cpp     | 67 +++++++++++++++++++
 .../scenes_inf443/base/src/projectile.hpp     | 26 +++++++
 2 files changed, 93 insertions(+)
 create mode 100644 projet-code/scenes_inf443/base/src/projectile.cpp
 create mode 100644 projet-code/scenes_inf443/base/src/projectile.hpp

diff --git a/projet-code/scenes_inf443/base/src/projectile.cpp b/projet-code/scenes_inf443/base/src/projectile.cpp
new file mode 100644
index 0000000..cdb6ced
--- /dev/null
+++ b/projet-code/scenes_inf443/base/src/projectile.cpp
@@ -0,0 +1,67 @@
+#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 };
+		}
+	}
+}
+
diff --git a/projet-code/scenes_inf443/base/src/projectile.hpp b/projet-code/scenes_inf443/base/src/projectile.hpp
new file mode 100644
index 0000000..dea718e
--- /dev/null
+++ b/projet-code/scenes_inf443/base/src/projectile.hpp
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "cgp/cgp.hpp"
+
+using namespace cgp;
+
+struct projectile {
+	int N;
+
+	std::vector<vec3> v;
+	std::vector<vec3> pos;
+	std::vector<vec3> color;
+	
+
+	mesh_drawable mesh;
+
+	enum class projectile_type {fire, ice, electric, rock, water};
+	std::vector<projectile_type> elemental_types;
+
+	std::vector<projectile_type> types = { projectile_type::fire, projectile_type::ice, projectile_type::rock, projectile_type::electric, projectile_type::water };
+
+	void initialize();
+	void simulate(float dt, float terrain_length);
+	void add_ball(vec3 new_pos, vec3 new_dir);
+	void reset();
+};
-- 
GitLab