Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/composite/nodes/node_composite_blur.cc
| Show First 20 Lines • Show All 100 Lines • ▼ Show 20 Lines | public: | ||||
| void execute() override | void execute() override | ||||
| { | { | ||||
| if (is_identity()) { | if (is_identity()) { | ||||
| get_input("Image").pass_through(get_result("Image")); | get_input("Image").pass_through(get_result("Image")); | ||||
| return; | return; | ||||
| } | } | ||||
| if (use_separable_filter()) { | if (!get_input("Size").is_single_value() && get_variable_size()) { | ||||
| execute_variable_size(); | |||||
| } | |||||
| else if (use_separable_filter()) { | |||||
| symmetric_separable_blur(context(), | symmetric_separable_blur(context(), | ||||
| get_input("Image"), | get_input("Image"), | ||||
| get_result("Image"), | get_result("Image"), | ||||
| compute_blur_radius(), | compute_blur_radius(), | ||||
| node_storage(bnode()).filtertype, | node_storage(bnode()).filtertype, | ||||
| get_extend_bounds(), | get_extend_bounds(), | ||||
| node_storage(bnode()).gamma); | node_storage(bnode()).gamma); | ||||
| } | } | ||||
| else { | else { | ||||
| execute_blur(); | execute_constant_size(); | ||||
| } | } | ||||
| } | } | ||||
| void execute_blur() | void execute_constant_size() | ||||
| { | { | ||||
| GPUShader *shader = shader_manager().get("compositor_symmetric_blur"); | GPUShader *shader = shader_manager().get("compositor_symmetric_blur"); | ||||
| GPU_shader_bind(shader); | GPU_shader_bind(shader); | ||||
| GPU_shader_uniform_1b(shader, "extend_bounds", get_extend_bounds()); | GPU_shader_uniform_1b(shader, "extend_bounds", get_extend_bounds()); | ||||
| GPU_shader_uniform_1b(shader, "gamma_correct", node_storage(bnode()).gamma); | GPU_shader_uniform_1b(shader, "gamma_correct", node_storage(bnode()).gamma); | ||||
| const Result &input_image = get_input("Image"); | const Result &input_image = get_input("Image"); | ||||
| Show All 18 Lines | void execute_constant_size() | ||||
| compute_dispatch_threads_at_least(shader, domain.size); | compute_dispatch_threads_at_least(shader, domain.size); | ||||
| GPU_shader_unbind(); | GPU_shader_unbind(); | ||||
| output_image.unbind_as_image(); | output_image.unbind_as_image(); | ||||
| input_image.unbind_as_texture(); | input_image.unbind_as_texture(); | ||||
| weights.unbind_as_texture(); | weights.unbind_as_texture(); | ||||
| } | } | ||||
| void execute_variable_size() | |||||
| { | |||||
| GPUShader *shader = shader_manager().get("compositor_symmetric_blur_variable_size"); | |||||
| GPU_shader_bind(shader); | |||||
| GPU_shader_uniform_1b(shader, "extend_bounds", get_extend_bounds()); | |||||
| GPU_shader_uniform_1b(shader, "gamma_correct", node_storage(bnode()).gamma); | |||||
| const Result &input_image = get_input("Image"); | |||||
| input_image.bind_as_texture(shader, "input_tx"); | |||||
| const float2 blur_radius = compute_blur_radius(); | |||||
| const SymmetricBlurWeights &weights = context().cache_manager().get_symmetric_blur_weights( | |||||
| node_storage(bnode()).filtertype, blur_radius); | |||||
| weights.bind_as_texture(shader, "weights_tx"); | |||||
| const Result &input_size = get_input("Size"); | |||||
| input_size.bind_as_texture(shader, "size_tx"); | |||||
| Domain domain = compute_domain(); | |||||
| if (get_extend_bounds()) { | |||||
| /* Add a radius amount of pixels in both sides of the image, hence the multiply by 2. */ | |||||
| domain.size += int2(math::ceil(blur_radius)) * 2; | |||||
| } | |||||
| Result &output_image = get_result("Image"); | |||||
| output_image.allocate_texture(domain); | |||||
| output_image.bind_as_image(shader, "output_img"); | |||||
| compute_dispatch_threads_at_least(shader, domain.size); | |||||
| GPU_shader_unbind(); | |||||
| output_image.unbind_as_image(); | |||||
| input_image.unbind_as_texture(); | |||||
| weights.unbind_as_texture(); | |||||
| input_size.unbind_as_texture(); | |||||
| } | |||||
| float2 compute_blur_radius() | float2 compute_blur_radius() | ||||
| { | { | ||||
| const float size = math::clamp(get_input("Size").get_float_value_default(1.0f), 0.0f, 1.0f); | const float size = math::clamp(get_input("Size").get_float_value_default(1.0f), 0.0f, 1.0f); | ||||
| if (!node_storage(bnode()).relative) { | if (!node_storage(bnode()).relative) { | ||||
| return float2(node_storage(bnode()).sizex, node_storage(bnode()).sizey) * size; | return float2(node_storage(bnode()).sizex, node_storage(bnode()).sizey) * size; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | public: | ||||
| { | { | ||||
| return float2(node_storage(bnode()).percentx, node_storage(bnode()).percenty) / 100.0f; | return float2(node_storage(bnode()).percentx, node_storage(bnode()).percenty) / 100.0f; | ||||
| } | } | ||||
| bool get_extend_bounds() | bool get_extend_bounds() | ||||
| { | { | ||||
| return bnode().custom1 & CMP_NODEFLAG_BLUR_EXTEND_BOUNDS; | return bnode().custom1 & CMP_NODEFLAG_BLUR_EXTEND_BOUNDS; | ||||
| } | } | ||||
| bool get_variable_size() | |||||
| { | |||||
| return bnode().custom1 & CMP_NODEFLAG_BLUR_VARIABLE_SIZE; | |||||
| } | |||||
| }; | }; | ||||
| static NodeOperation *get_compositor_operation(Context &context, DNode node) | static NodeOperation *get_compositor_operation(Context &context, DNode node) | ||||
| { | { | ||||
| return new BlurOperation(context, node); | return new BlurOperation(context, node); | ||||
| } | } | ||||
| } // namespace blender::nodes::node_composite_blur_cc | } // namespace blender::nodes::node_composite_blur_cc | ||||
| Show All 18 Lines | |||||