Fix: Missing GeometryNodeCustomGroup
This is a minor change to add some plumbing code to support custom geo nodes. This is working the same way as the custom cycles and compositor nodes. An example add-in is attached to D10784 Reviewed By: JacquesLucke Differential Revision: http://developer.blender.org/D10784
This commit is contained in:
@@ -1314,8 +1314,8 @@ void nodeUnregisterType(bNodeType *nt)
|
|||||||
bool nodeTypeUndefined(bNode *node)
|
bool nodeTypeUndefined(bNode *node)
|
||||||
{
|
{
|
||||||
return (node->typeinfo == &NodeTypeUndefined) ||
|
return (node->typeinfo == &NodeTypeUndefined) ||
|
||||||
(node->type == NODE_GROUP && node->id && ID_IS_LINKED(node->id) &&
|
((node->type == NODE_GROUP || node->type == NODE_CUSTOM_GROUP) && node->id &&
|
||||||
(node->id->tag & LIB_TAG_MISSING));
|
ID_IS_LINKED(node->id) && (node->id->tag & LIB_TAG_MISSING));
|
||||||
}
|
}
|
||||||
|
|
||||||
GHashIterator *nodeTypeGetIterator(void)
|
GHashIterator *nodeTypeGetIterator(void)
|
||||||
|
@@ -497,6 +497,7 @@ static const EnumPropertyItem rna_node_geometry_attribute_input_type_items_no_bo
|
|||||||
|
|
||||||
# include "NOD_common.h"
|
# include "NOD_common.h"
|
||||||
# include "NOD_composite.h"
|
# include "NOD_composite.h"
|
||||||
|
# include "NOD_geometry.h"
|
||||||
# include "NOD_shader.h"
|
# include "NOD_shader.h"
|
||||||
# include "NOD_socket.h"
|
# include "NOD_socket.h"
|
||||||
|
|
||||||
@@ -3290,6 +3291,35 @@ static StructRNA *rna_NodeCustomGroup_register(Main *bmain,
|
|||||||
return nt->rna_ext.srna;
|
return nt->rna_ext.srna;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static StructRNA *rna_GeometryNodeCustomGroup_register(Main *bmain,
|
||||||
|
ReportList *reports,
|
||||||
|
void *data,
|
||||||
|
const char *identifier,
|
||||||
|
StructValidateFunc validate,
|
||||||
|
StructCallbackFunc call,
|
||||||
|
StructFreeFunc free)
|
||||||
|
{
|
||||||
|
bNodeType *nt = rna_Node_register_base(
|
||||||
|
bmain, reports, &RNA_GeometryNodeCustomGroup, data, identifier, validate, call, free);
|
||||||
|
|
||||||
|
if (!nt) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
nt->group_update_func = node_group_update;
|
||||||
|
nt->type = NODE_CUSTOM_GROUP;
|
||||||
|
|
||||||
|
register_node_type_geo_custom_group(nt);
|
||||||
|
|
||||||
|
nodeRegisterType(nt);
|
||||||
|
|
||||||
|
WM_main_add_notifier(NC_NODE | NA_EDITED, NULL);
|
||||||
|
|
||||||
|
return nt->rna_ext.srna;
|
||||||
|
}
|
||||||
|
|
||||||
|
void register_node_type_geo_custom_group(bNodeType *ntype);
|
||||||
|
|
||||||
static StructRNA *rna_ShaderNodeCustomGroup_register(Main *bmain,
|
static StructRNA *rna_ShaderNodeCustomGroup_register(Main *bmain,
|
||||||
ReportList *reports,
|
ReportList *reports,
|
||||||
void *data,
|
void *data,
|
||||||
@@ -11501,6 +11531,12 @@ void RNA_def_nodetree(BlenderRNA *brna)
|
|||||||
"Custom Group",
|
"Custom Group",
|
||||||
"Base node type for custom registered node group types",
|
"Base node type for custom registered node group types",
|
||||||
"rna_NodeCustomGroup_register");
|
"rna_NodeCustomGroup_register");
|
||||||
|
def_custom_group(brna,
|
||||||
|
"GeometryNodeCustomGroup",
|
||||||
|
"GeometryNode",
|
||||||
|
"Geometry Custom Group",
|
||||||
|
"Custom Geometry Group Node for Python nodes",
|
||||||
|
"rna_GeometryNodeCustomGroup_register");
|
||||||
|
|
||||||
/* special socket types */
|
/* special socket types */
|
||||||
rna_def_cmp_output_file_slot_file(brna);
|
rna_def_cmp_output_file_slot_file(brna);
|
||||||
|
@@ -136,7 +136,7 @@ static void find_used_ids_from_nodes(const bNodeTree &tree, Set<ID *> &ids)
|
|||||||
addIdsUsedBySocket(&node->inputs, ids);
|
addIdsUsedBySocket(&node->inputs, ids);
|
||||||
addIdsUsedBySocket(&node->outputs, ids);
|
addIdsUsedBySocket(&node->outputs, ids);
|
||||||
|
|
||||||
if (node->type == NODE_GROUP) {
|
if (ELEM(node->type, NODE_GROUP, NODE_CUSTOM_GROUP)) {
|
||||||
const bNodeTree *group = (bNodeTree *)node->id;
|
const bNodeTree *group = (bNodeTree *)node->id;
|
||||||
if (group != nullptr && handled_groups.add(group)) {
|
if (group != nullptr && handled_groups.add(group)) {
|
||||||
find_used_ids_from_nodes(*group, ids);
|
find_used_ids_from_nodes(*group, ids);
|
||||||
|
@@ -20,11 +20,14 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "BKE_node.h"
|
||||||
|
|
||||||
extern struct bNodeTreeType *ntreeType_Geometry;
|
extern struct bNodeTreeType *ntreeType_Geometry;
|
||||||
|
|
||||||
void register_node_tree_type_geo(void);
|
void register_node_tree_type_geo(void);
|
||||||
|
|
||||||
void register_node_type_geo_group(void);
|
void register_node_type_geo_group(void);
|
||||||
|
void register_node_type_geo_custom_group(bNodeType *ntype);
|
||||||
|
|
||||||
void register_node_type_geo_align_rotation_to_vector(void);
|
void register_node_type_geo_align_rotation_to_vector(void);
|
||||||
void register_node_type_geo_attribute_clamp(void);
|
void register_node_type_geo_attribute_clamp(void);
|
||||||
|
@@ -528,7 +528,7 @@ inline bool NodeRef::is_reroute_node() const
|
|||||||
|
|
||||||
inline bool NodeRef::is_group_node() const
|
inline bool NodeRef::is_group_node() const
|
||||||
{
|
{
|
||||||
return bnode_->type == NODE_GROUP;
|
return bnode_->type == NODE_GROUP || bnode_->type == NODE_CUSTOM_GROUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool NodeRef::is_group_input_node() const
|
inline bool NodeRef::is_group_input_node() const
|
||||||
|
@@ -43,3 +43,17 @@ void register_node_type_geo_group(void)
|
|||||||
|
|
||||||
nodeRegisterType(&ntype);
|
nodeRegisterType(&ntype);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void register_node_type_geo_custom_group(bNodeType *ntype)
|
||||||
|
{
|
||||||
|
/* These methods can be overridden but need a default implementation otherwise. */
|
||||||
|
if (ntype->poll == nullptr) {
|
||||||
|
ntype->poll = geo_node_poll_default;
|
||||||
|
}
|
||||||
|
if (ntype->insert_link == nullptr) {
|
||||||
|
ntype->insert_link = node_insert_link_default;
|
||||||
|
}
|
||||||
|
if (ntype->update_internal_links == nullptr) {
|
||||||
|
ntype->update_internal_links = node_update_internal_links_default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user