GPv3: Fix: Crash when drawing without a layer #109330

Closed
casey-bianco-davis wants to merge 11 commits from casey-bianco-davis:GPv3-draw-crash-no-layer into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
1 changed files with 13 additions and 1 deletions

View File

@ -42,6 +42,7 @@ struct PaintOperationExecutor {
using namespace blender::bke;
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(&C);
ARegion *region = CTX_wm_region(&C);
Scene *scene = CTX_data_scene(&C);
Object *obact = CTX_data_active_object(&C);
Object *ob_eval = DEG_get_evaluated_object(depsgraph, obact);
@ -52,6 +53,12 @@ struct PaintOperationExecutor {
*/
GreasePencil &grease_pencil = *static_cast<GreasePencil *>(ob_eval->data);
if (!grease_pencil.has_active_layer()) {
bke::greasepencil::Layer &new_layer = grease_pencil.add_layer("GP_Layer");
grease_pencil.set_active_layer(&new_layer);
grease_pencil.insert_blank_frame(new_layer, scene->r.cfra, 0, BEZT_KEYTYPE_KEYFRAME);
}
float4 plane{0.0f, -1.0f, 0.0f, 0.0f};
casey-bianco-davis marked this conversation as resolved Outdated

This is not right. The frame should point to the newly added empty drawing.
GreasePencilFrame frame{this->drawings().index_range().last(), 0, BEZT_KEYTYPE_KEYFRAME};

This is not right. The `frame` should point to the newly added empty drawing. `GreasePencilFrame frame{this->drawings().index_range().last(), 0, BEZT_KEYTYPE_KEYFRAME};`
float3 proj_pos;
ED_view3d_win_to_3d_on_plane(region, plane, extension_sample.mouse_position, false, proj_pos);
@ -85,7 +92,12 @@ void PaintOperation::on_stroke_done(const bContext &C)
GreasePencil &grease_pencil_orig = *static_cast<GreasePencil *>(obact->data);
GreasePencil &grease_pencil_eval = *static_cast<GreasePencil *>(ob_eval->data);
BLI_assert(grease_pencil_orig.has_active_layer());
if (!grease_pencil_orig.has_active_layer()) {
bke::greasepencil::Layer &new_layer = grease_pencil_orig.add_layer("GP_Layer");
grease_pencil_orig.set_active_layer(&new_layer);
grease_pencil_orig.insert_blank_frame(new_layer, scene->r.cfra, 0, BEZT_KEYTYPE_KEYFRAME);
}
BLI_assert(grease_pencil_orig.has_active_layer() && grease_pencil_eval.has_active_layer());
const bke::greasepencil::Layer &active_layer_orig = *grease_pencil_orig.get_active_layer();
int index_orig = active_layer_orig.drawing_index_at(scene->r.cfra);