From 1630d6a7ce3b5b8ed62e5e0ab4186e892b37ed46 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?No=C3=A9?= <noe.artru@polytechnique.org>
Date: Wed, 3 May 2023 22:02:42 +0200
Subject: [PATCH] Added throwing projectiles (balls), just left click

---
 projet-code/scenes_inf443/base/src/ball.cpp  | 17 +++++++++++++++--
 projet-code/scenes_inf443/base/src/ball.hpp  |  3 ++-
 projet-code/scenes_inf443/base/src/scene.cpp | 18 +++++++++++++++++-
 projet-code/scenes_inf443/base/src/scene.hpp |  2 ++
 4 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/projet-code/scenes_inf443/base/src/ball.cpp b/projet-code/scenes_inf443/base/src/ball.cpp
index 5644ea4..b6fcb67 100644
--- a/projet-code/scenes_inf443/base/src/ball.cpp
+++ b/projet-code/scenes_inf443/base/src/ball.cpp
@@ -1,10 +1,10 @@
 #include "ball.hpp"
 #include "terrain.hpp"
 
-void ball::initialize()
+void ball::initialize(int n)
 {
 
-	N = 10;
+	N = n;
 	pos.resize(N);
 	v.resize(N);
 	color.resize(N);
@@ -18,6 +18,19 @@ void ball::initialize()
 	}
 }
 
+void ball::add_ball(vec3 new_pos, vec3 new_dir) {
+	N++;
+	pos.resize(N);
+	v.resize(N);
+	color.resize(N);
+
+
+	color[N-1] = { rand_interval(0.0f, 1.0f), rand_interval(0.0f, 1.0f), rand_interval(0.0f, 1.0f) };
+	pos[N-1] = new_pos;
+	v[N-1] = new_dir;
+
+}
+
 void ball::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) {
diff --git a/projet-code/scenes_inf443/base/src/ball.hpp b/projet-code/scenes_inf443/base/src/ball.hpp
index 03af3f6..c1fa967 100644
--- a/projet-code/scenes_inf443/base/src/ball.hpp
+++ b/projet-code/scenes_inf443/base/src/ball.hpp
@@ -13,8 +13,9 @@ struct ball {
 
 	mesh_drawable mesh;
 
-	void initialize();
+	void initialize(int n);
 	void simulate(float dt, float terrain_length);
+	void add_ball(vec3 new_pos, vec3 new_dir);
 };
 
 vec3 terrain_orientation(float x, float y, float terrain_length);
diff --git a/projet-code/scenes_inf443/base/src/scene.cpp b/projet-code/scenes_inf443/base/src/scene.cpp
index 382fee9..7278b0f 100644
--- a/projet-code/scenes_inf443/base/src/scene.cpp
+++ b/projet-code/scenes_inf443/base/src/scene.cpp
@@ -93,8 +93,9 @@ void scene_structure::initialize()
 	bird1.initialize_bird();
 	initialize_mvt();
 	chain1.initialize();
-	bouncing.initialize();
+	bouncing.initialize(10); //10 balls
 	bat1.initialize_bat();
+	projectiles.initialize(0);
 }
 
 void scene_structure::initialize_mvt()
@@ -163,6 +164,7 @@ void scene_structure::display_frame()
 	display_chain(p);
 	display_ball();
 	display_bat(p);
+	display_projectiles();
 
 
 	if (gui.display_wireframe)
@@ -353,6 +355,16 @@ void scene_structure::display_ball() {
 	}
 }
 
+void scene_structure::display_projectiles() {
+
+	projectiles.simulate(timer_chain.scale * 0.01f, terrain_length);
+	for (int i = 0; i < projectiles.N; i++) {
+		projectiles.mesh.model.translation = projectiles.pos[i];
+		projectiles.mesh.material.color = projectiles.color[i];
+		draw(projectiles.mesh, environment);
+	}
+}
+
 void scene_structure::mouse_move_event()
 {
 	if (!inputs.keyboard.shift)
@@ -360,6 +372,10 @@ void scene_structure::mouse_move_event()
 }
 void scene_structure::mouse_click_event()
 {
+	if (camera_control.inputs->mouse.click.left){
+		//std::cout << "ball created";
+		projectiles.add_ball(camera_control.camera_model.position_camera + 2*camera_control.camera_model.front(), 20*camera_control.camera_model.front());
+	}
 	camera_control.action_mouse_click(environment.camera_view);
 }
 void scene_structure::keyboard_event()
diff --git a/projet-code/scenes_inf443/base/src/scene.hpp b/projet-code/scenes_inf443/base/src/scene.hpp
index c92a6f7..08c7976 100644
--- a/projet-code/scenes_inf443/base/src/scene.hpp
+++ b/projet-code/scenes_inf443/base/src/scene.hpp
@@ -71,6 +71,7 @@ struct scene_structure : cgp::scene_inputs_generic {
 	bird bird1;
 	chain chain1;
 	bat bat1;
+	ball projectiles;
 
 	// ****************************** //
 	// Functions
@@ -95,6 +96,7 @@ struct scene_structure : cgp::scene_inputs_generic {
 	void draw_segment(vec3 const& a, vec3 const& b);
 
 	void display_ball();
+	void display_projectiles();
 };
 
 
-- 
GitLab