[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13898] trunk/blender/release/scripts/ export_obj.py: Fix for [#8382] UV unwrap & export puts seams on all edges.
Joe Eagar
joeedh at gmail.com
Fri Feb 29 07:14:45 CET 2008
raise 'ass', lol :)
Joe
Campbell Barton wrote:
> Revision: 13898
> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13898
> Author: campbellbarton
> Date: 2008-02-28 00:10:25 +0100 (Thu, 28 Feb 2008)
>
> Log Message:
> -----------
> Fix for [#8382] UV unwrap & export puts seams on all edges.
> Maya uses OBJ's UV's to generate seams, some people complained that models imported from blender didnt work well in maya.
> It was faster to write every faces UV (without doing a remove doubles), but sharing UV coords makes smaller files and might also be more efficient in other applications.
>
> Modified Paths:
> --------------
> trunk/blender/release/scripts/export_obj.py
>
> Modified: trunk/blender/release/scripts/export_obj.py
> ===================================================================
> --- trunk/blender/release/scripts/export_obj.py 2008-02-27 20:17:03 UTC (rev 13897)
> +++ trunk/blender/release/scripts/export_obj.py 2008-02-27 23:10:25 UTC (rev 13898)
> @@ -195,9 +195,9 @@
>
> def veckey3d(v):
> return round(v.x, 6), round(v.y, 6), round(v.z, 6)
> -
> - #def veckey2d(v):
> - # return round(v.x, 6), round(v.y, 6)
> +
> + def veckey2d(v):
> + return round(v.x, 6), round(v.y, 6)
>
> print 'OBJ Export path: "%s"' % filename
> temp_mesh_name = '~tmp-mesh'
> @@ -235,7 +235,7 @@
> # Initialize totals, these are updated each object
> totverts = totuvco = totno = 1
>
> - face_vert_index = 1 # used for uvs now
> + face_vert_index = 1
>
> globalNormals = {}
>
> @@ -247,8 +247,12 @@
> me= BPyMesh.getMeshFromObject(ob, containerMesh, EXPORT_APPLY_MODIFIERS, False, scn)
> if not me:
> continue
> - faceuv= me.faceUV
>
> + if EXPORT_UV:
> + faceuv= me.faceUV
> + else:
> + faceuv = False
> +
> # We have a valid mesh
> if EXPORT_TRI and me.faces:
> # Add a dummy object to it.
> @@ -320,7 +324,7 @@
> # so we dont over context switch in the obj file.
> if EXPORT_MORPH_TARGET:
> pass
> - elif faceuv and EXPORT_UV:
> + elif faceuv:
> try: faces.sort(key = lambda a: (a.mat, a.image, a.smooth))
> except: faces.sort(lambda a,b: cmp((a.mat, a.image, a.smooth), (b.mat, b.image, b.smooth)))
> elif len(materials) > 1:
> @@ -354,10 +358,23 @@
> file.write('v %.6f %.6f %.6f\n' % tuple(v.co))
>
> # UV
> - if faceuv and EXPORT_UV:
> - for f in faces:
> - for uv in f.uv:
> - file.write('vt %.6f %.6f 0.0\n' % tuple(uv))
> + if faceuv:
> + uv_face_mapping = [[0,0,0,0] for f in faces] # a bit of a waste for tri's :/
> +
> + uv_dict = {} # could use a set() here
> + for f_index, f in enumerate(faces):
> +
> + for uv_index, uv in enumerate(f.uv):
> + uvkey = veckey2d(uv)
> + try:
> + uv_face_mapping[f_index][uv_index] = uv_dict[uvkey]
> + except:
> + uv_face_mapping[f_index][uv_index] = uv_dict[uvkey] = len(uv_dict)
> + file.write('vt %.6f %.6f\n' % tuple(uv))
> +
> + uv_unique_count = len(uv_dict)
> + del uv, uvkey, uv_dict, f_index, uv_index
> + # Only need uv_unique_count and uv_face_mapping
>
> # NORMAL, Smooth/Non smoothed.
> if EXPORT_NORMALS:
> @@ -376,10 +393,11 @@
> globalNormals[noKey] = totno
> totno +=1
> file.write('vn %.6f %.6f %.6f\n' % noKey)
> +
> if not faceuv:
> f_image = None
>
> - for f in faces:
> + for f_index, f in enumerate(faces):
> f_v= f.v
> f_smooth= f.smooth
> f_mat = min(f.mat, len(materialNames)-1)
> @@ -388,7 +406,7 @@
> f_uv= f.uv
>
> # MAKE KEY
> - if EXPORT_UV and faceuv and f_image: # Object is always true.
> + if faceuv and f_image: # Object is always true.
> key = materialNames[f_mat], f_image.name
> else:
> key = materialNames[f_mat], None # No image, use None instead.
> @@ -432,13 +450,13 @@
> contextSmooth = f_smooth
>
> file.write('f')
> - if faceuv and EXPORT_UV:
> + if faceuv:
> if EXPORT_NORMALS:
> if f_smooth: # Smoothed, use vertex normals
> for vi, v in enumerate(f_v):
> file.write( ' %d/%d/%d' % (\
> v.index+totverts,\
> - face_vert_index + vi,\
> + totuvco + uv_face_mapping[f_index][vi],\
> globalNormals[ veckey3d(v.no) ])) # vert, uv, normal
>
> else: # No smoothing, face normals
> @@ -446,14 +464,22 @@
> for vi, v in enumerate(f_v):
> file.write( ' %d/%d/%d' % (\
> v.index+totverts,\
> - face_vert_index + vi,\
> + totuvco + uv_face_mapping[f_index][vi],\
> no)) # vert, uv, normal
>
> else: # No Normals
> for vi, v in enumerate(f_v):
> +
> + #print _uv_face_mapping == tuple([tuple([0] * len(f)) for f in faces])
> + if len(uv_face_mapping) != len(faces):
> + raise "ass"
> + print f_index
> + print uv_face_mapping[f_index]
> + print vi
> + print uv_face_mapping[f_index][vi]
> file.write( ' %d/%d' % (\
> v.index+totverts,\
> - face_vert_index + vi)) # vert, uv
> + totuvco + uv_face_mapping[f_index][vi])) # vert, uv
>
> face_vert_index += len(f_v)
>
> @@ -486,6 +512,8 @@
>
> # Make the indicies global rather then per mesh
> totverts += len(me.verts)
> + if faceuv:
> + totuvco += uv_unique_count
> me.verts= None
> file.close()
>
>
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
>
More information about the Bf-committers
mailing list