Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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 };
}
}
}