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/blenkernel/intern/node.cc')
-rw-r--r--source/blender/blenkernel/intern/node.cc30
1 files changed, 27 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 0e23992432f..4522dca9519 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5138,8 +5138,23 @@ static EnumInputInferencingInfo get_input_enum_socket_inferencing_info(
struct EnumState {
std::shared_ptr<EnumItems> items;
int group_output_index = -1;
+ bool targets_are_invalid = false;
};
+static bool enum_states_are_compatible(const EnumState &a, const EnumState &b)
+{
+ if (a.items && b.items) {
+ return a.items->items() == b.items->items();
+ }
+ if (a.group_output_index == -1 || b.group_output_index == -1) {
+ return true;
+ }
+ if (a.group_output_index == b.group_output_index) {
+ return true;
+ }
+ return false;
+}
+
static bool update_enum_inferencing(const NodeTreeRef &tree)
{
using namespace blender::nodes;
@@ -5169,12 +5184,19 @@ static bool update_enum_inferencing(const NodeTreeRef &tree)
if (socket->typeinfo()->type != SOCK_ENUM) {
continue;
}
- /* TODO: Handle case when connected to incompatible enums. */
EnumState enum_state;
for (const InputSocketRef *target_socket : socket->directly_linked_sockets()) {
if (target_socket->is_available()) {
- enum_state = state_by_socket.lookup_default(target_socket, {});
- break;
+ EnumState new_state = state_by_socket.lookup_default(target_socket, {});
+ if (enum_states_are_compatible(enum_state, new_state)) {
+ enum_state = new_state;
+ enum_state.targets_are_invalid = false;
+ }
+ else {
+ enum_state = {};
+ enum_state.targets_are_invalid = true;
+ break;
+ }
}
}
state_by_socket.add_new(socket, enum_state);
@@ -5202,6 +5224,7 @@ static bool update_enum_inferencing(const NodeTreeRef &tree)
BLI_assert(inference_index >= 0);
const OutputSocketRef &output_socket = node->output(inference_index);
input_state = state_by_socket.lookup(&output_socket);
+ input_state.targets_are_invalid = false;
}
state_by_socket.add_new(socket, input_state);
}
@@ -5217,6 +5240,7 @@ static bool update_enum_inferencing(const NodeTreeRef &tree)
else {
socket_value->items = nullptr;
}
+ socket_value->targets_are_invalid = state.targets_are_invalid;
}
EnumInferencingInterface *new_inferencing_interface = new EnumInferencingInterface();