diff options
Diffstat (limited to 'source/blender/nodes/NOD_geometry_exec.hh')
-rw-r--r-- | source/blender/nodes/NOD_geometry_exec.hh | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh new file mode 100644 index 00000000000..2b95f76d06b --- /dev/null +++ b/source/blender/nodes/NOD_geometry_exec.hh @@ -0,0 +1,155 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "FN_generic_value_map.hh" + +#include "BKE_attribute_access.hh" +#include "BKE_geometry_set.hh" +#include "BKE_persistent_data_handle.hh" + +#include "DNA_node_types.h" + +namespace blender::nodes { + +using bke::Float3ReadAttribute; +using bke::Float3WriteAttribute; +using bke::FloatReadAttribute; +using bke::FloatWriteAttribute; +using bke::PersistentDataHandleMap; +using bke::PersistentObjectHandle; +using bke::ReadAttribute; +using bke::ReadAttributePtr; +using bke::WriteAttribute; +using bke::WriteAttributePtr; +using fn::CPPType; +using fn::GMutablePointer; +using fn::GValueMap; + +class GeoNodeExecParams { + private: + const bNode &node_; + GValueMap<StringRef> &input_values_; + GValueMap<StringRef> &output_values_; + const PersistentDataHandleMap &handle_map_; + const Object *self_object_; + + public: + GeoNodeExecParams(const bNode &node, + GValueMap<StringRef> &input_values, + GValueMap<StringRef> &output_values, + const PersistentDataHandleMap &handle_map, + const Object *self_object) + : node_(node), + input_values_(input_values), + output_values_(output_values), + handle_map_(handle_map), + self_object_(self_object) + { + } + + /** + * Get the input value for the input socket with the given identifier. + * + * The node calling becomes responsible for destructing the value before it is done + * executing. This method can only be called once for each identifier. + */ + GMutablePointer extract_input(StringRef identifier) + { +#ifdef DEBUG + this->check_extract_input(identifier); +#endif + return input_values_.extract(identifier); + } + + /** + * Get the input value for the input socket with the given identifier. + * + * This method can only be called once for each identifier. + */ + template<typename T> T extract_input(StringRef identifier) + { +#ifdef DEBUG + this->check_extract_input(identifier, &CPPType::get<T>()); +#endif + return input_values_.extract<T>(identifier); + } + + /** + * Get the input value for the input socket with the given identifier. + * + * This makes a copy of the value, which is fine for most types but should be avoided for + * geometry sets. + */ + template<typename T> T get_input(StringRef identifier) const + { +#ifdef DEBUG + this->check_extract_input(identifier, &CPPType::get<T>()); +#endif + return input_values_.lookup<T>(identifier); + } + + /** + * Move-construct a new value based on the given value and store it for the given socket + * identifier. + */ + void set_output_by_move(StringRef identifier, GMutablePointer value) + { +#ifdef DEBUG + BLI_assert(value.type() != nullptr); + BLI_assert(value.get() != nullptr); + this->check_set_output(identifier, *value.type()); +#endif + output_values_.add_new_by_move(identifier, value); + } + + /** + * Store the output value for the given socket identifier. + */ + template<typename T> void set_output(StringRef identifier, T &&value) + { +#ifdef DEBUG + this->check_set_output(identifier, CPPType::get<std::decay_t<T>>()); +#endif + output_values_.add_new(identifier, std::forward<T>(value)); + } + + /** + * Get the node that is currently being executed. + */ + const bNode &node() const + { + return node_; + } + + const PersistentDataHandleMap &handle_map() const + { + return handle_map_; + } + + const Object *self_object() const + { + return self_object_; + } + + private: + /* Utilities for detecting common errors at when using this class. */ + void check_extract_input(StringRef identifier, const CPPType *requested_type = nullptr) const; + void check_set_output(StringRef identifier, const CPPType &value_type) const; +}; + +} // namespace blender::nodes |