Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2021-02-26 18:23:43 +0300
committerJacques Lucke <jacques@blender.org>2021-02-26 18:23:43 +0300
commitcb8dd9905a37a79271a125e7068173b5fd202413 (patch)
tree83282bc14481e4ac8faf29c51391d20af2dcda57 /source
parent4df7e6047b84934de7c9c82e3526cfa43344b300 (diff)
initial support for rows for selected vertices
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/space_spreadsheet/space_spreadsheet.cc50
-rw-r--r--source/blender/makesdna/DNA_space_types.h9
-rw-r--r--source/blender/makesrna/intern/rna_space.c6
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)