31 f_stop = get_f_stop();
32 focal_length = get_focal_length();
34 pixels_per_meter = compute_pixels_per_meter();
35 distance_to_image_of_focus = compute_distance_to_image_of_focus();
38 blur_data.
sizex = compute_maximum_defocus_radius();
43 blur_x_operation_->
set_data(&blur_data);
45 blur_y_operation_->
set_data(&blur_data);
59 const float depth = *it.in(0);
62 const float distance_to_image_of_object = (focal_length * depth) / (depth - focal_length);
67 float diameter =
abs((distance_to_image_of_object - distance_to_image_of_focus) *
68 (focal_length / (f_stop * distance_to_image_of_object)));
71 float radius = (diameter / 2.0f) * pixels_per_meter;
78float ConvertDepthToRadiusOperation::compute_maximum_defocus_radius()
const
80 const float maximum_diameter = compute_maximum_diameter_of_circle_of_confusion();
81 const float pixels_per_meter = compute_pixels_per_meter();
82 const float radius = (maximum_diameter / 2.0f) * pixels_per_meter;
95float ConvertDepthToRadiusOperation::compute_maximum_diameter_of_circle_of_confusion()
const
97 const float f_stop = get_f_stop();
98 const float focal_length = get_focal_length();
99 const float distance_to_image_of_focus = compute_distance_to_image_of_focus();
100 return math::abs((distance_to_image_of_focus / (f_stop * focal_length)) -
101 (focal_length / f_stop));
109float ConvertDepthToRadiusOperation::compute_distance_to_image_of_focus()
const
111 const float focal_length = get_focal_length();
112 const float focus_distance = compute_focus_distance();
113 return (focal_length * focus_distance) / (focus_distance - focal_length);
118float ConvertDepthToRadiusOperation::get_focal_length()
const
120 const Camera *camera = get_camera();
121 return camera ?
math::max(1e-6f, camera->lens / 1000.0f) : 50.0f / 1000.0f;
126float ConvertDepthToRadiusOperation::compute_focus_distance()
const
128 const Object *camera_object = get_camera_object();
129 if (!camera_object) {
138float ConvertDepthToRadiusOperation::compute_pixels_per_meter()
const
142 const Camera *camera = get_camera();
145 return default_value;
148 switch (camera->sensor_fit) {
150 return size.x / (camera->sensor_x / 1000.0f);
152 return size.y / (camera->sensor_y / 1000.0f);
154 return size.x > size.y ? size.x / (camera->sensor_x / 1000.0f) :
155 size.y / (camera->sensor_y / 1000.0f);
161 return default_value;
165float ConvertDepthToRadiusOperation::get_f_stop()
const
170const Camera *ConvertDepthToRadiusOperation::get_camera()
const
172 const Object *camera_object = get_camera_object();
177 return reinterpret_cast<Camera *
>(camera_object->
data);
180const Object *ConvertDepthToRadiusOperation::get_camera_object()
const
Camera data-block and utility functions.
float BKE_camera_object_dof_distance(const struct Object *ob)
#define DEFAULT_SENSOR_WIDTH
Object is a sort of wrapper for general info.
void set_data(const NodeBlurData *data)
void set_size(float size)
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void init_execution() override
ConvertDepthToRadiusOperation()
a MemoryBuffer contains access to the data
unsigned int get_height() const
void add_output_socket(DataType datatype)
SocketReader * get_input_socket_reader(unsigned int index)
unsigned int get_width() const
NodeOperationFlags flags_
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
T min(const T &a, const T &b)
T max(const T &a, const T &b)
VecBase< int32_t, 2 > int2
ccl_device_inline int abs(int x)