[Bf-blender-cvs] [2d473ff4a8e] sculpt-dev: Sculpt: more brush stuff

Joseph Eagar noreply at git.blender.org
Tue Sep 21 07:52:34 CEST 2021


Commit: 2d473ff4a8e628e42157a93e89418f4c1f36aa64
Author: Joseph Eagar
Date:   Mon Sep 20 22:52:17 2021 -0700
Branches: sculpt-dev
https://developer.blender.org/rB2d473ff4a8e628e42157a93e89418f4c1f36aa64

Sculpt: more brush stuff

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

M	source/blender/blenkernel/BKE_brush_engine.h
M	source/blender/blenkernel/intern/brush.c
M	source/blender/blenkernel/intern/brush_engine.c
M	source/blender/blenloader/intern/versioning_cpp.cc
M	source/blender/blenloader/intern/versioning_userdef.c
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_intern.h
M	source/blender/editors/sculpt_paint/sculpt_paint_color.c
M	source/blender/makesdna/DNA_sculpt_brush_types.h
M	source/blender/makesrna/intern/rna_brush_engine.c

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

diff --git a/source/blender/blenkernel/BKE_brush_engine.h b/source/blender/blenkernel/BKE_brush_engine.h
index 369d45d2bbf..993f83e9a9f 100644
--- a/source/blender/blenkernel/BKE_brush_engine.h
+++ b/source/blender/blenkernel/BKE_brush_engine.h
@@ -53,6 +53,12 @@ struct BlendDataReader;
 struct Brush;
 struct Sculpt;
 
+//#define DEBUG_CURVE_MAPPING_ALLOC
+#ifdef DEBUG_CURVE_MAPPING_ALLOC
+void namestack_push(const char *name);
+void *namestack_pop(void *passthru);
+#endif
+
 typedef struct BrushMappingDef {
   int curve;
   bool enabled;
@@ -116,7 +122,13 @@ void BKE_brush_channel_copy_data(BrushChannel *dst, BrushChannel *src);
 void BKE_brush_channel_init(BrushChannel *ch, BrushChannelType *def);
 
 BrushChannelSet *BKE_brush_channelset_create();
+#ifdef DEBUG_CURVE_MAPPING_ALLOC
+BrushChannelSet *_BKE_brush_channelset_copy(BrushChannelSet *src);
+#  define BKE_brush_channelset_copy(src) \
+    (namestack_push(__func__), (BrushChannelSet *)namestack_pop(_BKE_brush_channelset_copy(src)))
+#else
 BrushChannelSet *BKE_brush_channelset_copy(BrushChannelSet *src);
+#endif
 void BKE_brush_channelset_free(BrushChannelSet *chset);
 
 void BKE_brush_channelset_add(BrushChannelSet *chset, BrushChannel *ch);
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index d0dc92ddd6c..feb31315a46 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -2671,7 +2671,7 @@ void BKE_brush_randomize_texture_coords(UnifiedPaintSettings *ups, bool mask)
 }
 
 /* Uses the brush curve control to find a strength value */
-float BKE_brush_curve_strength(const Brush *br, float p, const float len)
+ATTR_NO_OPT float BKE_brush_curve_strength(const Brush *br, float p, const float len)
 {
   float strength = 1.0f;
 
diff --git a/source/blender/blenkernel/intern/brush_engine.c b/source/blender/blenkernel/intern/brush_engine.c
index 50929dfa649..3f986675008 100644
--- a/source/blender/blenkernel/intern/brush_engine.c
+++ b/source/blender/blenkernel/intern/brush_engine.c
@@ -50,7 +50,6 @@
       NULL
 #define CURVE_ADDREF(curve) BKE_curvemapping_cache_aquire(BKE_curvemapping_cache_global(), curve)
 
-//#define DEBUG_CURVE_MAPPING_ALLOC
 #ifdef DEBUG_CURVE_MAPPING_ALLOC
 static struct {
   char tag[4192];
@@ -65,9 +64,11 @@ void namestack_push(const char *name)
   strcat(namestack[namestack_i].tag, ".");
   strcat(namestack[namestack_i].tag, name);
 }
-void namestack_pop()
+
+void *namestack_pop(void *passthru)
 {
   namestack_i--;
+  return passthru;
 }
 
 #  define namestack_head_name strdup(namestack[namestack_i].tag)
@@ -80,7 +81,7 @@ void BKE_curvemapping_copy_data_tag_ex(CurveMapping *target,
     BKE_curvemapping_copy_data_tag_ex(dst, src, namestack_head_name)
 #else
 #  define namestack_push(name)
-#  define namestack_pop()
+#  define namestack_pop(passthru)
 #endif
 
 // returns true if curve was duplicated
@@ -222,7 +223,7 @@ ATTR_NO_OPT void BKE_brush_channel_copy_data(BrushChannel *dst, BrushChannel *sr
     dst->mappings[i].type = i;
   }
 
-  namestack_pop();
+  namestack_pop(NULL);
 }
 
 ATTR_NO_OPT void BKE_brush_channel_init(BrushChannel *ch, BrushChannelType *def)
@@ -413,14 +414,18 @@ ATTR_NO_OPT bool BKE_brush_channelset_remove_named(BrushChannelSet *chset, const
 
 ATTR_NO_OPT void BKE_brush_channelset_add_duplicate(BrushChannelSet *chset, BrushChannel *ch)
 {
-  BrushChannel *chnew = MEM_callocN(sizeof(*chnew), "brush channel copy");
-
   namestack_push(__func__);
 
+#ifdef DEBUG_CURVE_MAPPING_ALLOC
+  BrushChannel *chnew = MEM_callocN(sizeof(*chnew), namestack_head_name);
+#else
+  BrushChannel *chnew = MEM_callocN(sizeof(*chnew), "brush channel copy");
+#endif
+
   BKE_brush_channel_copy_data(chnew, ch);
   BKE_brush_channelset_add(chset, chnew);
 
-  namestack_pop();
+  namestack_pop(NULL);
 }
 
 ATTR_NO_OPT BrushChannel *BKE_brush_channelset_lookup(BrushChannelSet *chset, const char *idname)
@@ -488,7 +493,7 @@ ATTR_NO_OPT void BKE_brush_channelset_add_builtin(BrushChannelSet *chset, const
   BKE_brush_channel_init(ch, def);
   BKE_brush_channelset_add(chset, ch);
 
-  namestack_pop();
+  namestack_pop(NULL);
 }
 
 bool BKE_brush_channelset_ensure_builtin(BrushChannelSet *chset, const char *idname)
@@ -497,11 +502,11 @@ bool BKE_brush_channelset_ensure_builtin(BrushChannelSet *chset, const char *idn
 
   if (!BKE_brush_channelset_has(chset, idname)) {
     BKE_brush_channelset_add_builtin(chset, idname);
-    namestack_pop();
+    namestack_pop(NULL);
     return true;
   }
 
-  namestack_pop();
+  namestack_pop(NULL);
   return false;
 }
 
@@ -514,7 +519,7 @@ ATTR_NO_OPT void BKE_brush_channelset_ensure_existing(BrushChannelSet *chset,
 
   namestack_push(__func__);
   BKE_brush_channelset_add_duplicate(chset, existing);
-  namestack_pop();
+  namestack_pop(NULL);
 }
 
 ATTR_NO_OPT void BKE_brush_channelset_merge(BrushChannelSet *dst,
@@ -559,15 +564,29 @@ ATTR_NO_OPT void BKE_brush_channelset_merge(BrushChannelSet *dst,
       continue;
     }
 
+    /*apply mapping inheritance flags, which are respected
+      for non inherited channels.  note that absense
+      of BRUSH_MAPPING_FLAG doen't prevent mapping inheritance
+      if BRUSH_CHANNEL_INHERIT in ch->flag *is* set.*/
+    for (int i = 0; i < BRUSH_MAPPING_MAX; i++) {
+      if (ch->mappings[i].flag & BRUSH_MAPPING_INHERIT) {
+        BKE_brush_mapping_copy_data(mch->mappings + i, pch->mappings + i);
+      }
+    }
+
     if (ch->type == BRUSH_CHANNEL_BITMASK && (ch->flag & BRUSH_CHANNEL_INHERIT_IF_UNSET)) {
       mch->ivalue = ch->ivalue | pch->ivalue;
     }
   }
 
-  namestack_pop();
+  namestack_pop(NULL);
 }
 
+#ifdef DEBUG_CURVE_MAPPING_ALLOC
+ATTR_NO_OPT BrushChannelSet *_BKE_brush_channelset_copy(BrushChannelSet *src)
+#else
 ATTR_NO_OPT BrushChannelSet *BKE_brush_channelset_copy(BrushChannelSet *src)
+#endif
 {
   BrushChannelSet *chset = BKE_brush_channelset_create();
 
@@ -582,7 +601,7 @@ ATTR_NO_OPT BrushChannelSet *BKE_brush_channelset_copy(BrushChannelSet *src)
     BKE_brush_channelset_add_duplicate(chset, ch);
   }
 
-  namestack_pop();
+  namestack_pop(NULL);
 
   return chset;
 }
@@ -626,6 +645,10 @@ void BKE_brush_commandlist_start(BrushCommandList *list,
 
     BKE_brush_channelset_merge(cmd->params_final, cmd->params, chset_final);
 
+    if (cmd->params_mapped) {
+      BKE_brush_channelset_free(cmd->params_mapped);
+    }
+
     cmd->params_mapped = BKE_brush_channelset_copy(cmd->params_final);
   }
 }
@@ -661,7 +684,7 @@ float BKE_brush_channel_get_int(BrushChannel *ch, BrushMappingData *mapdata)
   float f = (float)ch->ivalue;
 
   if (mapdata) {
-    float map = f;
+    float factor = 1.0f;
 
     for (int i = 0; i < BRUSH_MAPPING_MAX; i++) {
       BrushMapping *mp = ch->mappings + i;
@@ -676,19 +699,19 @@ float BKE_brush_channel_get_int(BrushChannel *ch, BrushMappingData *mapdata)
         case MA_RAMP_BLEND:
           break;
         case MA_RAMP_MULT:
-          f2 *= f;
+          f2 *= factor;
           break;
         case MA_RAMP_DIV:
-          f2 = f / (0.00001f + f);
+          f2 = factor / (0.00001f + f2);
           break;
         case MA_RAMP_ADD:
-          f2 += f;
+          f2 += factor;
           break;
         case MA_RAMP_SUB:
-          f2 = f - f2;
+          f2 = factor - f2;
           break;
         case MA_RAMP_DIFF:
-          f2 = fabsf(f - f2);
+          f2 = fabsf(factor - f2);
           break;
         default:
           printf("Unsupported brush mapping blend mode for %s (%s); will mix instead\n",
@@ -697,8 +720,10 @@ float BKE_brush_channel_get_int(BrushChannel *ch, BrushMappingData *mapdata)
           break;
       }
 
-      f += (f2 - f) * mp->factor;
+      factor += (f2 - factor) * mp->factor;
     }
+
+    f *= factor;
   }
 
   return (int)f;
@@ -842,19 +867,19 @@ ATTR_NO_OPT float BKE_brush_channel_get_float(BrushChannel *ch, BrushMappingData
         case MA_RAMP_BLEND:
           break;
         case MA_RAMP_MULT:
-          f2 *= f * f2;
+          f2 *= factor;
           break;
         case MA_RAMP_DIV:
-          f2 = f / (0.00001f + f);
+          f2 = factor / (0.00001f + f2);
           break;
         case MA_RAMP_ADD:
-          f2 += f;
+          f2 += factor;
           break;
         case MA_RAMP_SUB:
-          f2 = f - f2;
+          f2 = factor - f2;
           break;
         case MA_RAMP_DIFF:
-          f2 = fabsf(f - f2);
+          f2 = fabsf(factor - f2);
           break;
         default:
           printf("Unsupported brush mapping blend mode for %s (%s); will mix instead\n",
@@ -1200,7 +1225,7 @@ BrushCommand *BKE_brush_command_init(BrushCommand *command, int tool)
       break;
   }
 
-  namestack_pop();
+  namestack_pop(NULL);
 
   return command;
 }
@@ -1218,6 +1243,18 @@ static void float_set_uninherit(BrushChannelSet *chset, const char *channel, flo
   ch->flag &= ~BRUSH_CHANNEL_INHERIT;
 }
 
+/*flag all mappings to use inherited curves even if owning channel
+  is not set to inherit.*/
+ATTR_NO_OPT void BKE_brush_commandset_inherit_all_mappings(BrushChannelSet *chset)
+{
+  BrushChannel *ch;
+  for (ch = chset->channels.first; ch; ch = ch->next) {
+    for (int i = 0; i < BRUSH_MAPPING_MAX; i++) {
+      ch->mappings[i].flag |= BRUSH_MAPPING_INHERIT;
+    }
+  }
+}
+
 ATTR_NO_OPT static void bke_builtin_commandlist_create_paint(Brush *brush,
                                                              BrushChannelSet *chset,
                                                              BrushCommandList *cl,
@@ -1267,6 +1304,8 @@ ATTR_NO_OPT static void bke_builtin_commandlist_create_paint(Brush *brush,
   }
 
 #undef GETF
+
+  BKE_brush_commandset_inherit_all_mappings(cmd->params);
   // float
 }
 
@@ -1356,7 +1395,8 @@ ATTR_NO_OPT void BKE_builtin_commandlist_create(Brush *brush,
     float_set_uninherit(cmd->params, "spacing", spacing);
     float_set_uninherit(cmd->params, "radius", radius2);
   }
-  // if (!BKE_brush_channelset_get_int)
+
+  BKE_brush_commandset_inherit_all_mappings(cmd->params);
 }
 
 ATTR_NO_OPT void BKE_brush_channelset_read(BlendDataReader *reader, BrushChannelSet *chset)
diff --git a/source/blender/blenloader/intern/versioning_cpp.cc b/source/blender/blenloader/

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list