[Bf-blender-cvs] [119d0cd2ab1] master: Fix normal computation in opensubdiv when surface derivates are the same

Sebastian Parborg noreply at git.blender.org
Thu Sep 24 18:08:50 CEST 2020


Commit: 119d0cd2ab14ec332b2b6d23b1cf671b56131438
Author: Sebastian Parborg
Date:   Thu Sep 24 18:03:51 2020 +0200
Branches: master
https://developer.blender.org/rB119d0cd2ab14ec332b2b6d23b1cf671b56131438

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

===================================================================

M	source/blender/blenkernel/intern/subdiv_eval.c

===================================================================

diff --git a/source/blender/blenkernel/intern/subdiv_eval.c b/source/blender/blenkernel/intern/subdiv_eval.c
index baee8a80f5a..201d308e096 100644
--- a/source/blender/blenkernel/intern/subdiv_eval.c
+++ b/source/blender/blenkernel/intern/subdiv_eval.c
@@ -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,



More information about the Bf-blender-cvs mailing list