Fix clipping errors when multiple strips submitted
This commit is contained in:
parent
a113722d82
commit
02b4b2d438
24
GL/clip.c
24
GL/clip.c
|
@ -78,19 +78,27 @@ void clipTriangleStrip(AlignedVector* vertices, AlignedVector* outBuffer) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
uint32_t stripCount = 2; /* The number of vertices in the source strip so far */
|
||||||
|
|
||||||
for(i = 2; i < vertices->size; ++i) {
|
for(i = 2; i < vertices->size; ++i) {
|
||||||
|
if(stripCount < 2) {
|
||||||
|
stripCount++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClipVertex* thisVertex = aligned_vector_at(vertices, i);
|
||||||
|
|
||||||
ClipVertex* sourceTriangle[3] = {
|
ClipVertex* sourceTriangle[3] = {
|
||||||
aligned_vector_at(vertices, i - 2),
|
aligned_vector_at(vertices, i - 2),
|
||||||
aligned_vector_at(vertices, i - 1),
|
aligned_vector_at(vertices, i - 1),
|
||||||
aligned_vector_at(vertices, i)
|
thisVertex
|
||||||
};
|
};
|
||||||
|
|
||||||
/* If we're on an odd vertex, we need to swap the order of the first two vertices, as that's what
|
/* If we're on an odd vertex, we need to swap the order of the first two vertices, as that's what
|
||||||
* triangle strips do */
|
* triangle strips do */
|
||||||
uint8_t even = i % 2 == 0;
|
uint8_t swap = stripCount > 2 && (stripCount % 2 != 0);
|
||||||
ClipVertex* v1 = even ? sourceTriangle[0] : sourceTriangle[1];
|
ClipVertex* v1 = swap ? sourceTriangle[1] : sourceTriangle[0];
|
||||||
ClipVertex* v2 = even ? sourceTriangle[1] : sourceTriangle[0];
|
ClipVertex* v2 = swap ? sourceTriangle[0] : sourceTriangle[1];
|
||||||
ClipVertex* v3 = sourceTriangle[2];
|
ClipVertex* v3 = sourceTriangle[2];
|
||||||
|
|
||||||
uint8_t visible = ((v1->w > 0) ? 4 : 0) | ((v2->w > 0) ? 2 : 0) | ((v3->w > 0) ? 1 : 0);
|
uint8_t visible = ((v1->w > 0) ? 4 : 0) | ((v2->w > 0) ? 2 : 0) | ((v3->w > 0) ? 1 : 0);
|
||||||
|
@ -297,5 +305,13 @@ void clipTriangleStrip(AlignedVector* vertices, AlignedVector* outBuffer) {
|
||||||
|
|
||||||
aligned_vector_push_back(outBuffer, output, 4);
|
aligned_vector_push_back(outBuffer, output, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If this vertex was the last in the list, reset the stripCount */
|
||||||
|
if(thisVertex->flags == VERTEX_CMD_EOL) {
|
||||||
|
stripCount = 0;
|
||||||
|
} else {
|
||||||
|
stripCount++;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user