[Bf-blender-cvs] [7be52f69850] temp-geometry-nodes-fields-prototype-visualization: field state inferencing
Jacques Lucke
noreply at git.blender.org
Tue Aug 24 13:41:26 CEST 2021
Commit: 7be52f69850b361c41c54c2d6afa62ef83a3db3d
Author: Jacques Lucke
Date: Tue Aug 24 13:16:24 2021 +0200
Branches: temp-geometry-nodes-fields-prototype-visualization
https://developer.blender.org/rB7be52f69850b361c41c54c2d6afa62ef83a3db3d
field state inferencing
===================================================================
M source/blender/editors/space_node/node_draw.cc
M source/blender/nodes/geometry/nodes/node_geo_attribute_freeze.cc
M source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
===================================================================
diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc
index 9d6098fbb10..23169809fc7 100644
--- a/source/blender/editors/space_node/node_draw.cc
+++ b/source/blender/editors/space_node/node_draw.cc
@@ -795,6 +795,64 @@ enum class SocketSingleState {
MaybeField,
};
+#define PRIMITIVE_SOCKETS SOCK_FLOAT, SOCK_VECTOR, SOCK_INT, SOCK_BOOLEAN, SOCK_RGBA
+
+static bool is_required_single(const bNodeTree *node_tree,
+ const bNode *node,
+ const bNodeSocket *socket)
+{
+ if (socket->flag & SOCK_ALWAYS_SINGLE) {
+ return true;
+ }
+ if (socket->in_out == SOCK_IN) {
+ LISTBASE_FOREACH (const bNodeSocket *, output, &node->outputs) {
+ if (ELEM(output->type, PRIMITIVE_SOCKETS)) {
+ if (is_required_single(node_tree, node, output)) {
+ return true;
+ }
+ }
+ }
+ }
+ else {
+ LISTBASE_FOREACH (const bNodeLink *, link, &node_tree->links) {
+ if (link->fromsock == socket) {
+ if (is_required_single(node_tree, link->tonode, link->tosock)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+static bool is_maybe_field(const bNodeTree *node_tree,
+ const bNode *node,
+ const bNodeSocket *socket)
+{
+ if (socket->flag & SOCK_ALWAYS_FIELD) {
+ return true;
+ }
+ if (socket->in_out == SOCK_IN) {
+ LISTBASE_FOREACH (const bNodeLink *, link, &node_tree->links) {
+ if (link->tosock == socket) {
+ if (is_maybe_field(node_tree, link->fromnode, link->fromsock)) {
+ return true;
+ }
+ }
+ }
+ }
+ else {
+ LISTBASE_FOREACH (const bNodeSocket *, input, &node->inputs) {
+ if (ELEM(input->type, PRIMITIVE_SOCKETS) && !(input->flag & SOCK_ALWAYS_SINGLE)) {
+ if (is_maybe_field(node_tree, node, input)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
static SocketSingleState get_socket_single_state(const bNodeTree *node_tree,
const bNode *node,
const bNodeSocket *socket)
@@ -805,12 +863,21 @@ static SocketSingleState get_socket_single_state(const bNodeTree *node_tree,
if (socket->type == -1) {
return SocketSingleState::MaybeField;
}
- if (!ELEM(socket->type, SOCK_FLOAT, SOCK_VECTOR, SOCK_INT, SOCK_BOOLEAN, SOCK_RGBA)) {
+ if (socket->flag & SOCK_ALWAYS_SINGLE) {
return SocketSingleState::RequiredSingle;
}
- if (socket->flag & SOCK_ALWAYS_SINGLE) {
+ if (socket->flag & SOCK_ALWAYS_FIELD) {
+ return SocketSingleState::MaybeField;
+ }
+ if (!ELEM(socket->type, PRIMITIVE_SOCKETS)) {
+ return SocketSingleState::RequiredSingle;
+ }
+ if (is_required_single(node_tree, node, socket)) {
return SocketSingleState::RequiredSingle;
}
+ if (is_maybe_field(node_tree, node, socket)) {
+ return SocketSingleState::MaybeField;
+ }
return SocketSingleState::CurrentlySingle;
}
@@ -1460,6 +1527,9 @@ void node_draw_sockets(const View2D *v2d,
}
LISTBASE_FOREACH (bNodeSocket *, socket, &node->outputs) {
+ if (nodeSocketIsHidden(socket)) {
+ continue;
+ }
const SocketSingleState single_state = get_socket_single_state(ntree, node, socket);
if (ELEM(
single_state, SocketSingleState::CurrentlySingle, SocketSingleState::RequiredSingle)) {
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_freeze.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_freeze.cc
index 644edcb5935..32334921094 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_freeze.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_freeze.cc
@@ -33,11 +33,56 @@ static bNodeSocketTemplate geo_node_attribute_freeze_in[] = {
static bNodeSocketTemplate geo_node_attribute_freeze_out[] = {
{SOCK_GEOMETRY, N_("Geometry")},
- {SOCK_VECTOR, N_("Attribute"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX, SOCK_ALWAYS_FIELD},
- {SOCK_FLOAT, N_("Attribute"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX, SOCK_ALWAYS_FIELD},
- {SOCK_RGBA, N_("Attribute"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX, SOCK_ALWAYS_FIELD},
- {SOCK_BOOLEAN, N_("Attribute"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX, SOCK_ALWAYS_FIELD},
- {SOCK_INT, N_("Attribute"), 0, 0, 0, 0, -10000000.0f, 10000000.0f, SOCK_ALWAYS_FIELD},
+ {SOCK_VECTOR,
+ N_("Attribute"),
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ -FLT_MAX,
+ FLT_MAX,
+ PROP_NONE,
+ SOCK_ALWAYS_FIELD},
+ {SOCK_FLOAT,
+ N_("Attribute"),
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ -FLT_MAX,
+ FLT_MAX,
+ PROP_NONE,
+ SOCK_ALWAYS_FIELD},
+ {SOCK_RGBA,
+ N_("Attribute"),
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ -FLT_MAX,
+ FLT_MAX,
+ PROP_NONE,
+ SOCK_ALWAYS_FIELD},
+ {SOCK_BOOLEAN,
+ N_("Attribute"),
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ -FLT_MAX,
+ FLT_MAX,
+ PROP_NONE,
+ SOCK_ALWAYS_FIELD},
+ {SOCK_INT,
+ N_("Attribute"),
+ 0,
+ 0,
+ 0,
+ 0,
+ -10000000.0f,
+ 10000000.0f,
+ PROP_NONE,
+ SOCK_ALWAYS_FIELD},
{-1, ""},
};
diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
index 7525adc52e4..1950f79da4d 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
@@ -58,9 +58,9 @@ static bNodeSocketTemplate geo_node_point_distribute_in[] = {
static bNodeSocketTemplate geo_node_point_distribute_out[] = {
{SOCK_GEOMETRY, N_("Geometry")},
- {SOCK_VECTOR, N_("Rotation")},
- {SOCK_VECTOR, N_("Normal")},
- {SOCK_INT, N_("ID")},
+ {SOCK_VECTOR, N_("Rotation"), 0, 0, 0, 0, 0, 0, PROP_NONE, SOCK_ALWAYS_FIELD},
+ {SOCK_VECTOR, N_("Normal"), 0, 0, 0, 0, 0, 0, PROP_NONE, SOCK_ALWAYS_FIELD},
+ {SOCK_INT, N_("ID"), 0, 0, 0, 0, 0, 0, PROP_NONE, SOCK_ALWAYS_FIELD},
{-1, ""},
};
More information about the Bf-blender-cvs
mailing list