Commit: 891a944dfd6ec02b42853ed1560930698abbc6c6
Author: Joshua Leung
Date:   Wed Jul 4 03:43:02 2018 +1200
Branches: greasepencil-object
https://developer.blender.org/rB891a944dfd6ec02b42853ed1560930698abbc6c6

Fix: Crash when erasing annotation strokes

The code was assuming that dvert data always exists on strokes
(it shouldn't, if we're doing everything correctly!), which
caused crashes when erasing annotation strokes (which definitely
don't have this data).

TODO:
Check that the rest of the code doesn't make similar assumptions!

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

M       source/blender/editors/gpencil/gpencil_edit.c

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

diff --git a/source/blender/editors/gpencil/gpencil_edit.c 
b/source/blender/editors/gpencil/gpencil_edit.c
index 6ebfdd087fe..ba4b93d8ad3 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -1748,19 +1748,25 @@ void gp_stroke_delete_tagged_points(bGPDframe *gpf, 
bGPDstroke *gps, bGPDstroke
 
                        /* Compute new buffer size (+ 1 needed as the endpoint 
index is "inclusive") */
                        new_stroke->totpoints = island->end_idx - 
island->start_idx + 1;
-                       new_stroke->points    = MEM_callocN(sizeof(bGPDspoint) 
* new_stroke->totpoints, "gp delete stroke fragment");
-                       new_stroke->dvert     = MEM_callocN(sizeof(MDeformVert) 
* new_stroke->totpoints, "gp delete stroke fragment weight");
 
-                       /* Copy over the relevant points */
+                       /* Copy over the relevant point data */
+                       new_stroke->points    = MEM_callocN(sizeof(bGPDspoint) 
* new_stroke->totpoints, "gp delete stroke fragment");
                        memcpy(new_stroke->points, gps->points + 
island->start_idx, sizeof(bGPDspoint) * new_stroke->totpoints);
-                       memcpy(new_stroke->dvert, gps->dvert + 
island->start_idx, sizeof(MDeformVert) * new_stroke->totpoints);
-                       /* Copy weights */
-                       int e = island->start_idx;
-                       for (int i = 0; i < new_stroke->totpoints; i++) {
-                               MDeformVert *dvert_dst = &gps->dvert[e];
-                               MDeformVert *dvert_src = &new_stroke->dvert[i];
-                               dvert_dst->dw = MEM_dupallocN(dvert_src->dw);
-                               e++;
+                       
+                       /* Copy over vertex weight data (if available) */
+                       if (new_stroke->dvert != NULL) {
+                               /* Copy over the relevant vertex-weight points 
*/
+                               new_stroke->dvert     = 
MEM_callocN(sizeof(MDeformVert) * new_stroke->totpoints, "gp delete stroke 
fragment weight");
+                               memcpy(new_stroke->dvert, gps->dvert + 
island->start_idx, sizeof(MDeformVert) * new_stroke->totpoints);
+                               
+                               /* Copy weights */
+                               int e = island->start_idx;
+                               for (int i = 0; i < new_stroke->totpoints; i++) 
{
+                                       MDeformVert *dvert_dst = &gps->dvert[e];
+                                       MDeformVert *dvert_src = 
&new_stroke->dvert[i];
+                                       dvert_dst->dw = 
MEM_dupallocN(dvert_src->dw);
+                                       e++;
+                               }
                        }
 
                        /* Each island corresponds to a new stroke. We must 
adjust the

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to