Refactor: Replace BKE_attributes_supported
with C++ API
This removes `BKE_attributes_supported`. Instead, a static method `from_id` is added to the `AttributeAccessor` class that constructs the accessor from the given ID. If this fails, `std::nullopt` is returned. Pull Request: https://projects.blender.org/blender/blender/pulls/124245
This commit is contained in:
parent
5360722449
commit
f23ade5ac4
@ -18,7 +18,8 @@
|
||||
|
||||
namespace blender::bke {
|
||||
enum class AttrDomain : int8_t;
|
||||
}
|
||||
class AttributeAccessor;
|
||||
} // namespace blender::bke
|
||||
struct CustomData;
|
||||
struct CustomDataLayer;
|
||||
struct ID;
|
||||
@ -73,8 +74,6 @@ class AttributeOwner {
|
||||
|
||||
/* Attributes. */
|
||||
|
||||
bool BKE_attributes_supported(const AttributeOwner &owner);
|
||||
|
||||
/**
|
||||
* Create a new attribute layer.
|
||||
*/
|
||||
|
@ -477,6 +477,11 @@ class AttributeAccessor {
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct an #AttributeAccessor from an ID.
|
||||
*/
|
||||
static std::optional<AttributeAccessor> from_id(const ID &id);
|
||||
|
||||
/**
|
||||
* \return True, when the attribute is available.
|
||||
*/
|
||||
|
@ -188,17 +188,6 @@ static std::optional<blender::bke::MutableAttributeAccessor> get_attribute_acces
|
||||
|
||||
} // namespace blender::bke
|
||||
|
||||
bool BKE_attributes_supported(const AttributeOwner &owner)
|
||||
{
|
||||
const std::array<DomainInfo, ATTR_DOMAIN_NUM> info = get_domains(owner);
|
||||
for (const int domain : IndexRange(ATTR_DOMAIN_NUM)) {
|
||||
if (info[domain].customdata) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool bke_attribute_rename_if_exists(AttributeOwner &owner,
|
||||
const char *old_name,
|
||||
const char *new_name,
|
||||
|
@ -5,12 +5,17 @@
|
||||
#include <utility>
|
||||
|
||||
#include "BKE_attribute_math.hh"
|
||||
#include "BKE_curves.hh"
|
||||
#include "BKE_customdata.hh"
|
||||
#include "BKE_deform.hh"
|
||||
#include "BKE_geometry_set.hh"
|
||||
#include "BKE_type_conversions.hh"
|
||||
|
||||
#include "DNA_ID.h"
|
||||
#include "DNA_grease_pencil_types.h"
|
||||
#include "DNA_mesh_types.h"
|
||||
#include "DNA_meshdata_types.h"
|
||||
#include "DNA_pointcloud_types.h"
|
||||
|
||||
#include "BLI_array_utils.hh"
|
||||
#include "BLI_color.hh"
|
||||
@ -582,6 +587,23 @@ static GVArray try_adapt_data_type(GVArray varray, const CPPType &to_type)
|
||||
return conversions.try_convert(std::move(varray), to_type);
|
||||
}
|
||||
|
||||
std::optional<AttributeAccessor> AttributeAccessor::from_id(const ID &id)
|
||||
{
|
||||
switch (GS(id.name)) {
|
||||
case ID_ME:
|
||||
return reinterpret_cast<const Mesh &>(id).attributes();
|
||||
case ID_PT:
|
||||
return reinterpret_cast<const PointCloud &>(id).attributes();
|
||||
case ID_CV:
|
||||
return reinterpret_cast<const Curves &>(id).geometry.wrap().attributes();
|
||||
case ID_GP:
|
||||
return reinterpret_cast<const GreasePencil &>(id).attributes();
|
||||
default:
|
||||
return {};
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
GAttributeReader AttributeAccessor::lookup(const AttributeIDRef &attribute_id,
|
||||
const std::optional<AttrDomain> domain,
|
||||
const std::optional<eCustomDataType> data_type) const
|
||||
|
@ -211,15 +211,17 @@ bool attribute_set_poll(bContext &C, const ID &object_data)
|
||||
|
||||
static bool geometry_attributes_poll(bContext *C)
|
||||
{
|
||||
using namespace blender::bke;
|
||||
const Object *ob = object::context_object(C);
|
||||
const Main *bmain = CTX_data_main(C);
|
||||
ID *data = (ob) ? static_cast<ID *>(ob->data) : nullptr;
|
||||
AttributeOwner owner = AttributeOwner::from_id(data);
|
||||
if (!owner.is_valid()) {
|
||||
if (!ob || !BKE_id_is_editable(bmain, &ob->id)) {
|
||||
return false;
|
||||
}
|
||||
return (ob && BKE_id_is_editable(bmain, &ob->id) && data && BKE_id_is_editable(bmain, data)) &&
|
||||
BKE_attributes_supported(owner);
|
||||
const ID *data = (ob) ? static_cast<const ID *>(ob->data) : nullptr;
|
||||
if (!data || !BKE_id_is_editable(bmain, data)) {
|
||||
return false;
|
||||
}
|
||||
return AttributeAccessor::from_id(*data).has_value();
|
||||
}
|
||||
|
||||
static bool geometry_attributes_remove_poll(bContext *C)
|
||||
|
Loading…
Reference in New Issue
Block a user