[Bf-extensions-cvs] [5c3447e] master: FBX: Fix empties export (they also need their own NodeAttribute...).
Bastien Montagne
noreply at git.blender.org
Tue Apr 1 21:50:44 CEST 2014
Commit: 5c3447ef3448f1a6104d184395e450c2fbfee8b2
Author: Bastien Montagne
Date: Tue Apr 1 16:54:24 2014 +0200
https://developer.blender.org/rBA5c3447ef3448f1a6104d184395e450c2fbfee8b2
FBX: Fix empties export (they also need their own NodeAttribute...).
===================================================================
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 cf628f1..5d3e11b 100644
--- a/io_scene_fbx/export_fbx_bin.py
+++ b/io_scene_fbx/export_fbx_bin.py
@@ -225,6 +225,11 @@ def get_blenderID_key(bid):
return "B" + bid.rna_type.name + "::" + bid.name
+def get_blender_empty_key(obj):
+ """Return bone's keys (Model and NodeAttribute)."""
+ return "|".join((get_blenderID_key(obj), "Empty"))
+
+
def get_blender_bone_key(armature, bone):
"""Return bone's keys (Model and NodeAttribute)."""
key = "|".join((get_blenderID_key(armature), get_blenderID_key(bone)))
@@ -581,6 +586,17 @@ def fbx_template_def_model(scene, settings, override_defaults=None, nbr_users=0)
return FBXTemplate(b"Model", b"FbxNode", props, nbr_users)
+def fbx_template_def_null(scene, settings, override_defaults=None, nbr_users=0):
+ props = OrderedDict((
+ (b"Color", ((0.8, 0.8, 0.8), "p_color_rgb", False)),
+ (b"Size", (100.0, "p_double", False)),
+ (b"Look", (1, "p_enum", False)), # Cross (0 is None, i.e. invisible?).
+ ))
+ if override_defaults is not None:
+ props.update(override_defaults)
+ return FBXTemplate(b"NodeAttribute", b"FbxNull", props, nbr_users)
+
+
def fbx_template_def_light(scene, settings, override_defaults=None, nbr_users=0):
gscale = settings.global_scale
props = OrderedDict((
@@ -989,6 +1005,24 @@ def fbx_data_element_custom_properties(props, bid):
elem_props_set(props, "p_double", k.encode(), v, custom=True)
+def fbx_data_empty_elements(root, empty, scene_data):
+ """
+ Write the Empty data block.
+ """
+ empty_key = scene_data.data_empties[empty]
+
+ null = elem_data_single_int64(root, b"NodeAttribute", get_fbxuid_from_key(empty_key))
+ null.add_string(fbx_name_class(empty.name.encode(), b"NodeAttribute"))
+ null.add_string(b"Null")
+
+ elem_data_single_string(null, b"TypeFlags", b"Null")
+
+ tmpl = scene_data.templates[b"Null"]
+ props = elem_properties(null)
+
+ # No custom properties, already saved with object (Model).
+
+
def fbx_data_lamp_elements(root, lamp, scene_data):
"""
Write the Lamp data block.
@@ -1877,7 +1911,7 @@ def fbx_data_animation_elements(root, scene_data):
FBXData = namedtuple("FBXData", (
"templates", "templates_users", "connections",
"settings", "scene", "objects", "animations",
- "data_lamps", "data_cameras", "data_meshes", "mesh_mat_indices",
+ "data_empties", "data_lamps", "data_cameras", "data_meshes", "mesh_mat_indices",
"data_bones", "data_deformers",
"data_world", "data_materials", "data_textures", "data_videos",
))
@@ -2106,6 +2140,8 @@ def fbx_data_from_scene(scene, settings):
# Unfortunately, FBX camera data contains object-level data (like position, orientation, etc.)...
data_cameras = OrderedDict((obj, get_blenderID_key(obj.data)) for obj in objects if obj.type == 'CAMERA')
data_meshes = OrderedDict((obj.data, (get_blenderID_key(obj.data), obj)) for obj in objects if obj.type == 'MESH')
+ # Yep! Contains nothing, but needed!
+ data_empties = OrderedDict((obj, get_blender_empty_key(obj)) for obj in objects if obj.type == 'EMPTY')
# Armatures!
data_bones = OrderedDict()
@@ -2181,7 +2217,7 @@ def fbx_data_from_scene(scene, settings):
tmp_scdata = FBXData( # Kind of hack, we need a temp scene_data for object's space handling to bake animations...
None, None, None,
settings, scene, objects, None,
- data_lamps, data_cameras, data_meshes, None,
+ data_empties, data_lamps, data_cameras, data_meshes, None,
data_bones, data_deformers,
data_world, data_materials, data_textures, data_videos,
)
@@ -2192,7 +2228,11 @@ def fbx_data_from_scene(scene, settings):
templates = OrderedDict()
templates[b"GlobalSettings"] = fbx_template_def_globalsettings(scene, settings, nbr_users=1)
- # XXX Looks like there can only be one NodeAttribute template? At lest, never found a light template... :/
+ # XXX Looks like there can only be one NodeAttribute template? At lest, never found more than one
+ # (null/light/camera) template in one file... :/
+ if data_empties:
+ templates[b"Null"] = fbx_template_def_null(scene, settings, nbr_users=len(data_empties))
+
if data_lamps:
templates[b"Light"] = fbx_template_def_light(scene, settings, nbr_users=len(data_lamps))
@@ -2278,6 +2318,11 @@ def fbx_data_from_scene(scene, settings):
continue
connections.append((b"OO", get_fbxuid_from_key(bo_key), get_fbxuid_from_key(objects[par]), None))
+ # Empties
+ for empty_obj, empty_key in data_empties.items():
+ empty_obj_key = objects[empty_obj]
+ connections.append((b"OO", get_fbxuid_from_key(empty_key), get_fbxuid_from_key(empty_obj_key), None))
+
# Cameras
for obj_cam, cam_key in data_cameras.items():
cam_obj_key = objects[obj_cam]
@@ -2362,7 +2407,7 @@ def fbx_data_from_scene(scene, settings):
return FBXData(
templates, templates_users, connections,
settings, scene, objects, animations,
- data_lamps, data_cameras, data_meshes, mesh_mat_indices,
+ data_empties, data_lamps, data_cameras, data_meshes, mesh_mat_indices,
data_bones, data_deformers,
data_world, data_materials, data_textures, data_videos,
)
@@ -2530,6 +2575,9 @@ def fbx_objects_elements(root, scene_data):
"""
objects = elem_empty(root, b"Objects")
+ for empty in scene_data.data_empties.keys():
+ fbx_data_empty_elements(objects, empty, scene_data)
+
for lamp in scene_data.data_lamps.keys():
fbx_data_lamp_elements(objects, lamp, scene_data)
More information about the Bf-extensions-cvs
mailing list