diff --git a/projet-code/cgp/library/cgp/geometry/shape/mesh/structure/mesh.cpp b/projet-code/cgp/library/cgp/geometry/shape/mesh/structure/mesh.cpp index b610d8eceda8fc5ee59ddece484b903e80e71dc8..9cd6ed1e8619012d4fc4f3cb0bac49c6922f3bbf 100644 --- a/projet-code/cgp/library/cgp/geometry/shape/mesh/structure/mesh.cpp +++ b/projet-code/cgp/library/cgp/geometry/shape/mesh/structure/mesh.cpp @@ -162,15 +162,15 @@ namespace cgp vec3 const& p1 = m.position[f1]; vec3 const& p2 = m.position[f2]; - // Check edge length + // Check edge length (changed for compilation) if (norm(p1 - p0) < 1e-6f) { - std::cout<<warning+"Edge ("+str(f0)+","+str(f1)+") has zero length. position["+str(f0)+"]="+str(p0)+", position["+str(f1)+"]="+str(p1)+"; L_edge = "<<str(norm(p1-p0))<<std::endl; + //std::cout<<warning+"Edge ("+str(f0)+","+str(f1)+") has zero length. position["+str(f0)+"]="+str(p0)+", position["+str(f1)+"]="+str(p1)+"; L_edge = "<<str(norm(p1-p0))<<std::endl; } if (norm(p2 - p1) < 1e-6f) { - std::cout<<warning+"Edge ("+str(f2)+","+str(f1)+") has zero length. position["+str(f2)+"]="+str(p2)+", position["+str(f1)+"]="+str(p1)+"; L_edge = "<<str(norm(p2-p1))<<std::endl; + //std::cout<<warning+"Edge ("+str(f2)+","+str(f1)+") has zero length. position["+str(f2)+"]="+str(p2)+", position["+str(f1)+"]="+str(p1)+"; L_edge = "<<str(norm(p2-p1))<<std::endl; } if (norm(p2 - p0) < 1e-6f) { - std::cout<<warning+"Edge ("+str(f2)+","+str(f0)+") has zero length. position["+str(f2)+"]="+str(p2)+", position["+str(f0)+"]="+str(p0)+"; L_edge = "<<str(norm(p2-p0))<<std::endl; + //std::cout<<warning+"Edge ("+str(f2)+","+str(f0)+") has zero length. position["+str(f2)+"]="+str(p2)+", position["+str(f0)+"]="+str(p0)+"; L_edge = "<<str(norm(p2-p0))<<std::endl; } } diff --git a/projet-code/cgp/library/cgp/graphics/opengl/texture/texture.cpp b/projet-code/cgp/library/cgp/graphics/opengl/texture/texture.cpp index 6212a73cba7958ab03e40dd287774f2d5ce7e5d7..dc37ac862563a02dd55f9164a831cd4273d01725 100644 --- a/projet-code/cgp/library/cgp/graphics/opengl/texture/texture.cpp +++ b/projet-code/cgp/library/cgp/graphics/opengl/texture/texture.cpp @@ -145,8 +145,8 @@ namespace cgp GLenum const gl_format = format_to_data_type(format); // expect GL_RGB or GL_RGBA GLenum const gl_component = format_to_component(format); // expect GL_UNISNGED_BYTE - std::cout << (gl_format == GL_RGBA) << std::endl; - std::cout << (gl_component == GL_UNSIGNED_BYTE) << std::endl; + //std::cout << (gl_format == GL_RGBA) << std::endl; + //std::cout << (gl_component == GL_UNSIGNED_BYTE) << std::endl; glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, format, h, h, 0, gl_format, gl_component, ptr(x_neg.data)); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, format, h, h, 0, gl_format, gl_component, ptr(x_pos.data)); diff --git a/projet-code/scenes_inf443/base/assets/electroball.png b/projet-code/scenes_inf443/base/assets/electroball.png new file mode 100644 index 0000000000000000000000000000000000000000..ca60b56c5098553519a38f9c9a77355d6d7d3dbc Binary files /dev/null and b/projet-code/scenes_inf443/base/assets/electroball.png differ diff --git a/projet-code/scenes_inf443/base/assets/fireframes.png b/projet-code/scenes_inf443/base/assets/fireframes.png new file mode 100644 index 0000000000000000000000000000000000000000..e65e2a1d1b9b840c92a513e394f8cef2e91b063a Binary files /dev/null and b/projet-code/scenes_inf443/base/assets/fireframes.png differ diff --git a/projet-code/scenes_inf443/base/assets/spriteice.png b/projet-code/scenes_inf443/base/assets/spriteice.png new file mode 100644 index 0000000000000000000000000000000000000000..97f1c4885ac9bcfaf6c69a5890f814886c92e3a7 Binary files /dev/null and b/projet-code/scenes_inf443/base/assets/spriteice.png differ diff --git a/projet-code/scenes_inf443/base/assets/water.png b/projet-code/scenes_inf443/base/assets/water.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f43106480fb878bdd96c3ec9e306a1c58a2917 Binary files /dev/null and b/projet-code/scenes_inf443/base/assets/water.png differ diff --git a/projet-code/scenes_inf443/base/src/projectiles.cpp b/projet-code/scenes_inf443/base/src/projectiles.cpp index 84c2b82bd6df4a5f08c8af96a5fc849a5611a138..55f863ee017e6ddc2e49629b80f48c306a7e99fd 100644 --- a/projet-code/scenes_inf443/base/src/projectiles.cpp +++ b/projet-code/scenes_inf443/base/src/projectiles.cpp @@ -5,8 +5,32 @@ void projectiles::initialize() { N = 0; projectiles_prop.resize(N); - mesh.initialize_data_on_gpu(mesh_primitive_sphere(0.1f)); + + fire_animation = image_load_file("assets/fireframes.png"); + fire_grid = image_split_grid(fire_animation, 4, 3); + cgp::mesh sphere_mesh = mesh_primitive_sphere(0.5); + fireball.initialize_data_on_gpu(sphere_mesh); + fireball.texture.initialize_texture_2d_on_gpu(fire_grid[2]); + fireball.texture.update_wrap(GL_REPEAT, GL_REPEAT); + + water_animation = image_load_file("assets/water.png"); + water_grid = image_split_grid(water_animation, 3, 2); + waterball.initialize_data_on_gpu(sphere_mesh); + waterball.texture.initialize_texture_2d_on_gpu(water_grid[2]); + waterball.texture.update_wrap(GL_REPEAT, GL_REPEAT); + + ice_animation = image_load_file("assets/spriteice.png"); + ice_grid = image_split_grid(ice_animation, 4, 4); + iceball.initialize_data_on_gpu(sphere_mesh); + iceball.texture.initialize_texture_2d_on_gpu(ice_grid[2]); + iceball.texture.update_wrap(GL_REPEAT, GL_REPEAT); + + electro_animation = image_load_file("assets/electroball.png"); + electro_grid = image_split_grid(ice_animation, 4, 2); + electroball.initialize_data_on_gpu(sphere_mesh); + electroball.texture.initialize_texture_2d_on_gpu(electro_grid[2]); + electroball.texture.update_wrap(GL_REPEAT, GL_REPEAT); } void projectiles::reset() { diff --git a/projet-code/scenes_inf443/base/src/projectiles.hpp b/projet-code/scenes_inf443/base/src/projectiles.hpp index 10bb78e04112e5c3616c830f2ddfa9401f2fff3b..2bcf2696f4519c7d9e0284f6063d67655eb34669 100644 --- a/projet-code/scenes_inf443/base/src/projectiles.hpp +++ b/projet-code/scenes_inf443/base/src/projectiles.hpp @@ -12,6 +12,23 @@ struct projectiles { std::vector<projectile> projectiles_prop; std::vector<projectile::projectile_type> el_types = { projectile::projectile_type::fire, projectile::projectile_type::ice, projectile::projectile_type::rock, projectile::projectile_type::electric, projectile::projectile_type::water }; + + //Textures + image_structure fire_animation; + std::vector<image_structure> fire_grid; + mesh_drawable fireball; + + image_structure water_animation; + std::vector<image_structure> water_grid; + mesh_drawable waterball; + + image_structure ice_animation; + std::vector<image_structure> ice_grid; + mesh_drawable iceball; + + image_structure electro_animation; + std::vector<image_structure> electro_grid; + mesh_drawable electroball; mesh_drawable mesh; diff --git a/projet-code/scenes_inf443/base/src/scene.cpp b/projet-code/scenes_inf443/base/src/scene.cpp index f4936cee52d9286ac16666a84f2c9fb02bcbfc5b..c137b13622bed37d9b63134354c926c62926683d 100644 --- a/projet-code/scenes_inf443/base/src/scene.cpp +++ b/projet-code/scenes_inf443/base/src/scene.cpp @@ -15,22 +15,23 @@ using namespace cgp; std::vector<vec3> tree_position; std::vector<vec3> grass_position; + void scene_structure::initialize() { //CAMERA camera_control.initialize(inputs, window); // Give access to the inputs and window global state to the camera controler - //for orbit camera + //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 + //First person camera camera_control.camera_model.position_camera = { 0,0,evaluate_terrain_height(0,0)+10}; + //camera_control.camera_model.position_camera = { 0,-5,0}; 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()); - + //SKYBOX //skybox_debug.png for debugging image_structure image_skybox_template = image_load_file("assets/skybox2.jpg"); @@ -45,8 +46,6 @@ void scene_structure::initialize() skybox.texture2.initialize_cubemap_on_gpu(image_grid2[7].rotate_90_degrees_counterclockwise(), image_grid2[1].rotate_90_degrees_clockwise(), image_grid2[4].rotate_90_degrees_clockwise().rotate_90_degrees_clockwise(), image_grid2[10], image_grid2[3], image_grid2[5].rotate_90_degrees_clockwise().rotate_90_degrees_clockwise()); - - //TERRAIN int N_terrain_samples = 500; mesh const terrain_mesh = create_terrain_mesh(N_terrain_samples); @@ -63,7 +62,6 @@ void scene_structure::initialize() GL_REPEAT, GL_MIRRORED_REPEAT); - //OBJECTS int r = 1; int h = 5; @@ -84,6 +82,7 @@ void scene_structure::initialize() mesh tree_mesh = create_tree(); tree.initialize_data_on_gpu(tree_mesh); + float x = 1.0; float y = 2.0; tree.model.translation = { x, y, evaluate_terrain_height(x,y) }; @@ -104,7 +103,7 @@ void scene_structure::initialize() GL_CLAMP_TO_BORDER); chain1.initialize(); - bouncing.initialize(10); //10 balls + bouncing.initialize(20); //10 balls bats.initialize_bats(); @@ -224,7 +223,7 @@ void scene_structure::display_semiTransparent() for (int i = 0; i < num_grass(); i++) { grass.model.translation = grass_position[i]; - rotation_transform R = rotation_transform::from_frame_transform({ 1,0,0 }, { 0,0,1 }, right, { 0,0,1 }); + rotation_transform R = rotation_transform::from_frame_transform({ 1,0,0 }, { 0,0,1}, right, {0,0,1}); grass.model.rotation = R; draw(grass, environment); } @@ -287,17 +286,96 @@ void scene_structure::display_ball() { } void scene_structure::display_projectiles() { + + vec3 const right = camera_control.camera_model.right(); + rotation_transform R = rotation_transform::from_frame_transform({ cos(ball_turn_speed * timer.t + 150),sin(ball_turn_speed * timer.t + 150),0 }, { 0,0,1 }, right, { 0,0,1 }); + rotation_transform R2 = rotation_transform::from_frame_transform({ cos(ball_turn_speed * timer.t + 150),-sin(ball_turn_speed * timer.t + 150),0 }, { 0,0,1 }, right, { 0,0,1 }); projectiles.simulate(timer.scale * 0.03f); for (int i = 0; i < projectiles.N; i++) { for (int j = 0; j < bats.N; j++) { if (bats.bats_prop[j].bat_hitbox.is_in_hitbox(projectiles.projectiles_prop[i].pos, bats.bats_prop[j].pos)) bats.bats_prop[j].isdead = true; } - projectiles.mesh.model.translation = projectiles.projectiles_prop[i].pos; projectiles.mesh.material.color = projectiles.projectiles_prop[i].color; draw(projectiles.mesh, environment); + + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDepthMask(false); + + if (projectiles.projectiles_prop[i].elemental_type == projectile::projectile_type::fire) { + + if (fmod(timer.t, ball_reset_speed) > 0.1) change_animation = true; + if (fmod(timer.t, ball_reset_speed) < 0.1 && change_animation) { + change_animation = false; + projectiles.fireball.texture.update(projectiles.fire_grid[std::rand()%12]); + } + + projectiles.fireball.model.translation = projectiles.projectiles_prop[i].pos; + draw(projectiles.fireball, environment); + projectiles.fireball.model.rotation = R; + draw(projectiles.fireball, environment); + projectiles.fireball.model.rotation = R2; + draw(projectiles.fireball, environment); + + } + else if (projectiles.projectiles_prop[i].elemental_type == projectile::projectile_type::water) { + + if (fmod(timer.t, ball_reset_speed) > 0.1) change_animation = true; + if (fmod(timer.t, ball_reset_speed) < 0.1 && change_animation) { + change_animation = false; + projectiles.waterball.texture.update(projectiles.water_grid[std::rand() % 6]); + } + + projectiles.waterball.model.translation = projectiles.projectiles_prop[i].pos; + draw(projectiles.waterball, environment); + projectiles.waterball.model.rotation = R; + draw(projectiles.waterball, environment); + projectiles.waterball.model.rotation = R2; + draw(projectiles.waterball, environment); + + } + else if (projectiles.projectiles_prop[i].elemental_type == projectile::projectile_type::ice) { + + if (fmod(timer.t, ball_reset_speed) > 0.1) change_animation = true; + if (fmod(timer.t, ball_reset_speed) < 0.1 && change_animation) { + change_animation = false; + projectiles.iceball.texture.update(projectiles.ice_grid[std::rand() % 6]); + } + + projectiles.iceball.model.translation = projectiles.projectiles_prop[i].pos; + draw(projectiles.iceball, environment); + projectiles.iceball.model.rotation = R; + draw(projectiles.iceball, environment); + projectiles.iceball.model.rotation = R2; + draw(projectiles.iceball, environment); + + } + else if (projectiles.projectiles_prop[i].elemental_type == projectile::projectile_type::electric) { + + if (fmod(timer.t, ball_reset_speed) > 0.1) change_animation = true; + if (fmod(timer.t, ball_reset_speed) < 0.1 && change_animation) { + change_animation = false; + projectiles.electroball.texture.update(projectiles.electro_grid[std::rand() % 8]); + } + + projectiles.electroball.model.translation = projectiles.projectiles_prop[i].pos; + draw(projectiles.electroball, environment); + projectiles.electroball.model.rotation = R; + draw(projectiles.electroball, environment); + projectiles.electroball.model.rotation = R2; + draw(projectiles.electroball, environment); + + } + + glDepthMask(true); + glDisable(GL_BLEND); + + } + } void scene_structure::mouse_move_event() @@ -308,7 +386,6 @@ 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); diff --git a/projet-code/scenes_inf443/base/src/scene.hpp b/projet-code/scenes_inf443/base/src/scene.hpp index a92f82595839cee464a489f0be79ba413e53eb0a..85f27a0a40d91f1188c079450f5c037b3d26f4ef 100644 --- a/projet-code/scenes_inf443/base/src/scene.hpp +++ b/projet-code/scenes_inf443/base/src/scene.hpp @@ -53,11 +53,15 @@ struct scene_structure : cgp::scene_inputs_generic { // Timer used for the animation timer_basic timer; + bool change_animation=true; + cgp::mesh_drawable terrain; cgp::mesh_drawable cyl; cgp::mesh_drawable cone; cgp::mesh_drawable tree; cgp::mesh_drawable grass; + float ball_turn_speed = 30; + float ball_reset_speed = 0.2; // Timer used for the animation timer_basic timer_chain; @@ -89,7 +93,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(); };