Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_layer.h5
-rw-r--r--source/blender/blenkernel/intern/layer_utils.c23
-rw-r--r--source/blender/editors/gpencil/gpencil_mesh.c16
-rw-r--r--source/blender/editors/gpencil/gpencil_trace_ops.c20
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;