Alembic import: changing cache modifier path no longer discards object paths

This allows, for example, the path of an Alembic file to be changed from
absolute to relative, without having to reconstruct all object paths.
This commit is contained in:
Sybren A. Stüvel 2017-04-21 14:11:13 +02:00
parent 9d819775b7
commit 9c02990ac1
2 changed files with 37 additions and 2 deletions

@ -221,7 +221,6 @@ void BKE_cachefile_clean(Scene *scene, CacheFile *cache_file)
}
#endif
mcmd->reader = NULL;
mcmd->object_path[0] = '\0';
}
}
@ -239,7 +238,6 @@ void BKE_cachefile_clean(Scene *scene, CacheFile *cache_file)
}
#endif
data->reader = NULL;
data->object_path[0] = '\0';
}
}
}

@ -85,6 +85,43 @@ class SimpleImportTest(unittest.TestCase):
for ob in bpy.data.objects:
self.assertEqual('Cube' in ob.name, ob.select)
def test_change_path(self):
import math
fname = 'cube-rotating1.abc'
abc = self.testdir / fname
relpath = bpy.path.relpath(str(abc))
res = bpy.ops.wm.alembic_import(filepath=str(abc), as_background_job=False)
self.assertEqual({'FINISHED'}, res)
cube = bpy.context.active_object
# Check that the file loaded ok.
bpy.context.scene.frame_set(10)
x, y, z = cube.matrix_world.to_euler('XYZ')
self.assertAlmostEqual(x, 0)
self.assertAlmostEqual(y, 0)
self.assertAlmostEqual(z, math.pi / 2, places=5)
# Change path from absolute to relative. This should not break the animation.
bpy.context.scene.frame_set(1)
bpy.data.cache_files[fname].filepath = relpath
bpy.context.scene.frame_set(10)
x, y, z = cube.matrix_world.to_euler('XYZ')
self.assertAlmostEqual(x, 0)
self.assertAlmostEqual(y, 0)
self.assertAlmostEqual(z, math.pi / 2, places=5)
# Replace the Alembic file; this should apply new animation.
bpy.data.cache_files[fname].filepath = relpath.replace('1.abc', '2.abc')
bpy.context.scene.update()
x, y, z = cube.matrix_world.to_euler('XYZ')
self.assertAlmostEqual(x, math.pi / 2, places=5)
self.assertAlmostEqual(y, 0)
self.assertAlmostEqual(z, 0)
def main():
global args