diff --git a/bin/back b/bin/back index 9fe8da6..1018940 100755 Binary files a/bin/back and b/bin/back differ diff --git a/obj/base.o b/obj/base.o index aa54ece..e1f7cf5 100644 Binary files a/obj/base.o and b/obj/base.o differ diff --git a/obj/display.o b/obj/display.o index dada8b2..723a9af 100644 Binary files a/obj/display.o and b/obj/display.o differ diff --git a/obj/entities.o b/obj/entities.o index fccdfcb..d143d1a 100644 Binary files a/obj/entities.o and b/obj/entities.o differ diff --git a/obj/main.o b/obj/main.o index 32c930f..7199aa2 100644 Binary files a/obj/main.o and b/obj/main.o differ diff --git a/obj/move.o b/obj/move.o index 297dcfa..77598c9 100644 Binary files a/obj/move.o and b/obj/move.o differ diff --git a/src/base.c b/src/base.c index 224922a..c1c90b3 100644 --- a/src/base.c +++ b/src/base.c @@ -274,28 +274,19 @@ double distance_pt_seg_3d(double x, double y, double z, double sx, double sy, do double distance_pt_cube_axis(double coord, double begin, double end) { if(coord < begin) { - return (begin-coord); + return (begin); } else if(coord > end) { - return (coord-end); + return (end); } else { - return 0.0; - } -} - -double distance_pt_cube_axis_max(double coord, double begin, double end) { - if(coord < (begin+end)/2) { - return absf(end-coord); - } else { - return absf(begin-coord); + return (coord); } } double distance_pt_cube_aligned_3d(double x0, double y0, double z0, double cx, double cy, double cz, double cw, double ch, double cd) { - return (distance_pt_cube_axis(x0, cx, cx+cw)+distance_pt_cube_axis(y0, cy, cy+ch)+distance_pt_cube_axis(z0, cz, cz+cd)); -} - -double distance_pt_cube_aligned_3d_max(double x0, double y0, double z0, double cx, double cy, double cz, double cw, double ch, double cd) { - return (distance_pt_cube_axis_max(x0, cx, cx+cw)+distance_pt_cube_axis_max(y0, cy, cy+ch)+distance_pt_cube_axis_max(z0, cz, cz+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 sqrt((x0-clx)*(x0-clx) + (y0-cly)*(y0-cly) + (z0-clz)*(z0-clz)); } double distance_pt_cube_0_3d(double x0, double y0, double z0, cube_0* c) { diff --git a/src/base.h b/src/base.h index 8f5bfa7..e2206f4 100644 --- a/src/base.h +++ b/src/base.h @@ -48,13 +48,8 @@ double distance_pt_pt_3d(double x0, double y0, double z0, double x1, double y1, 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_axis(double coord, double begin, double end); -double distance_pt_cube_aligned_3d(double x0, double y0, double z0, double cx, double cy, double cz, double cw, double ch, double cd); double distance_pt_cube_0_3d(double x0, double y0, double z0, cube_0* c); -double distance_pt_cube_axis_max(double coord, double begin, double end); -double distance_pt_cube_aligned_3d_max(double x0, double y0, double z0, double cx, double cy, double cz, double cw, double ch, double cd); - 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/display.c b/src/display.c index 3484f60..8a79a50 100644 --- a/src/display.c +++ b/src/display.c @@ -68,7 +68,8 @@ void gl_renderTriangle(unsigned int shaderProgram, unsigned int VAO, unsigned in glDrawArrays(GL_TRIANGLES, 0, 3); } -double near = 0.4 ; +//double near = 0.4 ; +double near = 0.0 ; double far = 10.0 ; double top = 1.0 ; diff --git a/src/entities.c b/src/entities.c index 7ed766a..bbf2636 100644 --- a/src/entities.c +++ b/src/entities.c @@ -108,9 +108,9 @@ void translatePlayer(float dtime, int* hp, int* dmg, entity* ent, cube_0* ret) { double dx = ent->metad4*(cos((double)(ent->metai1*(sim_time+(double)dtime)/ent->metai2 + ent->metai3*3.14159/180.0))-cos((double)(ent->metai1*sim_time/ent->metai2 + ent->metai3*3.14159/180.0))); double dy = ent->metad5*(cos((double)(ent->metai1*(sim_time+(double)dtime)/ent->metai2 + ent->metai3*3.14159/180.0))-cos((double)(ent->metai1*sim_time/ent->metai2 + ent->metai3*3.14159/180.0))); double dz = ent->metad6*(cos((double)(ent->metai1*(sim_time+(double)dtime)/ent->metai2 + ent->metai3*3.14159/180.0))-cos((double)(ent->metai1*sim_time/ent->metai2 + ent->metai3*3.14159/180.0))); - fx += dx/(dtime*dtime); + //fx += dx/(dtime*dtime); fy += dy/(dtime*dtime); - fz += dz/(dtime*dtime); + //fz += dz/(dtime*dtime); } void go_to_player(double x, double y, double z, double w, double h, double d, double hz_angle, double vt_angle, float dtime, entity* ent, cube_0* ret) { diff --git a/src/main.c b/src/main.c index 56aef08..2c54ea5 100644 --- a/src/main.c +++ b/src/main.c @@ -342,7 +342,7 @@ int main_alt() { // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.) // ------------------------------------------------------------------------------- processInput(window, delta); - movePlayerG(deltad); + movePlayerG(delta); teleport_on_edge(); update_entities(delta); updateProj(delta); diff --git a/src/move.c b/src/move.c index bbf1af1..15ea72d 100644 --- a/src/move.c +++ b/src/move.c @@ -21,7 +21,7 @@ double fov = 90.0; double creative_speed = 0.3; double speed = 8.0; double vtmult = 1.5; -double min_dist = 0.7; +double min_dist = 0.1; double friction = 0.8; double gravity_factor = 9.8; // ---------------------------------------------------------------------------------------------------- // @@ -56,6 +56,8 @@ int collisionVal = 0; double room_width; double room_depth; +double sq2; + void init_csts() { camx = 2.0; camy = 5.0; @@ -70,6 +72,7 @@ void init_csts() { fade_dmg = 0; room_width = 16.0; room_depth = 16.0; + sq2 = sqrt(2); stop_evetything = false; tan_fov = tan((fov * 3.14159 / 180.0) / 2.0); } @@ -93,26 +96,26 @@ pt_2d normal; double p1, p2, p3; void getSF(cube_0* cb, int sf) { if(sf == 0 || sf == 1) { - project_to_cube(cb->x + (sf==0)*cb->w, cb->y -(min_dist*0), cb->z -(min_dist*0), &p1, &p2, &p3, cb); - surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x + (sf==0)*cb->w, cb->y + cb->h +2*(min_dist*0), cb->z -(min_dist*0), &p1, &p2, &p3, cb); - surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x + (sf==0)*cb->w, cb->y -(min_dist*0), cb->z + cb->d +2*(min_dist*0), &p1, &p2, &p3, cb); - surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x + (sf==0)*(cb->w), cb->y , cb->z , &p1, &p2, &p3, cb); + surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x + (sf==0)*(cb->w), cb->y + cb->h, cb->z , &p1, &p2, &p3, cb); + surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x + (sf==0)*(cb->w), cb->y , cb->z + cb->d, &p1, &p2, &p3, cb); + surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; } else if(sf == 2 || sf == 3) { - project_to_cube(cb->x -(min_dist*0), cb->y + (sf==2)*cb->h, cb->z -(min_dist*0), &p1, &p2, &p3, cb); - surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x + cb->w +2*(min_dist*0), cb->y + (sf==2)*cb->h, cb->z -(min_dist*0), &p1, &p2, &p3, cb); - surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x -(min_dist*0), cb->y + (sf==2)*cb->h, cb->z + cb->d +2*(min_dist*0), &p1, &p2, &p3, cb); - surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x , cb->y + (sf==2)*(cb->h), cb->z , &p1, &p2, &p3, cb); + surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x + cb->w, cb->y + (sf==2)*(cb->h), cb->z , &p1, &p2, &p3, cb); + surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x , cb->y + (sf==2)*(cb->h), cb->z + cb->d, &p1, &p2, &p3, cb); + surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; } else { - project_to_cube(cb->x -(min_dist*0), cb->y -(min_dist*0), cb->z + cb->d*(sf==4), &p1, &p2, &p3, cb); - surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x + cb->w +2*(min_dist*0), cb->y -(min_dist*0), cb->z + cb->d*(sf==4), &p1, &p2, &p3, cb); - surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x -(min_dist*0), cb->y + cb->h +2*(min_dist*0), cb->z + cb->d*(sf==4), &p1, &p2, &p3, cb); - surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x , cb->y , cb->z + (sf==4)*(cb->d), &p1, &p2, &p3, cb); + surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x + cb->w, cb->y , cb->z + (sf==4)*(cb->d), &p1, &p2, &p3, cb); + surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x , cb->y + cb->h, cb->z + (sf==4)*(cb->d), &p1, &p2, &p3, cb); + surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; } } @@ -140,7 +143,11 @@ 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; 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; getDirectors(); getNormal(); if(d%2==1) { @@ -153,10 +160,10 @@ void updateF(cube_0* cb, double dtime) { normalize(&vtdt); normalize(&vt); if( - (dot3D(vt, normal) <= 0.0 && dot3D(vtdt, normal) > 0.0) || - (dot3D(vt, normal) >= 0.0 && dot3D(vtdt, normal) < 0.0) + (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); @@ -201,9 +208,6 @@ 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); if(dist <= min_dist) { - if(updateForces) { - updateF(current_room->ents[k]->pos, (double)dtime); - } 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))); if(*(current_room->ents[k]->hitpoints) <= 0) { @@ -211,6 +215,10 @@ bool is_colliding(float dtime) { (*current_room->ents[k]->onDeath)(dtime); } remove_entity(current_room->ents, ¤t_room->ent_memlen, ¤t_room->ent_len, k); + } else { + if(updateForces) { + updateF(current_room->ents[k]->pos, (double)dtime); + } } } return true; @@ -219,7 +227,7 @@ bool is_colliding(float dtime) { return false; } -void movePlayerG(double dtime) { +void movePlayerG(float dtime) { updateForces = true; fx = 0.0; fy = 0.0; @@ -234,9 +242,8 @@ void movePlayerG(double dtime) { camy += dely; camz += delz; if(is_colliding(dtime)) { - //camvx = 0.0; - //camvy = 0.0; - //camvz = 0.0; + printf("HIT\n"); + //printf("[%lf, %lf, %lf]\n{%lf, %lf, %lf}\n\n", fx, fy, fz, camvx, camvy, camvz); } camx -= delx; camy -= dely; diff --git a/src/move.h b/src/move.h index 9c3dac1..82a5399 100644 --- a/src/move.h +++ b/src/move.h @@ -5,6 +5,6 @@ void init_csts(); bool is_colliding(float dtime); void teleport_on_edge(); -void movePlayerG(double dtime); +void movePlayerG(float dtime); #endif \ No newline at end of file