21using namespace nodes::derived_node_tree_types;
28 for (
const bNode *node : context->btree().nodes_by_type(
"CompositorNodeViewer")) {
42 for (
const bNode *node : context->btree().nodes_by_type(
"CompositorNodeComposite")) {
59 const DerivedNodeTree &
tree,
65 if (context.use_file_output()) {
66 for (
const bNode *node : root_context.
btree().nodes_by_type(
"CompositorNodeOutputFile")) {
68 node_stack.
push(
DNode(&root_context, node));
75 if (context.use_composite_output()) {
76 for (
const bNode *node : root_context.
btree().nodes_by_type(
"CompositorNodeComposite")) {
78 node_stack.
push(
DNode(&root_context, node));
88 if (viewer_was_added) {
177 for (
const bNodeSocket *input : node->input_sockets()) {
209 int number_of_input_buffers = 0;
210 int buffers_needed_by_dependencies = 0;
211 for (
const bNodeSocket *input : node->input_sockets()) {
224 number_of_input_buffers++;
230 const int buffers_needed_by_dependency = needed_buffers.
lookup(doutput.
node());
231 if (buffers_needed_by_dependency > buffers_needed_by_dependencies) {
232 buffers_needed_by_dependencies = buffers_needed_by_dependency;
237 int number_of_output_buffers = 0;
238 for (
const bNodeSocket *output : node->output_sockets()) {
242 if (!output->is_logically_linked()) {
249 number_of_output_buffers++;
256 const int total_buffers = std::max(number_of_input_buffers + number_of_output_buffers,
257 buffers_needed_by_dependencies);
258 needed_buffers.
add(node, total_buffers);
261 return needed_buffers;
312 for (
const bNodeSocket *input : node->input_sockets()) {
335 int insertion_position = 0;
336 for (
int i = 0; i < sorted_dependency_nodes.
size(); i++) {
338 needed_buffers.
lookup(sorted_dependency_nodes[i]))
340 insertion_position++;
346 sorted_dependency_nodes.
insert(insertion_position, doutput.
node());
350 for (
const DNode &dependency_node : sorted_dependency_nodes) {
351 node_stack.
push(dependency_node);
356 if (sorted_dependency_nodes.
is_empty()) {
359 schedule.
add(node_stack.
pop());
#define CMP_NODE_COMPOSITE
bool add(const Key &key, const Value &value)
const Value & lookup(const Key &key) const
bool contains(const Key &key) const
bool contains(const Key &key) const
void add_new(const Key &key)
void push(const T &value)
bool contains(const Key &key) const
bool contains(const T &value) const
void insert(const int64_t insert_index, const T &value)
const DTreeContext * context() const
const bNodeTree & btree() const
bool is_pixel_node(DNode node)
bool is_output_linked_to_node_conditioned(DOutputSocket output, FunctionRef< bool(DNode)> condition)
DOutputSocket get_output_linked_to_input(DInputSocket input)
static void add_output_nodes(const Context &context, const DerivedNodeTree &tree, Stack< DNode > &node_stack)
static bool add_viewer_nodes_in_context(const DTreeContext *context, Stack< DNode > &node_stack)
Schedule compute_schedule(const Context &context, const DerivedNodeTree &tree)
static NeededBuffers compute_number_of_needed_buffers(Stack< DNode > &output_nodes)