diff options
-rw-r--r-- | source/blender/blenkernel/BKE_layer.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/layer_utils.c | 23 | ||||
-rw-r--r-- | source/blender/editors/gpencil/gpencil_mesh.c | 16 | ||||
-rw-r--r-- | source/blender/editors/gpencil/gpencil_trace_ops.c | 20 |
4 files changed, 48 insertions, 16 deletions
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h index 5682e3b9815..7091a060243 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -377,9 +377,8 @@ struct Object **BKE_view_layer_array_selected_objects_params( uint *r_len, const struct ObjectsInViewLayerParams *params); -struct Object *BKE_view_layer_first_selected_object_by_type(struct ViewLayer *view_layer, - const struct View3D *v3d, - const short ob_type); +struct Object *BKE_view_layer_non_active_selected_object(struct ViewLayer *view_layer, + const struct View3D *v3d); #define BKE_view_layer_array_selected_objects(view_layer, v3d, r_len, ...) \ BKE_view_layer_array_selected_objects_params( \ diff --git a/source/blender/blenkernel/intern/layer_utils.c b/source/blender/blenkernel/intern/layer_utils.c index b48aef2d05e..974a5a24e8a 100644 --- a/source/blender/blenkernel/intern/layer_utils.c +++ b/source/blender/blenkernel/intern/layer_utils.c @@ -192,15 +192,28 @@ bool BKE_view_layer_filter_edit_mesh_has_edges(Object *ob, void *UNUSED(user_dat return false; } -/** Select first selected object of the type specified. */ -Object *BKE_view_layer_first_selected_object_by_type(struct ViewLayer *view_layer, - const struct View3D *v3d, - const short ob_type) +/** + * Use this in rare cases we need to detect a pair of objects (active, selected). + * This returns the other non-active selected object. + * + * Returns NULL with it finds multiple other selected objects + * as behavior in this case would be random from the user perspective. + */ +Object *BKE_view_layer_non_active_selected_object(struct ViewLayer *view_layer, + const struct View3D *v3d) { + Object *ob_active = OBACT(view_layer); Object *ob_result = NULL; FOREACH_SELECTED_OBJECT_BEGIN (view_layer, v3d, ob_iter) { - if (ob_iter->type == ob_type) { + if (ob_iter == ob_active) { + continue; + } + + if (ob_result == NULL) { ob_result = ob_iter; + } + else { + ob_result = NULL; break; } } diff --git a/source/blender/editors/gpencil/gpencil_mesh.c b/source/blender/editors/gpencil/gpencil_mesh.c index 2f3a4d747a7..84314202dfc 100644 --- a/source/blender/editors/gpencil/gpencil_mesh.c +++ b/source/blender/editors/gpencil/gpencil_mesh.c @@ -224,12 +224,22 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op) const int project_type = RNA_enum_get(op->ptr, "project_type"); eGP_TargetObjectMode target = RNA_enum_get(op->ptr, "target"); - /* Create a new grease pencil object in origin or resuse selected. */ + /* Create a new grease pencil object in origin or reuse selected. */ Object *ob_gpencil = NULL; bool newob = false; + if (target == GP_TARGET_OB_SELECTED) { - ob_gpencil = BKE_view_layer_first_selected_object_by_type( - CTX_data_view_layer(C), v3d, OB_GPENCIL); + ob_gpencil = BKE_view_layer_non_active_selected_object(CTX_data_view_layer(C), v3d); + if (ob_gpencil != NULL) { + if (ob_gpencil->type != OB_GPENCIL) { + BKE_report(op->reports, RPT_WARNING, "Target object not a grease pencil, ignoring!"); + ob_gpencil = NULL; + } + else if (BKE_object_obdata_is_libdata(ob_gpencil)) { + BKE_report(op->reports, RPT_WARNING, "Target object library-data, ignoring!"); + ob_gpencil = NULL; + } + } } if (ob_gpencil == NULL) { diff --git a/source/blender/editors/gpencil/gpencil_trace_ops.c b/source/blender/editors/gpencil/gpencil_trace_ops.c index 75683c9ccf3..0be9d74278e 100644 --- a/source/blender/editors/gpencil/gpencil_trace_ops.c +++ b/source/blender/editors/gpencil/gpencil_trace_ops.c @@ -321,12 +321,22 @@ static int gpencil_trace_image_exec(bContext *C, wmOperator *op) job->image = (Image *)job->ob_active->data; job->frame_target = CFRA; - /* Create a new grease pencil object or resuse selected. */ + /* Create a new grease pencil object or reuse selected. */ eGP_TargetObjectMode target = RNA_enum_get(op->ptr, "target"); - job->ob_gpencil = (target == GP_TARGET_OB_SELECTED) ? - BKE_view_layer_first_selected_object_by_type( - CTX_data_view_layer(C), job->v3d, OB_GPENCIL) : - NULL; + job->ob_gpencil = (target == GP_TARGET_OB_SELECTED) ? BKE_view_layer_non_active_selected_object( + CTX_data_view_layer(C), job->v3d) : + NULL; + + if (job->ob_gpencil != NULL) { + if (job->ob_gpencil->type != OB_GPENCIL) { + BKE_report(op->reports, RPT_WARNING, "Target object not a grease pencil, ignoring!"); + job->ob_gpencil = NULL; + } + else if (BKE_object_obdata_is_libdata(job->ob_gpencil)) { + BKE_report(op->reports, RPT_WARNING, "Target object library-data, ignoring!"); + job->ob_gpencil = NULL; + } + } job->was_ob_created = false; |