Fix: GPv3: Issues in BKE_grease_pencil_nomain_to_grease_pencil

* Handle the case where `drawing_array_num` is 0.
* Reset the pointer of the active node (because it is no longer valid)
* Cleanup copy-paste error in docstring
This commit is contained in:
Falk David
2024-09-30 14:46:17 +02:00
parent 6c52e4752f
commit dfc69eb750
2 changed files with 36 additions and 27 deletions

View File

@@ -1035,7 +1035,7 @@ GreasePencil *BKE_grease_pencil_new_nomain();
GreasePencil *BKE_grease_pencil_copy_for_eval(const GreasePencil *grease_pencil_src);
/**
* Move data from a grease pencil outside of the main data-base into a grease pencil in the
* data-base. Takes ownership of the source mesh. */
* data-base. Takes ownership of the source grease pencil. */
void BKE_grease_pencil_nomain_to_grease_pencil(GreasePencil *grease_pencil_src,
GreasePencil *grease_pencil_dst);

View File

@@ -1801,37 +1801,43 @@ void BKE_grease_pencil_nomain_to_grease_pencil(GreasePencil *grease_pencil_src,
/* Drawings. */
const int drawing_array_num = grease_pencil_src->drawing_array_num;
grease_pencil_dst->resize_drawings(drawing_array_num);
for (const int i : IndexRange(drawing_array_num)) {
if (grease_pencil_dst->drawing_array[i]) {
switch (grease_pencil_dst->drawing_array[i]->type) {
case GP_DRAWING:
MEM_delete(&reinterpret_cast<GreasePencilDrawing *>(grease_pencil_dst->drawing_array[i])
->wrap());
if (drawing_array_num > 0) {
grease_pencil_dst->resize_drawings(drawing_array_num);
for (const int i : IndexRange(drawing_array_num)) {
if (grease_pencil_dst->drawing_array[i]) {
switch (grease_pencil_dst->drawing_array[i]->type) {
case GP_DRAWING:
MEM_delete(
&reinterpret_cast<GreasePencilDrawing *>(grease_pencil_dst->drawing_array[i])
->wrap());
break;
case GP_DRAWING_REFERENCE:
MEM_delete(&reinterpret_cast<GreasePencilDrawingReference *>(
grease_pencil_dst->drawing_array[i])
->wrap());
break;
}
}
switch (grease_pencil_src->drawing_array[i]->type) {
case GP_DRAWING: {
const Drawing &src_drawing =
reinterpret_cast<GreasePencilDrawing *>(grease_pencil_src->drawing_array[i])->wrap();
grease_pencil_dst->drawing_array[i] = reinterpret_cast<GreasePencilDrawingBase *>(
MEM_new<Drawing>(__func__, src_drawing));
break;
}
case GP_DRAWING_REFERENCE:
MEM_delete(&reinterpret_cast<GreasePencilDrawingReference *>(
grease_pencil_dst->drawing_array[i])
->wrap());
const DrawingReference &src_drawing_ref =
reinterpret_cast<GreasePencilDrawingReference *>(grease_pencil_src->drawing_array[i])
->wrap();
grease_pencil_dst->drawing_array[i] = reinterpret_cast<GreasePencilDrawingBase *>(
MEM_new<DrawingReference>(__func__, src_drawing_ref));
break;
}
}
switch (grease_pencil_src->drawing_array[i]->type) {
case GP_DRAWING: {
const Drawing &src_drawing =
reinterpret_cast<GreasePencilDrawing *>(grease_pencil_src->drawing_array[i])->wrap();
grease_pencil_dst->drawing_array[i] = reinterpret_cast<GreasePencilDrawingBase *>(
MEM_new<Drawing>(__func__, src_drawing));
break;
}
case GP_DRAWING_REFERENCE:
const DrawingReference &src_drawing_ref = reinterpret_cast<GreasePencilDrawingReference *>(
grease_pencil_src->drawing_array[i])
->wrap();
grease_pencil_dst->drawing_array[i] = reinterpret_cast<GreasePencilDrawingBase *>(
MEM_new<DrawingReference>(__func__, src_drawing_ref));
break;
}
}
else {
free_drawing_array(*grease_pencil_dst);
}
/* Layers. */
@@ -1843,6 +1849,9 @@ void BKE_grease_pencil_nomain_to_grease_pencil(GreasePencil *grease_pencil_src,
__func__, grease_pencil_src->root_group_ptr->wrap());
BLI_assert(grease_pencil_src->layers().size() == grease_pencil_dst->layers().size());
/* Reset the active node. */
grease_pencil_dst->active_node = nullptr;
CustomData_init_from(&grease_pencil_src->layers_data,
&grease_pencil_dst->layers_data,
eCustomDataMask(CD_MASK_ALL),