mirror of
https://git.coom.tech/drummyfish/small3dlib.git
synced 2024-11-21 20:39:57 +01:00
pdate tests
This commit is contained in:
parent
f42a7b1a3a
commit
c2829c2177
2 changed files with 88 additions and 15 deletions
|
@ -19,7 +19,7 @@ void pixelFunc(S3L_PixelInfo *p)
|
||||||
testRaster[p->y * TEST_BUFFER_W + p->x] += 1;
|
testRaster[p->y * TEST_BUFFER_W + p->x] += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t testTriangleRasterization(
|
int testTriangleRasterization(
|
||||||
S3L_ScreenCoord x0,
|
S3L_ScreenCoord x0,
|
||||||
S3L_ScreenCoord y0,
|
S3L_ScreenCoord y0,
|
||||||
S3L_ScreenCoord x1,
|
S3L_ScreenCoord x1,
|
||||||
|
@ -31,10 +31,6 @@ uint16_t testTriangleRasterization(
|
||||||
{
|
{
|
||||||
printf(" --- testing tringle rasterization [%d,%d] [%d,%d] [%d,%d] (|: expected, -: rasterized) ----\n",x0,y0,x1,y1,x2,y2);
|
printf(" --- testing tringle rasterization [%d,%d] [%d,%d] [%d,%d] (|: expected, -: rasterized) ----\n",x0,y0,x1,y1,x2,y2);
|
||||||
|
|
||||||
S3L_DrawConfig conf;
|
|
||||||
|
|
||||||
conf.backfaceCulling = 0;
|
|
||||||
|
|
||||||
memset(testRaster,0,TEST_BUFFER_W * TEST_BUFFER_H);
|
memset(testRaster,0,TEST_BUFFER_W * TEST_BUFFER_H);
|
||||||
|
|
||||||
S3L_Vec4 p0, p1, p2;
|
S3L_Vec4 p0, p1, p2;
|
||||||
|
@ -81,7 +77,7 @@ uint16_t testTriangleRasterization(
|
||||||
return numErrors;
|
return numErrors;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t testRasterization()
|
int testRasterization()
|
||||||
{
|
{
|
||||||
printf("\n=== TESTING RASTERIZATION ===\n");
|
printf("\n=== TESTING RASTERIZATION ===\n");
|
||||||
|
|
||||||
|
@ -332,8 +328,69 @@ uint16_t testRasterization()
|
||||||
|
|
||||||
numErrors += numErrors2;
|
numErrors += numErrors2;
|
||||||
|
|
||||||
|
|
||||||
printf("total rasterization errors: %d\n",numErrors);
|
printf("total rasterization errors: %d\n",numErrors);
|
||||||
|
|
||||||
|
return numErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline double abs(double a)
|
||||||
|
{
|
||||||
|
return a >= 0.0 ? a : (-1 * a);
|
||||||
|
}
|
||||||
|
|
||||||
|
double vec3Len(S3L_Vec4 v)
|
||||||
|
{
|
||||||
|
return sqrt(
|
||||||
|
((double) v.x) * ((double) v.x) +
|
||||||
|
((double) v.y) * ((double) v.y) +
|
||||||
|
((double) v.z) * ((double) v.z));
|
||||||
|
}
|
||||||
|
|
||||||
|
int testGeneral()
|
||||||
|
{
|
||||||
|
printf("\n=== TESTING GENERAL ===\n");
|
||||||
|
|
||||||
|
printf("testing vector normalization precision...\n");
|
||||||
|
|
||||||
|
S3L_Unit m = 100 * S3L_FRACTIONS_PER_UNIT;
|
||||||
|
S3L_Unit tolerance = 0.1 * S3L_FRACTIONS_PER_UNIT;
|
||||||
|
|
||||||
|
uint32_t errors0 = 0;
|
||||||
|
uint32_t errors1 = 0;
|
||||||
|
|
||||||
|
for (S3L_Unit x = -1 * m; x < m; x += 3 * (abs(x) / 64 + 1))
|
||||||
|
for (S3L_Unit y = -1 * m; y < m; y += 3 * (abs(y) / 32 + 1))
|
||||||
|
for (S3L_Unit z = -1 * m; z < m; z += 5 * (abs(z) / 64 + 1))
|
||||||
|
{
|
||||||
|
S3L_Vec4 v;
|
||||||
|
|
||||||
|
S3L_setVec4(&v,x,y,z,0);
|
||||||
|
S3L_normalizeVec3Fast(&v);
|
||||||
|
|
||||||
|
double l0 = vec3Len(v);
|
||||||
|
double e0 = abs(l0 - S3L_FRACTIONS_PER_UNIT);
|
||||||
|
|
||||||
|
S3L_setVec4(&v,x,y,z,0);
|
||||||
|
S3L_normalizeVec3(&v);
|
||||||
|
|
||||||
|
double l1 = vec3Len(v);
|
||||||
|
double e1 = abs(l1 - S3L_FRACTIONS_PER_UNIT);
|
||||||
|
|
||||||
|
if (e0 > tolerance)
|
||||||
|
errors0++;
|
||||||
|
|
||||||
|
if (e1 > tolerance)
|
||||||
|
{
|
||||||
|
errors1++;
|
||||||
|
|
||||||
|
printf("%f\n",l1);
|
||||||
|
S3L_logVec4(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("wrong normalization with unsafe function: %d\nwrong normalizations with safe function: %d\n",errors0,errors1);
|
||||||
|
|
||||||
|
return errors1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
|
@ -357,7 +414,12 @@ int main()
|
||||||
S3L_mat4Xmat4(&m,&m2);
|
S3L_mat4Xmat4(&m,&m2);
|
||||||
S3L_logMat4(m);
|
S3L_logMat4(m);
|
||||||
|
|
||||||
testRasterization();
|
uint32_t totalErrors = 0;
|
||||||
|
|
||||||
|
totalErrors += testRasterization();
|
||||||
|
totalErrors += testGeneral();
|
||||||
|
|
||||||
|
printf("\n===== DONE =====\ntotal errors: %d\n",totalErrors);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
21
small3dlib.h
21
small3dlib.h
|
@ -1458,7 +1458,8 @@ S3L_Unit S3L_vec2Length(S3L_Vec4 v)
|
||||||
void S3L_normalizeVec3(S3L_Vec4 *v)
|
void S3L_normalizeVec3(S3L_Vec4 *v)
|
||||||
{
|
{
|
||||||
#define SCALE 16
|
#define SCALE 16
|
||||||
#define LIMIT 16
|
#define BOTTOM_LIMIT 16
|
||||||
|
#define UPPER_LIMIT 900
|
||||||
|
|
||||||
/* Here we try to decide if the vector is too small and would cause
|
/* Here we try to decide if the vector is too small and would cause
|
||||||
inaccurate result due to very its inaccurate length. If so, we scale
|
inaccurate result due to very its inaccurate length. If so, we scale
|
||||||
|
@ -1466,17 +1467,27 @@ void S3L_normalizeVec3(S3L_Vec4 *v)
|
||||||
calculations. */
|
calculations. */
|
||||||
|
|
||||||
if (
|
if (
|
||||||
S3L_abs(v->x) <= LIMIT &&
|
S3L_abs(v->x) <= BOTTOM_LIMIT &&
|
||||||
S3L_abs(v->y) <= LIMIT &&
|
S3L_abs(v->y) <= BOTTOM_LIMIT &&
|
||||||
S3L_abs(v->z) <= LIMIT)
|
S3L_abs(v->z) <= BOTTOM_LIMIT)
|
||||||
{
|
{
|
||||||
v->x *= SCALE;
|
v->x *= SCALE;
|
||||||
v->y *= SCALE;
|
v->y *= SCALE;
|
||||||
v->z *= SCALE;
|
v->z *= SCALE;
|
||||||
}
|
}
|
||||||
|
else if (
|
||||||
|
S3L_abs(v->x) > UPPER_LIMIT ||
|
||||||
|
S3L_abs(v->y) > UPPER_LIMIT ||
|
||||||
|
S3L_abs(v->z) > UPPER_LIMIT)
|
||||||
|
{
|
||||||
|
v->x /= SCALE;
|
||||||
|
v->y /= SCALE;
|
||||||
|
v->z /= SCALE;
|
||||||
|
}
|
||||||
|
|
||||||
#undef SCALE
|
#undef SCALE
|
||||||
#undef LIMIT
|
#undef BOTTOM_LIMIT
|
||||||
|
#undef UPPER_LIMIT
|
||||||
|
|
||||||
S3L_Unit l = S3L_vec3Length(*v);
|
S3L_Unit l = S3L_vec3Length(*v);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue