Fix #128914: GPv3: Crash applying modifier to all frames

The issue was that the `merge_layers` function assumed that the
`src_grease_pencil` always returns a drawing when calling
`get_eval_drawing` which can return `nullptr`.

The fix makes sure to check that the `src_drawing` exists.

Pull Request: https://projects.blender.org/blender/blender/pulls/129074
This commit is contained in:
Falk David
2024-10-16 10:22:58 +02:00
committed by Falk David
parent 0211a68fb4
commit 29b884903a

View File

@@ -64,6 +64,7 @@ GreasePencil *merge_layers(const GreasePencil &src_grease_pencil,
const Layer &first_src_layer = src_grease_pencil.layer(first_src_layer_i);
layer.set_name(first_src_layer.name());
Drawing *drawing = new_grease_pencil->get_eval_drawing(layer);
BLI_assert(drawing != nullptr);
curves_by_new_layer[new_layer_i] = &drawing->strokes_for_write();
}
@@ -82,24 +83,26 @@ GreasePencil *merge_layers(const GreasePencil &src_grease_pencil,
if (src_layer_indices.size() == 1) {
/* Optimization for the case if the new layer corresponds to exactly one source layer. */
const bke::CurvesGeometry &src_curves =
src_grease_pencil.get_eval_drawing(first_src_layer)->strokes();
new_curves = src_curves;
if (const Drawing *src_drawing = src_grease_pencil.get_eval_drawing(first_src_layer)) {
const bke::CurvesGeometry &src_curves = src_drawing->strokes();
new_curves = src_curves;
}
continue;
}
/* Needed to transform the positions from all spaces into the same space. */
const float4x4 new_layer_transform_inv = math::invert(new_layer_transform);
Vector<const bke::CurvesGeometry *> all_src_curves(src_layer_indices.size());
Vector<float4x4> transforms_to_apply(src_layer_indices.size());
Vector<const bke::CurvesGeometry *> all_src_curves;
Vector<float4x4> transforms_to_apply;
for (const int i : src_layer_indices.index_range()) {
const int src_layer_i = src_layer_indices[i];
const Layer &src_layer = src_grease_pencil.layer(src_layer_i);
const Drawing &src_drawing = *src_grease_pencil.get_eval_drawing(src_layer);
const bke::CurvesGeometry &src_curves = src_drawing.strokes();
all_src_curves[i] = &src_curves;
transforms_to_apply[i] = new_layer_transform_inv * src_layer.local_transform();
if (const Drawing *src_drawing = src_grease_pencil.get_eval_drawing(src_layer)) {
const bke::CurvesGeometry &src_curves = src_drawing->strokes();
all_src_curves.append(&src_curves);
transforms_to_apply.append(new_layer_transform_inv * src_layer.local_transform());
}
}
new_curves = join_curves(
src_grease_pencil, all_src_curves, transforms_to_apply, attribute_filter);