diff options
author | Jacques Lucke <jacques@blender.org> | 2021-02-26 18:23:43 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-02-26 18:23:43 +0300 |
commit | cb8dd9905a37a79271a125e7068173b5fd202413 (patch) | |
tree | 83282bc14481e4ac8faf29c51391d20af2dcda57 /source | |
parent | 4df7e6047b84934de7c9c82e3526cfa43344b300 (diff) |
initial support for rows for selected vertices
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/space_spreadsheet/space_spreadsheet.cc | 50 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_space_types.h | 9 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_space.c | 6 |
3 files changed, 61 insertions, 4 deletions
diff --git a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc index 769fcb30800..27e37aa0146 100644 --- a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc +++ b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc @@ -16,10 +16,12 @@ #include <cstring> +#include "BLI_array.hh" #include "BLI_index_range.hh" #include "BLI_listbase.h" #include "BLI_resource_collector.hh" +#include "BKE_editmesh.h" #include "BKE_mesh_wrapper.h" #include "BKE_modifier.h" #include "BKE_screen.h" @@ -47,11 +49,15 @@ #include "BLF_api.h" +#include "bmesh.h" + #include "spreadsheet_from_geometry.hh" #include "spreadsheet_intern.hh" +using blender::Array; using blender::IndexRange; using blender::ResourceCollector; +using blender::Vector; using namespace blender::ed::spreadsheet; @@ -121,6 +127,8 @@ static void gather_spreadsheet_data(const bContext *C, SpreadsheetLayout &spreadsheet_layout, ResourceCollector &resources) { + SpaceSpreadsheet *sspreadsheet = CTX_wm_space_spreadsheet(C); + Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); ID *used_id = get_used_id(C); if (used_id == nullptr) { @@ -130,11 +138,11 @@ static void gather_spreadsheet_data(const bContext *C, if (id_type != ID_OB) { return; } - Object *used_object_orig = (Object *)used_id; - if (used_object_orig->type != OB_MESH) { + Object *object_orig = (Object *)used_id; + if (object_orig->type != OB_MESH) { return; } - Object *object_eval = DEG_get_evaluated_object(depsgraph, used_object_orig); + Object *object_eval = DEG_get_evaluated_object(depsgraph, object_orig); if (object_eval == nullptr) { return; } @@ -166,8 +174,42 @@ static void gather_spreadsheet_data(const bContext *C, const AttributeDomain domain = ATTR_DOMAIN_POINT; columns_from_geometry_attributes(*component, domain, resources, spreadsheet_layout); const int row_amount = component->attribute_domain_size(domain); - spreadsheet_layout.visible_rows = IndexRange(row_amount).as_span(); spreadsheet_layout.row_index_digits = std::to_string(std::max(0, row_amount - 1)).size(); + + const bool show_only_selected = sspreadsheet->filter_flag & SPREADSHEET_FILTER_SELECTED_ONLY; + if (object_orig->mode == OB_MODE_EDIT && show_only_selected) { + Vector<int64_t> &visible_rows = resources.construct<Vector<int64_t>>("visible rows"); + const MeshComponent *mesh_component = (const MeshComponent *)component; + const Mesh *mesh_eval = mesh_component->get_for_read(); + Mesh *mesh_orig = (Mesh *)object_orig->data; + BMesh *bm = mesh_orig->edit_mesh->bm; + BM_mesh_elem_index_ensure(bm, BM_VERT); + + int *orig_indices = (int *)CustomData_get_layer(&mesh_eval->vdata, CD_ORIGINDEX); + if (orig_indices != nullptr) { + for (const int i_eval : IndexRange(mesh_eval->totvert)) { + const int i_orig = orig_indices[i_eval]; + if (i_orig >= 0 && i_orig < bm->totvert) { + BMVert *vert = bm->vtable[i_orig]; + if (BM_elem_flag_test(vert, BM_ELEM_SELECT)) { + visible_rows.append(i_eval); + } + } + } + } + else if (mesh_eval->totvert == bm->totvert) { + for (const int i : IndexRange(mesh_eval->totvert)) { + BMVert *vert = bm->vtable[i]; + if (BM_elem_flag_test(vert, BM_ELEM_SELECT)) { + visible_rows.append(i); + } + } + } + spreadsheet_layout.visible_rows = visible_rows.as_span(); + } + else { + spreadsheet_layout.visible_rows = IndexRange(row_amount).as_span(); + } } static void spreadsheet_main_region_draw(const bContext *C, ARegion *region) diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index fe4f0b09be4..1d678786a2f 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -1848,10 +1848,19 @@ typedef struct SpaceSpreadsheet { /* End 'SpaceLink' header. */ struct ID *pinned_id; + + /* eSpaceSpreadsheet_FilterFlag. */ + uint8_t filter_flag; + + char _pad1[7]; } SpaceSpreadsheet; /** \} */ +typedef enum eSpaceSpreadsheet_FilterFlag { + SPREADSHEET_FILTER_SELECTED_ONLY = (1 << 0), +} eSpaceSpreadsheet_FilterFlag; + /* -------------------------------------------------------------------- */ /** \name Space Defines (eSpace_Type) * \{ */ diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 48693637931..f2f2aa1b34d 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -7197,6 +7197,12 @@ static void rna_def_space_spreadsheet(BlenderRNA *brna) RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceSpreadsheet_pinned_id_set", NULL, NULL); RNA_def_property_ui_text(prop, "Pinned ID", "Data-block whose values are displayed"); RNA_def_property_update(prop, NC_SPACE, NULL); + + prop = RNA_def_property(srna, "show_only_selected", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "filter_flag", SPREADSHEET_FILTER_SELECTED_ONLY); + RNA_def_property_ui_text( + prop, "Show Only Selected", "Only include rows that correspond to selected elements"); + RNA_def_property_update(prop, NC_SPACE, NULL); } void RNA_def_space(BlenderRNA *brna) |