draw: Preserve the provoking vertex both when decomposing and clipping.
Based on John Lawless' feedback.
This commit is contained in:
@@ -175,9 +175,17 @@ static void emit_poly( struct draw_stage *stage,
|
||||
header.pad = 0;
|
||||
|
||||
for (i = 2; i < n; i++, header.flags = edge_middle) {
|
||||
header.v[0] = inlist[i-1];
|
||||
header.v[1] = inlist[i];
|
||||
header.v[2] = inlist[0]; /* keep in v[2] for flatshading */
|
||||
/* keep in provoking vertex for flatshading */
|
||||
if (stage->draw->rasterizer->flatshade_first) {
|
||||
header.v[0] = inlist[0];
|
||||
header.v[1] = inlist[i-1];
|
||||
header.v[2] = inlist[i];
|
||||
}
|
||||
else {
|
||||
header.v[0] = inlist[i-1];
|
||||
header.v[1] = inlist[i];
|
||||
header.v[2] = inlist[0];
|
||||
}
|
||||
|
||||
if (i == n-1)
|
||||
header.flags |= edge_last;
|
||||
@@ -293,12 +301,21 @@ do_clip_tri( struct draw_stage *stage,
|
||||
|
||||
/* If flat-shading, copy color to new provoking vertex.
|
||||
*/
|
||||
if (clipper->flat && inlist[0] != header->v[2]) {
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
if (stage->draw->rasterizer->flatshade_first) {
|
||||
if (clipper->flat && inlist[0] != header->v[0]) {
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
|
||||
copy_colors(stage, inlist[0], header->v[2]);
|
||||
copy_colors(stage, inlist[0], header->v[0]);
|
||||
}
|
||||
} else {
|
||||
if (clipper->flat && inlist[0] != header->v[2]) {
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
|
||||
copy_colors(stage, inlist[0], header->v[2]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Emit the polygon as triangles to the setup stage:
|
||||
*/
|
||||
if (n >= 3)
|
||||
|
@@ -47,19 +47,10 @@ static void FUNC( ARGS,
|
||||
|
||||
case PIPE_PRIM_TRIANGLES:
|
||||
for (i = 0; i+2 < count; i += 3) {
|
||||
if (flatfirst) {
|
||||
/* put provoking vertex in last pos for clipper */
|
||||
TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
|
||||
(i + 1),
|
||||
(i + 2),
|
||||
(i + 0 ));
|
||||
}
|
||||
else {
|
||||
TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
|
||||
(i + 0),
|
||||
(i + 1),
|
||||
(i + 2 ));
|
||||
}
|
||||
TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
|
||||
(i + 0),
|
||||
(i + 1),
|
||||
(i + 2 ));
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -67,9 +58,9 @@ static void FUNC( ARGS,
|
||||
if (flatfirst) {
|
||||
for (i = 0; i+2 < count; i++) {
|
||||
TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
|
||||
(i + 0),
|
||||
(i + 1 + (i&1)),
|
||||
(i + 2 - (i&1)),
|
||||
(i + 0) );
|
||||
(i + 2 - (i&1)) );
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -87,9 +78,9 @@ static void FUNC( ARGS,
|
||||
if (flatfirst) {
|
||||
for (i = 0; i+2 < count; i++) {
|
||||
TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
|
||||
(i + 1),
|
||||
(i + 2),
|
||||
0,
|
||||
(i + 1) );
|
||||
0 );
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
Reference in New Issue
Block a user