Fix T63276: crash deleting object with alembic constraint.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 4 Apr 2019 13:07:37 +0000 (15:07 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 4 Apr 2019 13:16:31 +0000 (15:16 +0200)
source/blender/alembic/intern/abc_object.cc
source/blender/blenkernel/intern/constraint.c

index 48aa657..20a43a8 100644 (file)
@@ -323,8 +323,13 @@ void AbcObjectReader::read_matrix(float r_mat[4][4], const float time,
                 * 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(r_mat, m_object->parent->obmat, r_mat);
+               if (m_object->parent) {
+                       mul_m4_m4m4(r_mat, m_object->parent->obmat, r_mat);
+               }
+               else {
+                       /* This can happen if the user deleted the parent object. */
+                       unit_m4(r_mat);
+               }
        }
        else {
                /* Only apply scaling to root objects, parenting will propagate it. */
index b22ffce..6d7765d 100644 (file)
@@ -4572,10 +4572,12 @@ static void transformcache_evaluate(bConstraint *con, bConstraintOb *cob, ListBa
        const float frame = DEG_get_ctime(cob->depsgraph);
        const float time = BKE_cachefile_time_offset(cache_file, frame, FPS);
 
-       BKE_cachefile_ensure_handle(G.main, cache_file);
+       /* Must always load ABC handle on original. */
+       CacheFile *cache_file_orig = (CacheFile *)DEG_get_original_id(&cache_file->id);
+       BKE_cachefile_ensure_handle(G.main, cache_file_orig);
 
        if (!data->reader) {
-               data->reader = CacheReader_open_alembic_object(cache_file->handle,
+               data->reader = CacheReader_open_alembic_object(cache_file_orig->handle,
                                                               data->reader,
                                                               cob->ob,
                                                               data->object_path);