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