[Bf-blender-cvs] [6d922553593] temp-gpencil-bezier-v2: GPencil: Add vertex color select for curves
Falk David
noreply at git.blender.org
Sat Mar 6 21:54:38 CET 2021
Commit: 6d922553593b77fd40606b5337bba52159303349
Author: Falk David
Date: Sat Mar 6 19:40:02 2021 +0100
Branches: temp-gpencil-bezier-v2
https://developer.blender.org/rB6d922553593b77fd40606b5337bba52159303349
GPencil: Add vertex color select for curves
===================================================================
M source/blender/editors/gpencil/gpencil_select.c
===================================================================
diff --git a/source/blender/editors/gpencil/gpencil_select.c b/source/blender/editors/gpencil/gpencil_select.c
index a15d0cf155d..42b0b7cbfcb 100644
--- a/source/blender/editors/gpencil/gpencil_select.c
+++ b/source/blender/editors/gpencil/gpencil_select.c
@@ -2458,8 +2458,12 @@ void GPENCIL_OT_select(wmOperatorType *ot)
prop = RNA_def_boolean(ot->srna, "use_shift_extend", false, "Extend", "");
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
}
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Select by Vertex Color
+ * \{ */
-/* Select by Vertex Color. */
/* Helper to create a hash of colors. */
static void gpencil_selected_hue_table(bContext *C,
Object *ob,
@@ -2479,22 +2483,43 @@ static void gpencil_selected_hue_table(bContext *C,
if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
- if ((gps->flag & GP_STROKE_SELECT) == 0) {
- continue;
- }
/* Read all points to get all colors selected. */
- bGPDspoint *pt;
- int i;
- for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
- if (((pt->flag & GP_SPOINT_SELECT) == 0) || (pt->vert_color[3] == 0.0f)) {
+ if (GPENCIL_STROKE_IS_CURVE(gps)) {
+ bGPDcurve *gpc = gps->editcurve;
+ if ((gpc->flag & GP_CURVE_SELECT) == 0) {
+ continue;
+ }
+
+ for (int i = 0; i < gpc->tot_curve_points; i++) {
+ bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
+ if (((gpc_pt->flag & GP_CURVE_POINT_SELECT) == 0) || (gpc_pt->vert_color[3] == 0.0f)) {
+ continue;
+ }
+ /* Round Hue value. */
+ rgb_to_hsv_compat_v(gpc_pt->vert_color, hsv);
+ uint key = truncf(hsv[0] * range);
+ if (!BLI_ghash_haskey(hue_table, POINTER_FROM_INT(key))) {
+ BLI_ghash_insert(hue_table, POINTER_FROM_INT(key), POINTER_FROM_INT(key));
+ }
+ }
+ }
+ else {
+ if ((gps->flag & GP_STROKE_SELECT) == 0) {
continue;
}
- /* Round Hue value. */
- rgb_to_hsv_compat_v(pt->vert_color, hsv);
- uint key = truncf(hsv[0] * range);
- if (!BLI_ghash_haskey(hue_table, POINTER_FROM_INT(key))) {
- BLI_ghash_insert(hue_table, POINTER_FROM_INT(key), POINTER_FROM_INT(key));
+
+ for (int i = 0; i < gps->totpoints; i++) {
+ bGPDspoint *pt = &gps->points[i];
+ if (((pt->flag & GP_SPOINT_SELECT) == 0) || (pt->vert_color[3] == 0.0f)) {
+ continue;
+ }
+ /* Round Hue value. */
+ rgb_to_hsv_compat_v(pt->vert_color, hsv);
+ uint key = truncf(hsv[0] * range);
+ if (!BLI_ghash_haskey(hue_table, POINTER_FROM_INT(key))) {
+ BLI_ghash_insert(hue_table, POINTER_FROM_INT(key), POINTER_FROM_INT(key));
+ }
}
}
}
@@ -2548,39 +2573,77 @@ static int gpencil_select_vertex_color_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
+ deselect_all_selected(C);
+
/* Select any visible stroke that uses any of these colors. */
CTX_DATA_BEGIN (C, bGPDstroke *, gps, editable_gpencil_strokes) {
- bGPDspoint *pt;
- int i;
- bool gps_selected = false;
- /* Check all stroke points. */
- for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
- if (pt->vert_color[3] == 0.0f) {
- continue;
+ if (GPENCIL_STROKE_IS_CURVE(gps)) {
+ bGPDcurve *gpc = gps->editcurve;
+ bool gpc_selected = false;
+ for (int i = 0; i < gpc->tot_curve_points; i++) {
+ bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
+ if (gpc_pt->vert_color[3] == 0.0f) {
+ continue;
+ }
+
+ /* Only check Hue to get value and saturation full ranges. */
+ float hsv[3];
+ /* Round Hue value. */
+ rgb_to_hsv_compat_v(gpc_pt->vert_color, hsv);
+ uint key = truncf(hsv[0] * range);
+
+ if (BLI_ghash_haskey(hue_table, POINTER_FROM_INT(key))) {
+ gpc_pt->flag |= GP_CURVE_POINT_SELECT;
+ BEZT_SEL_ALL(&gpc_pt->bezt);
+ gpc_selected = true;
+ changed = true;
+ }
}
- /* Only check Hue to get value and saturation full ranges. */
- float hsv[3];
- /* Round Hue value. */
- rgb_to_hsv_compat_v(pt->vert_color, hsv);
- uint key = truncf(hsv[0] * range);
+ if (gpc_selected) {
+ gpc->flag |= GP_CURVE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
- if (BLI_ghash_haskey(hue_table, POINTER_FROM_INT(key))) {
- pt->flag |= GP_SPOINT_SELECT;
- gps_selected = true;
+ /* Extend selection. */
+ if (selectmode == GP_SELECTMODE_STROKE) {
+ select_all_curve_points(gpd, gps, gpc, false);
+ }
}
}
+ else {
+ bGPDspoint *pt;
+ int i;
+ bool gps_selected = false;
+ /* Check all stroke points. */
+ for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
+ if (pt->vert_color[3] == 0.0f) {
+ continue;
+ }
- if (gps_selected) {
- gps->flag |= GP_STROKE_SELECT;
- BKE_gpencil_stroke_select_index_set(gpd, gps);
+ /* Only check Hue to get value and saturation full ranges. */
+ float hsv[3];
+ /* Round Hue value. */
+ rgb_to_hsv_compat_v(pt->vert_color, hsv);
+ uint key = truncf(hsv[0] * range);
+
+ if (BLI_ghash_haskey(hue_table, POINTER_FROM_INT(key))) {
+ pt->flag |= GP_SPOINT_SELECT;
+ gps_selected = true;
+ changed = true;
+ }
+ }
- /* Extend stroke selection. */
- if (selectmode == GP_SELECTMODE_STROKE) {
- bGPDspoint *pt1 = NULL;
+ if (gps_selected) {
+ gps->flag |= GP_STROKE_SELECT;
+ BKE_gpencil_stroke_select_index_set(gpd, gps);
+
+ /* Extend stroke selection. */
+ if (selectmode == GP_SELECTMODE_STROKE) {
+ bGPDspoint *pt1 = NULL;
- for (i = 0, pt1 = gps->points; i < gps->totpoints; i++, pt1++) {
- pt1->flag |= GP_SPOINT_SELECT;
+ for (i = 0, pt1 = gps->points; i < gps->totpoints; i++, pt1++) {
+ pt1->flag |= GP_SPOINT_SELECT;
+ }
}
}
}
More information about the Bf-blender-cvs
mailing list