diff --git a/Makefile b/Makefile index adaf1a2..d394db5 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CC = gcc -FLAGS = -O2 -Wall -Wextra -g +FLAGS = -Wall -Wextra -g LFLAGS = -lm src/glad.c -ldl -lglfw -lcglm all: bin/back diff --git a/bin/back b/bin/back index 148492c..1fd8516 100755 Binary files a/bin/back and b/bin/back differ diff --git a/obj/base.o b/obj/base.o index e1f7cf5..9266064 100644 Binary files a/obj/base.o and b/obj/base.o differ diff --git a/obj/bullets.o b/obj/bullets.o index 9dc58b6..7c60029 100644 Binary files a/obj/bullets.o and b/obj/bullets.o differ diff --git a/obj/display.o b/obj/display.o index 87bfac8..f5c5b56 100644 Binary files a/obj/display.o and b/obj/display.o differ diff --git a/obj/entities.o b/obj/entities.o index 8d29bcd..cb5c145 100644 Binary files a/obj/entities.o and b/obj/entities.o differ diff --git a/obj/generation.o b/obj/generation.o index ba5f4b8..eeda91f 100644 Binary files a/obj/generation.o and b/obj/generation.o differ diff --git a/obj/hash.o b/obj/hash.o index 3db13e6..c74a4c0 100644 Binary files a/obj/hash.o and b/obj/hash.o differ diff --git a/obj/main.o b/obj/main.o index 94bf111..9c6392d 100644 Binary files a/obj/main.o and b/obj/main.o differ diff --git a/obj/menus.o b/obj/menus.o index 2b33f08..287cb2f 100644 Binary files a/obj/menus.o and b/obj/menus.o differ diff --git a/obj/move.o b/obj/move.o index dd29851..e305844 100644 Binary files a/obj/move.o and b/obj/move.o differ diff --git a/obj/proj.o b/obj/proj.o index 5f63328..8df7c01 100644 Binary files a/obj/proj.o and b/obj/proj.o differ diff --git a/src/base.c b/src/base.c index c1c90b3..2d0a717 100644 --- a/src/base.c +++ b/src/base.c @@ -289,6 +289,13 @@ double distance_pt_cube_aligned_3d(double x0, double y0, double z0, double cx, d return sqrt((x0-clx)*(x0-clx) + (y0-cly)*(y0-cly) + (z0-clz)*(z0-clz)); } +double distance_pt_cube_aligned_3d_infinite(double x0, double y0, double z0, double cx, double cy, double cz, double cw, double ch, double cd) { + double clx = distance_pt_cube_axis(x0, cx, cx+cw); + double cly = distance_pt_cube_axis(y0, cy, cy+ch); + double clz = distance_pt_cube_axis(z0, cz, cz+cd); + return maxd(maxd(absf(clx-x0), absf(cly-y0)), absf(clz-z0)); +} + double distance_pt_cube_0_3d(double x0, double y0, double z0, cube_0* c) { // places the origin at the center of the cube double x = x0 - (c->x + c->w/2.0); @@ -308,6 +315,25 @@ double distance_pt_cube_0_3d(double x0, double y0, double z0, cube_0* c) { return distance_pt_cube_aligned_3d(xrx, yrx, zrx, -c->w/2.0, -c->h/2.0, -c->d/2.0, c->w, c->h, c->d); } +double distance_pt_cube_0_3d_infinite(double x0, double y0, double z0, cube_0* c) { + // places the origin at the center of the cube + double x = x0 - (c->x + c->w/2.0); + double y = y0 - (c->y + c->h/2.0); + double z = z0 - (c->z + c->d/2.0); + + // rotate the point : y then x + double xry = x*cos(c->hz_angle) + z*sin(c->hz_angle); + double yry = y; + double zry = z*cos(c->hz_angle) - x*sin(c->hz_angle); + + double xrx = xry; + double yrx = yry*cos(c->vt_angle) - zry*sin(c->vt_angle); + double zrx = zry*cos(c->vt_angle) + yry*sin(c->vt_angle); + + // now the cube and pt are aligned, and (0, 0, 0) is at the cube's (bary)center + return distance_pt_cube_aligned_3d_infinite(xrx, yrx, zrx, -c->w/2.0, -c->h/2.0, -c->d/2.0, c->w, c->h, c->d); +} + // ------------------------------------------------------------------------------------------------ // void project_to_camera(double x0, double y0, double z0, double* rx, double* ry, double* rz) { diff --git a/src/base.h b/src/base.h index e2206f4..456b83c 100644 --- a/src/base.h +++ b/src/base.h @@ -49,6 +49,7 @@ double distance_pt_pt_2d_sq(double x0, double y0, double x1, double y1); double distance_pt_pt_3d_sq(double x0, double y0, double z0, double x1, double y1, double z1); double distance_pt_seg_3d(double x, double y, double z, double sx, double sy, double sz, double ex, double ey, double ez); double distance_pt_cube_0_3d(double x0, double y0, double z0, cube_0* c); +double distance_pt_cube_0_3d_infinite(double x0, double y0, double z0, cube_0* c); void remove_entity(entity** arr, int* memlen, int* len, int index); void add_entity(entity** arr, int* memlen, int* len, entity* ent); diff --git a/src/generation.c b/src/generation.c index f194f45..e486791 100644 --- a/src/generation.c +++ b/src/generation.c @@ -150,9 +150,9 @@ void build_starting_chunk(int chx, int chy) { new->tps_size = 4; new->map[0] = create_cube_0(0.0, 0.0, 0.0, 5.0, 1.0, 5.0, 0.0, 0.0, 255, 255, 255); - new->map[1] = create_cube_0(0.0, 0.0, 0.0, 5.0, 1.0, 5.0, 0.0, 0.0, 255, 255, 255); - new->map[2] = create_cube_0(0.0, 0.0, 0.0, 5.0, 1.0, 5.0, 0.0, 0.0, 255, 255, 255); - new->map[3] = create_cube_0(0.0, 0.0, 0.0, 5.0, 1.0, 5.0, 0.0, 0.0, 255, 255, 255); + new->map[1] = create_cube_0(0.0, 15.0, 0.0, 5.0, 1.0, 5.0, 0.0, 0.0, 255, 255, 255); + new->map[2] = create_cube_0(0.0, 30.0, 0.0, 5.0, 1.0, 5.0, 0.0, 0.0, 255, 255, 255); + new->map[3] = create_cube_0(0.0, 45.0, 0.0, 5.0, 1.0, 5.0, 0.0, 0.0, 255, 255, 255); new->map[4] = create_cube_0(0.0, 1.0, 0.0, 1.0, 5.0, 1.0, 0.0, 0.0, 255, 255, 128); new->map[5] = create_cube_0(4.0, 1.0, 0.0, 1.0, 5.0, 1.0, 0.0, 0.0, 255, 255, 128); new->map[6] = create_cube_0(0.0, 1.0, 4.0, 1.0, 5.0, 1.0, 0.0, 0.0, 255, 255, 128); diff --git a/src/main.c b/src/main.c index 88aba1b..bef1f0b 100644 --- a/src/main.c +++ b/src/main.c @@ -22,6 +22,7 @@ double sim_time; int triCount; +unsigned int fffff; double jPress = false; void processInput(GLFWwindow *window, float dtime) { @@ -316,8 +317,9 @@ int main_alt() { // ---------------------------------------------------------------------------------------------------------------------------------------------- // // ---------------------------------------------------------------------------------------------------------------------------------------------- // + fffff = shaderProgram; - int fps = 60; + int fps = 90; int interval = 1000000/fps; double slp_time = 1.0/fps; diff --git a/src/menus.c b/src/menus.c index 73f9383..9cad784 100644 --- a/src/menus.c +++ b/src/menus.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -178,11 +179,13 @@ void gl_drawChar(unsigned int fragShader, char ch, float x, float y, float size, gl_drawRect(fragShader, x-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size/2+2*width, 2*width, r, g, b); } else if(ch == 'k' || ch == 'K') { - gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); - gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); - gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); - gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); + gl_drawRect(fragShader, x-size/2-width, y-width, size/2+2*width, 2*width, r, g, b); + gl_drawRect(fragShader, x-width, y-size/2-width, 2*width, size+2*width, r, g, b); + gl_drawRect(fragShader, x+size/2-width, y+size/2-width, 2*width, size/2+2*width, r, g, b); + gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, size/2+2*width, r, g, b); + gl_drawRect(fragShader, x-width, y+size/2-width, size/2+2*width, 2*width, r, g, b); + gl_drawRect(fragShader, x-width, y-size/2-width, size/2+2*width, 2*width, r, g, b); } else if(ch == 'l' || ch == 'L') { gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); @@ -206,11 +209,11 @@ void gl_drawChar(unsigned int fragShader, char ch, float x, float y, float size, gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-width, 2*width, size+2*width, r, g, b); } else if(ch == 'q' || ch == 'Q') { + gl_drawRect(fragShader, x-size/2-width, y-size/2-width, 2*width, 3*size/2+2*width, r, g, b); + gl_drawRect(fragShader, x+size/2-width, y-size/2-width, 2*width, 3*size/2+2*width, r, g, b); + gl_drawRect(fragShader, x-size/2-width, y-size/2-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); - gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); - gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); - gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); - gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); + gl_drawRect(fragShader, x+size/4-width, y-size-width, 2*width, size/2+2*width, r, g, b); } else if(ch == 'r' || ch == 'R') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); @@ -231,22 +234,26 @@ void gl_drawChar(unsigned int fragShader, char ch, float x, float y, float size, gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(ch == 'v' || ch == 'V') { - gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); - gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); - gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); - gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); - gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); + gl_drawRect(fragShader, x+size/2-width, y-width, 2*width, size+2*width, r, g, b); + gl_drawRect(fragShader, x-size/2-width, y-width, 2*width, size+2*width, r, g, b); + gl_drawRect(fragShader, x+size/4-width, y-size-width, 2*width, size+2*width, r, g, b); + gl_drawRect(fragShader, x-size/4-width, y-size-width, 2*width, size+2*width, r, g, b); + gl_drawRect(fragShader, x-size/2-width, y-width, size/4+2*width, 2*width, r, g, b); + gl_drawRect(fragShader, x+size/4-width, y-width, size/4+2*width, 2*width, r, g, b); + gl_drawRect(fragShader, x-size/4-width, y-size-width, size/2+2*width, 2*width, r, g, b); } else if(ch == 'w' || ch == 'W') { gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); } else if(ch == 'x' || ch == 'X') { - gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); - gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); - gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); - gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); - gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); + gl_drawRect(fragShader, x-width, y-size/2-width, 2*width, size+2*width, r, g, b); + gl_drawRect(fragShader, x+size/2-width, y+size/2-width, 2*width, size/2+2*width, r, g, b); + gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, size/2+2*width, r, g, b); + gl_drawRect(fragShader, x-size/2-width, y+size/2-width, 2*width, size/2+2*width, r, g, b); + gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, size/2+2*width, r, g, b); + gl_drawRect(fragShader, x-size/2-width, y+size/2-width, size+2*width, 2*width, r, g, b); + gl_drawRect(fragShader, x-size/2-width, y-size/2-width, size+2*width, 2*width, r, g, b); } else if(ch == 'y' || ch == 'Y') { gl_drawRect(fragShader, x+size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-width, y-size-width, 2*width, size+2*width, r, g, b); @@ -287,6 +294,10 @@ void gl_drawString(unsigned int fragShader, char* str, float x, float y, float s } } +void gl_printf(unsigned int fragShader, int count, ...) { + +} + void gl_initDrawRect(unsigned int shaderProgram) { glUseProgram(shaderProgram); } diff --git a/src/move.c b/src/move.c index bf23afb..c1913fa 100644 --- a/src/move.c +++ b/src/move.c @@ -21,11 +21,14 @@ double fov = 90.0; double creative_speed = 0.3; double speed = 8.0; double vtmult = 1.5; -double min_dist = 0.1; +double min_dist = 0.4; double friction = 0.3; double gravity_factor = 9.8; // ---------------------------------------------------------------------------------------------------- // +bool is_clipping = false; +int clip_dps = 500; + int njumps; double fx; double fy; @@ -145,11 +148,19 @@ void normalize(pt_2d* p) { void updateF(cube_0* cb, double dtime) { for(int d = 0; d < 6; d++) { - cb->x -= min_dist; cb->y -= min_dist; cb->z -= min_dist; - cb->w += 2*min_dist; cb->h += 2*min_dist; cb->d += 2*min_dist; + cb->x -= min_dist; + cb->y -= min_dist; + cb->z -= min_dist; + cb->w += 2*min_dist; + cb->h += 2*min_dist; + cb->d += 2*min_dist; getSF(cb, d); - cb->x += min_dist; cb->y += min_dist; cb->z += min_dist; - cb->w -= 2*min_dist; cb->h -= 2*min_dist; cb->d -= 2*min_dist; + cb->x += min_dist; + cb->y += min_dist; + cb->z += min_dist; + cb->w -= 2*min_dist; + cb->h -= 2*min_dist; + cb->d -= 2*min_dist; getDirectors(); getNormal(); if(d%2==1) { @@ -165,7 +176,7 @@ void updateF(cube_0* cb, double dtime) { (dot3D(vt, normal) <= 0.0 && dot3D(vtdt, normal) >= 0.0) || (dot3D(vt, normal) >= 0.0 && dot3D(vtdt, normal) <= 0.0) ) { - //printf("%d\n", d); + printf("%d\n", d); double normv = sqrt(camvx*camvx + camvy*camvy + camvz*camvz); double alpha = acos(dot3D(normal, (pt_2d){.x = camvx, .y = camvy, .z = camvz})/normv); @@ -181,13 +192,15 @@ void updateF(cube_0* cb, double dtime) { camvx /= 1.41; camvy /= 1.41; camvz /= 1.41; + + is_clipping = false; } } } bool is_colliding(float dtime) { for(int k = 0; k < current_room->map_size; k++) { - double dist = distance_pt_cube_0_3d(camx, camy, camz, current_room->map[k]); + double dist = distance_pt_cube_0_3d_infinite(camx, camy, camz, current_room->map[k]); if(dist <= min_dist) { if(updateForces) { updateF(current_room->map[k], (double)dtime); @@ -196,7 +209,7 @@ bool is_colliding(float dtime) { } } for(int k = 0; k < current_room->tps_size; k++) { - double dist = distance_pt_cube_0_3d(camx, camy, camz, current_room->tps[k]->hitbox); + double dist = distance_pt_cube_0_3d_infinite(camx, camy, camz, current_room->tps[k]->hitbox); if(dist <= min_dist) { if(updateForces) { updateF(current_room->tps[k]->hitbox, (double)dtime); @@ -212,7 +225,7 @@ bool is_colliding(float dtime) { } } for(int k = 0; k < current_room->ent_len; k++) { - double dist = distance_pt_cube_0_3d(camx, camy, camz, current_room->ents[k]->pos); + double dist = distance_pt_cube_0_3d_infinite(camx, camy, camz, current_room->ents[k]->pos); if(dist <= min_dist) { if(current_room->ents[k]->onHit != NULL) { (*current_room->ents[k]->onHit)(dtime, current_room->ents[k]->hitpoints, ¤t_room->ents[k]->damage, current_room->ents[k], &(*(current_room->ents[k]->pos))); @@ -248,7 +261,11 @@ void movePlayerG(float dtime) { camx += delx; camy += dely; camz += delz; + is_clipping = true; if(is_colliding(dtime)) { + if(is_clipping) { + player_hp -= (dtime)*clip_dps; + } //printf("HIT\n"); //printf("[%lf, %lf, %lf]\n{%lf, %lf, %lf}\n\n", fx, fy, fz, camvx, camvy, camvz); } diff --git a/src/structure.h b/src/structure.h index d032d34..dae08a5 100644 --- a/src/structure.h +++ b/src/structure.h @@ -155,4 +155,6 @@ extern double fz; extern int njumps; +extern unsigned int fffff; + #endif \ No newline at end of file