From 8ac48880e73a3e6031a0ea94be3667b40b27e54d Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sat, 10 May 2025 02:24:18 +0200 Subject: [PATCH] Point Cloud: Move "Random" default primitive creation to operator Previously all new point clouds created in the main database would have the random 400 points. Now that's only the point cloud created from the add menu. Similar to f98d74c80de7b1cae1e5a963f33c51c49f478ba1. Pull Request: https://projects.blender.org/blender/blender/pulls/138685 --- scripts/startup/bl_ui/space_view3d.py | 7 +--- source/blender/blenkernel/BKE_pointcloud.hh | 1 - source/blender/blenkernel/intern/object.cc | 2 +- .../blender/blenkernel/intern/pointcloud.cc | 42 ------------------- source/blender/editors/object/object_add.cc | 28 ++++++++++--- .../blender/editors/object/object_intern.hh | 2 +- source/blender/editors/object/object_ops.cc | 2 +- .../io/alembic/intern/abc_reader_points.cc | 2 +- 8 files changed, 27 insertions(+), 59 deletions(-) diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 6c5bedf286f..a968e118a09 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -2670,7 +2670,7 @@ class VIEW3D_MT_add(Menu): layout.menu("VIEW3D_MT_surface_add", icon='OUTLINER_OB_SURFACE') layout.menu("VIEW3D_MT_metaball_add", text="Metaball", icon='OUTLINER_OB_META') layout.operator("object.text_add", text="Text", icon='OUTLINER_OB_FONT') - layout.operator("object.pointcloud_add", text="Point Cloud", icon='OUTLINER_OB_POINTCLOUD') + layout.operator("object.pointcloud_random_add", text="Point Cloud", icon='OUTLINER_OB_POINTCLOUD') layout.menu("VIEW3D_MT_volume_add", text="Volume", text_ctxt=i18n_contexts.id_id, icon='OUTLINER_OB_VOLUME') layout.menu("VIEW3D_MT_grease_pencil_add", text="Grease Pencil", icon='OUTLINER_OB_GREASEPENCIL') @@ -6505,11 +6505,6 @@ class VIEW3D_PT_object_type_visibility(Panel): col.separator() continue - if attr == "curves" and not hasattr(bpy.data, "hair_curves"): - continue - elif attr == "pointcloud" and not hasattr(bpy.data, "pointclouds"): - continue - attr_v = "show_object_viewport_" + attr icon_v = 'HIDE_OFF' if getattr(view, attr_v) else 'HIDE_ON' diff --git a/source/blender/blenkernel/BKE_pointcloud.hh b/source/blender/blenkernel/BKE_pointcloud.hh index c37ed83c74a..a5ebd119362 100644 --- a/source/blender/blenkernel/BKE_pointcloud.hh +++ b/source/blender/blenkernel/BKE_pointcloud.hh @@ -50,7 +50,6 @@ PointCloud *pointcloud_new_no_attributes(int totpoint); } // namespace blender::bke PointCloud *BKE_pointcloud_add(Main *bmain, const char *name); -PointCloud *BKE_pointcloud_add_default(Main *bmain, const char *name); PointCloud *BKE_pointcloud_new_nomain(int totpoint); void BKE_pointcloud_nomain_to_pointcloud(PointCloud *pointcloud_src, PointCloud *pointcloud_dst); diff --git a/source/blender/blenkernel/intern/object.cc b/source/blender/blenkernel/intern/object.cc index 35d779e487d..7ea7c0e0cd0 100644 --- a/source/blender/blenkernel/intern/object.cc +++ b/source/blender/blenkernel/intern/object.cc @@ -2018,7 +2018,7 @@ void *BKE_object_obdata_add_from_type(Main *bmain, int type, const char *name) case OB_CURVES: return BKE_curves_add(bmain, name); case OB_POINTCLOUD: - return BKE_pointcloud_add_default(bmain, name); + return BKE_pointcloud_add(bmain, name); case OB_VOLUME: return BKE_volume_add(bmain, name); case OB_GREASE_PENCIL: diff --git a/source/blender/blenkernel/intern/pointcloud.cc b/source/blender/blenkernel/intern/pointcloud.cc index 95e133528c9..31e2d9d9cb1 100644 --- a/source/blender/blenkernel/intern/pointcloud.cc +++ b/source/blender/blenkernel/intern/pointcloud.cc @@ -17,7 +17,6 @@ #include "BLI_bounds.hh" #include "BLI_index_range.hh" -#include "BLI_rand.h" #include "BLI_resource_scope.hh" #include "BLI_span.hh" #include "BLI_utildefines.h" @@ -53,12 +52,7 @@ using blender::StringRef; using blender::VArray; using blender::Vector; -/* PointCloud datablock */ - -static void pointcloud_random(PointCloud *pointcloud); - constexpr StringRef ATTR_POSITION = "position"; -constexpr StringRef ATTR_RADIUS = "radius"; static void pointcloud_init_data(ID *id) { @@ -202,33 +196,6 @@ IDTypeInfo IDType_ID_PT = { /*lib_override_apply_post*/ nullptr, }; -static void pointcloud_random(PointCloud *pointcloud) -{ - using namespace blender; - using namespace blender::bke; - BLI_assert(pointcloud->totpoint == 0); - pointcloud->totpoint = 400; - CustomData_realloc(&pointcloud->pdata, 0, pointcloud->totpoint); - - RNG *rng = BLI_rng_new(0); - - MutableAttributeAccessor attributes = pointcloud->attributes_for_write(); - MutableSpan positions = pointcloud->positions_for_write(); - SpanAttributeWriter radii = attributes.lookup_or_add_for_write_only_span( - ATTR_RADIUS, AttrDomain::Point); - - for (const int i : positions.index_range()) { - positions[i] = float3(BLI_rng_get_float(rng), BLI_rng_get_float(rng), BLI_rng_get_float(rng)) * - 2.0f - - 1.0f; - radii.span[i] = 0.05f * BLI_rng_get_float(rng); - } - - radii.finish(); - - BLI_rng_free(rng); -} - template static VArray get_varray_attribute(const PointCloud &pointcloud, const StringRef name, @@ -304,15 +271,6 @@ PointCloud *BKE_pointcloud_add(Main *bmain, const char *name) return pointcloud; } -PointCloud *BKE_pointcloud_add_default(Main *bmain, const char *name) -{ - PointCloud *pointcloud = BKE_id_new(bmain, name); - - pointcloud_random(pointcloud); - - return pointcloud; -} - PointCloud *BKE_pointcloud_new_nomain(const int totpoint) { PointCloud *pointcloud = static_cast(BKE_libblock_alloc( diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc index 6e5db774a36..c924b1f48bc 100644 --- a/source/blender/editors/object/object_add.cc +++ b/source/blender/editors/object/object_add.cc @@ -36,6 +36,7 @@ #include "BLI_math_matrix_types.hh" #include "BLI_math_rotation.h" #include "BLI_math_vector_types.hh" +#include "BLI_rand.hh" #include "BLI_string.h" #include "BLI_string_utf8.h" #include "BLI_utildefines.h" @@ -2133,23 +2134,38 @@ static wmOperatorStatus object_pointcloud_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; add_generic_get_opts(C, op, 'Z', loc, rot, nullptr, nullptr, &local_view_bits, nullptr); - add_type(C, OB_POINTCLOUD, nullptr, loc, rot, false, local_view_bits); + Object *object = add_type(C, OB_POINTCLOUD, nullptr, loc, rot, false, local_view_bits); + PointCloud &pointcloud = *static_cast(object->data); + pointcloud.totpoint = 400; + CustomData_realloc(&pointcloud.pdata, 0, pointcloud.totpoint); + + bke::MutableAttributeAccessor attributes = pointcloud.attributes_for_write(); + bke::SpanAttributeWriter position = attributes.lookup_or_add_for_write_only_span( + "position", bke::AttrDomain::Point); + bke::SpanAttributeWriter radii = attributes.lookup_or_add_for_write_only_span( + "radius", bke::AttrDomain::Point); + + RandomNumberGenerator rng(0); + for (const int i : position.span.index_range()) { + position.span[i] = float3(rng.get_float(), rng.get_float(), rng.get_float()) * 2.0f - 1.0f; + radii.span[i] = 0.05f * rng.get_float(); + } + + position.finish(); + radii.finish(); return OPERATOR_FINISHED; } -void OBJECT_OT_pointcloud_add(wmOperatorType *ot) +void OBJECT_OT_pointcloud_random_add(wmOperatorType *ot) { - /* identifiers */ ot->name = "Add Point Cloud"; ot->description = "Add a point cloud object to the scene"; - ot->idname = "OBJECT_OT_pointcloud_add"; + ot->idname = "OBJECT_OT_pointcloud_random_add"; - /* api callbacks */ ot->exec = object_pointcloud_add_exec; ot->poll = ED_operator_objectmode; - /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; add_generic_props(ot, false); diff --git a/source/blender/editors/object/object_intern.hh b/source/blender/editors/object/object_intern.hh index 94b39a63cf7..6515b8fe01b 100644 --- a/source/blender/editors/object/object_intern.hh +++ b/source/blender/editors/object/object_intern.hh @@ -128,7 +128,7 @@ void OBJECT_OT_camera_add(wmOperatorType *ot); void OBJECT_OT_speaker_add(wmOperatorType *ot); void OBJECT_OT_curves_random_add(wmOperatorType *ot); void OBJECT_OT_curves_empty_hair_add(wmOperatorType *ot); -void OBJECT_OT_pointcloud_add(wmOperatorType *ot); +void OBJECT_OT_pointcloud_random_add(wmOperatorType *ot); /** * Only used as menu. */ diff --git a/source/blender/editors/object/object_ops.cc b/source/blender/editors/object/object_ops.cc index 6e8dc50a43b..dce7c95ee6f 100644 --- a/source/blender/editors/object/object_ops.cc +++ b/source/blender/editors/object/object_ops.cc @@ -97,7 +97,7 @@ void operatortypes_object() WM_operatortype_append(OBJECT_OT_speaker_add); WM_operatortype_append(OBJECT_OT_curves_random_add); WM_operatortype_append(OBJECT_OT_curves_empty_hair_add); - WM_operatortype_append(OBJECT_OT_pointcloud_add); + WM_operatortype_append(OBJECT_OT_pointcloud_random_add); WM_operatortype_append(OBJECT_OT_volume_add); WM_operatortype_append(OBJECT_OT_volume_import); WM_operatortype_append(OBJECT_OT_add); diff --git a/source/blender/io/alembic/intern/abc_reader_points.cc b/source/blender/io/alembic/intern/abc_reader_points.cc index f3c5fb9016a..893671ca60e 100644 --- a/source/blender/io/alembic/intern/abc_reader_points.cc +++ b/source/blender/io/alembic/intern/abc_reader_points.cc @@ -60,7 +60,7 @@ bool AbcPointsReader::accepts_object_type( void AbcPointsReader::readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) { - PointCloud *pointcloud = BKE_pointcloud_add_default(bmain, m_data_name.c_str()); + PointCloud *pointcloud = BKE_pointcloud_add(bmain, m_data_name.c_str()); bke::GeometrySet geometry_set = bke::GeometrySet::from_pointcloud( pointcloud, bke::GeometryOwnershipType::Editable);