20using namespace nodes::derived_node_tree_types;
48 for (
const bNode *node : tree_context.
btree().nodes_by_type(
"CompositorNodeViewer")) {
50 return DNode(&tree_context, node);
60 for (
const bNode *node : tree_context.
btree().nodes_by_type(
"CompositorNodeOutputFile")) {
61 if (node->is_muted()) {
65 node_stack.
push(
DNode(&tree_context, node));
68 for (
const bNode *node : tree_context.
btree().group_nodes()) {
69 if (node->is_muted()) {
95 for (
const bNode *node : root_context.
btree().nodes_by_type(
"NodeGroupOutput")) {
97 node_stack.
push(
DNode(&root_context, node));
117 if (context.treat_viewer_as_compositor_output() && !node_stack.
is_empty() &&
118 node_stack.
peek()->is_type(
"NodeGroupOutput"))
123 node_stack.
push(viewer_node);
217 if (needed_buffers.
contains(doutput.node()) || pushed_nodes.
contains(doutput.node())) {
223 node_stack.
push(doutput.node());
224 pushed_nodes.
add_new(doutput.node());
238 int number_of_input_buffers = 0;
239 int buffers_needed_by_dependencies = 0;
257 number_of_input_buffers++;
263 const int buffers_needed_by_dependency = needed_buffers.
lookup(doutput.node());
264 buffers_needed_by_dependencies = std::max(buffers_needed_by_dependency,
265 buffers_needed_by_dependencies);
269 int number_of_output_buffers = 0;
278 if (!
output->is_logically_linked()) {
285 number_of_output_buffers++;
292 const int total_buffers = std::max(number_of_input_buffers + number_of_output_buffers,
293 buffers_needed_by_dependencies);
294 needed_buffers.
add(node, total_buffers);
297 return needed_buffers;
364 if (sorted_dependency_nodes.
contains(doutput.node())) {
369 if (schedule.
contains(doutput.node())) {
375 int insertion_position = 0;
376 for (
int i = 0;
i < sorted_dependency_nodes.
size();
i++) {
377 if (needed_buffers.
lookup(doutput.node()) >
378 needed_buffers.
lookup(sorted_dependency_nodes[
i]))
380 insertion_position++;
386 sorted_dependency_nodes.
insert(insertion_position, doutput.node());
390 for (
const DNode &dependency_node : sorted_dependency_nodes) {
391 node_stack.
push(dependency_node);
396 if (sorted_dependency_nodes.
is_empty()) {
399 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
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)
static DNode find_viewer_node_in_context(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)