diff options
author | Jacques Lucke <jacques@blender.org> | 2021-09-28 16:52:04 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-09-28 16:52:31 +0300 |
commit | d2004326a1f96f85cb1b6f7c57712de8998ecca0 (patch) | |
tree | 777d4a0183281111f301c4ae08f97fe934203009 | |
parent | 3e78c9e5bb179e84d542bc698fc6f6d7c111d1e1 (diff) |
Geometry Nodes: remove empty mesh component in distribute node output
3 files changed, 18 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index f6a58e57298..4954b1d5ab2 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -281,6 +281,8 @@ struct GeometrySet { return this->remove(Component::static_type); } + void keep_only(const blender::Span<GeometryComponentType> component_types); + void add(const GeometryComponent &component); blender::Vector<const GeometryComponent *> get_components_for_read() const; diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc index e8e2f64d6e1..400e0fda518 100644 --- a/source/blender/blenkernel/intern/geometry_set.cc +++ b/source/blender/blenkernel/intern/geometry_set.cc @@ -152,6 +152,19 @@ void GeometrySet::remove(const GeometryComponentType component_type) components_.remove(component_type); } +/** + * Remove all geometry components with types that are not in the provided list. + */ +void GeometrySet::keep_only(const blender::Span<GeometryComponentType> component_types) +{ + for (auto it = components_.keys().begin(); it != components_.keys().end(); ++it) { + const GeometryComponentType type = *it; + if (!component_types.contains(type)) { + components_.remove(it); + } + } +} + void GeometrySet::add(const GeometryComponent &component) { BLI_assert(!components_.contains(component.type())); diff --git a/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc b/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc index 3f2541dcded..f27544cbdda 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc @@ -523,8 +523,6 @@ static void point_distribution_calculate(GeometrySet &geometry_set, compute_attribute_outputs( mesh_component, point_component, bary_coords, looptri_indices, attribute_outputs); - - geometry_set.replace_mesh(nullptr); } static void geo_node_point_distribute_points_on_faces_exec(GeoNodeExecParams params) @@ -551,6 +549,9 @@ static void geo_node_point_distribute_points_on_faces_exec(GeoNodeExecParams par geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { point_distribution_calculate( geometry_set, selection_field, method, seed, attribute_outputs, params); + /* Keep instances because the original geometry set may contain instances that are processed as + * well. */ + geometry_set.keep_only({GEO_COMPONENT_TYPE_POINT_CLOUD, GEO_COMPONENT_TYPE_INSTANCES}); }); params.set_output("Points", std::move(geometry_set)); |