OBJS = main.o stb_image.o helpers.o tiny_obj_loader.o baseclass.o old_objects.o geometric_objects.o hud.o door.o vehicle.o maze.o
-CXXFLAGS = -g -Wall -std=c++20
+CXXFLAGS = -g -Wall -std=c++17
LDFLAGS = -lGL -lglfw -lGLEW -pthread -g
# For FreeBSD (doesn't seem to hurt anything on Linux)
./a.out
${OBJS} : game.h
+maze.o : maze.h
main.o : projectiles.h activation_area.h turret.h tile_floor.h old_objects.h moving_platform.h geometric_objects.h hud.h door.h vehicle.h maze.h
glBufferData(GL_SHADER_STORAGE_BUFFER, radii.size() * sizeof(float), radii.data(), GL_STATIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, radii_buffer);
-
data_mutex.unlock();
glEnableVertexAttribArray(v_attrib);
virtual void addsphere(glm::vec3 location, float radius, glm::vec3 up = glm::vec3(0, 1, 0), glm::vec3 forward = glm::vec3(0, 0, 1));
};
-class rollsphere : virtual public sphere, virtual public block_object {
+class rollsphere : virtual public sphere {
public:
std::vector<glm::vec3> new_locations;
std::vector<float> speeds;
double diff_y = ypos - center_y;
glfwSetCursorPos(window, center_x, center_y);
player_heading -= diff_x / 1000.0; // Is this too fast or slow?
- player_elevation -= diff_y / 1000.0;
+ if((diff_y > 0 && player_elevation - diff_y/1000.0 > -M_PI/2) || (diff_y < 0 && player_elevation - diff_y/1000.0 < M_PI/2))
+ player_elevation -= diff_y / 1000.0;
}
void resize(GLFWwindow*, int new_width, int new_height){
void maze_solver::move(int elapsed_time) {
for(size_t i = 0; i < locations.size(); i++){
+ if(locations[i].z < 580 && locations[i].y <= -95){ // TODO: If the maze ends somewhere else, this would be wrong
+ ups[i].a -= 0.1 * solve_speed;
+ }
+ if(locations[i].z < 540 && locations[i].y <= -95){
+ remove(i);
+ continue;
+ }
bool found_next = false;
if(speeds[i] < 0.001){
for(auto &n : intpoint(locations[i]).neighbors()){
if(!is_empty(n.vec3(), 0.0f))
continue;
- if(visiteds[i].contains(n))
+ if(visiteds[i].count(n))
continue;
visiteds[i].insert(n);
stacks[i].push_back(n);
}
rollsphere::move(elapsed_time);
}
+
+void maze_solver::remove(size_t idx){
+ locations.erase(locations.begin() + idx);
+ radii.erase(radii.begin() + idx);
+ ups.erase(ups.begin() + idx);
+ forwards.erase(forwards.begin() + idx);
+ new_locations.erase(new_locations.begin() + idx);
+ speeds.erase(speeds.begin() + idx);
+ rotation_matrices.erase(rotation_matrices.begin() + idx);
+ visiteds.erase(visiteds.begin() + idx);
+ stacks.erase(stacks.begin() + idx);
+}
}
std::vector<intpoint> neighbors(){
std::vector<intpoint> retval;
+ retval.push_back(intpoint(x, y, z - 8));
retval.push_back(intpoint(x - 8, y, z));
retval.push_back(intpoint(x + 8, y, z));
- retval.push_back(intpoint(x, y, z - 8));
retval.push_back(intpoint(x, y, z + 8));
return retval;
}
}
};
public:
- float solve_speed = 0.01f;
+ float solve_speed = 0.1f;
std::vector<std::set<intpoint>> visiteds;
std::vector<std::vector<intpoint>> stacks;
void launch(float maze_height);
void move(int elapsed_time) override;
+ void remove(size_t idx);
};
#version 450
+in mat4 mvp[];
+in vec4 normal[];
layout(triangles, invocations=1) in;
in vec4 tes_colorout[];
layout(line_strip, max_vertices=6) out;
void main(void) {
- gl_Position = gl_in[0].gl_Position;
+ gl_Position = mvp[0] * (10 * normal[0] + gl_in[0].gl_Position);
gs_colorout = tes_colorout[0];
EmitVertex();
- gl_Position = gl_in[1].gl_Position;
+ gl_Position = mvp[1] * (10 * normal[0] + gl_in[1].gl_Position);
gs_colorout = tes_colorout[1];
EmitVertex();
- gl_Position = gl_in[2].gl_Position;
+ gl_Position = mvp[2] * (10 * normal[0] + gl_in[2].gl_Position);
gs_colorout = tes_colorout[2];
EmitVertex();
- gl_Position = gl_in[0].gl_Position;
+ gl_Position = mvp[0] * (10 * normal[0] + gl_in[0].gl_Position);
gs_colorout = tes_colorout[0];
EmitVertex();
EndPrimitive();
mat4 models[];
};
layout(packed, binding=1) buffer up_list {
- vec3 ups[];
+ vec4 ups[];
};
layout(packed, binding=2) buffer forward_list {
vec3 forwards[];
layout(packed, binding=3) buffer radii_list {
float radii[];
};
+layout(packed, binding=4) buffer explode_list {
+ float explode_factor[];
+};
uniform mat4 vp;
in vec4 tcs_colorout[];
in int vs_id_tcs[];
out vec4 tes_colorout;
+out vec4 normal;
+out mat4 mvp;
vec4 n4(vec4 p){
vec3 offset = p.xyz;// - cntr[0].xyz;
gl_TessCoord.y * gl_in[1].gl_Position +
gl_TessCoord.z * gl_in[2].gl_Position;
- gl_Position = vp * models[vs_id_tcs[0]] * n4(p);
+ float ef = ups[vs_id_tcs[0]].a;
+ if(ef > 0)
+ normal = vec4(0, 0, 0, 0);
+ else
+ normal = -ef * vec4(normalize(p.xyz), 0);
+
+ mvp = vp * models[vs_id_tcs[0]];
+
+ gl_Position = n4(p);
tes_colorout =
gl_TessCoord.x * tcs_colorout[0] +
mat4 models[];
};
layout(packed, binding=1) buffer up_list {
- vec3 ups[];
+ vec4 ups[];
};
layout(packed, binding=2) buffer forward_list {
vec3 forwards[];
out int vs_id;
void main(void) {
- vec3 sideways = normalize(cross(ups[gl_InstanceID], forwards[gl_InstanceID]));
+ vec3 sideways = normalize(cross(ups[gl_InstanceID].xyz, forwards[gl_InstanceID]));
vec3 pos = in_vertex.x * sideways +
in_vertex.y * forwards[gl_InstanceID] +
- in_vertex.z * ups[gl_InstanceID];
+ in_vertex.z * ups[gl_InstanceID].xyz;
gl_Position = vec4(pos, 1.0);
v_colorout = vec4(in_vertex, 1.0);