1
0
Fork 0
mirror of https://git.coom.tech/drummyfish/raycastlib.git synced 2024-11-23 20:49:57 +01:00

Fix collision bug

This commit is contained in:
Miloslav Číž 2018-09-08 17:55:46 +02:00
parent 32ddbca34c
commit 39f8b99cf3

View file

@ -989,7 +989,6 @@ void moveCameraWithCollision(Camera *camera, Vector2D planeOffset,
// TODO: have the cam coll parameters precomputed as macros? => faster // TODO: have the cam coll parameters precomputed as macros? => faster
int8_t movesInPlane = planeOffset.x != 0 || planeOffset.y != 0; int8_t movesInPlane = planeOffset.x != 0 || planeOffset.y != 0;
int16_t xSquareNew, ySquareNew; int16_t xSquareNew, ySquareNew;
if (movesInPlane) if (movesInPlane)
@ -1087,17 +1086,44 @@ void moveCameraWithCollision(Camera *camera, Vector2D planeOffset,
if (movesInPlane || heightOffset != 0) if (movesInPlane || heightOffset != 0)
{ {
camera->height += heightOffset; camera->height += heightOffset;
xSquareNew = divRoundDown(camera->position.x,UNITS_PER_SQUARE);
ySquareNew = divRoundDown(camera->position.y,UNITS_PER_SQUARE);
Unit floorHeightNew = floorHeightFunc(xSquareNew,ySquareNew); int16_t xSquare1 =
Unit ceilingHeightNew = ceilingHeightFunc != 0 ? divRoundDown(camera->position.x - CAMERA_COLL_RADIUS,UNITS_PER_SQUARE);
int16_t xSquare2 =
divRoundDown(camera->position.x + CAMERA_COLL_RADIUS,UNITS_PER_SQUARE);
int16_t ySquare1 =
divRoundDown(camera->position.y - CAMERA_COLL_RADIUS,UNITS_PER_SQUARE);
int16_t ySquare2 =
divRoundDown(camera->position.y + CAMERA_COLL_RADIUS,UNITS_PER_SQUARE);
Unit bottomLimit = floorHeightFunc(xSquare1,ySquare1);
Unit height;
if (xSquare2 != xSquare1)
{
height = floorHeightFunc(xSquare2,ySquare1);
bottomLimit = bottomLimit < height ? height : bottomLimit;
}
if (ySquare2 != ySquare1)
{
height = floorHeightFunc(xSquare1,ySquare2);
bottomLimit = bottomLimit < height ? height : bottomLimit;
}
if (xSquare2 != xSquare1 && ySquare2 != ySquare1)
{
height = floorHeightFunc(xSquare2,ySquare2);
bottomLimit = bottomLimit < height ? height : bottomLimit;
}
Unit topLimit = ceilingHeightFunc != 0 ?
ceilingHeightFunc(xSquareNew,ySquareNew) : UNIT_INFINITY; ceilingHeightFunc(xSquareNew,ySquareNew) : UNIT_INFINITY;
camera->height = clamp(camera->height, camera->height = clamp(camera->height,
floorHeightNew + CAMERA_COLL_HEIGHT_BELOW, bottomLimit + CAMERA_COLL_HEIGHT_BELOW,
ceilingHeightNew - CAMERA_COLL_HEIGHT_ABOVE); topLimit - CAMERA_COLL_HEIGHT_ABOVE);
} }
} }