[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4577] trunk/py/scripts/addons/ io_scene_obj: add support for writing smooth groups for OBJ

Campbell Barton ideasman42 at gmail.com
Fri Jun 14 12:48:49 CEST 2013


Revision: 4577
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4577
Author:   campbellbarton
Date:     2013-06-14 10:48:48 +0000 (Fri, 14 Jun 2013)
Log Message:
-----------
add support for writing smooth groups for OBJ

Modified Paths:
--------------
    trunk/py/scripts/addons/io_scene_obj/__init__.py
    trunk/py/scripts/addons/io_scene_obj/export_obj.py

Modified: trunk/py/scripts/addons/io_scene_obj/__init__.py
===================================================================
--- trunk/py/scripts/addons/io_scene_obj/__init__.py	2013-06-14 08:06:53 UTC (rev 4576)
+++ trunk/py/scripts/addons/io_scene_obj/__init__.py	2013-06-14 10:48:48 UTC (rev 4577)
@@ -237,6 +237,11 @@
             description="",
             default=True,
             )
+    use_smooth_groups = BoolProperty(
+            name="Smooth Groups",
+            description="Write sharp edges as smooth groups",
+            default=False,
+            )
     use_normals = BoolProperty(
             name="Include Normals",
             description="",

Modified: trunk/py/scripts/addons/io_scene_obj/export_obj.py
===================================================================
--- trunk/py/scripts/addons/io_scene_obj/export_obj.py	2013-06-14 08:06:53 UTC (rev 4576)
+++ trunk/py/scripts/addons/io_scene_obj/export_obj.py	2013-06-14 10:48:48 UTC (rev 4577)
@@ -245,6 +245,7 @@
 def write_file(filepath, objects, scene,
                EXPORT_TRI=False,
                EXPORT_EDGES=False,
+               EXPORT_SMOOTH_GROUPS=False,
                EXPORT_NORMALS=False,
                EXPORT_UV=True,
                EXPORT_MTL=True,
@@ -401,6 +402,13 @@
             if EXPORT_NORMALS and face_index_pairs:
                 me.calc_normals()
 
+            if EXPORT_SMOOTH_GROUPS and face_index_pairs:
+                smooth_groups, smooth_groups_tot = me.calc_smooth_groups()
+                if smooth_groups_tot <= 1:
+                    smooth_groups, smooth_groups_tot = (), 0
+            else:
+                smooth_groups, smooth_groups_tot = (), 0
+
             materials = me.materials[:]
             material_names = [m.name if m else None for m in materials]
 
@@ -413,14 +421,34 @@
             # so we dont over context switch in the obj file.
             if EXPORT_KEEP_VERT_ORDER:
                 pass
-            elif faceuv:
-                face_index_pairs.sort(key=lambda a: (a[0].material_index, hash(uv_texture[a[1]].image), a[0].use_smooth))
-            elif len(materials) > 1:
-                face_index_pairs.sort(key=lambda a: (a[0].material_index, a[0].use_smooth))
             else:
-                # no materials
-                face_index_pairs.sort(key=lambda a: a[0].use_smooth)
+                if faceuv:
+                    if smooth_groups:
+                        sort_func = lambda a: (a[0].material_index,
+                                               hash(uv_texture[a[1]].image),
+                                               smooth_groups[a[1]] if a[0].use_smooth else False)
+                    else:
+                        sort_func = lambda a: (a[0].material_index,
+                                               hash(uv_texture[a[1]].image),
+                                               a[0].use_smooth)
+                elif len(materials) > 1:
+                    if smooth_groups:
+                        sort_func = lambda a: (a[0].material_index,
+                                               smooth_groups[a[1]] if a[0].use_smooth else False)
+                    else:
+                        sort_func = lambda a: (a[0].material_index,
+                                               a[0].use_smooth)
+                else:
+                    # no materials
+                    if smooth_groups:
+                        sort_func = lambda a: smooth_groups[a[1] if a[0].use_smooth else False]
+                    else:
+                        sort_func = lambda a: a[0].use_smooth
 
+                face_index_pairs.sort(key=sort_func)
+
+                del sort_func
+
             # Set the default mat to no material and no image.
             contextMat = 0, 0  # Can never be this, so we will label a new material the first chance we get.
             contextSmooth = None  # Will either be true or false,  set bad to force initialization switch.
@@ -503,6 +531,8 @@
 
             for f, f_index in face_index_pairs:
                 f_smooth = f.use_smooth
+                if f_smooth and smooth_groups:
+                    f_smooth = smooth_groups[f_index]
                 f_mat = min(f.material_index, len(materials) - 1)
 
                 if faceuv:
@@ -570,11 +600,14 @@
                 contextMat = key
                 if f_smooth != contextSmooth:
                     if f_smooth:  # on now off
-                        fw('s 1\n')
-                        contextSmooth = f_smooth
+                        if smooth_groups:
+                            f_smooth = smooth_groups[f_index]
+                            fw('s %d\n' % f_smooth)
+                        else:
+                            fw('s 1\n')
                     else:  # was off now on
                         fw('s off\n')
-                        contextSmooth = f_smooth
+                    contextSmooth = f_smooth
 
                 f_v = [(vi, me_verts[v_idx]) for vi, v_idx in enumerate(f.vertices)]
 
@@ -656,6 +689,7 @@
 def _write(context, filepath,
               EXPORT_TRI,  # ok
               EXPORT_EDGES,
+              EXPORT_SMOOTH_GROUPS,
               EXPORT_NORMALS,  # not yet
               EXPORT_UV,  # ok
               EXPORT_MTL,
@@ -707,6 +741,7 @@
         write_file(full_path, objects, scene,
                    EXPORT_TRI,
                    EXPORT_EDGES,
+                   EXPORT_SMOOTH_GROUPS,
                    EXPORT_NORMALS,
                    EXPORT_UV,
                    EXPORT_MTL,
@@ -739,6 +774,7 @@
          use_triangles=False,
          use_edges=True,
          use_normals=False,
+         use_smooth_groups=False,
          use_uvs=True,
          use_materials=True,
          use_mesh_modifiers=True,
@@ -757,6 +793,7 @@
     _write(context, filepath,
            EXPORT_TRI=use_triangles,
            EXPORT_EDGES=use_edges,
+           EXPORT_SMOOTH_GROUPS=use_smooth_groups,
            EXPORT_NORMALS=use_normals,
            EXPORT_UV=use_uvs,
            EXPORT_MTL=use_materials,



More information about the Bf-extensions-cvs mailing list