Changeset View
Changeset View
Standalone View
Standalone View
io_scene_fbx/export_fbx_bin.py
| Context not available. | |||||
| return FBXTemplate(b"NodeAttribute", b"FbxNull", props, nbr_users, [False]) | return FBXTemplate(b"NodeAttribute", b"FbxNull", props, nbr_users, [False]) | ||||
| def fbx_template_def_armature(scene, settings, override_defaults=None, nbr_users=0): | |||||
| props = OrderedDict(( | |||||
| )) | |||||
| if override_defaults is not None: | |||||
| props.update(override_defaults) | |||||
| return FBXTemplate(b"NodeAttribute", b"FbxNull", props, nbr_users, [False]) | |||||
| def fbx_template_def_light(scene, settings, override_defaults=None, nbr_users=0): | def fbx_template_def_light(scene, settings, override_defaults=None, nbr_users=0): | ||||
| gscale = settings.global_scale | gscale = settings.global_scale | ||||
| props = OrderedDict(( | props = OrderedDict(( | ||||
| Context not available. | |||||
| * BindPose. | * BindPose. | ||||
| Note armature itself has no data, it is a mere "Null" Model... | Note armature itself has no data, it is a mere "Null" Model... | ||||
| """ | """ | ||||
| if scene_data.settings.armature_nodetype == 'ROOT': | |||||
| arm_type = b"Root" | |||||
| elif scene_data.settings.armature_nodetype == 'LIMBNODE': | |||||
| arm_type = b"LimbNode" | |||||
| else: # Default, preferred option... | |||||
| arm_type = b"Null" | |||||
| #Armature data | |||||
| armature_key = scene_data.data_armatures[arm_obj] | |||||
| null = elem_data_single_int64(root, b"NodeAttribute", get_fbx_uuid_from_key(armature_key)) | |||||
| null.add_string(fbx_name_class(arm_obj.name.encode(), b"NodeAttribute")) | |||||
| null.add_string(arm_type) | |||||
| elem_data_single_string(null, b"TypeFlags", b"Null") | |||||
| tmpl = elem_props_template_init(scene_data.templates, b"Armature") | |||||
| props = elem_properties(null) | |||||
| elem_props_template_finalize(tmpl, props) | |||||
| mat_world_arm = arm_obj.fbx_object_matrix(scene_data, global_space=True) | mat_world_arm = arm_obj.fbx_object_matrix(scene_data, global_space=True) | ||||
| bones = tuple(bo_obj for bo_obj in arm_obj.bones if bo_obj in scene_data.objects) | bones = tuple(bo_obj for bo_obj in arm_obj.bones if bo_obj in scene_data.objects) | ||||
| Context not available. | |||||
| def fbx_skeleton_from_armature(scene, settings, arm_obj, objects, data_meshes, | def fbx_skeleton_from_armature(scene, settings, arm_obj, objects, data_meshes, | ||||
| data_bones, data_deformers_skin, data_empties, arm_parents): | data_bones, data_deformers_skin, data_armatures, arm_parents): | ||||
| """ | """ | ||||
| Create skeleton from armature/bones (NodeAttribute/LimbNode and Model/LimbNode), and for each deformed mesh, | Create skeleton from armature/bones (NodeAttribute/LimbNode and Model/LimbNode), and for each deformed mesh, | ||||
| create Pose/BindPose(with sub PoseNode) and Deformer/Skin(with Deformer/SubDeformer/Cluster). | create Pose/BindPose(with sub PoseNode) and Deformer/Skin(with Deformer/SubDeformer/Cluster). | ||||
| Context not available. | |||||
| arm_parents is a set of tuples (armature, object) for all successful armature bindings. | arm_parents is a set of tuples (armature, object) for all successful armature bindings. | ||||
| """ | """ | ||||
| # We need some data for our armature 'object' too!!! | # We need some data for our armature 'object' too!!! | ||||
| data_empties[arm_obj] = get_blender_empty_key(arm_obj.bdata) | data_armatures[arm_obj] = get_blender_empty_key(arm_obj.bdata) | ||||
| arm_data = arm_obj.bdata.data | arm_data = arm_obj.bdata.data | ||||
| bones = OrderedDict() | bones = OrderedDict() | ||||
| Context not available. | |||||
| # Armatures! | # Armatures! | ||||
| data_deformers_skin = OrderedDict() | data_deformers_skin = OrderedDict() | ||||
| data_bones = OrderedDict() | data_bones = OrderedDict() | ||||
| data_armatures = OrderedDict() | |||||
| arm_parents = set() | arm_parents = set() | ||||
| for ob_obj in tuple(objects): | for ob_obj in tuple(objects): | ||||
| if not (ob_obj.is_object and ob_obj.type in {'ARMATURE'}): | if not (ob_obj.is_object and ob_obj.type in {'ARMATURE'}): | ||||
| continue | continue | ||||
| fbx_skeleton_from_armature(scene, settings, ob_obj, objects, data_meshes, | fbx_skeleton_from_armature(scene, settings, ob_obj, objects, data_meshes, | ||||
| data_bones, data_deformers_skin, data_empties, arm_parents) | data_bones, data_deformers_skin, data_armatures, arm_parents) | ||||
| # Generate leaf bones | # Generate leaf bones | ||||
| data_leaf_bones = [] | data_leaf_bones = [] | ||||
| Context not available. | |||||
| settings, scene, objects, None, None, 0.0, 0.0, | settings, scene, objects, None, None, 0.0, 0.0, | ||||
| data_empties, data_lamps, data_cameras, data_meshes, None, | data_empties, data_lamps, data_cameras, data_meshes, None, | ||||
| data_bones, data_leaf_bones, data_deformers_skin, data_deformers_shape, | data_bones, data_leaf_bones, data_deformers_skin, data_deformers_shape, | ||||
| data_world, data_materials, data_textures, data_videos, | data_world, data_materials, data_textures, data_videos, data_armatures, | ||||
| ) | ) | ||||
| animations, animated, frame_start, frame_end = fbx_animations(tmp_scdata) | animations, animated, frame_start, frame_end = fbx_animations(tmp_scdata) | ||||
| Context not available. | |||||
| if data_empties: | if data_empties: | ||||
| templates[b"Null"] = fbx_template_def_null(scene, settings, nbr_users=len(data_empties)) | templates[b"Null"] = fbx_template_def_null(scene, settings, nbr_users=len(data_empties)) | ||||
| if data_empties: | |||||
| templates[b"Armature"] = fbx_template_def_armature(scene, settings, nbr_users=len(data_armatures)) | |||||
| if data_lamps: | if data_lamps: | ||||
| templates[b"Light"] = fbx_template_def_light(scene, settings, nbr_users=len(data_lamps)) | templates[b"Light"] = fbx_template_def_light(scene, settings, nbr_users=len(data_lamps)) | ||||
| Context not available. | |||||
| elif ob_obj.type == 'CAMERA': | elif ob_obj.type == 'CAMERA': | ||||
| cam_key = data_cameras[ob_obj] | cam_key = data_cameras[ob_obj] | ||||
| connections.append((b"OO", get_fbx_uuid_from_key(cam_key), ob_obj.fbx_uuid, None)) | connections.append((b"OO", get_fbx_uuid_from_key(cam_key), ob_obj.fbx_uuid, None)) | ||||
| elif ob_obj.type == 'EMPTY' or ob_obj.type == 'ARMATURE': | elif ob_obj.type == 'EMPTY': | ||||
| empty_key = data_empties[ob_obj] | empty_key = data_empties[ob_obj] | ||||
| connections.append((b"OO", get_fbx_uuid_from_key(empty_key), ob_obj.fbx_uuid, None)) | connections.append((b"OO", get_fbx_uuid_from_key(empty_key), ob_obj.fbx_uuid, None)) | ||||
| elif ob_obj.type == 'ARMATURE': | |||||
| armature_key = data_armatures[ob_obj] | |||||
| connections.append((b"OO", get_fbx_uuid_from_key(armature_key), ob_obj.fbx_uuid, None)) | |||||
| elif ob_obj.type in BLENDER_OBJECT_TYPES_MESHLIKE: | elif ob_obj.type in BLENDER_OBJECT_TYPES_MESHLIKE: | ||||
| mesh_key, _me, _free = data_meshes[ob_obj] | mesh_key, _me, _free = data_meshes[ob_obj] | ||||
| connections.append((b"OO", get_fbx_uuid_from_key(mesh_key), ob_obj.fbx_uuid, None)) | connections.append((b"OO", get_fbx_uuid_from_key(mesh_key), ob_obj.fbx_uuid, None)) | ||||
| Context not available. | |||||
| settings, scene, objects, animations, animated, frame_start, frame_end, | settings, scene, objects, animations, animated, frame_start, frame_end, | ||||
| data_empties, data_lamps, data_cameras, data_meshes, mesh_mat_indices, | data_empties, data_lamps, data_cameras, data_meshes, mesh_mat_indices, | ||||
| data_bones, data_leaf_bones, data_deformers_skin, data_deformers_shape, | data_bones, data_leaf_bones, data_deformers_skin, data_deformers_shape, | ||||
| data_world, data_materials, data_textures, data_videos, | data_world, data_materials, data_textures, data_videos, data_armatures, | ||||
| ) | ) | ||||
| Context not available. | |||||