[Bf-extensions-cvs] [c6407d5] master: Fix T39589: FBX: binary exporter is with buggy normals.

Bastien Montagne noreply at git.blender.org
Fri Apr 4 22:02:04 CEST 2014


Commit: c6407d53d14d3329a44089308864d7c113fc8de7
Author: Bastien Montagne
Date:   Fri Apr 4 22:01:01 2014 +0200
https://developer.blender.org/rBAc6407d53d14d3329a44089308864d7c113fc8de7

Fix T39589: FBX: binary exporter is with buggy normals.

Now I'm sure of it - most app apart from latest AD ones do not yet support new normals
format (102, 4D vectors + weights), so revert to older 101 one (3D vectors).

Checked on both houdini and unity.

===================================================================

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 4d21b07..92ef9c2 100644
--- a/io_scene_fbx/export_fbx_bin.py
+++ b/io_scene_fbx/export_fbx_bin.py
@@ -49,9 +49,11 @@ FBX_TEMPLATES_VERSION = 100
 FBX_MODELS_VERSION = 232
 
 FBX_GEOMETRY_VERSION = 124
-FBX_GEOMETRY_NORMAL_VERSION = 102
-FBX_GEOMETRY_BINORMAL_VERSION = 102
-FBX_GEOMETRY_TANGENT_VERSION = 102
+# Revert back normals to 101 (simple 3D values) for now, 102 (4D + weights) seems not well supported by most apps
+# currently, apart from some AD products.
+FBX_GEOMETRY_NORMAL_VERSION = 101
+FBX_GEOMETRY_BINORMAL_VERSION = 101
+FBX_GEOMETRY_TANGENT_VERSION = 101
 FBX_GEOMETRY_SMOOTHING_VERSION = 102
 FBX_GEOMETRY_VCOLOR_VERSION = 101
 FBX_GEOMETRY_UV_VERSION = 101
@@ -1356,7 +1358,9 @@ def fbx_data_mesh_elements(root, me, scene_data):
     me.calc_normals_split()
     def _nortuples_gen(raw_nors, m):
         # Great, now normals are also expected 4D!
-        gen = zip(*(iter(raw_nors),) * 3 + (_infinite_gen(1.0),))
+        # XXX Back to 3D normals for now!
+        #gen = zip(*(iter(raw_nors),) * 3 + (_infinite_gen(1.0),))
+        gen = zip(*(iter(raw_nors),) * 3)
         return gen if m is None else (m * Vector(v) for v in gen)
 
     t_ln = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops) * 3
@@ -1374,14 +1378,14 @@ def fbx_data_mesh_elements(root, me, scene_data):
         ln2idx = tuple(set(t_ln))
         elem_data_single_float64_array(lay_nor, b"Normals", chain(*ln2idx))
         # Normal weights, no idea what it is.
-        t_lnw = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(ln2idx)
-        elem_data_single_float64_array(lay_nor, b"NormalsW", t_lnw)
+        #t_lnw = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(ln2idx)
+        #elem_data_single_float64_array(lay_nor, b"NormalsW", t_lnw)
 
         ln2idx = {nor: idx for idx, nor in enumerate(ln2idx)}
         elem_data_single_int32_array(lay_nor, b"NormalsIndex", (ln2idx[n] for n in t_ln))
 
         del ln2idx
-        del t_lnw
+        #del t_lnw
     else:
         lay_nor = elem_data_single_int32(geom, b"LayerElementNormal", 0)
         elem_data_single_int32(lay_nor, b"Version", FBX_GEOMETRY_NORMAL_VERSION)
@@ -1390,8 +1394,8 @@ def fbx_data_mesh_elements(root, me, scene_data):
         elem_data_single_string(lay_nor, b"ReferenceInformationType", b"Direct")
         elem_data_single_float64_array(lay_nor, b"Normals", chain(*t_ln))
         # Normal weights, no idea what it is.
-        t_ln = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops)
-        elem_data_single_float64_array(lay_nor, b"NormalsW", t_ln)
+        #t_ln = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops)
+        #elem_data_single_float64_array(lay_nor, b"NormalsW", t_ln)
     del t_ln
 
     # tspace
@@ -1400,7 +1404,7 @@ def fbx_data_mesh_elements(root, me, scene_data):
         tspacenumber = len(me.uv_layers)
         if tspacenumber:
             t_ln = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops) * 3
-            t_lnw = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops)
+            #t_lnw = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops)
             for idx, uvlayer in enumerate(me.uv_layers):
                 name = uvlayer.name
                 me.calc_tangents(name)
@@ -1414,7 +1418,7 @@ def fbx_data_mesh_elements(root, me, scene_data):
                 elem_data_single_string(lay_nor, b"ReferenceInformationType", b"Direct")
                 elem_data_single_float64_array(lay_nor, b"Binormals", chain(*_nortuples_gen(t_ln, geom_mat_no)))
                 # Binormal weights, no idea what it is.
-                elem_data_single_float64_array(lay_nor, b"BinormalsW", t_lnw)
+                #elem_data_single_float64_array(lay_nor, b"BinormalsW", t_lnw)
 
                 # Loop tangents.
                 # NOTE: this is not supported by importer currently.
@@ -1426,10 +1430,10 @@ def fbx_data_mesh_elements(root, me, scene_data):
                 elem_data_single_string(lay_nor, b"ReferenceInformationType", b"Direct")
                 elem_data_single_float64_array(lay_nor, b"Binormals", chain(*_nortuples_gen(t_ln, geom_mat_no)))
                 # Tangent weights, no idea what it is.
-                elem_data_single_float64_array(lay_nor, b"TangentsW", t_lnw)
+                #elem_data_single_float64_array(lay_nor, b"TangentsW", t_lnw)
 
             del t_ln
-            del t_lnw
+            #del t_lnw
             me.free_tangents()
 
     me.free_normals_split()



More information about the Bf-extensions-cvs mailing list