22using namespace nodes::derived_node_tree_types;
54 for (
const bNode *node : tree_context->
btree().nodes_by_type(
"CompositorNodeViewer")) {
56 node_stack.
push(
DNode(tree_context, node));
63 if (!context.treat_viewer_as_composite_output()) {
68 for (
const bNode *node : tree_context->
btree().nodes_by_type(
"CompositorNodeComposite")) {
70 node_stack.
push(
DNode(tree_context, node));
81 for (
const bNode *node : tree_context.
btree().nodes_by_type(
"CompositorNodeOutputFile")) {
82 if (node->is_muted()) {
86 node_stack.
push(
DNode(&tree_context, node));
89 for (
const bNode *node : tree_context.
btree().group_nodes()) {
90 if (node->is_muted()) {
125 if (!context.treat_viewer_as_composite_output()) {
126 for (
const bNode *node : root_context.
btree().nodes_by_type(
"CompositorNodeComposite")) {
128 node_stack.
push(
DNode(&root_context, node));
143 if (viewer_was_added) {
149 if (active_context.
is_root()) {
247 if (needed_buffers.
contains(doutput.node()) || pushed_nodes.
contains(doutput.node())) {
253 node_stack.
push(doutput.node());
254 pushed_nodes.
add_new(doutput.node());
268 int number_of_input_buffers = 0;
269 int buffers_needed_by_dependencies = 0;
287 number_of_input_buffers++;
293 const int buffers_needed_by_dependency = needed_buffers.
lookup(doutput.node());
294 buffers_needed_by_dependencies = std::max(buffers_needed_by_dependency,
295 buffers_needed_by_dependencies);
299 int number_of_output_buffers = 0;
308 if (!
output->is_logically_linked()) {
315 number_of_output_buffers++;
322 const int total_buffers = std::max(number_of_input_buffers + number_of_output_buffers,
323 buffers_needed_by_dependencies);
324 needed_buffers.
add(node, total_buffers);
327 return needed_buffers;
394 if (sorted_dependency_nodes.
contains(doutput.node())) {
399 if (schedule.
contains(doutput.node())) {
405 int insertion_position = 0;
406 for (
int i = 0;
i < sorted_dependency_nodes.
size();
i++) {
407 if (needed_buffers.
lookup(doutput.node()) >
408 needed_buffers.
lookup(sorted_dependency_nodes[
i]))
410 insertion_position++;
416 sorted_dependency_nodes.
insert(insertion_position, doutput.node());
420 for (
const DNode &dependency_node : sorted_dependency_nodes) {
421 node_stack.
push(dependency_node);
426 if (sorted_dependency_nodes.
is_empty()) {
429 schedule.
add(node_stack.
pop());
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 * child_context(const bNode &node) const
const DTreeContext * parent_context() const
const bNode * parent_node() const
const bNodeTree & btree() const
static bool add_viewer_nodes_in_context(const Context &context, const DTreeContext *tree_context, Stack< DNode > &node_stack)
bool is_output_linked_to_node_conditioned(DOutputSocket output, FunctionRef< bool(DNode)> condition)
VectorSet< DNode > Schedule
static void add_output_nodes(const Context &context, const DerivedNodeTree &tree, Stack< DNode > &node_stack)
static bool is_tree_context_muted(const DTreeContext &tree_context)
Schedule compute_schedule(const Context &context, const DerivedNodeTree &tree)
DOutputSocket get_output_linked_to_input(DInputSocket input)
static NeededBuffers compute_number_of_needed_buffers(Stack< DNode > &output_nodes)
Map< DNode, int > NeededBuffers
bool is_pixel_node(DNode node)
bool is_socket_available(const bNodeSocket *socket)
static void add_file_output_nodes(const DTreeContext &tree_context, Stack< DNode > &node_stack)