Fix: GPv3: Issues in find_or_create_layer_in_dst_by_name

There were some issues in this function.
* Undefined behavior for the fallback when getting the `layer_src`
* Searching for the layer `grease_pencil_dst` based on the value of a pointer, instead of the `name`.

Pull Request: https://projects.blender.org/blender/blender/pulls/122426
This commit is contained in:
Falk David
2024-05-29 11:25:15 +02:00
committed by Falk David
parent 91fee3eca8
commit 6e76b9f6b3

View File

@@ -1875,7 +1875,7 @@ static Object *duplicate_grease_pencil_object(Main *bmain,
Scene *scene,
ViewLayer *view_layer,
Base *base_prev,
GreasePencil &grease_pencil_src)
const GreasePencil &grease_pencil_src)
{
const eDupli_ID_Flags dupflag = eDupli_ID_Flags(U.dupflag & USER_DUP_ACT);
Base *base_new = object::add_duplicate(bmain, scene, view_layer, base_prev, dupflag);
@@ -1891,14 +1891,14 @@ static bke::greasepencil::Layer &find_or_create_layer_in_dst_by_name(
{
using namespace bke::greasepencil;
Layer layer_src = *grease_pencil_src.layers().get(layer_index, &layer_src);
const int dst_layer_index = grease_pencil_dst.layers_for_write().first_index_try(&layer_src);
if (dst_layer_index != -1) {
return *grease_pencil_dst.layers_for_write()[dst_layer_index];
/* This assumes that the index is valid. Will cause an assert if it is not. */
const Layer &layer_src = *grease_pencil_src.layer(layer_index);
if (TreeNode *node = grease_pencil_dst.find_node_by_name(layer_src.name())) {
return node->as_layer();
}
Layer &dst_layer = grease_pencil_dst.add_layer(layer_src.name());
/* If the layer can't be found in `grease_pencil_dst` by name add a new layer. */
Layer &new_layer = grease_pencil_dst.add_layer(layer_src.name());
/* Transfer Layer attributes. */
bke::gather_attributes(grease_pencil_src.attributes(),
@@ -1908,7 +1908,7 @@ static bke::greasepencil::Layer &find_or_create_layer_in_dst_by_name(
Span({layer_index}),
grease_pencil_dst.attributes_for_write());
return dst_layer;
return new_layer;
}
static bool grease_pencil_separate_selected(bContext &C,