Input
The Input base class calculates the current input value for a given input to a node. Often nodes have many inputs and many outputs. Parameters on a node are considered to be inputs to a node.
Input base class header.
class COMPUTES_EXPORT InputCompute: public Compute {
public:
COMPONENT_ID(Compute, InputCompute);
InputCompute(Entity* entity);
virtual ~InputCompute();
// We override to stop creating the inputs and outputs namespace.
virtual void create_inputs_outputs(const EntityConfig& config = EntityConfig()) {}
// The unconnected value.
void set_unconnected_value(const QJsonValue& value);
const QJsonValue& get_unconnected_value() const;
// Exposure.
void set_exposed(bool exposed);
bool is_exposed() const;
// Our dynamic output compute dependency.
bool can_link_output_compute(const Dep<OutputCompute>& output) const;
bool link_output_compute(Dep<OutputCompute>& output);
void unlink_output_compute();
const Dep<OutputCompute>& get_output_compute() const;
bool is_connected() const;
// Serialization.
virtual void save(SimpleSaver& saver) const;
virtual void load(SimpleLoader& loader);
protected:
// Our state.
virtual bool update_state();
private:
// Our dynamic deps.
Dep<OutputCompute> _upstream;
// Our data.
QJsonValue _unconnected_value;
// Whether we are exposed in the node graph as a plug on a node.
bool _exposed;
};
Input base class implementation.
InputCompute::InputCompute(Entity* entity)
: Compute(entity, kDID()),
_upstream(this),
_exposed(true) {
get_dep_loader()->register_dynamic_dep(_upstream);
}
InputCompute::~InputCompute() {
}
bool InputCompute::update_state() {
internal();
Compute::update_state();
// This will hold our final output value.
QJsonValue output;
// Start with our unconnected value.
output = _unconnected_value;
// Merge in information from the upstream output.
if (_upstream) {
QJsonValue out = _upstream->get_main_output();
output = JSONUtils::deep_merge(output, out);
}
// Cache the result in our outputs.
set_main_output(output);
return true;
}
void InputCompute::set_unconnected_value(const QJsonValue& value) {
external();
_unconnected_value = value;
}
const QJsonValue& InputCompute::get_unconnected_value() const {
external();
return _unconnected_value;
}
void InputCompute::set_exposed(bool exposed) {
external();
_exposed = exposed;
}
bool InputCompute::is_exposed() const {
external();
return _exposed;
}
bool InputCompute::can_link_output_compute(const Dep<OutputCompute>& output) const {
external();
assert(output);
if (dep_creates_cycle(output)) {
return false;
}
return true;
}
bool InputCompute::link_output_compute(Dep<OutputCompute>& output) {
external();
assert(output);
// Make sure to be disconnected before connecting.
if (!_upstream && output) {
unlink_output_compute();
}
// Now connect.
_upstream = output;
if (_upstream) {
return true;
}
// Linking was unsuccessful.
return false;
}
const Dep<OutputCompute>& InputCompute::get_output_compute() const {
external();
return _upstream;
}
bool InputCompute::is_connected() const {
if (_upstream) {
return true;
}
return false;
}
void InputCompute::unlink_output_compute() {
external();
if (_upstream) {
_upstream.reset();
}
}
void InputCompute::save(SimpleSaver& saver) const {
external();
Compute::save(saver);
// Serialize the exposed value.
saver.save(_exposed);
// Serialize the value.
QByteArray data = JSONUtils::serialize_json_value(_unconnected_value);
int num_bytes = data.size();
saver.save(num_bytes);
saver.save_raw(data.data(), num_bytes);
}
void InputCompute::load(SimpleLoader& loader) {
external();
Compute::load(loader);
// Load the exposed value.
loader.load(_exposed);
// Load the num bytes of the param value.
int num_bytes;
loader.load(num_bytes);
// Load the param value.
QByteArray data;
data.resize(num_bytes);
loader.load_raw(data.data(), num_bytes);
_unconnected_value = JSONUtils::deserialize_json_value(data);
}