Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Werner <stefan.werner@tangent-animation.com>2021-07-15 13:26:05 +0300
committerStefan Werner <stefan.werner@tangent-animation.com>2021-07-15 13:26:05 +0300
commit465fb31ed275618ec71e4925ab94bd4a9b077a12 (patch)
tree5366cd7a514f23fee7b0486f3deabb95a3b5ebd7 /source/blender/blenkernel/intern/node.cc
parent0a2c10e4f0c76fa9e7207b8519bc4020dfd40dd7 (diff)
parentd5e626b24309b85eb2123bf76d4b8dfc2c728472 (diff)
Merge branch 'master' into cycles_texture_cache
Diffstat (limited to 'source/blender/blenkernel/intern/node.cc')
-rw-r--r--source/blender/blenkernel/intern/node.cc152
1 files changed, 115 insertions, 37 deletions
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index a0e444186f2..633ec1707f9 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -69,7 +69,6 @@
#include "BKE_lib_query.h"
#include "BKE_main.h"
#include "BKE_node.h"
-#include "BKE_node_ui_storage.hh"
#include "BLI_ghash.h"
#include "BLI_threads.h"
@@ -220,10 +219,6 @@ static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, c
/* node tree will generate its own interface type */
ntree_dst->interface_type = nullptr;
-
- /* Don't copy error messages in the runtime struct.
- * They should be filled during execution anyway. */
- ntree_dst->ui_storage = nullptr;
}
static void ntree_free_data(ID *id)
@@ -277,8 +272,6 @@ static void ntree_free_data(ID *id)
if (ntree->id.tag & LIB_TAG_LOCALIZED) {
BKE_libblock_free_data(&ntree->id, true);
}
-
- delete ntree->ui_storage;
}
static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket *sock)
@@ -364,7 +357,7 @@ static void node_foreach_cache(ID *id,
key.offset_in_ID = offsetof(bNodeTree, previews);
key.cache_v = nodetree->previews;
- /* TODO, see also `direct_link_nodetree()` in readfile.c. */
+ /* TODO: see also `direct_link_nodetree()` in readfile.c. */
#if 0
function_callback(id, &key, (void **)&nodetree->previews, 0, user_data);
#endif
@@ -406,7 +399,7 @@ static ID *node_owner_get(Main *bmain, ID *id)
}
}
- BLI_assert(!"Embedded node tree with no owner. Critical Main inconsistency.");
+ BLI_assert_msg(0, "Embedded node tree with no owner. Critical Main inconsistency.");
return nullptr;
}
@@ -513,7 +506,7 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree)
if (node->storage) {
/* could be handlerized at some point, now only 1 exception still */
- if ((ntree->type == NTREE_SHADER) &&
+ if ((ELEM(ntree->type, NTREE_SHADER, NTREE_GEOMETRY)) &&
ELEM(node->type, SH_NODE_CURVE_VEC, SH_NODE_CURVE_RGB)) {
BKE_curvemapping_blend_write(writer, (const CurveMapping *)node->storage);
}
@@ -621,7 +614,6 @@ static void ntree_blend_write(BlendWriter *writer, ID *id, const void *id_addres
ntree->interface_type = nullptr;
ntree->progress = nullptr;
ntree->execdata = nullptr;
- ntree->ui_storage = nullptr;
BLO_write_id_struct(writer, bNodeTree, id_address, &ntree->id);
@@ -645,7 +637,7 @@ static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock)
/* ntree itself has been read! */
void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree)
{
- /* note: writing and reading goes in sync, for speed */
+ /* NOTE: writing and reading goes in sync, for speed. */
ntree->init = 0; /* to set callbacks and force setting types */
ntree->is_updating = false;
ntree->typeinfo = nullptr;
@@ -653,7 +645,6 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree)
ntree->progress = nullptr;
ntree->execdata = nullptr;
- ntree->ui_storage = nullptr;
BLO_read_data_address(reader, &ntree->adt);
BKE_animdata_blend_read_data(reader, ntree->adt);
@@ -796,7 +787,7 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree)
BLO_read_data_address(reader, &link->tosock);
}
- /* TODO, should be dealt by new generic cache handling of IDs... */
+ /* TODO: should be dealt by new generic cache handling of IDs... */
ntree->previews = nullptr;
/* type verification is in lib-link */
@@ -875,7 +866,7 @@ void ntreeBlendReadLib(struct BlendLibReader *reader, struct bNodeTree *ntree)
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
/* Link ID Properties -- and copy this comment EXACTLY for easy finding
- * of library blocks that implement this.*/
+ * of library blocks that implement this. */
IDP_BlendReadLib(reader, node->prop);
BLO_read_id_address(reader, lib, &node->id);
@@ -1042,7 +1033,7 @@ static void node_add_sockets_from_type(bNodeTree *ntree, bNode *node, bNodeType
}
}
-/* Note: This function is called to initialize node data based on the type.
+/* NOTE: This function is called to initialize node data based on the type.
* The bNodeType may not be registered at creation time of the node,
* so this can be delayed until the node type gets registered.
*/
@@ -1064,7 +1055,7 @@ static void node_init(const struct bContext *C, bNodeTree *ntree, bNode *node)
node->height = ntype->height;
node->color[0] = node->color[1] = node->color[2] = 0.608; /* default theme color */
/* initialize the node name with the node label.
- * note: do this after the initfunc so nodes get their data set which may be used in naming
+ * NOTE: do this after the initfunc so nodes get their data set which may be used in naming
* (node groups for example) */
/* XXX Do not use nodeLabel() here, it returns translated content for UI,
* which should *only* be used in UI, *never* in data...
@@ -1425,6 +1416,12 @@ GHashIterator *nodeSocketTypeGetIterator(void)
return BLI_ghashIterator_new(nodesockettypes_hash);
}
+const char *nodeSocketTypeLabel(const bNodeSocketType *stype)
+{
+ /* Use socket type name as a fallback if label is undefined. */
+ return stype->label[0] != '\0' ? stype->label : RNA_struct_ui_name(stype->ext_socket.srna);
+}
+
struct bNodeSocket *nodeFindSocket(const bNode *node,
eNodeSocketInOut in_out,
const char *identifier)
@@ -1585,13 +1582,15 @@ static void socket_id_user_decrement(bNodeSocket *sock)
}
}
-void nodeModifySocketType(
- bNodeTree *ntree, bNode *UNUSED(node), bNodeSocket *sock, int type, int subtype)
+void nodeModifySocketType(bNodeTree *ntree,
+ bNode *UNUSED(node),
+ bNodeSocket *sock,
+ const char *idname)
{
- const char *idname = nodeStaticSocketType(type, subtype);
+ bNodeSocketType *socktype = nodeSocketTypeFind(idname);
- if (!idname) {
- CLOG_ERROR(&LOG, "static node socket type %d undefined", type);
+ if (!socktype) {
+ CLOG_ERROR(&LOG, "node socket type %s undefined", idname);
return;
}
@@ -1601,9 +1600,21 @@ void nodeModifySocketType(
sock->default_value = nullptr;
}
- sock->type = type;
BLI_strncpy(sock->idname, idname, sizeof(sock->idname));
- node_socket_set_typeinfo(ntree, sock, nodeSocketTypeFind(idname));
+ node_socket_set_typeinfo(ntree, sock, socktype);
+}
+
+void nodeModifySocketTypeStatic(
+ bNodeTree *ntree, bNode *node, bNodeSocket *sock, int type, int subtype)
+{
+ const char *idname = nodeStaticSocketType(type, subtype);
+
+ if (!idname) {
+ CLOG_ERROR(&LOG, "static node socket type %d undefined", type);
+ return;
+ }
+
+ nodeModifySocketType(ntree, node, sock, idname);
}
bNodeSocket *nodeAddSocket(bNodeTree *ntree,
@@ -1647,6 +1658,15 @@ bNodeSocket *nodeInsertSocket(bNodeTree *ntree,
return sock;
}
+bool nodeIsStaticSocketType(const struct bNodeSocketType *stype)
+{
+ /*
+ * Cannot rely on type==SOCK_CUSTOM here, because type is 0 by default
+ * and can be changed on custom sockets.
+ */
+ return RNA_struct_is_a(stype->ext_socket.srna, &RNA_NodeSocketStandard);
+}
+
const char *nodeStaticSocketType(int type, int subtype)
{
switch (type) {
@@ -1662,6 +1682,8 @@ const char *nodeStaticSocketType(int type, int subtype)
return "NodeSocketFloatAngle";
case PROP_TIME:
return "NodeSocketFloatTime";
+ case PROP_TIME_ABSOLUTE:
+ return "NodeSocketFloatTimeAbsolute";
case PROP_DISTANCE:
return "NodeSocketFloatDistance";
case PROP_NONE:
@@ -1737,6 +1759,8 @@ const char *nodeStaticSocketInterfaceType(int type, int subtype)
return "NodeSocketInterfaceFloatAngle";
case PROP_TIME:
return "NodeSocketInterfaceFloatTime";
+ case PROP_TIME_ABSOLUTE:
+ return "NodeSocketInterfaceFloatTimeAbsolute";
case PROP_DISTANCE:
return "NodeSocketInterfaceFloatDistance";
case PROP_NONE:
@@ -1797,6 +1821,39 @@ const char *nodeStaticSocketInterfaceType(int type, int subtype)
return nullptr;
}
+const char *nodeStaticSocketLabel(int type, int UNUSED(subtype))
+{
+ switch (type) {
+ case SOCK_FLOAT:
+ return "Float";
+ case SOCK_INT:
+ return "Integer";
+ case SOCK_BOOLEAN:
+ return "Boolean";
+ case SOCK_VECTOR:
+ return "Vector";
+ case SOCK_RGBA:
+ return "Color";
+ case SOCK_STRING:
+ return "String";
+ case SOCK_SHADER:
+ return "Shader";
+ case SOCK_OBJECT:
+ return "Object";
+ case SOCK_IMAGE:
+ return "Image";
+ case SOCK_GEOMETRY:
+ return "Geometry";
+ case SOCK_COLLECTION:
+ return "Collection";
+ case SOCK_TEXTURE:
+ return "Texture";
+ case SOCK_MATERIAL:
+ return "Material";
+ }
+ return nullptr;
+}
+
bNodeSocket *nodeAddStaticSocket(bNodeTree *ntree,
bNode *node,
eNodeSocketInOut in_out,
@@ -2361,7 +2418,7 @@ static void nodeUnMuteLink(bNodeLink *link)
link->tosock->flag |= SOCK_IN_USE;
}
-/* Upstream muting. Always happens when unmuting but checks when muting. O(n^2) algorithm.*/
+/* Upstream muting. Always happens when unmuting but checks when muting. O(n^2) algorithm. */
static void nodeMuteRerouteInputLinks(bNodeTree *ntree, bNode *node, const bool mute)
{
if (node->type != NODE_REROUTE) {
@@ -2384,7 +2441,7 @@ static void nodeMuteRerouteInputLinks(bNodeTree *ntree, bNode *node, const bool
}
}
-/* Downstream muting propagates when reaching reroute nodes. O(n^2) algorithm.*/
+/* Downstream muting propagates when reaching reroute nodes. O(n^2) algorithm. */
static void nodeMuteRerouteOutputLinks(bNodeTree *ntree, bNode *node, const bool mute)
{
if (node->type != NODE_REROUTE) {
@@ -2879,7 +2936,7 @@ void BKE_node_preview_merge_tree(bNodeTree *to_ntree, bNodeTree *from_ntree, boo
BKE_node_instance_hash_insert(to_ntree->previews, key, preview);
}
- /* Note: null free function here,
+ /* NOTE: null free function here,
* because pointers have already been moved over to to_ntree->previews! */
BKE_node_instance_hash_free(from_ntree->previews, nullptr);
from_ntree->previews = nullptr;
@@ -3147,8 +3204,8 @@ void ntreeSetOutput(bNodeTree *ntree)
if (ntree->type == NTREE_COMPOSIT) {
/* same type, exception for viewer */
if (tnode->type == node->type ||
- (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
- ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) {
+ (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER, GEO_NODE_VIEWER) &&
+ ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER, GEO_NODE_VIEWER))) {
if (tnode->flag & NODE_DO_OUTPUT) {
output++;
if (output > 1) {
@@ -3270,7 +3327,7 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
{
if (ntree) {
/* Make full copy outside of Main database.
- * Note: previews are not copied here.
+ * NOTE: previews are not copied here.
*/
bNodeTree *ltree = (bNodeTree *)BKE_id_copy_ex(
nullptr, &ntree->id, nullptr, (LIB_ID_COPY_LOCALIZE | LIB_ID_COPY_NO_ANIMDATA));
@@ -3338,8 +3395,6 @@ static bNodeSocket *make_socket_interface(bNodeTree *ntree,
const char *name)
{
bNodeSocketType *stype = nodeSocketTypeFind(idname);
- int own_index = ntree->cur_index++;
-
if (stype == nullptr) {
return nullptr;
}
@@ -3351,7 +3406,7 @@ static bNodeSocket *make_socket_interface(bNodeTree *ntree,
sock->type = SOCK_CUSTOM; /* int type undefined by default */
/* assign new unique index */
- own_index = ntree->cur_index++;
+ const int own_index = ntree->cur_index++;
/* use the own_index as socket identifier */
if (in_out == SOCK_IN) {
BLI_snprintf(sock->identifier, MAX_NAME, "Input_%d", own_index);
@@ -4749,7 +4804,7 @@ static bool node_undefined_poll(bNodeType *UNUSED(ntype),
/* register fallback types used for undefined tree, nodes, sockets */
static void register_undefined_types()
{
- /* Note: these types are not registered in the type hashes,
+ /* NOTE: these types are not registered in the type hashes,
* they are just used as placeholders in case the actual types are not registered.
*/
@@ -5042,19 +5097,36 @@ static void registerGeometryNodes()
register_node_type_geo_attribute_mix();
register_node_type_geo_attribute_proximity();
register_node_type_geo_attribute_randomize();
+ register_node_type_geo_attribute_remove();
register_node_type_geo_attribute_separate_xyz();
register_node_type_geo_attribute_transfer();
register_node_type_geo_attribute_vector_math();
register_node_type_geo_attribute_vector_rotate();
- register_node_type_geo_attribute_remove();
register_node_type_geo_boolean();
register_node_type_geo_bounding_box();
register_node_type_geo_collection_info();
- register_node_type_geo_curve_to_mesh();
+ register_node_type_geo_convex_hull();
+ register_node_type_geo_curve_endpoints();
+ register_node_type_geo_curve_length();
+ register_node_type_geo_curve_primitive_bezier_segment();
+ register_node_type_geo_curve_primitive_circle();
+ register_node_type_geo_curve_primitive_line();
+ register_node_type_geo_curve_primitive_quadratic_bezier();
+ register_node_type_geo_curve_primitive_quadrilateral();
+ register_node_type_geo_curve_primitive_spiral();
+ register_node_type_geo_curve_primitive_star();
register_node_type_geo_curve_resample();
+ register_node_type_geo_curve_reverse();
+ register_node_type_geo_curve_subdivide();
+ register_node_type_geo_curve_to_mesh();
+ register_node_type_geo_curve_to_points();
+ register_node_type_geo_delete_geometry();
register_node_type_geo_edge_split();
+ register_node_type_geo_input_material();
register_node_type_geo_is_viewport();
register_node_type_geo_join_geometry();
+ register_node_type_geo_material_assign();
+ register_node_type_geo_material_replace();
register_node_type_geo_mesh_primitive_circle();
register_node_type_geo_mesh_primitive_cone();
register_node_type_geo_mesh_primitive_cube();
@@ -5063,6 +5135,8 @@ static void registerGeometryNodes()
register_node_type_geo_mesh_primitive_ico_sphere();
register_node_type_geo_mesh_primitive_line();
register_node_type_geo_mesh_primitive_uv_sphere();
+ register_node_type_geo_mesh_subdivide();
+ register_node_type_geo_mesh_to_curve();
register_node_type_geo_object_info();
register_node_type_geo_point_distribute();
register_node_type_geo_point_instance();
@@ -5071,12 +5145,15 @@ static void registerGeometryNodes()
register_node_type_geo_point_separate();
register_node_type_geo_point_translate();
register_node_type_geo_points_to_volume();
+ register_node_type_geo_raycast();
register_node_type_geo_sample_texture();
- register_node_type_geo_subdivide();
+ register_node_type_geo_select_by_material();
+ register_node_type_geo_separate_components();
register_node_type_geo_subdivision_surface();
register_node_type_geo_switch();
register_node_type_geo_transform();
register_node_type_geo_triangulate();
+ register_node_type_geo_viewer();
register_node_type_geo_volume_to_mesh();
}
@@ -5084,6 +5161,7 @@ static void registerFunctionNodes()
{
register_node_type_fn_boolean_math();
register_node_type_fn_float_compare();
+ register_node_type_fn_float_to_int();
register_node_type_fn_input_string();
register_node_type_fn_input_vector();
register_node_type_fn_random_float();