1
0
Fork 0
mirror of https://git.coom.tech/drummyfish/small3dlib.git synced 2024-11-23 20:59:58 +01:00
This commit is contained in:
Miloslav Číž 2018-11-18 10:22:31 +01:00
parent 85f48c1d79
commit 3a9bc0f6e7
2 changed files with 51 additions and 29 deletions

55
s3l.h
View file

@ -12,13 +12,14 @@ typedef struct
S3L_COORD x; ///< Screen X coordinate. S3L_COORD x; ///< Screen X coordinate.
S3L_COORD y; ///< Screen Y coordinate. S3L_COORD y; ///< Screen Y coordinate.
S3L_UNIT barycentricA; /**< Barycentric coord A. Together with B and C coords S3L_UNIT barycentric0; /**< Barycentric coord A (corresponds to 1st vertex).
these serve to locate the pixel on a triangle and Together with B and C coords these serve to
interpolate values between it's three points. The locate the pixel on a triangle and interpolate
sum of the three coordinates will always be values between it's three points. The sum of the
exactly S3L_FRACTIONS_PER_UNIT. */ three coordinates will always be exactly
S3L_UNIT barycentricB; ///< Baryc. coord B, same semantics as barycentricA. S3L_FRACTIONS_PER_UNIT. */
S3L_UNIT barycentricC; ///< Baryc. coord C, same semantics as barycentricA. S3L_UNIT barycentric1; ///< Baryc. coord B (corresponds to 2nd vertex).
S3L_UNIT barycentric2; ///< Baryc. coord C (corresponds to 3rd vertex).
} S3L_PixelInfo; } S3L_PixelInfo;
typedef struct typedef struct
@ -136,6 +137,20 @@ void S3L_drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2
lPointX, lPointY, // left triangle point coords lPointX, lPointY, // left triangle point coords
rPointX, rPointY; // right triangle point coords rPointX, rPointY; // right triangle point coords
S3L_PixelInfo p;
p.barycentric0 = 0;
p.barycentric1 = 0;
p.barycentric2 = 0;
S3L_UNIT *barycentric0; // bar. coord that gets higher from L to R
S3L_UNIT *barycentric1; // bar. coord that gets higher from R to L
S3L_UNIT *barycentric2; // bar. coord that is computed from previous two
barycentric0 = &p.barycentric0;
barycentric1 = &p.barycentric1;
barycentric2 = &p.barycentric2;
// Sort the points. // Sort the points.
#define handleLR(a,b)\ #define handleLR(a,b)\
@ -254,16 +269,6 @@ void S3L_drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2
initSide(r,t,r,1) initSide(r,t,r,1)
initSide(l,t,l,1) initSide(l,t,l,1)
S3L_PixelInfo p;
p.barycentricA = 0;
p.barycentricB = 0;
p.barycentricC = 0;
S3L_UNIT *barycentric1 = &p.barycentricA;
S3L_UNIT *barycentric2 = &p.barycentricB;
S3L_UNIT *barycentric3 = &p.barycentricC;
while (currentY <= endY) while (currentY <= endY)
{ {
if (currentY == splitY) if (currentY == splitY)
@ -272,8 +277,9 @@ void S3L_drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2
{ {
initSide(l,l,r,0); initSide(l,l,r,0);
barycentric1 = &p.barycentricC; S3L_UNIT *tmp = barycentric0;
barycentric3 = &p.barycentricA; barycentric0 = barycentric2;
barycentric2 = tmp;
rSideUnitPos = S3L_FRACTIONS_PER_UNIT - rSideUnitPos; rSideUnitPos = S3L_FRACTIONS_PER_UNIT - rSideUnitPos;
rSideUnitStep *= -1; rSideUnitStep *= -1;
@ -282,8 +288,9 @@ void S3L_drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2
{ {
initSide(r,r,l,0); initSide(r,r,l,0);
barycentric2 = &p.barycentricC; S3L_UNIT *tmp = barycentric1;
barycentric3 = &p.barycentricB; barycentric1 = barycentric2;
barycentric2 = tmp;
lSideUnitPos = S3L_FRACTIONS_PER_UNIT - lSideUnitPos; lSideUnitPos = S3L_FRACTIONS_PER_UNIT - lSideUnitPos;
lSideUnitStep *= -1; lSideUnitStep *= -1;
@ -302,9 +309,9 @@ void S3L_drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2
for (S3L_COORD x = lX; x <= rX; ++x) for (S3L_COORD x = lX; x <= rX; ++x)
{ {
*barycentric1 = S3L_interpolateFrom0(rSideUnitPos,t1,tMax); *barycentric0 = S3L_interpolateFrom0(rSideUnitPos,t1,tMax);
*barycentric2 = S3L_interpolateFrom0(lSideUnitPos,t2,tMax); *barycentric1 = S3L_interpolateFrom0(lSideUnitPos,t2,tMax);
*barycentric3 = S3L_FRACTIONS_PER_UNIT - *barycentric1 - *barycentric2; *barycentric2 = S3L_FRACTIONS_PER_UNIT - *barycentric0 - *barycentric1;
p.x = x; p.x = x;
S3L_PIXEL_FUNCTION(&p); S3L_PIXEL_FUNCTION(&p);

View file

@ -37,9 +37,9 @@ void drawPixel(S3L_PixelInfo *p)
setPixel(p->x,p->y, setPixel(p->x,p->y,
p->barycentricA / ((float) S3L_FRACTIONS_PER_UNIT) * 255, p->barycentric0 / ((float) S3L_FRACTIONS_PER_UNIT) * 255,
p->barycentricB / ((float) S3L_FRACTIONS_PER_UNIT) * 255, p->barycentric1 / ((float) S3L_FRACTIONS_PER_UNIT) * 255,
p->barycentricC / ((float) S3L_FRACTIONS_PER_UNIT) * 255); p->barycentric2 / ((float) S3L_FRACTIONS_PER_UNIT) * 255);
} }
@ -58,6 +58,7 @@ void draw()
{ {
clearScreen(); clearScreen();
/*
for (int c = 0; c < 7; ++c) for (int c = 0; c < 7; ++c)
{ {
int int
@ -69,12 +70,26 @@ void draw()
y2 = test_coords[6 * c + 5]; y2 = test_coords[6 * c + 5];
S3L_drawTriangle(x0,y0,x1,y1,x2,y2); S3L_drawTriangle(x0,y0,x1,y1,x2,y2);
/*
setPixel(x0,y0,255,0,0); setPixel(x0,y0,255,0,0);
setPixel(x1,y1,255,0,0); setPixel(x1,y1,255,0,0);
setPixel(x2,y2,255,0,0); setPixel(x2,y2,255,0,0);
*/
} }
*/
int16_t rotX0 = 200 + sin(frame * 0.01) * 50;
int16_t rotY0 = 200 + cos(frame * 0.01) * 50;
int16_t rotX1 = 200 + sin((frame + 300) * 0.01) * 50;
int16_t rotY1 = 200 + cos((frame + 300) * 0.01) * 50;
int16_t rotX2 = 200 + sin((frame + 500) * 0.01) * 50;
int16_t rotY2 = 200 + cos((frame + 500) * 0.01) * 50;
S3L_drawTriangle(rotX0,rotY0,rotX1,rotY1,rotX2,rotY2);
} }
int main() int main()