[Bf-blender-cvs] [ed4b2ba75a4] master: Geometry Nodes: Separate Components Node

Johnny Matthews noreply at git.blender.org
Wed Jun 16 05:32:53 CEST 2021


Commit: ed4b2ba75a47a01543b0e28d911a78a124775423
Author: Johnny Matthews
Date:   Tue Jun 15 22:31:57 2021 -0500
Branches: master
https://developer.blender.org/rBed4b2ba75a47a01543b0e28d911a78a124775423

Geometry Nodes: Separate Components Node

Implementation of T86970. This node takes a geometry input with
multiple components and outputs them by component type. Meshes,
Curves, and Point Clouds support combining multiple input instances,
while volumes will only output the first volume component input until
suitable instance realization for multiple volumes is finished.

When direct geometry instancing is implemented it will be possible to
avoid realizing instances in this node.

Differential Revision: https://developer.blender.org/D11577

===================================================================

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/geometry_set_instances.cc
M	source/blender/blenkernel/intern/node.cc
M	source/blender/nodes/CMakeLists.txt
M	source/blender/nodes/NOD_geometry.h
M	source/blender/nodes/NOD_static_types.h
A	source/blender/nodes/geometry/nodes/node_geo_separate_components.cc

===================================================================

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 7843304029c..fe788c2575d 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -514,6 +514,7 @@ geometry_node_categories = [
         NodeItem("GeometryNodeDeleteGeometry"),
         NodeItem("GeometryNodeTransform"),
         NodeItem("GeometryNodeJoinGeometry"),
+        NodeItem("GeometryNodeSeparateComponents"),
     ]),
     GeometryNodeCategory("GEO_INPUT", "Input", items=[
         NodeItem("GeometryNodeObjectInfo"),
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index dbb0786af9d..5c9d7881093 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1436,6 +1436,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_CONVEX_HULL 1056
 #define GEO_NODE_CURVE_TO_POINTS 1057
 #define GEO_NODE_CURVE_REVERSE 1058
+#define GEO_NODE_SEPARATE_COMPONENTS 1059
 
 /** \} */
 
diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc
index 847df75c8cb..97801c52cc9 100644
--- a/source/blender/blenkernel/intern/geometry_set_instances.cc
+++ b/source/blender/blenkernel/intern/geometry_set_instances.cc
@@ -650,9 +650,16 @@ static void join_instance_groups_pointcloud(Span<GeometryInstanceGroup> set_grou
 static void join_instance_groups_volume(Span<GeometryInstanceGroup> set_groups,
                                         GeometrySet &result)
 {
-  /* Not yet supported. Joining volume grids with the same name requires resampling of at least
-   * one of the grids. The cell size of the resulting volume has to be determined somehow. */
-  UNUSED_VARS(set_groups, result);
+  /* Not yet supported; for now only return the first volume. Joining volume grids with the same
+   * name requires resampling of at least one of the grids. The cell size of the resulting volume
+   * has to be determined somehow. */
+  for (const GeometryInstanceGroup &set_group : set_groups) {
+    const GeometrySet &set = set_group.geometry_set;
+    if (set.has<VolumeComponent>()) {
+      result.add(*set.get_component_for_read<VolumeComponent>());
+      return;
+    }
+  }
 }
 
 static void join_instance_groups_curve(Span<GeometryInstanceGroup> set_groups, GeometrySet &result)
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index c247b808a4a..d8682473124 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5084,6 +5084,7 @@ static void registerGeometryNodes()
   register_node_type_geo_points_to_volume();
   register_node_type_geo_sample_texture();
   register_node_type_geo_select_by_material();
+  register_node_type_geo_separate_components();
   register_node_type_geo_subdivide();
   register_node_type_geo_subdivision_surface();
   register_node_type_geo_switch();
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 9d7c50c99cd..edf471d2ad9 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -193,6 +193,7 @@ set(SRC
   geometry/nodes/node_geo_point_translate.cc
   geometry/nodes/node_geo_points_to_volume.cc
   geometry/nodes/node_geo_select_by_material.cc
+  geometry/nodes/node_geo_separate_components.cc
   geometry/nodes/node_geo_subdivide.cc
   geometry/nodes/node_geo_subdivision_surface.cc
   geometry/nodes/node_geo_switch.cc
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index eb3867af155..afb797614e4 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -82,6 +82,7 @@ void register_node_type_geo_point_translate(void);
 void register_node_type_geo_points_to_volume(void);
 void register_node_type_geo_sample_texture(void);
 void register_node_type_geo_select_by_material(void);
+void register_node_type_geo_separate_components(void);
 void register_node_type_geo_subdivide(void);
 void register_node_type_geo_subdivision_surface(void);
 void register_node_type_geo_switch(void);
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index 8ae1fab87ff..0a8c912be04 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -320,6 +320,7 @@ DefNode(GeometryNode, GEO_NODE_POINT_SEPARATE, 0, "POINT_SEPARATE", PointSeparat
 DefNode(GeometryNode, GEO_NODE_POINT_TRANSLATE, def_geo_point_translate, "POINT_TRANSLATE", PointTranslate, "Point Translate", "")
 DefNode(GeometryNode, GEO_NODE_POINTS_TO_VOLUME, def_geo_points_to_volume, "POINTS_TO_VOLUME", PointsToVolume, "Points to Volume", "")
 DefNode(GeometryNode, GEO_NODE_SELECT_BY_MATERIAL, 0, "SELECT_BY_MATERIAL", SelectByMaterial, "Select by Material", "")
+DefNode(GeometryNode, GEO_NODE_SEPARATE_COMPONENTS, 0, "SEPARATE_COMPONENTS", SeparateComponents, "Separate Components", "")
 DefNode(GeometryNode, GEO_NODE_SUBDIVIDE, 0, "SUBDIVIDE", Subdivide, "Subdivide", "")
 DefNode(GeometryNode, GEO_NODE_SUBDIVISION_SURFACE, 0, "SUBDIVISION_SURFACE", SubdivisionSurface, "Subdivision Surface", "")
 DefNode(GeometryNode, GEO_NODE_SWITCH, def_geo_switch, "SWITCH", Switch, "Switch", "")
diff --git a/source/blender/nodes/geometry/nodes/node_geo_separate_components.cc b/source/blender/nodes/geometry/nodes/node_geo_separate_components.cc
new file mode 100644
index 00000000000..bdc3e56783c
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_separate_components.cc
@@ -0,0 +1,77 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "node_geometry_util.hh"
+
+static bNodeSocketTemplate geo_node_join_geometry_in[]{
+    {SOCK_GEOMETRY, N_("Geometry")},
+    {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_join_geometry_out[]{
+    {SOCK_GEOMETRY, N_("Mesh")},
+    {SOCK_GEOMETRY, N_("Point Cloud")},
+    {SOCK_GEOMETRY, N_("Curve")},
+    {SOCK_GEOMETRY, N_("Volume")},
+    {-1, ""},
+};
+
+namespace blender::nodes {
+
+static void geo_node_separate_components_exec(GeoNodeExecParams params)
+{
+  GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+
+  /* Note that it will be possible to skip realizing instances here when instancing
+   * geometry directly is supported by creating corresponding geometry instances. */
+  geometry_set = bke::geometry_set_realize_instances(geometry_set);
+
+  GeometrySet meshes;
+  GeometrySet point_clouds;
+  GeometrySet volumes;
+  GeometrySet curves;
+
+  if (geometry_set.has<MeshComponent>()) {
+    meshes.add(*geometry_set.get_component_for_read<MeshComponent>());
+  }
+  if (geometry_set.has<PointCloudComponent>()) {
+    point_clouds.add(*geometry_set.get_component_for_read<PointCloudComponent>());
+  }
+  if (geometry_set.has<CurveComponent>()) {
+    curves.add(*geometry_set.get_component_for_read<CurveComponent>());
+  }
+  if (geometry_set.has<VolumeComponent>()) {
+    volumes.add(*geometry_set.get_component_for_read<VolumeComponent>());
+  }
+
+  params.set_output("Mesh", meshes);
+  params.set_output("Point Cloud", point_clouds);
+  params.set_output("Curve", curves);
+  params.set_output("Volume", volumes);
+}
+
+}  // namespace blender::nodes
+
+void register_node_type_geo_separate_components()
+{
+  static bNodeType ntype;
+
+  geo_node_type_base(
+      &ntype, GEO_NODE_SEPARATE_COMPONENTS, "Separate Components", NODE_CLASS_GEOMETRY, 0);
+  node_type_socket_templates(&ntype, geo_node_join_geometry_in, geo_node_join_geometry_out);
+  ntype.geometry_node_execute = blender::nodes::geo_node_separate_components_exec;
+  nodeRegisterType(&ntype);
+}



More information about the Bf-blender-cvs mailing list