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:
@@ -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);
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user