[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47954] branches/soc-2012-bratwurst: Texture Size Randomize

Antony Riakiotakis kalast at gmail.com
Fri Jun 15 15:40:18 CEST 2012


Revision: 47954
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47954
Author:   psy-fi
Date:     2012-06-15 13:40:17 +0000 (Fri, 15 Jun 2012)
Log Message:
-----------
Texture Size Randomize
======================
* Refactor the code to be less obtrusive to other modes. If a randomized
size is required, it is explicitly requested. I will probably have to
change the texture sample functions too to explicitly return a
randomized result.

Modified Paths:
--------------
    branches/soc-2012-bratwurst/release/scripts/startup/bl_ui/space_view3d_toolbar.py
    branches/soc-2012-bratwurst/source/blender/blenkernel/BKE_brush.h
    branches/soc-2012-bratwurst/source/blender/blenkernel/intern/brush.c
    branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_image.c
    branches/soc-2012-bratwurst/source/blender/makesdna/DNA_brush_types.h
    branches/soc-2012-bratwurst/source/blender/makesrna/intern/rna_brush.c

Modified: branches/soc-2012-bratwurst/release/scripts/startup/bl_ui/space_view3d_toolbar.py
===================================================================
--- branches/soc-2012-bratwurst/release/scripts/startup/bl_ui/space_view3d_toolbar.py	2012-06-15 13:35:24 UTC (rev 47953)
+++ branches/soc-2012-bratwurst/release/scripts/startup/bl_ui/space_view3d_toolbar.py	2012-06-15 13:40:17 UTC (rev 47954)
@@ -643,6 +643,9 @@
             self.prop_unified_size(row, context, brush, "use_pressure_size")
 
             row = col.row(align=True)
+            row.prop(brush, "random_size", slider=True)
+
+            row = col.row(align=True)
             self.prop_unified_strength(row, context, brush, "strength", text="Strength")
             self.prop_unified_strength(row, context, brush, "use_pressure_strength")
 

Modified: branches/soc-2012-bratwurst/source/blender/blenkernel/BKE_brush.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/blenkernel/BKE_brush.h	2012-06-15 13:35:24 UTC (rev 47953)
+++ branches/soc-2012-bratwurst/source/blender/blenkernel/BKE_brush.h	2012-06-15 13:40:17 UTC (rev 47954)
@@ -91,7 +91,7 @@
 struct ImBuf *BKE_brush_gen_radial_control_imbuf(struct Brush *br);
 
 /* unified strength and size */
-
+int BKE_brush_size_randomized_get(const struct Scene *scene, struct Brush *brush);
 int  BKE_brush_size_get(const struct Scene *scene, struct Brush *brush);
 void BKE_brush_size_set(struct Scene *scene, struct Brush *brush, int value);
 

Modified: branches/soc-2012-bratwurst/source/blender/blenkernel/intern/brush.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/blenkernel/intern/brush.c	2012-06-15 13:35:24 UTC (rev 47953)
+++ branches/soc-2012-bratwurst/source/blender/blenkernel/intern/brush.c	2012-06-15 13:40:17 UTC (rev 47954)
@@ -102,7 +102,8 @@
 	brush->rate = 0.1f; /* time delay between dots of paint or sculpting when doing airbrush mode */
 
 	brush->jitter = 0.0f;
-
+	brush->random_size = 0.0;
+	brush->random_factor_cache = 1.0;
 	/* BRUSH TEXTURE SETTINGS */
 	default_mtex(&brush->mtex);
 
@@ -296,6 +297,8 @@
 	BR_TEST_FLAG(BRUSH_CUSTOM_ICON);
 
 	BR_TEST(jitter, f);
+	BR_TEST(random_size, f);
+	BR_TEST(random_factor_cache, f);
 	BR_TEST(spacing, d);
 	BR_TEST(smooth_stroke_radius, d);
 	BR_TEST(smooth_stroke_factor, f);
@@ -485,6 +488,15 @@
 	return 0;
 }
 
+/* reset the random size cache to a random value, proportional to the size of the brush.
+ * due to the many places BKE_brush_size_get is called it is not safe to generate a random
+ * number for every call. Instead we will generate a random number before each stroke */
+void BKE_brush_randomize_size(Brush *brush)
+{
+	brush->random_factor_cache = (1.0 - brush->random_size/2.0) + brush->random_size*BLI_frand();
+}
+
+
 /* Brush Sampling */
 void BKE_brush_sample_tex(const Scene *scene, Brush *brush, const float xy[2], float rgba[4], const int thread, float angle)
 {
@@ -494,7 +506,7 @@
 		float co_angle, length;
 		float co[3], tin, tr, tg, tb, ta;
 		int hasrgb;
-		const int radius = BKE_brush_size_get(scene, brush);
+		const int radius = BKE_brush_size_randomized_get(scene, brush);
 
 		co[0] = xy[0] / radius;
 		co[1] = xy[1] / radius;
@@ -541,11 +553,11 @@
 	ImBuf *ibuf;
 	float xy[2], rgba[4], *dstf;
 	int x, y, rowbytes, xoff, yoff, imbflag;
-	const int radius = BKE_brush_size_get(scene, brush);
+	const int radius = BKE_brush_size_randomized_get(scene, brush);
 	unsigned char *dst, crgb[3];
 	const float alpha = BKE_brush_alpha_get(scene, brush);
 	float brush_rgb[3];
-    
+
 	imbflag = (flt) ? IB_rectfloat : IB_rect;
 	xoff = -bufsize / 2.0f + 0.5f;
 	yoff = -bufsize / 2.0f + 0.5f;
@@ -664,6 +676,13 @@
 	return (ups->flag & UNIFIED_PAINT_SIZE) ? ups->size : brush->size;
 }
 
+int BKE_brush_size_randomized_get(const Scene *scene, Brush *brush)
+{
+	UnifiedPaintSettings *ups = &scene->toolsettings->unified_paint_settings;
+
+	return (ups->flag & UNIFIED_PAINT_SIZE) ? brush->random_factor_cache*ups->size : brush->random_factor_cache*brush->size;
+}
+
 int BKE_brush_use_locked_size(const Scene *scene, Brush *brush)
 {
 	const short us_flag = scene->toolsettings->unified_paint_settings.flag;
@@ -1022,7 +1041,7 @@
 	MTex *mtex = &brush->mtex;
 	int size;
 	short flt;
-	const int diameter = 2 * BKE_brush_size_get(scene, brush);
+	const int diameter = 2 * BKE_brush_size_randomized_get(scene, brush);
 	const float alpha = BKE_brush_alpha_get(scene, brush);
 	const float rotation = scene->toolsettings->unified_paint_settings.last_angle;
 
@@ -1116,6 +1135,8 @@
 	Brush *brush = painter->brush;
 	int totpaintops = 0;
 
+	BKE_brush_randomize_size(brush);
+
 	if (pressure == 0.0f) {
 		if (painter->lastpressure) // XXX - hack, operator misses
 			pressure = painter->lastpressure;
@@ -1180,7 +1201,7 @@
 	else {
 		float startdistance, spacing, step, paintpos[2], dmousepos[2], finalpos[2];
 		float t, len, press;
-		const int radius = BKE_brush_size_get(scene, brush);
+		const int radius = BKE_brush_size_randomized_get(scene, brush);
 
 		/* compute brush spacing adapted to brush radius, spacing may depend
 		 * on pressure, so update it */

Modified: branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_image.c	2012-06-15 13:35:24 UTC (rev 47953)
+++ branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_image.c	2012-06-15 13:40:17 UTC (rev 47954)
@@ -3601,7 +3601,7 @@
 {
 	if (ps->source == PROJ_SRC_VIEW) {
 		float min_brush[2], max_brush[2];
-		const float radius = (float)BKE_brush_size_get(ps->scene, ps->brush);
+		const float radius = (float)BKE_brush_size_randomized_get(ps->scene, ps->brush);
 
 		/* so we don't have a bucket bounds that is way too small to paint into */
 		// if (radius < 1.0f) radius = 1.0f; // this doesn't work yet :/
@@ -3865,7 +3865,7 @@
 	float co[2];
 	float mask = 1.0f; /* airbrush wont use mask */
 	unsigned short mask_short;
-	const float radius = (float)BKE_brush_size_get(ps->scene, ps->brush);
+	const float radius = (float)BKE_brush_size_randomized_get(ps->scene, ps->brush);
 	const float radius_squared = radius * radius; /* avoid a square root with every dist comparison */
 	
 	short lock_alpha = ELEM(ps->brush->blend, IMB_BLEND_ERASE_ALPHA, IMB_BLEND_ADD_ALPHA) ? 0 : ps->brush->flag & BRUSH_LOCK_ALPHA;

Modified: branches/soc-2012-bratwurst/source/blender/makesdna/DNA_brush_types.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/makesdna/DNA_brush_types.h	2012-06-15 13:35:24 UTC (rev 47953)
+++ branches/soc-2012-bratwurst/source/blender/makesdna/DNA_brush_types.h	2012-06-15 13:40:17 UTC (rev 47954)
@@ -102,6 +102,9 @@
 
 	float add_col[3];
 	float sub_col[3];
+
+	float random_size;
+	float random_factor_cache;
 } Brush;
 
 /* Brush.flag */

Modified: branches/soc-2012-bratwurst/source/blender/makesrna/intern/rna_brush.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/makesrna/intern/rna_brush.c	2012-06-15 13:35:24 UTC (rev 47953)
+++ branches/soc-2012-bratwurst/source/blender/makesrna/intern/rna_brush.c	2012-06-15 13:40:17 UTC (rev 47954)
@@ -618,6 +618,12 @@
 	RNA_def_property_ui_text(prop, "Unprojected Radius", "Radius of brush in Blender units");
 	RNA_def_property_update(prop, 0, "rna_Brush_update");
 
+	prop = RNA_def_property(srna, "random_size", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "random_size");
+	RNA_def_property_range(prop, 0.0f, 1.0f);
+	RNA_def_property_ui_text(prop, "Randomize Radius", "Radius of brush changes while painting");
+	RNA_def_property_update(prop, 0, "rna_Brush_update");
+
 	prop = RNA_def_property(srna, "jitter", PROP_FLOAT, PROP_NONE);
 	RNA_def_property_float_sdna(prop, NULL, "jitter");
 	RNA_def_property_range(prop, 0.0f, 1.0f);




More information about the Bf-blender-cvs mailing list