Geometry Nodes: remove empty mesh component in distribute node output
This commit is contained in:
parent
3e78c9e5bb
commit
d2004326a1
|
@ -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;
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue