diff options
Diffstat (limited to 'source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc')
-rw-r--r-- | source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc | 73 |
1 files changed, 12 insertions, 61 deletions
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 fd2ac4d39a1..8af12590b0f 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc +++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc @@ -98,7 +98,8 @@ void GeometryDataSource::foreach_default_column_ids( } SpreadsheetColumnID column_id; column_id.name = (char *)attribute_id.name().data(); - fn(column_id, false); + const bool is_front = attribute_id.name() == ".viewer"; + fn(column_id, is_front); return true; }); @@ -228,7 +229,12 @@ std::unique_ptr<ColumnValues> GeometryDataSource::get_column_values( return {}; } - return std::make_unique<ColumnValues>(column_id.name, std::move(varray)); + StringRefNull column_display_name = column_id.name; + if (column_display_name == ".viewer") { + column_display_name = "Viewer"; + } + + return std::make_unique<ColumnValues>(column_display_name, std::move(varray)); } int GeometryDataSource::tot_rows() const @@ -463,7 +469,7 @@ GeometrySet spreadsheet_get_display_geometry_set(const SpaceSpreadsheet *sspread mesh_component.replace(mesh, GeometryOwnershipType::ReadOnly); } else { - if (BLI_listbase_count(&sspreadsheet->context_path) == 1) { + if (BLI_listbase_count(&sspreadsheet->viewer_path.path) == 1) { /* Use final evaluated object. */ if (object_eval->runtime.geometry_set_eval != nullptr) { geometry_set = *object_eval->runtime.geometry_set_eval; @@ -471,8 +477,8 @@ GeometrySet spreadsheet_get_display_geometry_set(const SpaceSpreadsheet *sspread } else { if (const ViewerNodeLog *viewer_log = - nodes::geo_eval_log::GeoModifierLog::find_viewer_node_log_for_spreadsheet( - *sspreadsheet)) { + nodes::geo_eval_log::GeoModifierLog::find_viewer_node_log_for_path( + sspreadsheet->viewer_path)) { geometry_set = viewer_log->geometry; } } @@ -481,25 +487,6 @@ GeometrySet spreadsheet_get_display_geometry_set(const SpaceSpreadsheet *sspread return geometry_set; } -static void find_fields_to_evaluate(const SpaceSpreadsheet *sspreadsheet, - Map<std::string, GField> &r_fields) -{ - if (sspreadsheet->object_eval_state != SPREADSHEET_OBJECT_EVAL_STATE_VIEWER_NODE) { - return; - } - if (BLI_listbase_count(&sspreadsheet->context_path) <= 1) { - /* No viewer is currently referenced by the context path. */ - return; - } - if (const ViewerNodeLog *viewer_log = - nodes::geo_eval_log::GeoModifierLog::find_viewer_node_log_for_spreadsheet( - *sspreadsheet)) { - if (viewer_log->field) { - r_fields.add("Viewer", viewer_log->field); - } - } -} - class GeometryComponentCacheKey : public SpreadsheetCache::Key { public: /* Use the pointer to the geometry component as a key to detect when the geometry changed. */ @@ -531,38 +518,6 @@ class GeometryComponentCacheValue : public SpreadsheetCache::Value { Map<std::pair<eAttrDomain, GField>, GArray<>> arrays; }; -static void add_fields_as_extra_columns(SpaceSpreadsheet *sspreadsheet, - const GeometryComponent &component, - ExtraColumns &r_extra_columns) -{ - Map<std::string, GField> fields_to_show; - find_fields_to_evaluate(sspreadsheet, fields_to_show); - - GeometryComponentCacheValue &cache = - sspreadsheet->runtime->cache.lookup_or_add<GeometryComponentCacheValue>( - std::make_unique<GeometryComponentCacheKey>(component)); - - const eAttrDomain domain = (eAttrDomain)sspreadsheet->attribute_domain; - const int domain_num = component.attribute_domain_size(domain); - for (const auto item : fields_to_show.items()) { - const StringRef name = item.key; - const GField &field = item.value; - - /* Use the cached evaluated array if it exists, otherwise evaluate the field now. */ - GArray<> &evaluated_array = cache.arrays.lookup_or_add_cb({domain, field}, [&]() { - GArray<> evaluated_array(field.cpp_type(), domain_num); - - bke::GeometryFieldContext field_context{component, domain}; - fn::FieldEvaluator field_evaluator{field_context, domain_num}; - field_evaluator.add_with_destination(field, evaluated_array); - field_evaluator.evaluate(); - return evaluated_array; - }); - - r_extra_columns.add(name, evaluated_array.as_span()); - } -} - std::unique_ptr<DataSource> data_source_from_geometry(const bContext *C, Object *object_eval) { SpaceSpreadsheet *sspreadsheet = CTX_wm_space_spreadsheet(C); @@ -574,15 +529,11 @@ std::unique_ptr<DataSource> data_source_from_geometry(const bContext *C, Object return {}; } - const GeometryComponent &component = *geometry_set.get_component_for_read(component_type); - ExtraColumns extra_columns; - add_fields_as_extra_columns(sspreadsheet, component, extra_columns); - if (component_type == GEO_COMPONENT_TYPE_VOLUME) { return std::make_unique<VolumeDataSource>(std::move(geometry_set)); } return std::make_unique<GeometryDataSource>( - object_eval, std::move(geometry_set), component_type, domain, std::move(extra_columns)); + object_eval, std::move(geometry_set), component_type, domain); } } // namespace blender::ed::spreadsheet |