[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4705] trunk/py/scripts/addons/ io_scene_fbx/import_fbx.py: add support for reading vertex colors

Campbell Barton ideasman42 at gmail.com
Wed Aug 28 07:01:13 CEST 2013


Revision: 4705
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4705
Author:   campbellbarton
Date:     2013-08-28 05:01:12 +0000 (Wed, 28 Aug 2013)
Log Message:
-----------
add support for reading vertex colors

Modified Paths:
--------------
    trunk/py/scripts/addons/io_scene_fbx/import_fbx.py

Modified: trunk/py/scripts/addons/io_scene_fbx/import_fbx.py
===================================================================
--- trunk/py/scripts/addons/io_scene_fbx/import_fbx.py	2013-08-28 00:59:42 UTC (rev 4704)
+++ trunk/py/scripts/addons/io_scene_fbx/import_fbx.py	2013-08-28 05:01:12 UTC (rev 4705)
@@ -327,7 +327,7 @@
     mesh, blen_data, blend_attr,
     fbx_layer_data, fbx_layer_index,
     fbx_layer_mapping, fbx_layer_ref,
-    stride, descr,
+    stride, item_size, descr,
     ):
     # TODO, generic mapping apply function
     if fbx_layer_mapping == b'ByVertice':
@@ -335,7 +335,8 @@
             assert(fbx_layer_index is None)
             # TODO, more generic support for mapping types
             for i, blen_data_item in enumerate(blen_data):
-                setattr(blen_data_item, blend_attr, fbx_layer_data[(i * stride): (i * stride) + stride])
+                setattr(blen_data_item, blend_attr,
+                        fbx_layer_data[(i * stride): (i * stride) + item_size])
             return True
         else:
             print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref))
@@ -349,17 +350,19 @@
     mesh, blen_data, blend_attr,
     fbx_layer_data, fbx_layer_index,
     fbx_layer_mapping, fbx_layer_ref,
-    stride, descr,
+    stride, item_size, descr,
     ):
 
     if fbx_layer_mapping == b'ByEdge':
         if fbx_layer_ref == b'Direct':
             if stride == 1:
                 for i, blen_data_item in enumerate(blen_data):
-                    setattr(blen_data_item, blend_attr, fbx_layer_data[i])
+                    setattr(blen_data_item, blend_attr,
+                            fbx_layer_data[i])
             else:
                 for i, blen_data_item in enumerate(blen_data):
-                    setattr(blen_data_item, blend_attr, fbx_layer_data[(i * stride): (i * stride) + stride])
+                    setattr(blen_data_item, blend_attr,
+                            fbx_layer_data[(i * stride): (i * stride) + item_size])
             return True
         else:
             print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref))
@@ -373,17 +376,19 @@
     mesh, blen_data, blend_attr,
     fbx_layer_data, fbx_layer_index,
     fbx_layer_mapping, fbx_layer_ref,
-    stride, descr,
+    stride, item_size, descr,
     ):
 
     if fbx_layer_mapping == b'ByPolygon':
         if fbx_layer_ref == b'IndexToDirect':
             if stride == 1:
                 for i, blen_data_item in enumerate(blen_data):
-                    setattr(blen_data_item, blend_attr, fbx_layer_data[i])
+                    setattr(blen_data_item, blend_attr,
+                            fbx_layer_data[i])
             else:
                 for i, blen_data_item in enumerate(blen_data):
-                    setattr(blen_data_item, blend_attr, fbx_layer_data[(i * stride): (i * stride) + stride])
+                    setattr(blen_data_item, blend_attr,
+                            fbx_layer_data[(i * stride): (i * stride) + item_size])
             return True
         elif fbx_layer_ref == b'Direct':
             # looks like direct may have different meanings!
@@ -403,14 +408,15 @@
     mesh, blen_data, blend_attr,
     fbx_layer_data, fbx_layer_index,
     fbx_layer_mapping, fbx_layer_ref,
-    stride, descr,
+    stride, item_size, descr,
     ):
 
     if fbx_layer_mapping == b'ByPolygonVertex':
         if fbx_layer_ref == b'IndexToDirect':
             assert(fbx_layer_index is not None)
             for i, j in enumerate(fbx_layer_index):
-                setattr(blen_data[i], blend_attr, fbx_layer_data[(j * stride): (j * stride) + stride])
+                setattr(blen_data[i], blend_attr,
+                        fbx_layer_data[(j * stride): (j * stride) + item_size])
             return True
         else:
             print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref))
@@ -422,7 +428,8 @@
             for p in polygons:
                 for i in p.loop_indices:
                     j = loops[i].vertex_index
-                    setattr(blen_data[i], blend_attr, fbx_layer_data[(j * stride): (j * stride) + stride])
+                    setattr(blen_data[i], blend_attr,
+                            fbx_layer_data[(j * stride): (j * stride) + item_size])
         else:
             print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref))
     else:
@@ -442,6 +449,10 @@
      fbx_layer_ref,
      ) = blen_read_geom_layerinfo(fbx_layer)
 
+    if fbx_layer_mapping == b'AllSame':
+        # only to quiet warning
+        return
+
     layer_id = b'Materials'
     fbx_layer_data = elem_prop_first(elem_find_first(fbx_layer, layer_id))
 
@@ -450,7 +461,7 @@
         mesh, blen_data, "material_index",
         fbx_layer_data, None,
         fbx_layer_mapping, fbx_layer_ref,
-        1, layer_id,
+        1, 1, layer_id,
         )
 
 
@@ -474,10 +485,34 @@
                 mesh, blen_data, "uv",
                 fbx_layer_data, fbx_layer_index,
                 fbx_layer_mapping, fbx_layer_ref,
-                2, layer_id,
+                2, 2, layer_id,
                 )
 
 
+def blen_read_geom_layer_color(fbx_obj, mesh):
+    # almost same as UV's
+    for layer_id in (b'LayerElementColor',):
+        for fbx_layer in elem_find_iter(fbx_obj, layer_id):
+            # all should be valid
+            (fbx_layer_name,
+             fbx_layer_mapping,
+             fbx_layer_ref,
+             ) = blen_read_geom_layerinfo(fbx_layer)
+
+            fbx_layer_data = elem_prop_first(elem_find_first(fbx_layer, b'Colors'))
+            fbx_layer_index = elem_prop_first(elem_find_first(fbx_layer, b'ColorIndex'))
+
+            color_lay = mesh.vertex_colors.new(name=fbx_layer_name)
+            blen_data = color_lay.data[:]
+
+            # ignore alpha layer (read 4 items into 3)
+            blen_read_geom_array_mapped_polyloop(
+                mesh, blen_data, "color",
+                fbx_layer_data, fbx_layer_index,
+                fbx_layer_mapping, fbx_layer_ref,
+                4, 3, layer_id,
+                )
+
 def blen_read_geom_layer_smooth(fbx_obj, mesh):
     fbx_layer = elem_find_first(fbx_obj, b'LayerElementSmoothing')
 
@@ -507,7 +542,7 @@
             mesh, blen_data, "use_edge_sharp",
             fbx_layer_data, None,
             fbx_layer_mapping, fbx_layer_ref,
-            1, layer_id,
+            1, 1, layer_id,
             )
         if ok_smooth:
             # ugh, need to negate
@@ -520,7 +555,7 @@
             mesh, blen_data, "use_smooth",
             fbx_layer_data, None,
             fbx_layer_mapping, fbx_layer_ref,
-            1, layer_id,
+            1, 1, layer_id,
             )
     else:
         print("warning layer %r mapping type unsupported: %r" % (fbx_layer.id, fbx_layer_mapping))
@@ -547,7 +582,7 @@
         mesh, blen_data, "normal",
         fbx_layer_data, None,
         fbx_layer_mapping, fbx_layer_ref,
-        3, layer_id,
+        3, 3, layer_id,
         )
 
 
@@ -590,6 +625,7 @@
 
         blen_read_geom_layer_material(fbx_obj, mesh)
         blen_read_geom_layer_uv(fbx_obj, mesh)
+        blen_read_geom_layer_color(fbx_obj, mesh)
 
     if fbx_edges:
         # workaround for odd number of edge vertices



More information about the Bf-extensions-cvs mailing list