38 for (
Base *base_src : bases) {
39 src_pointclouds.
add(
static_cast<PointCloud *
>(base_src->object->data));
45 for (const int i : range) {
46 IndexMaskMemory memory;
47 const IndexMask selection = retrieve_selected_points(*src_pointclouds[i], memory);
48 if (selection.is_empty()) {
49 dst_pointclouds[i] = nullptr;
52 dst_pointclouds[i] = copy_selection(*src_pointclouds[i], selection);
53 const IndexMask inverse = selection.complement(IndexRange(src_pointclouds[i]->totpoint),
55 BKE_pointcloud_nomain_to_pointcloud(copy_selection(*src_pointclouds[i], inverse),
61 for (
const int i : dst_pointclouds.index_range()) {
70 bases.remove_if([&](
Base *base) {
72 return dst_pointclouds[src_pointclouds.index_of(pointcloud)] ==
nullptr;
75 if (bases.is_empty()) {
80 for (
Base *base_src : bases) {
82 PointCloud *dst = dst_pointclouds[src_pointclouds.index_of(src)];
88 object_dst->
data = dst;
102 ot->name =
"Separate";
103 ot->idname =
"POINTCLOUD_OT_separate";
104 ot->description =
"Separate selected geometry into a new point cloud";
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
blender::Vector< Base * > BKE_view_layer_array_from_bases_in_edit_mode(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
const char * BKE_id_name(const ID &id)
General operations for point clouds.
PointCloud * BKE_pointcloud_add(Main *bmain, const char *name)
void BKE_pointcloud_nomain_to_pointcloud(PointCloud *pointcloud_src, PointCloud *pointcloud_dst)
void pointcloud_copy_parameters(const PointCloud &src, PointCloud &dst)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
struct PointCloud PointCloud
IndexRange index_range() const
Base * add_duplicate(Main *bmain, Scene *scene, ViewLayer *view_layer, Base *base, eDupli_ID_Flags dupflag)
bool editable_pointcloud_in_edit_mode_poll(bContext *C)
static wmOperatorStatus separate_exec(bContext *C, wmOperator *)
void POINTCLOUD_OT_separate(wmOperatorType *ot)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
void WM_event_add_notifier(const bContext *C, uint type, void *reference)