[Bf-blender-cvs] [8a87d28] compositor-2016: Added weighted samples

Jeroen Bakker noreply at git.blender.org
Wed Jun 1 20:30:15 CEST 2016


Commit: 8a87d28598bd34846937531d22f58c31aae87588
Author: Jeroen Bakker
Date:   Wed May 25 20:37:25 2016 +0200
Branches: compositor-2016
https://developer.blender.org/rB8a87d28598bd34846937531d22f58c31aae87588

Added weighted samples

===================================================================

M	source/blender/compositor/cmp/cmp_compositor.cpp
M	source/blender/compositor/device/device_cpu.cpp
M	source/blender/compositor/kernel/cvm/cvm_node_blur.h
M	source/blender/compositor/kernel/cvm/cvm_node_color.h
M	source/blender/compositor/kernel/cvm/cvm_node_mix.h
M	source/blender/compositor/kernel/cvm/cvm_node_renderlayer.h
M	source/blender/compositor/kernel/cvm/cvm_node_value.h
M	source/blender/compositor/kernel/cvm/cvm_node_viewer.h
M	source/blender/compositor/kernel/cvm/cvm_nodes.h
M	source/blender/compositor/kernel/kernel_functions.h
M	source/blender/compositor/kernel/kernel_types.h

===================================================================

diff --git a/source/blender/compositor/cmp/cmp_compositor.cpp b/source/blender/compositor/cmp/cmp_compositor.cpp
index 6829c17..57ae4ea 100644
--- a/source/blender/compositor/cmp/cmp_compositor.cpp
+++ b/source/blender/compositor/cmp/cmp_compositor.cpp
@@ -64,7 +64,7 @@ void COM_execute(RenderData *rd, Scene *scene, bNodeTree *editingtree, int rende
         if (y_max > height) y_max = height;
 
         Compositor::Device::Task* task = new Compositor::Device::Task(node, x, y, x_max, y_max, &output);
-        task->max_iteration = 100;
+        task->max_iteration = 1000;
         tasks[tile_index++] = task;
       }
     }
diff --git a/source/blender/compositor/device/device_cpu.cpp b/source/blender/compositor/device/device_cpu.cpp
index be030e6..5a5c6ea 100644
--- a/source/blender/compositor/device/device_cpu.cpp
+++ b/source/blender/compositor/device/device_cpu.cpp
@@ -2,6 +2,9 @@
 
 #define CMP_DEVICE_CPU
 #define __cvm_inline inline
+#define __cvm_inout_post *
+#define __cvm_out_set *
+#define __cvm_in_ref &
 #include "kernel.h"
 extern "C" {
   #include "BKE_node.h"
@@ -92,7 +95,8 @@ namespace Compositor {
       // perform task
       KernelGlobal globals;
       globals.phase = KG_PHASE_REFINE;
-      globals.subpixel_samples_xy = 1;
+      globals.subpixel_samples_xy = 4;
+      globals.width = 960;
 
       Node* node = task->node;
       const int curr_iteration = task->iteration;
@@ -104,7 +108,7 @@ namespace Compositor {
         int offset = (y*width + task->x_min)*4;
         for (int x = task->x_min; x < task->x_max ; x ++) {
           float2 xy = make_float2((float)x, (float)y);
-          float4 color = node_execute_float4(globals, node->stack_index, xy);
+          float4 color = node_execute_float4(globals, node->stack_index, xy, NULL);
           buffer[offset] = ((buffer[offset]*prev_iteration)+color.x)/curr_iteration;
           buffer[offset+1] = ((buffer[offset+1]*prev_iteration)+color.y)/curr_iteration;
           buffer[offset+2] = ((buffer[offset+2]*prev_iteration)+color.z)/curr_iteration;
diff --git a/source/blender/compositor/kernel/cvm/cvm_node_blur.h b/source/blender/compositor/kernel/cvm/cvm_node_blur.h
index 4e17ca4..b25a342 100644
--- a/source/blender/compositor/kernel/cvm/cvm_node_blur.h
+++ b/source/blender/compositor/kernel/cvm/cvm_node_blur.h
@@ -1,12 +1,12 @@
 
 CVM_float4_node_start(blur)
 
-  float blur_size = 100.f * node.var_float_0;
+  float blur_size = global.width * node.var_float_0;
   float2 move = (rand_float2(xy) * 2.f - 1.f) * blur_size;
   if (length(move) <= blur_size)
-    return CVM_float4_node_call(0, xy+move);
+    return CVM_float4_node_call(0, xy+move, sample_weight);
 
-  // return CVM_float4_node_call(0, xy);
+  __cvm_out_set sample_weight = 0.;
   return make_float4(0.f, 0.f, 0.f, 0.f);
 
 CVM_float4_node_end
diff --git a/source/blender/compositor/kernel/cvm/cvm_node_color.h b/source/blender/compositor/kernel/cvm/cvm_node_color.h
index 3f78116..d64d720 100644
--- a/source/blender/compositor/kernel/cvm/cvm_node_color.h
+++ b/source/blender/compositor/kernel/cvm/cvm_node_color.h
@@ -1,3 +1,4 @@
 CVM_float4_node_start(color)
+  __cvm_out_set sample_weight = 1.0;
   return make_float4(node.var_float_0, node.var_float_1, node.var_float_2, node.var_float_3);
 CVM_float4_node_end
diff --git a/source/blender/compositor/kernel/cvm/cvm_node_mix.h b/source/blender/compositor/kernel/cvm/cvm_node_mix.h
index 40fa664..31db2fb 100644
--- a/source/blender/compositor/kernel/cvm/cvm_node_mix.h
+++ b/source/blender/compositor/kernel/cvm/cvm_node_mix.h
@@ -18,10 +18,14 @@
 #define MA_RAMP_LINEAR      17
 
 CVM_float4_node_start(mix)
-  float value = CVM_float_node_call(0, xy);
+  float weight_value;
+  float weight_color1;
+  float weight_color2;
+  float value = CVM_float_node_call(0, xy, __cvm_in_ref weight_value);
   float inverse = 1.0 - value;
-  float4 color1 = CVM_float4_node_call(1, xy);
-  float4 color2 = CVM_float4_node_call(2, xy);
+  float4 color1 = CVM_float4_node_call(1, xy, __cvm_in_ref weight_color1);
+  float4 color2 = CVM_float4_node_call(2, xy, __cvm_in_ref weight_color2);
+  __cvm_out_set sample_weight = min(weight_color1, weight_color2);
 
   const int mix_type = node.var_int_0;
   if (mix_type == MA_RAMP_BLEND) {
diff --git a/source/blender/compositor/kernel/cvm/cvm_node_renderlayer.h b/source/blender/compositor/kernel/cvm/cvm_node_renderlayer.h
index f7cee8b..0d34ac3 100644
--- a/source/blender/compositor/kernel/cvm/cvm_node_renderlayer.h
+++ b/source/blender/compositor/kernel/cvm/cvm_node_renderlayer.h
@@ -4,11 +4,13 @@ CVM_float4_node_start(renderlayer)
   int height = textures[node.texture_index].height;
 
   if (xy.x < 0 || xy.y < 0 || xy.x >= width || xy.y >= height) {
+    __cvm_out_set sample_weight = 0.0f;
     return make_float4(0.0,0.0,0.0,0.0);
   }
 
   int offset = ((int)xy.y) * width + ((int)xy.x);
   offset *= 4;
+  __cvm_out_set sample_weight = 1.0f;
   return make_float4(
     textures[node.texture_index].buffer[offset+0],
     textures[node.texture_index].buffer[offset+1],
diff --git a/source/blender/compositor/kernel/cvm/cvm_node_value.h b/source/blender/compositor/kernel/cvm/cvm_node_value.h
index 73ca9be..81491a9 100644
--- a/source/blender/compositor/kernel/cvm/cvm_node_value.h
+++ b/source/blender/compositor/kernel/cvm/cvm_node_value.h
@@ -1,3 +1,5 @@
 CVM_float_node_start(value)
+  __cvm_out_set sample_weight = 1.0;
+
   return node.var_float_0;
 CVM_float_node_end
diff --git a/source/blender/compositor/kernel/cvm/cvm_node_viewer.h b/source/blender/compositor/kernel/cvm/cvm_node_viewer.h
index a93ec23..86a6822 100644
--- a/source/blender/compositor/kernel/cvm/cvm_node_viewer.h
+++ b/source/blender/compositor/kernel/cvm/cvm_node_viewer.h
@@ -1,15 +1,18 @@
 CVM_float4_node_start(viewer)
   float4 color_result = make_float4(0.0,0.0,0.0,0.0);
   float add_sample = 1.0f/global.subpixel_samples_xy;
+  float total_weight = 0.;
   float inset = 1.0f/(2*global.subpixel_samples_xy);
   for (float addx = inset; addx < 1.0 ; addx += add_sample ) {
     for (float addy = inset; addy < 1.0 ; addy += add_sample ) {
+      float weight = 1.;
       float2 sample_coord = make_float2(xy.x+addx, xy.y+addy);
-      float4 new_result = CVM_float4_node_call(0, sample_coord);
-      color_result += new_result;
+      float4 new_result = CVM_float4_node_call(0, sample_coord, __cvm_in_ref weight);
+      color_result += new_result*weight;
+      total_weight += weight;
     }
   }
 
-  return color_result / (global.subpixel_samples_xy*global.subpixel_samples_xy);
+  return color_result / total_weight;
 
 CVM_float4_node_end
diff --git a/source/blender/compositor/kernel/cvm/cvm_nodes.h b/source/blender/compositor/kernel/cvm/cvm_nodes.h
index 05b953a..6bf608e 100644
--- a/source/blender/compositor/kernel/cvm/cvm_nodes.h
+++ b/source/blender/compositor/kernel/cvm/cvm_nodes.h
@@ -1,18 +1,20 @@
 #define __CVM_node_method_name(node_name) node_execute_##node_name
-#define CVM_float_node_start(node_name) __cvm_inline float __CVM_node_method_name(node_name) (KernelGlobal global, Node node, float2 xy) {
+#define CVM_float_node_start(node_name) __cvm_inline float __CVM_node_method_name(node_name) (KernelGlobal global, Node node, float2 xy, float __cvm_inout_post sample_weight) {
 #define CVM_float_node_end }
-#define CVM_float4_node_start(node_name) __cvm_inline float4 __CVM_node_method_name(node_name) (KernelGlobal global, Node node, float2 xy) {
+#define CVM_float4_node_start(node_name) __cvm_inline float4 __CVM_node_method_name(node_name) (KernelGlobal global, Node node, float2 xy, float __cvm_inout_post sample_weight) {
 #define CVM_float4_node_end }
-#define CVM_float_node_call(node_input, xy) node_execute_float(global, node.input_##node_input, xy);
-#define CVM_float4_node_call(node_input, xy) node_execute_float4(global, node.input_##node_input, xy);
+#define CVM_float_node_call(node_input, xy, sample_weight) node_execute_float(global, node.input_##node_input, xy, sample_weight);
+#define CVM_float4_node_call(node_input, xy, sample_weight) node_execute_float4(global, node.input_##node_input, xy, sample_weight);
+// #define CVM_float_node_call(node_input, xy) node_execute_float(global, node.input_##node_input, xy, sample_weight);
+// #define CVM_float4_node_call(node_input, xy) node_execute_float4(global, node.input_##node_input, xy, sample_weight);
 
 
 
 
 #ifdef CMP_DEVICE_CPU
 
-float node_execute_float(KernelGlobal global, int node_offset, float2 xy);
-float4 node_execute_float4(KernelGlobal global, int node_offset, float2 xy);
+float node_execute_float(KernelGlobal global, int node_offset, float2 xy, float __cvm_inout_post sample_weight);
+float4 node_execute_float4(KernelGlobal global, int node_offset, float2 xy, float __cvm_inout_post sample_weight);
 
 #endif
 
@@ -27,23 +29,23 @@ float4 node_execute_float4(KernelGlobal global, int node_offset, float2 xy);
 #ifdef CMP_DEVICE_CPU
 // Include  the defines
 #include "BKE_node.h"
-float4 node_execute_float4(KernelGlobal global, int node_offset, float2 xy) {
+float4 node_execute_float4(KernelGlobal global, int node_offset, float2 xy, float __cvm_inout_post sample_weight) {
   Node node = get_node(node_offset);
   switch (node.type) {
     case CMP_NODE_VIEWER:
-      return node_execute_viewer(global, node, xy);
+      return node_execute_viewer(global, node, xy, sample_weight);
 
     case CMP_NODE_R_LAYERS:
-      return node_execute_renderlayer(global, node, xy);
+      return node_execute_renderlayer(global, node, xy, sample_weight);
 
     case CMP_NODE_RGB:
-      return node_execute_color(global, node, xy);
+      return node_execute_color(global, node, xy, sample_weight);
 
     case CMP_NODE_MIX_RGB:
-      return node_execute_mix(global, node, xy);
+      return node_execute_mix(global, node, xy, sample_weight);
 
     case CMP_NODE_BLUR:
-      return node_execute_blur(global, node, xy);
+      return node_execute_blur(global, node, xy, sample_weight);
 
     default:
       return CVM_ERROR;
@@ -51,11 +53,11 @@ float4 node_execute_float4(KernelGlobal global, int node_offset, float2 xy) {
 
 }
 
-float node_execute_float(KernelGlobal global, int node_offset, float2 xy) {
+float node_execute_float(KernelGlobal global, int

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list