[Bf-blender-cvs] [f681e9ea498] master: Fix UV gizmos poll failing with multiple objects

Campbell Barton noreply at git.blender.org
Thu Jan 9 07:54:45 CET 2020


Commit: f681e9ea4988940e0d23ec818f21f3af5e9a7222
Author: Campbell Barton
Date:   Thu Jan 9 17:50:52 2020 +1100
Branches: master
https://developer.blender.org/rBf681e9ea4988940e0d23ec818f21f3af5e9a7222

Fix UV gizmos poll failing with multiple objects

Only the active objects UV selection was checked.
This also avoids checking UV selection for every poll call,
now this is only done on refresh.

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

M	source/blender/editors/include/ED_uvedit.h
M	source/blender/editors/transform/transform_gizmo_2d.c
M	source/blender/editors/uvedit/uvedit_ops.c

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

diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index 1debdee53e9..c912778afd8 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -65,6 +65,12 @@ bool ED_uvedit_center_multi(const struct Scene *scene,
                             float r_cent[2],
                             char mode);
 
+bool ED_uvedit_center_from_pivot_ex(struct SpaceImage *sima,
+                                    struct Scene *scene,
+                                    struct ViewLayer *view_layer,
+                                    float r_center[2],
+                                    char mode,
+                                    bool *r_has_select);
 bool ED_uvedit_center_from_pivot(struct SpaceImage *sima,
                                  struct Scene *scene,
                                  struct ViewLayer *view_layer,
diff --git a/source/blender/editors/transform/transform_gizmo_2d.c b/source/blender/editors/transform/transform_gizmo_2d.c
index 84309c541af..793552865a6 100644
--- a/source/blender/editors/transform/transform_gizmo_2d.c
+++ b/source/blender/editors/transform/transform_gizmo_2d.c
@@ -58,6 +58,30 @@
 /** \name Shared Callback's
  */
 
+static bool gizmo2d_generic_poll(const bContext *C, wmGizmoGroupType *gzgt)
+{
+  if (!ED_gizmo_poll_or_unlink_delayed_from_tool(C, gzgt)) {
+    return false;
+  }
+
+  if ((U.gizmo_flag & USER_GIZMO_DRAW) == 0) {
+    return false;
+  }
+
+  ScrArea *sa = CTX_wm_area(C);
+  switch (sa->spacetype) {
+    case SPACE_IMAGE: {
+      SpaceImage *sima = sa->spacedata.first;
+      Object *obedit = CTX_data_edit_object(C);
+      if (!ED_space_image_show_uvedit(sima, obedit)) {
+        return false;
+      }
+    }
+  }
+
+  return true;
+}
+
 static void gizmo2d_pivot_point_message_subscribe(struct wmGizmoGroup *gzgroup,
                                                   struct wmMsgBus *mbus,
                                                   /* Additional args. */
@@ -180,7 +204,7 @@ static GizmoGroup2D *gizmogroup2d_init(wmGizmoGroup *gzgroup)
 /**
  * Calculates origin in view space, use with #gizmo2d_origin_to_region.
  */
-static void gizmo2d_calc_bounds(const bContext *C, float *r_center, float *r_min, float *r_max)
+static bool gizmo2d_calc_bounds(const bContext *C, float *r_center, float *r_min, float *r_max)
 {
   float min_buf[2], max_buf[2];
   if (r_min == NULL) {
@@ -191,6 +215,7 @@ static void gizmo2d_calc_bounds(const bContext *C, float *r_center, float *r_min
   }
 
   ScrArea *sa = CTX_wm_area(C);
+  bool changed = false;
   if (sa->spacetype == SPACE_IMAGE) {
     SpaceImage *sima = sa->spacedata.first;
     Scene *scene = CTX_data_scene(C);
@@ -199,29 +224,33 @@ static void gizmo2d_calc_bounds(const bContext *C, float *r_center, float *r_min
     uint objects_len = 0;
     Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(
         view_layer, NULL, &objects_len);
-    if (!ED_uvedit_minmax_multi(scene, ima, objects, objects_len, r_min, r_max)) {
-      zero_v2(r_min);
-      zero_v2(r_max);
+    if (ED_uvedit_minmax_multi(scene, ima, objects, objects_len, r_min, r_max)) {
+      changed = true;
     }
     MEM_freeN(objects);
   }
-  else {
+
+  if (changed == false) {
     zero_v2(r_min);
     zero_v2(r_max);
   }
+
   mid_v2_v2v2(r_center, r_min, r_max);
+  return changed;
 }
 
-static void gizmo2d_calc_center(const bContext *C, float r_center[2])
+static bool gizmo2d_calc_center(const bContext *C, float r_center[2])
 {
   ScrArea *sa = CTX_wm_area(C);
+  bool has_select = false;
   zero_v2(r_center);
   if (sa->spacetype == SPACE_IMAGE) {
     SpaceImage *sima = sa->spacedata.first;
     Scene *scene = CTX_data_scene(C);
     ViewLayer *view_layer = CTX_data_view_layer(C);
-    ED_uvedit_center_from_pivot(sima, scene, view_layer, r_center, sima->around);
+    ED_uvedit_center_from_pivot_ex(sima, scene, view_layer, r_center, sima->around, &has_select);
   }
+  return has_select;
 }
 
 /**
@@ -366,11 +395,12 @@ static void gizmo2d_xform_refresh(const bContext *C, wmGizmoGroup *gzgroup)
 {
   GizmoGroup2D *ggd = gzgroup->customdata;
   float origin[3];
+  bool has_select;
   if (ggd->no_cage) {
-    gizmo2d_calc_center(C, origin);
+    has_select = gizmo2d_calc_center(C, origin);
   }
   else {
-    gizmo2d_calc_bounds(C, origin, ggd->min, ggd->max);
+    has_select = gizmo2d_calc_bounds(C, origin, ggd->min, ggd->max);
   }
   copy_v2_v2(ggd->origin, origin);
   bool show_cage = !ggd->no_cage && !equals_v2v2(ggd->min, ggd->max);
@@ -385,58 +415,66 @@ static void gizmo2d_xform_refresh(const bContext *C, wmGizmoGroup *gzgroup)
     }
   }
 
-  if (show_cage) {
-    ggd->cage->flag &= ~WM_GIZMO_HIDDEN;
+  if (has_select == false) {
     for (int i = 0; i < ARRAY_SIZE(ggd->translate_xy); i++) {
-      wmGizmo *gz = ggd->translate_xy[i];
-      gz->flag |= WM_GIZMO_HIDDEN;
+      ggd->translate_xy[i]->flag |= WM_GIZMO_HIDDEN;
     }
+    ggd->cage->flag |= WM_GIZMO_HIDDEN;
   }
   else {
-    ggd->cage->flag |= WM_GIZMO_HIDDEN;
-    for (int i = 0; i < ARRAY_SIZE(ggd->translate_xy); i++) {
-      wmGizmo *gz = ggd->translate_xy[i];
-      gz->flag &= ~WM_GIZMO_HIDDEN;
+    if (show_cage) {
+      ggd->cage->flag &= ~WM_GIZMO_HIDDEN;
+      for (int i = 0; i < ARRAY_SIZE(ggd->translate_xy); i++) {
+        wmGizmo *gz = ggd->translate_xy[i];
+        gz->flag |= WM_GIZMO_HIDDEN;
+      }
+    }
+    else {
+      ggd->cage->flag |= WM_GIZMO_HIDDEN;
+      for (int i = 0; i < ARRAY_SIZE(ggd->translate_xy); i++) {
+        wmGizmo *gz = ggd->translate_xy[i];
+        gz->flag &= ~WM_GIZMO_HIDDEN;
+      }
     }
-  }
 
-  if (show_cage) {
-    wmGizmoOpElem *gzop;
-    float mid[2];
-    const float *min = ggd->min;
-    const float *max = ggd->max;
-    mid_v2_v2v2(mid, min, max);
-
-    gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X);
-    PropertyRNA *prop_center_override = RNA_struct_find_property(&gzop->ptr, "center_override");
-    RNA_property_float_set_array(
-        &gzop->ptr, prop_center_override, (float[3]){max[0], mid[1], 0.0f});
-    gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X);
-    RNA_property_float_set_array(
-        &gzop->ptr, prop_center_override, (float[3]){min[0], mid[1], 0.0f});
-    gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_Y);
-    RNA_property_float_set_array(
-        &gzop->ptr, prop_center_override, (float[3]){mid[0], max[1], 0.0f});
-    gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_Y);
-    RNA_property_float_set_array(
-        &gzop->ptr, prop_center_override, (float[3]){mid[0], min[1], 0.0f});
-
-    gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MIN_Y);
-    RNA_property_float_set_array(
-        &gzop->ptr, prop_center_override, (float[3]){max[0], max[1], 0.0f});
-    gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MAX_Y);
-    RNA_property_float_set_array(
-        &gzop->ptr, prop_center_override, (float[3]){max[0], min[1], 0.0f});
-    gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MIN_Y);
-    RNA_property_float_set_array(
-        &gzop->ptr, prop_center_override, (float[3]){min[0], max[1], 0.0f});
-    gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MAX_Y);
-    RNA_property_float_set_array(
-        &gzop->ptr, prop_center_override, (float[3]){min[0], min[1], 0.0f});
-
-    gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_ROTATE);
-    RNA_property_float_set_array(
-        &gzop->ptr, prop_center_override, (float[3]){mid[0], mid[1], 0.0f});
+    if (show_cage) {
+      wmGizmoOpElem *gzop;
+      float mid[2];
+      const float *min = ggd->min;
+      const float *max = ggd->max;
+      mid_v2_v2v2(mid, min, max);
+
+      gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X);
+      PropertyRNA *prop_center_override = RNA_struct_find_property(&gzop->ptr, "center_override");
+      RNA_property_float_set_array(
+          &gzop->ptr, prop_center_override, (float[3]){max[0], mid[1], 0.0f});
+      gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X);
+      RNA_property_float_set_array(
+          &gzop->ptr, prop_center_override, (float[3]){min[0], mid[1], 0.0f});
+      gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_Y);
+      RNA_property_float_set_array(
+          &gzop->ptr, prop_center_override, (float[3]){mid[0], max[1], 0.0f});
+      gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_Y);
+      RNA_property_float_set_array(
+          &gzop->ptr, prop_center_override, (float[3]){mid[0], min[1], 0.0f});
+
+      gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MIN_Y);
+      RNA_property_float_set_array(
+          &gzop->ptr, prop_center_override, (float[3]){max[0], max[1], 0.0f});
+      gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MAX_Y);
+      RNA_property_float_set_array(
+          &gzop->ptr, prop_center_override, (float[3]){max[0], min[1], 0.0f});
+      gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MIN_Y);
+      RNA_property_float_set_array(
+          &gzop->ptr, prop_center_override, (float[3]){min[0], max[1], 0.0f});
+      gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MAX_Y);
+      RNA_property_float_set_array(
+          &gzop->ptr, prop_center_override, (float[3]){min[0], min[1], 0.0f});
+
+      gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_ROTATE);
+      RNA_property_float_set_array(
+          &gzop->ptr, prop_center_override, (float[3]){mid[0], mid[1], 0.0f});
+    }
   }
 }
 
@@ -460,50 +498,6 @@ static void gizmo2d_xform_draw_prepare(const bContext *C, wmGizmoGroup *gzgroup)
   ggd->cage->matrix_offset[1][1] = (ggd->max[1] - ggd->min[1]);
 }
 
-/* TODO (Julian)
- * - Called on every redraw, better to do a more simple poll and check for selection in _refresh
- * - UV editing only, could be expanded for other things.
- */
-static bool gizmo2d_xform_poll(const 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list