[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