From c210f87f12929bbd0884db7bf76baa3f1eed7b02 Mon Sep 17 00:00:00 2001 From: Bastien Montagne <montagne29@wanadoo.fr> Date: Fri, 3 Oct 2014 14:47:22 +0200 Subject: [PATCH] Fix T41931: FBX export: 'Group' batch export was using default scene unit scale. Now, find the scene most 'used' by exported group elements, and use its unit settings! --- io_scene_fbx/export_fbx_bin.py | 17 +++++++++++++++++ io_scene_fbx_experimental/export_fbx_bin.py | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/io_scene_fbx/export_fbx_bin.py b/io_scene_fbx/export_fbx_bin.py index 01713255b..4f50fa0b4 100644 --- a/io_scene_fbx/export_fbx_bin.py +++ b/io_scene_fbx/export_fbx_bin.py @@ -2800,9 +2800,26 @@ def save(operator, context, scene = bpy.data.scenes.new(name="FBX_Temp") scene.layers = [True] * 20 # bpy.data.scenes.active = scene # XXX, cant switch + src_scenes = {} # Count how much each 'source' scenes are used. for ob_base in data.objects: + for src_sce in ob_base.users_scene: + if src_sce not in src_scenes: + src_scenes[src_sce] = 0 + src_scenes[src_sce] += 1 scene.objects.link(ob_base) + # Find the 'most used' source scene, and use its unit settings. This is somewhat weak, but should work + # fine in most cases, and avoids stupid issues like T41931. + best_src_scene = None + best_src_scene_users = 0 + for sce, nbr_users in src_scenes.items(): + if (nbr_users) > best_src_scene_users: + best_src_scene_users = nbr_users + best_src_scene = sce + scene.unit_settings.system = best_src_scene.unit_settings.system + scene.unit_settings.system_rotation = best_src_scene.unit_settings.system_rotation + scene.unit_settings.scale_length = best_src_scene.unit_settings.scale_length + scene.update() # TODO - BUMMER! Armatures not in the group wont animate the mesh else: diff --git a/io_scene_fbx_experimental/export_fbx_bin.py b/io_scene_fbx_experimental/export_fbx_bin.py index f3a7dd5ff..5e59fabe7 100644 --- a/io_scene_fbx_experimental/export_fbx_bin.py +++ b/io_scene_fbx_experimental/export_fbx_bin.py @@ -2926,9 +2926,26 @@ def save(operator, context, scene = bpy.data.scenes.new(name="FBX_Temp") scene.layers = [True] * 20 # bpy.data.scenes.active = scene # XXX, cant switch + src_scenes = {} # Count how much each 'source' scenes are used. for ob_base in data.objects: + for src_sce in ob_base.users_scene: + if src_sce not in src_scenes: + src_scenes[src_sce] = 0 + src_scenes[src_sce] += 1 scene.objects.link(ob_base) + # Find the 'most used' source scene, and use its unit settings. This is somewhat weak, but should work + # fine in most cases, and avoids stupid issues like T41931. + best_src_scene = None + best_src_scene_users = 0 + for sce, nbr_users in src_scenes.items(): + if (nbr_users) > best_src_scene_users: + best_src_scene_users = nbr_users + best_src_scene = sce + scene.unit_settings.system = best_src_scene.unit_settings.system + scene.unit_settings.system_rotation = best_src_scene.unit_settings.system_rotation + scene.unit_settings.scale_length = best_src_scene.unit_settings.scale_length + scene.update() # TODO - BUMMER! Armatures not in the group wont animate the mesh else: -- GitLab