1
0
Fork 0
mirror of https://git.coom.tech/drummyfish/raycastlib.git synced 2024-11-21 20:29:59 +01:00

Separate floor/ceil

This commit is contained in:
Miloslav Číž 2018-09-05 11:35:52 +02:00
parent cec0a63e85
commit fa68bd5fa5

View file

@ -178,8 +178,8 @@ Unit perspectiveScale(Unit originalSize, Unit distance);
void castRaysMultiHit(Camera cam, ArrayFunction arrayFunc, void castRaysMultiHit(Camera cam, ArrayFunction arrayFunc,
ColumnFunction columnFunc, RayConstraints constraints); ColumnFunction columnFunc, RayConstraints constraints);
void render(Camera cam, ArrayFunction arrayFunc, PixelFunction pixelFunc, void render(Camera cam, ArrayFunction floorHeightFunc, ArrayFunction
RayConstraints constraints); ceilingHeightFunc, PixelFunction pixelFunc, RayConstraints constraints);
//============================================================================= //=============================================================================
// privates // privates
@ -454,7 +454,7 @@ void castRayMultiHit(Ray ray, ArrayFunction arrayFunc, HitResult *hitResults,
*hitResultsLen = 0; *hitResultsLen = 0;
int16_t squareType = arrayFunc(currentSquare.x,currentSquare.y); Unit squareType = arrayFunc(currentSquare.x,currentSquare.y);
Vector2D no, co; // next cell offset, collision offset Vector2D no, co; // next cell offset, collision offset
@ -465,7 +465,7 @@ void castRayMultiHit(Ray ray, ArrayFunction arrayFunc, HitResult *hitResults,
for (uint16_t i = 0; i < constraints.maxSteps; ++i) for (uint16_t i = 0; i < constraints.maxSteps; ++i)
{ {
int16_t currentType = arrayFunc(currentSquare.x,currentSquare.y); Unit currentType = arrayFunc(currentSquare.x,currentSquare.y);
if (currentType != squareType) if (currentType != squareType)
{ {
@ -569,22 +569,35 @@ void castRaysMultiHit(Camera cam, ArrayFunction arrayFunc,
} }
} }
// global helper variables, for precomputing stuff etc.
PixelFunction _pixelFunction = 0; PixelFunction _pixelFunction = 0;
ArrayFunction _arrayFunction = 0;
Camera _camera; Camera _camera;
Unit _floorDepthStep = 0; Unit _floorDepthStep = 0;
Unit _startHeight = 0; Unit _startFloorHeight = 0;
Unit _startCeilHeight = 0;
int_maybe32_t _camResYLimit = 0; int_maybe32_t _camResYLimit = 0;
Unit _middleRow = 0; Unit _middleRow = 0;
ArrayFunction _floorFunction = 0;
ArrayFunction _ceilFunction = 0;
/// Helper function that determines intersection with both ceiling and floor.
Unit _floorCeilFunction(int16_t x, int16_t y)
{
// TODO: adjust also for RAYCAST_TINY
Unit f = _floorFunction(x,y);
Unit c = _ceilFunction(x,y);
return ((f & 0x0000ffff) << 16) | (c & 0x0000ffff);
}
void _columnFunction(HitResult *hits, uint16_t hitCount, uint16_t x, Ray ray) void _columnFunction(HitResult *hits, uint16_t hitCount, uint16_t x, Ray ray)
{ {
int_maybe32_t y = _camResYLimit; // screen y (for floor), will only go up int_maybe32_t y = _camResYLimit; // screen y (for floor), will only go up
int_maybe32_t y2 = 0; // screen y (for ceil), will only fo down int_maybe32_t y2 = 0; // screen y (for ceil), will only fo down
Unit worldZPrev = _startHeight; Unit worldZPrev = _startFloorHeight;
Unit worldZPrevCeil = Unit worldZPrevCeil = _startCeilHeight;
UNITS_PER_SQUARE * 5 - _startHeight - 2 * _camera.height;
PixelInfo p; PixelInfo p;
p.position.x = x; p.position.x = x;
@ -607,11 +620,12 @@ void _columnFunction(HitResult *hits, uint16_t hitCount, uint16_t x, Ray ray)
dist = dist == 0 ? 1 : dist; // prevent division by zero dist = dist == 0 ? 1 : dist; // prevent division by zero
Unit wallHeight = _arrayFunction(hit.square.x,hit.square.y); Unit wallHeight = _floorFunction(hit.square.x,hit.square.y);
Unit wallHeightCeil = _ceilFunction(hit.square.x,hit.square.y);
Unit worldZ2 = wallHeight - _camera.height; Unit worldZ2 = wallHeight - _camera.height;
Unit worldZ2Ceil = (UNITS_PER_SQUARE * 5 - wallHeight) - _camera.height; Unit worldZ2Ceil = wallHeightCeil - _camera.height;
int_maybe32_t z1Screen = _middleRow - perspectiveScale( int_maybe32_t z1Screen = _middleRow - perspectiveScale(
(worldZPrev * _camera.resolution.y) / UNITS_PER_SQUARE,dist); (worldZPrev * _camera.resolution.y) / UNITS_PER_SQUARE,dist);
@ -646,9 +660,6 @@ void _columnFunction(HitResult *hits, uint16_t hitCount, uint16_t x, Ray ray)
int_maybe32_t zBottomCeil = z1ScreenCeil > z2ScreenCeil ? int_maybe32_t zBottomCeil = z1ScreenCeil > z2ScreenCeil ?
z1ScreenCeil : z2ScreenCeil; z1ScreenCeil : z2ScreenCeil;
//if (x == 26)
// printf("%d %d %d %d\n",z1Screen,z2Screen,z1ScreenCeil,z2ScreenCeil);
if (zTop <= zBottomCeil) if (zTop <= zBottomCeil)
zBottomCeil = zTop; // walls on ceiling and floor met zBottomCeil = zTop; // walls on ceiling and floor met
@ -746,23 +757,28 @@ void _columnFunction(HitResult *hits, uint16_t hitCount, uint16_t x, Ray ray)
#undef VERTICAL_DEPTH_MULTIPLY #undef VERTICAL_DEPTH_MULTIPLY
} }
void render(Camera cam, ArrayFunction arrayFunc, PixelFunction pixelFunc, void render(Camera cam, ArrayFunction floorHeightFunc, ArrayFunction
RayConstraints constraints) ceilingHeightFunc, PixelFunction pixelFunc, RayConstraints constraints)
{ {
_pixelFunction = pixelFunc; _pixelFunction = pixelFunc;
_arrayFunction = arrayFunc; _floorFunction = floorHeightFunc;
_ceilFunction = ceilingHeightFunc;
_camera = cam; _camera = cam;
_camResYLimit = cam.resolution.y - 1; _camResYLimit = cam.resolution.y - 1;
_middleRow = cam.resolution.y / 2; _middleRow = cam.resolution.y / 2;
_startHeight = arrayFunc( _startFloorHeight = floorHeightFunc(
divRoundDown(cam.position.x,UNITS_PER_SQUARE),
divRoundDown(cam.position.y,UNITS_PER_SQUARE)) -1 * cam.height;
_startCeilHeight = ceilingHeightFunc(
divRoundDown(cam.position.x,UNITS_PER_SQUARE), divRoundDown(cam.position.x,UNITS_PER_SQUARE),
divRoundDown(cam.position.y,UNITS_PER_SQUARE)) -1 * cam.height; divRoundDown(cam.position.y,UNITS_PER_SQUARE)) -1 * cam.height;
// TODO // TODO
_floorDepthStep = (12 * UNITS_PER_SQUARE) / cam.resolution.y; _floorDepthStep = (12 * UNITS_PER_SQUARE) / cam.resolution.y;
castRaysMultiHit(cam,arrayFunc,_columnFunction,constraints); castRaysMultiHit(cam,_floorCeilFunction,_columnFunction,constraints);
} }
Vector2D normalize(Vector2D v) Vector2D normalize(Vector2D v)