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:
parent
22e830b942
commit
9421155671
2 changed files with 36 additions and 7 deletions
13
raycastlib.h
13
raycastlib.h
|
@ -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
30
test.c
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue