[Bf-blender-cvs] [ae049a6c6ac] master: Improve proportional edit drawing

Germano Cavalcante noreply at git.blender.org
Fri May 1 14:32:31 CEST 2020


Commit: ae049a6c6ac545b2c9eadf759f40ad864f436ff1
Author: Germano Cavalcante
Date:   Thu Apr 30 18:39:05 2020 -0300
Branches: master
https://developer.blender.org/rBae049a6c6ac545b2c9eadf759f40ad864f436ff1

Improve proportional edit drawing

(This is a simplified version of D4786)

The advantage of highlighting the points would be to indicate more
clearly what is affected by the proportional edit.

The default circle is not so informative and sometimes it is even off
screen so the user loses the quick identification of the influence.
(See T75482)

The disadvantage of this design is that the points could end up hiding
the mesh.

The original patch added the option `draw_proportional_gradient`, but I
prefer to avoid adding more options and more information to the
interface.

I'm not sure if the advantages outweigh the disadvantages.

{F8504097}

Reviewers: #user_interface, #modeling

Subscribers:

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

M	source/blender/editors/transform/transform_constraints.c

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

diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index 84b5387af86..7d7b9f7e8ce 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -822,6 +822,72 @@ void drawConstraint(TransInfo *t)
   }
 }
 
+static void drawPropVerts(TransInfo *t)
+{
+  if (ELEM(t->mode, TFM_EDGE_SLIDE, TFM_VERT_SLIDE)) {
+    return;
+  }
+
+  int vec_len;
+  if (t->spacetype == SPACE_VIEW3D) {
+    vec_len = 3;
+  }
+  else if (t->spacetype == SPACE_IMAGE) {
+    vec_len = 2;
+  }
+  else {
+    return;
+  }
+
+  const float vertex_size = UI_GetThemeValuef(TH_VERTEX_SIZE) * 1.666f;
+  float color[3];
+  UI_GetThemeColor3fv(TH_EDITMESH_ACTIVE, color);
+
+  GPUVertFormat *format = immVertexFormat();
+  uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, vec_len, GPU_FETCH_FLOAT);
+  uint col = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
+  if (vec_len == 3) {
+    immBindBuiltinProgram(GPU_SHADER_3D_FLAT_COLOR);
+  }
+  else {
+    immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
+  }
+
+  GPU_point_size(vertex_size);
+  GPU_blend(true);
+
+  FOREACH_TRANS_DATA_CONTAINER (t, tc) {
+    if (tc->use_local_mat) {
+      GPU_matrix_push();
+      GPU_matrix_mul(tc->mat);
+    }
+
+    immBeginAtMost(GPU_PRIM_POINTS, tc->data_len);
+    for (int i = 0; i < tc->data_len; i++) {
+      TransData td = tc->data[i];
+      if (td.factor == 0.0) {
+        break;
+      }
+
+      immAttr4f(col, UNPACK3(color), td.factor * 0.5f);
+      if (vec_len == 3) {
+        immVertex3fv(pos, td.loc);
+      }
+      else {
+        immVertex2fv(pos, td.loc);
+      }
+    }
+    immEnd();
+
+    if (tc->use_local_mat) {
+      GPU_matrix_pop();
+    }
+  }
+
+  GPU_blend(false);
+  immUnbindProgram();
+}
+
 /* called from drawview.c, as an extra per-window draw option */
 void drawPropCircle(const struct bContext *C, TransInfo *t)
 {
@@ -874,6 +940,8 @@ void drawPropCircle(const struct bContext *C, TransInfo *t)
 
     immUnbindProgram();
 
+    drawPropVerts(t);
+
     if (depth_test_enabled) {
       GPU_depth_test(true);
     }



More information about the Bf-blender-cvs mailing list