54uint64_t SpreadsheetInstanceID::hash()
const
89 fn({(
char *)
"Original Index"},
false);
94 fn({(
char *)
"Original Index"},
false);
99 fn({(
char *)
"Original Index"},
false);
101 fn({(
char *)
"Corner Start"},
false);
102 fn({(
char *)
"Corner Size"},
false);
118 if (
name ==
"Original Index") {
119 const int *
data =
static_cast<const int *
>(
122 return std::make_unique<ColumnValues>(
name,
129 if (
name ==
"Original Index") {
130 const int *
data =
static_cast<const int *
>(
133 return std::make_unique<ColumnValues>(
name,
140 if (
name ==
"Original Index") {
141 const int *
data =
static_cast<const int *
>(
144 return std::make_unique<ColumnValues>(
name,
148 if (
name ==
"Corner Start") {
149 return std::make_unique<ColumnValues>(
152 if (
name ==
"Corner Size") {
154 return std::make_unique<ColumnValues>(
156 return faces[index].size();
170bool GeometryDataSource::display_attribute(
const StringRef name,
176 if (!show_internal_attributes_) {
192 std::optional<const bke::AttributeAccessor> attributes = this->get_component_attributes();
193 if (!attributes.has_value()) {
196 if (attributes->domain_size(domain_) == 0) {
201 fn({(
char *)
"Name"},
false);
205 fn({(
char *)
"Name"},
false);
209 if (iter.
domain != domain_) {
212 if (!display_attribute(iter.
name, iter.
domain)) {
217 const bool is_front = iter.
name ==
".viewer";
218 fn(column_id, is_front);
222 fn({(
char *)
"Position"},
false);
223 fn({(
char *)
"Rotation"},
false);
224 fn({(
char *)
"Scale"},
false);
237 std::optional<const bke::AttributeAccessor> attributes = this->get_component_attributes();
238 if (!attributes.has_value()) {
241 const int domain_num = attributes->domain_size(domain_);
242 if (domain_num == 0) {
245 if (!display_attribute(column_id.
name, domain_)) {
249 std::lock_guard
lock{mutex_};
256 Span<int> reference_handles = instances->reference_handles();
258 return std::make_unique<ColumnValues>(
261 domain_num, [reference_handles, references](
int64_t index) {
262 return references[reference_handles[index]];
267 return std::make_unique<ColumnValues>(
269 return transforms[index].location();
273 return std::make_unique<ColumnValues>(
275 return float3(math::to_euler(math::normalize(transforms[index])));
279 return std::make_unique<ColumnValues>(
281 return math::to_scale<true>(transforms[index]);
292 return std::make_unique<ColumnValues>(
295 StringRefNull name = layers[index]->name();
296 if (name.is_empty()) {
297 name = IFACE_(
"(Layer)");
299 return std::string(
name);
308 *
mesh, domain_, column_id.name))
315 bke::GAttributeReader attribute = attributes->lookup(column_id.name);
319 GVArray varray = std::move(attribute.varray);
320 if (attribute.domain != domain_) {
324 StringRefNull column_display_name = column_id.name;
325 if (column_display_name ==
".viewer") {
326 column_display_name =
"Viewer";
329 return std::make_unique<ColumnValues>(column_display_name, std::move(varray));
334 std::optional<const bke::AttributeAccessor> attributes = this->get_component_attributes();
335 if (!attributes.has_value()) {
338 return attributes->domain_size(domain_);
346 switch (component_->type()) {
348 if (object_orig_->type !=
OB_MESH) {
380 const Mesh &mesh_orig,
394 if (
const int *orig_indices =
static_cast<const int *
>(
398 const int orig = orig_indices[
i];
410 const Mesh &mesh_orig,
427 if (
const int *orig_indices =
static_cast<const int *
>(
431 const int orig = orig_indices[
i];
449 if (
const int *orig_indices =
static_cast<const int *
>(
453 const int orig = orig_indices[
i];
469 mesh_eval, mesh_orig, face_memory);
473 if (face_mask.
size() == range.
size()) {
492 std::lock_guard
lock{mutex_};
498 switch (component_->type()) {
502 const Mesh *mesh_eval = geometry_set_.get_mesh();
503 const Mesh *mesh_orig =
static_cast<const Mesh *
>(object_orig_->data);
509 const Curves &curves_id = *component.
get();
532std::optional<const bke::AttributeAccessor> GeometryDataSource::get_component_attributes()
const
535 return component_->attributes();
537 const GreasePencil *grease_pencil = geometry_set_.get_grease_pencil();
538 if (!grease_pencil) {
542 return grease_pencil->attributes();
544 if (layer_index_ >= 0 && layer_index_ < grease_pencil->layers().
size()) {
545 if (
const bke::greasepencil::Drawing *drawing = grease_pencil->get_eval_drawing(
546 grease_pencil->layer(layer_index_)))
548 return drawing->strokes().attributes();
557 if (component_->is_empty()) {
561 for (
const char *
name :
562 {
"Grid Name",
"Data Type",
"Class",
"Extent",
"Voxels",
"Leaf Voxels",
"Tiles",
"Size"})
565 fn(column_id,
false);
570static StringRef grid_class_name(
const bke::VolumeGridData &grid_data)
572 openvdb::GridClass grid_class = grid_data.grid_class();
573 if (grid_class == openvdb::GridClass::GRID_FOG_VOLUME) {
574 return IFACE_(
"Fog Volume");
576 if (grid_class == openvdb::GridClass::GRID_LEVEL_SET) {
577 return IFACE_(
"Level Set");
586 const Volume *volume = component_->get();
587 if (volume ==
nullptr) {
593 if (
STREQ(column_id.
name,
"Grid Name")) {
594 return std::make_unique<ColumnValues>(
597 return volume_grid->name();
600 if (
STREQ(column_id.
name,
"Data Type")) {
601 return std::make_unique<ColumnValues>(
605 const char *
name =
nullptr;
611 return std::make_unique<ColumnValues>(
617 return std::make_unique<ColumnValues>(
622 if (
STREQ(column_id.
name,
"Leaf Voxels")) {
623 return std::make_unique<ColumnValues>(
629 return std::make_unique<ColumnValues>(
635 return std::make_unique<ColumnValues>(
639 [volume](
const int64_t index) {
645 return std::make_unique<ColumnValues>(
659 const Volume *volume = component_->get();
660 if (volume ==
nullptr) {
668VolumeGridDataSource::VolumeGridDataSource(
const bke::GVolumeGrid &grid)
669 : grid_(std::make_unique<
bke::GVolumeGrid>(grid))
673void VolumeGridDataSource::foreach_default_column_ids(
680 for (
const char *
name :
681 {
"Data Type",
"Class",
"Extent",
"Voxels",
"Leaf Voxels",
"Tiles",
"Size"})
684 fn(column_id,
false);
688std::unique_ptr<ColumnValues> VolumeGridDataSource::get_column_values(
691 const bke::VolumeGridData &grid = grid_->get();
692 if (
STREQ(column_id.
name,
"Data Type")) {
694 const char *
name =
nullptr;
696 return std::make_unique<ColumnValues>(
IFACE_(
"Data Type"),
700 const StringRef
name = grid_class_name(grid_->get());
701 return std::make_unique<ColumnValues>(
IFACE_(
"Class"),
705 const int64_t active_voxels = grid.active_voxels();
706 return std::make_unique<ColumnValues>(
IFACE_(
"Voxels"),
709 if (
STREQ(column_id.
name,
"Leaf Voxels")) {
710 const int64_t active_leaf_voxels = grid.active_leaf_voxels();
711 return std::make_unique<ColumnValues>(
IFACE_(
"Leaf Voxels"),
715 const int64_t active_tiles = grid.active_tiles();
716 return std::make_unique<ColumnValues>(
IFACE_(
"Tiles"),
721 return std::make_unique<ColumnValues>(
725 const int3 extent =
int3(grid.active_bounds().dim().asPointer());
731int VolumeGridDataSource::tot_rows()
const
743 if (list_->size() == 0) {
747 for (
const char *
name : {
"Value"}) {
749 fn(column_id,
false);
757 return std::make_unique<ColumnValues>(
IFACE_(
"Value"), list_->varray());
764 return list_->size();
769 this->collect_flat_items(*bundle_,
"");
775 if (bundle_->is_empty()) {
779 for (
const char *
name : {
"Identifier",
"Type",
"Value"}) {
781 fn(column_id,
false);
788 if (
STREQ(column_id.
name,
"Identifier")) {
789 return std::make_unique<ColumnValues>(
IFACE_(
"Identifier"),
793 return std::make_unique<ColumnValues>(
796 flat_items_.size(), [items = flat_items_](
int64_t index) -> std::string {
797 const nodes::BundleItemValue &value = *items[index];
798 if (const auto *socket_value = std::get_if<nodes::BundleItemSocketValue>(
800 const bke::SocketValueVariant &value_variant = socket_value->value;
801 const StringRef type_name = IFACE_(socket_value->type->label);
802 if (value_variant.is_single()) {
805 if (value_variant.is_context_dependent_field()) {
806 return fmt::format(
"{} {}", type_name, IFACE_(
"Field"));
808 if (value_variant.is_volume_grid()) {
809 return fmt::format(
"{} {}", type_name, IFACE_(
"Grid"));
811 if (value_variant.is_list()) {
812 return fmt::format(
"{} {}", type_name, IFACE_(
"List"));
816 if (
const auto *internal_value = std::get_if<nodes::BundleItemInternalValue>(
818 return internal_value->value->type_name();
824 return std::make_unique<ColumnValues>(
829 return *items[index];
837 return flat_item_keys_.size();
844 const std::string path = parent_path.
is_empty() ?
847 flat_item_keys_.
append(path);
848 flat_items_.append(&item.value);
849 if (
const auto *value = std::get_if<nodes::BundleItemSocketValue>(&item.value.value)) {
850 if (value->value.is_single()) {
851 const GPointer ptr = value->value.get_single_ptr();
855 this->collect_flat_items(*child_bundle, path);
865 : closure_(std::move(closure)), in_out_(in_out)
874 columns_names.
append(
"Interface");
876 columns_names.
extend({
"Identifier",
"Type"});
880 fn(column_id,
false);
892 const int items_sum = input_items.
size() + output_items.
size();
893 if (
STREQ(column_id.
name,
"Identifier")) {
894 return std::make_unique<ColumnValues>(
897 [input_items, output_items](
const int64_t index) {
898 if (index < input_items.
size()) {
899 return input_items[index].key;
901 return output_items[index - input_items.
size()].key;
905 return std::make_unique<ColumnValues>(
908 items_sum, [input_items, output_items](
const int64_t index) {
909 if (index < input_items.
size()) {
910 return input_items[index].type->label;
912 return output_items[index - input_items.
size()].type->label;
915 if (
STREQ(column_id.
name,
"Interface")) {
916 return std::make_unique<ColumnValues>(
919 [inputs_num = input_items.
size()](
const int64_t index) {
920 if (index < inputs_num) {
921 return IFACE_(
"Input");
933 if (
STREQ(column_id.
name,
"Identifier")) {
934 return std::make_unique<ColumnValues>(
937 [items](
int64_t index) { return items[index].key; }));
940 return std::make_unique<ColumnValues>(
942 return items[index].type->label;
953 const int inputs_num = closure_->signature().inputs.size();
954 const int outputs_num = closure_->signature().outputs.size();
957 return inputs_num + outputs_num;
967 : value_gvarray_(
GVArray::from_single(*value.type(), 1, value.get()))
974 for (
const char *
name : {
"Value"}) {
976 fn(column_id,
false);
984 return std::make_unique<ColumnValues>(
IFACE_(
"Value"), value_gvarray_);
996 switch (reference.
type()) {
1002 return ICON_OUTLINER_COLLECTION;
1005 return ICON_GEOMETRY_SET;
1074 if (item_index == -1) {
1083 for (
int i = item_index - 1;
i >= 0;
i--) {
1112 const auto *stored_value = std::get_if<nodes::BundleItemSocketValue>(&item->value);
1113 if (!stored_value) {
1116 value = stored_value->value;
1127 return std::nullopt;
1131 return std::nullopt;
1147 if (instance_id.reference_index < 0 || instance_id.reference_index >= references.
size()) {
1169 return std::make_unique<VolumeGridDataSource>(display_data.
get<bke::GVolumeGrid>());
1191 if (!geometry_set.has(component_type)) {
1196 return std::make_unique<VolumeDataSource>(std::move(geometry_set));
1201 return std::make_unique<GeometryDataSource>(object_orig,
1202 std::move(geometry_set),
1205 sspreadsheet->
flag &
1212 return std::make_unique<BundleDataSource>(bundle_ptr);
1221 return std::make_unique<ClosureSignatureDataSource>(closure_ptr, in_out);
1229 return std::make_unique<SingleValueDataSource>(
ptr);
SpaceSpreadsheet * CTX_wm_space_spreadsheet(const bContext *C)
Low-level operations for curves.
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
Low-level operations for grease pencil.
void * BKE_id_new_nomain(short type, const char *name)
int BKE_volume_num_grids(const Volume *volume)
const blender::bke::VolumeGridData * BKE_volume_grid_get(const Volume *volume, int grid_index)
#define BLI_assert_unreachable()
void void BLI_INLINE bool BLI_listbase_is_single(const ListBase *lb)
T * DEG_get_original(T *id)
@ SPREADSHEET_OBJECT_EVAL_STATE_ORIGINAL
eSpreadsheetColumnValueType
@ SPREADSHEET_VALUE_TYPE_UNKNOWN
@ SPREADSHEET_FLAG_SHOW_INTERNAL_ATTRIBUTES
struct SpreadsheetColumnID SpreadsheetColumnID
SpreadsheetClosureInputOutput
@ SPREADSHEET_CLOSURE_INPUT
@ SPREADSHEET_CLOSURE_OUTPUT
@ SPREADSHEET_CLOSURE_NONE
int ED_outliner_icon_from_id(const ID &id)
#define BM_elem_flag_test_bool(ele, hflag)
BMesh const char void * data
void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
BLI_INLINE BMEdge * BM_edge_at_index(BMesh *bm, const int index)
BLI_INLINE BMVert * BM_vert_at_index(BMesh *bm, const int index)
BLI_INLINE BMFace * BM_face_at_index(BMesh *bm, const int index)
void BM_mesh_bm_to_me_for_eval(BMesh &bm, Mesh &mesh, const CustomData_MeshMasks *cd_mask_extra)
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void append(const T &value)
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
static IndexMask from_bools(Span< bool > bools, IndexMaskMemory &memory)
constexpr int64_t size() const
constexpr int64_t size() const
constexpr bool is_empty() const
constexpr const char * data() const
static VArray from_std_func(const int64_t size, std::function< T(int64_t index)> get_func)
static VArray from_single(T value, const int64_t size)
static VArray from_func(const int64_t size, GetFunc get_func)
static VArray from_span(Span< T > values)
void append(const T &value)
void extend(Span< T > array)
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, AttrType data_type, const void *default_value=nullptr) const
GVArray adapt_domain(const GVArray &varray, const AttrDomain from_domain, const AttrDomain to_domain) const
int domain_size(const AttrDomain domain) const
const Curves * get() const
const GreasePencil * get() const
void to_geometry_set(GeometrySet &r_geometry_set) const
const Instances * get() const
Span< InstanceReference > references() const
bool is_context_dependent_field() const
bool is_volume_grid() const
static SocketValueVariant From(T &&value)
GPointer get_single_ptr() const
std::unique_ptr< ColumnValues > get_column_values(const SpreadsheetColumnID &column_id) const override
int tot_rows() const override
BundleDataSource(nodes::BundlePtr bundle)
void foreach_default_column_ids(FunctionRef< void(const SpreadsheetColumnID &, bool is_extra)> fn) const override
int tot_rows() const override
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
ClosureSignatureDataSource(nodes::ClosurePtr closure, SpreadsheetClosureInputOutput in_out)
IndexMask apply_selection_filter(IndexMaskMemory &memory) const
bool has_selection_filter() const override
std::unique_ptr< ColumnValues > get_column_values(const SpreadsheetColumnID &column_id) const override
int tot_rows() const override
void foreach_default_column_ids(FunctionRef< void(const SpreadsheetColumnID &, bool is_extra)> fn) const override
void foreach_default_column_ids(FunctionRef< void(const SpreadsheetColumnID &, bool is_extra)> fn) const override
int tot_rows() const override
ListDataSource(nodes::ListPtr list)
std::unique_ptr< ColumnValues > get_column_values(const SpreadsheetColumnID &column_id) const override
int tot_rows() const override
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
SingleValueDataSource(const GPointer value)
void foreach_default_column_ids(FunctionRef< void(const SpreadsheetColumnID &, bool is_extra)> fn) const override
int tot_rows() const override
std::unique_ptr< ColumnValues > get_column_values(const SpreadsheetColumnID &column_id) const override
void to_bools(MutableSpan< bool > r_bools) const
Span< StoredItem > items() const
static std::string combine_path(const Span< StringRef > path)
static const ViewerNodeLog * find_viewer_node_log_for_path(const ViewerPath &viewer_path)
CustomIDVectorSet< Item, ItemIdentifierGetter > items
bool attribute_name_is_anonymous(const StringRef name)
bool allow_procedural_attribute_access(StringRef attribute_name)
GeometrySet object_get_evaluated_geometry_set(const Object &object, bool apply_subdiv=true)
IndexMask retrieve_selected_curves(const bke::CurvesGeometry &curves, IndexMaskMemory &memory)
IndexMask retrieve_selected_points(const bke::CurvesGeometry &curves, IndexMaskMemory &memory)
const nodes::geo_eval_log::ViewerNodeLog * viewer_node_log_lookup(const SpaceSpreadsheet &sspreadsheet)
bke::GeometrySet get_geometry_set_for_instance_ids(const bke::GeometrySet &root_geometry, const Span< SpreadsheetInstanceID > instance_ids)
static IndexMask calc_mesh_selection_mask_faces(const Mesh &mesh_eval, const Mesh &mesh_orig, IndexMaskMemory &memory)
bke::SocketValueVariant geometry_display_data_get(const SpaceSpreadsheet *sspreadsheet, Object *object_eval)
int get_instance_reference_icon(const bke::InstanceReference &reference)
std::unique_ptr< DataSource > data_source_from_geometry(const bContext *C, Object *object_eval)
static IndexMask calc_mesh_selection_mask(const Mesh &mesh_eval, const Mesh &mesh_orig, const bke::AttrDomain domain, IndexMaskMemory &memory)
eSpreadsheetColumnValueType cpp_type_to_column_type(const CPPType &type)
static void add_mesh_debug_column_names(const Mesh &mesh, const bke::AttrDomain domain, FunctionRef< void(const SpreadsheetColumnID &, bool is_extra)> fn)
std::optional< bke::GeometrySet > root_geometry_set_get(const SpaceSpreadsheet *sspreadsheet, Object *object_eval)
static std::unique_ptr< ColumnValues > build_mesh_debug_columns(const Mesh &mesh, const bke::AttrDomain domain, const StringRef name)
ImplicitSharingPtr< Bundle > BundlePtr
ImplicitSharingPtr< List > ListPtr
ImplicitSharingPtr< Closure > ClosurePtr
uint64_t get_default_hash(const T &v, const Args &...args)
VecBase< int32_t, 3 > int3
bool RNA_enum_name_from_value(const EnumPropertyItem *item, int value, const char **r_name)
const EnumPropertyItem rna_enum_volume_grid_data_type_items[]
bool operator!=(const SpreadsheetInstanceID &a, const SpreadsheetInstanceID &b)
bool operator==(const SpreadsheetInstanceID &a, const SpreadsheetInstanceID &b)
MeshRuntimeHandle * runtime
SpreadsheetTableIDGeometry geometry_id
int8_t closure_input_output
SpreadsheetBundlePathElem * bundle_path
uint8_t object_eval_state
int viewer_item_identifier
SpreadsheetInstanceID * instance_ids
uint8_t geometry_component_type
static GeometrySet from_grease_pencil(GreasePencil *grease_pencil, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
static GeometrySet from_curves(Curves *curves, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
static GeometrySet from_mesh(Mesh *mesh, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
static GeometrySet from_pointcloud(PointCloud *pointcloud, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)