
Add an option to disable Alembic vertex interpolation. Bump subversion from 5 to 6. Alembic stores mesh samples at specific time keys; when a frame in Blender maps to a timecode between two samples, Blender will interpolate the mesh vertex positions. This interpolation only happens when the mesh has a constant topology, but sometimes this was not detected properly when the vertices change order, but the number of mesh elements remains the same. This would result in a mesh with jumbled up vertices (T71981). With this patch, users have the ability to disable vertex interpolation. An alternative would be to have better detection of topology changes, but that that'll cause a considerable slowdown. Maniphest Tasks: T71981 Differential Revision: https://developer.blender.org/D9041
87 lines
3.1 KiB
C++
87 lines
3.1 KiB
C++
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
#pragma once
|
|
|
|
/** \file
|
|
* \ingroup balembic
|
|
*/
|
|
|
|
#include "abc_customdata.h"
|
|
#include "abc_reader_object.h"
|
|
|
|
struct Mesh;
|
|
|
|
namespace blender::io::alembic {
|
|
|
|
class AbcMeshReader : public AbcObjectReader {
|
|
Alembic::AbcGeom::IPolyMeshSchema m_schema;
|
|
|
|
CDStreamConfig m_mesh_data;
|
|
|
|
public:
|
|
AbcMeshReader(const Alembic::Abc::IObject &object, ImportSettings &settings);
|
|
|
|
bool valid() const override;
|
|
bool accepts_object_type(const Alembic::AbcCoreAbstract::ObjectHeader &alembic_header,
|
|
const Object *const ob,
|
|
const char **err_str) const override;
|
|
void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) override;
|
|
|
|
struct Mesh *read_mesh(struct Mesh *existing_mesh,
|
|
const Alembic::Abc::ISampleSelector &sample_sel,
|
|
int read_flag,
|
|
const char **err_str) override;
|
|
bool topology_changed(Mesh *existing_mesh,
|
|
const Alembic::Abc::ISampleSelector &sample_sel) override;
|
|
|
|
private:
|
|
void readFaceSetsSample(Main *bmain,
|
|
Mesh *mesh,
|
|
const Alembic::AbcGeom::ISampleSelector &sample_sel);
|
|
|
|
void assign_facesets_to_mpoly(const Alembic::Abc::ISampleSelector &sample_sel,
|
|
MPoly *mpoly,
|
|
int totpoly,
|
|
std::map<std::string, int> &r_mat_map);
|
|
};
|
|
|
|
class AbcSubDReader : public AbcObjectReader {
|
|
Alembic::AbcGeom::ISubDSchema m_schema;
|
|
|
|
CDStreamConfig m_mesh_data;
|
|
|
|
public:
|
|
AbcSubDReader(const Alembic::Abc::IObject &object, ImportSettings &settings);
|
|
|
|
bool valid() const;
|
|
bool accepts_object_type(const Alembic::AbcCoreAbstract::ObjectHeader &alembic_header,
|
|
const Object *const ob,
|
|
const char **err_str) const;
|
|
void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel);
|
|
struct Mesh *read_mesh(struct Mesh *existing_mesh,
|
|
const Alembic::Abc::ISampleSelector &sample_sel,
|
|
int read_flag,
|
|
const char **err_str);
|
|
};
|
|
|
|
void read_mverts(MVert *mverts,
|
|
const Alembic::AbcGeom::P3fArraySamplePtr positions,
|
|
const Alembic::AbcGeom::N3fArraySamplePtr normals);
|
|
|
|
CDStreamConfig get_config(struct Mesh *mesh, bool use_vertex_interpolation);
|
|
|
|
} // namespace blender::io::alembic
|