Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-07-15 12:28:37 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-07-15 18:38:47 +0300
commit9cdd2df277b3b9b2949aee4f869b276f79ca17f4 (patch)
tree69220b5aa9616091d20a0e97385371c8050ce8bc /source/blender/blenkernel/intern/subdiv_ccg.c
parentff1b5af30710a802c5137dab3bce3a18203b3645 (diff)
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
Diffstat (limited to 'source/blender/blenkernel/intern/subdiv_ccg.c')
-rw-r--r--source/blender/blenkernel/intern/subdiv_ccg.c18
1 files changed, 17 insertions, 1 deletions
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,