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:
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.
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue