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

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2015-08-21 01:50:35 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2015-08-21 01:50:35 +0300
commit82ff141efc015ab3cb37cd9969a0073f24664661 (patch)
tree37a4c13a4198f2f835ff8146f093974779aa83f5 /io_scene_fbx/export_fbx_bin.py
parent962d1d0e8c3905589da7b6866ec207b0bb3bb527 (diff)
Fix T45859: FBX Export: Some objects are not instances.
This was due to the fact that we generate temp meshes when applying modifiers - but in dupliobject instances cases, this can be avoided. Also cleaned up a bit mesh data area, and fixed wrong template user number in this case.
Diffstat (limited to 'io_scene_fbx/export_fbx_bin.py')
-rw-r--r--io_scene_fbx/export_fbx_bin.py31
1 files changed, 23 insertions, 8 deletions
diff --git a/io_scene_fbx/export_fbx_bin.py b/io_scene_fbx/export_fbx_bin.py
index 365e98ee..184513ed 100644
--- a/io_scene_fbx/export_fbx_bin.py
+++ b/io_scene_fbx/export_fbx_bin.py
@@ -1853,7 +1853,6 @@ def fbx_animations_do(scene_data, ref_id, f_start, f_end, start_zero, objects=No
"""
bake_step = scene_data.settings.bake_anim_step
scene = scene_data.scene
- meshes = scene_data.data_meshes
force_keying = scene_data.settings.bake_anim_use_all_bones
force_sek = scene_data.settings.bake_anim_force_startend_keying
@@ -2144,9 +2143,16 @@ def fbx_data_from_scene(scene, settings):
if ob_obj.type not in BLENDER_OBJECT_TYPES_MESHLIKE:
continue
ob = ob_obj.bdata
- if ob in data_meshes: # Happens with dupli instances.
- continue
use_org_data = True
+ org_ob_obj = None
+
+ # Do not want to systematically recreate a new mesh for dupliobject instances, kind of break purpose of those.
+ if ob_obj.is_dupli:
+ org_ob_obj = ObjectWrapper(ob) # We get the "real" object wrapper from that dupli instance.
+ if org_ob_obj in data_meshes:
+ data_meshes[ob_obj] = data_meshes[org_ob_obj]
+ continue
+
if settings.use_mesh_modifiers or ob.type in BLENDER_OTHER_OBJECT_TYPES:
use_org_data = False
tmp_mods = []
@@ -2169,14 +2175,20 @@ def fbx_data_from_scene(scene, settings):
if use_org_data:
data_meshes[ob_obj] = (get_blenderID_key(ob.data), ob.data, False)
+ # In case "real" source object of that dupli did not yet still existed in data_meshes, create it now!
+ if org_ob_obj is not None:
+ data_meshes[org_ob_obj] = data_meshes[ob_obj]
+
perfmon.step("FBX export prepare: Wrapping ShapeKeys...")
# ShapeKeys.
data_deformers_shape = OrderedDict()
geom_mat_co = settings.global_matrix if settings.bake_space_transform else None
- for me_obj, (me_key, me, _org) in data_meshes.items():
+ for me_key, me, _free in data_meshes.values():
if not (me.shape_keys and me.shape_keys.key_blocks):
continue
+ if me in data_deformers_shape:
+ continue
shapes_key = get_blender_mesh_shape_key(me)
_cos = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.vertices) * 3
@@ -2329,7 +2341,7 @@ def fbx_data_from_scene(scene, settings):
templates[b"Bone"] = fbx_template_def_bone(scene, settings, nbr_users=len(data_bones))
if data_meshes:
- nbr = len(data_meshes)
+ nbr = len({me_key for me_key, _me, _free in data_meshes.values()})
if data_deformers_shape:
nbr += sum(len(shapes[2]) for shapes in data_deformers_shape.values())
templates[b"Geometry"] = fbx_template_def_geometry(scene, settings, nbr_users=nbr)
@@ -2532,9 +2544,11 @@ def fbx_scene_data_cleanup(scene_data):
Some final cleanup...
"""
# Delete temp meshes.
- for _key, me, free in scene_data.data_meshes.values():
- if free:
+ done_meshes = set()
+ for me_key, me, free in scene_data.data_meshes.values():
+ if free and me_key not in done_meshes:
bpy.data.meshes.remove(me)
+ done_meshes.add(me_key)
# ##### Top-level FBX elements generators. #####
@@ -2735,7 +2749,8 @@ def fbx_objects_elements(root, scene_data):
for cam in scene_data.data_cameras:
fbx_data_camera_elements(objects, cam, scene_data)
- perfmon.step("FBX export fetch meshes (%d)..." % len(scene_data.data_meshes))
+ perfmon.step("FBX export fetch meshes (%d)..."
+ % len({me_key for me_key, _me, _free in scene_data.data_meshes.values()}))
done_meshes = set()
for me_obj in scene_data.data_meshes: