[Bf-blender-cvs] [9cdd2df277b] master: Fix T66712: A model shows artifacts in the sculpt mode

Sergey Sharybin noreply at git.blender.org
Mon Jul 15 17:39:17 CEST 2019


Commit: 9cdd2df277b3b9b2949aee4f869b276f79ca17f4
Author: Sergey Sharybin
Date:   Mon Jul 15 11:28:37 2019 +0200
Branches: master
https://developer.blender.org/rB9cdd2df277b3b9b2949aee4f869b276f79ca17f4

Fix T66712: A model shows artifacts in the sculpt mode

Was a mistake in normals calculation: need to consider all grids for correct
average in the center of the face.

Reviewers: brecht

Reviewed By: brecht

Maniphest Tasks: T66712

Differential Revision: https://developer.blender.org/D5254

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

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

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

diff --git a/source/blender/blenkernel/intern/subdiv_ccg.c b/source/blender/blenkernel/intern/subdiv_ccg.c
index 41ef2bd4b04..fac1e1dbe75 100644
--- a/source/blender/blenkernel/intern/subdiv_ccg.c
+++ b/source/blender/blenkernel/intern/subdiv_ccg.c
@@ -962,15 +962,31 @@ static void subdiv_ccg_average_inner_face_grids(SubdivCCG *subdiv_ccg,
   const int num_face_grids = face->num_grids;
   const int grid_size = subdiv_ccg->grid_size;
   CCGElem *prev_grid = grids[face->start_grid_index + num_face_grids - 1];
+  /* Average boundary between neighbor grid. */
   for (int corner = 0; corner < num_face_grids; corner++) {
     CCGElem *grid = grids[face->start_grid_index + corner];
-    for (int i = 0; i < grid_size; i++) {
+    for (int i = 1; i < grid_size; i++) {
       CCGElem *prev_grid_element = CCG_grid_elem(key, prev_grid, i, 0);
       CCGElem *grid_element = CCG_grid_elem(key, grid, 0, i);
       average_grid_element(subdiv_ccg, key, prev_grid_element, grid_element);
     }
     prev_grid = grid;
   }
+  /* Average all grids centers into a single accumulator, and share it.
+   * Guarantees corrent and smooth averaging in the center. */
+  GridElementAccumulator center_accumulator;
+  element_accumulator_init(&center_accumulator);
+  for (int corner = 0; corner < num_face_grids; corner++) {
+    CCGElem *grid = grids[face->start_grid_index + corner];
+    CCGElem *grid_center_element = CCG_grid_elem(key, grid, 0, 0);
+    element_accumulator_add(&center_accumulator, subdiv_ccg, key, grid_center_element);
+  }
+  element_accumulator_mul_fl(&center_accumulator, 1.0f / (float)num_face_grids);
+  for (int corner = 0; corner < num_face_grids; corner++) {
+    CCGElem *grid = grids[face->start_grid_index + corner];
+    CCGElem *grid_center_element = CCG_grid_elem(key, grid, 0, 0);
+    element_accumulator_copy(subdiv_ccg, key, grid_center_element, &center_accumulator);
+  }
 }
 
 static void subdiv_ccg_average_inner_grids_task(void *__restrict userdata_v,



More information about the Bf-blender-cvs mailing list