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.
|
///< 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
30
test.c
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue