Blender  V3.3
COM_DefocusNode.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2011 Blender Foundation. */
3 
4 #include "COM_DefocusNode.h"
11 
12 namespace blender::compositor {
13 
14 DefocusNode::DefocusNode(bNode *editor_node) : Node(editor_node)
15 {
16  /* pass */
17 }
18 
20  const CompositorContext &context) const
21 {
22  bNode *node = this->get_bnode();
23  NodeDefocus *data = (NodeDefocus *)node->storage;
24  Scene *scene = node->id ? (Scene *)node->id : context.get_scene();
25  Object *camob = scene ? scene->camera : nullptr;
26 
27  NodeOperation *radius_operation;
28  if (data->no_zbuf) {
30  SetValueOperation *multiplier = new SetValueOperation();
31  multiplier->set_value(data->scale);
32  SetValueOperation *max_radius = new SetValueOperation();
33  max_radius->set_value(data->maxblur);
35 
36  converter.add_operation(multiply);
37  converter.add_operation(multiplier);
38  converter.add_operation(max_radius);
39  converter.add_operation(minimize);
40 
41  converter.map_input_socket(get_input_socket(1), multiply->get_input_socket(0));
42  converter.add_link(multiplier->get_output_socket(), multiply->get_input_socket(1));
43  converter.add_link(multiply->get_output_socket(), minimize->get_input_socket(0));
44  converter.add_link(max_radius->get_output_socket(), minimize->get_input_socket(1));
45 
46  radius_operation = minimize;
47  }
48  else {
50  radius_op->set_camera_object(camob);
51  radius_op->setf_stop(data->fstop);
52  radius_op->set_max_radius(data->maxblur);
53  converter.add_operation(radius_op);
54 
55  converter.map_input_socket(get_input_socket(1), radius_op->get_input_socket(0));
56 
58  /* maintain close pixels so far Z values don't bleed into the foreground */
60  converter.add_operation(blur);
61 
62  converter.add_link(radius_op->get_output_socket(0), blur->get_input_socket(0));
63  radius_op->set_post_blur(blur);
64 
65  radius_operation = blur;
66  }
67 
68  NodeBokehImage *bokehdata = new NodeBokehImage();
69  bokehdata->angle = data->rotation;
70  bokehdata->rounding = 0.0f;
71  bokehdata->flaps = data->bktype;
72  if (data->bktype < 3) {
73  bokehdata->flaps = 5;
74  bokehdata->rounding = 1.0f;
75  }
76  bokehdata->catadioptric = 0.0f;
77  bokehdata->lensshift = 0.0f;
78 
80  bokeh->set_data(bokehdata);
81  bokeh->delete_data_on_finish();
82  converter.add_operation(bokeh);
83 
84 #ifdef COM_DEFOCUS_SEARCH
85  InverseSearchRadiusOperation *search = new InverseSearchRadiusOperation();
86  search->set_max_blur(data->maxblur);
87  converter.add_operation(search);
88 
89  converter.add_link(radius_operation->get_output_socket(0), search->get_input_socket(0));
90 #endif
91 
93  if (data->preview) {
95  }
96  else {
97  operation->set_quality(context.get_quality());
98  }
99  operation->set_max_blur(data->maxblur);
100  operation->set_threshold(data->bthresh);
101  converter.add_operation(operation);
102 
103  converter.add_link(bokeh->get_output_socket(), operation->get_input_socket(1));
104  converter.add_link(radius_operation->get_output_socket(), operation->get_input_socket(2));
105 #ifdef COM_DEFOCUS_SEARCH
106  converter.add_link(search->get_output_socket(), operation->get_input_socket(3));
107 #endif
108 
109  if (data->gamco) {
111  converter.add_operation(correct);
113  converter.add_operation(inverse);
114 
115  converter.map_input_socket(get_input_socket(0), correct->get_input_socket(0));
116  converter.add_link(correct->get_output_socket(), operation->get_input_socket(0));
117  converter.add_link(operation->get_output_socket(), inverse->get_input_socket(0));
118  converter.map_output_socket(get_output_socket(), inverse->get_output_socket());
119  }
120  else {
121  converter.map_input_socket(get_input_socket(0), operation->get_input_socket(0));
122  converter.map_output_socket(get_output_socket(), operation->get_output_socket());
123  }
124 }
125 
126 } // namespace blender::compositor
struct NodeBokehImage NodeBokehImage
btMatrix3x3 inverse() const
Return the inverse of the matrix.
Definition: btTransform.h:182
The BokehImageOperation class is an operation that creates an image useful to mimic the internals of ...
void set_data(NodeBokehImage *data)
set the node data
Overall context of the compositor.
void set_post_blur(FastGaussianBlurValueOperation *operation)
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:84
bNode * get_bnode() const
get the reference to the SDNA bNode struct
Definition: COM_Node.h:64
NodeInput * get_input_socket(unsigned int index) const
Definition: COM_Node.cc:89
void set_quality(eCompositorQuality quality)
OperationNode * node
Scene scene
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:2226
struct Object * camera