diff options
author | Antony Riakiotakis <kalast@gmail.com> | 2014-08-27 17:07:57 +0400 |
---|---|---|
committer | Antony Riakiotakis <kalast@gmail.com> | 2014-08-27 17:07:57 +0400 |
commit | 4e3f76e06b6654d4951a54804eaa808b040ef942 (patch) | |
tree | e4fbae0ffea2b37f35cf481243a4d696f2d805ed /source/blender/editors/sculpt_paint/paint_image.c | |
parent | fe7de92c47b79aed701d5c0042a7f22bdcea545a (diff) |
Fix T41406:
Disallow kernels bigger than 2x2 for blur/sharpen in projective painting
due to performance considerations.
Diffstat (limited to 'source/blender/editors/sculpt_paint/paint_image.c')
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_image.c | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index e9e1615b27d..0ec813c2631 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -510,19 +510,32 @@ void imapaint_image_update(SpaceImage *sima, Image *image, ImBuf *ibuf, short te } } -/* paint blur kernels */ -BlurKernel *paint_new_blur_kernel(Brush *br) +/* paint blur kernels. Projective painting enforces use of a 2x2 kernel due to lagging */ +BlurKernel *paint_new_blur_kernel(Brush *br, bool proj) { int i, j; BlurKernel *kernel = MEM_mallocN(sizeof(BlurKernel), "blur kernel"); - int pixel_len = br->blur_kernel_radius; + float radius; + int side; BlurKernelType type = br->blur_mode; - kernel->side = pixel_len * 2 + 1; - kernel->side_squared = kernel->side * kernel->side; - kernel->wdata = MEM_mallocN(sizeof(float) * kernel->side_squared, "blur kernel data"); - kernel->pixel_len = pixel_len; - + if (proj) { + radius = 0.5f; + + side = kernel->side = 2; + kernel->side_squared = kernel->side * kernel->side; + kernel->wdata = MEM_mallocN(sizeof(float) * kernel->side_squared, "blur kernel data"); + kernel->pixel_len = radius; + } + else { + radius = br->blur_kernel_radius; + + side = kernel->side = radius * 2 + 1; + kernel->side_squared = kernel->side * kernel->side; + kernel->wdata = MEM_mallocN(sizeof(float) * kernel->side_squared, "blur kernel data"); + kernel->pixel_len = br->blur_kernel_radius; + } + switch (type) { case KERNEL_BOX: for (i = 0; i < kernel->side_squared; i++) @@ -531,26 +544,19 @@ BlurKernel *paint_new_blur_kernel(Brush *br) case KERNEL_GAUSSIAN: { - float standard_dev = pixel_len / 3.0; /* at standard deviation of 3.0 kernel is at about zero */ - int i_term = pixel_len + 1; - + /* at standard deviation of 3.0 kernel is at about zero */ + float standard_dev = radius / 3.0f; + /* make the necessary adjustment to the value for use in the normal distribution formula */ standard_dev = standard_dev * standard_dev * 2; - kernel->wdata[pixel_len + pixel_len * kernel->side] = 1.0; - /* fill in all four quadrants at once */ - for (i = 0; i < i_term; i++) { - for (j = 0; j < pixel_len; j++) { - float idist = pixel_len - i; - float jdist = pixel_len - j; - + for (i = 0; i < side; i++) { + for (j = 0; j < side; j++) { + float idist = radius - i; + float jdist = radius - j; float value = exp((idist * idist + jdist * jdist) / standard_dev); - - kernel->wdata[i + j * kernel->side] = - kernel->wdata[(kernel->side - j - 1) + i * kernel->side] = - kernel->wdata[(kernel->side - i - 1) + (kernel->side - j - 1) * kernel->side] = - kernel->wdata[j + (kernel->side - i - 1) * kernel->side] = - value; + + kernel->wdata[i + j * side] = value; } } |