mirror of
https://git.coom.tech/drummyfish/small3dlib.git
synced 2024-11-21 20:39:57 +01:00
Create triangle suboutine
This commit is contained in:
parent
d4872e6984
commit
9881fadb94
1 changed files with 243 additions and 234 deletions
69
s3l.h
69
s3l.h
|
@ -627,29 +627,12 @@ int S3L_bresenhamStep(S3L_BresenhamState *state)
|
|||
return state->steps >= 0;
|
||||
}
|
||||
|
||||
void S3L_drawTriangle(
|
||||
void _S3L_drawFilledTriangle(
|
||||
S3L_ScreenCoord x0, S3L_ScreenCoord y0,
|
||||
S3L_ScreenCoord x1, S3L_ScreenCoord y1,
|
||||
S3L_ScreenCoord x2, S3L_ScreenCoord y2,
|
||||
S3L_DrawConfig config,
|
||||
S3L_Index triangleID)
|
||||
S3L_PixelInfo *p)
|
||||
{
|
||||
if (config.backfaceCulling != S3L_BACKFACE_CULLING_NONE)
|
||||
{
|
||||
int cw = // matrix determinant
|
||||
x0 * y1 + y0 * x2 + x1 * y2 - y1 * x2 - y0 * x1 - x0 * y2 > 0;
|
||||
|
||||
if ((config.backfaceCulling == S3L_BACKFACE_CULLING_CW && !cw) ||
|
||||
(config.backfaceCulling == S3L_BACKFACE_CULLING_CCW && cw))
|
||||
return;
|
||||
}
|
||||
|
||||
S3L_PixelInfo p;
|
||||
S3L_initPixelInfo(&p);
|
||||
p.triangleID = triangleID;
|
||||
|
||||
if (config.mode == S3L_MODE_TRIANGLES) // triangle mode
|
||||
{
|
||||
S3L_ScreenCoord
|
||||
tPointX, tPointY, // top triangle point coords
|
||||
lPointX, lPointY, // left triangle point coords
|
||||
|
@ -671,15 +654,15 @@ void S3L_drawTriangle(
|
|||
{\
|
||||
lPointX = x##a; lPointY = y##a;\
|
||||
rPointX = x##b; rPointY = y##b;\
|
||||
barycentric0 = &p.barycentric##b;\
|
||||
barycentric1 = &p.barycentric##a;\
|
||||
barycentric0 = &(p->barycentric##b);\
|
||||
barycentric1 = &(p->barycentric##a);\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
lPointX = x##b; lPointY = y##b;\
|
||||
rPointX = x##a; rPointY = y##a;\
|
||||
barycentric0 = &p.barycentric##a;\
|
||||
barycentric1 = &p.barycentric##b;\
|
||||
barycentric0 = &(p->barycentric##a);\
|
||||
barycentric1 = &(p->barycentric##b);\
|
||||
}
|
||||
|
||||
if (y0 <= y1)
|
||||
|
@ -688,14 +671,14 @@ void S3L_drawTriangle(
|
|||
{
|
||||
tPointX = x0;
|
||||
tPointY = y0;
|
||||
barycentric2 = &p.barycentric0;
|
||||
barycentric2 = &(p->barycentric0);
|
||||
handleLR(0,1,2)
|
||||
}
|
||||
else
|
||||
{
|
||||
tPointX = x2;
|
||||
tPointY = y2;
|
||||
barycentric2 = &p.barycentric2;
|
||||
barycentric2 = &(p->barycentric2);
|
||||
handleLR(2,0,1)
|
||||
}
|
||||
}
|
||||
|
@ -705,14 +688,14 @@ void S3L_drawTriangle(
|
|||
{
|
||||
tPointX = x1;
|
||||
tPointY = y1;
|
||||
barycentric2 = &p.barycentric1;
|
||||
barycentric2 = &(p->barycentric1);
|
||||
handleLR(1,0,2)
|
||||
}
|
||||
else
|
||||
{
|
||||
tPointX = x2;
|
||||
tPointY = y2;
|
||||
barycentric2 = &p.barycentric2;
|
||||
barycentric2 = &(p->barycentric2);
|
||||
handleLR(2,0,1)
|
||||
}
|
||||
}
|
||||
|
@ -851,7 +834,7 @@ void S3L_drawTriangle(
|
|||
stepSide(r)
|
||||
stepSide(l)
|
||||
|
||||
p.y = currentY;
|
||||
p->y = currentY;
|
||||
|
||||
// draw the horizontal line
|
||||
|
||||
|
@ -869,8 +852,8 @@ void S3L_drawTriangle(
|
|||
*barycentric1 = b1 >> S3L_LERP_QUALITY;
|
||||
*barycentric2 = S3L_FRACTIONS_PER_UNIT - *barycentric0 - *barycentric1;
|
||||
|
||||
p.x = x;
|
||||
S3L_PIXEL_FUNCTION(&p);
|
||||
p->x = x;
|
||||
S3L_PIXEL_FUNCTION(p);
|
||||
|
||||
b0 += b0Step;
|
||||
b1 -= b1Step;
|
||||
|
@ -884,6 +867,32 @@ void S3L_drawTriangle(
|
|||
|
||||
#undef initSide
|
||||
#undef stepSide
|
||||
}
|
||||
|
||||
void S3L_drawTriangle(
|
||||
S3L_ScreenCoord x0, S3L_ScreenCoord y0,
|
||||
S3L_ScreenCoord x1, S3L_ScreenCoord y1,
|
||||
S3L_ScreenCoord x2, S3L_ScreenCoord y2,
|
||||
S3L_DrawConfig config,
|
||||
S3L_Index triangleID)
|
||||
{
|
||||
if (config.backfaceCulling != S3L_BACKFACE_CULLING_NONE)
|
||||
{
|
||||
int cw = // matrix determinant
|
||||
x0 * y1 + y0 * x2 + x1 * y2 - y1 * x2 - y0 * x1 - x0 * y2 > 0;
|
||||
|
||||
if ((config.backfaceCulling == S3L_BACKFACE_CULLING_CW && !cw) ||
|
||||
(config.backfaceCulling == S3L_BACKFACE_CULLING_CCW && cw))
|
||||
return;
|
||||
}
|
||||
|
||||
S3L_PixelInfo p;
|
||||
S3L_initPixelInfo(&p);
|
||||
p.triangleID = triangleID;
|
||||
|
||||
if (config.mode == S3L_MODE_TRIANGLES) // triangle mode
|
||||
{
|
||||
_S3L_drawFilledTriangle(x0,y0,x1,y1,x2,y2,&p);
|
||||
}
|
||||
else if (config.mode == S3L_MODE_LINES) // line mode
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue