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/nodes/geometry/node_geometry_util.cc')
-rw-r--r--source/blender/nodes/geometry/node_geometry_util.cc63
1 files changed, 63 insertions, 0 deletions
diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc
index 41bdb1cfff0..bcebaa6a37b 100644
--- a/source/blender/nodes/geometry/node_geometry_util.cc
+++ b/source/blender/nodes/geometry/node_geometry_util.cc
@@ -17,6 +17,69 @@
#include "node_geometry_util.hh"
#include "node_util.h"
+namespace blender::nodes {
+
+void update_attribute_input_socket_availabilities(bNode &node,
+ const StringRef name,
+ const GeometryNodeAttributeInputMode mode)
+{
+ const GeometryNodeAttributeInputMode mode_ = (GeometryNodeAttributeInputMode)mode;
+ LISTBASE_FOREACH (bNodeSocket *, socket, &node.inputs) {
+ if (name == socket->name) {
+ const bool is_available =
+ ((socket->type == SOCK_STRING && mode_ == GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE) ||
+ (socket->type == SOCK_FLOAT && mode_ == GEO_NODE_ATTRIBUTE_INPUT_FLOAT) ||
+ (socket->type == SOCK_VECTOR && mode_ == GEO_NODE_ATTRIBUTE_INPUT_VECTOR) ||
+ (socket->type == SOCK_RGBA && mode_ == GEO_NODE_ATTRIBUTE_INPUT_COLOR));
+ nodeSetSocketAvailability(socket, is_available);
+ }
+ }
+}
+
+static int attribute_data_type_complexity(const CustomDataType data_type)
+{
+ switch (data_type) {
+ case CD_PROP_BOOL:
+ return 0;
+ case CD_PROP_INT32:
+ return 1;
+ case CD_PROP_FLOAT:
+ return 2;
+ case CD_PROP_FLOAT3:
+ return 4;
+ case CD_PROP_COLOR:
+ return 5;
+#if 0 /* Attribute types are not supported yet. */
+ case CD_MLOOPCOL:
+ return 3;
+ case CD_PROP_STRING:
+ return 6;
+#endif
+ default:
+ /* Only accept "generic" custom data types used by the attribute system. */
+ BLI_assert(false);
+ return 0;
+ }
+}
+
+CustomDataType attribute_domain_highest_complexity(Span<CustomDataType> data_types)
+{
+ int highest_complexity = INT_MIN;
+ CustomDataType most_complex_type = CD_PROP_COLOR;
+
+ for (const CustomDataType data_type : data_types) {
+ const int complexity = attribute_data_type_complexity(data_type);
+ if (complexity > highest_complexity) {
+ highest_complexity = complexity;
+ most_complex_type = data_type;
+ }
+ }
+
+ return most_complex_type;
+}
+
+} // namespace blender::nodes
+
bool geo_node_poll_default(bNodeType *UNUSED(ntype), bNodeTree *ntree)
{
return STREQ(ntree->idname, "GeometryNodeTree");