Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Riakiotakis <kalast@gmail.com>2014-08-27 17:07:57 +0400
committerAntony Riakiotakis <kalast@gmail.com>2014-08-27 17:07:57 +0400
commit4e3f76e06b6654d4951a54804eaa808b040ef942 (patch)
treee4fbae0ffea2b37f35cf481243a4d696f2d805ed /source/blender/editors/sculpt_paint/paint_image.c
parentfe7de92c47b79aed701d5c0042a7f22bdcea545a (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.c54
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;
}
}