1
0
Fork 0
mirror of https://git.coom.tech/drummyfish/small3dlib.git synced 2024-11-24 21:09:57 +01:00

Add correction funtion

This commit is contained in:
Miloslav Číž 2019-06-11 15:37:40 +02:00
parent 4c042bd5fa
commit 3a29d4c679
2 changed files with 30 additions and 4 deletions

View file

@ -11,7 +11,7 @@
#define S3L_FLAT 0 #define S3L_FLAT 0
#define S3L_STRICT_NEAR_CULLING 0 #define S3L_STRICT_NEAR_CULLING 0
#define S3L_PERSPECTIVE_CORRECTION 1 #define S3L_PERSPECTIVE_CORRECTION 2
#define S3L_SORT 2 #define S3L_SORT 2
#define S3L_STENCIL_BUFFER 1 #define S3L_STENCIL_BUFFER 1
#define S3L_Z_BUFFER 0 #define S3L_Z_BUFFER 0
@ -80,6 +80,8 @@ void drawPixel(S3L_PixelInfo *p)
{ {
/* /*
S3L_correctBarycentricCoords(p->barycentric);
if (p->barycentric[0] < 0 || p->barycentric[0] > 512) if (p->barycentric[0] < 0 || p->barycentric[0] > 512)
printf("%d %d %d\n",p->barycentric[0],p->barycentric[1],p->barycentric[2]); printf("%d %d %d\n",p->barycentric[0],p->barycentric[1],p->barycentric[2]);

View file

@ -448,9 +448,11 @@ typedef struct
triangle and interpolate values between it's triangle and interpolate values between it's
three points. Each one goes from 0 to three points. Each one goes from 0 to
S3L_FRACTIONS_PER_UNIT (inclidung), but due to S3L_FRACTIONS_PER_UNIT (inclidung), but due to
rounding error may fall outside this range. The rounding error may fall outside this range (you
sum of the three coordinates will always be can use S3L_correctBarycentricCoords to fix this
exactly S3L_FRACTIONS_PER_UNIT. */ for the price of some performance). The sum of
the three coordinates will always be exactly
S3L_FRACTIONS_PER_UNIT. */
S3L_Index triangleIndex; ///< Triangle index. S3L_Index triangleIndex; ///< Triangle index.
S3L_Index modelIndex; S3L_Index modelIndex;
S3L_Unit depth; ///< Depth (only if depth is turned on). S3L_Unit depth; ///< Depth (only if depth is turned on).
@ -466,6 +468,12 @@ typedef struct
static inline void S3L_initPixelInfo(S3L_PixelInfo *p); static inline void S3L_initPixelInfo(S3L_PixelInfo *p);
/** Corrects barycentric coordinates so that they exactly meet the defined
conditions (each fall into <0,S3L_FRACTIONS_PER_UNIT>, sum =
S3L_FRACTIONS_PER_UNIT). Note that doing this per-pixel can slow the program
down significantly. */
static inline void S3LcorrectBarycentricCoords(S3L_Unit barycentric[3]);
// general helper functions // general helper functions
static inline S3L_Unit S3L_abs(S3L_Unit value); static inline S3L_Unit S3L_abs(S3L_Unit value);
static inline S3L_Unit S3L_min(S3L_Unit v1, S3L_Unit v2); static inline S3L_Unit S3L_min(S3L_Unit v1, S3L_Unit v2);
@ -1138,6 +1146,22 @@ S3L_Unit S3L_cos(S3L_Unit x)
return S3L_sin(x - S3L_FRACTIONS_PER_UNIT / 4); return S3L_sin(x - S3L_FRACTIONS_PER_UNIT / 4);
} }
void S3L_correctBarycentricCoords(S3L_Unit barycentric[3])
{
barycentric[0] = S3L_clamp(barycentric[0],0,S3L_FRACTIONS_PER_UNIT);
barycentric[1] = S3L_clamp(barycentric[1],0,S3L_FRACTIONS_PER_UNIT);
S3L_Unit d = S3L_FRACTIONS_PER_UNIT - barycentric[0] - barycentric[1];
if (d < 0)
{
barycentric[0] += d;
barycentric[2] = 0;
}
else
barycentric[2] = d;
}
void S3L_makeTranslationMat( void S3L_makeTranslationMat(
S3L_Unit offsetX, S3L_Unit offsetX,
S3L_Unit offsetY, S3L_Unit offsetY,