Blender V5.0
NOD_compositor_file_output.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include "MEM_guardedalloc.h"
8
9#include "BLI_math_base.hh"
10#include "BLI_string.h"
11#include "BLI_string_ref.hh"
12#include "BLI_utildefines.h"
13
14#include "DNA_node_types.h"
15
16#include "BKE_image_format.hh"
17
18#include "NOD_socket_items.hh"
19
20namespace blender::nodes {
21
25 static constexpr StringRefNull node_idname = "CompositorNodeOutputFile";
26 static constexpr bool has_type = true;
27 static constexpr bool has_name = true;
28 static constexpr bool has_name_validation = true;
29 static constexpr bool has_vector_dimensions = true;
30 static constexpr bool can_have_empty_name = true;
31 static constexpr char unique_name_separator = '_';
33 static constexpr StringRefNull add_item = "NODE_OT_file_output_item_add";
34 static constexpr StringRefNull remove_item = "NODE_OT_file_output_item_remove";
35 static constexpr StringRefNull move_item = "NODE_OT_file_output_item_move";
36 };
37 struct ui_idnames {
38 static constexpr StringRefNull list = "DATA_UL_file_output_items";
39 };
40 struct rna_names {
41 static constexpr StringRefNull items = "file_output_items";
42 static constexpr StringRefNull active_index = "active_item_index";
43 };
44
46 bNode &node)
47 {
48 auto *storage = static_cast<NodeCompositorFileOutput *>(node.storage);
49 return {&storage->items, &storage->items_count, &storage->active_item_index};
50 }
51
52 static void copy_item(const NodeCompositorFileOutputItem &source,
54 {
55 destination = source;
56 destination.name = BLI_strdup_null(destination.name);
57 BKE_image_format_copy(&destination.format, &source.format);
58 }
59
61 {
62 MEM_SAFE_FREE(item->name);
64 }
65
66 static void blend_write_item(BlendWriter *writer, const ItemT &item);
67 static void blend_read_data_item(BlendDataReader *reader, ItemT &item);
68
73
75 {
76 return &item.name;
77 }
78
79 static bool supports_socket_type(const eNodeSocketDatatype socket_type, const int /*ntree_type*/)
80 {
81 return ELEM(socket_type, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA);
82 }
83
85 const int items_count)
86 {
87 if (items_count == 0) {
88 return 0;
89 }
90 int max_identifier = items[0].identifier;
91 for (int i = 0; i < items_count; i++) {
92 max_identifier = math::max(items[i].identifier, max_identifier);
93 }
94 return max_identifier + 1;
95 }
96
99 const eNodeSocketDatatype socket_type,
100 const char *name,
101 std::optional<int> dimensions = std::nullopt)
102 {
103 auto *storage = static_cast<NodeCompositorFileOutput *>(node.storage);
105 storage->items_count);
106
107 item.socket_type = socket_type;
108 item.vector_socket_dimensions = dimensions.value_or(3);
110
111 item.save_as_render = true;
114 }
115
116 static std::string validate_name(const StringRef name);
117
119 {
120 return "Item_" + std::to_string(item.identifier);
121 }
122};
123
124} // namespace blender::nodes
void BKE_image_format_free(ImageFormatData *imf)
void BKE_image_format_update_color_space_for_type(ImageFormatData *format)
void BKE_image_format_init(ImageFormatData *imf)
void BKE_image_format_copy(ImageFormatData *imf_dst, const ImageFormatData *imf_src)
char * BLI_strdup_null(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_MALLOC
Definition string.cc:46
#define ELEM(...)
eNodeSocketDatatype
@ SOCK_VECTOR
@ SOCK_FLOAT
@ SOCK_RGBA
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
T max(const T &a, const T &b)
void set_item_name_and_make_unique(bNode &node, typename Accessor::ItemT &item, const char *value)
const char * name
void * storage
static std::string validate_name(const StringRef name)
static int find_available_identifier(const NodeCompositorFileOutputItem *items, const int items_count)
static char ** get_name(NodeCompositorFileOutputItem &item)
static socket_items::SocketItemsRef< NodeCompositorFileOutputItem > get_items_from_node(bNode &node)
static void copy_item(const NodeCompositorFileOutputItem &source, NodeCompositorFileOutputItem &destination)
static void destruct_item(NodeCompositorFileOutputItem *item)
static std::string socket_identifier_for_item(const NodeCompositorFileOutputItem &item)
static bool supports_socket_type(const eNodeSocketDatatype socket_type, const int)
static void blend_write_item(BlendWriter *writer, const ItemT &item)
static void blend_read_data_item(BlendDataReader *reader, ItemT &item)
static eNodeSocketDatatype get_socket_type(const NodeCompositorFileOutputItem &item)
static void init_with_socket_type_and_name(bNode &node, NodeCompositorFileOutputItem &item, const eNodeSocketDatatype socket_type, const char *name, std::optional< int > dimensions=std::nullopt)
i
Definition text_draw.cc:230