Paint system:
authorAntony Riakiotakis <kalast@gmail.com>
Tue, 26 Mar 2013 21:34:39 +0000 (21:34 +0000)
committerAntony Riakiotakis <kalast@gmail.com>
Tue, 26 Mar 2013 21:34:39 +0000 (21:34 +0000)
Random texture mapping
* Support for 2d painting.
* Better random generation and useof the result.

source/blender/blenkernel/BKE_brush.h
source/blender/blenkernel/intern/brush.c
source/blender/editors/sculpt_paint/paint_image_2d.c
source/blender/editors/sculpt_paint/paint_stroke.c

index 17ef8e901f4c815cd1ad11b6268fa54108ed663d..503c7a7f435a64fbab58e13b32eae2ce41603ab9 100644 (file)
@@ -67,6 +67,7 @@ int BKE_brush_clone_image_delete(struct Brush *brush);
 /* jitter */
 void BKE_brush_jitter_pos(const struct Scene *scene, struct Brush *brush,
                           const float pos[2], float jitterpos[2]);
+void BKE_brush_randomize_texture_coordinates(struct UnifiedPaintSettings *ups);
 
 /* brush curve */
 void BKE_brush_curve_preset(struct Brush *b, int preset);
index 888426735c5d6d318a6281b1001a9b2e6dcefc4e..aab2bcce70b551ebd0313ef39753645488138bae 100644 (file)
@@ -525,21 +525,17 @@ float BKE_brush_sample_tex_3D(const Scene *scene, Brush *br,
                float radius = 1.0f; /* Quite warnings */
                float co[3];
 
-               if (mtex->brush_map_mode == MTEX_MAP_MODE_VIEW ||
-                   mtex->brush_map_mode == MTEX_MAP_MODE_RANDOM)
+               if (mtex->brush_map_mode == MTEX_MAP_MODE_VIEW)
                {
                        /* keep coordinates relative to mouse */
 
                        rotation += ups->brush_rotation;
 
-                       point_2d[0] -= ups->tex_mouse[0];
-                       point_2d[1] -= ups->tex_mouse[1];
+                       x = point_2d[0] - ups->tex_mouse[0];
+                       y = point_2d[1] - ups->tex_mouse[1];
 
                        /* use pressure adjusted size for fixed mode */
                        radius = ups->pixel_radius;
-
-                       x = point_2d[0];
-                       y = point_2d[1];
                }
                else if (mtex->brush_map_mode == MTEX_MAP_MODE_TILED) {
                        /* leave the coordinates relative to the screen */
@@ -549,6 +545,13 @@ float BKE_brush_sample_tex_3D(const Scene *scene, Brush *br,
 
                        x = point_2d[0];
                        y = point_2d[1];
+               } else if (mtex->brush_map_mode == MTEX_MAP_MODE_RANDOM) {
+                       rotation += ups->brush_rotation;
+                       /* these contain a random coordinate */
+                       x = point_2d[0] - ups->tex_mouse[0];
+                       y = point_2d[1] - ups->tex_mouse[1];
+
+                       radius = ups->pixel_radius;
                }
 
                x /= radius;
@@ -661,6 +664,14 @@ float BKE_brush_sample_tex_2D(const Scene *scene, Brush *brush, const float xy[2
                        rotation += ups->brush_rotation;
                        radius = ups->pixel_radius;
                }
+               else if (mtex->brush_map_mode == MTEX_MAP_MODE_RANDOM) {
+                       rotation += ups->brush_rotation;
+                       /* these contain a random coordinate */
+                       x -= ups->tex_mouse[0];
+                       y -= ups->tex_mouse[1];
+
+                       radius = ups->pixel_radius;
+               }
 
                x /= radius;
                y /= radius;
@@ -981,6 +992,13 @@ void BKE_brush_jitter_pos(const Scene *scene, Brush *brush, const float pos[2],
        }
 }
 
+void BKE_brush_randomize_texture_coordinates(UnifiedPaintSettings *ups) {
+       /* we multiply with brush radius as an optimization for the brush
+        * texture sampling functions */
+       ups->tex_mouse[0] = BLI_rng_get_float(brush_rng)*ups->pixel_radius;
+       ups->tex_mouse[1] = BLI_rng_get_float(brush_rng)*ups->pixel_radius;
+}
+
 /* Uses the brush curve control to find a strength value between 0 and 1 */
 float BKE_brush_curve_strength_clamp(Brush *br, float p, const float len)
 {
index 9bc232c6a61d347f0a294cae9b80972069deb78a..a45209de64361b40ccaed8a20d810a8e4a3d7bc0 100644 (file)
@@ -345,6 +345,7 @@ static void brush_painter_2d_refresh_cache(BrushPainter *painter, const float po
        const int diameter = 2 * BKE_brush_size_get(scene, brush);
        const float alpha = BKE_brush_alpha_get(scene, brush);
        const bool do_tiled = ELEM(brush->mtex.brush_map_mode, MTEX_MAP_MODE_TILED, MTEX_MAP_MODE_3D);
+       const bool do_random = brush->mtex.brush_map_mode == MTEX_MAP_MODE_RANDOM;
        float rotation = -mtex->rot;
 
        if (mtex->brush_map_mode == MTEX_MAP_MODE_VIEW) {
@@ -354,7 +355,8 @@ static void brush_painter_2d_refresh_cache(BrushPainter *painter, const float po
        if (diameter != cache->lastsize ||
            alpha != cache->lastalpha ||
            brush->jitter != cache->lastjitter ||
-           rotation != cache->last_rotation)
+           rotation != cache->last_rotation ||
+           do_random)
        {
                if (cache->ibuf) {
                        IMB_freeImBuf(cache->ibuf);
index d7e2d010f033b3c0ddf128d9ae9167e3e80f56fb..ca48524096a5cf6e02b784bd9acc7b882644e09c 100644 (file)
@@ -188,13 +188,10 @@ static void paint_brush_update(bContext *C, Brush *brush, PaintMode mode,
                                ups->brush_rotation = 0.0f;
                }
 
-               if ((brush->mtex.brush_map_mode == MTEX_MAP_MODE_RANDOM)) {
-                       ups->tex_mouse[0] = BLI_frand() * stroke->vc.ar->sizex;
-                       ups->tex_mouse[1] = BLI_frand() * stroke->vc.ar->sizey;;
-               }
-               else {
+               if ((brush->mtex.brush_map_mode == MTEX_MAP_MODE_RANDOM))
+                       BKE_brush_randomize_texture_coordinates(ups);
+               else
                        copy_v2_v2(ups->tex_mouse, mouse);
-               }
        }
 
        if (brush->flag & BRUSH_ANCHORED) {