Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/compositor/intern/COM_NodeOperation.cc')
-rw-r--r--source/blender/compositor/intern/COM_NodeOperation.cc47
1 files changed, 47 insertions, 0 deletions
diff --git a/source/blender/compositor/intern/COM_NodeOperation.cc b/source/blender/compositor/intern/COM_NodeOperation.cc
index 1b87cdf72fb..3bbd1b22d60 100644
--- a/source/blender/compositor/intern/COM_NodeOperation.cc
+++ b/source/blender/compositor/intern/COM_NodeOperation.cc
@@ -41,6 +41,53 @@ NodeOperation::NodeOperation()
this->m_btree = nullptr;
}
+/**
+ * Generate a hash that identifies the operation result in the current execution.
+ * Requires `hash_output_params` to be implemented, otherwise `std::nullopt` is returned.
+ * If the operation parameters or its linked inputs change, the hash must be re-generated.
+ */
+std::optional<NodeOperationHash> NodeOperation::generate_hash()
+{
+ params_hash_ = get_default_hash_2(m_width, m_height);
+
+ /* Hash subclasses params. */
+ is_hash_output_params_implemented_ = true;
+ hash_output_params();
+ if (!is_hash_output_params_implemented_) {
+ return std::nullopt;
+ }
+
+ hash_param(getOutputSocket()->getDataType());
+ NodeOperationHash hash;
+ hash.params_hash_ = params_hash_;
+
+ hash.parents_hash_ = 0;
+ for (NodeOperationInput &socket : m_inputs) {
+ if (!socket.isConnected()) {
+ continue;
+ }
+
+ NodeOperation &input = socket.getLink()->getOperation();
+ const bool is_constant = input.get_flags().is_constant_operation;
+ combine_hashes(hash.parents_hash_, get_default_hash(is_constant));
+ if (is_constant) {
+ const float *elem = ((ConstantOperation *)&input)->get_constant_elem();
+ const int num_channels = COM_data_type_num_channels(socket.getDataType());
+ for (const int i : IndexRange(num_channels)) {
+ combine_hashes(hash.parents_hash_, get_default_hash(elem[i]));
+ }
+ }
+ else {
+ combine_hashes(hash.parents_hash_, get_default_hash(input.get_id()));
+ }
+ }
+
+ hash.type_hash_ = typeid(*this).hash_code();
+ hash.operation_ = this;
+
+ return hash;
+}
+
NodeOperationOutput *NodeOperation::getOutputSocket(unsigned int index)
{
return &m_outputs[index];