WIP: Closures and deferred evaluation for geometry nodes #107842

Draft
Lukas Tönne wants to merge 35 commits from LukasTonne/blender:geometry-nodes-closures into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
1 changed files with 34 additions and 0 deletions
Showing only changes of commit d9c8c25e7e - Show all commits

View File

@ -703,6 +703,17 @@ static void write_node_socket_interface(BlendWriter *writer, bNodeSocket *sock)
write_node_socket_default_value(writer, sock);
}
static void write_node_function_signature(BlendWriter *writer, bNodeFunctionSignature *sig)
{
BLO_write_struct(writer, bNodeFunctionSignature, sig);
LISTBASE_FOREACH (bNodeSocket *, sock, &sig->inputs) {
write_node_socket_interface(writer, sock);
}
LISTBASE_FOREACH (bNodeSocket *, sock, &sig->outputs) {
write_node_socket_interface(writer, sock);
}
}
void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree)
{
BKE_id_blend_write(writer, &ntree->id);
@ -786,6 +797,11 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree)
}
BLO_write_struct_by_name(writer, node->typeinfo->storagename, storage);
}
else if (node->type == FN_NODE_EVALUATE) {
NodeFunctionEvaluate *storage = (NodeFunctionEvaluate *)node->storage;
BLO_write_struct_by_name(writer, node->typeinfo->storagename, storage);
write_node_function_signature(writer, &storage->signature);
}
else if (node->typeinfo != &NodeTypeUndefined) {
BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage);
}
@ -851,6 +867,19 @@ static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock)
sock->runtime = MEM_new<bNodeSocketRuntime>(__func__);
}
static void direct_link_node_function_signature(BlendDataReader *reader,
bNodeFunctionSignature *sig)
{
BLO_read_list(reader, &sig->inputs);
BLO_read_list(reader, &sig->outputs);
LISTBASE_FOREACH (bNodeSocket *, sock, &sig->inputs) {
direct_link_node_socket(reader, sock);
}
LISTBASE_FOREACH (bNodeSocket *, sock, &sig->outputs) {
direct_link_node_socket(reader, sock);
}
}
void ntreeBlendReadData(BlendDataReader *reader, ID *owner_id, bNodeTree *ntree)
{
/* Special case for this pointer, do not rely on regular `lib_link` process here. Avoids needs
@ -984,6 +1013,11 @@ void ntreeBlendReadData(BlendDataReader *reader, ID *owner_id, bNodeTree *ntree)
BLO_read_data_address(reader, &storage->string);
break;
}
case FN_NODE_EVALUATE: {
NodeFunctionEvaluate *storage = (NodeFunctionEvaluate *)node->storage;
direct_link_node_function_signature(reader, &storage->signature);
break;
}
default:
break;
}