use f.area where possible over python function and use len(mface) over len(mface.v)
[blender.git] / release / scripts / disp_paint.py
1 #!BPY
2
3 """ Registration info for Blender menus: <- these words are ignored
4 Name: 'Dispaint'
5 Blender: 237
6 Group: 'Mesh'
7 Tip: 'use vertex paint color value to modify shape displacing vertices along normal'
8 """
9
10 __author__ = "Jean-Michel Soler (jms)"
11 __url__ = ("blender", "elysiun",
12 "Script's homepage, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_displacementpainting.htm",
13 "Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender")
14 __version__ = "237"
15
16 __bpydoc__ = """\
17 This script displaces mesh vertices according to vertex color values.
18
19 Usage:
20
21 Select the mesh, enter Edit Mode and run this script to open its GUI.  Options
22 include setting mode, orientation, size and number of repetitions of the
23 displacement.  You can enter Vertex Paint mode and alternate applying
24 displacements and painting parts of the mesh.
25
26 Orientation includes vertex normals, local coordinates and noise (you may need
27 to resize the scripts window to view the noise menu below the "Last Error:"
28 line.  This menu lets you define noise type from the many options available in
29 Blender.
30
31 Notes:<br>
32     The "Create" button will make at any time a copy of the active mesh in its
33 current state, so you can keep it and continue working on the copy;<br>
34     One of the great possible uses of this script is to "raise" terrain from a
35 subdivided plane, for example, with good control of the process by setting
36 options, defining orientation and alternating vertex painting with
37 displacements.
38 """
39
40 #----------------------------------------------
41 # jm soler, displacement paint 03/2002 - > 05/2004:  disp_paintf
42 # Terrain Noise added suugered by Jimmy Haze  
43 #----------------------------------------------
44 # Page officielle :
45 #   http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_displacementpainting.htm
46 # Communiquer les problemes et erreurs sur:
47 #   http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
48 #--------------------------------------------- 
49 # ce script est proposé sous licence GPL pour etre associe
50 # a la distribution de Blender 2.33
51 #----------------------------------------------
52 # this script is released under GPL licence
53 # for the Blender 2.33 scripts package
54 #----------------------------------------------
55 # ***** BEGIN GPL LICENSE BLOCK *****
56 #
57 # Copyright (C) 2003, 2004: Jean-Michel Soler
58 #
59 # This program is free software; you can redistribute it and/or
60 # modify it under the terms of the GNU General Public License
61 # as published by the Free Software Foundation; either version 2
62 # of the License, or (at your option) any later version.
63 #
64 # This program is distributed in the hope that it will be useful,
65 # but WITHOUT ANY WARRANTY; without even the implied warranty of
66 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
67 # GNU General Public License for more details.
68 #
69 # You should have received a copy of the GNU General Public License
70 # along with this program; if not, write to the Free Software Foundation,
71 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
72 #
73 # ***** END GPL LICENCE BLOCK *****
74 # --------------------------------------------------------------------------
75 #  09/07/04 : Noise functions based on a piece of script by Jimmy Haze.
76 # --------------------------------------------------------------------------
77
78 import Blender
79 from Blender import *
80 from Blender.Draw import *
81 from Blender.BGL import *
82 from Blender.Noise import *
83 from Blender.Scene  import *
84 from Blender.Window  import *
85 sc=Scene.getCurrent()
86
87 # niveau du deplacement
88 ng=0.5
89
90 # noise default
91 NOISE=1
92
93 # profondeur des couleurs primaires rgb
94 maxcol=255.0*3
95
96 # limitation de la zone de travail sur le
97 # le materiau numer mat du tableau d'indices 
98 # des materiaux. Par defaut mat =-1 ce qui signifie 
99 # que toute la surface est traitee
100 mat=[]
101 vindex=[]
102 ORIName=''
103 NEWName=''
104 ERROR=0
105 TextERROR=''
106
107 E_EXIT     = 1
108 E_MODE     = 2
109 E_ORIENT   = 3
110 E_NSIZE    = 4
111 E_REPEAT   = 5
112 E_ACTION   = 16
113 E_CREATE   = 17
114 E_DOCMAT   = 24
115 E_MATVAL   = [32,33,34,35,36,37,38,39,40,41,42,43,44]
116 E_AXESEL   = 45
117 E_AXESELX  = 46
118 E_AXESELY  = 47
119 E_AXESELZ  = 48
120
121
122 E_NOISEME  = 49
123 E_NOISEH   = 50
124 E_NOISELAC = 51
125 E_NOISEOCT = 52
126 E_NOISEOFF = 53
127 E_NOISEBAS = 54
128 E_NOISEVAL=[E_NOISEH,E_NOISELAC,E_NOISEOCT,E_NOISEOFF,E_NOISEBAS]
129 E_NOISEDIM = 55
130
131 E_GETCOLORS = 56
132 E_UVCOLORS =  57
133 E_SAVECOLORS = 58
134 B_SAVECOLORS = 0
135
136 E_RESTCOLORS = 60
137 V_RESTCOL=0
138 F_RESTCOL=0
139
140 BUF_COLORS=[]
141
142 RVBA_VALUE=61
143 RVBA_VERTICES=62
144 RVBA_FACES=63
145
146 ExitTIP="Exit from this script session "
147 CreateTIP="Create a new copy of the selected shape"
148 ActionTIP="Do the current selected actions"
149
150 UVCOLORSTIP="Get colrs from first available UV image "
151 GETCOLORSTIP="Get color from textures "
152 REPEATTIP="Replay the same action with new values ."
153
154 def copy_transform(ozero,Obis):
155          Obis.setSize(ozero.getSize());
156          Obis.setEuler(ozero.getEuler());
157          Obis.setLocation(ozero.getLocation())
158          return Obis
159
160 def traite_face(f):
161       global vindexm, ng, NOISE, NOISEDIM
162       global H,lacunarity,octaves,offset,basis
163
164       if ORIENTMenu.val==1:
165          for z in range(len(f.v)):
166             c=0.0
167             if vindex[f.v[z].index]!=0:
168                c=float(f.col[z].r+f.col[z].b+f.col[z].g)/maxcol*ng/vindex[f.v[z].index]
169             else:
170               c=0
171
172             f.v[z].co[0]=f.v[z].co[0]+f.v[z].no[0]*c
173             f.v[z].co[1]=f.v[z].co[1]+f.v[z].no[1]*c 
174             f.v[z].co[2]=f.v[z].co[2]+f.v[z].no[2]*c
175
176       elif ORIENTMenu.val==2:
177           for z in range(len(f.v)): 
178             c=0.0
179             if vindex[f.v[z].index]!=0:
180                c=float(f.col[z].r+f.col[z].b+f.col[z].g)/maxcol*ng/vindex[f.v[z].index]
181             else:
182               c=0
183             for t in range(3):
184                if TAXEList[1][t].val==1:
185                   f.v[z].co[t]=f.v[z].co[t]+c
186  
187       elif ORIENTMenu.val==3 and NOISE<9:
188          for z in range(len(f.v)):
189             c=0.0
190             if vindex[f.v[z].index]!=0:
191                nx=f.v[z].co[0]/NOISEDIM
192                ny=f.v[z].co[1]/NOISEDIM
193                nz=f.v[z].co[2]/NOISEDIM
194                nn = ng * noise((nx,ny,nz),NOISE)
195                c=float(f.col[z].r+f.col[z].b+f.col[z].g)/maxcol*nn/vindex[f.v[z].index]
196             else:
197               c=0
198             f.v[z].co[0]=f.v[z].co[0]+f.v[z].no[0]*c
199             f.v[z].co[1]=f.v[z].co[1]+f.v[z].no[1]*c
200             f.v[z].co[2]=f.v[z].co[2]+f.v[z].no[2]*c
201
202       elif ORIENTMenu.val==3 and NOISE==9:
203          for z in range(len(f.v)):
204             c=0.0
205             if vindex[f.v[z].index]!=0:
206                nx=f.v[z].co[0]/NOISEDIM
207                ny=f.v[z].co[1]/NOISEDIM
208                nz=f.v[z].co[2]/NOISEDIM
209                nn = ng * cellNoise((nx,ny,nz))
210                c=float(f.col[z].r+f.col[z].b+f.col[z].g)/maxcol*nn/vindex[f.v[z].index]
211             else:
212               c=0
213             f.v[z].co[0]=f.v[z].co[0]+f.v[z].no[0]*c
214             f.v[z].co[1]=f.v[z].co[1]+f.v[z].no[1]*c
215             f.v[z].co[2]=f.v[z].co[2]+f.v[z].no[2]*c
216
217       elif ORIENTMenu.val==3 and NOISE==10:
218          for z in range(len(f.v)):
219             c=0.0
220             if vindex[f.v[z].index]!=0:
221                nx=f.v[z].co[0]/NOISEDIM
222                ny=f.v[z].co[1]/NOISEDIM
223                nz=f.v[z].co[2]/NOISEDIM
224                nn = ng * heteroTerrain((nx,ny,nz),H,lacunarity,octaves,offset,basis)
225                c=float(f.col[z].r+f.col[z].b+f.col[z].g)/maxcol*nn/vindex[f.v[z].index]
226             else:
227               c=0
228             f.v[z].co[0]=f.v[z].co[0]+f.v[z].no[0]*c
229             f.v[z].co[1]=f.v[z].co[1]+f.v[z].no[1]*c
230             f.v[z].co[2]=f.v[z].co[2]+f.v[z].no[2]*c
231
232  
233 def paint():
234       global MODEMenu, vindex,ng, mat, ORIName, NEWName
235       global ERROR, TextERROR
236          
237       Me=Object.GetSelected()
238       if Me!=[]:
239          if Me[0].getType()=='Mesh':   
240                     
241                vindex=[]
242                ORIName=Me[0].getData().name
243                me=NMesh.GetRaw(Me[0].getData().name)
244                   
245                try:  
246                    for m in me.verts:
247                       vindex.append(0)
248                      
249                    for f in me.faces:
250                        for v in f.v:
251                                if MODEMenu.val!=2:
252                                   if MODEMenu.val==1:    
253                                      vindex[v.index]+=1
254                                   else:
255                                      if v.sel==1:
256                                          vindex[v.index]+=1                                       
257                                else:
258                                   #print mat 
259                                   if f.mat in mat:
260                                      vindex[v.index]+=1
261                    for f in me.faces:
262                      if MODEMenu.val==2: 
263                        if f.mat in mat:
264                           traite_face(f) 
265                      else:
266                           traite_face(f)
267                    #Me[0].link(me)
268                    me.update()
269                    Me[0].makeDisplayList()
270                except:
271                   ERROR=2
272                   TextERROR='No color on this Object.' 
273                   
274 def NEWMEcreation(obj):
275        
276       if obj.getType()=='Mesh':
277          nomdelobjet="";
278          objnumber=-1; namelist=[]
279          OBJ=Object.Get()
280
281          for ozero in OBJ:
282             if ozero.getType()=='Mesh': 
283                 namelist.append(ozero.getData().name)
284
285          ozero=obj
286          nomdelobjet=ozero.getName()
287          Mesh=Blender.NMesh.GetRawFromObject(nomdelobjet)
288          name=obj.getData().name
289          n=0; name2=name[:];ok=0  
290
291          while ok==0:
292              for n0 in namelist:
293                  if n0.find(name2)==0:
294                     ok=0;name2=name[0:name.find('.')+1]+'%s'%(n+1) 
295                  else: ok=1
296                  n+=1
297
298          Mesh.name=name2
299          Obis = Blender.NMesh.PutRaw(Mesh,name2)
300          copy_transform(ozero,Obis)
301          Obis.makeDisplayList()
302
303 def DOCMat_list(TMATList):
304     global mat    
305     Me=Object.GetSelected()
306     if Me!=[]:
307        if Me[0].getType()=='Mesh':
308             me=NMesh.GetRaw(Me[0].getData().name) 
309             if len(me.materials)!=0: 
310                 n=0 
311                 for mat in me.materials:
312                     TMATList[1][n][0]=mat.R
313                     TMATList[1][n][1]=mat.G
314                     TMATList[1][n][2]=mat.B
315                     n+=1
316                 TMATList[0]=n
317             else:
318               TMATList[0]=0
319             return TMATList
320  
321 MOname = "MODE MENU %t|Normal %x1|Material %x2|Selected %x3| Find color %x4"
322 MOname_doc=["",
323             "Displace all vertices",
324             "Displace vertices only on selected materials . ",
325             "Displace only selected vertices .",
326             "Try to find and set selected the vertices with this color."]
327
328 ORname = "ORIENT MENU %t|From Normal %x1|Local Axes %x2| Noise %x3"
329 ORname_doc=["",
330             "Use normal orientation to calculate displacement",
331             "Use selected axes value to calculate displacement",
332             "Blend the color value with Nosie values to calculate the displacement"]
333
334 NOname = "NOISE MENU %t|BLENDER %x1|STDPERLIN %x2|\
335 NEWPERLIN %x3|VORONOI_F1%x4|VORONOI_F2%x5|\
336 VORONOI_F3%x6|VORONOI_F4%x7|VORONOI_F2F1%x8|\
337 VORONOI_CRACKLE%x9|CELLNOISE%x10|HETEROTENOISE%x11"
338
339 MODEMenu = Create(1)
340 ORIENTMenu = Create(1)
341 NOISEMenu = Create(1)
342
343 NSIZE = Create(1.0)
344 TDOCMat = Create(0)
345 NRepeat = Create(1)
346
347 H=1.0
348 lacunarity=2.0
349 octaves=5.0
350 offset=1.0
351 basis=3
352
353 NOISEDIM=4
354 NOISEDIMbout=Create(NOISEDIM)
355 HBout=Create(H)
356 lacunarityBout=Create(lacunarity)
357 octavesBout=Create(octaves)
358 offsetBout=Create(offset)
359 basisBout=Create(basis)
360
361
362 noiseTYPE={0:'BLENDER',
363            1:'STDPERLIN',
364            2:'STDPERLIN',
365            3:'NEWPERLIN',
366            4:'VORONOI_F1',
367            5:'VORONOI_F2',
368            6:'VORONOI_F3',
369            7:'VORONOI_F2F1',
370            8:'VORONOI_CRACKLE',
371            9:'CELLNOISE'}        
372  
373 TMATList= [0,[],[]] 
374
375 for t in range(16):
376     TMATList[1].append([0.0,0.0,0.0])
377     TMATList[2].append(Create(0))
378
379 TAXEList=[['X','Y','Z'],[]]
380 for t in range(3):
381     TAXEList[1].append(Create(0))
382
383 glCr=glRasterPos2d
384 glCl3=glColor3f
385 glCl4=glColor4f
386 glRct=glRectf
387
388 def triangle(a,b,c):
389   glBegin(GL_TRIANGLES);
390   glColor3f(a[2],a[3],a[4])
391   glVertex2f(a[0],a[1]);
392   glVertex2f(b[0],b[1]);
393   glVertex2f(c[0],c[1]);
394   glEnd();
395
396 def triangleFcolor(a,b,c):
397   glBegin(GL_TRIANGLES);
398   glColor4f(a[2],a[3],a[4],a[5])
399   glVertex2f(a[0],a[1]);
400   glColor4f(b[2],b[3],b[4],a[5])
401   glVertex2f(b[0],b[1]);
402   glColor4f(c[2],c[3],c[4],a[5])
403   glVertex2f(c[0],c[1]);
404   glEnd();
405
406 def Ltriangle(a,b,c,LC=0.5):
407   TL=[a,b,c,a]  
408   for v in [0,1,2] :
409     glBegin(GL_LINES);
410     glColor3f(LC,LC,LC)
411     glVertex2f(TL[v][0],TL[v][1]);
412     glVertex2f(TL[v+1][0],TL[v+1][1]);
413     glEnd();
414
415
416 def carreFcolor(a,b,c,d):
417     triangleFcolor(a,b,c)
418     triangleFcolor(a,c,d)
419
420 RVBA=[Create(255),Create(255),Create(255),Create(255),Create(0)]
421
422 #         _*_ p1 
423 #       _/   \_
424 #     _/       \_
425 #    /           \_
426 # p0*_             /* p2
427 #   | \_         _/ |
428 #   |   \_     _/   |
429 #   |     \_ _/     |
430 #   |       * p3    |
431 #   |       |       |
432 #   *_      |      /* p4
433 # p6  \_    |    _/ 
434 #       \_  |  _/   
435 #         \_|_/     
436 #           * p5
437
438 def flatcolorcube(r,g,b,a,m,x,y):
439     h0=60
440     v0=40
441     A=[x,       y,              (r-m)/255.0,g/255.0,b/255.0,a/255.0]     #p0 
442     B=[x+h0,y-v0,       r/255.0,g/255.0,b/255.0,a/255.0]         #p3
443     c=[x+h0*2,y,        r/255.0, g/255.0,  (b-m)/255.0,a/255.0]  #p2
444     d=[x+h0,y+v0,       (r-m)/255.0,g/255.0,(b-m)/255.0,a/255.0] #p1
445     carreFcolor(A,B,c,d)
446
447
448     A=[x,y,(r-m)/255.0,g/255.0,b/255.0,a/255.0]                         #p0
449     B=[x+h0,y-v0,r/255.0,g/255.0,b/255.0,a/255.0]                               #p3     
450     c=[x+h0,y-v0*2.5,  r/255.0, (g-m)/255.0,  b/255.0,a/255.0]    #p5
451     d=[x,y-v0*1.5,(r-m)/255.0,(g-m)/255.0,b/255.0,a/255.0]      #p6
452     carreFcolor(A,B,c,d)    
453
454     d=[x+h0,y-v0,r/255.0,g/255.0,b/255.0,a/255.0]                        #p3
455     A=[x+h0*2,y,r/255.0,g/255.0,(b-m)/255.0,a/255.0]                     #p2
456     B=[x+h0*2,y-v0*1.5,  r/255.0, (g-m)/255.0,(b-m)/255.0,a/255.0] #p4
457     c=[x+h0,y-v0*2.5,r/255.0,(g-m)/255.0,b/255.0,a/255.0]        #p5
458     carreFcolor(A,B,c,d)    
459
460 def col_egal2col(col,RVBA):
461     eps=RVBA[4].val
462     if ( (RVBA[0].val-col[0]>=0 and RVBA[0].val-col[0]<=eps) and
463          (RVBA[1].val-col[1]>=0 and RVBA[1].val-col[1]<=eps) and
464          (RVBA[2].val-col[2]>=0 and RVBA[2].val-col[2]<=eps) and       
465                (RVBA[3].val-col[3]>=0 and RVBA[3].val-col[3]<=eps) ) :
466        #print 'ok',col, [RVBA[n].val-col[n] for n in 0,1,2,3]
467        return 1
468     else:
469        #print 'not',col, [RVBA[n].val-col[n] for n in 0,1,2,3]
470        return 0
471
472 def select_bycolors(TYPE,RVBA):
473   global RVBA_VERTICES, RVBA_FACES
474   SEL = Blender.NMesh.FaceFlags['SELECT']
475   try: 
476     ME=Blender.Scene.getCurrent().getActiveObject().getData()
477     VC={}
478     for f in ME.faces:
479         for v in f.v:
480              try:
481                      VC[v].append(f)
482              except:
483                  VC[v]=[f]
484              #print '.', 
485     for C in VC.iteritems():
486         color=[0,0,0]
487         for f in C[1]:
488             col=f.col[f.v.index(C[0])]
489             col=[col.r,col.g,col.b,col.a]
490             if col_egal2col(col,RVBA):
491                if TYPE== RVBA_VERTICES: 
492                   C[0].sel=1
493                else:
494                   f.sel=1
495                   f.flag |= SEL
496         #VC[C[0]].append(color[:])
497     ME.update()         
498   except:
499           pass 
500         
501 def draw():
502     global MODEMenu, NSIZE, TDOCMat,TMATList, TAXEList
503     global mat, ORIName, NEWName, ORIENTMenu 
504     global NRepeat, ERROR, TextERROR , NOISE, NOISEMenu
505     global NOISEDIMbout,NOISEDIM, RVBA,RVB_VALUE, RVBA_VERTICES 
506     global HBout,lacunarityBout,octavesBout,offsetBout,basisBout
507     global noiseTYPE, ExitTIP, CreateTIP, ActionTIP, E_GETCOLORS
508     global E_UVCOLORS, UVCOLORSTIP, GETCOLORSTIP, REPEATTIP,RVBA_FACES
509     global E_SAVECOLORS, B_SAVECOLORS, E_RESTCOLORS, MOname_doc, ORname_doc
510
511     size=Buffer(GL_FLOAT, 4)
512     glGetFloatv(GL_SCISSOR_BOX, size)
513     size= size.list
514
515     for s in [0,1,2,3]: size[s]=int(size[s])
516            
517     glClearColor(0.72,0.72,0.72,1.0)
518     glClear(GL_COLOR_BUFFER_BIT)
519
520     glColor3f(0.66,0.66,0.66)
521     glRectf(4,size[3]-4,404,size[3]-32 )
522
523     glColor3f(0.76,0.76,0.76)
524     glRectf(4,size[3]-32,404,size[3]-294 )
525
526     triangle([4+9,size[3],0.72,0.72,0.72],
527              [4,size[3],],
528              [4,size[3]-9])
529
530     triangle([404-9,size[3],0.72,0.72,0.72],
531              [404,size[3],],
532              [404,size[3]-9])
533
534     triangle([404,size[3]-294,.72,0.72,0.72],
535              [404,size[3]-294+9,],
536              [404-9,size[3]-294])
537
538     triangle([4,size[3]-294,.72,0.72,0.72],
539              [4,size[3]-294+9,],
540              [4+9,size[3]-294])
541
542     glColor3f(1.0,1.0,1.0)
543     glRasterPos2f(20, size[3]-15)
544     Text("Script Python de displacement painting")
545
546     glRasterPos2f(20, size[3]-28)
547     Text("Jean-michel Soler, Aout 2005")
548
549    
550     n0=70
551     n1=55
552     if MODEMenu.val<4 : 
553        Button("Create"                ,E_CREATE  ,5  ,size[3]-n0+11  ,60 ,20,CreateTIP)
554        Button("Action"                ,E_ACTION  ,5  ,size[3]-n0-11  ,60 ,20,ActionTIP)
555        NRepeat=Number("repeat"        ,E_REPEAT   ,5  ,size[3]-n0-56     ,75 ,20, NRepeat.val,1,10,REPEATTIP)    
556
557     Button("Exit"                  ,E_EXIT    ,5  ,size[3]-n0-32  ,60 ,20,ExitTIP)   
558     Button("Tex colors"            ,E_GETCOLORS   ,5  ,size[3]-n0-80  ,75 ,20,GETCOLORSTIP)
559     Button("UV colors"             ,E_UVCOLORS    ,5  ,size[3]-n0-102  ,75 ,20,UVCOLORSTIP)
560     if B_SAVECOLORS :
561          Button("Rest colors"             ,E_RESTCOLORS    ,5  ,size[3]-n0-146  ,75 ,20,UVCOLORSTIP)
562     else:
563          Button("Save colors"           ,E_SAVECOLORS   ,5  ,size[3]-n0-124  ,75 ,20,GETCOLORSTIP)
564
565
566     
567     glColor3f(0.0,0.0,0.0)
568     glRasterPos2f(80  ,size[3]-n0+24)
569     Text("MODE")
570
571     MODEMenu= Menu(MOname,          E_MODE  ,80  ,size[3]-n0 ,100,20, MODEMenu.val, MOname_doc[MODEMenu.val])
572
573     if MODEMenu.val==2:
574        TDOCMat=Toggle("Doc Mat"     ,E_DOCMAT  ,180  ,size[3]-n0 ,60 ,20,TDOCMat.val)    
575        if TDOCMat.val==1:
576              #print TMATList 
577              for t in range(TMATList[0]):
578                  glCl3(TMATList[1][t][0],
579                        TMATList[1][t][1],
580                        TMATList[1][t][2]) 
581                  
582                  if t<=7:
583                     glRct(80+t*40,
584                     size[3]-n0-60,
585                     80+t*40+40,
586                     size[3]-n0-60+40)
587                     TMATList[2][t]=Toggle("%s"%(t+1) , 32+t ,80+t*40+5  ,size[3]-n0-50  ,30 , 20,TMATList[2][t].val)
588                  else: 
589                     glRct(80+(t-8)*40,
590                     size[3]-n0-50-50,
591                     80+(t-8)*40+40,
592                     size[3]-n0-60)
593                     TMATList[2][t]=Toggle("%s"%(t+1) , 32+t ,80+(t-8)*40+5  ,size[3]-n0-45*2  ,30 , 20,TMATList[2][t].val)
594                  
595     glColor3f(1.0,0.3,0.0)
596     glRasterPos2f(80+40+5  ,size[3]-n0-110)
597     if ERROR>1:
598          Text('Last error : '+TextERROR)
599     else:
600          Text('Last error :                      ')
601
602     glColor3f(0.0,0.0,0.0)
603     glRasterPos2f(240  ,size[3]-n0+24)
604
605     if MODEMenu.val<4:
606             Text("ORIENTATION")
607             ORIENTMenu= Menu(ORname,        E_ORIENT    ,240  ,size[3]-n0 ,100,20, ORIENTMenu.val, ORname_doc[ORIENTMenu.val])
608             if ORIENTMenu.val==2 :
609                for t in [0,1]:
610                   TAXEList[1][t]=Toggle("%s"%TAXEList[0][t],
611                                  E_AXESEL+t, 
612                                  240+100+t*30+2 , size[3]-n0+10  ,28 , 18,
613                                  TAXEList[1][t].val)
614                   TAXEList[1][2]=Toggle("%s"%TAXEList[0][2],
615                                  E_AXESEL+2, 
616                                  int(240+100+.5*30+2) , size[3]-n0-10  ,28 , 18,
617                                  TAXEList[1][2].val)
618             if ORIENTMenu.val==3 :
619                glRasterPos2f(240  ,size[3]-n0-120-4)
620                Text("NOISE")
621                NOISEMenu= Menu(NOname,         E_NOISEME    , 240  ,size[3]-n0-148 ,110,20, NOISEMenu.val, "NOISE menu.")
622                NOISEDIMbout=Number(" Dim: "     ,E_NOISEDIM   , 240  ,size[3]-n0-172 ,110,20, NOISEDIMbout.val, 1,100)
623                if NOISEMenu.val==11:
624                   basisBout=Slider(noiseTYPE[basisBout.val],   
625                                                       E_NOISEBAS  ,40  ,size[3]-n0-178 ,175,20, basisBout.val, 0,9,)
626                   HBout= Slider("H",                  E_NOISEH    ,40  ,size[3]-n0-198 ,175,20, HBout.val, -2.0,+2.0,0,)
627                   lacunarityBout=Slider("lacunarity", E_NOISELAC  ,40  ,size[3]-n0-218 ,175,20, lacunarityBout.val, -4.0,+4.0,0,)
628                   octavesBout=Slider("octave",        E_NOISEOCT  ,219  ,size[3]-n0-198 ,175,20, octavesBout.val, -10.0,+10.0,0,)
629                   offsetBout=Slider("offset",         E_NOISEOFF  ,219 ,size[3]-n0-218 ,175,20, offsetBout.val, -5.0,+5.0,0,)
630             NSIZE= Slider("Disp Size",      E_NSIZE  ,80  ,size[3]-n0-20 ,260,20, NSIZE.val, -4.0,+4.0,0,"SIZE.")
631
632
633     else:
634         # degrades de couleurs
635         glShadeModel(GL_SMOOTH)
636         #transparence  
637         glEnable(GL_BLEND)
638         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
639
640         RVBA[0]=Slider("Red  :",      RVBA_VALUE , 105  ,size[3]-n0-25 ,280,20, RVBA[0].val, 0,255,0,"")
641         RVBA[1]=Slider("Green  :",    RVBA_VALUE , 105  ,size[3]-n0-47 ,280,20, RVBA[1].val, 0,255,0,"")
642         RVBA[2]=Slider("Blue  :",     RVBA_VALUE , 105  ,size[3]-n0-69 ,280,20, RVBA[2].val, 0,255,0,"")
643         RVBA[3]=Slider("Alpha  :",    RVBA_VALUE , 105  ,size[3]-n0-91 ,150,20, RVBA[3].val, 0,255,0,"")
644         RVBA[4]=Slider("margin  :",   RVBA_VALUE , 105  ,size[3]-n0-113 ,150,20, RVBA[4].val, 0,255,0,"")
645         flatcolorcube(RVBA[0].val,
646                       RVBA[1].val,
647                       RVBA[2].val,
648                       RVBA[3].val,
649                       RVBA[4].val,
650                       270,size[3]-n0-120)
651         
652         Button("Vertex"                ,RVBA_VERTICES  ,5  ,size[3]-n0-148  ,75 ,20,CreateTIP)
653         Button("Faces"                 ,RVBA_FACES  ,5  ,size[3]-n0-169  ,75 ,20,ActionTIP)
654
655         
656 def on_MESH():
657     Me=Object.GetSelected()
658     if Me!=[] and Me[0].getType()=='Mesh':                 
659        editmode = Window.EditMode()   
660        if editmode: Window.EditMode(0)
661        return 1,Me[0].getData()
662     else: 
663            return 0, None
664
665 def event(evt, val):    
666     if (evt== QKEY and not val): Exit()
667
668 def bevent(evt):
669     global MODEMenu, NSIZE, ng, TMATList
670     global mat, ORIENTMenu, NRepeat, TAXEList 
671     global ERROR,TextERROR, NOISE, NOISEMenu, NOISEDIMbout,NOISEDIM
672     global HBout,lacunarityBout,octavesBout,offsetBout,basisBout
673     global H,lacunarity,octaves,offset,basis, E_RESTCOLORS, RVBA_VERTICES
674     global E_GETCOLORS, E_UVCOLORS, E_SAVECOLORS, B_SAVECOLORS
675     global V_RESTCOLORS, F_RESTCOLORS, BUF_COLORS, RVBA, RVBA_FACES
676
677     if   (evt== E_EXIT):
678         Exit()
679     elif   (evt== E_ACTION):
680        for n in range(NRepeat.val):
681           paint()
682     elif   (evt== E_NSIZE):
683        ng=NSIZE.val
684     elif   (evt== E_DOCMAT) or (evt in E_MATVAL):
685       Me=Object.GetSelected()
686
687       if Me!=[]:
688          if Me[0].getType()=='Mesh':   
689             TMATList=DOCMat_list(TMATList)
690             mat=[]
691             for TMat in TMATList[2]:
692                if TMat.val==1.0:
693                    mat.append(TMATList[2].index(TMat))  
694             ERROR=0
695          else:
696             ERROR=1
697             TextERROR='Selected Object is not a mesh.'    
698       else:
699           ERROR=1
700           TextERROR='No Selected Object.'  
701     elif   (evt== E_CREATE):
702            NEWMEcreation(Blender.Object.GetSelected()[0])
703            Blender.Draw.Redraw()
704            ERROR=1
705            TextERROR='No Selected Object.'
706     elif   (evt== E_NOISEME):
707        NOISE=NOISEMenu.val-1
708     elif   (evt in E_NOISEVAL):
709        H=HBout.val
710        lacunarity=lacunarityBout.val
711        octaves=octavesBout.val
712        offset=offsetBout.val
713        basis=basisBout.val
714     elif (evt== E_NOISEDIM):
715            NOISEDIM=NOISEDIMbout.val
716     elif (evt == E_GETCOLORS):
717             OK,MESH=on_MESH()
718             if OK: MESH.update(1,0,1)
719     elif (evt == E_UVCOLORS):
720        OK,MESH=on_MESH()
721        if OK and MESH.hasFaceUV():
722           for f in MESH.faces:
723               if f.image:
724                  im=Blender.Image.Get(f.image.name)
725                  break
726           imX,imY = im.getMaxXY()
727           for f in MESH.faces:  
728               for uv in  f.uv:
729                  color=[int(c*255.0) for c in im.getPixelF(abs(uv[0]*imX%imX), abs(uv[1]*imY%imY))]
730                  f.col[f.uv.index(uv)].r=color[0]
731                  f.col[f.uv.index(uv)].g=color[1]
732                  f.col[f.uv.index(uv)].b=color[2]
733                  f.col[f.uv.index(uv)].a=color[3]
734           MESH.update()
735     elif (evt == E_SAVECOLORS):
736           OK,MESH=on_MESH()
737           print OK, MESH
738           if OK and (MESH.hasFaceUV() or MESH.hasVertexColours()):
739              F_RESTCOLORS=1
740              for f in MESH.faces:
741                b=[MESH.faces.index(f)]  
742                for c in  f.col:
743                    b.append([c.r,c.g,c.b,c.a])
744                BUF_COLORS.append(b) 
745              B_SAVECOLORS  =  1
746           else: 
747              B_SAVECOLORS  =  0
748     elif (evt == E_RESTCOLORS):
749           OK,MESH=on_MESH()
750           print  F_RESTCOLORS, len(BUF_COLORS),len(MESH.faces)
751           if  OK and F_RESTCOLORS==1 and len(BUF_COLORS)==len(MESH.faces):
752              for b in  BUF_COLORS:
753                 ncol=0
754                 for c in  MESH.faces[b[0]].col :
755                     print b[ncol+1]
756                     c.r,c.g,c.b,c.a= b[ncol+1]
757                     ncol+=1
758              F_RESTCOLORS=0
759              B_SAVECOLORS = 0
760              BUF_COLORS=[]
761              MESH.update()
762     elif (evt == RVBA_VERTICES or evt == RVBA_FACES):
763         select_bycolors(evt,RVBA)
764     Blender.Draw.Redraw()
765 Register(draw, event, bevent)