Handle multiple triangle strips with single-vertices behind the plane
This commit is contained in:
parent
5387734e6c
commit
2067115385
|
@ -78,15 +78,18 @@ void clipTriangleStrip(AlignedVector* vertices, AlignedVector* outBuffer) {
|
||||||
aligned_vector_at(vertices, i)
|
aligned_vector_at(vertices, i)
|
||||||
};
|
};
|
||||||
|
|
||||||
ClipVertex* v1 = sourceTriangle[0];
|
/* If we're on an odd vertex, we need to swap the order of the first two vertices, as that's what
|
||||||
ClipVertex* v2 = sourceTriangle[1];
|
* triangle strips do */
|
||||||
|
ClipVertex* v1 = (i % 2 == 0) ? sourceTriangle[0] : sourceTriangle[1];
|
||||||
|
ClipVertex* v2 = (i % 2 == 0) ? sourceTriangle[1] : sourceTriangle[0];
|
||||||
ClipVertex* v3 = sourceTriangle[2];
|
ClipVertex* v3 = sourceTriangle[2];
|
||||||
|
|
||||||
uint8_t visible = ((v1->xyz[2] <= 0) ? 4 : 0) | ((v2->xyz[2] <= 0) ? 2 : 0) | ((v3->xyz[2] <= 0) ? 1 : 0);
|
uint8_t visible = ((v1->xyz[2] <= 0) ? 4 : 0) | ((v2->xyz[2] <= 0) ? 2 : 0) | ((v3->xyz[2] <= 0) ? 1 : 0);
|
||||||
|
uint8_t startOfStrip = (i == 2) || (outBuffer->size > 2 && ((ClipVertex*) aligned_vector_back(outBuffer))->flags == VERTEX_CMD_EOL);
|
||||||
|
|
||||||
/* All visible, we're fine! */
|
/* All visible, we're fine! */
|
||||||
if(visible == 0b111) {
|
if(visible == 0b111) {
|
||||||
if(i == 2) {
|
if(startOfStrip) {
|
||||||
aligned_vector_push_back(outBuffer, v1, 1);
|
aligned_vector_push_back(outBuffer, v1, 1);
|
||||||
aligned_vector_push_back(outBuffer, v2, 1);
|
aligned_vector_push_back(outBuffer, v2, 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,6 +70,10 @@ void* aligned_vector_at(const AlignedVector* vector, const unsigned int index) {
|
||||||
return &vector->data[index * vector->element_size];
|
return &vector->data[index * vector->element_size];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* aligned_vector_back(AlignedVector* vector) {
|
||||||
|
return aligned_vector_at(vector, vector->size - 1);
|
||||||
|
}
|
||||||
|
|
||||||
void* aligned_vector_extend(AlignedVector* vector, const unsigned int additional_count) {
|
void* aligned_vector_extend(AlignedVector* vector, const unsigned int additional_count) {
|
||||||
const unsigned int current = vector->size;
|
const unsigned int current = vector->size;
|
||||||
aligned_vector_resize(vector, vector->size + additional_count);
|
aligned_vector_resize(vector, vector->size + additional_count);
|
||||||
|
|
|
@ -23,6 +23,7 @@ void* aligned_vector_extend(AlignedVector* vector, const unsigned int additional
|
||||||
void aligned_vector_clear(AlignedVector* vector);
|
void aligned_vector_clear(AlignedVector* vector);
|
||||||
void aligned_vector_shrink_to_fit(AlignedVector* vector);
|
void aligned_vector_shrink_to_fit(AlignedVector* vector);
|
||||||
void aligned_vector_cleanup(AlignedVector* vector);
|
void aligned_vector_cleanup(AlignedVector* vector);
|
||||||
|
void* aligned_vector_back(AlignedVector* vector);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user