Blender V5.0
duplicate.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "BLI_array_utils.hh"
6
7#include "BKE_attribute.hh"
8#include "BKE_pointcloud.hh"
9
10#include "ED_pointcloud.hh"
11
13
14#include "DEG_depsgraph.hh"
15
16#include "WM_api.hh"
17
19
21{
22 PointCloud *new_pointcloud = BKE_pointcloud_new_nomain(pointcloud.totpoint + mask.size());
23 bke::MutableAttributeAccessor dst_attributes = new_pointcloud->attributes_for_write();
24 pointcloud.attributes().foreach_attribute([&](const bke::AttributeIter &iter) {
25 const GVArray src = *iter.get();
27 iter.name, iter.domain, iter.data_type);
28 array_utils::copy(src, dst.span.take_front(pointcloud.totpoint));
29 array_utils::gather(src, mask, dst.span.take_back(mask.size()));
30 dst.finish();
31 });
33}
34
36{
38 IndexMaskMemory memory;
39 const IndexMask selection = retrieve_selected_points(*pointcloud, memory);
40 if (selection.is_empty()) {
41 continue;
42 }
43
44 pointcloud->attributes_for_write().remove(".selection");
45
46 duplicate_points(*pointcloud, selection);
47
48 bke::SpanAttributeWriter selection_attr =
49 pointcloud->attributes_for_write().lookup_or_add_for_write_span<bool>(
50 ".selection", bke::AttrDomain::Point);
51 selection_attr.span.take_back(selection.size()).fill(true);
52 selection_attr.finish();
53
56 }
57 return OPERATOR_FINISHED;
58}
59
61{
62 ot->name = "Duplicate";
63 ot->idname = "POINTCLOUD_OT_duplicate";
64 ot->description = "Copy selected points";
65
66 ot->exec = duplicate_exec;
68
70}
71
72} // namespace blender::ed::pointcloud
General operations for point clouds.
void BKE_pointcloud_nomain_to_pointcloud(PointCloud *pointcloud_src, PointCloud *pointcloud_dst)
PointCloud * BKE_pointcloud_new_nomain(int totpoint)
void DEG_id_tag_update(ID *id, unsigned int flags)
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1074
@ OPERATOR_FINISHED
#define C
Definition RandGen.cpp:29
#define NC_GEOM
Definition WM_types.hh:393
#define ND_DATA
Definition WM_types.hh:509
@ OPTYPE_UNDO
Definition WM_types.hh:182
@ OPTYPE_REGISTER
Definition WM_types.hh:180
GMutableSpan take_front(const int64_t n) const
GMutableSpan take_back(const int64_t n) const
GAttributeReader get() const
GSpanAttributeWriter lookup_or_add_for_write_only_span(StringRef attribute_id, AttrDomain domain, AttrType data_type)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
void copy(const GVArray &src, GMutableSpan dst, int64_t grain_size=4096)
void gather(const GVArray &src, const IndexMask &indices, GMutableSpan dst, int64_t grain_size=4096)
bool editable_pointcloud_in_edit_mode_poll(bContext *C)
Definition operators.cc:73
static wmOperatorStatus duplicate_exec(bContext *C, wmOperator *)
Definition duplicate.cc:35
void POINTCLOUD_OT_duplicate(wmOperatorType *ot)
Definition duplicate.cc:60
static void duplicate_points(PointCloud &pointcloud, const IndexMask &mask)
Definition duplicate.cc:20
IndexMask retrieve_selected_points(const PointCloud &pointcloud, IndexMaskMemory &memory)
Definition selection.cc:279
VectorSet< PointCloud * > get_unique_editable_pointclouds(const bContext &C)
Definition operators.cc:78
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition wm_files.cc:4237