diff --git a/bin/back b/bin/back index 3fda94d..118e36d 100755 Binary files a/bin/back and b/bin/back differ diff --git a/obj/base.o b/obj/base.o index ee2db11..dd1cc78 100644 Binary files a/obj/base.o and b/obj/base.o differ diff --git a/obj/display.o b/obj/display.o index 126a76d..54efa0d 100644 Binary files a/obj/display.o and b/obj/display.o differ diff --git a/obj/move.o b/obj/move.o index 86641c2..ce2a5fc 100644 Binary files a/obj/move.o and b/obj/move.o differ diff --git a/src/base.c b/src/base.c index d5f0da2..3792cc9 100644 --- a/src/base.c +++ b/src/base.c @@ -216,10 +216,22 @@ double distance_pt_cube_axis(double coord, double begin, double end) { } } +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) ; + } +} + 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 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) ; @@ -239,6 +251,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_max(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_max(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_aligned_3d_weighted(double x0, double y0, double z0, double cx, double cy, double cz, double cw, double ch, double cd, double mx, double my, double mz) { return (mx*distance_pt_cube_axis(x0, cx, cx+cw)+my*distance_pt_cube_axis(y0, cy, cy+ch)+mz*distance_pt_cube_axis(z0, cz, cz+cd)) ; } diff --git a/src/base.h b/src/base.h index 6c0169a..d541b92 100644 --- a/src/base.h +++ b/src/base.h @@ -36,9 +36,14 @@ 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); 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_aligned_3d_weighted(double x0, double y0, double z0, double cx, double cy, double cz, double cw, double ch, double cd, double mx, double my, double mz); double distance_pt_cube_0_3d_weighted(double x0, double y0, double z0, double mx, double my, double mz, 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); +double distance_pt_cube_0_3d_max(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/display.c b/src/display.c index f5d109b..9a5bbc3 100644 --- a/src/display.c +++ b/src/display.c @@ -180,11 +180,74 @@ void project_to_camera(double x0, double y0, double z0, double* rx, double* ry, double zry = z*cos(rot_hz) - x*sin(rot_hz) ; // rotate (x) - *rx = xry ; - *ry = yry*cos(rot_vt) - zry*sin(rot_vt) ; - *rz = zry*cos(rot_vt) + yry*sin(rot_vt) ; + if(rx != NULL) {*rx = xry ;} + if(ry != NULL) {*ry = yry*cos(rot_vt) - zry*sin(rot_vt) ;} + if(rz != NULL) {*rz = zry*cos(rot_vt) + yry*sin(rot_vt) ;} } +// ---------------------------------------------------------------------------------------------------------------------------------- // + +double pt_z_distance_to_camera(double x, double y, double z) { + double ret ; + project_to_camera(x, y, z, NULL, NULL, &ret) ; + return absf(ret) ; +} + +double segment_z_distance_to_camera(double x0, double y0, double z0, double x1, double y1, double z1) { + double ret0 = pt_z_distance_to_camera(x0, y0, z0); + double ret1 = pt_z_distance_to_camera(x1, y1, z1); + double theta = -( + ((x1 - x0) * (x0 - camx) + (y1 - y0) * (y0 - camy) + (z1 - z0) * (z0 - camz)) / + ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0) + (z1 - z0) * (z1 - z0)) + ); // projection factor of camera onto the line + return absf(convex_pt(ret0, ret1, mind(maxd(theta, 0.0), 1.0))); +} + +double square_z_distance_to_camera( + double x0, double y0, double z0, + double x1, double y1, double z1, + double x2, double y2, double z2 +) { + return maxd(segment_z_distance_to_camera(x0, y0, z0, x1, y1, z1), segment_z_distance_to_camera(x0, y0, z0, x2, y2, z2)); +} + +double cube_z_distance_to_camera(cube_0 cb) { + double dist_0 = square_z_distance_to_camera( + cb.x + cb.w, cb.y, cb.z, + cb.x + cb.w, cb.y + cb.h, cb.z, + cb.x + cb.w, cb.y, cb.z + cb.d + ); + double dist_1 = square_z_distance_to_camera( + cb.x, cb.y, cb.z, + cb.x, cb.y + cb.h, cb.z, + cb.x, cb.y, cb.z + cb.d + ); + double dist_2 = square_z_distance_to_camera( + cb.x, cb.y + cb.h, cb.z, + cb.x + cb.w, cb.y + cb.h, cb.z, + cb.x, cb.y + cb.h, cb.z + cb.d + ); + double dist_3 = square_z_distance_to_camera( + cb.x, cb.y, cb.z, + cb.x + cb.w, cb.y, cb.z, + cb.x, cb.y, cb.z + cb.d + ); + double dist_4 = square_z_distance_to_camera( + cb.x, cb.y, cb.z + cb.d, + cb.x + cb.w, cb.y, cb.z + cb.d, + cb.x, cb.y + cb.h, cb.z + cb.d + ); + double dist_5 = square_z_distance_to_camera( + cb.x, cb.y, cb.z, + cb.x + cb.w, cb.y, cb.z, + cb.x, cb.y + cb.h, cb.z + ); + + return maxd(maxd(dist_0, dist_1), maxd(maxd(dist_2, dist_3), maxd(dist_4, dist_5))); +} + +// ---------------------------------------------------------------------------------------------------------------------------------- // + void rotate_cube(double x0, double y0, double z0, double* rx, double* ry, double* rz, cube_0 cb) { // align pt to (0, 0, 0) double x = x0 - (cb.x + cb.w/2) ; @@ -605,13 +668,20 @@ void swap_ent(entity* arr, int i, int j) { arr[j] = temp; } -int multhz = 10.0 ; +double mult_x = 1.0 ; +double mult_y = 1.0 ; +double mult_z = 1.0 ; void insertionSort_cb(cube_0* arr, int len) { for(int k = 0; k < len; k++) { int j = k-1 ; while(j >= 0) { - if(distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, arr[j]) < distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, arr[j+1])) { + //if(distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, arr[j]) < distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, arr[j+1])) { + //if(distance_pt_cube_0_3d_max(camx, camy, camz, arr[j]) < distance_pt_cube_0_3d_max(camx, camy, camz, arr[j+1])) { + if( + distance_pt_cube_0_3d_max(camx, camy, camz, arr[j]) + distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, arr[j]) < + distance_pt_cube_0_3d_max(camx, camy, camz, arr[j+1]) + distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, arr[j+1])) { + //if(cube_z_distance_to_camera(arr[j]) < cube_z_distance_to_camera(arr[j+1])) { swap_cb(arr, j, j+1); j -= 1; } else { @@ -625,7 +695,11 @@ void insertionSort_tp(teleporter* arr, int len) { for(int k = 0; k < len; k++) { int j = k-1 ; while(j >= 0) { - if(distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, arr[j].hitbox) < distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, arr[j+1].hitbox)) { + //if(distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, arr[j].hitbox) < distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, arr[j+1].hitbox)) { + //if(distance_pt_cube_0_3d_max(camx, camy, camz, arr[j].hitbox) < distance_pt_cube_0_3d_max(camx, camy, camz, arr[j+1].hitbox)) { + if(distance_pt_cube_0_3d_max(camx, camy, camz, arr[j].hitbox) + distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, arr[j].hitbox) < + distance_pt_cube_0_3d_max(camx, camy, camz, arr[j+1].hitbox) + distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, arr[j+1].hitbox)) { + //if(cube_z_distance_to_camera(arr[j].hitbox) < cube_z_distance_to_camera(arr[j+1].hitbox)) { swap_tp(arr, j, j+1); j -= 1; } else { @@ -639,7 +713,11 @@ void insertionSort_ent(entity* arr, int len) { for(int k = 0; k < len; k++) { int j = k-1 ; while(j >= 0) { - if(distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, *(arr[j].pos)) < distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, *(arr[j+1].pos))) { + //if(distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, *(arr[j].pos)) < distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, *(arr[j+1].pos))) { + //if(distance_pt_cube_0_3d_max(camx, camy, camz, *(arr[j].pos)) < distance_pt_cube_0_3d_max(camx, camy, camz, *(arr[j+1].pos))) { + if(distance_pt_cube_0_3d_max(camx, camy, camz, *(arr[j].pos)) + distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, *(arr[j].pos)) < + distance_pt_cube_0_3d_max(camx, camy, camz, *(arr[j+1].pos)) + distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, *(arr[j+1].pos))) { + //if(cube_z_distance_to_camera(*(arr[j].pos)) < cube_z_distance_to_camera(*(arr[j+1].pos))) { swap_ent(arr, j, j+1); j -= 1; } else { @@ -653,71 +731,76 @@ void drawCurrentRoom(SDL_Renderer* renderer) { insertionSort_cb(current_room->map, current_room->map_size); insertionSort_tp(current_room->tps, current_room->tps_size); insertionSort_ent(current_room->ents, current_room->ent_len); - for(int k = 0; k < current_room->map_size; k++) { - drawFullCube(renderer, current_room->map[k]); - } - for(int k = 0; k < current_room->ent_len; k++) { - drawFullCube(renderer, *(current_room->ents[k].pos)); - } - for(int k = 0; k < current_room->tps_size; k++) { - drawFullCube(renderer, current_room->tps[k].hitbox); - } - /*int k_cb = 0 ; - int k_tp = 0 ; - int k_et = 0 ; + if(true || draw_type == 0) { + for(int k = 0; k < current_room->map_size; k++) { + drawFullCube(renderer, current_room->map[k]); + } + for(int k = 0; k < current_room->ent_len; k++) { + drawFullCube(renderer, *(current_room->ents[k].pos)); + } + for(int k = 0; k < current_room->tps_size; k++) { + drawFullCube(renderer, current_room->tps[k].hitbox); + } + } else if(draw_type == 1) { + int k_cb = 0 ; + int k_tp = 0 ; + int k_et = 0 ; - int updated = 1+2+4 ; + int updated = 1+2+4 ; - double dcb = -1.0 ; - double dtp = -1.0 ; - double det = -1.0 ; - while(k_cb < current_room->map_size || k_tp < current_room->tps_size || k_et < current_room->ent_len) { - if(updated == 7) { - if(k_et < current_room->ent_len) { - det = distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, *(current_room->ents[k_et].pos)); + double dcb = -1.0 ; + double dtp = -1.0 ; + double det = -1.0 ; + while(k_cb < current_room->map_size || k_tp < current_room->tps_size || k_et < current_room->ent_len) { + if(updated == 7) { + if(k_et < current_room->ent_len) { + det = distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, *(current_room->ents[k_et].pos)); + } + if(k_tp < current_room->tps_size) { + dtp = distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, current_room->tps[k_tp].hitbox); + } + if(k_cb < current_room->map_size) { + dcb = distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, current_room->map[k_cb]); + } + } else if((updated/4)%2 == 1) { + if(k_et < current_room->ent_len) { + det = distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, *(current_room->ents[k_et].pos)); + } else { + det = -1.0 ; + } + } else if((updated/2)%2 == 1) { + if(k_tp < current_room->tps_size) { + dtp = distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, current_room->tps[k_tp].hitbox); + } else { + dtp = -1.0 ; + } + } else if(updated%2 == 1) { + if(k_cb < current_room->map_size) { + dcb = distance_pt_cube_0_3d_weighted(camx, camy, camz, mult_x, mult_y, mult_z, current_room->map[k_cb]); + } else { + dcb = -1.0 ; + } } - if(k_tp < current_room->tps_size) { - dtp = distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, current_room->tps[k_tp].hitbox); + updated = 0 ; + double mn = maxd(maxd(dcb, dtp), det); + if(mn == dcb) { + drawFullCube(renderer, current_room->map[k_cb]); + updated += 1 ; + k_cb += 1; } - if(k_cb < current_room->map_size) { - dcb = distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, current_room->map[k_cb]); + if(mn == dtp) { + drawFullCube(renderer, current_room->tps[k_tp].hitbox); + updated += 2 ; + k_tp += 1; } - } else if((updated/4)%2 == 1) { - if(k_et < current_room->ent_len) { - det = distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, *(current_room->ents[k_et].pos)); - } else { - det = -1.0 ; - } - } else if((updated/2)%2 == 1) { - if(k_tp < current_room->tps_size) { - dtp = distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, current_room->tps[k_tp].hitbox); - } else { - dtp = -1.0 ; - } - } else if(updated%2 == 1) { - if(k_cb < current_room->map_size) { - dcb = distance_pt_cube_0_3d_weighted(camx, camy, camz, 1.0, multhz, 1.0, current_room->map[k_cb]); - } else { - dcb = -1.0 ; + if(mn == det) { + drawFullCube(renderer, *(current_room->ents[k_et].pos)); + updated += 4; + k_et += 1; } } - updated = 0 ; - double mn = maxd(maxd(dcb, dtp), det); - if(mn == dcb) { - drawFullCube(renderer, current_room->map[k_cb]); - updated += 1 ; - k_cb += 1; - } else if(mn == dtp) { - drawFullCube(renderer, current_room->tps[k_tp].hitbox); - updated += 2 ; - k_tp += 1; - } else { - drawFullCube(renderer, *(current_room->ents[k_et].pos)); - updated += 4; - k_et += 1; - } - }*/ + } } // -------------------------------------------------------------------------------------------------------------------------------- // diff --git a/src/display.h b/src/display.h index dd8a3f3..cba0a79 100644 --- a/src/display.h +++ b/src/display.h @@ -21,6 +21,15 @@ void drawCharToRenderer(SDL_Renderer* renderer, imgs data, char c, int X, int Y, void drawNumberToRenderer(SDL_Renderer* renderer, imgs data, int n, int X, int Y, int W, int H, int Woffset); void drawStringToRenderer(SDL_Renderer* renderer, imgs data, char* s, int X, int Y, int W, int H); +double pt_z_distance_to_camera(double x, double y, double z); +double segment_z_distance_to_camera(double x0, double y0, double z0, double x1, double y1, double z1); +double square_z_distance_to_camera( + double x0, double y0, double z0, + double x1, double y1, double z1, + double x2, double y2, double z2 +); +double cube_z_distance_to_camera(cube_0 cb); + void axialRotation_X0(double* y, double* z, double theta); void axialRotation_X(double* y, double* z, double theta, double cst_y, double cst_z); void axialRotation_Y0(double* x, double* z, double theta); diff --git a/src/move.c b/src/move.c index 8b76957..7915327 100644 --- a/src/move.c +++ b/src/move.c @@ -18,7 +18,7 @@ #include "move.h" // ---------------------------------------------------------------------------------------------------- // -double sensitivity = 0.22 ; +double sensitivity = 0.12 ; double fov = 90.0 ; double speed = 0.22 ; double min_dist = 0.7 ; @@ -33,6 +33,8 @@ double rot_vt ; double tan_fov ; +int draw_type ; + bool has_changed ; void init_csts() { @@ -41,6 +43,7 @@ void init_csts() { camz = 3.0 ; rot_hz = 0.0 ; rot_vt = 180.0 ; + draw_type = 0 ; tan_fov = tan((fov * 3.14159 / 180.0) / 2.0) ; } @@ -94,6 +97,7 @@ bool is_colliding(float dtime) { return false ; } +bool pass = true ; void playerActions(float dtime) { SDL_Event event; while(SDL_PollEvent(&event)) { @@ -168,6 +172,15 @@ void playerActions(float dtime) { } } + if(state[SDL_SCANCODE_SPACE] == 1) { + if(pass) { + pass = false ; + draw_type = (1+draw_type)%2 ; + } + } else { + pass = true ; + } + if(state[SDL_SCANCODE_T] == 1) { fprintf(stderr, "Killed.\n") ; exit(1) ; diff --git a/src/structure.h b/src/structure.h index 08bc903..20e7b6c 100644 --- a/src/structure.h +++ b/src/structure.h @@ -103,6 +103,8 @@ extern int player_chy ; extern int* drawOrder ; -extern int coins; +extern int coins ; + +extern int draw_type ; #endif \ No newline at end of file