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:
authorSybren A. Stüvel <sybren@blender.org>2020-01-21 19:52:44 +0300
committerSybren A. Stüvel <sybren@blender.org>2020-01-21 19:53:06 +0300
commit5168408ae50a052d2a9fa795ebdb18820d5b1d67 (patch)
treeae41bdb3d63361dceae7e1a4c1b604d93adb362d
parent4db9562246b36d0d0d18a3f1b33b87f1d91fe146 (diff)
Fix T72459: Mask Modifier breaks Vertex Parenting
The `give_parvert()` function was only considering the mesh's original vertex indices when the parent vertex index was valid for the evaluated mesh. However, when using the Mask modifier the evaluated mesh can have less vertices but still have the parent vertex. Since the `if (nr < numVertex)` condition wasn't used to prevent any out-of-bounds access, and seems just an incorrect optimisation, it could be removed.
-rw-r--r--source/blender/blenkernel/intern/object.c48
1 files changed, 23 insertions, 25 deletions
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 1378e862034..da3986d33df 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -2330,40 +2330,38 @@ static void give_parvert(Object *par, int nr, float vec[3])
int count = 0;
const int numVerts = me_eval->totvert;
- if (nr < numVerts) {
- if (em && me_eval->runtime.is_original) {
- if (em->bm->elem_table_dirty & BM_VERT) {
+ if (em && me_eval->runtime.is_original) {
+ if (em->bm->elem_table_dirty & BM_VERT) {
#ifdef VPARENT_THREADING_HACK
- BLI_mutex_lock(&vparent_lock);
- if (em->bm->elem_table_dirty & BM_VERT) {
- BM_mesh_elem_table_ensure(em->bm, BM_VERT);
- }
- BLI_mutex_unlock(&vparent_lock);
-#else
- BLI_assert(!"Not safe for threading");
+ BLI_mutex_lock(&vparent_lock);
+ if (em->bm->elem_table_dirty & BM_VERT) {
BM_mesh_elem_table_ensure(em->bm, BM_VERT);
-#endif
}
+ BLI_mutex_unlock(&vparent_lock);
+#else
+ BLI_assert(!"Not safe for threading");
+ BM_mesh_elem_table_ensure(em->bm, BM_VERT);
+#endif
}
+ }
- if (CustomData_has_layer(&me_eval->vdata, CD_ORIGINDEX) &&
- !(em && me_eval->runtime.is_original)) {
- const int *index = CustomData_get_layer(&me_eval->vdata, CD_ORIGINDEX);
- /* Get the average of all verts with (original index == nr). */
- for (int i = 0; i < numVerts; i++) {
- if (index[i] == nr) {
- add_v3_v3(vec, me_eval->mvert[i].co);
- count++;
- }
- }
- }
- else {
- if (nr < numVerts) {
- add_v3_v3(vec, me_eval->mvert[nr].co);
+ if (CustomData_has_layer(&me_eval->vdata, CD_ORIGINDEX) &&
+ !(em && me_eval->runtime.is_original)) {
+ const int *index = CustomData_get_layer(&me_eval->vdata, CD_ORIGINDEX);
+ /* Get the average of all verts with (original index == nr). */
+ for (int i = 0; i < numVerts; i++) {
+ if (index[i] == nr) {
+ add_v3_v3(vec, me_eval->mvert[i].co);
count++;
}
}
}
+ else {
+ if (nr < numVerts) {
+ add_v3_v3(vec, me_eval->mvert[nr].co);
+ count++;
+ }
+ }
if (count == 0) {
/* keep as 0, 0, 0 */