24using namespace Alembic::AbcGeom;
31 IPoints ipoints(
m_iobject, kWrapExisting);
32 m_schema = ipoints.getSchema();
38 return m_schema.valid();
42 const Alembic::AbcCoreAbstract::ObjectHeader &alembic_header,
44 const char **r_err_str)
const
46 if (!Alembic::AbcGeom::IPoints::matches(alembic_header)) {
48 "Object type mismatch, Alembic object path pointed to Points when importing, but not any "
54 *r_err_str =
RPT_(
"Object type mismatch, Alembic object path points to Points.");
67 read_geometry(geometry_set, sample_sel, 0,
"", 1.0f,
nullptr);
72 if (read_pointcloud != pointcloud) {
86 for (
size_t i = 0;
i < positions->size();
i++) {
92 const ISampleSelector &selector,
95 Alembic::AbcGeom::IPointsSchema::Sample
sample = schema.getValue(selector);
97 const P3fArraySamplePtr &positions =
sample.getPositions();
99 ICompoundProperty prop = schema.getArbGeomParams();
100 N3fArraySamplePtr vnormals;
103 const Alembic::Util::uint32_t itime =
static_cast<Alembic::Util::uint32_t
>(
104 selector.getRequestedTime());
105 const IN3fArrayProperty &normals_prop = IN3fArrayProperty(prop,
"N", itime);
108 vnormals = normals_prop.getValue(selector);
117 const Alembic::Abc::ISampleSelector &sample_sel,
119 const char *velocity_name,
120 const float velocity_scale,
121 const char **r_err_str)
125 IPointsSchema::Sample
sample;
127 sample = m_schema.getValue(sample_sel);
129 catch (Alembic::Util::Exception &ex) {
130 *r_err_str =
RPT_(
"Error reading points sample; more detail on the console");
131 printf(
"Alembic: error reading points sample for '%s/%s' at time %f: %s\n",
133 m_schema.getName().c_str(),
134 sample_sel.getRequestedTime(),
142 const P3fArraySamplePtr &positions =
sample.getPositions();
144 const IFloatGeomParam widths_param = m_schema.getWidthsParam();
145 FloatArraySamplePtr widths;
147 if (widths_param.valid()) {
148 IFloatGeomParam::Sample wsample = widths_param.getExpandedValue(sample_sel);
149 widths = wsample.getVals();
152 if (pointcloud->
totpoint != positions->size()) {
164 point_radii[
i] = (*widths)[
i] / 2.0f;
168 point_radii.
fill(0.01f);
176 Imath::V3f nor_in = (*normals)[
i];
182 if (velocity_name !=
nullptr && velocity_scale != 0.0f) {
183 V3fArraySamplePtr velocities =
get_velocity_prop(m_schema, sample_sel, velocity_name);
184 if (velocities && pointcloud->
totpoint ==
int(velocities->size())) {
192 const Imath::V3f &vel_in = (*velocities)[
i];
194 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, eCustomDataType 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 float normals[][3]
static N3fArraySamplePtr read_points_sample(const IPointsSchema &schema, const ISampleSelector &selector, MutableSpan< float3 > r_points)
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)
bool has_property(const Alembic::Abc::ICompoundProperty &prop, const std::string &name)
bool has_animations(Alembic::AbcGeom::IPolyMeshSchema &schema, ImportSettings *settings)
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