switched distance calculation to ||.||_2
This commit is contained in:
parent
1fe7b14d86
commit
e161db3807
BIN
obj/base.o
BIN
obj/base.o
Binary file not shown.
BIN
obj/display.o
BIN
obj/display.o
Binary file not shown.
BIN
obj/entities.o
BIN
obj/entities.o
Binary file not shown.
BIN
obj/main.o
BIN
obj/main.o
Binary file not shown.
BIN
obj/move.o
BIN
obj/move.o
Binary file not shown.
23
src/base.c
23
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) {
|
double distance_pt_cube_axis(double coord, double begin, double end) {
|
||||||
if(coord < begin) {
|
if(coord < begin) {
|
||||||
return (begin-coord);
|
return (begin);
|
||||||
} else if(coord > end) {
|
} else if(coord > end) {
|
||||||
return (coord-end);
|
return (end);
|
||||||
} else {
|
} else {
|
||||||
return 0.0;
|
return (coord);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
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 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);
|
||||||
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 sqrt((x0-clx)*(x0-clx) + (y0-cly)*(y0-cly) + (z0-clz)*(z0-clz));
|
||||||
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) {
|
double distance_pt_cube_0_3d(double x0, double y0, double z0, cube_0* c) {
|
||||||
|
|
|
@ -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_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_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_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_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 remove_entity(entity** arr, int* memlen, int* len, int index);
|
||||||
void add_entity(entity** arr, int* memlen, int* len, entity* ent);
|
void add_entity(entity** arr, int* memlen, int* len, entity* ent);
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,8 @@ void gl_renderTriangle(unsigned int shaderProgram, unsigned int VAO, unsigned in
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
double near = 0.4 ;
|
//double near = 0.4 ;
|
||||||
|
double near = 0.0 ;
|
||||||
double far = 10.0 ;
|
double far = 10.0 ;
|
||||||
|
|
||||||
double top = 1.0 ;
|
double top = 1.0 ;
|
||||||
|
|
|
@ -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 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 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)));
|
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);
|
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) {
|
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) {
|
||||||
|
|
|
@ -342,7 +342,7 @@ int main_alt() {
|
||||||
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
|
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
processInput(window, delta);
|
processInput(window, delta);
|
||||||
movePlayerG(deltad);
|
movePlayerG(delta);
|
||||||
teleport_on_edge();
|
teleport_on_edge();
|
||||||
update_entities(delta);
|
update_entities(delta);
|
||||||
updateProj(delta);
|
updateProj(delta);
|
||||||
|
|
65
src/move.c
65
src/move.c
|
@ -21,7 +21,7 @@ double fov = 90.0;
|
||||||
double creative_speed = 0.3;
|
double creative_speed = 0.3;
|
||||||
double speed = 8.0;
|
double speed = 8.0;
|
||||||
double vtmult = 1.5;
|
double vtmult = 1.5;
|
||||||
double min_dist = 0.7;
|
double min_dist = 0.1;
|
||||||
double friction = 0.8;
|
double friction = 0.8;
|
||||||
double gravity_factor = 9.8;
|
double gravity_factor = 9.8;
|
||||||
// ---------------------------------------------------------------------------------------------------- //
|
// ---------------------------------------------------------------------------------------------------- //
|
||||||
|
@ -56,6 +56,8 @@ int collisionVal = 0;
|
||||||
double room_width;
|
double room_width;
|
||||||
double room_depth;
|
double room_depth;
|
||||||
|
|
||||||
|
double sq2;
|
||||||
|
|
||||||
void init_csts() {
|
void init_csts() {
|
||||||
camx = 2.0;
|
camx = 2.0;
|
||||||
camy = 5.0;
|
camy = 5.0;
|
||||||
|
@ -70,6 +72,7 @@ void init_csts() {
|
||||||
fade_dmg = 0;
|
fade_dmg = 0;
|
||||||
room_width = 16.0;
|
room_width = 16.0;
|
||||||
room_depth = 16.0;
|
room_depth = 16.0;
|
||||||
|
sq2 = sqrt(2);
|
||||||
stop_evetything = false;
|
stop_evetything = false;
|
||||||
tan_fov = tan((fov * 3.14159 / 180.0) / 2.0);
|
tan_fov = tan((fov * 3.14159 / 180.0) / 2.0);
|
||||||
}
|
}
|
||||||
|
@ -93,26 +96,26 @@ pt_2d normal;
|
||||||
double p1, p2, p3;
|
double p1, p2, p3;
|
||||||
void getSF(cube_0* cb, int sf) {
|
void getSF(cube_0* cb, int sf) {
|
||||||
if(sf == 0 || sf == 1) {
|
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);
|
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};
|
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);
|
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};
|
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);
|
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};
|
surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3};
|
||||||
} else if(sf == 2 || sf == 3) {
|
} 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);
|
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};
|
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);
|
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};
|
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);
|
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};
|
surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3};
|
||||||
} else {
|
} else {
|
||||||
project_to_cube(cb->x -(min_dist*0), cb->y -(min_dist*0), cb->z + cb->d*(sf==4), &p1, &p2, &p3, cb);
|
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};
|
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);
|
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};
|
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);
|
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};
|
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) {
|
void updateF(cube_0* cb, double dtime) {
|
||||||
for(int d = 0; d < 6; d++) {
|
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);
|
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();
|
getDirectors();
|
||||||
getNormal();
|
getNormal();
|
||||||
if(d%2==1) {
|
if(d%2==1) {
|
||||||
|
@ -153,10 +160,10 @@ void updateF(cube_0* cb, double dtime) {
|
||||||
normalize(&vtdt);
|
normalize(&vtdt);
|
||||||
normalize(&vt);
|
normalize(&vt);
|
||||||
if(
|
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 normv = sqrt(camvx*camvx + camvy*camvy + camvz*camvz);
|
||||||
|
|
||||||
double alpha = acos(dot3D(normal, (pt_2d){.x = camvx, .y = camvy, .z = camvz})/normv);
|
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++) {
|
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(camx, camy, camz, current_room->ents[k]->pos);
|
||||||
if(dist <= min_dist) {
|
if(dist <= min_dist) {
|
||||||
if(updateForces) {
|
|
||||||
updateF(current_room->ents[k]->pos, (double)dtime);
|
|
||||||
}
|
|
||||||
if(current_room->ents[k]->onHit != NULL) {
|
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)));
|
(*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) {
|
if(*(current_room->ents[k]->hitpoints) <= 0) {
|
||||||
|
@ -211,6 +215,10 @@ bool is_colliding(float dtime) {
|
||||||
(*current_room->ents[k]->onDeath)(dtime);
|
(*current_room->ents[k]->onDeath)(dtime);
|
||||||
}
|
}
|
||||||
remove_entity(current_room->ents, ¤t_room->ent_memlen, ¤t_room->ent_len, k);
|
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;
|
return true;
|
||||||
|
@ -219,7 +227,7 @@ bool is_colliding(float dtime) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void movePlayerG(double dtime) {
|
void movePlayerG(float dtime) {
|
||||||
updateForces = true;
|
updateForces = true;
|
||||||
fx = 0.0;
|
fx = 0.0;
|
||||||
fy = 0.0;
|
fy = 0.0;
|
||||||
|
@ -234,9 +242,8 @@ void movePlayerG(double dtime) {
|
||||||
camy += dely;
|
camy += dely;
|
||||||
camz += delz;
|
camz += delz;
|
||||||
if(is_colliding(dtime)) {
|
if(is_colliding(dtime)) {
|
||||||
//camvx = 0.0;
|
printf("HIT\n");
|
||||||
//camvy = 0.0;
|
//printf("[%lf, %lf, %lf]\n{%lf, %lf, %lf}\n\n", fx, fy, fz, camvx, camvy, camvz);
|
||||||
//camvz = 0.0;
|
|
||||||
}
|
}
|
||||||
camx -= delx;
|
camx -= delx;
|
||||||
camy -= dely;
|
camy -= dely;
|
||||||
|
|
|
@ -5,6 +5,6 @@ void init_csts();
|
||||||
bool is_colliding(float dtime);
|
bool is_colliding(float dtime);
|
||||||
|
|
||||||
void teleport_on_edge();
|
void teleport_on_edge();
|
||||||
void movePlayerG(double dtime);
|
void movePlayerG(float dtime);
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Reference in New Issue