Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_instances_to_points.cc
| Show First 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | static void convert_instances_to_points(GeometrySet &geometry_set, | ||||
| Field<float> radius_field, | Field<float> radius_field, | ||||
| const Field<bool> selection_field) | const Field<bool> selection_field) | ||||
| { | { | ||||
| const InstancesComponent &instances = *geometry_set.get_component_for_read<InstancesComponent>(); | const InstancesComponent &instances = *geometry_set.get_component_for_read<InstancesComponent>(); | ||||
| GeometryComponentFieldContext field_context{instances, ATTR_DOMAIN_INSTANCE}; | GeometryComponentFieldContext field_context{instances, ATTR_DOMAIN_INSTANCE}; | ||||
| const int domain_size = instances.attribute_domain_size(ATTR_DOMAIN_INSTANCE); | const int domain_size = instances.attribute_domain_size(ATTR_DOMAIN_INSTANCE); | ||||
| fn::FieldEvaluator selection_evaluator{field_context, domain_size}; | fn::FieldEvaluator evaluator{field_context, domain_size}; | ||||
| selection_evaluator.add(std::move(selection_field)); | evaluator.set_selection(std::move(selection_field)); | ||||
| selection_evaluator.evaluate(); | evaluator.add(std::move(position_field)); | ||||
| const IndexMask selection = selection_evaluator.get_evaluated_as_mask(0); | evaluator.add(std::move(radius_field)); | ||||
| evaluator.evaluate(); | |||||
| const IndexMask selection = evaluator.get_evaluated_selection_as_mask(); | |||||
| if (selection.is_empty()) { | if (selection.is_empty()) { | ||||
| return; | return; | ||||
| } | } | ||||
| PointCloud *pointcloud = BKE_pointcloud_new_nomain(selection.size()); | PointCloud *pointcloud = BKE_pointcloud_new_nomain(selection.size()); | ||||
| geometry_set.replace_pointcloud(pointcloud); | geometry_set.replace_pointcloud(pointcloud); | ||||
| PointCloudComponent &points = geometry_set.get_component_for_write<PointCloudComponent>(); | PointCloudComponent &points = geometry_set.get_component_for_write<PointCloudComponent>(); | ||||
| fn::FieldEvaluator evaluator{field_context, &selection}; | |||||
| evaluator.add(std::move(position_field)); | |||||
| evaluator.add(std::move(radius_field)); | |||||
| evaluator.evaluate(); | |||||
| const VArray<float3> &positions = evaluator.get_evaluated<float3>(0); | const VArray<float3> &positions = evaluator.get_evaluated<float3>(0); | ||||
| copy_attribute_to_points(positions, selection, {(float3 *)pointcloud->co, pointcloud->totpoint}); | copy_attribute_to_points(positions, selection, {(float3 *)pointcloud->co, pointcloud->totpoint}); | ||||
| const VArray<float> &radii = evaluator.get_evaluated<float>(1); | const VArray<float> &radii = evaluator.get_evaluated<float>(1); | ||||
| copy_attribute_to_points(radii, selection, {pointcloud->radius, pointcloud->totpoint}); | copy_attribute_to_points(radii, selection, {pointcloud->radius, pointcloud->totpoint}); | ||||
| Map<AttributeIDRef, AttributeKind> attributes_to_propagate; | Map<AttributeIDRef, AttributeKind> attributes_to_propagate; | ||||
| geometry_set.gather_attributes_for_propagation({GEO_COMPONENT_TYPE_INSTANCES}, | geometry_set.gather_attributes_for_propagation({GEO_COMPONENT_TYPE_INSTANCES}, | ||||
| GEO_COMPONENT_TYPE_POINT_CLOUD, | GEO_COMPONENT_TYPE_POINT_CLOUD, | ||||
| ▲ Show 20 Lines • Show All 56 Lines • Show Last 20 Lines | |||||