Fix: GPv3: Crash in draw mode when group is active

Hovering the mouse over the 3D viewport while a layer group
was active would cause a crash if the brush radius unit was `Scene`.

This was because the `DrawingPlacement` helper expected a
layer to be passed to the constructor.

Since it's not always the case that there is an active layer, this
change makes sure that we fallback to "object space" in
the drawing placement.
This commit is contained in:
Falk David
2024-05-24 11:17:13 +02:00
parent f011d8f508
commit 4e60b96e87
8 changed files with 11 additions and 10 deletions

View File

@@ -644,7 +644,7 @@ static int grease_pencil_primitive_invoke(bContext *C, wmOperator *op, const wmE
/* Initialize helper class for projecting screen space coordinates. */
DrawingPlacement placement = DrawingPlacement(
*vc.scene, *vc.region, *view3d, *vc.obact, *grease_pencil->get_active_layer());
*vc.scene, *vc.region, *view3d, *vc.obact, grease_pencil->get_active_layer());
if (placement.use_project_to_surface()) {
placement.cache_viewport_depths(CTX_data_depsgraph_pointer(C), vc.region, view3d);
}

View File

@@ -37,10 +37,11 @@ DrawingPlacement::DrawingPlacement(const Scene &scene,
const ARegion &region,
const View3D &view3d,
const Object &eval_object,
const bke::greasepencil::Layer &layer)
const bke::greasepencil::Layer *layer)
: region_(&region), view3d_(&view3d)
{
layer_space_to_world_space_ = layer.to_world_space(eval_object);
layer_space_to_world_space_ = (layer != nullptr) ? layer->to_world_space(eval_object) :
eval_object.object_to_world();
world_space_to_layer_space_ = math::invert(layer_space_to_world_space_);
/* Initialize DrawingPlacementPlane from toolsettings. */
switch (scene.toolsettings->gp_sculpt.lock_axis) {

View File

@@ -102,7 +102,7 @@ class DrawingPlacement {
const ARegion &region,
const View3D &view3d,
const Object &eval_object,
const bke::greasepencil::Layer &layer);
const bke::greasepencil::Layer *layer);
~DrawingPlacement();
public:

View File

@@ -960,7 +960,7 @@ bke::CurvesGeometry fill_strokes(const ViewContext &view_context,
const bool use_xray = false;
const float4x4 layer_to_world = layer.to_world_space(object);
ed::greasepencil::DrawingPlacement placement(scene, region, view3d, object_eval, layer);
ed::greasepencil::DrawingPlacement placement(scene, region, view3d, object_eval, &layer);
const float3 fill_point_world = math::transform_point(layer_to_world,
placement.project(fill_point_view));

View File

@@ -624,7 +624,7 @@ void PaintOperation::on_stroke_begin(const bContext &C, const InputSample &start
const bke::greasepencil::Layer &layer = *grease_pencil->get_active_layer();
/* Initialize helper class for projecting screen space coordinates. */
placement_ = ed::greasepencil::DrawingPlacement(*scene, *region, *view3d, *eval_object, layer);
placement_ = ed::greasepencil::DrawingPlacement(*scene, *region, *view3d, *eval_object, &layer);
if (placement_.use_project_to_surface()) {
placement_.cache_viewport_depths(CTX_data_depsgraph_pointer(&C), region, view3d);
}

View File

@@ -246,7 +246,7 @@ void GreasePencilStrokeOperationCommon::foreach_editable_drawing(
threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) {
const Layer &layer = *grease_pencil.layer(info.layer_index);
ed::greasepencil::DrawingPlacement placement(scene, region, view3d, object_eval, layer);
ed::greasepencil::DrawingPlacement placement(scene, region, view3d, object_eval, &layer);
if (placement.use_project_to_surface()) {
placement.cache_viewport_depths(&depsgraph, &region, &view3d);
}

View File

@@ -91,7 +91,7 @@ void GrabOperation::foreach_grabbed_drawing(
return;
}
ed::greasepencil::DrawingPlacement placement(scene, region, view3d, object_eval, layer);
ed::greasepencil::DrawingPlacement placement(scene, region, view3d, object_eval, &layer);
if (placement.use_project_to_surface()) {
placement.cache_viewport_depths(&depsgraph, &region, &view3d);
}
@@ -148,7 +148,7 @@ void GrabOperation::on_stroke_begin(const bContext &C, const InputSample &start_
const bke::greasepencil::Layer &layer = *grease_pencil.layer(info.layer_index);
BLI_assert(grease_pencil.get_drawing_at(layer, info.frame_number) == &info.drawing);
ed::greasepencil::DrawingPlacement placement(scene, region, view3d, ob_eval, layer);
ed::greasepencil::DrawingPlacement placement(scene, region, view3d, ob_eval, &layer);
GreasePencilStrokeParams params = {*scene.toolsettings,
region,
ob_orig,

View File

@@ -1541,7 +1541,7 @@ static void grease_pencil_brush_cursor_draw(PaintCursorContext *pcontext)
}
if (BKE_brush_use_locked_size(pcontext->scene, brush)) {
const bke::greasepencil::Layer &layer = *grease_pencil->get_active_layer();
const bke::greasepencil::Layer *layer = grease_pencil->get_active_layer();
const ed::greasepencil::DrawingPlacement placement(
*pcontext->scene, *pcontext->region, *pcontext->vc.v3d, *object, layer);
const float radius = BKE_brush_unprojected_radius_get(pcontext->scene, brush);