[Bf-blender-cvs] [4e270141035] temp-udim-images: Support anisotropic brush scaling to compensate for different tile aspect ratios
Lukas Stockner
noreply at git.blender.org
Wed Jun 13 18:46:27 CEST 2018
Commit: 4e2701410357db381681992beb00163b76968dbb
Author: Lukas Stockner
Date: Wed Jun 13 18:43:21 2018 +0200
Branches: temp-udim-images
https://developer.blender.org/rB4e2701410357db381681992beb00163b76968dbb
Support anisotropic brush scaling to compensate for different tile aspect ratios
===================================================================
M source/blender/blenlib/BLI_math_vector.h
M source/blender/blenlib/intern/math_vector_inline.c
M source/blender/editors/sculpt_paint/paint_image_2d.c
===================================================================
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h
index 20852f8fc82..26cc3bf69d6 100644
--- a/source/blender/blenlib/BLI_math_vector.h
+++ b/source/blender/blenlib/BLI_math_vector.h
@@ -261,6 +261,8 @@ MINLINE bool equals_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED
MINLINE bool equals_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT;
MINLINE bool equals_v4v4(const float a[4], const float b[4]) ATTR_WARN_UNUSED_RESULT;
+MINLINE bool equals_v2v2_int(const int v1[2], const int v2[2]) ATTR_WARN_UNUSED_RESULT;
+
MINLINE bool compare_v2v2(const float a[2], const float b[2], const float limit) ATTR_WARN_UNUSED_RESULT;
MINLINE bool compare_v3v3(const float a[3], const float b[3], const float limit) ATTR_WARN_UNUSED_RESULT;
MINLINE bool compare_v4v4(const float a[4], const float b[4], const float limit) ATTR_WARN_UNUSED_RESULT;
diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c
index 4c40921edb6..0730ea68980 100644
--- a/source/blender/blenlib/intern/math_vector_inline.c
+++ b/source/blender/blenlib/intern/math_vector_inline.c
@@ -1032,6 +1032,11 @@ MINLINE bool equals_v4v4(const float v1[4], const float v2[4])
return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]) && (v1[3] == v2[3]));
}
+MINLINE bool equals_v2v2_int(const int v1[2], const int v2[2])
+{
+ return ((v1[0] == v2[0]) && (v1[1] == v2[1]));
+}
+
MINLINE bool compare_v2v2(const float v1[2], const float v2[2], const float limit)
{
return (compare_ff(v1[0], v2[0], limit) &&
diff --git a/source/blender/editors/sculpt_paint/paint_image_2d.c b/source/blender/editors/sculpt_paint/paint_image_2d.c
index 5db4191de11..4f59d7b9994 100644
--- a/source/blender/editors/sculpt_paint/paint_image_2d.c
+++ b/source/blender/editors/sculpt_paint/paint_image_2d.c
@@ -82,7 +82,7 @@ typedef struct BrushPainterCache {
bool is_texbrush;
bool is_maskbrush;
- int lastdiameter;
+ int lastdiameter[2];
float last_tex_rotation;
float last_mask_rotation;
float last_pressure;
@@ -147,7 +147,7 @@ typedef struct ImagePaintState {
ImageUser iuser;
float uv_ofs[2];
- float radius_fac;
+ float radius_fac[2];
BlurKernel *blurkernel;
} ImagePaintState;
@@ -160,7 +160,7 @@ static BrushPainter *brush_painter_2d_new(Scene *scene, Brush *brush, bool inver
painter->brush = brush;
painter->scene = scene;
painter->firsttouch = 1;
- painter->cache.lastdiameter = -1; /* force ibuf create in refresh */
+ painter->cache.lastdiameter[0] = -1; /* force ibuf create in refresh */
painter->cache.invert = invert;
return painter;
@@ -179,7 +179,7 @@ static void brush_painter_2d_require_imbuf(BrushPainter *painter, bool use_float
painter->cache.ibuf = NULL;
painter->cache.curve_mask = NULL;
painter->cache.tex_mask = NULL;
- painter->cache.lastdiameter = -1; /* force ibuf create in refresh */
+ painter->cache.lastdiameter[0] = -1; /* force ibuf create in refresh */
}
painter->cache.use_float = use_float;
@@ -206,7 +206,7 @@ static void brush_imbuf_tex_co(rctf *mapping, int x, int y, float texco[3])
}
/* create a mask with the mask texture */
-static unsigned short *brush_painter_mask_ibuf_new(BrushPainter *painter, int size)
+static unsigned short *brush_painter_mask_ibuf_new(BrushPainter *painter, const int size[2])
{
Scene *scene = painter->scene;
Brush *brush = painter->brush;
@@ -217,11 +217,11 @@ static unsigned short *brush_painter_mask_ibuf_new(BrushPainter *painter, int si
unsigned short *mask, *m;
int x, y, thread = 0;
- mask = MEM_mallocN(sizeof(unsigned short) * size * size, "brush_painter_mask");
+ mask = MEM_mallocN(sizeof(unsigned short) * size[0] * size[1], "brush_painter_mask");
m = mask;
- for (y = 0; y < size; y++) {
- for (x = 0; x < size; x++, m++) {
+ for (y = 0; y < size[1]; y++) {
+ for (x = 0; x < size[0]; x++, m++) {
float res;
brush_imbuf_tex_co(&mask_mapping, x, y, texco);
res = BKE_brush_sample_masktex(scene, brush, texco, thread, pool);
@@ -235,7 +235,7 @@ static unsigned short *brush_painter_mask_ibuf_new(BrushPainter *painter, int si
/* update rectangular section of the brush image */
static void brush_painter_mask_imbuf_update(
BrushPainter *painter, unsigned short *tex_mask_old,
- int origx, int origy, int w, int h, int xt, int yt, int diameter)
+ int origx, int origy, int w, int h, int xt, int yt, const int diameter[2])
{
Scene *scene = painter->scene;
Brush *brush = painter->brush;
@@ -257,8 +257,8 @@ static void brush_painter_mask_imbuf_update(
float texco[3];
/* handle byte pixel */
- unsigned short *b = tex_mask + (y * diameter + x);
- unsigned short *t = tex_mask_cur + (y * diameter + x);
+ unsigned short *b = tex_mask + (y * diameter[0] + x);
+ unsigned short *t = tex_mask_cur + (y * diameter[0] + x);
if (!use_texture_old) {
brush_imbuf_tex_co(&tex_mapping, x, y, texco);
@@ -284,7 +284,7 @@ static void brush_painter_mask_imbuf_update(
* This can be considerably faster for brushes that change size due to pressure or
* textures that stick to the surface where only part of the pixels are new
*/
-static void brush_painter_mask_imbuf_partial_update(BrushPainter *painter, const float pos[2], int diameter)
+static void brush_painter_mask_imbuf_partial_update(BrushPainter *painter, const float pos[2], const int diameter[2])
{
BrushPainterCache *cache = &painter->cache;
unsigned short *tex_mask_old;
@@ -292,24 +292,25 @@ static void brush_painter_mask_imbuf_partial_update(BrushPainter *painter, const
/* create brush image buffer if it didn't exist yet */
if (!cache->tex_mask)
- cache->tex_mask = MEM_mallocN(sizeof(unsigned short) * diameter * diameter, "brush_painter_mask");
+ cache->tex_mask = MEM_mallocN(sizeof(unsigned short) * diameter[0] * diameter[1], "brush_painter_mask");
/* create new texture image buffer with coordinates relative to old */
tex_mask_old = cache->tex_mask_old;
- cache->tex_mask_old = MEM_mallocN(sizeof(unsigned short) * diameter * diameter, "brush_painter_mask");
+ cache->tex_mask_old = MEM_mallocN(sizeof(unsigned short) * diameter[0] * diameter[1], "brush_painter_mask");
if (tex_mask_old) {
ImBuf maskibuf;
ImBuf maskibuf_old;
- maskibuf.x = maskibuf.y = diameter;
+ maskibuf.x = diameter[0];
+ maskibuf.y = diameter[1];
maskibuf_old.x = cache->tex_mask_old_w;
maskibuf_old.y = cache->tex_mask_old_h;
srcx = srcy = 0;
w = cache->tex_mask_old_w;
h = cache->tex_mask_old_h;
- destx = (int)floorf(painter->lastpaintpos[0]) - (int)floorf(pos[0]) + (diameter / 2 - w / 2);
- desty = (int)floorf(painter->lastpaintpos[1]) - (int)floorf(pos[1]) + (diameter / 2 - h / 2);
+ destx = (int)floorf(painter->lastpaintpos[0]) - (int)floorf(pos[0]) + (diameter[0] / 2 - w / 2);
+ desty = (int)floorf(painter->lastpaintpos[1]) - (int)floorf(pos[1]) + (diameter[1] / 2 - h / 2);
/* hack, use temporary rects so that clipping works */
IMB_rectclip(&maskibuf, &maskibuf_old, &destx, &desty, &srcx, &srcy, &w, &h);
@@ -320,10 +321,10 @@ static void brush_painter_mask_imbuf_partial_update(BrushPainter *painter, const
w = h = 0;
}
- x1 = min_ii(destx, diameter);
- y1 = min_ii(desty, diameter);
- x2 = min_ii(destx + w, diameter);
- y2 = min_ii(desty + h, diameter);
+ x1 = min_ii(destx, diameter[0]);
+ y1 = min_ii(desty, diameter[1]);
+ x2 = min_ii(destx + w, diameter[0]);
+ y2 = min_ii(desty + h, diameter[1]);
/* blend existing texture in new position */
if ((x1 < x2) && (y1 < y2))
@@ -333,40 +334,42 @@ static void brush_painter_mask_imbuf_partial_update(BrushPainter *painter, const
MEM_freeN(tex_mask_old);
/* sample texture in new areas */
- if ((0 < x1) && (0 < diameter))
- brush_painter_mask_imbuf_update(painter, NULL, 0, 0, x1, diameter, 0, 0, diameter);
- if ((x2 < diameter) && (0 < diameter))
- brush_painter_mask_imbuf_update(painter, NULL, x2, 0, diameter, diameter, 0, 0, diameter);
+ if ((0 < x1) && (0 < diameter[1]))
+ brush_painter_mask_imbuf_update(painter, NULL, 0, 0, x1, diameter[1], 0, 0, diameter);
+ if ((x2 < diameter[0]) && (0 < diameter[1]))
+ brush_painter_mask_imbuf_update(painter, NULL, x2, 0, diameter[0], diameter[1], 0, 0, diameter);
if ((x1 < x2) && (0 < y1))
brush_painter_mask_imbuf_update(painter, NULL, x1, 0, x2, y1, 0, 0, diameter);
- if ((x1 < x2) && (y2 < diameter))
- brush_painter_mask_imbuf_update(painter, NULL, x1, y2, x2, diameter, 0, 0, diameter);
+ if ((x1 < x2) && (y2 < diameter[1]))
+ brush_painter_mask_imbuf_update(painter, NULL, x1, y2, x2, diameter[1], 0, 0, diameter);
/* through with sampling, now update sizes */
- cache->tex_mask_old_w = diameter;
- cache->tex_mask_old_h = diameter;
+ cache->tex_mask_old_w = diameter[0];
+ cache->tex_mask_old_h = diameter[1];
}
/* create a mask with the falloff strength */
-static unsigned short *brush_painter_curve_mask_new(BrushPainter *painter, int diameter, float radius)
+static unsigned short *brush_painter_curve_mask_new(BrushPainter *painter, const int diameter[2], const float radius[2])
{
Brush *brush = painter->brush;
- int xoff = -radius;
- int yoff = -radius;
unsigned short *mask, *m;
int x, y;
- mask = MEM_mallocN(sizeof(unsigned short) * diameter * diameter, "brush_painter_mask");
+ mask = MEM_mallocN(sizeof(unsigned short) * diameter[0] * diameter[1], "brush_painter_mask");
m = mask;
- for (y = 0; y < diameter; y++) {
- for (x = 0; x < diameter; x++, m++) {
- float xy[2] = {x + xoff, y + yoff};
+ float max_radius = max_ff(radius[0], radius[1]);
+ float xfac = max_radius/radius[0];
+ float yfac = max_radius/radius[1];
+
+ for (y = 0; y < diameter[1]; y++) {
+ for (x = 0; x < diameter[0]; x++, m++) {
+ float xy[2] = {x*xfac - max_radius, y*yfac - max_radius};
float len = len_v2(xy);
- *m = (unsigned short)(65535.0f * BKE_brush_curve_strength_clamped(brush, len, radius));
+ *m = (unsigned short)(65535.0f * BKE_brush_curve_strength_clamped(brush, len, max_radius));
}
}
@@ -375,7 +378,7 @@ static unsigned short *brush_painter_curve_mask_new(BrushPainter *painter, int d
/* create im
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list