diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/subdiv_eval.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/subdiv_eval.c b/source/blender/blenkernel/intern/subdiv_eval.c index 615698cad49..726fde3e6bd 100644 --- a/source/blender/blenkernel/intern/subdiv_eval.c +++ b/source/blender/blenkernel/intern/subdiv_eval.c @@ -176,6 +176,28 @@ void BKE_subdiv_eval_limit_point_and_derivatives(Subdiv *subdiv, float r_dPdv[3]) { 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). + * + * 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. + * + * Simplest thing to do: step inside of the face a little bit, where there is known patch at + * which there must be proper derivatives. This might break continuity of normals, but is better + * that giving totally unusable derivatives. */ + + if (r_dPdu != NULL && r_dPdv != NULL) { + if (is_zero_v3(r_dPdu) || is_zero_v3(r_dPdv)) { + subdiv->evaluator->evaluateLimit(subdiv->evaluator, + ptex_face_index, + u * 0.999f + 0.0005f, + v * 0.999f + 0.0005f, + r_P, + r_dPdu, + r_dPdv); + } + } } void BKE_subdiv_eval_limit_point_and_normal(Subdiv *subdiv, |