From 989c778f830522cd16ea80447db47ee69b3d8b4f Mon Sep 17 00:00:00 2001
From: Marie <marie.audouard@polytechnique.edu>
Date: Wed, 24 May 2023 21:03:02 +0200
Subject: [PATCH] Added dragon, made bat hitbox

---
 .../camera_projection/camera_projection.hpp   |  4 +-
 projet-code/scenes_inf443/base/src/bat.cpp    |  2 +-
 projet-code/scenes_inf443/base/src/hitbox.cpp |  2 +-
 projet-code/scenes_inf443/base/src/scene.cpp  | 70 +++++++++++++++++--
 projet-code/scenes_inf443/base/src/scene.hpp  |  7 +-
 5 files changed, 75 insertions(+), 10 deletions(-)

diff --git a/projet-code/cgp/library/cgp/graphics/camera/camera_projection/camera_projection.hpp b/projet-code/cgp/library/cgp/graphics/camera/camera_projection/camera_projection.hpp
index 6eff4dd..a710780 100644
--- a/projet-code/cgp/library/cgp/graphics/camera/camera_projection/camera_projection.hpp
+++ b/projet-code/cgp/library/cgp/graphics/camera/camera_projection/camera_projection.hpp
@@ -9,8 +9,8 @@ namespace cgp
 	{
 		float field_of_view = 50.0f * Pi/180;
 		float aspect_ratio = 1.0f;
-		float depth_min = 0.01f;
-		float depth_max = 1000;
+		float depth_min = 0.1f;
+		float depth_max = 300;
 
 		mat4 matrix() const;
 		mat4 matrix_inverse() const;
diff --git a/projet-code/scenes_inf443/base/src/bat.cpp b/projet-code/scenes_inf443/base/src/bat.cpp
index 81c9184..c47ef5c 100644
--- a/projet-code/scenes_inf443/base/src/bat.cpp
+++ b/projet-code/scenes_inf443/base/src/bat.cpp
@@ -22,7 +22,7 @@ void bat::initialize_mvt(vec3 p, numarray<vec3> key_positions, numarray<float> k
 	timer_mvt.t = timer_mvt.t_min;
 
 	//bat hitbox
-	bat_hitbox.initialize_hitbox(1, { {0,0,0} }, { size*6 });
+	bat_hitbox.initialize_hitbox(2, {{0,2.5*size,0},{0,-1.75*size,0.5*size}}, { size*3, size * 1.5});
 }
 
 void bat::update_mvt()
diff --git a/projet-code/scenes_inf443/base/src/hitbox.cpp b/projet-code/scenes_inf443/base/src/hitbox.cpp
index e7cc36c..e96797a 100644
--- a/projet-code/scenes_inf443/base/src/hitbox.cpp
+++ b/projet-code/scenes_inf443/base/src/hitbox.cpp
@@ -12,7 +12,7 @@ void hitbox::initialize_hitbox(int _N, std::vector<vec3> _center, std::vector<do
 
 bool hitbox::is_in_hitbox(vec3 pos, vec3 shift) {
 	for (int i = 0; i < N; i++) {
-		if (norm(pos - center[i]) < r[i]) return true;
+		if (norm(pos - center[i] - shift) < r[i]) return true;
 	}
 	return false;
 }
\ No newline at end of file
diff --git a/projet-code/scenes_inf443/base/src/scene.cpp b/projet-code/scenes_inf443/base/src/scene.cpp
index d53454a..514eb17 100644
--- a/projet-code/scenes_inf443/base/src/scene.cpp
+++ b/projet-code/scenes_inf443/base/src/scene.cpp
@@ -5,6 +5,7 @@
 #include "ball.hpp"
 #include "bird.hpp"
 #include "bat.hpp"
+#include "dragon.hpp"
 #include "terrain.hpp"
 #include "projectile.hpp"
 #include "sapin.hpp"
@@ -23,9 +24,9 @@ void scene_structure::initialize()
 	//for orbit camera
 	//camera_control.set_rotation_axis_z(); 
 	//camera_control.look_at({ 20.0f,15.0f,15.0f }, {0,0,0});
-	
+
 	//for first person camera
-	camera_control.camera_model.position_camera = { 0,0,evaluate_terrain_height(0,0)+10};
+	camera_control.camera_model.position_camera = { 0,0,evaluate_terrain_height(0,0) + 10 };
 	camera_control.camera_model.set_rotation_axis({ 0,0,1 });
 	//custum function we added to ..first_person_euler
 	global_frame.initialize_data_on_gpu(mesh_primitive_frame());
@@ -107,6 +108,7 @@ void scene_structure::initialize()
 	bouncing.initialize(10); //10 balls
 
 	bats.initialize_bats();
+	dragons.initialize_dragons();
 
 	vec3 bat_pos1 = { 0,0,evaluate_terrain_height(0,0) + 20 };
 	float bat_size1 = 0.2f;
@@ -115,14 +117,16 @@ void scene_structure::initialize()
 	bats.add_bat(bat_pos1, bat_size1, bat_keypos1, bat_keytimes1);
 	
 	vec3 bat_pos2 = { 5,5,evaluate_terrain_height(0,0) + 10 };
-	float bat_size2 = 0.3f;
+	float bat_size2 = 1;
 	numarray<vec3> bat_keypos2 = { {-1,1,0}, {0,1,0}, {1,1,0}, {1,2,0}, {2,2,0}, {2,2,1}, {2,0,1.5}, {1.5,-1,1}, {1.5,-1,0}, {1,-1,0}, {0,-0.5,0}, {-1,1,0} };
 	numarray<float> bat_keytimes2 = { 0.0f, 1.0f, 2.0f, 2.5f, 3.0f, 3.5f, 3.75f, 4.5f, 5.0f, 6.0f, 7.0f, 8.0f };
-	bats.add_bat(bat_pos2, bat_size2, bat_keypos2, bat_keytimes2);
+	dragons.add_dragon(bat_pos2, bat_size2, bat_keypos2, bat_keytimes2);
 
 	projectiles.initialize();
 	sapin1.initialize_sapin();
 	sapin1.sapin["Trunk"].transform_local.rotation = rotation_transform::from_axis_angle({ 1,0,0 }, Pi / 2);
+
+	hitbox_sphere.initialize_data_on_gpu(mesh_primitive_sphere(1));
 }
 
 void scene_structure::display_frame()
@@ -164,6 +168,7 @@ void scene_structure::display_frame()
 	//display_chain(p);
 	display_ball();
 	display_bats();
+	display_dragons();
 	display_projectiles();
 
 
@@ -191,7 +196,8 @@ void scene_structure::display_bats()
 		bats.bat_mesh["Bat wing right1"].transform_local.translation = { 0.25f * bats.bats_prop[i].size, 0, 0 };
 
 		//Orientation and position of the bat along the path
-		bats.bat_mesh["Bat base"].transform_local.rotation = rotation_transform::from_vector_transform({ 0,-1,0 }, normalize(bats.bats_prop[i].pos_futur - bats.bats_prop[i].pos));
+		rotation_transform rot = rotation_transform::from_vector_transform({ 0,-1,0 }, normalize(bats.bats_prop[i].pos_futur - bats.bats_prop[i].pos));
+		bats.bat_mesh["Bat base"].transform_local.rotation = rot;
 		bats.bat_mesh["Bat base"].transform_local.translation = bats.bats_prop[i].pos;
 
 		bats.bat_mesh.update_local_to_global_coordinates();
@@ -199,6 +205,59 @@ void scene_structure::display_bats()
 		if (gui.display_wireframe) {
 			draw_wireframe(bats.bat_mesh, environment);
 		}
+
+		if (gui.display_hitbox) {
+			display_hitbox(bats.bats_prop[i].bat_hitbox, bats.bats_prop[i].pos, rot);
+		}
+	}
+}
+
+void scene_structure::display_dragons()
+{
+	dragons.update_mvt();
+
+	for (int i = 0; i < bats.N; i++) {
+		//Wing animation
+		dragons.dragon_mesh["Dragon wing left"].transform_local.rotation = rotation_transform::from_axis_angle({ 1,0,0.5 }, 0.5 * cos(5 * dragons.dragons_prop[i].timer_mvt.t));
+		dragons.dragon_mesh["Dragon wing right"].transform_local.rotation = rotation_transform::from_axis_angle({ 1,0,0.5 }, -0.5 * cos(5 * dragons.dragons_prop[i].timer_mvt.t));
+		//Rescale
+		dragons.dragon_mesh["Dragon base"].drawable.model.scaling = dragons.dragons_prop[i].size;
+		dragons.dragon_mesh["Dragon wing left"].drawable.model.scaling = dragons.dragons_prop[i].size;
+		dragons.dragon_mesh["Dragon wing right"].drawable.model.scaling = dragons.dragons_prop[i].size;
+		dragons.dragon_mesh["Dragon mouth"].drawable.model.scaling = dragons.dragons_prop[i].size;
+		dragons.dragon_mesh["Dragon tailmiddle"].drawable.model.scaling = dragons.dragons_prop[i].size;
+		dragons.dragon_mesh["Dragon tailend"].drawable.model.scaling = dragons.dragons_prop[i].size;
+		//Make sure wings are at the right distance
+		dragons.dragon_mesh["Dragon wing left"].transform_local.translation = { 0, -0.3f * dragons.dragons_prop[i].size, 0 };
+		dragons.dragon_mesh["Dragon wing right"].transform_local.translation = { 0, 0.3f * dragons.dragons_prop[i].size, 0 };
+
+		//Orientation and position of the bat along the path
+		rotation_transform rot = rotation_transform::from_vector_transform({ 0,-1,0 }, normalize(dragons.dragons_prop[i].pos_futur - dragons.dragons_prop[i].pos));
+		//dragons.dragon_mesh["Dragon base"].transform_local.rotation = rot;
+		dragons.dragon_mesh["Dragon base"].transform_local.translation = dragons.dragons_prop[i].pos;
+
+		dragons.dragon_mesh.update_local_to_global_coordinates();
+		if (!dragons.dragons_prop[i].isdead)	//draw(dragons.dragon_mesh, environment);
+		if (gui.display_wireframe) {
+			draw_wireframe(dragons.dragon_mesh, environment);
+		}
+
+		dragons.dragon_mesh["Dragon base"].transform_local.translation = {10,10, 10 + evaluate_terrain_height(10,10)};
+
+		dragons.dragon_mesh.update_local_to_global_coordinates();
+		draw(dragons.dragon_mesh, environment);
+
+		if (gui.display_hitbox) {
+			display_hitbox(dragons.dragons_prop[i].dragon_hitbox, dragons.dragons_prop[i].pos, rot);
+		}
+	}
+}
+
+void scene_structure::display_hitbox(hitbox H, vec3 shift, rotation_transform rot) {
+	for (int i = 0; i < H.N; i++) {
+		hitbox_sphere.model.scaling = H.r[i];
+		hitbox_sphere.model.translation = rot * H.center[i] + shift;
+		draw_wireframe(hitbox_sphere, environment);
 	}
 }
 
@@ -265,6 +324,7 @@ void scene_structure::display_gui()
 {
 	ImGui::Checkbox("Frame", &gui.display_frame);
 	ImGui::Checkbox("Wireframe", &gui.display_wireframe);
+	ImGui::Checkbox("Hitbox", &gui.display_hitbox);
 	ImGui::Checkbox("Fly", &gui.fly);
 
 	//ImGui::SliderFloat("Time", &timer_mvt.t, timer_mvt.t_min, timer_mvt.t_max);
diff --git a/projet-code/scenes_inf443/base/src/scene.hpp b/projet-code/scenes_inf443/base/src/scene.hpp
index a92f825..65a0850 100644
--- a/projet-code/scenes_inf443/base/src/scene.hpp
+++ b/projet-code/scenes_inf443/base/src/scene.hpp
@@ -8,6 +8,7 @@
 #include "bird.hpp"
 #include "chain.hpp"
 #include "bats.hpp"
+#include "dragons.hpp"
 #include "projectiles.hpp"
 #include "sapin.hpp"
 
@@ -24,6 +25,7 @@ using cgp::timer_basic;
 struct gui_parameters {
 	bool display_frame = true;
 	bool display_wireframe = false;
+	bool display_hitbox = false;
 	float k = 0.5f;
 	bool fly = true;
 	float speed = 1.0f;
@@ -58,6 +60,7 @@ struct scene_structure : cgp::scene_inputs_generic {
 	cgp::mesh_drawable cone;
 	cgp::mesh_drawable tree;
 	cgp::mesh_drawable grass;
+	cgp::mesh_drawable hitbox_sphere;
 
 	// Timer used for the animation
 	timer_basic timer_chain;
@@ -66,6 +69,7 @@ struct scene_structure : cgp::scene_inputs_generic {
 	bird bird1;
 	chain chain1;
 	bats bats;
+	dragons dragons;
 	projectiles projectiles;
 	sapin sapin1;
 
@@ -80,6 +84,8 @@ struct scene_structure : cgp::scene_inputs_generic {
 	void display_chain(vec3 end_pos);
 	//void display_bird(vec3 p);
 	void display_bats();
+	void display_dragons();
+	void display_hitbox(hitbox H, vec3 shift, rotation_transform rot);
 
 	void mouse_move_event();
 	void mouse_click_event();
@@ -89,7 +95,6 @@ struct scene_structure : cgp::scene_inputs_generic {
 	void draw_segment(vec3 const& a, vec3 const& b);
 
 	void display_ball();
-	bool scene_structure::test_dead(vec3 p);
 	void display_projectiles();
 };
 
-- 
GitLab