[Bf-blender-cvs] [4eda4fd49ab] temp-geometry-nodes-fields-prototype: support field in point separate node

Jacques Lucke noreply at git.blender.org
Mon Aug 9 09:50:20 CEST 2021


Commit: 4eda4fd49ab75eb1c73b83a28393fb3cb2d0c3a0
Author: Jacques Lucke
Date:   Mon Aug 9 09:49:53 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rB4eda4fd49ab75eb1c73b83a28393fb3cb2d0c3a0

support field in point separate node

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

M	source/blender/nodes/geometry/nodes/node_geo_point_separate.cc

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc
index fc04d1e275f..64a31454053 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc
@@ -25,7 +25,7 @@
 
 static bNodeSocketTemplate geo_node_point_instance_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
-    {SOCK_STRING, N_("Mask")},
+    {SOCK_BOOLEAN, N_("Mask"), 1, 0, 0, 0, 0, 0, PROP_NONE, SOCK_HIDE_VALUE | SOCK_FIELD},
     {-1, ""},
 };
 
@@ -99,17 +99,20 @@ static void create_component_points(GeometryComponent &component, const int tota
 
 static void separate_points_from_component(const GeometryComponent &in_component,
                                            GeometryComponent &out_component,
-                                           const StringRef mask_name,
+                                           const bke::FieldRef<bool> mask_field,
                                            const bool invert)
 {
   if (!in_component.attribute_domain_supported(ATTR_DOMAIN_POINT) ||
       in_component.attribute_domain_size(ATTR_DOMAIN_POINT) == 0) {
     return;
   }
+  const int tot_in_points = in_component.attribute_domain_size(ATTR_DOMAIN_POINT);
 
-  const GVArray_Typed<bool> mask_attribute = in_component.attribute_get_for_read<bool>(
-      mask_name, ATTR_DOMAIN_POINT, false);
-  VArray_Span<bool> masks{mask_attribute};
+  bke::FieldInputs field_inputs = mask_field->prepare_inputs();
+  Vector<std::unique_ptr<bke::FieldInputValue>> field_input_values;
+  prepare_field_inputs(field_inputs, in_component, ATTR_DOMAIN_POINT, field_input_values);
+  bke::FieldOutput field_output = mask_field->evaluate(IndexRange(tot_in_points), field_inputs);
+  GVArray_Span<bool> masks{field_output.varray_ref()};
 
   const int total = masks.count(!invert);
   if (total == 0) {
@@ -122,7 +125,7 @@ static void separate_points_from_component(const GeometryComponent &in_component
 }
 
 static GeometrySet separate_geometry_set(const GeometrySet &set_in,
-                                         const StringRef mask_name,
+                                         const bke::FieldRef<bool> mask_field,
                                          const bool invert)
 {
   GeometrySet set_out;
@@ -132,7 +135,7 @@ static GeometrySet separate_geometry_set(const GeometrySet &set_in,
       continue;
     }
     GeometryComponent &out_component = set_out.get_component_for_write(component->type());
-    separate_points_from_component(*component, out_component, mask_name, invert);
+    separate_points_from_component(*component, out_component, mask_field, invert);
   }
   return set_out;
 }
@@ -145,7 +148,7 @@ static void geo_node_point_separate_exec(GeoNodeExecParams params)
   if (wait_for_inputs) {
     return;
   }
-  const std::string mask_attribute_name = params.get_input<std::string>("Mask");
+  bke::FieldRef<bool> mask_field = params.get_input_field<bool>("Mask");
   GeometrySet geometry_set = params.get_input<GeometrySet>("Geometry");
 
   /* TODO: This is not necessary-- the input geometry set can be read only,
@@ -153,12 +156,10 @@ static void geo_node_point_separate_exec(GeoNodeExecParams params)
   geometry_set = geometry_set_realize_instances(geometry_set);
 
   if (params.lazy_output_is_required("Geometry 1")) {
-    params.set_output("Geometry 1",
-                      separate_geometry_set(geometry_set, mask_attribute_name, true));
+    params.set_output("Geometry 1", separate_geometry_set(geometry_set, mask_field, true));
   }
   if (params.lazy_output_is_required("Geometry 2")) {
-    params.set_output("Geometry 2",
-                      separate_geometry_set(geometry_set, mask_attribute_name, false));
+    params.set_output("Geometry 2", separate_geometry_set(geometry_set, mask_field, false));
   }
 }



More information about the Bf-blender-cvs mailing list