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.");
68 read_geometry(geometry_set, sample_sel, 0,
"", 1.0f,
nullptr);
73 if (read_point_cloud != point_cloud) {
87 for (
size_t i = 0; i < positions->size(); i++) {
93 const ISampleSelector &selector,
96 Alembic::AbcGeom::IPointsSchema::Sample
sample = schema.getValue(selector);
98 const P3fArraySamplePtr &positions =
sample.getPositions();
100 ICompoundProperty prop = schema.getArbGeomParams();
101 N3fArraySamplePtr vnormals;
104 const Alembic::Util::uint32_t itime =
static_cast<Alembic::Util::uint32_t
>(
105 selector.getRequestedTime());
106 const IN3fArrayProperty &normals_prop = IN3fArrayProperty(prop,
"N", itime);
109 vnormals = normals_prop.getValue(selector);
118 const Alembic::Abc::ISampleSelector &sample_sel,
120 const char *velocity_name,
121 const float velocity_scale,
122 const char **r_err_str)
126 IPointsSchema::Sample
sample;
128 sample = m_schema.getValue(sample_sel);
130 catch (Alembic::Util::Exception &ex) {
131 *r_err_str =
RPT_(
"Error reading points sample; more detail on the console");
132 printf(
"Alembic: error reading points sample for '%s/%s' at time %f: %s\n",
134 m_schema.getName().c_str(),
135 sample_sel.getRequestedTime(),
141 PointCloud *point_cloud = existing_point_cloud;
143 const P3fArraySamplePtr &positions =
sample.getPositions();
145 const IFloatGeomParam widths_param = m_schema.getWidthsParam();
146 FloatArraySamplePtr radii;
148 if (widths_param.valid()) {
149 IFloatGeomParam::Sample wsample = widths_param.getExpandedValue(sample_sel);
150 radii = wsample.getVals();
153 if (point_cloud->
totpoint != positions->size()) {
162 N3fArraySamplePtr normals =
read_points_sample(m_schema, sample_sel, point_positions);
163 positions_writer.
finish();
170 for (
size_t i = 0; i < radii->size(); i++) {
171 point_radii[i] = (*radii)[i];
175 point_radii.fill(0.01f);
177 point_radii_writer.
finish();
183 for (
size_t i = 0; i < normals->size(); i++) {
184 Imath::V3f nor_in = (*normals)[i];
190 if (velocity_name !=
nullptr && velocity_scale != 0.0f) {
191 V3fArraySamplePtr velocities =
get_velocity_prop(m_schema, sample_sel, velocity_name);
192 if (velocities && point_cloud->
totpoint ==
int(velocities->size())) {
197 for (
size_t i = 0; i < velocities->size(); i++) {
198 const Imath::V3f &vel_in = (*velocities)[i];
200 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.
void BKE_pointcloud_nomain_to_pointcloud(PointCloud *pointcloud_src, PointCloud *pointcloud_dst)
PointCloud * BKE_pointcloud_new_nomain(int totpoint)
void * BKE_pointcloud_add_default(Main *bmain, const char *name)
Object is a sort of wrapper for general info.
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
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 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)
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
bool always_add_cache_reader