[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