If Node
An If Node is an example of a flow control node. It only performs its computation if a special input on the node is true. Otherwise it passes the inputs without modification to its outputs. Note that an if node is implementated as a group node here.
If node base class header.
class COMPUTES_EXPORT IfGroupNodeCompute: public GroupNodeCompute {
public:
COMPONENT_ID(Compute, IfGroupNodeCompute);
IfGroupNodeCompute(Entity* entity, ComponentDID did = kDID());
virtual ~IfGroupNodeCompute();
protected:
// Our state.
virtual bool update_state();
};
If node base class implementation.
IfGroupNodeCompute::IfGroupNodeCompute(Entity* entity, ComponentDID did):
GroupNodeCompute(entity, did) {
}
IfGroupNodeCompute::~IfGroupNodeCompute() {
}
bool IfGroupNodeCompute::update_state() {
internal();
Compute::update_state();
// Get the value of the condition.
QJsonObject in_obj = _inputs->get_main_input_object();
QJsonValue condition_value = in_obj.value("value");
bool condition = JSONUtils::convert_to_bool(condition_value);
// If the "condition" input is false then we copy the value from the main input to the main output.
// We set the value to zero for all other outputs.
if (!condition) {
Entity* outputs = get_entity(Path( { ".", kOutputsFolderName }));
for (auto &iter : outputs->get_children()) {
Entity* output_entity = iter.second;
const std::string& output_name = output_entity->get_name();
Entity* output_node = our_entity()->get_child(output_name);
Dep<OutputNodeCompute> output_node_compute = get_dep<OutputNodeCompute>(output_node);
if (output_name == kMainOutputName) {
// We copy the value from in to out.
set_main_output(_inputs->get_main_input_object());
} else {
// We set the value to zero for all other outputs.
set_output(output_name, 0);
}
}
} else {
// Otherwise we run the normal group compute.
return GroupNodeCompute::update_state();
}
return true;
}