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.
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
function.
@ -1228,6 +1230,9 @@ Unit coordStep = 1;
PIXEL_FUNCTION(&p);
++y;
p.depth -= _horizontalDepthStep;
if (p.depth < 0) // just in case
p.depth = 0;
}
}
@ -1379,6 +1384,14 @@ Unit perspectiveScale(Unit originalSize, Unit distance)
: 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,
Unit heightOffset, ArrayFunction floorHeightFunc,
ArrayFunction ceilingHeightFunc, int8_t computeHeight, int8_t force)

30
test.c
View file

@ -6,6 +6,9 @@
#define RAYCASTLIB_PROFILE
#define HORIZONTAL_FOV UNITS_PER_SQUARE / 2
#define PIXEL_FUNCTION pixelFunc
#include <stdio.h>
#include "raycastlib.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,
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)
{
int result;
@ -76,7 +79,6 @@ int testSingleMapping(Unit posX, Unit posY, Unit posZ, uint32_t resX,
c.position.y = camY;
c.direction = camDir;
c.height = camZ;
c.fovAngle = fov;
Vector2D pos;
Unit height;
@ -151,7 +153,6 @@ void benchmarkMapping()
c.position.y = UNITS_PER_SQUARE * 2;
c.direction = UNITS_PER_SQUARE / 8;
c.height = 0;
c.fovAngle = UNITS_PER_SQUARE / 2;
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.direction = 100;
c.height = 200;
c.fovAngle = UNITS_PER_SQUARE / 3;
RayConstraints constraints;
@ -237,6 +237,23 @@ int main()
16))
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(
-UNITS_PER_SQUARE,
0,
@ -247,13 +264,12 @@ int main()
0,
0,
UNITS_PER_SQUARE / 2,
UNITS_PER_SQUARE / 4,
640,
0,
1024
))
return -1;
*/
printf("benchmark:\n");
long t;