diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2018-01-31 14:30:39 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-01-31 14:30:39 +0300 |
commit | f309becf2d5687586d9420a4835d8e49a22654d4 (patch) | |
tree | 0f34700652cfff020bba77634f26135b3e14e13f /source | |
parent | 87608e66e174068f9471619a5fe153fd279c4947 (diff) |
Fix possible concurency issue in mesh normals computation.
Failure in own code from last December, thanks @sergey for finding it.
To be backported to 2.79a.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/mesh_evaluate.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c index f95fad38c7c..425f28eb123 100644 --- a/source/blender/blenkernel/intern/mesh_evaluate.c +++ b/source/blender/blenkernel/intern/mesh_evaluate.c @@ -253,16 +253,6 @@ static void mesh_calc_normals_poly_prepare_cb( } } -static void mesh_calc_normals_poly_accum_cb( - void *__restrict userdata, - const int lidx, - const ParallelRangeTLS *__restrict UNUSED(tls)) -{ - MeshCalcNormalsData *data = userdata; - - add_v3_v3(data->vnors[data->mloop[lidx].v], data->lnors_weighted[lidx]); -} - static void mesh_calc_normals_poly_finalize_cb( void *__restrict userdata, const int vidx, @@ -327,7 +317,11 @@ void BKE_mesh_calc_normals_poly( BLI_task_parallel_range(0, numPolys, &data, mesh_calc_normals_poly_prepare_cb, &settings); /* Actually accumulate weighted loop normals into vertex ones. */ - BLI_task_parallel_range(0, numLoops, &data, mesh_calc_normals_poly_accum_cb, &settings); + /* Unfortunately, not possible to thread that (not in a reasonable, totally lock- and barrier-free fashion), + * since several loops will point to the same vertex... */ + for (int lidx = 0; lidx < numLoops; lidx++) { + add_v3_v3(vnors[mloop[lidx].v], data.lnors_weighted[lidx]); + } /* Normalize and validate computed vertex normals. */ BLI_task_parallel_range(0, numVerts, &data, mesh_calc_normals_poly_finalize_cb, &settings); |