GP: Fix memory leaks when use cutter with weights
There were some issues when copy the weights and other memory leaks. Also some code cleanup.
This commit is contained in:
parent
2b0fb0d7bf
commit
0af8ad51c0
Notes:
blender-bot
2023-02-14 06:05:22 +01:00
Referenced by issue #60701, GP using cutter tool on stroke with vertex group crashes blender
|
@ -1843,7 +1843,6 @@ void gp_stroke_delete_tagged_points(bGPDframe *gpf, bGPDstroke *gps, bGPDstroke
|
|||
bool in_island = false;
|
||||
int num_islands = 0;
|
||||
|
||||
|
||||
/* First Pass: Identify start/end of islands */
|
||||
bGPDspoint *pt = gps->points;
|
||||
for (int i = 0; i < gps->totpoints; i++, pt++) {
|
||||
|
@ -1902,13 +1901,14 @@ void gp_stroke_delete_tagged_points(bGPDframe *gpf, bGPDstroke *gps, bGPDstroke
|
|||
/* 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);
|
||||
MDeformVert *dvert_src = &gps->dvert[e];
|
||||
MDeformVert *dvert_dst = &new_stroke->dvert[i];
|
||||
if (dvert_src->dw) {
|
||||
dvert_dst->dw = MEM_dupallocN(dvert_src->dw);
|
||||
}
|
||||
e++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Each island corresponds to a new stroke. We must adjust the
|
||||
* timings of these new strokes:
|
||||
*
|
||||
|
@ -1954,17 +1954,8 @@ void gp_stroke_delete_tagged_points(bGPDframe *gpf, bGPDstroke *gps, bGPDstroke
|
|||
MEM_freeN(islands);
|
||||
|
||||
/* Delete the old stroke */
|
||||
if (gps->points) {
|
||||
MEM_freeN(gps->points);
|
||||
}
|
||||
if (gps->dvert) {
|
||||
BKE_gpencil_free_stroke_weights(gps);
|
||||
MEM_freeN(gps->dvert);
|
||||
}
|
||||
if (gps->triangles) {
|
||||
MEM_freeN(gps->triangles);
|
||||
}
|
||||
BLI_freelinkN(&gpf->strokes, gps);
|
||||
BLI_remlink(&gpf->strokes, gps);
|
||||
BKE_gpencil_free_stroke(gps);
|
||||
}
|
||||
|
||||
/* Split selected strokes into segments, splitting on selected points */
|
||||
|
|
|
@ -2057,6 +2057,11 @@ static bool gpencil_check_collision(
|
|||
static void gp_copy_points(
|
||||
bGPDstroke *gps, bGPDspoint *pt, bGPDspoint *pt_final, int i, int i2)
|
||||
{
|
||||
/* don't copy same point */
|
||||
if (i == i2) {
|
||||
return;
|
||||
}
|
||||
|
||||
copy_v3_v3(&pt_final->x, &pt->x);
|
||||
pt_final->pressure = pt->pressure;
|
||||
pt_final->strength = pt->strength;
|
||||
|
@ -2068,9 +2073,16 @@ static void gp_copy_points(
|
|||
if (gps->dvert != NULL) {
|
||||
MDeformVert *dvert = &gps->dvert[i];
|
||||
MDeformVert *dvert_final = &gps->dvert[i2];
|
||||
MEM_SAFE_FREE(dvert_final->dw);
|
||||
|
||||
dvert_final->totweight = dvert->totweight;
|
||||
dvert_final->dw = dvert->dw;
|
||||
if (dvert->dw == NULL) {
|
||||
dvert_final->dw = NULL;
|
||||
dvert_final->totweight = 0;
|
||||
}
|
||||
else {
|
||||
dvert_final->dw = MEM_dupallocN(dvert->dw);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue