[Bf-blender-cvs] [ac4057b95a5] master: Gizmo: use pivot center for UV gizmos

Campbell Barton noreply at git.blender.org
Thu Jan 9 06:43:20 CET 2020


Commit: ac4057b95a5b20c4903308881193e291266f87db
Author: Campbell Barton
Date:   Thu Jan 9 13:56:45 2020 +1100
Branches: master
https://developer.blender.org/rBac4057b95a5b20c4903308881193e291266f87db

Gizmo: use pivot center for UV gizmos

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

M	source/blender/editors/include/ED_transform.h
M	source/blender/editors/include/ED_uvedit.h
M	source/blender/editors/space_image/space_image.c
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_transform.h b/source/blender/editors/include/ED_transform.h
index 29bac9df93a..d53ad7c4229 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -29,6 +29,7 @@
 struct Object;
 struct bContext;
 struct wmKeyConfig;
+struct wmMsgBus;
 struct wmOperatorType;
 
 void ED_keymap_transform(struct wmKeyConfig *keyconf);
@@ -165,28 +166,11 @@ void VIEW3D_GGT_xform_shear(struct wmGizmoGroupType *gzgt);
 /* *** transform_gizmo_extrude_3d.c *** */
 void VIEW3D_GGT_xform_extrude(struct wmGizmoGroupType *gzgt);
 
-/* Transform: Axis/Cage */
-bool ED_widgetgroup_gizmo2d_xform_poll(const struct bContext *C, struct wmGizmoGroupType *gzgt);
-void ED_widgetgroup_gizmo2d_xform_setup(const struct bContext *C, struct wmGizmoGroup *gzgroup);
-void ED_widgetgroup_gizmo2d_xform_setup_no_cage(const struct bContext *C,
-                                                struct wmGizmoGroup *gzgroup);
-void ED_widgetgroup_gizmo2d_xform_refresh(const struct bContext *C, struct wmGizmoGroup *gzgroup);
-void ED_widgetgroup_gizmo2d_xform_draw_prepare(const struct bContext *C,
-                                               struct wmGizmoGroup *gzgroup);
-
-/* Resize: Axis */
-bool ED_widgetgroup_gizmo2d_resize_poll(const struct bContext *C, struct wmGizmoGroupType *gzgt);
-void ED_widgetgroup_gizmo2d_resize_setup(const struct bContext *C, struct wmGizmoGroup *gzgroup);
-void ED_widgetgroup_gizmo2d_resize_refresh(const struct bContext *C, struct wmGizmoGroup *gzgroup);
-void ED_widgetgroup_gizmo2d_resize_draw_prepare(const struct bContext *C,
-                                                struct wmGizmoGroup *gzgroup);
-
-/* Rotate: Axis */
-bool ED_widgetgroup_gizmo2d_rotate_poll(const struct bContext *C, struct wmGizmoGroupType *gzgt);
-void ED_widgetgroup_gizmo2d_rotate_setup(const struct bContext *C, struct wmGizmoGroup *gzgroup);
-void ED_widgetgroup_gizmo2d_rotate_refresh(const struct bContext *C, struct wmGizmoGroup *gzgroup);
-void ED_widgetgroup_gizmo2d_rotate_draw_prepare(const struct bContext *C,
-                                                struct wmGizmoGroup *gzgroup);
+/* Generic 2D transform gizmo callback assignment. */
+void ED_widgetgroup_gizmo2d_xform_callbacks_set(struct wmGizmoGroupType *gzgt);
+void ED_widgetgroup_gizmo2d_xform_no_cage_callbacks_set(struct wmGizmoGroupType *gzgt);
+void ED_widgetgroup_gizmo2d_resize_callbacks_set(struct wmGizmoGroupType *gzgt);
+void ED_widgetgroup_gizmo2d_rotate_callbacks_set(struct wmGizmoGroupType *gzgt);
 
 #define SNAP_INCREMENTAL_ANGLE DEG2RAD(5.0)
 
diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index 1f50770eef6..1debdee53e9 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -50,8 +50,6 @@ bool ED_uvedit_minmax(const struct Scene *scene,
                       struct Object *obedit,
                       float min[2],
                       float max[2]);
-bool ED_uvedit_center(
-    const struct Scene *scene, Image *ima, struct Object *obedit, float cent[2], char mode);
 void ED_uvedit_select_all(struct BMesh *bm);
 
 bool ED_uvedit_minmax_multi(const struct Scene *scene,
@@ -67,6 +65,12 @@ bool ED_uvedit_center_multi(const struct Scene *scene,
                             float r_cent[2],
                             char mode);
 
+bool ED_uvedit_center_from_pivot(struct SpaceImage *sima,
+                                 struct Scene *scene,
+                                 struct ViewLayer *view_layer,
+                                 float r_center[2],
+                                 char mode);
+
 bool ED_object_get_active_image(struct Object *ob,
                                 int mat_nr,
                                 struct Image **r_ima,
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 2f93be8ae38..57560c560d7 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -470,11 +470,7 @@ static void IMAGE_GGT_gizmo2d(wmGizmoGroupType *gzgt)
   gzgt->gzmap_params.spaceid = SPACE_IMAGE;
   gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
 
-  gzgt->poll = ED_widgetgroup_gizmo2d_xform_poll;
-  gzgt->setup = ED_widgetgroup_gizmo2d_xform_setup;
-  gzgt->setup_keymap = WM_gizmogroup_setup_keymap_generic_maybe_drag;
-  gzgt->refresh = ED_widgetgroup_gizmo2d_xform_refresh;
-  gzgt->draw_prepare = ED_widgetgroup_gizmo2d_xform_draw_prepare;
+  ED_widgetgroup_gizmo2d_xform_callbacks_set(gzgt);
 }
 
 static void IMAGE_GGT_gizmo2d_translate(wmGizmoGroupType *gzgt)
@@ -488,11 +484,7 @@ static void IMAGE_GGT_gizmo2d_translate(wmGizmoGroupType *gzgt)
   gzgt->gzmap_params.spaceid = SPACE_IMAGE;
   gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
 
-  gzgt->poll = ED_widgetgroup_gizmo2d_xform_poll;
-  gzgt->setup = ED_widgetgroup_gizmo2d_xform_setup_no_cage;
-  gzgt->setup_keymap = WM_gizmogroup_setup_keymap_generic_maybe_drag;
-  gzgt->refresh = ED_widgetgroup_gizmo2d_xform_refresh;
-  gzgt->draw_prepare = ED_widgetgroup_gizmo2d_xform_draw_prepare;
+  ED_widgetgroup_gizmo2d_xform_no_cage_callbacks_set(gzgt);
 }
 
 static void IMAGE_GGT_gizmo2d_resize(wmGizmoGroupType *gzgt)
@@ -506,11 +498,7 @@ static void IMAGE_GGT_gizmo2d_resize(wmGizmoGroupType *gzgt)
   gzgt->gzmap_params.spaceid = SPACE_IMAGE;
   gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
 
-  gzgt->poll = ED_widgetgroup_gizmo2d_resize_poll;
-  gzgt->setup = ED_widgetgroup_gizmo2d_resize_setup;
-  gzgt->setup_keymap = WM_gizmogroup_setup_keymap_generic_maybe_drag;
-  gzgt->refresh = ED_widgetgroup_gizmo2d_resize_refresh;
-  gzgt->draw_prepare = ED_widgetgroup_gizmo2d_resize_draw_prepare;
+  ED_widgetgroup_gizmo2d_resize_callbacks_set(gzgt);
 }
 
 static void IMAGE_GGT_gizmo2d_rotate(wmGizmoGroupType *gzgt)
@@ -524,11 +512,7 @@ static void IMAGE_GGT_gizmo2d_rotate(wmGizmoGroupType *gzgt)
   gzgt->gzmap_params.spaceid = SPACE_IMAGE;
   gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
 
-  gzgt->poll = ED_widgetgroup_gizmo2d_rotate_poll;
-  gzgt->setup = ED_widgetgroup_gizmo2d_rotate_setup;
-  gzgt->setup_keymap = WM_gizmogroup_setup_keymap_generic_maybe_drag;
-  gzgt->refresh = ED_widgetgroup_gizmo2d_rotate_refresh;
-  gzgt->draw_prepare = ED_widgetgroup_gizmo2d_rotate_draw_prepare;
+  ED_widgetgroup_gizmo2d_rotate_callbacks_set(gzgt);
 }
 
 static void IMAGE_GGT_navigate(wmGizmoGroupType *gzgt)
diff --git a/source/blender/editors/transform/transform_gizmo_2d.c b/source/blender/editors/transform/transform_gizmo_2d.c
index e76ece987df..dc8d820b075 100644
--- a/source/blender/editors/transform/transform_gizmo_2d.c
+++ b/source/blender/editors/transform/transform_gizmo_2d.c
@@ -44,6 +44,7 @@
 #include "WM_api.h"
 #include "WM_types.h"
 #include "wm.h" /* XXX */
+#include "WM_message.h"
 
 #include "ED_image.h"
 #include "ED_screen.h"
@@ -52,15 +53,56 @@
 
 #include "transform.h" /* own include */
 
+/* -------------------------------------------------------------------- */
+/** \name Shared Callback's
+ */
+
+static void gizmo2d_pivot_point_message_subscribe(struct wmGizmoGroup *gzgroup,
+                                                  struct wmMsgBus *mbus,
+                                                  /* Additional args. */
+                                                  bScreen *screen,
+                                                  ScrArea *sa,
+                                                  ARegion *ar)
+{
+  wmMsgSubscribeValue msg_sub_value_gz_tag_refresh = {
+      .owner = ar,
+      .user_data = gzgroup->parent_gzmap,
+      .notify = WM_gizmo_do_msg_notify_tag_refresh,
+  };
+
+  switch (sa->spacetype) {
+    case SPACE_IMAGE: {
+      SpaceImage *sima = sa->spacedata.first;
+      PointerRNA ptr;
+      RNA_pointer_create(&screen->id, &RNA_SpaceImageEditor, sima, &ptr);
+      {
+        extern PropertyRNA rna_SpaceImageEditor_pivot_point;
+        extern PropertyRNA rna_SpaceImageEditor_cursor_location;
+        const PropertyRNA *props[] = {
+            &rna_SpaceImageEditor_pivot_point,
+            (sima->around == V3D_AROUND_CURSOR) ? &rna_SpaceImageEditor_cursor_location : NULL,
+        };
+        for (int i = 0; i < ARRAY_SIZE(props); i++) {
+          if (props[i] == NULL) {
+            continue;
+          }
+          WM_msg_subscribe_rna(mbus, &ptr, props[i], &msg_sub_value_gz_tag_refresh, __func__);
+        }
+      }
+      break;
+    }
+  }
+}
+
+/** \} */
+
 /* -------------------------------------------------------------------- */
 /** \name Arrow / Cage Gizmo Group
  *
  * Defines public functions, not the gizmo it's self:
  *
- * - #ED_widgetgroup_gizmo2d_xform_setup
- * - #ED_widgetgroup_gizmo2d_xform_refresh
- * - #ED_widgetgroup_gizmo2d_xform_draw_prepare
- * - #ED_widgetgroup_gizmo2d_xform_poll
+ * - #ED_widgetgroup_gizmo2d_xform_callbacks_set
+ * - #ED_widgetgroup_gizmo2d_xform_no_cage_callbacks_set
  *
  * \{ */
 
@@ -150,12 +192,13 @@ static void gizmo2d_calc_bounds(const bContext *C, float *r_center, float *r_min
   ScrArea *sa = CTX_wm_area(C);
   if (sa->spacetype == SPACE_IMAGE) {
     SpaceImage *sima = sa->spacedata.first;
+    Scene *scene = CTX_data_scene(C);
     ViewLayer *view_layer = CTX_data_view_layer(C);
     Image *ima = ED_space_image(sima);
     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(CTX_data_scene(C), ima, objects, objects_len, r_min, r_max)) {
+    if (!ED_uvedit_minmax_multi(scene, ima, objects, objects_len, r_min, r_max)) {
       zero_v2(r_min);
       zero_v2(r_max);
     }
@@ -168,6 +211,18 @@ static void gizmo2d_calc_bounds(const bContext *C, float *r_center, float *r_min
   mid_v2_v2v2(r_center, r_min, r_max);
 }
 
+static void gizmo2d_calc_center(const bContext *C, float r_center[2])
+{
+  ScrArea *sa = CTX_wm_area(C);
+  zero_v2(r_center);
+  if (sa->spacetype == SPACE_IMAGE) {
+    SpaceImage *sima = sa->spacedata.first;
+    Scene *scene = CTX_data_scene(C);
+    ViewLayer *view_la

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list