[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(¢er_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(¢er_accumulator, subdiv_ccg, key, grid_center_element);
+ }
+ element_accumulator_mul_fl(¢er_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, ¢er_accumulator);
+ }
}
static void subdiv_ccg_average_inner_grids_task(void *__restrict userdata_v,
More information about the Bf-blender-cvs
mailing list