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