Fix crash on invalid tangent in rope node, fix invalid tangents for certain up vectors

This commit is contained in:
tobspr 2015-12-16 19:33:31 +01:00 committed by rdb
parent c0f48900e0
commit 81691e3103

View File

@ -813,6 +813,19 @@ compute_tube_vertices(GeomVertexData *vdata,
compute_tangent(tangent, segment, j, result);
LVector3 norm = cross(tangent, up);
// In case the tangent is linear dependent on the up vector, we might get invalid
// results, so check that
if (IS_NEARLY_ZERO(norm.length_squared())) {
if (IS_NEARLY_ZERO(tangent.get_y()) && IS_NEARLY_ZERO(tangent.get_z())) {
// Vector is linear dependent on (1, 0, 0), use (0, 1, 0) as base
norm = cross(tangent, LVector3(0, 1, 0));
} else {
norm = cross(tangent, LVector3(1, 0, 0));
}
}
norm.normalize();
up = cross(norm, tangent);
@ -885,6 +898,13 @@ compute_tangent(LVector3 &tangent, const RopeNode::CurveSegment &segment,
} else {
tangent = segment[j + 1]._p - segment[j - 1]._p;
}
// Avoid empty tangents, these lead to crashes. Instead, use an arbitrary
// tangent.
if (IS_NEARLY_ZERO(tangent.length_squared())) {
tangent.set(0, 0, 1);
}
}
////////////////////////////////////////////////////////////////////