mirror of
https://git.coom.tech/drummyfish/raycastlib.git
synced 2024-11-21 20:29:59 +01:00
Add more settings
This commit is contained in:
parent
912b86a27d
commit
c7bbf667ca
1 changed files with 45 additions and 15 deletions
60
raycastlib.h
60
raycastlib.h
|
@ -70,6 +70,17 @@
|
||||||
2: octagonal approximation (LQ) */
|
2: octagonal approximation (LQ) */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef RCL_COMPUTE_FLOOR_DEPTH
|
||||||
|
#define RCL_COMPUTE_FLOOR_DEPTH 1 /**< Whether depth should be computed for
|
||||||
|
floor pixels - turns this off if not
|
||||||
|
needed. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef RCL_COMPUTE_CEILING_DEPTH
|
||||||
|
#define RCL_COMPUTE_CEILING_DEPTH 1 /**< AS RCL_COMPUTE_FLOOR_DEPTH but for
|
||||||
|
ceiling. */
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef RCL_ROLL_TEXTURE_COORDS
|
#ifndef RCL_ROLL_TEXTURE_COORDS
|
||||||
#define RCL_ROLL_TEXTURE_COORDS 1 /**< Says whether rolling doors should also
|
#define RCL_ROLL_TEXTURE_COORDS 1 /**< Says whether rolling doors should also
|
||||||
roll the texture coordinates along (mostly
|
roll the texture coordinates along (mostly
|
||||||
|
@ -308,7 +319,8 @@ void RCL_castRaysMultiHit(RCL_Camera cam, RCL_ArrayFunction arrayFunc,
|
||||||
RCL_RayConstraints constraints);
|
RCL_RayConstraints constraints);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Using provided functions, renders a complete complex camera view.
|
Using provided functions, renders a complete complex (multilevel) camera
|
||||||
|
view.
|
||||||
|
|
||||||
This function should render each screen pixel exactly once.
|
This function should render each screen pixel exactly once.
|
||||||
|
|
||||||
|
@ -333,16 +345,14 @@ void RCL_castRaysMultiHit(RCL_Camera cam, RCL_ArrayFunction arrayFunc,
|
||||||
@param pixelFunc callback function to draw a single pixel on screen
|
@param pixelFunc callback function to draw a single pixel on screen
|
||||||
@param constraints constraints for each cast ray
|
@param constraints constraints for each cast ray
|
||||||
*/
|
*/
|
||||||
void RCL_render(RCL_Camera cam, RCL_ArrayFunction floorHeightFunc,
|
void RCL_renderComplex(RCL_Camera cam, RCL_ArrayFunction floorHeightFunc,
|
||||||
RCL_ArrayFunction ceilingHeightFunc, RCL_ArrayFunction typeFunction,
|
RCL_ArrayFunction ceilingHeightFunc, RCL_ArrayFunction typeFunction,
|
||||||
RCL_RayConstraints constraints);
|
RCL_RayConstraints constraints);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Renders given camera view, with help of provided functions. This function is
|
Renders given camera view, with help of provided functions. This function is
|
||||||
simpler and faster than RCL_render(...) and is meant to be rendering scenes
|
simpler and faster than RCL_renderComplex(...) and is meant to be rendering
|
||||||
with simple 1-intersection raycasting. The RCL_render(...) function can give
|
flat levels.
|
||||||
more accurate results than this function, so it's to be considered even for
|
|
||||||
simple scenes.
|
|
||||||
|
|
||||||
function rendering summary:
|
function rendering summary:
|
||||||
- performance: faster
|
- performance: faster
|
||||||
|
@ -949,7 +959,7 @@ RCL_Unit RCL_adjustDistance(RCL_Unit distance, RCL_Camera *camera,
|
||||||
// ^ prevent division by zero
|
// ^ prevent division by zero
|
||||||
}
|
}
|
||||||
|
|
||||||
void _columnFunction(RCL_HitResult *hits, uint16_t hitCount, uint16_t x,
|
void _columnFunctionComplex(RCL_HitResult *hits, uint16_t hitCount, uint16_t x,
|
||||||
RCL_Ray ray)
|
RCL_Ray ray)
|
||||||
{
|
{
|
||||||
// last written Y position, can never go backwards
|
// last written Y position, can never go backwards
|
||||||
|
@ -1016,13 +1026,15 @@ void _columnFunction(RCL_HitResult *hits, uint16_t hitCount, uint16_t x,
|
||||||
|
|
||||||
#define VERTICAL_DEPTH_MULTIPLY 2
|
#define VERTICAL_DEPTH_MULTIPLY 2
|
||||||
|
|
||||||
#define drawHorizontal(pref,l1,l2,comp,inc)\
|
#define drawHorizontal(pref,l1,l2,comp,inc,compDepth)\
|
||||||
p.depth += RCL_absVal(pref##Z1World) * VERTICAL_DEPTH_MULTIPLY;\
|
if (compDepth)\
|
||||||
|
p.depth += RCL_absVal(pref##Z1World) * VERTICAL_DEPTH_MULTIPLY;\
|
||||||
limit = RCL_clamp(pref##Z1Screen,l1,l2);\
|
limit = RCL_clamp(pref##Z1Screen,l1,l2);\
|
||||||
for (i = pref##PosY inc 1; i comp##= limit; inc##inc i)\
|
for (i = pref##PosY inc 1; i comp##= limit; inc##inc i)\
|
||||||
{\
|
{\
|
||||||
p.position.y = i;\
|
p.position.y = i;\
|
||||||
p.depth += _RCL_horizontalDepthStep;\
|
if (compDepth)\
|
||||||
|
p.depth += _RCL_horizontalDepthStep;\
|
||||||
RCL_PIXEL_FUNCTION(&p);\
|
RCL_PIXEL_FUNCTION(&p);\
|
||||||
}\
|
}\
|
||||||
if (pref##PosY comp limit)\
|
if (pref##PosY comp limit)\
|
||||||
|
@ -1033,17 +1045,27 @@ void _columnFunction(RCL_HitResult *hits, uint16_t hitCount, uint16_t x,
|
||||||
|
|
||||||
// draw floor until wall
|
// draw floor until wall
|
||||||
p.isFloor = 1;
|
p.isFloor = 1;
|
||||||
|
|
||||||
|
#if RCL_COMPUTE_FLOOR_DEPTH == 1
|
||||||
p.depth = (_RCL_fHorizontalDepthStart - fPosY) * _RCL_horizontalDepthStep;
|
p.depth = (_RCL_fHorizontalDepthStart - fPosY) * _RCL_horizontalDepthStep;
|
||||||
drawHorizontal(f,cPosY + 1,_RCL_camera.resolution.y,>,-)
|
#else
|
||||||
// ^ purposfully allow outside screen bounds here
|
p.depth = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
drawHorizontal(f,cPosY + 1,_RCL_camera.resolution.y,>,-,
|
||||||
|
RCL_COMPUTE_FLOOR_DEPTH) // ^ purposfully allow outside screen bounds
|
||||||
|
|
||||||
if (_RCL_ceilFunction != 0 || drawingHorizon)
|
if (_RCL_ceilFunction != 0 || drawingHorizon)
|
||||||
{
|
{
|
||||||
// draw ceiling until wall
|
// draw ceiling until wall
|
||||||
p.isFloor = 0;
|
p.isFloor = 0;
|
||||||
|
|
||||||
|
#if RCL_COMPUTE_CEILING_DEPTH == 1
|
||||||
p.depth = (cPosY - _RCL_cHorizontalDepthStart) *
|
p.depth = (cPosY - _RCL_cHorizontalDepthStart) *
|
||||||
_RCL_horizontalDepthStep;
|
_RCL_horizontalDepthStep;
|
||||||
drawHorizontal(c,-1,fPosY - 1,<,+)
|
#endif
|
||||||
|
|
||||||
|
drawHorizontal(c,-1,fPosY - 1,<,+,RCL_COMPUTE_CEILING_DEPTH)
|
||||||
// ^ purposfully allow outside screen bounds here
|
// ^ purposfully allow outside screen bounds here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1228,7 +1250,10 @@ void _columnFunctionSimple(RCL_HitResult *hits, uint16_t hitCount, uint16_t x,
|
||||||
p.position.y = y;
|
p.position.y = y;
|
||||||
RCL_PIXEL_FUNCTION(&p);
|
RCL_PIXEL_FUNCTION(&p);
|
||||||
++y;
|
++y;
|
||||||
|
|
||||||
|
#if RCL_COMPUTE_CEILING_DEPTH == 1
|
||||||
p.depth += _RCL_horizontalDepthStep;
|
p.depth += _RCL_horizontalDepthStep;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// draw wall
|
// draw wall
|
||||||
|
@ -1284,7 +1309,10 @@ RCL_Unit coordStep = 1;
|
||||||
// draw floor
|
// draw floor
|
||||||
|
|
||||||
p.isWall = 0;
|
p.isWall = 0;
|
||||||
|
|
||||||
|
#if RCL_COMPUTE_FLOOR_DEPTH == 1
|
||||||
p.depth = (_RCL_camera.resolution.y - y) * _RCL_horizontalDepthStep + 1;
|
p.depth = (_RCL_camera.resolution.y - y) * _RCL_horizontalDepthStep + 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if RCL_COMPUTE_FLOOR_TEXCOORDS == 1
|
#if RCL_COMPUTE_FLOOR_TEXCOORDS == 1
|
||||||
RCL_Unit dx = p.hit.position.x - _RCL_camera.position.x;
|
RCL_Unit dx = p.hit.position.x - _RCL_camera.position.x;
|
||||||
|
@ -1315,14 +1343,16 @@ RCL_Unit coordStep = 1;
|
||||||
|
|
||||||
++y;
|
++y;
|
||||||
|
|
||||||
|
#if RCL_COMPUTE_FLOOR_DEPTH == 1
|
||||||
p.depth -= _RCL_horizontalDepthStep;
|
p.depth -= _RCL_horizontalDepthStep;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (p.depth < 0) // just in case
|
if (p.depth < 0) // just in case
|
||||||
p.depth = 0;
|
p.depth = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RCL_render(RCL_Camera cam, RCL_ArrayFunction floorHeightFunc,
|
void RCL_renderComplex(RCL_Camera cam, RCL_ArrayFunction floorHeightFunc,
|
||||||
RCL_ArrayFunction ceilingHeightFunc, RCL_ArrayFunction typeFunction,
|
RCL_ArrayFunction ceilingHeightFunc, RCL_ArrayFunction typeFunction,
|
||||||
RCL_RayConstraints constraints)
|
RCL_RayConstraints constraints)
|
||||||
{
|
{
|
||||||
|
@ -1352,7 +1382,7 @@ void RCL_render(RCL_Camera cam, RCL_ArrayFunction floorHeightFunc,
|
||||||
_RCL_horizontalDepthStep = HORIZON_DEPTH / cam.resolution.y;
|
_RCL_horizontalDepthStep = HORIZON_DEPTH / cam.resolution.y;
|
||||||
|
|
||||||
RCL_castRaysMultiHit(cam,_floorCeilFunction,typeFunction,
|
RCL_castRaysMultiHit(cam,_floorCeilFunction,typeFunction,
|
||||||
_columnFunction,constraints);
|
_columnFunctionComplex,constraints);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RCL_renderSimple(RCL_Camera cam, RCL_ArrayFunction floorHeightFunc,
|
void RCL_renderSimple(RCL_Camera cam, RCL_ArrayFunction floorHeightFunc,
|
||||||
|
|
Loading…
Reference in a new issue