[Bf-blender-cvs] [582205c1344] master: Subdiv: Fix/Workaround for surface partial derivatives

Sergey Sharybin noreply at git.blender.org
Tue Mar 3 12:01:51 CET 2020


Commit: 582205c13449e41cc876d6df951c354e897419ea
Author: Sergey Sharybin
Date:   Tue Mar 3 11:51:29 2020 +0100
Branches: master
https://developer.blender.org/rB582205c13449e41cc876d6df951c354e897419ea

Subdiv: Fix/Workaround for surface partial derivatives

Both partial derivatives were evaluated to 0 for a special vertex on
Suzanne model: this is happening on a vertex where two adjacent faces
with 2 common edges are connected (in the nose of Suzanne).

This was breaking multires in this point since tangent matrix is all
zeroes, and hence no displacement can be applied in that vertex.

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

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 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,



More information about the Bf-blender-cvs mailing list