[Bf-extensions-cvs] [dcbb4df] master: FBX export: fix handling of mesh instances.
Bastien Montagne
noreply at git.blender.org
Mon Apr 14 17:39:59 CEST 2014
Commit: dcbb4dfefb79a58444259497079a083c5e9318e2
Author: Bastien Montagne
Date: Mon Apr 14 17:38:33 2014 +0200
https://developer.blender.org/rBAdcbb4dfefb79a58444259497079a083c5e9318e2
FBX export: fix handling of mesh instances.
Was broken since apply modifiers and other geom types support was added.
===================================================================
M io_scene_fbx/export_fbx_bin.py
===================================================================
diff --git a/io_scene_fbx/export_fbx_bin.py b/io_scene_fbx/export_fbx_bin.py
index c54714c..e06c8da 100644
--- a/io_scene_fbx/export_fbx_bin.py
+++ b/io_scene_fbx/export_fbx_bin.py
@@ -1246,7 +1246,7 @@ def fbx_data_camera_elements(root, cam_obj, scene_data):
elem_data_single_float64(cam, b"CameraOrthoZoom", 1.0)
-def fbx_data_mesh_elements(root, me_obj, scene_data):
+def fbx_data_mesh_elements(root, me_obj, scene_data, done_meshes):
"""
Write the Mesh (Geometry) data block.
"""
@@ -1257,6 +1257,10 @@ def fbx_data_mesh_elements(root, me_obj, scene_data):
me_key, me, _free = scene_data.data_meshes[me_obj]
+ # In case of multiple instances of same mesh, only write it once!
+ if me_key in done_meshes:
+ return
+
# No gscale/gmat here, all data are supposed to be in object space.
smooth_type = scene_data.settings.mesh_smooth_type
@@ -1615,6 +1619,8 @@ def fbx_data_mesh_elements(root, me_obj, scene_data):
elem_data_single_string(lay_tan, b"Type", b"LayerElementTangent")
elem_data_single_int32(lay_tan, b"TypedIndex", tspaceidx)
+ done_meshes.add(me_key)
+
def fbx_data_material_elements(root, mat, scene_data):
"""
@@ -2358,20 +2364,27 @@ def fbx_data_from_scene(scene, settings):
for obj in objects:
if obj.type not in BLENDER_OBJECT_TYPES_MESHLIKE:
continue
+ use_org_data = True
if settings.use_mesh_modifiers or obj.type in BLENDER_OTHER_OBJECT_TYPES:
+ use_org_data = False
tmp_mods = []
- if obj.type == 'MESH' and settings.bake_anim:
- # For meshes, when anim export is enabled, disable Armature modifiers here!
+ if obj.type == 'MESH':
+ # No need to create a new mesh in this case, if no modifier is active!
+ use_org_data = True
for mod in obj.modifiers:
- if mod.type == 'ARMATURE':
+ # For meshes, when anim export is enabled, disable Armature modifiers here!
+ if mod.type == 'ARMATURE' and settings.bake_anim:
tmp_mods.append((mod, mod.show_render))
mod.show_render = False
- tmp_me = obj.to_mesh(scene, apply_modifiers=True, settings='RENDER')
- data_meshes[obj] = (get_blenderID_key(tmp_me), tmp_me, True)
+ if mod.show_render:
+ use_org_data = False
+ if not use_org_data:
+ tmp_me = obj.to_mesh(scene, apply_modifiers=True, settings='RENDER')
+ data_meshes[obj] = (get_blenderID_key(tmp_me), tmp_me, True)
# Re-enable temporary disabled modifiers.
for mod, show_render in tmp_mods:
mod.show_render = show_render
- else:
+ if use_org_data:
data_meshes[obj] = (get_blenderID_key(obj.data), obj.data, False)
# Armatures!
@@ -2837,8 +2850,10 @@ def fbx_objects_elements(root, scene_data):
for cam in scene_data.data_cameras.keys():
fbx_data_camera_elements(objects, cam, scene_data)
+ done_meshes = set()
for me_obj in scene_data.data_meshes.keys():
- fbx_data_mesh_elements(objects, me_obj, scene_data)
+ fbx_data_mesh_elements(objects, me_obj, scene_data, done_meshes)
+ del done_meshes
for obj in scene_data.objects.keys():
fbx_data_object_elements(objects, obj, scene_data)
More information about the Bf-extensions-cvs
mailing list