49 {
SOCK_RGBA,
N_(
"Image"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
50 {
SOCK_FLOAT,
N_(
"Alpha"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
82#define NUM_LEGACY_SOCKETS (ARRAY_SIZE(cmp_node_rlayers_out) - 1)
86 if (
STREQ(name,
"DiffDir")) {
87 return "Diffuse Direct";
89 if (
STREQ(name,
"DiffInd")) {
90 return "Diffuse Indirect";
92 if (
STREQ(name,
"DiffCol")) {
93 return "Diffuse Color";
95 if (
STREQ(name,
"GlossDir")) {
96 return "Glossy Direct";
98 if (
STREQ(name,
"GlossInd")) {
99 return "Glossy Indirect";
101 if (
STREQ(name,
"GlossCol")) {
102 return "Glossy Color";
104 if (
STREQ(name,
"TransDir")) {
105 return "Transmission Direct";
107 if (
STREQ(name,
"TransInd")) {
108 return "Transmission Indirect";
110 if (
STREQ(name,
"TransCol")) {
111 return "Transmission Color";
113 if (
STREQ(name,
"VolumeDir")) {
114 return "Volume Direct";
116 if (
STREQ(name,
"VolumeInd")) {
117 return "Volume Indirect";
119 if (
STREQ(name,
"VolumeCol")) {
120 return "Volume Color";
122 if (
STREQ(name,
"AO")) {
123 return "Ambient Occlusion";
125 if (
STREQ(name,
"Env")) {
126 return "Environment";
128 if (
STREQ(name,
"IndexMA")) {
129 return "Material Index";
131 if (
STREQ(name,
"IndexOB")) {
132 return "Object Index";
134 if (
STREQ(name,
"GreasePencil")) {
135 return "Grease Pencil";
137 if (
STREQ(name,
"Emit")) {
147 const char *passname,
158 if (sock ==
nullptr) {
170 if (sock && sock->
type != type) {
176 if (sock ==
nullptr) {
177 if (rres_index >= 0) {
196 const int after_index = (*prev_index)++;
328 if (scene ==
nullptr || view_layer ==
nullptr ||
data ==
nullptr || node->
id != (
ID *)scene) {
333 if (node_view_layer != view_layer) {
340 ntree, node,
"Image", name, -1, type,
true,
data->available_sockets, &
data->prev_index);
348 data->available_sockets,
353 ntree, node, name, name, -1, type,
true,
data->available_sockets, &
data->prev_index);
386 data->available_sockets = available_sockets;
387 data->prev_index = -1;
465 sock_next = sock->
next;
526 const bNode *src_node)
532 while (dest_output_sock !=
nullptr) {
535 src_output_sock = src_output_sock->
next;
536 dest_output_sock = dest_output_sock->
next;
569 result.allocate_invalid();
580 result.wrap_external(cached_image);
620 ntype.
initfunc = file_ns::node_composit_init_image;
622 ntype,
"ImageUser", file_ns::node_composit_free_image, file_ns::node_composit_copy_image);
623 ntype.
updatefunc = file_ns::cmp_node_image_update;
657 node->
id = &scene->
id;
661 sock = sock->next, sock_index++)
664 sock->storage = sockdata;
672 const char **r_disabled_hint)
675 *r_disabled_hint =
RPT_(
"Not a compositor node tree");
685 for (scene = (
Scene *)
G.main->scenes.first; scene; scene = (
Scene *)scene->
id.
next) {
691 if (scene ==
nullptr) {
692 *r_disabled_hint =
RPT_(
693 "The node tree must be the compositing node tree of any scene in the file");
711 const bNode *src_node)
716 while (dest_output_sock !=
nullptr) {
719 src_output_sock = src_output_sock->
next;
720 dest_output_sock = dest_output_sock->
next;
743 row = &
col->row(
true);
747 const char *layer_name;
798 if (!
result.should_compute()) {
814 result.allocate_invalid();
819 if (!this->
context().is_valid_compositing_region()) {
820 result.allocate_invalid();
831 if (this->
context().use_gpu()) {
848 const int2 lower_bound =
int2(compositing_region.
xmin, compositing_region.
ymin);
854 result.bind_as_image(shader,
"output_img");
867 return "compositor_read_input_alpha";
870 switch (pass.
type()) {
872 return "compositor_read_input_float";
876 return "compositor_read_input_float4";
894 const int2 lower_bound =
int2(compositing_region.
xmin, compositing_region.
ymin);
901 result.store_pixel(texel, pass.load_pixel<float4>(texel + lower_bound).w);
906 result.store_pixel_generic_type(texel, pass.load_pixel_generic_type(texel + lower_bound));
933 ntype.
ui_name =
"Render Layers";
938 ntype.
draw_buttons = file_ns::node_composit_buts_viewlayers;
939 ntype.
initfunc_api = file_ns::node_composit_init_rlayers;
940 ntype.
poll = file_ns::node_composit_poll_rlayers;
943 "Render passes in the Viewport compositor are only supported in EEVEE");
947 file_ns::node_composit_free_rlayers,
948 file_ns::node_composit_copy_rlayers);
949 ntype.
updatefunc = file_ns::cmp_node_rlayers_update;
Scene * CTX_data_scene(const bContext *C)
ImBuf * BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock)
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
int BKE_image_sequence_guess_offset(Image *image)
#define CMP_NODE_R_LAYERS
#define BLI_assert_unreachable()
void BLI_linklist_free(LinkNode *list, LinkNodeFreeFP freefunc)
void void void void BLI_linklist_append(LinkNodePair *list_pair, void *ptr) ATTR_NONNULL(1)
int BLI_linklist_index(const LinkNode *list, const void *ptr) ATTR_WARN_UNUSED_RESULT
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
char * STRNCPY(char(&dst)[N], const char *src)
@ FREESTYLE_AS_RENDER_PASS
@ GREASE_PENCIL_AS_SEPARATE_PASS
#define RE_PASSNAME_COMBINED
#define RE_PASSNAME_DIFFUSE_INDIRECT
#define RE_PASSNAME_INDEXMA
#define RE_PASSNAME_SUBSURFACE_DIRECT
#define RE_PASSNAME_NORMAL
#define RE_PASSNAME_TRANSM_DIRECT
#define RE_PASSNAME_VECTOR
#define RE_PASSNAME_TRANSM_COLOR
#define RE_PASSNAME_SUBSURFACE_INDIRECT
#define RE_PASSNAME_GLOSSY_COLOR
#define RE_PASSNAME_SUBSURFACE_COLOR
#define RE_PASSNAME_TRANSM_INDIRECT
#define RE_PASSNAME_GLOSSY_DIRECT
#define RE_PASSNAME_SHADOW
#define RE_PASSNAME_ENVIRONMENT
#define RE_PASSNAME_POSITION
#define RE_PASSNAME_DIFFUSE_COLOR
#define RE_PASSNAME_GLOSSY_INDIRECT
#define RE_PASSNAME_DEPRECATED
#define RE_PASSNAME_FREESTYLE
#define RE_PASSNAME_GREASE_PENCIL
#define RE_PASSNAME_DIFFUSE_DIRECT
#define RE_PASSNAME_INDEXOB
void GPU_shader_bind(GPUShader *shader, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
void GPU_shader_uniform_2iv(GPUShader *sh, const char *name, const int data[2])
#define NOD_REGISTER_NODE(REGISTER_FUNC)
void uiTemplateID(uiLayout *layout, const bContext *C, PointerRNA *ptr, blender::StringRefNull propname, const char *newop, const char *openop, const char *unlinkop, int filter=UI_TEMPLATE_ID_FILTER_ALL, bool live_icon=false, std::optional< blender::StringRef > text=std::nullopt)
@ UI_ITEM_R_SPLIT_EMPTY_NAME
BMesh const char void * data
constexpr const char * data() const
Result get(Context &context, Image *image, const ImageUser *image_user, const char *pass_name)
StaticCacheManager & cache_manager()
virtual void populate_meta_data_for_pass(const Scene *scene, int view_layer_id, const char *pass_name, MetaData &meta_data) const
GPUShader * get_shader(const char *info_name, ResultPrecision precision)
virtual Result get_pass(const Scene *scene, int view_layer, const char *pass_name)=0
virtual rcti get_compositing_region() const =0
virtual void set_info_message(StringRef message) const =0
const DNode & node() const
const bNode & bnode() const
bool should_compute_output(StringRef identifier)
NodeOperation(Context &context, DNode node)
Result & get_result(StringRef identifier)
Context & context() const
static ResultPrecision precision(eGPUTextureFormat format)
void unbind_as_texture() const
static ResultType type(eGPUTextureFormat format)
void bind_as_texture(GPUShader *shader, const char *texture_name) const
bool is_allocated() const
CachedImageContainer cached_images
ImageUser * get_image_user()
void compute_output(StringRef identifier)
const char * get_pass_name(StringRef identifier)
NodeOperation(Context &context, DNode node)
void execute_pass_gpu(const Result &pass, Result &result)
const char * get_shader_name(const Result &pass, const Result &result)
const char * get_pass_name(StringRef identifier)
void execute_pass(const Result &pass, Result &result)
NodeOperation(Context &context, DNode node)
void execute_pass_cpu(const Result &pass, Result &result)
void RE_engine_update_render_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer, update_render_passes_cb_t callback, void *callback_data)
RenderEngineType * RE_engines_find(const char *idname)
RenderEngine * RE_engine_create(RenderEngineType *type)
void RE_engine_free(RenderEngine *engine)
void * MEM_mallocN(size_t len, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
void node_remove_socket(bNodeTree &ntree, bNode &node, bNodeSocket &sock)
void node_register_type(bNodeType &ntype)
void node_set_socket_availability(bNodeTree &ntree, bNodeSocket &sock, bool is_available)
void node_type_socket_templates(bNodeType *ntype, bNodeSocketTemplate *inputs, bNodeSocketTemplate *outputs)
bNodeSocket * node_add_static_socket(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out, int type, int subtype, StringRefNull identifier, StringRefNull name)
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))
void node_type_size_preset(bNodeType &ntype, eNodeSizePreset size)
void compute_dispatch_threads_at_least(GPUShader *shader, int2 threads_range, int2 local_size=int2(16))
void extract_alpha(Context &context, Result &input, Result &output)
void parallel_for(const int2 range, const Function &function)
bool is_socket_available(const bNodeSocket *socket)
static void node_composit_free_image(bNode *node)
static void node_composit_copy_image(bNodeTree *, bNode *dest_node, const bNode *src_node)
static void cmp_node_image_update(bNodeTree *ntree, bNode *node)
static NodeOperation * get_compositor_operation(Context &context, DNode node)
static void node_composit_init_image(bNodeTree *ntree, bNode *node)
static void cmp_node_rlayers_update(bNodeTree *ntree, bNode *node)
static bool node_composit_poll_rlayers(const blender::bke::bNodeType *, const bNodeTree *ntree, const char **r_disabled_hint)
static void node_composit_free_rlayers(bNode *node)
static NodeOperation * get_compositor_operation(Context &context, DNode node)
static void node_composit_buts_viewlayers(uiLayout *layout, bContext *C, PointerRNA *ptr)
static void node_composit_copy_rlayers(bNodeTree *, bNode *dest_node, const bNode *src_node)
static void node_composit_init_rlayers(const bContext *C, PointerRNA *ptr)
VecBase< int32_t, 2 > int2
static void cmp_node_image_create_outputs(bNodeTree *ntree, bNode *node, LinkNodePair *available_sockets)
static void register_node_type_cmp_rlayers()
static eNodeSocketDatatype socket_type_from_pass(const RenderPass *pass)
static blender::bke::bNodeSocketTemplate cmp_node_rlayers_out[]
static const char * cmp_node_new_pass_name(const char *name)
void node_cmp_rlayers_register_pass(bNodeTree *ntree, bNode *node, Scene *scene, ViewLayer *view_layer, const char *name, eNodeSocketDatatype type)
static void cmp_node_rlayer_create_outputs(bNodeTree *ntree, bNode *node, LinkNodePair *available_sockets)
static void register_node_type_cmp_image()
static void cmp_node_image_add_pass_output(bNodeTree *ntree, bNode *node, const char *name, const char *passname, int rres_index, eNodeSocketDatatype type, int, LinkNodePair *available_sockets, int *prev_index)
void node_cmp_rlayers_outputs(bNodeTree *ntree, bNode *node)
static void cmp_node_image_verify_outputs(bNodeTree *ntree, bNode *node, bool rlayer)
#define NUM_LEGACY_SOCKETS
const char * node_cmp_rlayers_sock_to_pass(int sock_index)
static void cmp_node_rlayer_create_outputs_cb(void *userdata, Scene *scene, ViewLayer *view_layer, const char *name, int, const char *, eNodeSocketDatatype type)
void cmp_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
void cmp_node_update_default(bNodeTree *, bNode *node)
bNodeSocket * node_add_socket_from_template(bNodeTree *ntree, bNode *node, bke::bNodeSocketTemplate *stemp, eNodeSocketInOut in_out)
void node_image_label(const bNodeTree *, const bNode *node, char *label, int label_maxncpy)
bool RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **r_identifier)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
LinkNodePair * available_sockets
void(* update_render_passes)(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer)
struct bNodeTree * nodetree
struct FreestyleConfig freestyle_config
struct bNodeSocket * next
bNodeRuntimeHandle * runtime
Compact definition of a node socket.
std::string ui_description
NodeGetCompositorOperationFunction get_compositor_operation
void(* initfunc)(bNodeTree *ntree, bNode *node)
void(* labelfunc)(const bNodeTree *ntree, const bNode *node, char *label, int label_maxncpy)
const char * compositor_unsupported_message
const char * enum_name_legacy
void(* draw_buttons)(uiLayout *, bContext *C, PointerRNA *ptr)
bool(* poll)(const bNodeType *ntype, const bNodeTree *nodetree, const char **r_disabled_hint)
void(* updatefunc)(bNodeTree *ntree, bNode *node)
void(* initfunc_api)(const bContext *C, PointerRNA *ptr)
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, wmOperatorCallContext context, eUI_Item_Flag flag)
uiLayout & column(bool align)
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)