[Bf-blender-cvs] [fe5d54d3d0e] master: Gizmo: add new cage2d draw style for circular shapes

Weizhen Huang noreply at git.blender.org
Thu Feb 2 16:15:32 CET 2023


Commit: fe5d54d3d0ee328674caff7aa73180f7abfb85f6
Author: Weizhen Huang
Date:   Thu Feb 2 16:13:27 2023 +0100
Branches: master
https://developer.blender.org/rBfe5d54d3d0ee328674caff7aa73180f7abfb85f6

Gizmo: add new cage2d draw style for circular shapes

`ED_GIZMO_CAGE2D_STYLE_CIRCLE` now draw circles. The previous `ED_GIZMO_CAGE2D_STYLE_CIRCLE`, which drew rectangles, is renamed to `ED_GIZMO_CAGE2D_STYLE_RECTANGLE`. The meaning of `ED_GIZMO_CAGE2D_STYLE_BOX` is now unclear and probably needs to be renamed too.
Ref T104280

Maniphest Tasks: T104280

Differential Revision: https://developer.blender.org/D17174

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

M	source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
M	source/blender/editors/include/ED_gizmo_library.h
M	source/blender/gpu/GPU_immediate_util.h
M	source/blender/gpu/intern/gpu_immediate_util.c

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

diff --git a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
index 22dd2a04f40..5440498b8ba 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
@@ -8,7 +8,7 @@
  *
  * 2D Gizmo
  *
- * \brief Rectangular gizmo acting as a 'cage' around its content.
+ * \brief Rectangular or circular gizmo acting as a 'cage' around its content.
  * Interacting scales or translates the gizmo.
  */
 
@@ -41,6 +41,8 @@
 #include "../gizmo_library_intern.h"
 
 #define GIZMO_MARGIN_OFFSET_SCALE 1.5f
+/* The same as in `draw_cache.c` */
+#define CIRCLE_RESOL 32
 
 static bool gizmo_calc_rect_view_scale(const wmGizmo *gz, const float dims[2], float scale[2])
 {
@@ -472,12 +474,12 @@ static void imm_draw_point_aspect_2d(
   }
 }
 
-static void cage2d_draw_circle_wire(const rctf *r,
-                                    const float margin[2],
-                                    const float color[3],
-                                    const int transform_flag,
-                                    const int draw_options,
-                                    const float line_width)
+static void cage2d_draw_rect_wire(const rctf *r,
+                                  const float margin[2],
+                                  const float color[3],
+                                  const int transform_flag,
+                                  const int draw_options,
+                                  const float line_width)
 {
   /* NOTE(Metal): Prefer using 3D coordinates with 3D shader input, even if rendering 2D gizmo's.
    */
@@ -533,11 +535,31 @@ static void cage2d_draw_circle_wire(const rctf *r,
   immUnbindProgram();
 }
 
-static void cage2d_draw_circle_handles(const rctf *r,
-                                       const float margin[2],
-                                       const float color[3],
-                                       const int transform_flag,
-                                       bool solid)
+static void cage2d_draw_circle_wire(const float color[3],
+                                    const float size[2],
+                                    const float margin,
+                                    const float line_width)
+{
+  uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+
+  immBindBuiltinProgram(GPU_SHADER_3D_POLYLINE_UNIFORM_COLOR);
+  immUniformColor3fv(color);
+
+  float viewport[4];
+  GPU_viewport_size_get_f(viewport);
+  immUniform2fv("viewportSize", &viewport[2]);
+  immUniform1f("lineWidth", line_width * U.pixelsize + margin);
+
+  imm_draw_circle_wire_aspect_3d(pos, 0.0f, 0.0f, size[0], size[1], CIRCLE_RESOL);
+
+  immUnbindProgram();
+}
+
+static void cage2d_draw_rect_handles(const rctf *r,
+                                     const float margin[2],
+                                     const float color[3],
+                                     const int transform_flag,
+                                     bool solid)
 {
   uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
   void (*circle_fn)(uint, float, float, float, float, int) = (solid) ?
@@ -609,39 +631,46 @@ static void gizmo_cage2d_draw_intern(wmGizmo *gz,
   if (select) {
     /* Expand for hot-spot. */
     const float size[2] = {size_real[0] + margin[0] / 2, size_real[1] + margin[1] / 2};
-
-    if (transform_flag & ED_GIZMO_CAGE_XFORM_FLAG_SCALE) {
-      int scale_parts[] = {
-          ED_GIZMO_CAGE2D_PART_SCALE_MIN_X,
-          ED_GIZMO_CAGE2D_PART_SCALE_MAX_X,
-          ED_GIZMO_CAGE2D_PART_SCALE_MIN_Y,
-          ED_GIZMO_CAGE2D_PART_SCALE_MAX_Y,
-
-          ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MIN_Y,
-          ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MAX_Y,
-          ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MIN_Y,
-          ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MAX_Y,
-      };
-      for (int i = 0; i < ARRAY_SIZE(scale_parts); i++) {
-        GPU_select_load_id(select_id | scale_parts[i]);
+    if (draw_style == ED_GIZMO_CAGE2D_STYLE_CIRCLE) {
+      /* Only scaling is needed for now. */
+      GPU_select_load_id(select_id | ED_GIZMO_CAGE2D_PART_SCALE);
+      cage2d_draw_circle_wire(
+          gz->color, size_real, 0.5f * (margin[0] + margin[1]), gz->line_width);
+    }
+    else {
+      if (transform_flag & ED_GIZMO_CAGE_XFORM_FLAG_SCALE) {
+        int scale_parts[] = {
+            ED_GIZMO_CAGE2D_PART_SCALE_MIN_X,
+            ED_GIZMO_CAGE2D_PART_SCALE_MAX_X,
+            ED_GIZMO_CAGE2D_PART_SCALE_MIN_Y,
+            ED_GIZMO_CAGE2D_PART_SCALE_MAX_Y,
+
+            ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MIN_Y,
+            ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MAX_Y,
+            ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MIN_Y,
+            ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MAX_Y,
+        };
+        for (int i = 0; i < ARRAY_SIZE(scale_parts); i++) {
+          GPU_select_load_id(select_id | scale_parts[i]);
+          cage2d_draw_box_interaction(
+              gz->color, scale_parts[i], size, margin, gz->line_width, true, draw_options);
+        }
+      }
+      if (transform_flag & ED_GIZMO_CAGE_XFORM_FLAG_TRANSLATE) {
+        const int transform_part = ED_GIZMO_CAGE2D_PART_TRANSLATE;
+        GPU_select_load_id(select_id | transform_part);
         cage2d_draw_box_interaction(
-            gz->color, scale_parts[i], size, margin, gz->line_width, true, draw_options);
+            gz->color, transform_part, size, margin, gz->line_width, true, draw_options);
+      }
+      if (transform_flag & ED_GIZMO_CAGE_XFORM_FLAG_ROTATE) {
+        cage2d_draw_box_interaction(gz->color,
+                                    ED_GIZMO_CAGE2D_PART_ROTATE,
+                                    size_real,
+                                    margin,
+                                    gz->line_width,
+                                    true,
+                                    draw_options);
       }
-    }
-    if (transform_flag & ED_GIZMO_CAGE_XFORM_FLAG_TRANSLATE) {
-      const int transform_part = ED_GIZMO_CAGE2D_PART_TRANSLATE;
-      GPU_select_load_id(select_id | transform_part);
-      cage2d_draw_box_interaction(
-          gz->color, transform_part, size, margin, gz->line_width, true, draw_options);
-    }
-    if (transform_flag & ED_GIZMO_CAGE_XFORM_FLAG_ROTATE) {
-      cage2d_draw_box_interaction(gz->color,
-                                  ED_GIZMO_CAGE2D_PART_ROTATE,
-                                  size_real,
-                                  margin,
-                                  gz->line_width,
-                                  true,
-                                  draw_options);
     }
   }
   else {
@@ -688,25 +717,31 @@ static void gizmo_cage2d_draw_intern(wmGizmo *gz,
                                     draw_options);
       }
     }
-    else if (draw_style == ED_GIZMO_CAGE2D_STYLE_CIRCLE) {
+    else {
       float color[4], black[3] = {0, 0, 0};
       gizmo_color_get(gz, highlight, color);
 
       GPU_blend(GPU_BLEND_ALPHA);
 
       float outline_line_width = gz->line_width + 3.0f;
-      cage2d_draw_circle_wire(&r, margin, black, transform_flag, draw_options, outline_line_width);
-      cage2d_draw_circle_wire(&r, margin, color, transform_flag, draw_options, gz->line_width);
 
-      /* corner gizmos */
-      cage2d_draw_circle_handles(&r, margin, color, transform_flag, true);
-      cage2d_draw_circle_handles(&r, margin, (const float[3]){0, 0, 0}, transform_flag, false);
+      if (draw_style == ED_GIZMO_CAGE2D_STYLE_RECTANGLE) {
+        cage2d_draw_rect_wire(&r, margin, black, transform_flag, draw_options, outline_line_width);
+        cage2d_draw_rect_wire(&r, margin, color, transform_flag, draw_options, gz->line_width);
 
+        /* corner gizmos */
+        cage2d_draw_rect_handles(&r, margin, color, transform_flag, true);
+        cage2d_draw_rect_handles(&r, margin, black, transform_flag, false);
+      }
+      else if (draw_style == ED_GIZMO_CAGE2D_STYLE_CIRCLE) {
+        cage2d_draw_circle_wire(black, size_real, 0.0f, outline_line_width);
+        cage2d_draw_circle_wire(color, size_real, 0.0f, gz->line_width);
+      }
+      else {
+        BLI_assert(0);
+      }
       GPU_blend(GPU_BLEND_NONE);
     }
-    else {
-      BLI_assert(0);
-    }
   }
 
   GPU_matrix_pop();
@@ -1188,6 +1223,7 @@ static void GIZMO_GT_cage_2d(wmGizmoType *gzt)
   /* rna */
   static EnumPropertyItem rna_enum_draw_style[] = {
       {ED_GIZMO_CAGE2D_STYLE_BOX, "BOX", 0, "Box", ""},
+      {ED_GIZMO_CAGE2D_STYLE_RECTANGLE, "RECTANGLE", 0, "Rectangle", ""},
       {ED_GIZMO_CAGE2D_STYLE_CIRCLE, "CIRCLE", 0, "Circle", ""},
       {0, NULL, 0, NULL, NULL},
   };
@@ -1209,7 +1245,7 @@ static void GIZMO_GT_cage_2d(wmGizmoType *gzt)
   RNA_def_enum(gzt->srna,
                "draw_style",
                rna_enum_draw_style,
-               ED_GIZMO_CAGE2D_STYLE_CIRCLE,
+               ED_GIZMO_CAGE2D_STYLE_RECTANGLE,
                "Draw Style",
                "");
   RNA_def_enum_flag(gzt->srna,
diff --git a/source/blender/editors/include/ED_gizmo_library.h b/source/blender/editors/include/ED_gizmo_library.h
index ddc05fc0f80..ea844c25f8a 100644
--- a/source/blender/editors/include/ED_gizmo_library.h
+++ b/source/blender/editors/include/ED_gizmo_library.h
@@ -106,8 +106,12 @@ enum {
 
 /* draw_style */
 enum {
+  /** Display the hover region (edge or corner) of the underlying rectangle. */
   ED_GIZMO_CAGE2D_STYLE_BOX = 0,
-  ED_GIZMO_CAGE2D_STYLE_CIRCLE = 1,
+  /** Display a rectangular wire plus dots on four corners while hovering. */
+  ED_GIZMO_CAGE2D_STYLE_RECTANGLE,
+  /** Display a circular wire while hovering. */
+  ED_GIZMO_CAGE2D_STYLE_CIRCLE,
 };
 
 enum {
@@ -125,17 +129,20 @@ enum {
 /** #wmGizmo.highlight_part */
 enum {
   ED_GIZMO_CAGE2D_PART_TRANSLATE = 0,
-  ED_GIZMO_CAGE2D_PART_SCALE_MIN_X = 1,
-  ED_GIZMO_CAGE2D_PART_SCALE_MAX_X = 2,
-  ED_GIZMO_CAGE2D_PART_SCALE_MIN_Y = 3,
-  ED_GIZMO_CAGE2D_PART_SCALE_MAX_Y = 4,
+
+  ED_GIZMO_CAGE2D_PART_SCALE,
+  /* Edges */
+  ED_GIZMO_CAGE2D_PART_SCALE_MIN_X,
+  ED_GIZMO_CAGE2D_PART_SCALE_MAX_X,
+  ED_GIZMO_CAGE2D_PART_SCALE_MIN_Y,
+  ED_G

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list