Blender V5.0
node_composite_convert_to_display.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "DNA_color_types.h"
10
11#include "BKE_colortools.hh"
12
14
16#include "UI_resources.hh"
17
19
20#include "GPU_shader.hh"
21
22#include "COM_node_operation.hh"
24#include "COM_utilities.hh"
25
26#include "RNA_access.hh"
27
29
31
33
35{
36 b.add_input<decl::Color>("Image")
37 .default_value({1.0f, 1.0f, 1.0f, 1.0f})
38 .structure_type(StructureType::Dynamic);
39 b.add_input<decl::Bool>("Invert").default_value(false).description(
40 "Convert from display to scene linear instead. Not all view transforms can be inverted "
41 "exactly, and the result may not match the original scene linear image");
42
43 b.add_output<decl::Color>("Image").structure_type(StructureType::Dynamic);
44}
45
54
55static void node_free(bNode *node)
56{
57 NodeConvertToDisplay *nctd = static_cast<NodeConvertToDisplay *>(node->storage);
59 MEM_freeN(nctd);
60}
61
62static void node_copy(bNodeTree * /*dest_ntree*/, bNode *dest_node, const bNode *src_node)
63{
65 const NodeConvertToDisplay *src = static_cast<const NodeConvertToDisplay *>(src_node->storage);
68 dest_node->storage = dest;
69}
70
71static void node_blend_write(const bNodeTree & /*tree*/, const bNode &node, BlendWriter &writer)
72{
73 const NodeConvertToDisplay *nctd = static_cast<const NodeConvertToDisplay *>(node.storage);
75}
76
77static void node_blend_read(bNodeTree & /*tree*/, bNode &node, BlendDataReader &reader)
78{
79 NodeConvertToDisplay *nctd = static_cast<NodeConvertToDisplay *>(node.storage);
81}
82
83static void node_draw_buttons(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
84{
85#ifndef WITH_OPENCOLORIO
86 layout->label(RPT_("Disabled, built without OpenColorIO"), ICON_ERROR);
87#endif
88
89 PointerRNA display_ptr = RNA_pointer_get(ptr, "display_settings");
90 PointerRNA view_ptr = RNA_pointer_get(ptr, "view_settings");
91
92 layout->prop(&display_ptr, "display_device", UI_ITEM_NONE, std::nullopt, ICON_NONE);
93 layout->prop(&view_ptr, "view_transform", UI_ITEM_NONE, std::nullopt, ICON_NONE);
94 layout->prop(&view_ptr, "look", UI_ITEM_NONE, IFACE_("Look"), ICON_NONE);
95}
96
97using namespace blender::compositor;
98
100 public:
102
104 {
105 return this->get_input("Invert").get_single_value_default(false);
106 }
107
108 void execute() override
109 {
110 const Result &input_image = this->get_input("Image");
111
112 if (input_image.is_single_value()) {
114 return;
115 }
116 if (this->context().use_gpu()) {
117 execute_gpu();
118 }
119 else {
120 execute_cpu();
121 }
122 }
123
125 {
126 const NodeConvertToDisplay &nctd = node_storage(bnode());
127
130
131 gpu::Shader *shader = ocio_shader.bind_shader_and_resources();
132
133 /* A null shader indicates that the conversion shader is just a stub implementation since OCIO
134 * is disabled at compile time, so pass the input through in that case. */
135 const Result &input_image = this->get_input("Image");
136 Result &output_image = this->get_result("Image");
137 if (!shader) {
138 output_image.share_data(input_image);
139 return;
140 }
141
142 input_image.bind_as_texture(shader, ocio_shader.input_sampler_name());
143
144 const Domain domain = compute_domain();
145 output_image.allocate_texture(domain);
146 output_image.bind_as_image(shader, ocio_shader.output_image_name());
147
149
150 input_image.unbind_as_texture();
151 output_image.unbind_as_image();
152 ocio_shader.unbind_shader_and_resources();
153 }
154
156 {
157 const NodeConvertToDisplay &nctd = node_storage(bnode());
160
161 Result &input_image = get_input("Image");
162
163 const Domain domain = compute_domain();
164 Result &output_image = get_result("Image");
165 output_image.allocate_texture(domain);
166
167 parallel_for(domain.size, [&](const int2 texel) {
168 output_image.store_pixel(texel, input_image.load_pixel<float4>(texel));
169 });
170
172 static_cast<float *>(output_image.cpu_data().data()),
173 domain.size.x,
174 domain.size.y,
175 input_image.channels_count(),
176 false);
177 IMB_colormanagement_processor_free(color_processor);
178 }
179
181 {
182 const NodeConvertToDisplay &nctd = node_storage(bnode());
185
186 Result &input_image = get_input("Image");
187 float4 color = input_image.get_single_value<float4>();
188
190 IMB_colormanagement_processor_free(color_processor);
191
192 Result &output_image = get_result("Image");
193 output_image.allocate_single_value();
194 output_image.set_single_value(color);
195 }
196};
197
199{
200 return new ConvertToDisplayOperation(context, node);
201}
202
204{
206 static blender::bke::bNodeType ntype;
207
208 cmp_node_type_base(&ntype, "CompositorNodeConvertToDisplay", CMP_NODE_CONVERT_TO_DISPLAY);
209 ntype.ui_name = "Convert to Display";
210 ntype.ui_description =
211 "Convert from scene linear to display color space, with a view transform and look for tone "
212 "mapping";
213 ntype.enum_name_legacy = "CONVERT_TO_DISPLAY";
215 ntype.declare = node_declare;
218 ntype.initfunc = node_init;
219 blender::bke::node_type_storage(ntype, "NodeConvertToDisplay", node_free, node_copy);
224
226}
228
229} // namespace blender::nodes::node_composite_convert_to_display_cc
void BKE_color_managed_view_settings_blend_read_data(BlendDataReader *reader, ColorManagedViewSettings *settings)
void BKE_color_managed_display_settings_copy(ColorManagedDisplaySettings *new_settings, const ColorManagedDisplaySettings *settings)
void BKE_color_managed_display_settings_init(ColorManagedDisplaySettings *settings)
void BKE_color_managed_view_settings_free(ColorManagedViewSettings *settings)
void BKE_color_managed_view_settings_copy(ColorManagedViewSettings *new_settings, const ColorManagedViewSettings *settings)
void BKE_color_managed_view_settings_init(ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, const char *view_transform)
void BKE_color_managed_view_settings_blend_write(BlendWriter *writer, const ColorManagedViewSettings *settings)
#define NODE_CLASS_CONVERTER
Definition BKE_node.hh:453
#define NODE_STORAGE_FUNCS(StorageT)
Definition BKE_node.hh:1240
constexpr int NODE_DEFAULT_MAX_WIDTH
Definition BKE_node.hh:1250
#define CMP_NODE_CONVERT_TO_DISPLAY
#define RPT_(msgid)
#define IFACE_(msgid)
@ COLORMANAGE_VIEW_ONLY_VIEW_LOOK
@ DISPLAY_SPACE_VIDEO_OUTPUT
void IMB_colormanagement_processor_apply(ColormanageProcessor *cm_processor, float *buffer, int width, int height, int channels, bool predivide)
ColormanageProcessor * IMB_colormanagement_display_processor_new(const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, const ColorManagedDisplaySpace display_space=DISPLAY_SPACE_DRAW, const bool inverse=false)
void IMB_colormanagement_processor_free(ColormanageProcessor *cm_processor)
void IMB_colormanagement_processor_apply_pixel(ColormanageProcessor *cm_processor, float *pixel, int channels)
#define NOD_REGISTER_NODE(REGISTER_FUNC)
#define UI_ITEM_NONE
const void * data() const
NodeOperation(Context &context, DNode node)
OCIOToDisplayShader & get(Context &context, const ColorManagedDisplaySettings &display_settings, const ColorManagedViewSettings &view_settings, const bool inverse)
Result & get_result(StringRef identifier)
Definition operation.cc:39
Result & get_input(StringRef identifier) const
Definition operation.cc:138
virtual Domain compute_domain()
Definition operation.cc:56
void share_data(const Result &source)
Definition result.cc:523
T get_single_value_default(const T &default_value) const
void allocate_texture(const Domain domain, const bool from_pool=true, const std::optional< ResultStorageType > storage_type=std::nullopt)
Definition result.cc:389
void unbind_as_texture() const
Definition result.cc:511
void set_single_value(const T &value)
void bind_as_texture(gpu::Shader *shader, const char *texture_name) const
Definition result.cc:487
int64_t channels_count() const
void unbind_as_image() const
Definition result.cc:517
void bind_as_image(gpu::Shader *shader, const char *image_name, bool read=false) const
Definition result.cc:498
bool is_single_value() const
Definition result.cc:758
const T & get_single_value() const
OCIOToDisplayShaderContainer ocio_to_display_shaders
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
void node_type_size(bNodeType &ntype, int width, int minwidth, int maxwidth)
Definition node.cc:5384
void node_register_type(bNodeType &ntype)
Definition node.cc:2416
void node_type_storage(bNodeType &ntype, std::optional< StringRefNull > storagename, void(*freefunc)(bNode *node), void(*copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node))
Definition node.cc:5414
void node_type_size_preset(bNodeType &ntype, eNodeSizePreset size)
Definition node.cc:5396
void compute_dispatch_threads_at_least(gpu::Shader *shader, int2 threads_range, int2 local_size=int2(16))
Definition utilities.cc:196
void parallel_for(const int2 range, const Function &function)
static void node_copy(bNodeTree *, bNode *dest_node, const bNode *src_node)
static void node_blend_read(bNodeTree &, bNode &node, BlendDataReader &reader)
static void node_draw_buttons(uiLayout *layout, bContext *, PointerRNA *ptr)
static void node_blend_write(const bNodeTree &, const bNode &node, BlendWriter &writer)
static NodeOperation * get_compositor_operation(Context &context, DNode node)
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
void cmp_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
ColorManagedDisplaySettings display_settings
ColorManagedViewSettings view_settings
void * storage
Defines a node type.
Definition BKE_node.hh:238
NodeBlendWriteFunction blend_write_storage_content
Definition BKE_node.hh:390
std::string ui_description
Definition BKE_node.hh:244
NodeBlendDataReadFunction blend_data_read_storage_content
Definition BKE_node.hh:391
NodeGetCompositorOperationFunction get_compositor_operation
Definition BKE_node.hh:348
void(* initfunc)(bNodeTree *ntree, bNode *node)
Definition BKE_node.hh:289
const char * enum_name_legacy
Definition BKE_node.hh:247
void(* draw_buttons)(uiLayout *, bContext *C, PointerRNA *ptr)
Definition BKE_node.hh:259
NodeDeclareFunction declare
Definition BKE_node.hh:362
void label(blender::StringRef name, int icon)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
PointerRNA * ptr
Definition wm_files.cc:4238