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