25/01/12 0.18
[blender-addons-contrib.git] / io_directx_bel / bel / uv.py
1 from mathutils import Vector
2 from .__init__ import *
3 from time import clock
4
5 # uvs :
6
7 def write(me, uvs, matimage = False) :
8     t = clock()
9     uvs, nest = nested(uvs)
10     newuvs = []
11     # uvi : uvlayer id  uvlist : uv coordinates list
12     for uvi, uvlist in enumerate(uvs) :
13
14         uv = me.uv_textures.new()
15         uv.name = 'UV%s'%uvi
16         
17         uvlayer = me.uv_layers[-1].data
18         
19         for uvfi, uvface in enumerate(uvlist) :
20             #uv.data[uvfi].use_twoside = True # 2.60 changes mat ways
21             mslotid = me.polygons[uvfi].material_index
22             #mat = mesh.materials[mslotid]
23             if matimage :
24                 if matimage[mslotid] :
25                     img = matimage[mslotid]
26                     uv.data[uvfi].image=img
27             
28             vi = 0
29             for fi in me.polygons[uvfi].loop_indices :
30                 uvlayer[fi].uv = Vector((uvface[vi],uvface[vi+1]))
31                 vi += 2
32                 
33         newuvs.append(uv)
34     print('uvs in ',clock() - t)
35     if nest : return newuvs
36     return newuvs[0]
37     
38 ## WAY faster
39 def flatwrite(me, uvs, matimage = False) :
40     #t = clock()
41     newuvs = []
42     #print('uv funcinput : %s'%(len(uvs)))
43     # uvi : uvlayer id  uvlist : uv coordinates list
44     for uvi, uvlist in enumerate(uvs) :
45         #print('uvlist input : %s'%(len(uvlist)))
46         #print(uvlist[0:5])
47         uv = me.uv_textures.new()
48         uv.name = 'UV%s'%uvi
49         uvlayer = me.uv_layers[-1].data
50         # flatuv = awaited uvlist length
51         #flatuv = list( range(len(uvlayer) * 2) )
52         #print('uvlist need : %s'%(len(flatuv)))
53         uvlayer.foreach_set('uv',uvlist)
54
55         newuvs.append(uv)
56     #print('uvs in ',clock() - t)
57     return newuvs
58
59 # face are squared or rectangular, 
60 # any orientation
61 # vert order width then height 01 and 23 = x 12 and 03 = y
62 # normal default when face has been built
63 def row(vertices,faces,normals=True) :
64     uvs = []
65     for face in faces :
66         v0 = vertices[face[0]]
67         v1 = vertices[face[1]]
68         v2 = vertices[face[-1]]
69         print(v0,v1)
70         lx = (v1 - v0).length
71         ly = (v2 - v0).length
72         # init uv
73         if len(uvs) == 0 :
74             x = 0
75             y = 0
76         elif normals :
77             x = uvs[-1][2]
78             y = uvs[-1][3]
79         else :
80             x = uvs[-1][0]
81             y = uvs[-1][1]
82         if normals : uvs.append([x,y,x+lx,y,x+lx,y+ly,x,y+ly])
83         else : uvs.append([x+lx,y,x,y,x,y+ly,x+lx,y+ly])
84     return uvs
85
86 ## convert UV given as verts location to blender format
87 # eg : [ [v0x,v0y] , [vnx , vny] ... ] -> [ [ v1x,v1y,v0x,v0y,v4x,v4y] ... ]
88 # found in directx
89 def asVertsLocation(verts2d, faces) :
90     t = clock()
91     uv = []
92     for f in faces :
93         uvface = []
94         for vi in f :
95             uvface.extend(verts2d[vi])
96         uv.append(uvface)
97     print('uvs convert in ',clock() - t)
98     return uv
99
100 ## Dx to flat
101 #eg : [ [v0x,v0y] ,[v1x,v1y] , [vnx , vny] ] -> [ v0x,v0y,v1x,v1y,vnx,vny ]
102 def asFlatList(uvlist,faces) :
103     #t = clock()
104     uv = []
105     for f in faces :
106         for vi in f :
107             uv.extend(uvlist[vi])
108     #print('uvs convert in %s len : %s'%(str(clock() - t),len(uv)))
109     return uv