Geometry Nodes: store domain and data type in attribute hints

The information is not exposed in the attribute search yet.
This commit is contained in:
2021-03-17 11:15:39 +01:00
parent e91dd645a9
commit e00a47ffd6
4 changed files with 42 additions and 10 deletions

View File

@@ -20,13 +20,17 @@
#include "BLI_hash.hh"
#include "BLI_map.hh"
#include "BLI_multi_value_map.hh"
#include "BLI_session_uuid.h"
#include "BLI_set.hh"
#include "DNA_ID.h"
#include "DNA_customdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_session_uuid_types.h"
#include "BKE_attribute.h"
struct ModifierData;
struct Object;
struct bNode;
@@ -77,9 +81,26 @@ struct NodeWarning {
std::string message;
};
struct AvailableAttributeInfo {
AttributeDomain domain;
CustomDataType data_type;
uint64_t hash() const
{
uint64_t domain_hash = (uint64_t)domain;
uint64_t data_type_hash = (uint64_t)data_type;
return (domain_hash * 33) ^ (data_type_hash * 89);
}
friend bool operator==(const AvailableAttributeInfo &a, const AvailableAttributeInfo &b)
{
return a.domain == b.domain && a.data_type == b.data_type;
}
};
struct NodeUIStorage {
blender::Vector<NodeWarning> warnings;
blender::Set<std::string> attribute_name_hints;
blender::MultiValueMap<std::string, AvailableAttributeInfo> attribute_hints;
};
struct NodeTreeUIStorage {
@@ -103,4 +124,6 @@ void BKE_nodetree_error_message_add(bNodeTree &ntree,
void BKE_nodetree_attribute_hint_add(bNodeTree &ntree,
const NodeTreeEvaluationContext &context,
const bNode &node,
const blender::StringRef attribute_name);
const blender::StringRef attribute_name,
const AttributeDomain domain,
const CustomDataType data_type);

View File

@@ -158,8 +158,11 @@ void BKE_nodetree_error_message_add(bNodeTree &ntree,
void BKE_nodetree_attribute_hint_add(bNodeTree &ntree,
const NodeTreeEvaluationContext &context,
const bNode &node,
const StringRef attribute_name)
const StringRef attribute_name,
const AttributeDomain domain,
const CustomDataType data_type)
{
NodeUIStorage &node_ui_storage = node_ui_storage_ensure(ntree, context, node);
node_ui_storage.attribute_name_hints.add_as(attribute_name);
node_ui_storage.attribute_hints.add_as(attribute_name,
AvailableAttributeInfo{domain, data_type});
}

View File

@@ -37,6 +37,7 @@
using blender::IndexRange;
using blender::Map;
using blender::MultiValueMap;
using blender::Set;
using blender::StringRef;
@@ -62,9 +63,10 @@ static void attribute_search_update_fn(
return;
}
const Set<std::string> &attribute_name_hints = ui_storage->attribute_name_hints;
const MultiValueMap<std::string, AvailableAttributeInfo> &attribute_hints =
ui_storage->attribute_hints;
if (str[0] != '\0' && !attribute_name_hints.contains_as(StringRef(str))) {
if (str[0] != '\0' && attribute_hints.lookup_as(StringRef(str)).is_empty()) {
/* Any string may be valid, so add the current search string with the hints. */
UI_search_item_add(items, str, (void *)str, ICON_ADD, 0, 0);
}
@@ -80,7 +82,7 @@ static void attribute_search_update_fn(
const char *string = is_first ? "" : str;
StringSearch *search = BLI_string_search_new();
for (const std::string &attribute_name : attribute_name_hints) {
for (const std::string &attribute_name : attribute_hints.keys()) {
BLI_string_search_add(search, attribute_name.c_str(), (void *)&attribute_name);
}

View File

@@ -456,9 +456,13 @@ class GeometryNodesEvaluator {
for (const GeometryComponent *component : components) {
component->attribute_foreach(
[&](StringRefNull attribute_name, const AttributeMetaData &UNUSED(meta_data)) {
BKE_nodetree_attribute_hint_add(
*btree_original, context, *node->bnode(), attribute_name);
[&](StringRefNull attribute_name, const AttributeMetaData &meta_data) {
BKE_nodetree_attribute_hint_add(*btree_original,
context,
*node->bnode(),
attribute_name,
meta_data.domain,
meta_data.data_type);
return true;
});
}