Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSybren A. Stüvel <sybren@stuvel.eu>2017-02-23 18:00:06 +0300
committerSybren A. Stüvel <sybren@stuvel.eu>2017-04-06 17:04:31 +0300
commitd1696622b7791a6e809a5c76f343c319974d60c9 (patch)
tree434530c2e9b453a99c615b54c9772ae7ae6a020d /source/blender/alembic
parent818ee188e704b61ce745d3394483183a86994608 (diff)
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.
Diffstat (limited to 'source/blender/alembic')
-rw-r--r--source/blender/alembic/intern/abc_object.cc12
-rw-r--r--source/blender/alembic/intern/abc_object.h3
-rw-r--r--source/blender/alembic/intern/alembic_capi.cc7
3 files changed, 19 insertions, 3 deletions
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)