[Bf-blender-cvs] [cb8dd9905a3] temp-spreadsheet-editor: initial support for rows for selected vertices
Jacques Lucke
noreply at git.blender.org
Fri Feb 26 16:48:46 CET 2021
Commit: cb8dd9905a37a79271a125e7068173b5fd202413
Author: Jacques Lucke
Date: Fri Feb 26 16:23:43 2021 +0100
Branches: temp-spreadsheet-editor
https://developer.blender.org/rBcb8dd9905a37a79271a125e7068173b5fd202413
initial support for rows for selected vertices
===================================================================
M release/scripts/startup/bl_ui/space_spreadsheet.py
M source/blender/editors/space_spreadsheet/space_spreadsheet.cc
M source/blender/makesdna/DNA_space_types.h
M source/blender/makesrna/intern/rna_space.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_spreadsheet.py b/release/scripts/startup/bl_ui/space_spreadsheet.py
index fe2c025db18..450d96273de 100644
--- a/release/scripts/startup/bl_ui/space_spreadsheet.py
+++ b/release/scripts/startup/bl_ui/space_spreadsheet.py
@@ -36,7 +36,10 @@ class SPREADSHEET_HT_header(bpy.types.Header):
layout.operator("spreadsheet.toggle_pin", text="", icon='PINNED' if pinned_id else 'UNPINNED', emboss=False)
+ layout.separator_spacer()
+ if isinstance(used_id, bpy.types.Object) and used_id.mode == 'EDIT':
+ layout.prop(space, "show_only_selected", text="Selected Only")
classes = (
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)
More information about the Bf-blender-cvs
mailing list