[Bf-blender-cvs] [01636ed159c] master: GPencil: Fix unreported problem in merge similar materials

Antonio Vazquez noreply at git.blender.org
Wed Aug 12 22:55:57 CEST 2020


Commit: 01636ed159c7dede57236f7a801d3cfcae0b9750
Author: Antonio Vazquez
Date:   Wed Aug 12 19:18:59 2020 +0200
Branches: master
https://developer.blender.org/rB01636ed159c7dede57236f7a801d3cfcae0b9750

GPencil: Fix unreported problem in merge similar materials

When two similar colors were adjacent, the colors were not merged.

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

M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/blenkernel/intern/gpencil_curve.c

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

diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 3039879799d..09ea6ec17bc 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1879,6 +1879,7 @@ bool BKE_gpencil_merge_materials_table_get(Object *ob,
   Material *ma_secondary = NULL;
   MaterialGPencilStyle *gp_style_primary = NULL;
   MaterialGPencilStyle *gp_style_secondary = NULL;
+  GHash *mat_used = BLI_ghash_int_new(__func__);
 
   short *totcol = BKE_object_material_len_p(ob);
   if (totcol == 0) {
@@ -1891,12 +1892,14 @@ bool BKE_gpencil_merge_materials_table_get(Object *ob,
     if (ma_primary == NULL) {
       continue;
     }
-
     for (int idx_secondary = 0; idx_secondary < *totcol; idx_secondary++) {
       if ((idx_secondary == idx_primary) ||
           BLI_ghash_haskey(r_mat_table, POINTER_FROM_INT(idx_secondary))) {
         continue;
       }
+      if (BLI_ghash_haskey(mat_used, POINTER_FROM_INT(idx_secondary))) {
+        continue;
+      }
 
       /* Read secondary material to compare with primary material. */
       ma_secondary = BKE_gpencil_material(ob, idx_secondary + 1);
@@ -1950,32 +1953,35 @@ bool BKE_gpencil_merge_materials_table_get(Object *ob,
       copy_v3_v3(col, gp_style_secondary->fill_rgba);
       rgb_to_hsv_compat_v(col, f_hsv_b);
 
-      /* Check stroke and fill color (only Hue and Saturation). */
+      /* Check stroke and fill color. */
       if ((!compare_ff(s_hsv_a[0], s_hsv_b[0], hue_threshold)) ||
           (!compare_ff(s_hsv_a[1], s_hsv_b[1], sat_threshold)) ||
           (!compare_ff(s_hsv_a[2], s_hsv_b[2], val_threshold)) ||
           (!compare_ff(f_hsv_a[0], f_hsv_b[0], hue_threshold)) ||
           (!compare_ff(f_hsv_a[1], f_hsv_b[1], sat_threshold)) ||
-          (!compare_ff(f_hsv_a[2], f_hsv_b[2], val_threshold))) {
+          (!compare_ff(f_hsv_a[2], f_hsv_b[2], val_threshold)) ||
+          (!compare_ff(gp_style_primary->stroke_rgba[3],
+                       gp_style_secondary->stroke_rgba[3],
+                       val_threshold)) ||
+          (!compare_ff(
+              gp_style_primary->fill_rgba[3], gp_style_secondary->fill_rgba[3], val_threshold))) {
         continue;
       }
 
-      gp_style_secondary->stroke_rgba[0] = 0.0f;
-      gp_style_secondary->stroke_rgba[1] = 1.0f;
-      gp_style_secondary->stroke_rgba[2] = 0.0f;
-      gp_style_secondary->stroke_rgba[3] = 1.0f;
-
-      gp_style_secondary->fill_rgba[0] = 1.0f;
-      gp_style_secondary->fill_rgba[1] = 0.0f;
-      gp_style_secondary->fill_rgba[2] = 0.0f;
-      gp_style_secondary->fill_rgba[3] = 1.0f;
-
       /* Save conversion indexes. */
-      BLI_ghash_insert(
-          r_mat_table, POINTER_FROM_INT(idx_secondary), POINTER_FROM_INT(idx_primary));
-      changed = true;
+      if (!BLI_ghash_haskey(r_mat_table, POINTER_FROM_INT(idx_secondary))) {
+        BLI_ghash_insert(
+            r_mat_table, POINTER_FROM_INT(idx_secondary), POINTER_FROM_INT(idx_primary));
+        changed = true;
+
+        if (!BLI_ghash_haskey(mat_used, POINTER_FROM_INT(idx_primary))) {
+          BLI_ghash_insert(mat_used, POINTER_FROM_INT(idx_primary), POINTER_FROM_INT(idx_primary));
+        }
+      }
     }
   }
+  /* Free hash memory. */
+  BLI_ghash_free(mat_used, NULL, NULL);
 
   return changed;
 }
diff --git a/source/blender/blenkernel/intern/gpencil_curve.c b/source/blender/blenkernel/intern/gpencil_curve.c
index 044cc0164cf..d2c9ef0b3bc 100644
--- a/source/blender/blenkernel/intern/gpencil_curve.c
+++ b/source/blender/blenkernel/intern/gpencil_curve.c
@@ -64,10 +64,12 @@ static int gpencil_check_same_material_color(Object *ob_gp,
   float hsv_stroke[4], hsv_fill[4];
 
   copy_v4_v4(color_cu, color_stroke);
+  zero_v3(hsv_stroke);
   rgb_to_hsv_v(color_cu, hsv_stroke);
   hsv_stroke[3] = color_stroke[3];
 
   copy_v4_v4(color_cu, color_fill);
+  zero_v3(hsv_fill);
   rgb_to_hsv_v(color_cu, hsv_fill);
   hsv_fill[3] = color_fill[3];
 
@@ -91,6 +93,7 @@ static int gpencil_check_same_material_color(Object *ob_gp,
     /* Check color with small tolerance (better result in HSV). */
     float hsv2[4];
     if (do_fill) {
+      zero_v3(hsv2);
       rgb_to_hsv_v(gp_style->fill_rgba, hsv2);
       hsv2[3] = gp_style->fill_rgba[3];
       if (compare_v4v4(hsv_fill, hsv2, 0.01f)) {
@@ -104,6 +107,7 @@ static int gpencil_check_same_material_color(Object *ob_gp,
     }
 
     if (do_stroke) {
+      zero_v3(hsv2);
       rgb_to_hsv_v(gp_style->stroke_rgba, hsv2);
       hsv2[3] = gp_style->stroke_rgba[3];
       if (compare_v4v4(hsv_stroke, hsv2, 0.01f)) {



More information about the Bf-blender-cvs mailing list