Dial 3d Gizmo refactoring.
authormano-wii <germano.costa@ig.com.br>
Wed, 3 Oct 2018 02:00:29 +0000 (23:00 -0300)
committermano-wii <germano.costa@ig.com.br>
Wed, 3 Oct 2018 02:00:29 +0000 (23:00 -0300)
Transform the gizmo's drawing function into a generic function for use in other parts of the code.

source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c
source/blender/editors/include/ED_gizmo_library.h

index 48ac16290dfa6223c2adda506b29b5af1d630051..7f8ff5363f164eaddd527a07bec671cb66eec0a1 100644 (file)
 /* To use custom dials exported to geom_dial_gizmo.c */
 // #define USE_GIZMO_CUSTOM_DIAL
 
-static int gizmo_dial_modal(
-        bContext *C, wmGizmo *gz, const wmEvent *event,
-        eWM_GizmoFlagTweak tweak_flag);
-
 typedef struct DialInteraction {
        struct {
                float mval[2];
@@ -106,27 +102,28 @@ typedef struct DialInteraction {
 /* -------------------------------------------------------------------- */
 
 static void dial_geom_draw(
-        const wmGizmo *gz, const float color[4], const bool select,
-        float axis_modal_mat[4][4], float clip_plane[4],
-        const float arc_partial_angle, const float arc_inner_factor)
+        const float color[4], const float line_width,
+        const bool select,
+        const float axis_modal_mat[4][4], const float clip_plane[4],
+        const float arc_partial_angle, const float arc_inner_factor,
+        const int draw_options)
 {
 #ifdef USE_GIZMO_CUSTOM_DIAL
        UNUSED_VARS(gz, axis_modal_mat, clip_plane);
        wm_gizmo_geometryinfo_draw(&wm_gizmo_geom_data_dial, select, color);
 #else
-       const int draw_options = RNA_enum_get(gz->ptr, "draw_options");
        const bool filled = (draw_options & ED_GIZMO_DIAL_DRAW_FLAG_FILL) != 0;
 
-       GPU_line_width(gz->line_width);
+       GPU_line_width(line_width);
 
        GPUVertFormat *format = immVertexFormat();
        uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
 
        if (clip_plane) {
                immBindBuiltinProgram(GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR);
-               float clip_plane_f[4] = {clip_plane[0], clip_plane[1], clip_plane[2], clip_plane[3]};
-               immUniform4fv("ClipPlane", clip_plane_f);
+               immUniform4fv("ClipPlane", clip_plane);
                immUniformMatrix4fv("ModelMatrix", axis_modal_mat);
+               glEnable(GL_CLIP_DISTANCE0);
        }
        else {
                immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
@@ -159,6 +156,10 @@ static void dial_geom_draw(
 
        immUnbindProgram();
 
+       if (clip_plane) {
+               glDisable(GL_CLIP_DISTANCE0);
+       }
+
        UNUSED_VARS(select);
 #endif
 }
@@ -313,63 +314,36 @@ static void dial_draw_intern(
 
        WM_gizmo_calc_matrix_final(gz, matrix_final);
 
-       GPU_matrix_push();
-       GPU_matrix_mul(matrix_final);
-
-       /* FIXME(campbell): look into removing this. */
-       if ((gz->flag & WM_GIZMO_DRAW_VALUE) &&
-           (gz->state & WM_GIZMO_STATE_MODAL))
-       {
-               /* XXX, View3D rotation gizmo doesn't call modal. */
-               if (!WM_gizmo_target_property_is_valid_any(gz)) {
-                       wmWindow *win = CTX_wm_window(C);
-                       gizmo_dial_modal((bContext *)C, gz, win->eventstate, 0);
-               }
-       }
-
-       GPU_polygon_smooth(false);
-
-
        const float arc_partial_angle = RNA_float_get(gz->ptr, "arc_partial_angle");
        const float arc_inner_factor = RNA_float_get(gz->ptr, "arc_inner_factor");
-       if (select == false) {
-               float angle_ofs = 0.0f;
-               float angle_delta = 0.0f;
-               bool show_ghostarc = false;
+       int draw_options = RNA_enum_get(gz->ptr, "draw_options");
+       float angle_ofs = 0.0f;
+       float angle_delta = 0.0f;
 
-               /* Draw rotation indicator arc first. */
-               wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
-               const int draw_options = RNA_enum_get(gz->ptr, "draw_options");
-
-               if (WM_gizmo_target_property_is_valid(gz_prop) &&
-                   (draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE))
-               {
-                       angle_ofs = 0.0f;
-                       angle_delta = WM_gizmo_target_property_float_get(gz, gz_prop);
-                       show_ghostarc = true;
-               }
-               else if ((gz->flag & WM_GIZMO_DRAW_VALUE) &&
-                        (gz->state & WM_GIZMO_STATE_MODAL))
-               {
-                       DialInteraction *inter = gz->interaction_data;
+       if (select) {
+               draw_options &= ~ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE;
+       }
+
+       if (draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE &&
+          (gz->flag & WM_GIZMO_DRAW_VALUE))
+       {
+               DialInteraction *inter = gz->interaction_data;
+               if (inter) {
                        angle_ofs = inter->output.angle_ofs;
                        angle_delta = inter->output.angle_delta;
-                       show_ghostarc = true;
                }
-
-               if (show_ghostarc) {
-                       dial_ghostarc_draw_with_helplines(angle_ofs, angle_delta, arc_inner_factor, color, draw_options);
-                       if ((draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR) != 0) {
-                               angle_ofs += M_PI;
-                               dial_ghostarc_draw_with_helplines(angle_ofs, angle_delta, arc_inner_factor, color, draw_options);
+               else {
+                       wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
+                       if (WM_gizmo_target_property_is_valid(gz_prop)) {
+                               angle_delta = WM_gizmo_target_property_float_get(gz, gz_prop);
                        }
                }
        }
 
-       /* Draw actual dial gizmo. */
-       dial_geom_draw(gz, color, select, gz->matrix_basis, clip_plane, arc_partial_angle, arc_inner_factor);
-
-       GPU_matrix_pop();
+       ED_gizmotypes_dial_3d_draw_util(
+               gz->matrix_basis, matrix_final, gz->line_width, color, clip_plane,
+               arc_partial_angle, arc_inner_factor, draw_options, angle_ofs,
+               angle_delta);
 }
 
 static void gizmo_dial_draw_select(const bContext *C, wmGizmo *gz, int select_id)
@@ -385,7 +359,6 @@ static void gizmo_dial_draw_select(const bContext *C, wmGizmo *gz, int select_id
                copy_v3_v3(clip_plane, rv3d->viewinv[2]);
                clip_plane[3] = -dot_v3v3(rv3d->viewinv[2], gz->matrix_basis[3]);
                clip_plane[3] += DIAL_CLIP_BIAS;
-               glEnable(GL_CLIP_DISTANCE0);
        }
 
        GPU_select_load_id(select_id);
@@ -411,17 +384,11 @@ static void gizmo_dial_draw(const bContext *C, wmGizmo *gz)
                copy_v3_v3(clip_plane, rv3d->viewinv[2]);
                clip_plane[3] = -dot_v3v3(rv3d->viewinv[2], gz->matrix_basis[3]);
                clip_plane[3] += DIAL_CLIP_BIAS;
-
-               glEnable(GL_CLIP_DISTANCE0);
        }
 
        GPU_blend(true);
        dial_draw_intern(C, gz, false, is_highlight, clip_plane);
        GPU_blend(false);
-
-       if (clip_plane) {
-               glDisable(GL_CLIP_DISTANCE0);
-       }
 }
 
 static int gizmo_dial_modal(
@@ -528,6 +495,44 @@ static int gizmo_dial_invoke(
  *
  * \{ */
 
+void ED_gizmotypes_dial_3d_draw_util(
+        const float matrix_basis[4][4],
+        const float matrix_final[4][4],
+        const float line_width,
+        const float color[4],
+        const float clip_plane[4],
+        const float arc_partial_angle,
+        const float arc_inner_factor,
+        const int draw_options,
+        const float angle_ofs,
+        const float angle_delta)
+{
+       GPU_matrix_push();
+       GPU_matrix_mul(matrix_final);
+
+       GPU_polygon_smooth(false);
+
+       if ((draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE) != 0) {
+               /* Draw rotation indicator arc first. */
+               dial_ghostarc_draw_with_helplines(
+                       angle_ofs, angle_delta,
+                       arc_inner_factor, color, draw_options);
+
+               if ((draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR) != 0) {
+                       dial_ghostarc_draw_with_helplines(
+                               angle_ofs + M_PI, angle_delta,
+                               arc_inner_factor, color, draw_options);
+               }
+       }
+
+       /* Draw actual dial gizmo. */
+       dial_geom_draw(
+               color, line_width, false, matrix_basis, clip_plane,
+               arc_partial_angle, arc_inner_factor, draw_options);
+
+       GPU_matrix_pop();
+}
+
 static void GIZMO_GT_dial_3d(wmGizmoType *gzt)
 {
        /* identifiers */
index 45ada740c1c190ce4327cabb048fa36d9a9f5d2c..c4096bbae9f6c6d2d4a91b53c79de51f1662bf62 100644 (file)
@@ -231,4 +231,20 @@ enum {
        ED_GIZMO_PRIMITIVE_STYLE_PLANE = 0,
 };
 
+
+/* -------------------------------------------------------------------- */
+/* Gizmo Drawing Functions */
+
+void ED_gizmotypes_dial_3d_draw_util(
+        const float matrix_basis[4][4],
+        const float matrix_final[4][4],
+        const float line_width,
+        const float color[4],
+        const float clip_plane[4],
+        const float arc_partial_angle,
+        const float arc_inner_factor,
+        const int draw_options,
+        const float angle_ofs,
+        const float angle_delta);
+
 #endif  /* __ED_GIZMO_LIBRARY_H__ */