Geometry Nodes: handle same socket being linked to input more than once better
Note, this does not allow users to connect the same socket more than once to a multi-input-socket in the UI. However, the situation could still happen when using node muting.
This commit is contained in:
@@ -306,12 +306,7 @@ class GeometryNodesEvaluator {
|
|||||||
|
|
||||||
/* Multi-input sockets contain a vector of inputs. */
|
/* Multi-input sockets contain a vector of inputs. */
|
||||||
if (socket_to_compute->is_multi_input_socket()) {
|
if (socket_to_compute->is_multi_input_socket()) {
|
||||||
Vector<GMutablePointer> values;
|
return this->get_inputs_from_incoming_links(socket_to_compute, from_sockets);
|
||||||
for (const DSocket &from_socket : from_sockets) {
|
|
||||||
GMutablePointer value = get_input_from_incoming_link(socket_to_compute, from_socket);
|
|
||||||
values.append(value);
|
|
||||||
}
|
|
||||||
return values;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (from_sockets.is_empty()) {
|
if (from_sockets.is_empty()) {
|
||||||
@@ -325,6 +320,29 @@ class GeometryNodesEvaluator {
|
|||||||
return {value};
|
return {value};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector<GMutablePointer> get_inputs_from_incoming_links(const DInputSocket socket_to_compute,
|
||||||
|
const Span<DSocket> from_sockets)
|
||||||
|
{
|
||||||
|
Vector<GMutablePointer> values;
|
||||||
|
for (const int i : from_sockets.index_range()) {
|
||||||
|
const DSocket from_socket = from_sockets[i];
|
||||||
|
const int first_occurence = from_sockets.take_front(i).first_index_try(from_socket);
|
||||||
|
if (first_occurence == -1) {
|
||||||
|
values.append(this->get_input_from_incoming_link(socket_to_compute, from_socket));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* If the same from-socket occures more than once, we make a copy of the first value. This
|
||||||
|
* can happen when a node linked to a multi-input-socket is muted. */
|
||||||
|
GMutablePointer value = values[first_occurence];
|
||||||
|
const CPPType *type = value.type();
|
||||||
|
void *copy_buffer = allocator_.allocate(type->size(), type->alignment());
|
||||||
|
type->copy_to_uninitialized(value.get(), copy_buffer);
|
||||||
|
values.append({type, copy_buffer});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
GMutablePointer get_input_from_incoming_link(const DInputSocket socket_to_compute,
|
GMutablePointer get_input_from_incoming_link(const DInputSocket socket_to_compute,
|
||||||
const DSocket from_socket)
|
const DSocket from_socket)
|
||||||
{
|
{
|
||||||
@@ -500,7 +518,7 @@ class GeometryNodesEvaluator {
|
|||||||
/* For all sockets that are linked with the from_socket push the value to their node. */
|
/* For all sockets that are linked with the from_socket push the value to their node. */
|
||||||
Vector<DInputSocket> to_sockets_all;
|
Vector<DInputSocket> to_sockets_all;
|
||||||
from_socket.foreach_target_socket(
|
from_socket.foreach_target_socket(
|
||||||
[&](DInputSocket to_socket) { to_sockets_all.append(to_socket); });
|
[&](DInputSocket to_socket) { to_sockets_all.append_non_duplicates(to_socket); });
|
||||||
|
|
||||||
const CPPType &from_type = *value_to_forward.type();
|
const CPPType &from_type = *value_to_forward.type();
|
||||||
Vector<DInputSocket> to_sockets_same_type;
|
Vector<DInputSocket> to_sockets_same_type;
|
||||||
|
|||||||
Reference in New Issue
Block a user