Alembic: Construct ISampleSelector once and pass along

No longer passing time as float and constructing ISampleSelectors all
over the place. Instead, just construct an ISampleSelector once and
pass it along.
This commit is contained in:
Sybren A. Stüvel 2017-04-21 11:04:47 +02:00
parent df84082c70
commit 099816587a
15 changed files with 78 additions and 58 deletions

@ -117,11 +117,10 @@ bool AbcCameraReader::valid() const
return m_schema.valid();
}
void AbcCameraReader::readObjectData(Main *bmain, float time)
void AbcCameraReader::readObjectData(Main *bmain, const ISampleSelector &sample_sel)
{
Camera *bcam = static_cast<Camera *>(BKE_camera_add(bmain, m_data_name.c_str()));
ISampleSelector sample_sel(time);
CameraSample cam_sample;
m_schema.get(cam_sample, sample_sel);

@ -55,7 +55,7 @@ public:
bool valid() const;
void readObjectData(Main *bmain, float time);
void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel);
};
#endif /* __ABC_CAMERA_H__ */
#endif /* __ABC_CAMERA_H__ */

@ -211,7 +211,7 @@ bool AbcCurveReader::valid() const
return m_curves_schema.valid();
}
void AbcCurveReader::readObjectData(Main *bmain, float time)
void AbcCurveReader::readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel)
{
Curve *cu = BKE_curve_add(bmain, m_data_name.c_str(), OB_CURVE);
@ -219,8 +219,6 @@ void AbcCurveReader::readObjectData(Main *bmain, float time)
cu->actvert = CU_ACT_NONE;
cu->resolu = 1;
const ISampleSelector sample_sel(time);
ICompoundProperty user_props = m_curves_schema.getUserProperties();
if (user_props) {
const PropertyHeader *header = user_props.getPropertyHeader(ABC_CURVE_RESOLUTION_U_PROPNAME);
@ -389,9 +387,11 @@ void read_curve_sample(Curve *cu, const ICurvesSchema &schema, const ISampleSele
* object directly and create a new DerivedMesh from that. Also we might need to
* create new or delete existing NURBS in the curve.
*/
DerivedMesh *AbcCurveReader::read_derivedmesh(DerivedMesh * /*dm*/, const float time, int /*read_flag*/, const char ** /*err_str*/)
DerivedMesh *AbcCurveReader::read_derivedmesh(DerivedMesh * /*dm*/,
const ISampleSelector &sample_sel,
int /*read_flag*/,
const char ** /*err_str*/)
{
ISampleSelector sample_sel(time);
const ICurvesSchema::Sample sample = m_curves_schema.getValue(sample_sel);
const P3fArraySamplePtr &positions = sample.getPositions();

@ -55,8 +55,11 @@ public:
bool valid() const;
void readObjectData(Main *bmain, float time);
DerivedMesh *read_derivedmesh(DerivedMesh *, const float time, int read_flag, const char **err_str);
void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel);
DerivedMesh *read_derivedmesh(DerivedMesh *dm,
const Alembic::Abc::ISampleSelector &sample_sel,
int read_flag,
const char **err_str);
};
/* ************************************************************************** */

@ -1021,17 +1021,15 @@ bool AbcMeshReader::valid() const
return m_schema.valid();
}
void AbcMeshReader::readObjectData(Main *bmain, float time)
void AbcMeshReader::readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel)
{
Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str());
m_object = BKE_object_add_only_object(bmain, OB_MESH, m_object_name.c_str());
m_object->data = mesh;
const ISampleSelector sample_sel(time);
DerivedMesh *dm = CDDM_from_mesh(mesh);
DerivedMesh *ndm = this->read_derivedmesh(dm, time, MOD_MESHSEQ_READ_ALL, NULL);
DerivedMesh *ndm = this->read_derivedmesh(dm, sample_sel, MOD_MESHSEQ_READ_ALL, NULL);
if (ndm != dm) {
dm->release(dm);
@ -1050,9 +1048,11 @@ void AbcMeshReader::readObjectData(Main *bmain, float time)
}
}
DerivedMesh *AbcMeshReader::read_derivedmesh(DerivedMesh *dm, const float time, int read_flag, const char **err_str)
DerivedMesh *AbcMeshReader::read_derivedmesh(DerivedMesh *dm,
const ISampleSelector &sample_sel,
int read_flag,
const char **err_str)
{
ISampleSelector sample_sel(time);
const IPolyMeshSchema::Sample sample = m_schema.getValue(sample_sel);
const P3fArraySamplePtr &positions = sample.getPositions();
@ -1092,7 +1092,7 @@ DerivedMesh *AbcMeshReader::read_derivedmesh(DerivedMesh *dm, const float time,
}
CDStreamConfig config = get_config(new_dm ? new_dm : dm);
config.time = time;
config.time = sample_sel.getRequestedTime();
bool do_normals = false;
read_mesh_sample(&settings, m_schema, sample_sel, config, do_normals);
@ -1239,7 +1239,7 @@ bool AbcSubDReader::valid() const
return m_schema.valid();
}
void AbcSubDReader::readObjectData(Main *bmain, float time)
void AbcSubDReader::readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel)
{
Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str());
@ -1247,7 +1247,7 @@ void AbcSubDReader::readObjectData(Main *bmain, float time)
m_object->data = mesh;
DerivedMesh *dm = CDDM_from_mesh(mesh);
DerivedMesh *ndm = this->read_derivedmesh(dm, time, MOD_MESHSEQ_READ_ALL, NULL);
DerivedMesh *ndm = this->read_derivedmesh(dm, sample_sel, MOD_MESHSEQ_READ_ALL, NULL);
if (ndm != dm) {
dm->release(dm);
@ -1255,7 +1255,6 @@ void AbcSubDReader::readObjectData(Main *bmain, float time)
DM_to_mesh(ndm, mesh, m_object, CD_MASK_MESH, true);
const ISampleSelector sample_sel(time);
const ISubDSchema::Sample sample = m_schema.getValue(sample_sel);
Int32ArraySamplePtr indices = sample.getCreaseIndices();
Alembic::Abc::FloatArraySamplePtr sharpnesses = sample.getCreaseSharpnesses();
@ -1286,9 +1285,11 @@ void AbcSubDReader::readObjectData(Main *bmain, float time)
}
}
DerivedMesh *AbcSubDReader::read_derivedmesh(DerivedMesh *dm, const float time, int read_flag, const char **err_str)
DerivedMesh *AbcSubDReader::read_derivedmesh(DerivedMesh *dm,
const ISampleSelector &sample_sel,
int read_flag,
const char **err_str)
{
ISampleSelector sample_sel(time);
const ISubDSchema::Sample sample = m_schema.getValue(sample_sel);
const P3fArraySamplePtr &positions = sample.getPositions();
@ -1328,7 +1329,7 @@ DerivedMesh *AbcSubDReader::read_derivedmesh(DerivedMesh *dm, const float time,
/* Only read point data when streaming meshes, unless we need to create new ones. */
CDStreamConfig config = get_config(new_dm ? new_dm : dm);
config.time = time;
config.time = sample_sel.getRequestedTime();
read_subd_sample(&settings, m_schema, sample_sel, config);
if (new_dm) {

@ -100,9 +100,12 @@ public:
bool valid() const;
void readObjectData(Main *bmain, float time);
void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel);
DerivedMesh *read_derivedmesh(DerivedMesh *dm, const float time, int read_flag, const char **err_str);
DerivedMesh *read_derivedmesh(DerivedMesh *dm,
const Alembic::Abc::ISampleSelector &sample_sel,
int read_flag,
const char **err_str);
private:
void readFaceSetsSample(Main *bmain, Mesh *mesh, size_t poly_start,
@ -121,8 +124,11 @@ public:
bool valid() const;
void readObjectData(Main *bmain, float time);
DerivedMesh *read_derivedmesh(DerivedMesh *dm, const float time, int read_flag, const char **err_str);
void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel);
DerivedMesh *read_derivedmesh(DerivedMesh *dm,
const Alembic::Abc::ISampleSelector &sample_sel,
int read_flag,
const char **err_str);
};
/* ************************************************************************** */

@ -239,7 +239,7 @@ static bool set_knots(const FloatArraySamplePtr &knots, float *&nu_knots)
return true;
}
void AbcNurbsReader::readObjectData(Main *bmain, float time)
void AbcNurbsReader::readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel)
{
Curve *cu = static_cast<Curve *>(BKE_curve_add(bmain, "abc_curve", OB_SURF));
cu->actvert = CU_ACT_NONE;
@ -253,7 +253,6 @@ void AbcNurbsReader::readObjectData(Main *bmain, float time)
nu->resolu = cu->resolu;
nu->resolv = cu->resolv;
const ISampleSelector sample_sel(time);
const INuPatchSchema &schema = it->first;
const INuPatchSchema::Sample smp = schema.getValue(sample_sel);

@ -54,7 +54,7 @@ public:
bool valid() const;
void readObjectData(Main *bmain, float time);
void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel);
private:
void getNurbsPatches(const Alembic::Abc::IObject &obj);

@ -160,6 +160,15 @@ void AbcObjectReader::object(Object *ob)
m_object = ob;
}
DerivedMesh *AbcObjectReader::read_derivedmesh(DerivedMesh *dm,
const Alembic::Abc::ISampleSelector &UNUSED(sample_sel),
int UNUSED(read_flag),
const char **UNUSED(err_str))
{
return dm;
}
static Imath::M44d blend_matrices(const Imath::M44d &m0, const Imath::M44d &m1, const float weight)
{
float mat0[4][4], mat1[4][4], ret[4][4];

@ -170,15 +170,12 @@ public:
virtual bool valid() const = 0;
virtual void readObjectData(Main *bmain, float time) = 0;
virtual void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) = 0;
virtual DerivedMesh *read_derivedmesh(DerivedMesh *dm, const float time, int read_flag, const char **err_str)
{
(void)time;
(void)read_flag;
(void)err_str;
return dm;
}
DerivedMesh *read_derivedmesh(DerivedMesh *dm,
const Alembic::Abc::ISampleSelector &sample_sel,
int read_flag,
const char **err_str);
/** Reads the object matrix and sets up an object transform if animated. */
void setupObjectTransform(const float time);

@ -151,12 +151,12 @@ bool AbcPointsReader::valid() const
return m_schema.valid();
}
void AbcPointsReader::readObjectData(Main *bmain, float time)
void AbcPointsReader::readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel)
{
Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str());
DerivedMesh *dm = CDDM_from_mesh(mesh);
DerivedMesh *ndm = this->read_derivedmesh(dm, time, 0, NULL);
DerivedMesh *ndm = this->read_derivedmesh(dm, sample_sel, 0, NULL);
if (ndm != dm) {
dm->release(dm);
@ -178,8 +178,7 @@ void AbcPointsReader::readObjectData(Main *bmain, float time)
void read_points_sample(const IPointsSchema &schema,
const ISampleSelector &selector,
CDStreamConfig &config,
float time)
CDStreamConfig &config)
{
Alembic::AbcGeom::IPointsSchema::Sample sample = schema.getValue(selector);
@ -189,7 +188,7 @@ void read_points_sample(const IPointsSchema &schema,
N3fArraySamplePtr vnormals;
if (has_property(prop, "N")) {
const Alembic::Util::uint32_t itime = static_cast<Alembic::Util::uint32_t>(time);
const Alembic::Util::uint32_t itime = static_cast<Alembic::Util::uint32_t>(selector.getRequestedTime());
const IN3fArrayProperty &normals_prop = IN3fArrayProperty(prop, "N", itime);
if (normals_prop) {
@ -200,9 +199,11 @@ void read_points_sample(const IPointsSchema &schema,
read_mverts(config.mvert, positions, vnormals);
}
DerivedMesh *AbcPointsReader::read_derivedmesh(DerivedMesh *dm, const float time, int /*read_flag*/, const char ** /*err_str*/)
DerivedMesh *AbcPointsReader::read_derivedmesh(DerivedMesh *dm,
const ISampleSelector &sample_sel,
int /*read_flag*/,
const char ** /*err_str*/)
{
ISampleSelector sample_sel(time);
const IPointsSchema::Sample sample = m_schema.getValue(sample_sel);
const P3fArraySamplePtr &positions = sample.getPositions();
@ -214,7 +215,7 @@ DerivedMesh *AbcPointsReader::read_derivedmesh(DerivedMesh *dm, const float time
}
CDStreamConfig config = get_config(new_dm ? new_dm : dm);
read_points_sample(m_schema, sample_sel, config, time);
read_points_sample(m_schema, sample_sel, config);
return new_dm ? new_dm : dm;
}

@ -59,14 +59,16 @@ public:
bool valid() const;
void readObjectData(Main *bmain, float time);
void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel);
DerivedMesh *read_derivedmesh(DerivedMesh *dm, const float time, int read_flag, const char **err_str);
DerivedMesh *read_derivedmesh(DerivedMesh *dm,
const Alembic::Abc::ISampleSelector &sample_sel,
int read_flag,
const char **err_str);
};
void read_points_sample(const Alembic::AbcGeom::IPointsSchema &schema,
const Alembic::AbcGeom::ISampleSelector &selector,
CDStreamConfig &config,
float time);
CDStreamConfig &config);
#endif /* __ABC_POINTS_H__ */

@ -36,6 +36,7 @@ extern "C" {
using Alembic::AbcGeom::OObject;
using Alembic::AbcGeom::OXform;
using Alembic::Abc::ISampleSelector;
/* ************************************************************************** */
@ -153,7 +154,7 @@ bool AbcEmptyReader::valid() const
return m_schema.valid();
}
void AbcEmptyReader::readObjectData(Main *bmain, float /*time*/)
void AbcEmptyReader::readObjectData(Main *bmain, const ISampleSelector &UNUSED(sample_sel))
{
m_object = BKE_object_add_only_object(bmain, OB_EMPTY,
m_object_name.c_str());

@ -69,7 +69,7 @@ public:
bool valid() const;
void readObjectData(Main *bmain, float time);
void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel);
};
#endif /* __ABC_TRANSFORM_H__ */

@ -704,12 +704,13 @@ static void import_startjob(void *user_data, short *stop, short *do_update, floa
chrono_t min_time = std::numeric_limits<chrono_t>::max();
chrono_t max_time = std::numeric_limits<chrono_t>::min();
ISampleSelector sample_sel(0.0f);
std::vector<AbcObjectReader *>::iterator iter;
for (iter = data->readers.begin(); iter != data->readers.end(); ++iter) {
AbcObjectReader *reader = *iter;
if (reader->valid()) {
reader->readObjectData(data->bmain, 0.0f);
reader->readObjectData(data->bmain, sample_sel);
min_time = std::min(min_time, reader->minTime());
max_time = std::max(max_time, reader->maxTime());
@ -922,6 +923,7 @@ DerivedMesh *ABC_read_mesh(CacheReader *reader,
}
const ObjectHeader &header = iobject.getHeader();
ISampleSelector sample_sel(time);
if (IPolyMesh::matches(header)) {
if (ob->type != OB_MESH) {
@ -929,7 +931,7 @@ DerivedMesh *ABC_read_mesh(CacheReader *reader,
return NULL;
}
return abc_reader->read_derivedmesh(dm, time, read_flag, err_str);
return abc_reader->read_derivedmesh(dm, sample_sel, read_flag, err_str);
}
else if (ISubD::matches(header)) {
if (ob->type != OB_MESH) {
@ -937,7 +939,7 @@ DerivedMesh *ABC_read_mesh(CacheReader *reader,
return NULL;
}
return abc_reader->read_derivedmesh(dm, time, read_flag, err_str);
return abc_reader->read_derivedmesh(dm, sample_sel, read_flag, err_str);
}
else if (IPoints::matches(header)) {
if (ob->type != OB_MESH) {
@ -945,7 +947,7 @@ DerivedMesh *ABC_read_mesh(CacheReader *reader,
return NULL;
}
return abc_reader->read_derivedmesh(dm, time, read_flag, err_str);
return abc_reader->read_derivedmesh(dm, sample_sel, read_flag, err_str);
}
else if (ICurves::matches(header)) {
if (ob->type != OB_CURVE) {
@ -953,7 +955,7 @@ DerivedMesh *ABC_read_mesh(CacheReader *reader,
return NULL;
}
return abc_reader->read_derivedmesh(dm, time, read_flag, err_str);
return abc_reader->read_derivedmesh(dm, sample_sel, read_flag, err_str);
}
*err_str = "Unsupported object type: verify object path"; // or poke developer