26using namespace Alembic::AbcGeom;
33 IPoints ipoints(
m_iobject, kWrapExisting);
34 m_schema = ipoints.getSchema();
40 return m_schema.valid();
44 const Alembic::AbcCoreAbstract::ObjectHeader &alembic_header,
46 const char **r_err_str)
const
48 if (!Alembic::AbcGeom::IPoints::matches(alembic_header)) {
50 "Object type mismatch, Alembic object path pointed to Points when importing, but not any "
56 *r_err_str =
RPT_(
"Object type mismatch, Alembic object path points to Points.");
69 read_geometry(geometry_set, sample_sel, 0,
"", 1.0f,
nullptr);
74 if (read_pointcloud != pointcloud) {
88 for (
size_t i = 0;
i < positions->size();
i++) {
94 const ISampleSelector &selector,
97 Alembic::AbcGeom::IPointsSchema::Sample
sample = schema.getValue(selector);
99 const P3fArraySamplePtr &positions =
sample.getPositions();
105 static_assert(std::is_same_v<TIn, TOut>,
106 "convert_abc_value needs to be explicitly specialized for each pair of types");
124 return in.getValue();
127template<
typename TArrayProperty,
typename TWriteValue>
129 const ISampleSelector &selector,
130 const std::string &
name,
133 const TArrayProperty &array_prop = TArrayProperty(parent,
name);
135 using SamplePtr =
typename TArrayProperty::sample_ptr_type;
136 using ValueType =
typename TArrayProperty::value_type;
138 const SamplePtr sample_ptr = array_prop.getValue(selector);
143 ValueType value = (*sample_ptr)[
i];
151 const ISampleSelector &selector,
154 const ICompoundProperty prop = schema.getArbGeomParams();
159 for (
size_t i = 0;
i < prop.getNumProperties();
i++) {
160 const PropertyHeader header = prop.getPropertyHeader(
i);
161 const PropertyType property_type = header.getPropertyType();
162 if (property_type != kArrayProperty) {
167 const DataType data_type = header.getDataType();
168 const MetaData metadata = header.getMetaData();
169 const std::string interpretation = metadata.get(
"interpretation");
170 const std::string
name = header.getName();
172 if (data_type ==
DataType(kFloat32POD, 3)) {
173 if (interpretation == C3fTPTraits::interpretation()) {
175 prop, selector,
name, attribute_accessor);
177 else if (interpretation == N3fTPTraits::interpretation()) {
179 prop, selector,
name, attribute_accessor);
183 prop, selector,
name, attribute_accessor);
186 else if (data_type ==
DataType(kFloat32POD, 2)) {
188 prop, selector,
name, attribute_accessor);
190 else if (data_type ==
DataType(kFloat32POD, 1)) {
192 prop, selector,
name, attribute_accessor);
198 const Alembic::Abc::ISampleSelector &sample_sel,
200 const char *velocity_name,
201 const float velocity_scale,
202 const char **r_err_str)
206 IPointsSchema::Sample
sample;
208 sample = m_schema.getValue(sample_sel);
210 catch (Alembic::Util::Exception &ex) {
211 *r_err_str =
RPT_(
"Error reading points sample; more detail on the console");
212 printf(
"Alembic: error reading points sample for '%s/%s' at time %f: %s\n",
214 m_schema.getName().c_str(),
215 sample_sel.getRequestedTime(),
223 const P3fArraySamplePtr &positions =
sample.getPositions();
225 const IFloatGeomParam widths_param = m_schema.getWidthsParam();
226 FloatArraySamplePtr widths;
228 if (widths_param.valid()) {
229 IFloatGeomParam::Sample wsample = widths_param.getExpandedValue(sample_sel);
230 widths = wsample.getVals();
233 if (pointcloud->
totpoint != positions->size()) {
246 point_radii[
i] = (*widths)[
i] / 2.0f;
250 point_radii.
fill(0.01f);
255 if (velocity_name !=
nullptr && velocity_scale != 0.0f) {
256 V3fArraySamplePtr velocities =
get_velocity_prop(m_schema, sample_sel, velocity_name);
257 if (velocities && pointcloud->
totpoint ==
int(velocities->size())) {
265 const Imath::V3f &vel_in = (*velocities)[
i];
267 point_velocity[
i] *= velocity_scale;
General operations, lookup, etc. for blender objects.
Object * BKE_object_add_only_object(Main *bmain, int type, const char *name) ATTR_RETURNS_NONNULL
General operations for point clouds.
PointCloud * BKE_pointcloud_add(Main *bmain, const char *name)
void BKE_pointcloud_nomain_to_pointcloud(PointCloud *pointcloud_src, PointCloud *pointcloud_dst)
PointCloud * BKE_pointcloud_new_nomain(int totpoint)
Object is a sort of wrapper for general info.
constexpr int64_t size() const
constexpr void fill(const T &value) const
GSpanAttributeWriter lookup_or_add_for_write_span(StringRef attribute_id, AttrDomain domain, AttrType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
std::string m_object_name
Alembic::Abc::IObject m_iobject
AbcObjectReader(const Alembic::Abc::IObject &object, ImportSettings &settings)
ImportSettings * m_settings
bool accepts_object_type(const Alembic::AbcCoreAbstract::ObjectHeader &alembic_header, const Object *const ob, const char **r_err_str) const override
AbcPointsReader(const Alembic::Abc::IObject &object, ImportSettings &settings)
void read_geometry(bke::GeometrySet &geometry_set, const Alembic::Abc::ISampleSelector &sample_sel, int read_flag, const char *velocity_name, float velocity_scale, const char **r_err_str) override
bool valid() const override
void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) override
static void read_typed_property_sample(const ICompoundProperty &parent, const ISampleSelector &selector, const std::string &name, bke::MutableAttributeAccessor &attribute_accessor)
static void read_points(const P3fArraySamplePtr positions, MutableSpan< float3 > r_points)
void get_min_max_time(const Alembic::AbcGeom::IObject &object, const Schema &schema, chrono_t &min, chrono_t &max)
BLI_INLINE void copy_zup_from_yup(float zup[3], const float yup[3])
V3fArraySamplePtr get_velocity_prop(const Alembic::Abc::ICompoundProperty &schema, const Alembic::AbcGeom::ISampleSelector &selector, const std::string &name)
static void read_point_arb_geom_params(const IPointsSchema &schema, const ISampleSelector &selector, bke::MutableAttributeAccessor &attribute_accessor)
static void read_points_sample(const IPointsSchema &schema, const ISampleSelector &selector, MutableSpan< float3 > r_points)
static TOut convert_abc_value(const TIn &in)
bool has_animations(Alembic::AbcGeom::IPolyMeshSchema &schema, ImportSettings *settings)
VecBase< float, 2 > float2
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
GeometryComponent & get_component_for_write(GeometryComponent::Type component_type)
PointCloud * get_pointcloud_for_write()
bool has_pointcloud() const
void replace_pointcloud(PointCloud *pointcloud, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
static GeometrySet from_pointcloud(PointCloud *pointcloud, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
MutableVArraySpan< T > span