diff options
author | Antony Riakiotakis <kalast@gmail.com> | 2013-03-27 01:34:39 +0400 |
---|---|---|
committer | Antony Riakiotakis <kalast@gmail.com> | 2013-03-27 01:34:39 +0400 |
commit | 1942452ce52fa917198fee6f389f1bc7e4c620fe (patch) | |
tree | c0c8eb94447eee93bdea2e10fd3cc313546c7b01 | |
parent | 974d73bfbfbd3f10ad28c3da52e2a6cd84a3b8b8 (diff) |
Paint system:
Random texture mapping
* Support for 2d painting.
* Better random generation and useof the result.
-rw-r--r-- | source/blender/blenkernel/BKE_brush.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/brush.c | 32 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_image_2d.c | 4 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_stroke.c | 9 |
4 files changed, 32 insertions, 14 deletions
diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h index 17ef8e901f4..503c7a7f435 100644 --- a/source/blender/blenkernel/BKE_brush.h +++ b/source/blender/blenkernel/BKE_brush.h @@ -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); diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 888426735c5..aab2bcce70b 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -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) { diff --git a/source/blender/editors/sculpt_paint/paint_image_2d.c b/source/blender/editors/sculpt_paint/paint_image_2d.c index 9bc232c6a61..a45209de643 100644 --- a/source/blender/editors/sculpt_paint/paint_image_2d.c +++ b/source/blender/editors/sculpt_paint/paint_image_2d.c @@ -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); diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c index d7e2d010f03..ca48524096a 100644 --- a/source/blender/editors/sculpt_paint/paint_stroke.c +++ b/source/blender/editors/sculpt_paint/paint_stroke.c @@ -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) { |