summaryrefslogtreecommitdiff
path: root/src/collision.cpp
diff options
context:
space:
mode:
authorSmallJoker <SmallJoker@users.noreply.github.com>2019-06-10 13:00:35 +0200
committerGitHub <noreply@github.com>2019-06-10 13:00:35 +0200
commite40be619f2a30c7a4d5042d922f0fe57539411d5 (patch)
treedfa1bf7dd18f15e2fe3053d88b64dbb99b1ab03c /src/collision.cpp
parentbd6f1cca9dc357a6dbd54e86b3f575282daf6e1e (diff)
downloadminetest-e40be619f2a30c7a4d5042d922f0fe57539411d5.tar.gz
minetest-e40be619f2a30c7a4d5042d922f0fe57539411d5.tar.bz2
minetest-e40be619f2a30c7a4d5042d922f0fe57539411d5.zip
Add disable_jump to liquids and ladders (#7688)
Remove second nodedef check by improving the colliding node detection Also remove the 2nd check in old_move, correct standing node a bit
Diffstat (limited to 'src/collision.cpp')
-rw-r--r--src/collision.cpp49
1 files changed, 25 insertions, 24 deletions
diff --git a/src/collision.cpp b/src/collision.cpp
index a07899e65..b36cc89b0 100644
--- a/src/collision.cpp
+++ b/src/collision.cpp
@@ -59,7 +59,7 @@ struct NearbyCollisionInfo {
// Checks for collision of a moving aabbox with a static aabbox
// Returns -1 if no collision, 0 if X collision, 1 if Y collision, 2 if Z collision
// The time after which the collision occurs is stored in dtime.
-int axisAlignedCollision(
+CollisionAxis axisAlignedCollision(
const aabb3f &staticbox, const aabb3f &movingbox,
const v3f &speed, f32 d, f32 *dtime)
{
@@ -86,11 +86,11 @@ int axisAlignedCollision(
(relbox.MaxEdge.Y + speed.Y * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * (*dtime) < zsize) &&
(relbox.MaxEdge.Z + speed.Z * (*dtime) > COLL_ZERO))
- return 0;
+ return COLLISION_AXIS_X;
}
else if(relbox.MinEdge.X > xsize)
{
- return -1;
+ return COLLISION_AXIS_NONE;
}
}
else if(speed.X < 0) // Check for collision with X+ plane
@@ -101,11 +101,11 @@ int axisAlignedCollision(
(relbox.MaxEdge.Y + speed.Y * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * (*dtime) < zsize) &&
(relbox.MaxEdge.Z + speed.Z * (*dtime) > COLL_ZERO))
- return 0;
+ return COLLISION_AXIS_X;
}
else if(relbox.MaxEdge.X < 0)
{
- return -1;
+ return COLLISION_AXIS_NONE;
}
}
@@ -119,11 +119,11 @@ int axisAlignedCollision(
(relbox.MaxEdge.X + speed.X * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * (*dtime) < zsize) &&
(relbox.MaxEdge.Z + speed.Z * (*dtime) > COLL_ZERO))
- return 1;
+ return COLLISION_AXIS_Y;
}
else if(relbox.MinEdge.Y > ysize)
{
- return -1;
+ return COLLISION_AXIS_NONE;
}
}
else if(speed.Y < 0) // Check for collision with Y+ plane
@@ -134,11 +134,11 @@ int axisAlignedCollision(
(relbox.MaxEdge.X + speed.X * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Z + speed.Z * (*dtime) < zsize) &&
(relbox.MaxEdge.Z + speed.Z * (*dtime) > COLL_ZERO))
- return 1;
+ return COLLISION_AXIS_Y;
}
else if(relbox.MaxEdge.Y < 0)
{
- return -1;
+ return COLLISION_AXIS_NONE;
}
}
@@ -152,11 +152,11 @@ int axisAlignedCollision(
(relbox.MaxEdge.X + speed.X * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Y + speed.Y * (*dtime) < ysize) &&
(relbox.MaxEdge.Y + speed.Y * (*dtime) > COLL_ZERO))
- return 2;
+ return COLLISION_AXIS_Z;
}
//else if(relbox.MinEdge.Z > zsize)
//{
- // return -1;
+ // return COLLISION_AXIS_NONE;
//}
}
else if(speed.Z < 0) // Check for collision with Z+ plane
@@ -167,15 +167,15 @@ int axisAlignedCollision(
(relbox.MaxEdge.X + speed.X * (*dtime) > COLL_ZERO) &&
(relbox.MinEdge.Y + speed.Y * (*dtime) < ysize) &&
(relbox.MaxEdge.Y + speed.Y * (*dtime) > COLL_ZERO))
- return 2;
+ return COLLISION_AXIS_Z;
}
//else if(relbox.MaxEdge.Z < 0)
//{
- // return -1;
+ // return COLLISION_AXIS_NONE;
//}
}
- return -1;
+ return COLLISION_AXIS_NONE;
}
// Helper function:
@@ -442,7 +442,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
movingbox.MinEdge += *pos_f;
movingbox.MaxEdge += *pos_f;
- int nearest_collided = -1;
+ CollisionAxis nearest_collided = COLLISION_AXIS_NONE;
f32 nearest_dtime = dtime;
int nearest_boxindex = -1;
@@ -457,7 +457,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
// Find nearest collision of the two boxes (raytracing-like)
f32 dtime_tmp;
- int collided = axisAlignedCollision(box_info.box,
+ CollisionAxis collided = axisAlignedCollision(box_info.box,
movingbox, *speed_f, d, &dtime_tmp);
if (collided == -1 || dtime_tmp >= nearest_dtime)
@@ -468,7 +468,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
nearest_boxindex = boxindex;
}
- if (nearest_collided == -1) {
+ if (nearest_collided == COLLISION_AXIS_NONE) {
// No collision with any collision box.
*pos_f += *speed_f * dtime;
dtime = 0; // Set to 0 to avoid "infinite" loop due to small FP numbers
@@ -477,7 +477,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
NearbyCollisionInfo &nearest_info = cinfo[nearest_boxindex];
const aabb3f& cbox = nearest_info.box;
// Check for stairs.
- bool step_up = (nearest_collided != 1) && // must not be Y direction
+ bool step_up = (nearest_collided != COLLISION_AXIS_Y) && // must not be Y direction
(movingbox.MinEdge.Y < cbox.MaxEdge.Y) &&
(movingbox.MinEdge.Y + stepheight > cbox.MaxEdge.Y) &&
(!wouldCollideWithCeiling(cinfo, movingbox,
@@ -491,11 +491,11 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
if (nearest_dtime < 0) {
// Handle negative nearest_dtime (can be caused by the d allowance)
if (!step_up) {
- if (nearest_collided == 0)
+ if (nearest_collided == COLLISION_AXIS_X)
pos_f->X += speed_f->X * nearest_dtime;
- if (nearest_collided == 1)
+ if (nearest_collided == COLLISION_AXIS_Y)
pos_f->Y += speed_f->Y * nearest_dtime;
- if (nearest_collided == 2)
+ if (nearest_collided == COLLISION_AXIS_Z)
pos_f->Z += speed_f->Z * nearest_dtime;
}
} else {
@@ -522,19 +522,19 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
// Special case: Handle stairs
nearest_info.is_step_up = true;
is_collision = false;
- } else if (nearest_collided == 0) { // X
+ } else if (nearest_collided == COLLISION_AXIS_X) {
if (fabs(speed_f->X) > BS * 3)
speed_f->X *= bounce;
else
speed_f->X = 0;
result.collides = true;
- } else if (nearest_collided == 1) { // Y
+ } else if (nearest_collided == COLLISION_AXIS_Y) {
if(fabs(speed_f->Y) > BS * 3)
speed_f->Y *= bounce;
else
speed_f->Y = 0;
result.collides = true;
- } else if (nearest_collided == 2) { // Z
+ } else if (nearest_collided == COLLISION_AXIS_Z) {
if (fabs(speed_f->Z) > BS * 3)
speed_f->Z *= bounce;
else
@@ -547,6 +547,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
is_collision = false;
if (is_collision) {
+ info.axis = nearest_collided;
result.collisions.push_back(info);
}
}