From 4e958617a9dc8320514a5bf9446e5821f22deff2 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 22 Jul 2024 20:13:57 +0200 Subject: [PATCH] Spreadsheet: store original object pointer to access selection This originally comes from #124186 and is necessary when the spreadsheet can show data from instances. --- .../spreadsheet_data_source_geometry.cc | 32 ++++++++++--------- .../spreadsheet_data_source_geometry.hh | 15 ++++----- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc index 47e59b11803..a2851b41826 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc +++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc @@ -340,31 +340,33 @@ int GeometryDataSource::tot_rows() const bool GeometryDataSource::has_selection_filter() const { - Object *object_orig = DEG_get_original_object(object_eval_); + if (!object_orig_) { + return false; + } switch (component_->type()) { case bke::GeometryComponent::Type::Mesh: { - if (object_orig->type != OB_MESH) { + if (object_orig_->type != OB_MESH) { return false; } - if (object_orig->mode != OB_MODE_EDIT) { + if (object_orig_->mode != OB_MODE_EDIT) { return false; } return true; } case bke::GeometryComponent::Type::Curve: { - if (object_orig->type != OB_CURVES) { + if (object_orig_->type != OB_CURVES) { return false; } - if (!ELEM(object_orig->mode, OB_MODE_SCULPT_CURVES, OB_MODE_EDIT)) { + if (!ELEM(object_orig_->mode, OB_MODE_SCULPT_CURVES, OB_MODE_EDIT)) { return false; } return true; } case bke::GeometryComponent::Type::PointCloud: { - if (object_orig->type != OB_POINTCLOUD) { + if (object_orig_->type != OB_POINTCLOUD) { return false; } - if (object_orig->mode != OB_MODE_EDIT) { + if (object_orig_->mode != OB_MODE_EDIT) { return false; } return true; @@ -384,12 +386,11 @@ IndexMask GeometryDataSource::apply_selection_filter(IndexMaskMemory &memory) co switch (component_->type()) { case bke::GeometryComponent::Type::Mesh: { - BLI_assert(object_eval_->type == OB_MESH); - BLI_assert(object_eval_->mode == OB_MODE_EDIT); - Object *object_orig = DEG_get_original_object(object_eval_); + BLI_assert(object_orig_->type == OB_MESH); + BLI_assert(object_orig_->mode == OB_MODE_EDIT); const Mesh *mesh_eval = geometry_set_.get_mesh(); const bke::AttributeAccessor attributes_eval = mesh_eval->attributes(); - Mesh *mesh_orig = (Mesh *)object_orig->data; + Mesh *mesh_orig = (Mesh *)object_orig_->data; BMesh *bm = mesh_orig->runtime->edit_mesh->bm; BM_mesh_elem_table_ensure(bm, BM_VERT); @@ -431,7 +432,7 @@ IndexMask GeometryDataSource::apply_selection_filter(IndexMaskMemory &memory) co return full_range; } case bke::GeometryComponent::Type::Curve: { - BLI_assert(object_eval_->type == OB_CURVES); + BLI_assert(object_orig_->type == OB_CURVES); const bke::CurveComponent &component = static_cast(*component_); const Curves &curves_id = *component.get(); switch (domain_) { @@ -445,7 +446,7 @@ IndexMask GeometryDataSource::apply_selection_filter(IndexMaskMemory &memory) co return full_range; } case bke::GeometryComponent::Type::PointCloud: { - BLI_assert(object_eval_->type == OB_POINTCLOUD); + BLI_assert(object_orig_->type == OB_POINTCLOUD); const bke::AttributeAccessor attributes = *component_->attributes(); const VArray &selection = *attributes.lookup_or_default( ".selection", bke::AttrDomain::Point, false); @@ -559,7 +560,7 @@ int get_instance_reference_icon(const bke::InstanceReference &reference) return ICON_OUTLINER_COLLECTION; } case bke::InstanceReference::Type::GeometrySet: { - return ICON_EMPTY_AXIS; + return ICON_THREE_DOTS; } case bke::InstanceReference::Type::None: { break; @@ -645,8 +646,9 @@ std::unique_ptr data_source_from_geometry(const bContext *C, Object if (component_type == bke::GeometryComponent::Type::Volume) { return std::make_unique(std::move(geometry_set)); } + Object *object_orig = DEG_get_original_object(object_eval); return std::make_unique( - object_eval, std::move(geometry_set), component_type, domain, active_layer_index); + object_orig, std::move(geometry_set), component_type, domain, active_layer_index); } } // namespace blender::ed::spreadsheet diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.hh b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.hh index 0fa25b7d360..61470d996da 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.hh +++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.hh @@ -40,7 +40,11 @@ class ExtraColumns { class GeometryDataSource : public DataSource { private: - Object *object_eval_; + /** + * Object that contains original data for the geometry component. This is used for selection + * filtering. May be null. + */ + Object *object_orig_; const bke::GeometrySet geometry_set_; const bke::GeometryComponent *component_; bke::AttrDomain domain_; @@ -55,13 +59,13 @@ class GeometryDataSource : public DataSource { mutable ResourceScope scope_; public: - GeometryDataSource(Object *object_eval, + GeometryDataSource(Object *object_orig, bke::GeometrySet geometry_set, const bke::GeometryComponent::Type component_type, const bke::AttrDomain domain, const int layer_index = -1, ExtraColumns extra_columns = {}) - : object_eval_(object_eval), + : object_orig_(object_orig), geometry_set_(std::move(geometry_set)), component_(geometry_set_.get_component(component_type)), domain_(domain), @@ -70,11 +74,6 @@ class GeometryDataSource : public DataSource { { } - Object *object_eval() const - { - return object_eval_; - } - bool has_selection_filter() const override; IndexMask apply_selection_filter(IndexMaskMemory &memory) const;