Blender V4.3
COM_DefocusNode.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "DNA_scene_types.h"
6
7#include "BKE_camera.h"
8
11#include "COM_DefocusNode.h"
17
18namespace blender::compositor {
19
20DefocusNode::DefocusNode(bNode *editor_node) : Node(editor_node)
21{
22 /* pass */
23}
24
26 const CompositorContext &context) const
27{
28 const bNode *node = this->get_bnode();
29 const NodeDefocus *data = (const NodeDefocus *)node->storage;
30
31 NodeOperation *radius_operation;
32 if (data->no_zbuf) {
34 SetValueOperation *multiplier = new SetValueOperation();
35 multiplier->set_value(data->scale);
36 SetValueOperation *max_radius = new SetValueOperation();
37 max_radius->set_value(data->maxblur);
39
40 converter.add_operation(multiply);
41 converter.add_operation(multiplier);
42 converter.add_operation(max_radius);
43 converter.add_operation(minimize);
44
45 converter.map_input_socket(get_input_socket(1), multiply->get_input_socket(0));
46 converter.add_link(multiplier->get_output_socket(), multiply->get_input_socket(1));
47 converter.add_link(multiply->get_output_socket(), minimize->get_input_socket(0));
48 converter.add_link(max_radius->get_output_socket(), minimize->get_input_socket(1));
49
50 radius_operation = minimize;
51 }
52 else {
54 radius_op->set_data(data);
55 radius_op->set_scene(get_scene(context));
56 converter.add_operation(radius_op);
57 converter.map_input_socket(get_input_socket(1), radius_op->get_input_socket(0));
58 converter.map_input_socket(get_input_socket(0), radius_op->get_input_socket(1));
59
60 GaussianXBlurOperation *blur_x_operation = new GaussianXBlurOperation();
61 converter.add_operation(blur_x_operation);
62 converter.add_link(radius_op->get_output_socket(), blur_x_operation->get_input_socket(0));
63
64 GaussianYBlurOperation *blur_y_operation = new GaussianYBlurOperation();
65 converter.add_operation(blur_y_operation);
66 converter.add_link(blur_x_operation->get_output_socket(),
67 blur_y_operation->get_input_socket(0));
68
69 MathMinimumOperation *minimum_operation = new MathMinimumOperation();
70 converter.add_operation(minimum_operation);
71 converter.add_link(blur_y_operation->get_output_socket(),
72 minimum_operation->get_input_socket(0));
73 converter.add_link(radius_op->get_output_socket(), minimum_operation->get_input_socket(1));
74
75 radius_op->set_blur_x_operation(blur_x_operation);
76 radius_op->set_blur_y_operation(blur_y_operation);
77
78 radius_operation = minimum_operation;
79 }
80
81 NodeBokehImage *bokehdata = new NodeBokehImage();
82 bokehdata->angle = data->rotation;
83 bokehdata->rounding = 0.0f;
84 bokehdata->flaps = data->bktype;
85 if (data->bktype < 3) {
86 bokehdata->flaps = 5;
87 bokehdata->rounding = 1.0f;
88 }
89 bokehdata->catadioptric = 0.0f;
90 bokehdata->lensshift = 0.0f;
91
93 bokeh->set_data(bokehdata);
94 bokeh->set_resolution(math::ceil(data->maxblur) * 2 + 1);
95 bokeh->delete_data_on_finish();
96 converter.add_operation(bokeh);
97
98 SetValueOperation *bounding_box_operation = new SetValueOperation();
99 bounding_box_operation->set_value(1.0f);
100 converter.add_operation(bounding_box_operation);
101
103 operation->set_max_blur(data->maxblur);
104 operation->set_threshold(0.0f);
105 converter.add_operation(operation);
106
107 converter.add_link(bokeh->get_output_socket(), operation->get_input_socket(1));
108 converter.add_link(radius_operation->get_output_socket(), operation->get_input_socket(2));
109 converter.add_link(bounding_box_operation->get_output_socket(), operation->get_input_socket(3));
110
111 if (data->gamco) {
113 converter.add_operation(correct);
115 converter.add_operation(inverse);
116
117 converter.map_input_socket(get_input_socket(0), correct->get_input_socket(0));
118 converter.add_link(correct->get_output_socket(), operation->get_input_socket(0));
119 converter.add_link(operation->get_output_socket(), inverse->get_input_socket(0));
120 converter.map_output_socket(get_output_socket(), inverse->get_output_socket());
121 }
122 else {
123 converter.map_input_socket(get_input_socket(0), operation->get_input_socket(0));
124 converter.map_output_socket(get_output_socket(), operation->get_output_socket());
125 }
126}
127
129{
130 return get_bnode()->id ? reinterpret_cast<Scene *>(get_bnode()->id) : context.get_scene();
131}
132
133} // namespace blender::compositor
Camera data-block and utility functions.
struct NodeBokehImage NodeBokehImage
btMatrix3x3 inverse() const
Return the inverse of the matrix.
Overall context of the compositor.
void set_blur_y_operation(GaussianYBlurOperation *blur_y_operation)
void set_blur_x_operation(GaussianXBlurOperation *blur_x_operation)
const Scene * get_scene(const CompositorContext &context) const
void convert_to_operations(NodeConverter &converter, const CompositorContext &context) const override
convert node to operation
void add_link(NodeOperationOutput *from, NodeOperationInput *to)
void map_output_socket(NodeOutput *node_socket, NodeOperationOutput *operation_socket)
void add_operation(NodeOperation *operation)
void map_input_socket(NodeInput *node_socket, NodeOperationInput *operation_socket)
NodeOperation contains calculation logic.
NodeOperationOutput * get_output_socket(unsigned int index=0)
NodeOperationInput * get_input_socket(unsigned int index)
NodeOutput * get_output_socket(unsigned int index=0) const
Definition COM_Node.cc:85
NodeInput * get_input_socket(unsigned int index) const
Definition COM_Node.cc:90
const bNode * get_bnode() const
get the reference to the SDNA bNode struct
Definition COM_Node.h:65
T ceil(const T &a)
static void minimize(float rvalue[3], float mp[3], const float pts[12][3], const float norms[12][3], const int parity[12])
Definition octree.cpp:2237
struct ID * id