[Bf-blender-cvs] [69a4cd82b47] temp-angavrilov-constraints: Geometry Nodes: support object and collection settings in the modifier.
Alexander Gavrilov
noreply at git.blender.org
Fri Jan 8 22:59:28 CET 2021
Commit: 69a4cd82b4731148aa7cf67c60bd64ef372f7253
Author: Alexander Gavrilov
Date: Sat Jan 9 00:59:14 2021 +0300
Branches: temp-angavrilov-constraints
https://developer.blender.org/rB69a4cd82b4731148aa7cf67c60bd64ef372f7253
Geometry Nodes: support object and collection settings in the modifier.
===================================================================
M source/blender/makesrna/intern/rna_ID.c
M source/blender/makesrna/intern/rna_access.c
M source/blender/modifiers/intern/MOD_nodes.cc
===================================================================
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index 5e3c234708a..4bfd0e2dc35 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -1113,7 +1113,7 @@ static void rna_def_ID_properties(BlenderRNA *brna)
/* IDP_ID */
prop = RNA_def_property(srna, "id", PROP_POINTER, PROP_NONE);
- RNA_def_property_flag(prop, PROP_IDPROPERTY | PROP_NEVER_UNLINK);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY | PROP_NEVER_UNLINK | PROP_EDITABLE);
RNA_def_property_struct_type(prop, "ID");
/* ID property groups > level 0, since level 0 group is merged
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 0479c5d1eed..b9bed8b0802 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -3678,8 +3678,8 @@ void RNA_property_pointer_set(PointerRNA *ptr,
PointerRNA ptr_value,
ReportList *reports)
{
- PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop;
IDProperty *idprop = rna_idproperty_check(&prop, ptr);
+ PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop;
BLI_assert(RNA_property_type(prop) == PROP_POINTER);
/* Check types. */
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 133a19dde9e..087ffb89c01 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -45,6 +45,7 @@
#include "DNA_screen_types.h"
#include "BKE_customdata.h"
+#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
@@ -131,6 +132,19 @@ static void findUsedIds(const bNodeTree &tree, Set<ID *> &ids)
}
}
+static void findUsedIds(const NodesModifierSettings &settings, Set<ID *> &ids)
+{
+ IDP_foreach_property(
+ settings.properties,
+ IDP_TYPE_FILTER_ID,
+ [](IDProperty *id_prop, void *user_data) {
+ Set<ID *> *p_ids = (Set<ID *> *)user_data;
+ if (ID *ptr = (ID *)id_prop->data.pointer)
+ p_ids->add(ptr);
+ },
+ &ids);
+}
+
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
{
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
@@ -138,6 +152,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
DEG_add_node_tree_relation(ctx->node, nmd->node_group, "Nodes Modifier");
Set<ID *> used_ids;
+ findUsedIds(nmd->settings, used_ids);
findUsedIds(*nmd->node_group, used_ids);
for (ID *id : used_ids) {
if (GS(id->name) == ID_OB) {
@@ -464,7 +479,9 @@ 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, void *r_value);
+ void (*init_cpp_value)(const IDProperty &property,
+ const blender::bke::PersistentDataHandleMap &handle_map,
+ void *r_value);
};
static IDProperty *socket_add_property(IDProperty *settings_prop_group,
@@ -549,9 +566,9 @@ static const SocketPropertyType *get_socket_property_type(const bNodeSocket &bso
return (PropertyType)((bNodeSocketValueFloat *)socket.default_value)->subtype;
},
[](const IDProperty &property) { return property.type == IDP_FLOAT; },
- [](const IDProperty &property, void *r_value) {
- *(float *)r_value = IDP_Float(&property);
- },
+ [](const IDProperty &property,
+ const blender::bke::PersistentDataHandleMap &,
+ void *r_value) { *(float *)r_value = IDP_Float(&property); },
};
return &float_type;
}
@@ -585,7 +602,9 @@ 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, void *r_value) { *(int *)r_value = IDP_Int(&property); },
+ [](const IDProperty &property,
+ const blender::bke::PersistentDataHandleMap &,
+ void *r_value) { *(int *)r_value = IDP_Int(&property); },
};
return &int_type;
}
@@ -628,9 +647,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, void *r_value) {
- copy_v3_v3((float *)r_value, (const float *)IDP_Array(&property));
- },
+ [](const IDProperty &property,
+ const blender::bke::PersistentDataHandleMap &,
+ void *r_value) { copy_v3_v3((float *)r_value, (const float *)IDP_Array(&property)); },
};
return &vector_type;
}
@@ -660,9 +679,9 @@ static const SocketPropertyType *get_socket_property_type(const bNodeSocket &bso
},
nullptr,
[](const IDProperty &property) { return property.type == IDP_INT; },
- [](const IDProperty &property, void *r_value) {
- *(bool *)r_value = IDP_Int(&property) != 0;
- },
+ [](const IDProperty &property,
+ const blender::bke::PersistentDataHandleMap &,
+ void *r_value) { *(bool *)r_value = IDP_Int(&property) != 0; },
};
return &boolean_type;
}
@@ -682,12 +701,83 @@ static const SocketPropertyType *get_socket_property_type(const bNodeSocket &bso
},
nullptr,
[](const IDProperty &property) { return property.type == IDP_STRING; },
- [](const IDProperty &property, void *r_value) {
- new (r_value) std::string(IDP_String(&property));
- },
+ [](const IDProperty &property,
+ const blender::bke::PersistentDataHandleMap &,
+ void *r_value) { new (r_value) std::string(IDP_String(&property)); },
};
return &string_type;
}
+ case SOCK_OBJECT: {
+ static const SocketPropertyType object_type = {
+ [](const bNodeSocket &socket, const char *name) {
+ bNodeSocketValueObject *value = (bNodeSocketValueObject *)socket.default_value;
+ IDPropertyTemplate idprop = {0};
+ idprop.id = (ID *)value->value;
+ return IDP_New(IDP_ID, &idprop, name);
+ },
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ [](const IDProperty &property) { return property.type == IDP_ID; },
+ [](const IDProperty &property,
+ const blender::bke::PersistentDataHandleMap &handle_map,
+ void *r_value) {
+ ID *id = (ID *)property.data.pointer;
+ Object *ptr = (id && GS(id->name) == ID_OB) ? (Object *)id : NULL;
+ new (r_value) blender::bke::PersistentObjectHandle(handle_map.lookup(ptr));
+ },
+ };
+ return &object_type;
+ }
+#if 0
+ case SOCK_IMAGE: {
+ static const SocketPropertyType image_type = {
+ [](const bNodeSocket &socket, const char *name) {
+ bNodeSocketValueImage *value = (bNodeSocketValueImage *)socket.default_value;
+ IDPropertyTemplate idprop = {0};
+ idprop.id = (ID *)value->value;
+ return IDP_New(IDP_ID, &idprop, name);
+ },
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ [](const IDProperty &property) { return property.type == IDP_ID; },
+ [](const IDProperty &property,
+ const blender::bke::PersistentDataHandleMap &handle_map,
+ void *r_value) {
+ ID *id = (ID *)property.data.pointer;
+ Image *ptr = (id && GS(id->name) == ID_IM) ? (Image *)id : NULL;
+ new (r_value) blender::bke::PersistentIDHandle(handle_map.lookup(ptr));
+ },
+ };
+ return &image_type;
+ }
+#endif
+ case SOCK_COLLECTION: {
+ static const SocketPropertyType collection_type = {
+ [](const bNodeSocket &socket, const char *name) {
+ bNodeSocketValueCollection *value = (bNodeSocketValueCollection *)socket.default_value;
+ IDPropertyTemplate idprop = {0};
+ idprop.id = (ID *)value->value;
+ return IDP_New(IDP_ID, &idprop, name);
+ },
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ [](const IDProperty &property) { return property.type == IDP_ID; },
+ [](const IDProperty &property,
+ const blender::bke::PersistentDataHandleMap &handle_map,
+ void *r_value) {
+ ID *id = (ID *)property.data.pointer;
+ Collection *ptr = (id && GS(id->name) == ID_GR) ? (Collection *)id : NULL;
+ new (r_value) blender::bke::PersistentCollectionHandle(handle_map.lookup(ptr));
+ },
+ };
+ return &collection_type;
+ }
default: {
return nullptr;
}
@@ -768,6 +858,7 @@ void MOD_nodes_init(Main *bmain, NodesModifierData *nmd)
}
static void initialize_group_input(NodesModifierData &nmd,
+ const blender::bke::PersistentDataHandleMap &handle_map,
const bNodeSocket &socket,
const CPPType &cpp_type,
void *r_value)
@@ -789,14 +880,17 @@ static void initialize_group_input(NodesModifierData &nmd,
}
if (!property_type->is_correct_type(*property)) {
blender::nodes::socket_cpp_value_get(socket, r_value);
+ return;
}
- property_type->init_cpp_value(*property, r_value);
+ property_type->init_cpp_value(*property, handle_map, r_value);
}
-static void fill_data_handle_map(const DerivedNodeTree &tree,
+static void fill_data_handle_map(const NodesModifierSett
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list