[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4753] trunk/py/scripts/addons/ io_scene_obj/export_obj.py: OBJ export: export split normals when " Include Normals" is checked (help keep sharp edges...).

Bastien Montagne montagne29 at wanadoo.fr
Fri Sep 13 14:04:41 CEST 2013


Revision: 4753
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4753
Author:   mont29
Date:     2013-09-13 12:04:40 +0000 (Fri, 13 Sep 2013)
Log Message:
-----------
OBJ export: export split normals when "Include Normals" is checked (help keep sharp edges...).

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

Modified: trunk/py/scripts/addons/io_scene_obj/export_obj.py
===================================================================
--- trunk/py/scripts/addons/io_scene_obj/export_obj.py	2013-09-13 00:48:12 UTC (rev 4752)
+++ trunk/py/scripts/addons/io_scene_obj/export_obj.py	2013-09-13 12:04:40 UTC (rev 4753)
@@ -401,7 +401,11 @@
                 continue  # dont bother with this mesh.
 
             if EXPORT_NORMALS and face_index_pairs:
-                me.calc_normals()
+                me.calc_normals_split()
+                # No need to call me.free_normals_split later, as this mesh is deleted anyway!
+                loops = me.loops
+            else:
+                loops = []
 
             if (EXPORT_SMOOTH_GROUPS or EXPORT_SMOOTH_GROUPS_BITFLAGS) and face_index_pairs:
                 smooth_groups, smooth_groups_tot = me.calc_smooth_groups(EXPORT_SMOOTH_GROUPS_BITFLAGS)
@@ -499,22 +503,19 @@
 
             # NORMAL, Smooth/Non smoothed.
             if EXPORT_NORMALS:
+                loops_to_normals = [0] * len(loops)
                 for f, f_index in face_index_pairs:
-                    if f.use_smooth:
-                        for v_idx in f.vertices:
-                            v = me_verts[v_idx]
-                            noKey = veckey3d(v.normal)
-                            if noKey not in globalNormals:
-                                globalNormals[noKey] = totno
-                                totno += 1
-                                fw('vn %.6f %.6f %.6f\n' % noKey)
-                    else:
-                        # Hard, 1 normal from the face.
-                        noKey = veckey3d(f.normal)
+                    for l_idx in f.loop_indices:
+                        noKey = veckey3d(loops[l_idx].normal)
                         if noKey not in globalNormals:
                             globalNormals[noKey] = totno
-                            totno += 1
+                            loops_to_normals[l_idx] = totno
                             fw('vn %.6f %.6f %.6f\n' % noKey)
+                            totno += 1
+                        else:
+                            loops_to_normals[l_idx] = globalNormals[noKey]
+            else:
+                loops_to_normals = []
 
             if not faceuv:
                 f_image = None
@@ -610,29 +611,20 @@
                         fw('s off\n')
                     contextSmooth = f_smooth
 
-                f_v = [(vi, me_verts[v_idx]) for vi, v_idx in enumerate(f.vertices)]
+                #f_v = [(vi, me_verts[v_idx]) for vi, v_idx in enumerate(f.vertices)]
+                f_v = [(vi, me_verts[v_idx], l_idx) for vi, (v_idx, l_idx) in enumerate(zip(f.vertices, f.loop_indices))]
 
                 fw('f')
                 if faceuv:
                     if EXPORT_NORMALS:
-                        if f_smooth:  # Smoothed, use vertex normals
-                            for vi, v in f_v:
-                                fw(" %d/%d/%d" %
-                                           (v.index + totverts,
-                                            totuvco + uv_face_mapping[f_index][vi],
-                                            globalNormals[veckey3d(v.normal)],
-                                            ))  # vert, uv, normal
-
-                        else:  # No smoothing, face normals
-                            no = globalNormals[veckey3d(f.normal)]
-                            for vi, v in f_v:
-                                fw(" %d/%d/%d" %
-                                           (v.index + totverts,
-                                            totuvco + uv_face_mapping[f_index][vi],
-                                            no,
-                                            ))  # vert, uv, normal
+                        for vi, v, li in f_v:
+                            fw(" %d/%d/%d" %
+                                       (v.index + totverts,
+                                        totuvco + uv_face_mapping[f_index][vi],
+                                        loops_to_normals[li],
+                                        ))  # vert, uv, normal
                     else:  # No Normals
-                        for vi, v in f_v:
+                        for vi, v, li in f_v:
                             fw(" %d/%d" % (
                                        v.index + totverts,
                                        totuvco + uv_face_mapping[f_index][vi],
@@ -642,18 +634,10 @@
 
                 else:  # No UV's
                     if EXPORT_NORMALS:
-                        if f_smooth:  # Smoothed, use vertex normals
-                            for vi, v in f_v:
-                                fw(" %d//%d" % (
-                                           v.index + totverts,
-                                           globalNormals[veckey3d(v.normal)],
-                                           ))
-                        else:  # No smoothing, face normals
-                            no = globalNormals[veckey3d(f.normal)]
-                            for vi, v in f_v:
-                                fw(" %d//%d" % (v.index + totverts, no))
+                        for vi, v, li in f_v:
+                            fw(" %d//%d" % (v.index + totverts, loops_to_normals[li]))
                     else:  # No Normals
-                        for vi, v in f_v:
+                        for vi, v, li in f_v:
                             fw(" %d" % (v.index + totverts))
 
                 fw('\n')



More information about the Bf-extensions-cvs mailing list