Blender  V3.3
spreadsheet_data_source_geometry.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #pragma once
4 
5 #include <mutex>
6 
7 #include "BLI_resource_scope.hh"
8 
9 #include "BKE_geometry_set.hh"
10 
12 
13 struct bContext;
14 
15 namespace blender::ed::spreadsheet {
16 
21 class ExtraColumns {
22  private:
24  Map<std::string, GSpan> columns_;
25 
26  public:
27  void add(std::string name, GSpan data)
28  {
29  columns_.add(std::move(name), data);
30  }
31 
33  FunctionRef<void(const SpreadsheetColumnID &, bool is_extra)> fn) const;
34 
35  std::unique_ptr<ColumnValues> get_column_values(const SpreadsheetColumnID &column_id) const;
36 };
37 
39  private:
40  Object *object_eval_;
41  const GeometrySet geometry_set_;
42  const GeometryComponent *component_;
43  eAttrDomain domain_;
44  ExtraColumns extra_columns_;
45 
46  /* Some data is computed on the fly only when it is requested. Computing it does not change the
47  * logical state of this data source. Therefore, the corresponding methods are const and need to
48  * be protected with a mutex. */
49  mutable std::mutex mutex_;
50  mutable ResourceScope scope_;
51 
52  public:
54  GeometrySet geometry_set,
55  const GeometryComponentType component_type,
56  const eAttrDomain domain,
57  ExtraColumns extra_columns)
58  : object_eval_(object_eval),
59  geometry_set_(std::move(geometry_set)),
60  component_(geometry_set_.get_component_for_read(component_type)),
61  domain_(domain),
62  extra_columns_(std::move(extra_columns))
63  {
64  }
65 
67  {
68  return object_eval_;
69  }
70 
71  bool has_selection_filter() const override;
73 
75  FunctionRef<void(const SpreadsheetColumnID &, bool is_extra)> fn) const override;
76 
77  std::unique_ptr<ColumnValues> get_column_values(
78  const SpreadsheetColumnID &column_id) const override;
79 
80  int tot_rows() const override;
81 };
82 
83 class VolumeDataSource : public DataSource {
84  const GeometrySet geometry_set_;
85  const VolumeComponent *component_;
86 
87  public:
89  : geometry_set_(std::move(geometry_set)),
90  component_(geometry_set_.get_component_for_read<VolumeComponent>())
91  {
92  }
93 
95  FunctionRef<void(const SpreadsheetColumnID &, bool is_extra)> fn) const override;
96 
97  std::unique_ptr<ColumnValues> get_column_values(
98  const SpreadsheetColumnID &column_id) const override;
99 
100  int tot_rows() const override;
101 };
102 
103 std::unique_ptr<DataSource> data_source_from_geometry(const bContext *C, Object *object_eval);
104 
105 } // namespace blender::ed::spreadsheet
eAttrDomain
Definition: BKE_attribute.h:25
GeometryComponentType
ThreadMutex mutex
bool add(const Key &key, const Value &value)
Definition: BLI_map.hh:250
std::unique_ptr< ColumnValues > get_column_values(const SpreadsheetColumnID &column_id) const
void foreach_default_column_ids(FunctionRef< void(const SpreadsheetColumnID &, bool is_extra)> fn) const
IndexMask apply_selection_filter(Vector< int64_t > &indices) const
std::unique_ptr< ColumnValues > get_column_values(const SpreadsheetColumnID &column_id) const override
void foreach_default_column_ids(FunctionRef< void(const SpreadsheetColumnID &, bool is_extra)> fn) const override
GeometryDataSource(Object *object_eval, GeometrySet geometry_set, const GeometryComponentType component_type, const eAttrDomain domain, ExtraColumns extra_columns)
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
ccl_gpu_kernel_postfix int ccl_global int * indices
std::unique_ptr< DataSource > data_source_from_geometry(const bContext *C, Object *object_eval)