Fix T98152: Named Attribute node changes data type for non-existant attributes

Skip changing the data type in the node if it is not known.
This commit is contained in:
Jacques Lucke 2022-05-24 11:55:31 +02:00
parent d1340e1bb2
commit f29ff7fb7e
Notes: blender-bot 2023-02-14 09:38:57 +01:00
Referenced by issue #98152, Named Attribute Node Changes Data Type When Calling an Non-Existent Attribute
3 changed files with 7 additions and 6 deletions

View File

@ -40,8 +40,8 @@ static StringRef attribute_domain_string(const AttributeDomain domain)
static bool attribute_search_item_add(uiSearchItems *items, const GeometryAttributeInfo &item)
{
const StringRef data_type_name = attribute_data_type_string(item.data_type);
const StringRef domain_name = attribute_domain_string(item.domain);
const StringRef data_type_name = attribute_data_type_string(*item.data_type);
const StringRef domain_name = attribute_domain_string(*item.domain);
std::string search_item_text = domain_name + " " + UI_MENU_ARROW_SEP + item.name + UI_SEP_CHAR +
data_type_name;

View File

@ -183,9 +183,9 @@ static void attribute_search_exec_fn(bContext *C, void *data_v, void *item_v)
BLI_assert(socket->type == SOCK_STRING);
/* For the attribute input node, also adjust the type and links connected to the output. */
if (node->type == GEO_NODE_INPUT_NAMED_ATTRIBUTE) {
if (node->type == GEO_NODE_INPUT_NAMED_ATTRIBUTE && item->data_type.has_value()) {
NodeGeometryInputNamedAttribute &storage = *(NodeGeometryInputNamedAttribute *)node->storage;
const CustomDataType new_type = data_type_in_attribute_input_node(item->data_type);
const CustomDataType new_type = data_type_in_attribute_input_node(*item->data_type);
if (new_type != storage.data_type) {
storage.data_type = new_type;
/* Make the output socket with the new type on the attribute input node active. */

View File

@ -89,8 +89,9 @@ class GFieldValueLog : public ValueLog {
struct GeometryAttributeInfo {
std::string name;
AttributeDomain domain;
CustomDataType data_type;
/** Can be empty when #name does not actually exist on a geometry yet. */
std::optional<AttributeDomain> domain;
std::optional<CustomDataType> data_type;
};
/** Contains information about a geometry set. In most cases this does not store the entire