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

Add inverse scale func

This commit is contained in:
Miloslav Číž 2018-09-17 15:05:38 +02:00
parent 22e830b942
commit 9421155671
2 changed files with 36 additions and 7 deletions

View file

@ -275,6 +275,8 @@ Unit degreesToUnitsAngle(int16_t degrees);
///< Computes the change in size of an object due to perspective. ///< Computes the change in size of an object due to perspective.
Unit perspectiveScale(Unit originalSize, Unit distance); Unit perspectiveScale(Unit originalSize, Unit distance);
Unit perspectiveScaleInverse(Unit originalSize, Unit scaledSize);
/** /**
Casts rays for given camera view and for each hit calls a user provided Casts rays for given camera view and for each hit calls a user provided
function. function.
@ -1228,6 +1230,9 @@ Unit coordStep = 1;
PIXEL_FUNCTION(&p); PIXEL_FUNCTION(&p);
++y; ++y;
p.depth -= _horizontalDepthStep; p.depth -= _horizontalDepthStep;
if (p.depth < 0) // just in case
p.depth = 0;
} }
} }
@ -1379,6 +1384,14 @@ Unit perspectiveScale(Unit originalSize, Unit distance)
: 0; : 0;
} }
Unit perspectiveScaleInverse(Unit originalSize, Unit scaledSize)
{
return scaledSize != 0 ?
(originalSize * UNITS_PER_SQUARE) /
((VERTICAL_FOV * 2 * scaledSize) / UNITS_PER_SQUARE)
: 0;
}
void moveCameraWithCollision(Camera *camera, Vector2D planeOffset, void moveCameraWithCollision(Camera *camera, Vector2D planeOffset,
Unit heightOffset, ArrayFunction floorHeightFunc, Unit heightOffset, ArrayFunction floorHeightFunc,
ArrayFunction ceilingHeightFunc, int8_t computeHeight, int8_t force) ArrayFunction ceilingHeightFunc, int8_t computeHeight, int8_t force)

30
test.c
View file

@ -6,6 +6,9 @@
#define RAYCASTLIB_PROFILE #define RAYCASTLIB_PROFILE
#define HORIZONTAL_FOV UNITS_PER_SQUARE / 2
#define PIXEL_FUNCTION pixelFunc
#include <stdio.h> #include <stdio.h>
#include "raycastlib.h" #include "raycastlib.h"
#include <sys/time.h> #include <sys/time.h>
@ -63,7 +66,7 @@ int testSingleRay(Unit startX, Unit startY, Unit dirX, Unit dirY,
} }
int testSingleMapping(Unit posX, Unit posY, Unit posZ, uint32_t resX, int testSingleMapping(Unit posX, Unit posY, Unit posZ, uint32_t resX,
uint32_t resY, Unit camX, Unit camY, Unit camZ, Unit camDir, Unit fov, uint32_t resY, Unit camX, Unit camY, Unit camZ, Unit camDir,
Unit expectX, Unit expectY, Unit expectZ) Unit expectX, Unit expectY, Unit expectZ)
{ {
int result; int result;
@ -76,7 +79,6 @@ int testSingleMapping(Unit posX, Unit posY, Unit posZ, uint32_t resX,
c.position.y = camY; c.position.y = camY;
c.direction = camDir; c.direction = camDir;
c.height = camZ; c.height = camZ;
c.fovAngle = fov;
Vector2D pos; Vector2D pos;
Unit height; Unit height;
@ -151,7 +153,6 @@ void benchmarkMapping()
c.position.y = UNITS_PER_SQUARE * 2; c.position.y = UNITS_PER_SQUARE * 2;
c.direction = UNITS_PER_SQUARE / 8; c.direction = UNITS_PER_SQUARE / 8;
c.height = 0; c.height = 0;
c.fovAngle = UNITS_PER_SQUARE / 2;
PixelInfo p; PixelInfo p;
@ -172,7 +173,7 @@ void benchmarkMapping()
} }
} }
void pixelFunc(PixelInfo p) void pixelFunc(PixelInfo *p)
{ {
} }
@ -186,7 +187,6 @@ void benchmarkRender()
c.position.y = 12; c.position.y = 12;
c.direction = 100; c.direction = 100;
c.height = 200; c.height = 200;
c.fovAngle = UNITS_PER_SQUARE / 3;
RayConstraints constraints; RayConstraints constraints;
@ -237,6 +237,23 @@ int main()
16)) 16))
return 1; return 1;
printf("testing perspective scale...\n");
for (Unit i = 1; i < 100; ++i)
{
Unit size = i * 3;
Unit distance = i * 6 + 200;
Unit scaled = perspectiveScale(size,distance);
Unit distance2 = perspectiveScaleInverse(size,scaled);
if (absVal(distance - distance2 > 2))
printf("ERROR: distance: %d, distance inverse: %d\n",distance,distance2);
}
printf("OK\n");
/*
if (!testSingleMapping( if (!testSingleMapping(
-UNITS_PER_SQUARE, -UNITS_PER_SQUARE,
0, 0,
@ -247,13 +264,12 @@ int main()
0, 0,
0, 0,
UNITS_PER_SQUARE / 2, UNITS_PER_SQUARE / 2,
UNITS_PER_SQUARE / 4,
640, 640,
0, 0,
1024 1024
)) ))
return -1; return -1;
*/
printf("benchmark:\n"); printf("benchmark:\n");
long t; long t;