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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -37,10 +37,11 @@ DrawingPlacement::DrawingPlacement(const Scene &scene,
|
||||
const ARegion ®ion,
|
||||
const View3D &view3d,
|
||||
const Object &eval_object,
|
||||
const bke::greasepencil::Layer &layer)
|
||||
const bke::greasepencil::Layer *layer)
|
||||
: region_(®ion), 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) {
|
||||
|
||||
@@ -102,7 +102,7 @@ class DrawingPlacement {
|
||||
const ARegion ®ion,
|
||||
const View3D &view3d,
|
||||
const Object &eval_object,
|
||||
const bke::greasepencil::Layer &layer);
|
||||
const bke::greasepencil::Layer *layer);
|
||||
~DrawingPlacement();
|
||||
|
||||
public:
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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, ®ion, &view3d);
|
||||
}
|
||||
|
||||
@@ -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, ®ion, &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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user