[Bf-blender-cvs] [49f59092e7c] master: Curves: Implement Handles for selected points only
Antonio Vazquez
noreply at git.blender.org
Tue May 26 10:41:31 CEST 2020
Commit: 49f59092e7c8c652df015bdfd27bae2480e51d01
Author: Antonio Vazquez
Date: Tue May 26 10:37:47 2020 +0200
Branches: master
https://developer.blender.org/rB49f59092e7c8c652df015bdfd27bae2480e51d01
Curves: Implement Handles for selected points only
When editing a complex curve is very annoying to have all handles at a time. Also, this is a requirement for the current GSoC Edit Grease Pencil using curves.
I have seen that this improvement can be used in any other area of blender, so I have decided to publish the option in the overlay panel..
Reviewed By: fclem, #user_interface, billreynish, Severin
Differential Revision: https://developer.blender.org/D7754
===================================================================
M release/scripts/startup/bl_ui/space_view3d.py
M source/blender/blenkernel/BKE_curve.h
M source/blender/blenkernel/intern/curve.c
M source/blender/blenloader/intern/versioning_280.c
M source/blender/draw/engines/overlay/overlay_edit_curve.c
M source/blender/draw/engines/overlay/overlay_edit_text.c
M source/blender/draw/engines/overlay/overlay_private.h
M source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl
M source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl
M source/blender/draw/intern/draw_cache_impl.h
M source/blender/draw/intern/draw_cache_impl_curve.c
M source/blender/draw/intern/shaders/common_globals_lib.glsl
M source/blender/editors/curve/editcurve.c
M source/blender/editors/curve/editcurve_add.c
M source/blender/editors/curve/editcurve_query.c
M source/blender/editors/curve/editcurve_select.c
M source/blender/editors/include/ED_view3d.h
M source/blender/editors/space_view3d/view3d_iterators.c
M source/blender/editors/space_view3d/view3d_select.c
M source/blender/editors/transform/transform_convert_curve.c
M source/blender/editors/transform/transform_gizmo_3d.c
M source/blender/editors/transform/transform_orientations.c
M source/blender/makesdna/DNA_curve_types.h
M source/blender/makesdna/DNA_view3d_defaults.h
M source/blender/makesdna/DNA_view3d_types.h
M source/blender/makesrna/intern/rna_gpencil.c
M source/blender/makesrna/intern/rna_space.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 7ed969bc921..98c5bd944c3 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -6379,7 +6379,7 @@ class VIEW3D_PT_overlay_edit_curve(Panel):
col.active = display_all
row = col.row()
- row.prop(overlay, "show_curve_handles", text="Handles")
+ row.prop(overlay, "display_handle", text="Handles")
row = col.row()
row.prop(overlay, "show_curve_normals", text="")
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index bf270f2c06f..40f73ccfe84 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -173,7 +173,8 @@ void BKE_nurbList_handles_recalculate(struct ListBase *editnurb,
const char flag);
void BKE_nurbList_handles_autocalc(ListBase *editnurb, int flag);
-void BKE_nurbList_flag_set(ListBase *editnurb, short flag);
+void BKE_nurbList_flag_set(ListBase *editnurb, short flag, bool set);
+bool BKE_nurbList_flag_set_from_flag(ListBase *editnurb, short from_flag, short flag);
void BKE_nurb_free(struct Nurb *nu);
struct Nurb *BKE_nurb_duplicate(const struct Nurb *nu);
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 0798bc95797..e67cf8573f3 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -4485,7 +4485,7 @@ void BKE_nurbList_handles_recalculate(ListBase *editnurb, const bool calc_length
}
}
-void BKE_nurbList_flag_set(ListBase *editnurb, short flag)
+void BKE_nurbList_flag_set(ListBase *editnurb, short flag, bool set)
{
Nurb *nu;
BezTriple *bezt;
@@ -4497,7 +4497,16 @@ void BKE_nurbList_flag_set(ListBase *editnurb, short flag)
a = nu->pntsu;
bezt = nu->bezt;
while (a--) {
- bezt->f1 = bezt->f2 = bezt->f3 = flag;
+ if (set) {
+ bezt->f1 |= flag;
+ bezt->f2 |= flag;
+ bezt->f3 |= flag;
+ }
+ else {
+ bezt->f1 &= ~flag;
+ bezt->f2 &= ~flag;
+ bezt->f3 &= ~flag;
+ }
bezt++;
}
}
@@ -4505,13 +4514,47 @@ void BKE_nurbList_flag_set(ListBase *editnurb, short flag)
a = nu->pntsu * nu->pntsv;
bp = nu->bp;
while (a--) {
- bp->f1 = flag;
+ SET_FLAG_FROM_TEST(bp->f1, set, flag);
bp++;
}
}
}
}
+/**
+ * Set \a flag for every point that already has \a from_flag set.
+ */
+bool BKE_nurbList_flag_set_from_flag(ListBase *editnurb, short from_flag, short flag)
+{
+ bool changed = false;
+
+ for (Nurb *nu = editnurb->first; nu; nu = nu->next) {
+ if (nu->type == CU_BEZIER) {
+ for (int i = 0; i < nu->pntsu; i++) {
+ BezTriple *bezt = &nu->bezt[i];
+ int old_f1 = bezt->f1, old_f2 = bezt->f2, old_f3 = bezt->f3;
+
+ SET_FLAG_FROM_TEST(bezt->f1, bezt->f1 & from_flag, flag);
+ SET_FLAG_FROM_TEST(bezt->f2, bezt->f2 & from_flag, flag);
+ SET_FLAG_FROM_TEST(bezt->f3, bezt->f3 & from_flag, flag);
+
+ changed |= (old_f1 != bezt->f1) || (old_f2 != bezt->f2) || (old_f3 != bezt->f3);
+ }
+ }
+ else {
+ for (int i = 0; i < nu->pntsu * nu->pntsv; i++) {
+ BPoint *bp = &nu->bp[i];
+ int old_f1 = bp->f1;
+
+ SET_FLAG_FROM_TEST(bp->f1, bp->f1 & from_flag, flag);
+ changed |= (old_f1 != bp->f1);
+ }
+ }
+ }
+
+ return changed;
+}
+
void BKE_nurb_direction_switch(Nurb *nu)
{
BezTriple *bezt1, *bezt2;
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index e32a40e1ad5..cf458881dfc 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -3040,8 +3040,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
v3d->overlay.edit_flag |= V3D_OVERLAY_EDIT_FACES | V3D_OVERLAY_EDIT_SEAMS |
V3D_OVERLAY_EDIT_SHARP | V3D_OVERLAY_EDIT_FREESTYLE_EDGE |
V3D_OVERLAY_EDIT_FREESTYLE_FACE | V3D_OVERLAY_EDIT_EDGES |
- V3D_OVERLAY_EDIT_CREASES | V3D_OVERLAY_EDIT_BWEIGHTS |
- V3D_OVERLAY_EDIT_CU_HANDLES | V3D_OVERLAY_EDIT_CU_NORMALS;
+ V3D_OVERLAY_EDIT_CREASES | V3D_OVERLAY_EDIT_BWEIGHTS;
}
}
}
diff --git a/source/blender/draw/engines/overlay/overlay_edit_curve.c b/source/blender/draw/engines/overlay/overlay_edit_curve.c
index 6456d6868a5..9a79c78c996 100644
--- a/source/blender/draw/engines/overlay/overlay_edit_curve.c
+++ b/source/blender/draw/engines/overlay/overlay_edit_curve.c
@@ -36,7 +36,8 @@ void OVERLAY_edit_curve_cache_init(OVERLAY_Data *vedata)
GPUShader *sh;
DRWState state;
- pd->edit_curve.show_handles = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) != 0;
+ pd->edit_curve.show_handles = v3d->overlay.handle_display != CURVE_HANDLE_NONE;
+ pd->edit_curve.handle_display = v3d->overlay.handle_display;
pd->shdata.edit_curve_normal_length = v3d->overlay.normals_length;
/* Run Twice for in-front passes. */
@@ -62,11 +63,13 @@ void OVERLAY_edit_curve_cache_init(OVERLAY_Data *vedata)
pd->edit_curve_handle_grp = grp = DRW_shgroup_create(sh, psl->edit_curve_handle_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_bool_copy(grp, "showCurveHandles", pd->edit_curve.show_handles);
+ DRW_shgroup_uniform_int_copy(grp, "curveHandleDisplay", pd->edit_curve.handle_display);
DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA);
sh = OVERLAY_shader_edit_curve_point();
pd->edit_curve_points_grp = grp = DRW_shgroup_create(sh, psl->edit_curve_handle_ps);
DRW_shgroup_uniform_bool_copy(grp, "showCurveHandles", pd->edit_curve.show_handles);
+ DRW_shgroup_uniform_int_copy(grp, "curveHandleDisplay", pd->edit_curve.handle_display);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
}
}
diff --git a/source/blender/draw/engines/overlay/overlay_edit_text.c b/source/blender/draw/engines/overlay/overlay_edit_text.c
index 3de0155d6e0..c4d020adc11 100644
--- a/source/blender/draw/engines/overlay/overlay_edit_text.c
+++ b/source/blender/draw/engines/overlay/overlay_edit_text.c
@@ -38,7 +38,8 @@ void OVERLAY_edit_text_cache_init(OVERLAY_Data *vedata)
GPUShader *sh;
DRWState state;
- pd->edit_curve.show_handles = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) != 0;
+ pd->edit_curve.show_handles = v3d->overlay.handle_display != CURVE_HANDLE_NONE;
+ pd->edit_curve.handle_display = v3d->overlay.handle_display;
pd->shdata.edit_curve_normal_length = v3d->overlay.normals_length;
/* Run Twice for in-front passes. */
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index fa7c7f6d090..8afa562c937 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -297,6 +297,7 @@ typedef struct OVERLAY_PrivateData {
} antialiasing;
struct {
bool show_handles;
+ int handle_display;
} edit_curve;
struct {
int ghost_ob;
diff --git a/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl b/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl
index b444b3b0fec..306fbb473ee 100644
--- a/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl
+++ b/source/blender/draw/engines/overlay/shaders/edit_curve_handle_geom.glsl
@@ -4,10 +4,15 @@
#define EVEN_U_BIT 1 << 4
#define COLOR_SHIFT 5
+/* Keep the same value in `handle_display` in `DNA_view3d_types.h` */
+#define CURVE_HANDLE_SELECTED 0
+#define CURVE_HANDLE_ALL 1
+
layout(lines) in;
layout(triangle_strip, max_vertices = 10) out;
uniform bool showCurveHandles;
+uniform int curveHandleDisplay;
flat in int vertFlag[];
@@ -46,6 +51,17 @@ void main()
}
bool edge_selected = (((vertFlag[1] | vertFlag[0]) & VERT_SELECTED) != 0);
+ bool handle_selected = (showCurveHandles &&
+ (((vertFlag[1] | vertFlag[0]) & HANDLE_SELECTED) != 0));
+
+ /* If handle type is only selected and the edge is not selected, don't show. */
+ if ((curveHandleDisplay != CURVE_HANDLE_ALL) && (!handle_selected)) {
+ /* Nurbs must show the handles always. */
+ bool is_u_segment = (((vertFlag[1] ^ vertFlag[0]) & EVEN_U_BIT) != 0);
+ if (!is_u_segment) {
+ return;
+ }
+ }
vec4 inner_color;
if (color_id == 0) {
diff --git a/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl
index 6fa4576ae71..b1e1c0879a5 100644
--- a/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/edit_curve_point_vert.glsl
@@ -2,7 +2,11 @@
/* Keep the same value of `BEZIER_HANDLE` in `draw_cache_imp_curve.c` */
#define BEZIER_HANDLE 1 << 3
+/* Keep the same value in `handle_display` in `DNA_view3d_types.h` */
+#define CURVE_HANDLE_SELECTED 0
+
uniform bool showCurveHandles;
+uniform int curveHandleDisplay;
in vec3 pos;
in int data;
@@ -32,7 +36,12 @@ void main()
world_clip_planes_calc_clip_distance(world_pos);
#endif
- if (!showCurveHandles && ((data & BEZIER_HANDLE) != 0)) {
+ bool show_handle = showCurveHandles;
+ if ((curveHandleDisplay == CURVE_HANDLE_SELECTED) && ((data & HANDLE_SELECTED) == 0)) {
+ show_handle = false;
+ }
+
+ if (!show_handle && ((data & BEZIER_HANDLE) != 0)) {
/* We set the vertex at the camera origin to generate 0 fragments. */
gl_Position = vec4(0.0, 0.0, -3e36, 0.0);
}
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index de0cd027ece..daa46252331 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/b
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list