[Bf-blender-cvs] [8f934852f04] geometry-nodes: Geometry Nodes: initial support for displaying group inputs in modifier
Jacques Lucke
noreply at git.blender.org
Tue Oct 27 13:44:54 CET 2020
Commit: 8f934852f04758fef1c4aafbadad1ae599c84503
Author: Jacques Lucke
Date: Tue Oct 27 13:44:46 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rB8f934852f04758fef1c4aafbadad1ae599c84503
Geometry Nodes: initial support for displaying group inputs in modifier
This uses the previously added id properties on the nodes modifier
to store values that are passed into the geometry node group.
===================================================================
M source/blender/blenkernel/BKE_node.h
M source/blender/blenkernel/intern/lib_remap.c
M source/blender/blenkernel/intern/node.c
M source/blender/makesrna/RNA_access.h
M source/blender/makesrna/intern/CMakeLists.txt
M source/blender/makesrna/intern/rna_modifier.c
M source/blender/modifiers/CMakeLists.txt
M source/blender/modifiers/intern/MOD_nodes.cc
A source/blender/modifiers/intern/MOD_nodes.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 3d8db9a7199..6b63dfe11fb 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -451,7 +451,7 @@ bool ntreeHasType(const struct bNodeTree *ntree, int type);
bool ntreeHasTree(const struct bNodeTree *ntree, const struct bNodeTree *lookup);
void ntreeUpdateTree(struct Main *main, struct bNodeTree *ntree);
void ntreeUpdateAllNew(struct Main *main);
-void ntreeUpdateAllUsers(struct Main *main, struct ID *ngroup);
+void ntreeUpdateAllUsers(struct Main *main, struct bNodeTree *ngroup);
void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
diff --git a/source/blender/blenkernel/intern/lib_remap.c b/source/blender/blenkernel/intern/lib_remap.c
index f0031d4191d..9e3189afee9 100644
--- a/source/blender/blenkernel/intern/lib_remap.c
+++ b/source/blender/blenkernel/intern/lib_remap.c
@@ -342,7 +342,7 @@ static void libblock_remap_data_postprocess_obdata_relink(Main *bmain, Object *o
static void libblock_remap_data_postprocess_nodetree_update(Main *bmain, ID *new_id)
{
/* Update all group nodes using a node group. */
- ntreeUpdateAllUsers(bmain, new_id);
+ ntreeUpdateAllUsers(bmain, (bNodeTree *)new_id);
}
/**
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index c4fc0745eee..d0d09ea6d21 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -39,6 +39,7 @@
#include "DNA_light_types.h"
#include "DNA_linestyle_types.h"
#include "DNA_material_types.h"
+#include "DNA_modifier_types.h"
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
#include "DNA_simulation_types.h"
@@ -84,6 +85,8 @@
#include "BLO_read_write.h"
+#include "intern/MOD_nodes.h"
+
#define NODE_DEFAULT_MAX_WIDTH 700
/* Fallback types for undefined tree, nodes, sockets */
@@ -3954,14 +3957,14 @@ void ntreeUpdateAllNew(Main *main)
FOREACH_NODETREE_END;
}
-void ntreeUpdateAllUsers(Main *main, ID *ngroup)
+void ntreeUpdateAllUsers(Main *main, bNodeTree *ngroup)
{
/* Update all users of ngroup, to add/remove sockets as needed. */
FOREACH_NODETREE_BEGIN (main, ntree, owner_id) {
bool need_update = false;
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
- if (node->id == ngroup) {
+ if (node->id == &ngroup->id) {
if (node->typeinfo->group_update_func) {
node->typeinfo->group_update_func(ntree, node);
}
@@ -3975,6 +3978,19 @@ void ntreeUpdateAllUsers(Main *main, ID *ngroup)
}
}
FOREACH_NODETREE_END;
+
+ if (ngroup->type == NTREE_GEOMETRY) {
+ LISTBASE_FOREACH (Object *, object, &main->objects) {
+ LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
+ if (md->type == eModifierType_Nodes) {
+ NodesModifierData *nmd = (NodesModifierData *)md;
+ if (nmd->node_group == ngroup) {
+ MOD_nodes_update_interface(nmd);
+ }
+ }
+ }
+ }
+ }
}
void ntreeUpdateTree(Main *bmain, bNodeTree *ntree)
@@ -4018,7 +4034,7 @@ void ntreeUpdateTree(Main *bmain, bNodeTree *ntree)
}
if (bmain) {
- ntreeUpdateAllUsers(bmain, &ntree->id);
+ ntreeUpdateAllUsers(bmain, ntree);
}
if (ntree->update & (NTREE_UPDATE_LINKS | NTREE_UPDATE_NODES)) {
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index a6601951e3b..bc25a404de8 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -567,6 +567,7 @@ extern StructRNA RNA_SimplifyGpencilModifier;
extern StructRNA RNA_Simulation;
#ifdef WITH_GEOMETRY_NODES
extern StructRNA RNA_NodesModifier;
+extern StructRNA RNA_NodesModifierSettings;
#endif
extern StructRNA RNA_GeometryNode;
extern StructRNA RNA_GeometryNodeTree;
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index d8029ff16a0..1c2f130025d 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -373,6 +373,7 @@ blender_include_dirs(
../../ikplugin
../../imbuf
../../makesdna
+ ../../modifiers
../../nodes/
../../sequencer
../../simulation
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index dde14f6fb47..4c511cd44ac 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -57,6 +57,8 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "intern/MOD_nodes.h"
+
const EnumPropertyItem rna_enum_object_modifier_type_items[] = {
{0, "", 0, N_("Modify"), ""},
{eModifierType_DataTransfer,
@@ -1606,6 +1608,13 @@ static bool rna_NodesModifier_node_group_poll(PointerRNA *ptr, PointerRNA value)
return true;
}
+static void rna_NodesModifier_node_group_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ NodesModifierData *nmd = ptr->data;
+ rna_Modifier_dependency_update(bmain, scene, ptr);
+ MOD_nodes_update_interface(nmd);
+}
+
static IDProperty *rna_NodesModifierSettings_properties(PointerRNA *ptr, bool create)
{
NodesModifierSettings *settings = ptr->data;
@@ -6967,7 +6976,7 @@ static void rna_def_modifier_nodes(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Node Group", "Node group that controls what this modifier does");
RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_NodesModifier_node_group_poll");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_NodesModifier_node_group_update");
prop = RNA_def_property(srna, "settings", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index bacde95ee20..c5232950453 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -117,6 +117,7 @@ set(SRC
MOD_modifiertypes.h
intern/MOD_meshcache_util.h
+ intern/MOD_nodes.h
intern/MOD_solidify_util.h
intern/MOD_ui_common.h
intern/MOD_util.h
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 5c13b6f7ba5..867e29cc093 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -62,6 +62,7 @@
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_nodes.h"
#include "MOD_ui_common.h"
#include "NOD_derived_node_tree.hh"
@@ -323,6 +324,59 @@ class GeometryNodesEvaluator {
}
};
+static bool get_socket_property_info(bNodeSocket &socket,
+ int *r_property_type,
+ IDPropertyTemplate *r_default_value)
+{
+ switch (socket.type) {
+ case SOCK_FLOAT: {
+ *r_property_type = IDP_FLOAT;
+ r_default_value->f = ((bNodeSocketValueFloat *)socket.default_value)->value;
+ return true;
+ }
+ case SOCK_INT: {
+ *r_property_type = IDP_INT;
+ r_default_value->i = ((bNodeSocketValueInt *)socket.default_value)->value;
+ return true;
+ }
+ default: {
+ return false;
+ }
+ }
+}
+
+void MOD_nodes_update_interface(NodesModifierData *nmd)
+{
+ if (nmd->node_group == nullptr) {
+ return;
+ }
+ if (nmd->settings.properties == nullptr) {
+ IDPropertyTemplate val = {0};
+ nmd->settings.properties = IDP_New(IDP_GROUP, &val, "Nodes Modifier Settings");
+ }
+
+ LISTBASE_FOREACH (bNodeSocket *, socket, &nmd->node_group->inputs) {
+ const char *identifier = socket->identifier;
+
+ IDPropertyTemplate default_value = {0};
+ int property_type;
+ const bool is_supported = get_socket_property_info(*socket, &property_type, &default_value);
+ if (!is_supported) {
+ continue;
+ }
+
+ IDProperty *property = IDP_GetPropertyFromGroup(nmd->settings.properties, identifier);
+ if (property != nullptr && property->type != property_type) {
+ IDP_FreeFromGroup(nmd->settings.properties, property);
+ property = nullptr;
+ }
+ if (property == nullptr) {
+ property = IDP_New(property_type, &default_value, identifier);
+ IDP_AddToGroup(nmd->settings.properties, property);
+ }
+ }
+}
+
/**
* Evaluate a node group to compute the output geometry.
* Currently, this uses a fairly basic and inefficient algorithm that might compute things more
@@ -469,17 +523,34 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
{
+#ifdef WITH_GEOMETRY_NODES
uiLayout *layout = panel->layout;
PointerRNA ob_ptr;
PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr);
+ NodesModifierData *nmd = static_cast<NodesModifierData *>(ptr->data);
uiLayoutSetPropSep(layout, true);
uiLayoutSetPropDecorate(layout, false);
uiItemR(layout, ptr, "node_group", 0, NULL, ICON_MESH_DATA);
+ if (nmd->node_group != nullptr && nmd->settings.properties != nullptr) {
+ PointerRNA settings_ptr;
+ RNA_pointer_create(ptr->owner_id, &RNA_NodesModifierSettings, &nmd->settings, &settings_ptr);
+ LISTBASE_FOREACH (bNodeSocket *, socket, &nmd->node_group->inputs) {
+ IDProperty *property = IDP_GetPropertyFromGroup(nmd->settings.properties,
+ socket->identifier);
+ if (property != nullptr) {
+ char rna_path[128];
+ BLI_snprintf(rna_path, ARRAY_SIZE(rna_path), "[\"%s\"]", socket->identifier);
+ uiItemR(layout, &settings_ptr, rna_path, 0, socket->name, ICON_NONE);
+ }
+ }
+ }
+
modifier_panel_end(layout, ptr);
+#endif
}
static void panelRegister(ARegionType *region_type)
diff --git a/source/blender/modifiers/intern/MOD_nodes.h b/source/blender/modifiers/intern/MOD_nodes.h
new file mode 100644
index 00000000000..c218dfd04dc
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_nodes.h
@@ -0,0 +1,29 @@
+/*
+ * This program is free software; you
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list