mirror of
https://git.coom.tech/drummyfish/raycastlib.git
synced 2024-11-21 20:29:59 +01:00
Add mapping function
This commit is contained in:
parent
695f921c2d
commit
12cfd9f0fb
1 changed files with 54 additions and 0 deletions
54
raycastlib.h
54
raycastlib.h
|
@ -126,6 +126,11 @@ typedef void
|
||||||
*/
|
*/
|
||||||
HitResult castRay(Ray ray, ArrayFunction arrayFunc);
|
HitResult castRay(Ray ray, ArrayFunction arrayFunc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Maps a single point in the world to the screen (2D position + depth).
|
||||||
|
*/
|
||||||
|
PixelInfo mapToScreen(Vector2D worldPosition, Unit height, Camera camera);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Casts a single ray and returns a list of collisions.
|
Casts a single ray and returns a list of collisions.
|
||||||
*/
|
*/
|
||||||
|
@ -753,6 +758,52 @@ Unit vectorsAngleCos(Vector2D v1, Vector2D v2)
|
||||||
return (v1.x * v2.x + v1.y * v2.y) / UNITS_PER_SQUARE;
|
return (v1.x * v2.x + v1.y * v2.y) / UNITS_PER_SQUARE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PixelInfo mapToScreen(Vector2D worldPosition, Unit height, Camera camera)
|
||||||
|
{
|
||||||
|
// TODO: precompute some stuff that's constant in the frame
|
||||||
|
|
||||||
|
PixelInfo result;
|
||||||
|
|
||||||
|
Unit d = dist(worldPosition,camera.position);
|
||||||
|
|
||||||
|
Vector2D toPoint;
|
||||||
|
|
||||||
|
toPoint.x = worldPosition.x - camera.position.x;
|
||||||
|
toPoint.y = worldPosition.y - camera.position.y;
|
||||||
|
|
||||||
|
Vector2D cameraDir = angleToDirection(camera.direction);
|
||||||
|
|
||||||
|
result.depth = // adjusted distance
|
||||||
|
(d * vectorsAngleCos(cameraDir,toPoint)) / UNITS_PER_SQUARE;
|
||||||
|
|
||||||
|
result.position.y = camera.resolution.y / 2 -
|
||||||
|
(camera.resolution.y *
|
||||||
|
perspectiveScale(height - camera.height,result.depth)) / UNITS_PER_SQUARE;
|
||||||
|
|
||||||
|
Unit middleColumn = camera.resolution.x / 2;
|
||||||
|
|
||||||
|
Unit a = sqrtInt(d * d - result.depth * result.depth);
|
||||||
|
|
||||||
|
Ray r;
|
||||||
|
r.start = camera.position;
|
||||||
|
r.direction = cameraDir;
|
||||||
|
|
||||||
|
if (!pointIsLeftOfRay(worldPosition,r))
|
||||||
|
a *= -1;
|
||||||
|
|
||||||
|
Unit alpha = camera.fovAngle / 2;
|
||||||
|
|
||||||
|
Unit cos = cosInt(alpha);
|
||||||
|
|
||||||
|
Unit b =
|
||||||
|
(result.depth * sinInt(alpha)) / (cos == 0 ? 1 : cos); // sin/cos = tan
|
||||||
|
|
||||||
|
result.position.x = (a * middleColumn) / b;
|
||||||
|
result.position.x = 2 * (middleColumn - result.position.x);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
Unit degreesToUnitsAngle(int16_t degrees)
|
Unit degreesToUnitsAngle(int16_t degrees)
|
||||||
{
|
{
|
||||||
return (degrees * UNITS_PER_SQUARE) / 360;
|
return (degrees * UNITS_PER_SQUARE) / 360;
|
||||||
|
@ -760,6 +811,9 @@ Unit degreesToUnitsAngle(int16_t degrees)
|
||||||
|
|
||||||
Unit perspectiveScale(Unit originalSize, Unit distance)
|
Unit perspectiveScale(Unit originalSize, Unit distance)
|
||||||
{
|
{
|
||||||
|
if (distance == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
return (originalSize * UNITS_PER_SQUARE) /
|
return (originalSize * UNITS_PER_SQUARE) /
|
||||||
((VERTICAL_FOV * 2 * distance) / UNITS_PER_SQUARE);
|
((VERTICAL_FOV * 2 * distance) / UNITS_PER_SQUARE);
|
||||||
// ^ approximation of tan function
|
// ^ approximation of tan function
|
||||||
|
|
Loading…
Reference in a new issue