Fix normal computation in opensubdiv when surface derivates are the same

In very rare occations, the returned derivates would be the same. This
would lead to the normal calculation breaking (zero normals).

Solution: Add this edge case to the other corner case checks.

Reviewed By: Sergey
This commit is contained in:
Sebastian Parborg 2020-09-24 18:03:51 +02:00
parent 0d7036b40e
commit 119d0cd2ab
Notes: blender-bot 2023-02-14 03:59:42 +01:00
Referenced by issue #81392, Bad surface shading quality when use limit surface is disabled.
1 changed files with 4 additions and 3 deletions

View File

@ -184,8 +184,9 @@ void BKE_subdiv_eval_limit_point_and_derivatives(Subdiv *subdiv,
{
subdiv->evaluator->evaluateLimit(subdiv->evaluator, ptex_face_index, u, v, r_P, r_dPdu, r_dPdv);
/* NOTE: In a very rare occasions derivatives are evaluated to zeros. This happens, for example,
* in single vertex on Suzannne's nose (where two quads have 2 common edges).
/* NOTE: In a very rare occasions derivatives are evaluated to zeros or are exactly equal.
* This happens, for example, in single vertex on Suzannne's nose (where two quads have 2 common
* edges).
*
* This makes tangent space displacement (such as multires) impossible to be used in those
* vertices, so those needs to be addressed in one way or another.
@ -195,7 +196,7 @@ void BKE_subdiv_eval_limit_point_and_derivatives(Subdiv *subdiv,
* that giving totally unusable derivatives. */
if (r_dPdu != NULL && r_dPdv != NULL) {
if (is_zero_v3(r_dPdu) || is_zero_v3(r_dPdv)) {
if ((is_zero_v3(r_dPdu) || is_zero_v3(r_dPdv)) || equals_v3v3(r_dPdu, r_dPdv)) {
subdiv->evaluator->evaluateLimit(subdiv->evaluator,
ptex_face_index,
u * 0.999f + 0.0005f,