From d1696622b7791a6e809a5c76f343c319974d60c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 23 Feb 2017 16:00:06 +0100 Subject: Alembic import: fixed bug where local matrix from Alembic was used as object matrix Also renamed AbcObjectReader::readObjectMatrix to setupObjectTransform, as it does more than just reading the object matrix; it also sets up an object constraint if the Alembic Xform is animated. --- source/blender/alembic/intern/abc_object.cc | 12 +++++++++++- source/blender/alembic/intern/abc_object.h | 3 ++- source/blender/alembic/intern/alembic_capi.cc | 7 ++++++- 3 files changed, 19 insertions(+), 3 deletions(-) (limited to 'source/blender/alembic') diff --git a/source/blender/alembic/intern/abc_object.cc b/source/blender/alembic/intern/abc_object.cc index 0b2c8cb6b8a..62042d25501 100644 --- a/source/blender/alembic/intern/abc_object.cc +++ b/source/blender/alembic/intern/abc_object.cc @@ -214,7 +214,7 @@ Imath::M44d get_matrix(const IXformSchema &schema, const float time) return s0.getMatrix(); } -void AbcObjectReader::readObjectMatrix(const float time) +void AbcObjectReader::setupObjectTransform(const float time) { bool is_constant = false; @@ -292,6 +292,16 @@ void AbcObjectReader::read_matrix(float mat[4][4], const float time, const float const Imath::M44d matrix = get_matrix(schema, time); convert_matrix(matrix, m_object, mat, scale, has_alembic_parent); + if (has_alembic_parent) { + /* In this case, the matrix in Alembic is in local coordinates, so + * convert to world matrix. To prevent us from reading and accumulating + * all parent matrices in the Alembic file, we assume that the Blender + * parent object is already updated for the current timekey, and use its + * world matrix. */ + BLI_assert(m_object->parent); + mul_m4_m4m4(mat, m_object->parent->obmat, mat); + } + is_constant = schema.isConstant(); } diff --git a/source/blender/alembic/intern/abc_object.h b/source/blender/alembic/intern/abc_object.h index 6d97c0359b7..5b7663943c2 100644 --- a/source/blender/alembic/intern/abc_object.h +++ b/source/blender/alembic/intern/abc_object.h @@ -183,7 +183,8 @@ public: return dm; } - void readObjectMatrix(const float time); + /** Reads the object matrix and sets up an object transform if animated. */ + void setupObjectTransform(const float time); void addCacheModifier(); diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc index 44d902907c3..44f49542828 100644 --- a/source/blender/alembic/intern/alembic_capi.cc +++ b/source/blender/alembic/intern/alembic_capi.cc @@ -639,7 +639,6 @@ static void import_startjob(void *user_data, short *stop, short *do_update, floa if (reader->valid()) { reader->readObjectData(data->bmain, 0.0f); - reader->readObjectMatrix(0.0f); min_time = std::min(min_time, reader->minTime()); max_time = std::max(max_time, reader->maxTime()); @@ -712,6 +711,12 @@ static void import_startjob(void *user_data, short *stop, short *do_update, floa return; } } + + /* Setup transformations and constraints. */ + for (iter = data->readers.begin(); iter != data->readers.end(); ++iter) { + AbcObjectReader *reader = *iter; + reader->setupObjectTransform(0.0f); + } } static void import_endjob(void *user_data) -- cgit v1.2.3