Fix #104875: Animated dupli instances export frozen in place #104876
@ -2249,13 +2249,31 @@ def fbx_animations_do(scene_data, ref_id, f_start, f_end, start_zero, objects=No
|
||||
force_sek, (cam.dof.focus_distance,))
|
||||
animdata_cameras[cam_key] = (acnode_lens, acnode_focus_distance, cam)
|
||||
|
||||
# Find all animated objects that have dupli instances, so that `depsgraph.object_instances` only has to be iterated
|
||||
# at most once per frame.
|
||||
original_parents_with_duplis = set()
|
||||
for ob_obj in animdata_ob:
|
||||
for dp_obj in ob_obj.dupli_list_gen(depsgraph):
|
||||
if dp_obj in objects:
|
||||
original_parents_with_duplis.add(ob_obj.bdata)
|
||||
break
|
||||
has_animated_duplis = bool(original_parents_with_duplis)
|
||||
|
||||
currframe = f_start
|
||||
while currframe <= f_end:
|
||||
real_currframe = currframe - f_start if start_zero else currframe
|
||||
scene.frame_set(int(currframe), subframe=currframe - int(currframe))
|
||||
|
||||
for dp_obj in ob_obj.dupli_list_gen(depsgraph):
|
||||
pass # Merely updating dupli matrix of ObjectWrapper...
|
||||
if has_animated_duplis:
|
||||
# Changing the scene's frame invalidates existing dupli instances. To get the updated matrices of duplis for
|
||||
# this frame, we must get the duplis from the depsgraph again.
|
||||
for dup in depsgraph.object_instances:
|
||||
# This condition matches the condition for duplis to be returned by ObjectWrapper.dupli_list_gen, which
|
||||
# was used to populate original_parents_with_duplis.
|
||||
if (parent := dup.parent) and parent.original in original_parents_with_duplis:
|
||||
# ObjectWrapper caches its instances. Creating a new instance updates the existing instance with the
|
||||
# current frame's matrix.
|
||||
ObjectWrapper(dup)
|
||||
for ob_obj, (anim_loc, anim_rot, anim_scale) in animdata_ob.items():
|
||||
# We compute baked loc/rot/scale for all objects (rot being euler-compat with previous value!).
|
||||
p_rot = p_rots.get(ob_obj, None)
|
||||
|
Loading…
Reference in New Issue
Block a user