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:
-rw-r--r--io_scene_fbx/__init__.py33
-rw-r--r--io_scene_fbx/export_fbx_bin.py38
-rw-r--r--io_scene_fbx/fbx_utils.py2
3 files changed, 52 insertions, 21 deletions
diff --git a/io_scene_fbx/__init__.py b/io_scene_fbx/__init__.py
index 3b6ca352..039e7952 100644
--- a/io_scene_fbx/__init__.py
+++ b/io_scene_fbx/__init__.py
@@ -21,7 +21,7 @@
bl_info = {
"name": "FBX format",
"author": "Campbell Barton, Bastien Montagne, Jens Restemeier",
- "version": (3, 7, 10),
+ "version": (3, 7, 11),
"blender": (2, 77, 0),
"location": "File > Import-Export",
"description": "FBX IO meshes, UV's, vertex colors, materials, textures, cameras, lamps and actions",
@@ -281,11 +281,26 @@ class ExportFBX(bpy.types.Operator, ExportHelper, IOFBXOrientationHelper):
# 7.4 only
apply_unit_scale = BoolProperty(
name="Apply Unit",
- description="Scale all data according to current Blender size, to match default FBX unit "
- "(centimeter, some importers do not handle UnitScaleFactor properly)",
+ description="Take into account current Blender units settings (if unset, raw Blender Units values are used as-is)",
default=True,
)
# 7.4 only
+ apply_scale_options = EnumProperty(
+ items=(('FBX_SCALE_NONE', "All Local",
+ "Apply custom scaling and units scaling to each object transformation, FBX scale remains at 1.0"),
+ ('FBX_SCALE_UNITS', "FBX Units Scale",
+ "Apply custom scaling to each object transformation, and units scaling to FBX scale"),
+ ('FBX_SCALE_CUSTOM', "FBX Custom Scale",
+ "Apply custom scaling to FBX scale, and units scaling to each object transformation"),
+ ('FBX_SCALE_ALL', "FBX All",
+ "Apply custom scaling and units scaling to FBX scale"),
+ ),
+ name="Apply Scalings",
+ description="How to apply custom and units scalings in generated FBX file "
+ "(Blender uses FBX scale to detect units on import, "
+ "but many other applications do not handle the same way)",
+ )
+ # 7.4 only
bake_space_transform = BoolProperty(
name="!EXPERIMENTAL! Apply Transform",
description="Bake space transform into object data, avoids getting unwanted rotations to objects when "
@@ -499,10 +514,14 @@ class ExportFBX(bpy.types.Operator, ExportHelper, IOFBXOrientationHelper):
layout.prop(self, "ui_tab", expand=True)
if self.ui_tab == 'MAIN':
layout.prop(self, "use_selection")
- row = layout.row(align=True)
+
+ col = layout.column(align=True)
+ row = col.row(align=True)
row.prop(self, "global_scale")
sub = row.row(align=True)
sub.prop(self, "apply_unit_scale", text="", icon='NDOF_TRANS')
+ col.prop(self, "apply_scale_options")
+
layout.prop(self, "axis_forward")
layout.prop(self, "axis_up")
@@ -585,13 +604,11 @@ class ExportFBX(bpy.types.Operator, ExportHelper, IOFBXOrientationHelper):
if not self.filepath:
raise Exception("filepath not set")
- global_matrix = (Matrix.Scale(self.global_scale, 4) *
- axis_conversion(to_forward=self.axis_forward,
+ global_matrix = (axis_conversion(to_forward=self.axis_forward,
to_up=self.axis_up,
).to_4x4())
- keywords = self.as_keywords(ignore=("global_scale",
- "check_existing",
+ keywords = self.as_keywords(ignore=("check_existing",
"filter_glob",
"ui_tab",
))
diff --git a/io_scene_fbx/export_fbx_bin.py b/io_scene_fbx/export_fbx_bin.py
index 70d149bf..9797b117 100644
--- a/io_scene_fbx/export_fbx_bin.py
+++ b/io_scene_fbx/export_fbx_bin.py
@@ -2673,15 +2673,16 @@ def fbx_header_elements(root, scene_data, time=None):
props = elem_properties(global_settings)
up_axis, front_axis, coord_axis = RIGHT_HAND_AXES[scene_data.settings.to_axes]
- # DO NOT take into account global scale here! That setting is applied to object transformations during export
- # (in other words, this is pure blender-exporter feature, and has nothing to do with FBX data).
- if scene_data.settings.apply_unit_scale:
- # Unit scaling is applied to objects' scale, so our unit is effectively FBX one (centimeter).
- scale_factor_org = 1.0
- scale_factor = 1.0 / units_blender_to_fbx_factor(scene)
- else:
- scale_factor_org = units_blender_to_fbx_factor(scene)
- scale_factor = scale_factor_org
+ #~ # DO NOT take into account global scale here! That setting is applied to object transformations during export
+ #~ # (in other words, this is pure blender-exporter feature, and has nothing to do with FBX data).
+ #~ if scene_data.settings.apply_unit_scale:
+ #~ # Unit scaling is applied to objects' scale, so our unit is effectively FBX one (centimeter).
+ #~ scale_factor_org = 1.0
+ #~ scale_factor = 1.0 / units_blender_to_fbx_factor(scene)
+ #~ else:
+ #~ scale_factor_org = units_blender_to_fbx_factor(scene)
+ #~ scale_factor = scale_factor_org
+ scale_factor = scale_factor_org = scene_data.settings.unit_scale
elem_props_set(props, "p_integer", b"UpAxis", up_axis[0])
elem_props_set(props, "p_integer", b"UpAxisSign", up_axis[1])
elem_props_set(props, "p_integer", b"FrontAxis", front_axis[0])
@@ -2867,6 +2868,8 @@ def fbx_takes_elements(root, scene_data):
def save_single(operator, scene, filepath="",
global_matrix=Matrix(),
apply_unit_scale=False,
+ global_scale=1.0,
+ apply_scale_options='FBX_SCALE_NONE',
axis_up="Z",
axis_forward="Y",
context_objects=None,
@@ -2905,8 +2908,19 @@ def save_single(operator, scene, filepath="",
if 'OTHER' in object_types:
object_types |= BLENDER_OTHER_OBJECT_TYPES
- if apply_unit_scale:
- global_matrix = global_matrix * Matrix.Scale(units_blender_to_fbx_factor(scene), 4)
+ # Default Blender unit is equivalent to meter, while FBX one is centimeter...
+ unit_scale = units_blender_to_fbx_factor(scene) if apply_unit_scale else 100.0
+ if apply_scale_options == 'FBX_SCALE_NONE':
+ global_matrix = Matrix.Scale(unit_scale * global_scale, 4) * global_matrix
+ unit_scale = 1.0
+ elif apply_scale_options == 'FBX_SCALE_UNITS':
+ global_matrix = Matrix.Scale(global_scale, 4) * global_matrix
+ elif apply_scale_options == 'FBX_SCALE_CUSTOM':
+ global_matrix = Matrix.Scale(unit_scale, 4) * global_matrix
+ unit_scale = global_scale
+ else: # if apply_scale_options == 'FBX_SCALE_ALL':
+ unit_scale = global_scale * unit_scale
+
global_scale = global_matrix.median_scale
global_matrix_inv = global_matrix.inverted()
# For transforming mesh normals.
@@ -2941,7 +2955,7 @@ def save_single(operator, scene, filepath="",
)
settings = FBXExportSettings(
- operator.report, (axis_up, axis_forward), global_matrix, global_scale, apply_unit_scale,
+ operator.report, (axis_up, axis_forward), global_matrix, global_scale, apply_unit_scale, unit_scale,
bake_space_transform, global_matrix_inv, global_matrix_inv_transposed,
context_objects, object_types, use_mesh_modifiers, use_mesh_modifiers_render,
mesh_smooth_type, use_mesh_edges, use_tspace,
diff --git a/io_scene_fbx/fbx_utils.py b/io_scene_fbx/fbx_utils.py
index d79023ee..16a8256f 100644
--- a/io_scene_fbx/fbx_utils.py
+++ b/io_scene_fbx/fbx_utils.py
@@ -1191,7 +1191,7 @@ FBXExportSettingsMedia = namedtuple("FBXExportSettingsMedia", (
# Helper container gathering all exporter settings.
FBXExportSettings = namedtuple("FBXExportSettings", (
- "report", "to_axes", "global_matrix", "global_scale", "apply_unit_scale",
+ "report", "to_axes", "global_matrix", "global_scale", "apply_unit_scale", "unit_scale",
"bake_space_transform", "global_matrix_inv", "global_matrix_inv_transposed",
"context_objects", "object_types", "use_mesh_modifiers", "use_mesh_modifiers_render",
"mesh_smooth_type", "use_mesh_edges", "use_tspace",