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:
authorHans Goudey <h.goudey@me.com>2021-02-12 21:46:17 +0300
committerHans Goudey <h.goudey@me.com>2021-02-12 21:46:17 +0300
commitd7c2c889a688067dab280fc137ad4c3c7ce4cb2b (patch)
treee7fbfd4e400c3e8eb939946a9ef053a7b0abe545 /source/blender/nodes/geometry/node_geometry_util.cc
parentba03f7f0b1d0c40acf997749949a0b0efe19e6d0 (diff)
Geometry Nodes: Allow attribute nodes to use different domains
Currently every attribute node assumes that the attribute exists on the "points" domain, so it generally isn't possible to work with attributes on other domains like edges, polygons, and corners. This commit adds a heuristic to each attribute node to determine the correct domain for the result attribute. In general, it works like this: - If the output attribute already exists, use that domain. - Otherwise, use the highest priority domain of the input attributes. - If none of the inputs are attributes, use the default domain (points). For the implementation I abstracted the check a bit, but in each node has a slightly different situation, so we end up with slightly different `get_result_domain` functions in each node. I think this makes sense, it keeps the code flexible and more easily understandable. Note that we might eventually want to expose a domain drop-down to some of the nodes. But that will be a separate discussion; this commit focuses on making a more useful choice automatically. Differential Revision: https://developer.blender.org/D10389
Diffstat (limited to 'source/blender/nodes/geometry/node_geometry_util.cc')
-rw-r--r--source/blender/nodes/geometry/node_geometry_util.cc46
1 files changed, 46 insertions, 0 deletions
diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc
index 95c25795356..3e30658e056 100644
--- a/source/blender/nodes/geometry/node_geometry_util.cc
+++ b/source/blender/nodes/geometry/node_geometry_util.cc
@@ -338,6 +338,52 @@ CustomDataType attribute_data_type_highest_complexity(Span<CustomDataType> data_
return most_complex_type;
}
+/**
+ * \note Generally the order should mirror the order of the domains
+ * established in each component's ComponentAttributeProviders.
+ */
+static int attribute_domain_priority(const AttributeDomain domain)
+{
+ switch (domain) {
+#if 0
+ case ATTR_DOMAIN_CURVE:
+ return 0;
+#endif
+ case ATTR_DOMAIN_POLYGON:
+ return 1;
+ case ATTR_DOMAIN_EDGE:
+ return 2;
+ case ATTR_DOMAIN_POINT:
+ return 3;
+ case ATTR_DOMAIN_CORNER:
+ return 4;
+ default:
+ /* Domain not supported in nodes yet. */
+ BLI_assert(false);
+ return 0;
+ }
+}
+
+/**
+ * Domains with a higher "information density" have a higher priority, in order
+ * to choose a domain that will not lose data through domain conversion.
+ */
+AttributeDomain attribute_domain_highest_priority(Span<AttributeDomain> domains)
+{
+ int highest_priority = INT_MIN;
+ AttributeDomain highest_priority_domain = ATTR_DOMAIN_CORNER;
+
+ for (const AttributeDomain domain : domains) {
+ const int priority = attribute_domain_priority(domain);
+ if (priority > highest_priority) {
+ highest_priority = priority;
+ highest_priority_domain = domain;
+ }
+ }
+
+ return highest_priority_domain;
+}
+
} // namespace blender::nodes
bool geo_node_poll_default(bNodeType *UNUSED(ntype), bNodeTree *ntree)