draw: Take flatshade_first rasterizer bit into account.

This commit is contained in:
Michal Krol 2008-03-25 23:49:11 +01:00
parent dc9757e1a8
commit e1543fa55c
1 changed files with 117 additions and 45 deletions

View File

@ -330,6 +330,8 @@ draw_prim( struct draw_context *draw,
unsigned i; unsigned i;
boolean unfilled = (draw->rasterizer->fill_cw != PIPE_POLYGON_MODE_FILL || boolean unfilled = (draw->rasterizer->fill_cw != PIPE_POLYGON_MODE_FILL ||
draw->rasterizer->fill_ccw != PIPE_POLYGON_MODE_FILL); draw->rasterizer->fill_ccw != PIPE_POLYGON_MODE_FILL);
boolean flatfirst =
(draw->rasterizer->flatshade & draw->rasterizer->flatshade_first) ? TRUE : FALSE;
// debug_printf("%s (%d) %d/%d\n", __FUNCTION__, draw->prim, start, count ); // debug_printf("%s (%d) %d/%d\n", __FUNCTION__, draw->prim, start, count );
@ -342,11 +344,21 @@ draw_prim( struct draw_context *draw,
break; break;
case PIPE_PRIM_LINES: case PIPE_PRIM_LINES:
for (i = 0; i+1 < count; i += 2) { if (flatfirst) {
do_line( draw, for (i = 0; i+1 < count; i += 2) {
TRUE, do_line( draw,
start + i + 0, TRUE,
start + i + 1); start + i + 1,
start + i + 0);
}
}
else {
for (i = 0; i+1 < count; i += 2) {
do_line( draw,
TRUE,
start + i + 0,
start + i + 1);
}
} }
break; break;
@ -367,60 +379,120 @@ draw_prim( struct draw_context *draw,
break; break;
case PIPE_PRIM_LINE_STRIP: case PIPE_PRIM_LINE_STRIP:
for (i = 1; i < count; i++) { if (flatfirst) {
do_line( draw, for (i = 1; i < count; i++) {
i == 1, do_line( draw,
start + i - 1, i == 1,
start + i ); start + i,
start + i - 1 );
}
}
else {
for (i = 1; i < count; i++) {
do_line( draw,
i == 1,
start + i - 1,
start + i );
}
} }
break; break;
case PIPE_PRIM_TRIANGLES: case PIPE_PRIM_TRIANGLES:
if (unfilled) { if (flatfirst) {
for (i = 0; i+2 < count; i += 3) { if (unfilled) {
do_ef_triangle( draw, for (i = 0; i+2 < count; i += 3) {
1, do_ef_triangle( draw,
~0, 1,
start + i + 0, ~0,
start + i + 1, start + i + 1,
start + i + 2 ); start + i + 2,
} start + i + 0 );
} }
}
else {
for (i = 0; i+2 < count; i += 3) {
do_triangle( draw,
start + i + 1,
start + i + 2,
start + i + 0 );
}
}
}
else { else {
for (i = 0; i+2 < count; i += 3) { if (unfilled) {
do_triangle( draw, for (i = 0; i+2 < count; i += 3) {
start + i + 0, do_ef_triangle( draw,
start + i + 1, 1,
start + i + 2 ); ~0,
} start + i + 0,
start + i + 1,
start + i + 2 );
}
}
else {
for (i = 0; i+2 < count; i += 3) {
do_triangle( draw,
start + i + 0,
start + i + 1,
start + i + 2 );
}
}
} }
break; break;
case PIPE_PRIM_TRIANGLE_STRIP: case PIPE_PRIM_TRIANGLE_STRIP:
for (i = 0; i+2 < count; i++) { if (flatfirst) {
if (i & 1) { for (i = 0; i+2 < count; i++) {
do_triangle( draw, if (i & 1) {
start + i + 1, do_triangle( draw,
start + i + 0, start + i + 2,
start + i + 2 ); start + i + 1,
} start + i + 0 );
else { }
do_triangle( draw, else {
start + i + 0, do_triangle( draw,
start + i + 1, start + i + 1,
start + i + 2 ); start + i + 2,
} start + i + 0 );
}
}
}
else {
for (i = 0; i+2 < count; i++) {
if (i & 1) {
do_triangle( draw,
start + i + 1,
start + i + 0,
start + i + 2 );
}
else {
do_triangle( draw,
start + i + 0,
start + i + 1,
start + i + 2 );
}
}
} }
break; break;
case PIPE_PRIM_TRIANGLE_FAN: case PIPE_PRIM_TRIANGLE_FAN:
if (count >= 3) { if (count >= 3) {
for (i = 0; i+2 < count; i++) { if (flatfirst) {
do_triangle( draw, for (i = 0; i+2 < count; i++) {
start + 0, do_triangle( draw,
start + i + 1, start + i + 2,
start + i + 2 ); start + 0,
} start + i + 1 );
}
}
else {
for (i = 0; i+2 < count; i++) {
do_triangle( draw,
start + 0,
start + i + 1,
start + i + 2 );
}
}
} }
break; break;