Cleanup: remove use of persistent data handles in geometry nodes
Those were mostly just left over from previous work on particle nodes. They solved the problem of keeping a reference to an object over multiple frames and in a cache. Currently, we do not have this problem in geometry nodes, so we can also remove this layer of complexity for now.
This commit is contained in:
@@ -93,9 +93,6 @@ using blender::Span;
|
||||
using blender::StringRef;
|
||||
using blender::StringRefNull;
|
||||
using blender::Vector;
|
||||
using blender::bke::PersistentCollectionHandle;
|
||||
using blender::bke::PersistentDataHandleMap;
|
||||
using blender::bke::PersistentObjectHandle;
|
||||
using blender::fn::GMutablePointer;
|
||||
using blender::fn::GPointer;
|
||||
using blender::nodes::GeoNodeExecParams;
|
||||
@@ -284,9 +281,7 @@ struct SocketPropertyType {
|
||||
IDProperty *(*create_default_ui_prop)(const bNodeSocket &socket, const char *name);
|
||||
PropertyType (*rna_subtype_get)(const bNodeSocket &socket);
|
||||
bool (*is_correct_type)(const IDProperty &property);
|
||||
void (*init_cpp_value)(const IDProperty &property,
|
||||
const PersistentDataHandleMap &handles,
|
||||
void *r_value);
|
||||
void (*init_cpp_value)(const IDProperty &property, void *r_value);
|
||||
};
|
||||
|
||||
static IDProperty *socket_add_property(IDProperty *settings_prop_group,
|
||||
@@ -379,9 +374,7 @@ static const SocketPropertyType *get_socket_property_type(const bNodeSocket &bso
|
||||
return (PropertyType)((bNodeSocketValueFloat *)socket.default_value)->subtype;
|
||||
},
|
||||
[](const IDProperty &property) { return ELEM(property.type, IDP_FLOAT, IDP_DOUBLE); },
|
||||
[](const IDProperty &property,
|
||||
const PersistentDataHandleMap &UNUSED(handles),
|
||||
void *r_value) {
|
||||
[](const IDProperty &property, void *r_value) {
|
||||
if (property.type == IDP_FLOAT) {
|
||||
*(float *)r_value = IDP_Float(&property);
|
||||
}
|
||||
@@ -422,9 +415,7 @@ static const SocketPropertyType *get_socket_property_type(const bNodeSocket &bso
|
||||
return (PropertyType)((bNodeSocketValueInt *)socket.default_value)->subtype;
|
||||
},
|
||||
[](const IDProperty &property) { return property.type == IDP_INT; },
|
||||
[](const IDProperty &property,
|
||||
const PersistentDataHandleMap &UNUSED(handles),
|
||||
void *r_value) { *(int *)r_value = IDP_Int(&property); },
|
||||
[](const IDProperty &property, void *r_value) { *(int *)r_value = IDP_Int(&property); },
|
||||
};
|
||||
return &int_type;
|
||||
}
|
||||
@@ -467,9 +458,9 @@ static const SocketPropertyType *get_socket_property_type(const bNodeSocket &bso
|
||||
return property.type == IDP_ARRAY && property.subtype == IDP_FLOAT &&
|
||||
property.len == 3;
|
||||
},
|
||||
[](const IDProperty &property,
|
||||
const PersistentDataHandleMap &UNUSED(handles),
|
||||
void *r_value) { copy_v3_v3((float *)r_value, (const float *)IDP_Array(&property)); },
|
||||
[](const IDProperty &property, void *r_value) {
|
||||
copy_v3_v3((float *)r_value, (const float *)IDP_Array(&property));
|
||||
},
|
||||
};
|
||||
return &vector_type;
|
||||
}
|
||||
@@ -499,9 +490,9 @@ static const SocketPropertyType *get_socket_property_type(const bNodeSocket &bso
|
||||
},
|
||||
nullptr,
|
||||
[](const IDProperty &property) { return property.type == IDP_INT; },
|
||||
[](const IDProperty &property,
|
||||
const PersistentDataHandleMap &UNUSED(handles),
|
||||
void *r_value) { *(bool *)r_value = IDP_Int(&property) != 0; },
|
||||
[](const IDProperty &property, void *r_value) {
|
||||
*(bool *)r_value = IDP_Int(&property) != 0;
|
||||
},
|
||||
};
|
||||
return &boolean_type;
|
||||
}
|
||||
@@ -521,9 +512,9 @@ static const SocketPropertyType *get_socket_property_type(const bNodeSocket &bso
|
||||
},
|
||||
nullptr,
|
||||
[](const IDProperty &property) { return property.type == IDP_STRING; },
|
||||
[](const IDProperty &property,
|
||||
const PersistentDataHandleMap &UNUSED(handles),
|
||||
void *r_value) { new (r_value) std::string(IDP_String(&property)); },
|
||||
[](const IDProperty &property, void *r_value) {
|
||||
new (r_value) std::string(IDP_String(&property));
|
||||
},
|
||||
};
|
||||
return &string_type;
|
||||
}
|
||||
@@ -540,10 +531,10 @@ static const SocketPropertyType *get_socket_property_type(const bNodeSocket &bso
|
||||
nullptr,
|
||||
nullptr,
|
||||
[](const IDProperty &property) { return property.type == IDP_ID; },
|
||||
[](const IDProperty &property, const PersistentDataHandleMap &handles, void *r_value) {
|
||||
[](const IDProperty &property, void *r_value) {
|
||||
ID *id = IDP_Id(&property);
|
||||
Object *object = (id && GS(id->name) == ID_OB) ? (Object *)id : nullptr;
|
||||
new (r_value) PersistentObjectHandle(handles.lookup(object));
|
||||
*(Object **)r_value = object;
|
||||
},
|
||||
};
|
||||
return &object_type;
|
||||
@@ -561,10 +552,10 @@ static const SocketPropertyType *get_socket_property_type(const bNodeSocket &bso
|
||||
nullptr,
|
||||
nullptr,
|
||||
[](const IDProperty &property) { return property.type == IDP_ID; },
|
||||
[](const IDProperty &property, const PersistentDataHandleMap &handles, void *r_value) {
|
||||
[](const IDProperty &property, void *r_value) {
|
||||
ID *id = IDP_Id(&property);
|
||||
Collection *collection = (id && GS(id->name) == ID_GR) ? (Collection *)id : nullptr;
|
||||
new (r_value) PersistentCollectionHandle(handles.lookup(collection));
|
||||
*(Collection **)r_value = collection;
|
||||
},
|
||||
};
|
||||
return &collection_type;
|
||||
@@ -652,7 +643,6 @@ void MOD_nodes_init(Main *bmain, NodesModifierData *nmd)
|
||||
}
|
||||
|
||||
static void initialize_group_input(NodesModifierData &nmd,
|
||||
const PersistentDataHandleMap &handle_map,
|
||||
const bNodeSocket &socket,
|
||||
const CPPType &cpp_type,
|
||||
void *r_value)
|
||||
@@ -676,22 +666,7 @@ static void initialize_group_input(NodesModifierData &nmd,
|
||||
blender::nodes::socket_cpp_value_get(socket, r_value);
|
||||
return;
|
||||
}
|
||||
property_type->init_cpp_value(*property, handle_map, r_value);
|
||||
}
|
||||
|
||||
static void fill_data_handle_map(const NodesModifierSettings &settings,
|
||||
const DerivedNodeTree &tree,
|
||||
PersistentDataHandleMap &handle_map)
|
||||
{
|
||||
Set<ID *> used_ids;
|
||||
find_used_ids_from_settings(settings, used_ids);
|
||||
find_used_ids_from_nodes(*tree.root_context().tree().btree(), used_ids);
|
||||
|
||||
int current_handle = 0;
|
||||
for (ID *id : used_ids) {
|
||||
handle_map.add(current_handle, *id);
|
||||
current_handle++;
|
||||
}
|
||||
property_type->init_cpp_value(*property, r_value);
|
||||
}
|
||||
|
||||
static void reset_tree_ui_storage(Span<const blender::nodes::NodeTreeRef *> trees,
|
||||
@@ -879,9 +854,6 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree,
|
||||
blender::LinearAllocator<> &allocator = scope.linear_allocator();
|
||||
blender::nodes::MultiFunctionByNode mf_by_node = get_multi_function_per_node(tree, scope);
|
||||
|
||||
PersistentDataHandleMap handle_map;
|
||||
fill_data_handle_map(nmd->settings, tree, handle_map);
|
||||
|
||||
Map<DOutputSocket, GMutablePointer> group_inputs;
|
||||
|
||||
const DTreeContext *root_context = &tree.root_context();
|
||||
@@ -907,7 +879,7 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree,
|
||||
for (const OutputSocketRef *socket : remaining_input_sockets) {
|
||||
const CPPType &cpp_type = *blender::nodes::socket_cpp_type_get(*socket->typeinfo());
|
||||
void *value_in = allocator.allocate(cpp_type.size(), cpp_type.alignment());
|
||||
initialize_group_input(*nmd, handle_map, *socket->bsocket(), cpp_type, value_in);
|
||||
initialize_group_input(*nmd, *socket->bsocket(), cpp_type, value_in);
|
||||
group_inputs.add_new({root_context, socket}, {cpp_type, value_in});
|
||||
}
|
||||
}
|
||||
@@ -936,7 +908,6 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree,
|
||||
eval_params.input_values = group_inputs;
|
||||
eval_params.output_sockets = group_outputs;
|
||||
eval_params.mf_by_node = &mf_by_node;
|
||||
eval_params.handle_map = &handle_map;
|
||||
eval_params.modifier_ = nmd;
|
||||
eval_params.depsgraph = ctx->depsgraph;
|
||||
eval_params.self_object = ctx->object;
|
||||
|
||||
@@ -26,8 +26,6 @@
|
||||
|
||||
namespace blender::modifiers::geometry_nodes {
|
||||
|
||||
using bke::PersistentCollectionHandle;
|
||||
using bke::PersistentObjectHandle;
|
||||
using fn::CPPType;
|
||||
using fn::GValueMap;
|
||||
using nodes::GeoNodeExecParams;
|
||||
@@ -96,7 +94,6 @@ class GeometryNodesEvaluator {
|
||||
Vector<DInputSocket> group_outputs_;
|
||||
blender::nodes::MultiFunctionByNode &mf_by_node_;
|
||||
const blender::nodes::DataTypeConversions &conversions_;
|
||||
const PersistentDataHandleMap &handle_map_;
|
||||
const Object *self_object_;
|
||||
const ModifierData *modifier_;
|
||||
Depsgraph *depsgraph_;
|
||||
@@ -108,7 +105,6 @@ class GeometryNodesEvaluator {
|
||||
group_outputs_(std::move(params.output_sockets)),
|
||||
mf_by_node_(*params.mf_by_node),
|
||||
conversions_(blender::nodes::get_implicit_type_conversions()),
|
||||
handle_map_(*params.handle_map),
|
||||
self_object_(params.self_object),
|
||||
modifier_(¶ms.modifier_->modifier),
|
||||
depsgraph_(params.depsgraph),
|
||||
@@ -237,7 +233,6 @@ class GeometryNodesEvaluator {
|
||||
GValueMap<StringRef> node_outputs_map{allocator_};
|
||||
NodeParamsProvider params_provider;
|
||||
params_provider.dnode = node;
|
||||
params_provider.handle_map = &handle_map_;
|
||||
params_provider.self_object = self_object_;
|
||||
params_provider.depsgraph = depsgraph_;
|
||||
params_provider.allocator = &allocator_;
|
||||
@@ -412,20 +407,7 @@ class GeometryNodesEvaluator {
|
||||
bNodeSocket *bsocket = socket->bsocket();
|
||||
const CPPType &type = *blender::nodes::socket_cpp_type_get(*socket->typeinfo());
|
||||
void *buffer = allocator_.allocate(type.size(), type.alignment());
|
||||
|
||||
if (bsocket->type == SOCK_OBJECT) {
|
||||
Object *object = socket->default_value<bNodeSocketValueObject>()->value;
|
||||
PersistentObjectHandle object_handle = handle_map_.lookup(object);
|
||||
new (buffer) PersistentObjectHandle(object_handle);
|
||||
}
|
||||
else if (bsocket->type == SOCK_COLLECTION) {
|
||||
Collection *collection = socket->default_value<bNodeSocketValueCollection>()->value;
|
||||
PersistentCollectionHandle collection_handle = handle_map_.lookup(collection);
|
||||
new (buffer) PersistentCollectionHandle(collection_handle);
|
||||
}
|
||||
else {
|
||||
blender::nodes::socket_cpp_value_get(*bsocket, buffer);
|
||||
}
|
||||
blender::nodes::socket_cpp_value_get(*bsocket, buffer);
|
||||
|
||||
if (type == required_type) {
|
||||
return {type, buffer};
|
||||
|
||||
@@ -23,14 +23,11 @@
|
||||
|
||||
#include "FN_generic_pointer.hh"
|
||||
|
||||
#include "BKE_persistent_data_handle.hh"
|
||||
|
||||
#include "DNA_modifier_types.h"
|
||||
|
||||
namespace blender::modifiers::geometry_nodes {
|
||||
|
||||
using namespace nodes::derived_node_tree_types;
|
||||
using bke::PersistentDataHandleMap;
|
||||
using fn::GMutablePointer;
|
||||
using fn::GPointer;
|
||||
|
||||
@@ -42,7 +39,6 @@ struct GeometryNodesEvaluationParams {
|
||||
Map<DOutputSocket, GMutablePointer> input_values;
|
||||
Vector<DInputSocket> output_sockets;
|
||||
nodes::MultiFunctionByNode *mf_by_node;
|
||||
const PersistentDataHandleMap *handle_map;
|
||||
const NodesModifierData *modifier_;
|
||||
Depsgraph *depsgraph;
|
||||
Object *self_object;
|
||||
|
||||
Reference in New Issue
Block a user