[Bf-blender-cvs] [ccead2ed9c6] master: Spreadsheet: Display geometry volume component grids

Hans Goudey noreply at git.blender.org
Wed Nov 3 19:46:03 CET 2021


Commit: ccead2ed9c6121c42a516712da38a2faec877e2f
Author: Hans Goudey
Date:   Wed Nov 3 13:45:51 2021 -0500
Branches: master
https://developer.blender.org/rBccead2ed9c6121c42a516712da38a2faec877e2f

Spreadsheet: Display geometry volume component grids

This shows a geometry's volume grids in the spreadsheet.
Three columns are displayed:
 - Name: The text name of each grid
 - Data type: Float, Vector, etc.
 - Class: Fog volume, Level Set, or unkown

In the future, values of the voxels themselves could be displayed,
but that is a much more complex problem, with important performance
implications, etc.

Differential Revision: https://developer.blender.org/D13049

===================================================================

M	source/blender/editors/space_spreadsheet/CMakeLists.txt
M	source/blender/editors/space_spreadsheet/spreadsheet_cell_value.hh
M	source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.hh
M	source/blender/editors/space_spreadsheet/spreadsheet_dataset_draw.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_dataset_layout.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_layout.cc
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/RNA_enum_items.h
M	source/blender/makesrna/intern/rna_volume.c

===================================================================

diff --git a/source/blender/editors/space_spreadsheet/CMakeLists.txt b/source/blender/editors/space_spreadsheet/CMakeLists.txt
index 91fe1bc01b7..192b80881ee 100644
--- a/source/blender/editors/space_spreadsheet/CMakeLists.txt
+++ b/source/blender/editors/space_spreadsheet/CMakeLists.txt
@@ -67,4 +67,14 @@ set(SRC
 set(LIB
 )
 
+if(WITH_OPENVDB)
+  list(APPEND INC_SYS
+    ${OPENVDB_INCLUDE_DIRS}
+  )
+  list(APPEND LIB
+    ${OPENVDB_LIBRARIES}
+  )
+  add_definitions(-DWITH_OPENVDB ${OPENVDB_DEFINITIONS})
+endif()
+
 blender_add_lib(bf_editor_space_spreadsheet "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_cell_value.hh b/source/blender/editors/space_spreadsheet/spreadsheet_cell_value.hh
index 97170693cb3..c11b4a2b23d 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_cell_value.hh
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_cell_value.hh
@@ -58,6 +58,7 @@ class CellValue {
   std::optional<ObjectCellValue> value_object;
   std::optional<CollectionCellValue> value_collection;
   std::optional<GeometrySetCellValue> value_geometry_set;
+  std::optional<std::string> value_string;
 };
 
 }  // namespace blender::ed::spreadsheet
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 c1d345d1861..04784dc3e2b 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
@@ -20,6 +20,7 @@
 #include "BKE_mesh.h"
 #include "BKE_mesh_wrapper.h"
 #include "BKE_modifier.h"
+#include "BKE_volume.h"
 
 #include "DNA_ID.h"
 #include "DNA_mesh_types.h"
@@ -33,6 +34,11 @@
 
 #include "NOD_geometry_nodes_eval_log.hh"
 
+#include "BLT_translation.h"
+
+#include "RNA_access.h"
+#include "RNA_enum_types.h"
+
 #include "FN_field_cpp_type.hh"
 
 #include "bmesh.h"
@@ -112,6 +118,9 @@ std::unique_ptr<ColumnValues> ExtraColumns::get_column_values(
                                            r_cell_value.value_color = *(
                                                const ColorGeometry4f *)value;
                                            break;
+                                         case SPREADSHEET_VALUE_TYPE_STRING:
+                                           r_cell_value.value_string = *(const std::string *)value;
+                                           break;
                                          case SPREADSHEET_VALUE_TYPE_INSTANCES:
                                            break;
                                        }
@@ -487,6 +496,89 @@ int InstancesDataSource::tot_rows() const
   return component_->instances_amount();
 }
 
+void VolumeDataSource::foreach_default_column_ids(
+    FunctionRef<void(const SpreadsheetColumnID &, bool is_extra)> fn) const
+{
+  if (component_->is_empty()) {
+    return;
+  }
+
+  for (const char *name : {"Grid Name", "Data Type", "Class"}) {
+    SpreadsheetColumnID column_id{(char *)name};
+    fn(column_id, false);
+  }
+}
+
+std::unique_ptr<ColumnValues> VolumeDataSource::get_column_values(
+    const SpreadsheetColumnID &column_id) const
+{
+  const Volume *volume = component_->get_for_read();
+  if (volume == nullptr) {
+    return {};
+  }
+
+#ifdef WITH_OPENVDB
+  const int size = this->tot_rows();
+  if (STREQ(column_id.name, "Grid Name")) {
+    return column_values_from_function(
+        SPREADSHEET_VALUE_TYPE_STRING,
+        IFACE_("Grid Name"),
+        size,
+        [volume](int index, CellValue &r_cell_value) {
+          const VolumeGrid *volume_grid = BKE_volume_grid_get_for_read(volume, index);
+          r_cell_value.value_string = BKE_volume_grid_name(volume_grid);
+        },
+        6.0f);
+  }
+  if (STREQ(column_id.name, "Data Type")) {
+    return column_values_from_function(
+        SPREADSHEET_VALUE_TYPE_STRING,
+        IFACE_("Type"),
+        size,
+        [volume](int index, CellValue &r_cell_value) {
+          const VolumeGrid *volume_grid = BKE_volume_grid_get_for_read(volume, index);
+          const VolumeGridType type = BKE_volume_grid_type(volume_grid);
+          const char *name = nullptr;
+          RNA_enum_name_from_value(rna_enum_volume_grid_data_type_items, type, &name);
+          r_cell_value.value_string = IFACE_(name);
+        },
+        5.0f);
+  }
+  if (STREQ(column_id.name, "Class")) {
+    return column_values_from_function(
+        SPREADSHEET_VALUE_TYPE_STRING,
+        IFACE_("Class"),
+        size,
+        [volume](int index, CellValue &r_cell_value) {
+          const VolumeGrid *volume_grid = BKE_volume_grid_get_for_read(volume, index);
+          openvdb::GridBase::ConstPtr grid = BKE_volume_grid_openvdb_for_read(volume, volume_grid);
+          openvdb::GridClass grid_class = grid->getGridClass();
+          if (grid_class == openvdb::GridClass::GRID_FOG_VOLUME) {
+            r_cell_value.value_string = IFACE_("Fog Volume");
+          }
+          else if (grid_class == openvdb::GridClass::GRID_LEVEL_SET) {
+            r_cell_value.value_string = IFACE_("Level Set");
+          }
+          else {
+            r_cell_value.value_string = IFACE_("Unkown");
+          }
+        },
+        5.0f);
+  }
+#endif
+
+  return {};
+}
+
+int VolumeDataSource::tot_rows() const
+{
+  const Volume *volume = component_->get_for_read();
+  if (volume == nullptr) {
+    return 0;
+  }
+  return BKE_volume_num_grids(volume);
+}
+
 GeometrySet spreadsheet_get_display_geometry_set(const SpaceSpreadsheet *sspreadsheet,
                                                  Object *object_eval,
                                                  const GeometryComponentType used_component_type)
@@ -682,6 +774,9 @@ std::unique_ptr<DataSource> data_source_from_geometry(const bContext *C, Object
   if (component_type == GEO_COMPONENT_TYPE_INSTANCES) {
     return std::make_unique<InstancesDataSource>(geometry_set, std::move(extra_columns));
   }
+  if (component_type == GEO_COMPONENT_TYPE_VOLUME) {
+    return std::make_unique<VolumeDataSource>(geometry_set);
+  }
   return std::make_unique<GeometryDataSource>(
       object_eval, geometry_set, component_type, domain, std::move(extra_columns));
 }
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 6c88a94f585..a4114dd1f6a 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.hh
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.hh
@@ -116,6 +116,26 @@ class InstancesDataSource : public DataSource {
   int tot_rows() const override;
 };
 
+class VolumeDataSource : public DataSource {
+  const GeometrySet geometry_set_;
+  const VolumeComponent *component_;
+
+ public:
+  VolumeDataSource(GeometrySet geometry_set)
+      : geometry_set_(std::move(geometry_set)),
+        component_(geometry_set_.get_component_for_read<VolumeComponent>())
+  {
+  }
+
+  void foreach_default_column_ids(
+      FunctionRef<void(const SpreadsheetColumnID &, bool is_extra)> fn) const override;
+
+  std::unique_ptr<ColumnValues> get_column_values(
+      const SpreadsheetColumnID &column_id) const override;
+
+  int tot_rows() const override;
+};
+
 std::unique_ptr<DataSource> data_source_from_geometry(const bContext *C, Object *object_eval);
 
 }  // namespace blender::ed::spreadsheet
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_dataset_draw.cc b/source/blender/editors/space_spreadsheet/spreadsheet_dataset_draw.cc
index 4cf6d14cbda..b9a508d7764 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_dataset_draw.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_dataset_draw.cc
@@ -20,6 +20,7 @@
 #include "DNA_windowmanager_types.h"
 
 #include "BKE_context.h"
+#include "BKE_volume.h"
 
 #include "BLF_api.h"
 
@@ -48,7 +49,7 @@ static int is_component_row_selected(struct uiBut *but, const void *arg)
   const bool is_domain_selected = (AttributeDomain)sspreadsheet->attribute_domain == domain;
   bool is_selected = is_component_selected && is_domain_selected;
 
-  if (component == GEO_COMPONENT_TYPE_INSTANCES) {
+  if (ELEM(component, GEO_COMPONENT_TYPE_VOLUME, GEO_COMPONENT_TYPE_INSTANCES)) {
     is_selected = is_component_selected;
   }
 
@@ -141,6 +142,14 @@ static int element_count_from_instances(const GeometrySet &geometry_set)
   return 0;
 }
 
+static int element_count_from_volume(const GeometrySet &geometry_set)
+{
+  if (const Volume *volume = geometry_set.get_volume_for_read()) {
+    return BKE_volume_num_grids(volume);
+  }
+  return 0;
+}
+
 static int element_count_from_component_domain(const GeometrySet &geometry_set,
                                                GeometryComponentType component,
                                                AttributeDomain domain)
@@ -191,6 +200,10 @@ void DatasetRegionDrawer::draw_dataset_row(const int indentation,
     BLI_str_format_attribute_domain_size(
         element_count, element_count_from_instances(draw_context.current_geometry_set));
   }
+  if (component == GEO_COMPONENT_TYPE_VOLUME) {
+    BLI_str_format_attribute_domain_size(
+        element_count, element_count_from_volume(draw_context.current_geometry_set));
+  }
   else {
     BLI_str_format_attribute_domain_size(
         element_count,
@@ -237,7 +250,7 @@ void DatasetRegionDrawer::draw_dataset_row(const int indentation,
 
 void DatasetRegionDrawer::draw_component_row(const DatasetComponentLayoutInfo &component_info)
 {
-  if (component_info.type == GEO_COMPONENT_TYPE_INSTANCES) {
+  if (ELEM(component_info.type, GEO_COMPONENT_TYPE_VOLUME, GEO_COMPONENT_TYPE_INSTANCES)) {
     draw_dataset_row(
         0, component_info.type, std::nullopt, component_info.icon, component_info.label, true);
   }
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_dataset_layout.cc b/source/blender/editors/space_spreadsheet/spreadsheet_dataset_layout.cc
index abbad8c7088..f15af2e4d32 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_dataset_layout.cc
+++ b/source/blender

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list