Fix various clipping glitches
This commit is contained in:
parent
53c54997c3
commit
4827fd4c5b
|
@ -74,7 +74,6 @@ GL_FORCE_INLINE void _glSubmitHeaderOrVertex(const Vertex* v) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
assert(!isnan(v->xyz[2]));
|
assert(!isnan(v->xyz[2]));
|
||||||
assert(!isnan(v->w));
|
assert(!isnan(v->w));
|
||||||
assert(v->xyz[2] > 0.0f);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t *s = (uint32_t*) v;
|
uint32_t *s = (uint32_t*) v;
|
||||||
|
@ -118,15 +117,20 @@ GL_FORCE_INLINE void _glClipEdge(const Vertex* v1, const Vertex* v2, Vertex* vou
|
||||||
const float d0 = v1->w + v1->xyz[2];
|
const float d0 = v1->w + v1->xyz[2];
|
||||||
const float d1 = v2->w + v2->xyz[2];
|
const float d1 = v2->w + v2->xyz[2];
|
||||||
|
|
||||||
float t = MATH_Fast_Divide(d0, (d0 - d1));
|
const float epsilon = (d0 < d1) ? -0.00001f : 0.00001f;
|
||||||
|
|
||||||
vout->xyz[0] = MATH_fmac(v2->xyz[0] - v1->xyz[0], t, v1->xyz[0]);
|
float t = MATH_Fast_Divide(d0, (d0 - d1)) + epsilon;
|
||||||
vout->xyz[1] = MATH_fmac(v2->xyz[1] - v1->xyz[1], t, v1->xyz[1]);
|
|
||||||
vout->xyz[2] = MATH_fmac(v2->xyz[2] - v1->xyz[2], t, v1->xyz[2]);
|
|
||||||
vout->w = MATH_fmac(v2->w - v1->w, t, v1->w);
|
|
||||||
|
|
||||||
vout->uv[0] = MATH_fmac(v2->uv[0] - v1->uv[0], t, v1->uv[0]);
|
t = (t > 1.0f) ? 1.0f : t;
|
||||||
vout->uv[1] = MATH_fmac(v2->uv[1] - v1->uv[1], t, v1->uv[1]);
|
t = (t < 0.0f) ? 0.0f : t;
|
||||||
|
|
||||||
|
vout->xyz[0] = __builtin_fmaf(v2->xyz[0] - v1->xyz[0], t, v1->xyz[0]);
|
||||||
|
vout->xyz[1] = __builtin_fmaf(v2->xyz[1] - v1->xyz[1], t, v1->xyz[1]);
|
||||||
|
vout->xyz[2] = __builtin_fmaf(v2->xyz[2] - v1->xyz[2], t, v1->xyz[2]);
|
||||||
|
vout->w = __builtin_fmaf(v2->w - v1->w, t, v1->w);
|
||||||
|
|
||||||
|
vout->uv[0] = __builtin_fmaf(v2->uv[0] - v1->uv[0], t, v1->uv[0]);
|
||||||
|
vout->uv[1] = __builtin_fmaf(v2->uv[1] - v1->uv[1], t, v1->uv[1]);
|
||||||
|
|
||||||
interpolateColour(v1->bgra, v2->bgra, t, vout->bgra);
|
interpolateColour(v1->bgra, v2->bgra, t, vout->bgra);
|
||||||
}
|
}
|
||||||
|
@ -176,7 +180,7 @@ void SceneListSubmit(void* src, int n) {
|
||||||
if(tri_count < 3) {
|
if(tri_count < 3) {
|
||||||
if(likely(glIsVertex(vertex->flags))) {
|
if(likely(glIsVertex(vertex->flags))) {
|
||||||
triangle[tri_count].v = vertex;
|
triangle[tri_count].v = vertex;
|
||||||
triangle[tri_count].visible = vertex->w > 0 && vertex->xyz[2] > -vertex->w;
|
triangle[tri_count].visible = vertex->xyz[2] > -vertex->w;
|
||||||
tri_count++;
|
tri_count++;
|
||||||
strip_count++;
|
strip_count++;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user