X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=mesh_export.py;h=bafbf917e527eea2b7c7e230b2115dce987e4012;hb=80aac2618536baaa99b92629be6931363c49c4de;hp=0158bdbf9189d3cff6e2bedae25b8e040601d02b;hpb=926d77eb54f915a6620eb879a91c1c4bd0f06bbc;p=libs%2Fgl.git diff --git a/mesh_export.py b/mesh_export.py index 0158bdbf..bafbf917 100644 --- a/mesh_export.py +++ b/mesh_export.py @@ -14,9 +14,13 @@ import Blender class Edge: def __init__(self, me): - self._medge=me + if me.__class__==Edge: + self._medge=me._medge + self.smooth=me.smooth + else: + self._medge=me + self.smooth=False self.faces=[] - self.smooth=False def __getattr__(self, attr): return getattr(self._medge, attr) @@ -43,8 +47,11 @@ class Vertex: def __init__(self, mv): if mv.__class__==Vertex: self._mvert=mv._mvert + self.uv=mv.uv else: self._mvert=mv + self.uv=None + self.orig_index=self._mvert.index def __getattr__(self, attr): return getattr(self._mvert, attr) @@ -69,6 +76,13 @@ class Face: if flags[i] and not flags[(i+l-1)%l]: return self.verts[i:]+self.verts[:i] + def get_edge(self, v1, v2): + i1=v1.index + i2=v2.index + for e in self.edges: + if (e.v1.index==i1 or e.v1.index==i2) and (e.v2.index==i1 or e.v2.index==i2): + return e + class SmoothGroup: def __init__(self, index): @@ -83,17 +97,66 @@ class SmoothGroup: v=f.verts[i] if v.index not in vert_map: vt=Vertex(v) - vt.no=Blender.Mathutils.Vector(f.no) + vt.index=len(self.verts) self.verts.append(vt) + vert_map[v.index]=vt - f.verts[i]=vt + vt.no=Blender.Mathutils.Vector(f.no) else: - f.verts[i]=vert_map[v.index] - vert_map[v.index].no+=f.no + vt=vert_map[v.index] + vt.no+=f.no + f.verts[i]=vt for v in self.verts: v.no.normalize() + def separate_uv(self): + copies={} + for f in self.faces: + for i in range(len(f.verts)): + v=f.verts[i] + if not v.uv: + v.uv=f.uv[i] + elif f.uv[i]!=v.uv: + if v.index not in copies: + copies[v.index]=[] + + vt=None + for w in copies[v.index]: + if w.uv==f.uv[i]: + vt=w + break + + if not vt: + vt=Vertex(v) + vt.index=len(self.verts) + vt.uv=f.uv[i] + self.verts.append(vt) + copies[v.index].append(vt) + + f.verts[i]=vt + + def create_edges(self): + edge_map={} + for f in self.faces: + vert_map=dict([(v.orig_index, v) for v in f.verts]) + for i in range(len(f.edges)): + v1=vert_map[f.edges[i].v1.index] + v2=vert_map[f.edges[i].v2.index] + key=tuple(sorted((v1.index, v2.index))) + + if key in edge_map: + e=edge_map[key] + else: + e=Edge(f.edges[i]) + edge_map[key]=e + e.v1=v1 + e.v2=v2 + e.key=key + + f.edges[i]=e + e.faces.append(f) + class Exporter: def __init__(self, fn): @@ -105,6 +168,7 @@ class Exporter: self.use_strips=True self.use_degen_tris=True self.debug=False + self.strip_debug=False def find_smooth_group(self, face, sg): face.smooth_group=sg @@ -131,17 +195,20 @@ class Exporter: if not edge: return None - if self.debug: - print "Starting strip from %s"%[v.index for v in face.verts] + if self.strip_debug: + print "Starting strip from %s, edge %s"%([v.index for v in face.verts], (edge.v1.index, edge.v2.index)) verts=face.get_vertices_from(edge.v1, edge.v2) - result=[verts[-2], verts[-1]] + if len(verts)==3: + result=[verts[-1], verts[0]] + else: + result=[verts[-2], verts[-1]] while 1: verts=face.get_vertices_from(*result[-2:]) k=len(result)%2 - if self.debug: - print " %d %s"%(len(result), [v.index for v in verts]) + if self.strip_debug: + print " Adding %s"%[v.index for v in verts] face.flag=True if len(verts)==4 and not k: @@ -150,24 +217,28 @@ class Exporter: if len(verts)==4 and k: result.append(verts[3]) - i1=result[-2].index - i2=result[-1].index - ekey=(min(i1, i2), max(i1, i2)) - for e in face.edges: - if e.key==ekey: - edge=e - break + edge=face.get_edge(*result[-2:]) + + if self.strip_debug: + print " Next edge is %s"%((edge.v1.index, edge.v2.index), ) next=edge.other_face(face) if not next or next.smooth_group.index!=face.smooth_group.index or next.flag: break face=next - if self.debug: + if self.strip_debug: print " %s"%[v.index for v in result] return result + def get_locality(self, strip): + total=0 + for i in range(1, len(strip)): + if strip[i].index!=strip[i-1].index: + total+=1.0/(abs(strip[i].index-strip[i-1].index)) + return total/len(strip) + def export(self): scene=bpy.data.scenes.active @@ -190,7 +261,8 @@ class Exporter: e.check_smooth(smooth_limit) if self.debug: - print "%d faces, %d edges"%(len(faces), len(edges)) + ntris=sum([len(f.verts)-2 for f in faces]) + print "%d faces (%d triangles), %d edges"%(len(faces), ntris, len(edges)) smooth_groups=[] for f in faces: @@ -201,28 +273,69 @@ class Exporter: for sg in smooth_groups: sg.find_vertices() + if mesh.faceUV: + sg.separate_uv() + sg.create_edges() + + verts=[] + for sg in smooth_groups: + for v in sg.verts: + v.index=len(verts) + verts.append(v) if self.debug: - print "%d smooth groups:" + print "%d smooth groups:"%len(smooth_groups) for i in range(len(smooth_groups)): sg=smooth_groups[i] print " %d: %d faces, %d vertices"%(i, len(sg.faces), len(sg.verts)) + print "%d vertices total"%len(verts) strips=[] if self.use_strips: - for sg in smooth_groups: - for f in sg.faces: - if not f.flag: - strip=self.create_strip(f) - if strip: - strips.append(strip) + while 1: + best=5 + face=None + for f in faces: + if f.flag: + continue + score=0 + for e in f.edges: + other=e.other_face(f) + if other and other.smooth_group.index==f.smooth_group.index and not other.flag: + score+=1 + if score>0 and score