25using namespace nodes::derived_node_tree_types;
28 : context_(context), schedule_(schedule)
39 node_operations_.
add_new(node, operations);
44 pixel_operations_.add_new(node, operations);
51 if (node_operations_.contains(
output.node())) {
65 pixel_compile_unit_.add_new(node);
69 const bool is_first_node_in_operation = pixel_compile_unit_.size() == 1;
70 if (is_first_node_in_operation) {
71 is_pixel_compile_unit_single_value_ = this->is_pixel_node_single_value(node);
74 if (!is_pixel_compile_unit_single_value_) {
75 pixel_compile_unit_domain_ = this->compute_pixel_node_domain(node);
82 return pixel_compile_unit_;
87 return is_pixel_compile_unit_single_value_;
92 pixel_compile_unit_.
clear();
93 pixel_compile_unit_domain_.reset();
99 if (pixel_compile_unit_.is_empty()) {
112 if (is_pixel_compile_unit_single_value_ != this->is_pixel_node_single_value(node)) {
119 if (!is_pixel_compile_unit_single_value_) {
120 if (pixel_compile_unit_domain_.value() != this->compute_pixel_node_domain(node)) {
134 int outputs_count = 0;
143 const bool is_preview_output = doutput == preview_output;
148 doutput, [&](
DNode node) {
149 return schedule_.contains(node) && !pixel_compile_unit_.contains(node);
152 if (is_operation_output || is_preview_output) {
157 return outputs_count;
160bool CompileState::is_pixel_node_single_value(
DNode node)
163 for (
int i = 0;
i < node->input_sockets().
size();
i++) {
172 if (origin->is_input()) {
186 const DOutputSocket
output = DOutputSocket(origin);
190 if (pixel_compile_unit_.contains(
output.node())) {
191 if (is_pixel_compile_unit_single_value_) {
198 if (!
result.is_single_value()) {
206Domain CompileState::compute_pixel_node_domain(
DNode node)
211 int current_domain_priority = std::numeric_limits<int>::max();
215 for (
int i = 0;
i < node->input_sockets().
size();
i++) {
216 const DInputSocket
input{node.context(), node->input_sockets()[
i]};
226 if (origin->is_input()) {
239 if (input_descriptor.domain_priority < current_domain_priority) {
240 node_domain = Domain(context_.get_compositing_region_size());
241 current_domain_priority = input_descriptor.domain_priority;
247 const DOutputSocket
output = DOutputSocket(origin);
251 if (pixel_compile_unit_.contains(
output.node())) {
254 if (input_descriptor.domain_priority < current_domain_priority) {
255 node_domain = pixel_compile_unit_domain_.value();
256 current_domain_priority = input_descriptor.domain_priority;
264 if (
result.is_single_value() || input_descriptor.expects_single_value) {
275 if (input_descriptor.domain_priority < current_domain_priority) {
276 node_domain =
result.domain();
277 current_domain_priority = input_descriptor.domain_priority;
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void add_new(const Key &key)
PixelCompileUnit & get_pixel_compile_unit()
CompileState(const Context &context, const Schedule &schedule)
void reset_pixel_compile_unit()
Result & get_result_from_output_socket(DOutputSocket output)
void map_node_to_node_operation(DNode node, NodeOperation *operation)
void add_node_to_pixel_compile_unit(DNode node)
bool should_compile_pixel_compile_unit(DNode node)
bool is_pixel_compile_unit_single_value()
const Schedule & get_schedule()
void map_node_to_pixel_operation(DNode node, PixelOperation *operation)
int compute_pixel_node_operation_outputs_count(DNode node)
Result & get_result(StringRef identifier)
StringRef get_output_identifier_from_output_socket(DOutputSocket output_socket)
bool is_output_linked_to_node_conditioned(DOutputSocket output, FunctionRef< bool(DNode)> condition)
DSocket get_input_origin_socket(DInputSocket input)
VectorSet< DNode > Schedule
VectorSet< DNode > PixelCompileUnit
DOutputSocket find_preview_output_socket(const DNode &node)
InputDescriptor input_descriptor_from_input_socket(const bNodeSocket *socket)
bool is_pixel_node(DNode node)
bool is_socket_available(const bNodeSocket *socket)