[Bf-blender-cvs] [3e9823ac4af] temp-T82156-parenting-and-constraints: Cleanup: Sanitise return value of `ED_object_parent_set()`

Sybren A. Stüvel noreply at git.blender.org
Mon Nov 2 15:50:22 CET 2020


Commit: 3e9823ac4afa42f7f9e2d89e5b29f7d74d6d0359
Author: Sybren A. Stüvel
Date:   Mon Nov 2 10:56:45 2020 +0100
Branches: temp-T82156-parenting-and-constraints
https://developer.blender.org/rB3e9823ac4afa42f7f9e2d89e5b29f7d74d6d0359

Cleanup: Sanitise return value of `ED_object_parent_set()`

Return `false` from `ED_object_parent_set()` when parent and child are
the same object. This would break the parenting operator, as returning
`false` stops its loop over all selected objects. This tight coupling
caused T82312.

The loop now has its own check for this, so that it properly continues,
and the implementation of `ED_object_parent_set()` is decoupled from its
surrounding code.

No functional changes.

===================================================================

M	source/blender/editors/include/ED_object.h
M	source/blender/editors/object/object_relations.c

===================================================================

diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 6fdd65fdcc9..2e9b711c99a 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -160,6 +160,7 @@ extern struct EnumPropertyItem prop_clear_parent_types[];
 extern struct EnumPropertyItem prop_make_parent_types[];
 #endif
 
+/* Set the object's parent, return true iff successful. */
 bool ED_object_parent_set(struct ReportList *reports,
                           const struct bContext *C,
                           struct Scene *scene,
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index 3d65a9e5fcb..46624a76999 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -696,7 +696,7 @@ bool ED_object_parent_set(ReportList *reports,
   /* Preconditions. */
   if (ob == par) {
     /* Parenting an object to itself is impossible. */
-    return true;
+    return false;
   }
 
   if (BKE_object_parent_loop_check(par, ob)) {
@@ -981,6 +981,12 @@ struct ParentingContext {
 static bool parent_set_nonvertex_parent(bContext *C, struct ParentingContext *parenting_context)
 {
   CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects) {
+    if (ob == parenting_context->par) {
+      /* ED_object_parent_set() will fail (and thus return false), but this case shouldn't break
+       * this loop. It's expected that the active object is also selected. */
+      continue;
+    }
+
     if (!ED_object_parent_set(parenting_context->reports,
                               C,
                               parenting_context->scene,
@@ -1005,6 +1011,12 @@ static bool parent_set_vertex_parent_with_kdtree(bContext *C,
   int vert_par[3] = {0, 0, 0};
 
   CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects) {
+    if (ob == parenting_context->par) {
+      /* ED_object_parent_set() will fail (and thus return false), but this case shouldn't break
+       * this loop. It's expected that the active object is also selected. */
+      continue;
+    }
+
     parent_set_vert_find(tree, ob, vert_par, parenting_context->is_vertex_tri);
     if (!ED_object_parent_set(parenting_context->reports,
                               C,



More information about the Bf-blender-cvs mailing list