use f.area where possible over python function and use len(mface) over len(mface.v)
[blender.git] / release / scripts / uvpaint.py
1 #!BPY
2
3 """ Registration info for Blender menus: <- these words are ignored
4 Name: 'UVpainter'
5 Blender: 232
6 Group: 'UV'
7 Tip: 'Use vertex paint color value to fill uvmapping'
8 """
9
10 __author__ = "Jean-Michel Soler (jms)"
11 __url__ = ("blender", "elysiun",
12 "Script's homepage, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_uvpainting.htm",
13 "Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender")
14 __version__ = "0.8 08/2005"
15
16 __bpydoc__ = """\
17 This script "paints" uv-mappings with the model's vertex colors.
18
19 Usage:
20
21 With this script you can export uv-maps filled with vertex colors to TARGA
22 (.tga) images.  To use it the mesh must have proper uv coordinates assigned
23 in UV Face Select Mode.  And to fill the projected faces with color, the mesh
24 can also have material(s) and vertex colors painted on it.
25
26 The script has a GUI with a preview of the results and options like drawing
27 lines or not, defining size, etc.  You can paint vertex colors in the mesh and
28 see the uv-map updated in the script's window.
29
30 Notes:<br>
31     Material's rgb color is also used to fill the uv-map;<br>
32     If there are no vertex colors or texture faces in the mesh and you press
33 the "Make" VColors button in the edit mesh buttons win, the current light setup
34 is saved as vertex colors for the model;<br>
35     Check the script's homepage for example images.
36
37 Short keys  Documentation
38
39 KEYS 
40 M : dipslay GUI Menu
41 D : Set/Unset Documentation
42 S : Save current window content
43        in a tga file
44 Q or ESC : Exit
45 T : Set/Unset Transparency
46 L : Set/Unset lines
47 E : Set/Unset outline
48 B : Set lines color to Black 
49 W : Set lines color to white
50 ARROW   : displace model on 
51          UP/DOWN/LEFT/RIGHT side
52 PADPLUS : increase ZOOM 
53 PADMINUS   : decrease  ZOOM     
54 HOME    : cancel display modifs
55
56 Mouse button
57 RIGHTMOUSE : same as  arrows
58         
59 """
60
61 # $Id$
62 #
63 #----------------------------------------------
64 # uvpainter script (c) 04/2004  jean-michel soler
65 # http://jmsoler.free.fr/util/blenderfile/py/UVpaint05.zip
66 # this script is released under GPL licence
67 # for the Blender 2.33 scripts distribution
68 #----------------------------------------------
69 # Official page :
70 # http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_uvpainting.htm
71 # Communicate problems and errors on:
72 # http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender 
73 #----------------------------------------------
74 # Page officielle :
75 #   http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_uvpainting.htm
76 # Communiquer les problemes et erreurs sur:
77 #   http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
78 #--------------------------------------------- 
79 # ce script est proposé sous licence GPL pour etre associe
80 # a la distribution de Blender 2.33 et suivant
81 # --------------------------------------------------------------------------
82 # this script is released under GPL licence
83 # for the Blender 2.33 scripts package
84 # --------------------------------------------------------------------------
85 # ***** BEGIN GPL LICENSE BLOCK *****
86 #
87 # Script copyright (C) 2003, 2004: Jean-Michel Soler 
88 #
89 # This program is free software; you can redistribute it and/or
90 # modify it under the terms of the GNU General Public License
91 # as published by the Free Software Foundation; either version 2
92 # of the License, or (at your option) any later version.
93 #
94 # This program is distributed in the hope that it will be useful,
95 # but WITHOUT ANY WARRANTY; without even the implied warranty of
96 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
97 # GNU General Public License for more details.
98 #
99 # You should have received a copy of the GNU General Public License
100 # along with this program; if not, write to the Free Software Foundation,
101 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
102 #
103 # ***** END GPL LICENCE BLOCK *****
104 # --------------------------------------------------------------------------
105
106 import Blender
107 from Blender.Draw import *
108 from Blender.BGL import *
109 from Blender.NMesh import *
110
111 try:
112   import nt
113   os=nt
114 except:
115    import posix
116    os=posix
117
118 def exist(path):
119        try:
120         pth=os.stat(Blender.sys.dirname(path))  
121        except:
122         return 0
123        return 1 
124
125 loc0= Blender.Get ("filename").replace('\\','/')
126 loc0=loc0[:loc0.rfind('/')]
127         
128 loc2=loc0+'/'+'test00.tga' 
129
130
131 mouse_x,mouse_y=0,0
132 mouse_xr=1
133 mouse_yr=1
134 POS=[0,0]
135 ANC=[0,0]
136 XY=[0,0]
137 size=[]
138 sel=0
139 X,Y=0,0
140 TRANSP,EMPTY,DOCU=0,0,0
141 MENU, SAVE =1,0
142
143 glCr=glRasterPos2d
144 glCl3=glColor3f
145 glCl4=glColor4f
146 glRct=glRectf
147
148 LC=1.0
149
150 xlimit=0
151 selmatlist=[]
152 LIM=[0.0,0.0,0.0,0.0]
153 NOLIM=1
154 if not NOLIM : LIM=[-1.0,1.0,-1.0,1.0]
155
156 TR=0.8
157
158 def Doc(size):
159     S0,S1=40,50
160         
161     a=[S0,size[3]-S1, .8,.8,.8]
162     b=[S0*7,size[3]-S1, .8,0.8,0.8]
163     c=[S0*7,size[3]-S1*7, 0.8,0.8,0.8]
164     d=[S0,size[3]-S1*7, 0.8,0.8,0.8]
165     Tcarre(a,b,c,d,0.8)
166     Lcarre(a,b,c,d,0.0)
167     DOC=[' ',
168 'Documentation',
169 ' ',
170 'KEYS ',
171 'M : dipslay GUI Menu',
172 'D : Set/Unset Documentation',
173 'S : Save current window content',
174 '       in a tga file', 
175 'Q or ESC : Exit',
176 'T : Set/Unset Transparency',
177 'L : Set/Unset lines',  
178 'E : Set/Unset outline',
179 'B : Set lines color to Black ',
180 'W : Set lines color to white',
181 'ARROW   : displace model on ',
182 '         UP/DOWN/LEFT/RIGHT side'      ,
183 'PADPLUS : increase ZOOM ',
184 'PADMINUS   : decrease  ZOOM ', 
185 'HOME    : cancel display modifs',
186 ' ',
187 'Mouse button', 
188 'RIGHTMOUSE : same as  arrows',
189 ]
190     glColor3f(0.0,0.0,0.0)
191     for D in DOC :
192       glRasterPos2f(S0+8, size[3]-S1-13*DOC.index(D))
193       Text(D)
194
195 def Ttriangle(a,b,c):
196   glBegin(GL_TRIANGLES);
197   glColor4f(a[2],a[3],a[4],TR)
198   glVertex2f(a[0],a[1]);
199   glColor4f(b[2],b[3],b[4],TR)
200   glVertex2f(b[0],b[1]);
201   glColor4f(c[2],c[3],c[4],TR)
202   glVertex2f(c[0],c[1]);
203   glEnd();
204
205 def Ftriangle(a,b,c):
206   glBegin(GL_TRIANGLES);
207   glColor3f(a[2],a[3],a[4])
208   glVertex2f(a[0],a[1]);
209   glColor3f(b[2],b[3],b[4])
210   glVertex2f(b[0],b[1]);
211   glColor3f(c[2],c[3],c[4])
212   glVertex2f(c[0],c[1]);
213   glEnd();
214
215 def Ltriangle(a,b,c,LC=0.5):
216   TL=[a,b,c,a]  
217   for v in [0,1,2] :
218     glBegin(GL_LINES);
219     glColor4f(LC,LC,LC,TR+0.2)
220     glVertex2f(TL[v][0],TL[v][1]);
221     glVertex2f(TL[v+1][0],TL[v+1][1]);
222     glEnd();
223
224
225 def Tcarre(a,b,c,d,LC=1.0):
226     Ttriangle(a,b,c)
227     Ttriangle(a,c,d)
228
229 def Fcarre(a,b,c,d,LC=1.0):
230     Ftriangle(a,b,c)
231     Ftriangle(a,c,d)
232
233 def Lcarre(a,b,c,d,LC=0.5):
234   TL=[a,b,c,d,a]        
235   for v in [0,1,2,3] :
236     glBegin(GL_LINES);
237     glColor4f(LC,LC,LC,TR+0.2)
238     glVertex2f(TL[v][0],TL[v][1]);
239     glVertex2f(TL[v+1][0],TL[v+1][1]);
240     glEnd();
241
242    
243 def transface(f,x,y,u=0.0, v=0.0):
244     global xlimit, LIM  
245     global mouse_xr,sel, ANC, X,Y
246     global mouse_yr, POS, XY,size
247     global mouse_x,  mouse_y
248
249     mouse_x=mouse_xr-size[0]
250     mouse_y=mouse_yr-size[1]
251
252     if sel==1:
253       POS=[mouse_x-ANC[0],mouse_y-ANC[1]]
254     u,v=POS
255
256     a=[0,0,0.0, 0.0,0.0,0.0]
257     b=[0,0,0.0, 0.0,0.0,0.0]
258     c=[0,0,0.0, 0.0,0.0,0.0]
259     d=[0,0,0.0, 0.0,0.0,0.0]
260
261     if len(f.v)>=3:
262         a[0]=int((f.uv[0][0]-LIM[1])*x+u)
263         a[1]=int((f.uv[0][1]-LIM[3])*y+v)
264
265         if a[0]>xlimit:
266                xlimit=a[0]
267
268         a[2]=f.col[0].r/255.0
269         a[3]=f.col[0].g/255.0
270         a[4]=f.col[0].b/255.0
271
272         c[0]=int((f.uv[2][0]-LIM[1])*x+u)
273         c[1]=int((f.uv[2][1]-LIM[3])*y+v)
274
275         if c[0]>xlimit:
276                xlimit=c[0]
277
278         c[2]=f.col[2].r/255.0
279         c[3]=f.col[2].g/255.0
280         c[4]=f.col[2].b/255.0
281
282      
283         b[0]=int((f.uv[1][0]-LIM[1])*x+u)
284         b[1]=int((f.uv[1][1]-LIM[3])*y+v)
285
286         if b[0]>xlimit:
287                xlimit=b[0]
288
289         b[2]=f.col[1].r/255.0
290         b[3]=f.col[1].g/255.0
291         b[4]=f.col[1].b/255.0
292
293
294     if  len(f.v)==4:     
295         d[0]=int((f.uv[3][0]-LIM[1])*x+u)
296         d[1]=int((f.uv[3][1]-LIM[3])*y+v)
297
298         if d[0]>xlimit:
299                xlimit=d[0]
300
301         d[2]=f.col[3].r/255.0
302         d[3]=f.col[3].g/255.0
303         d[4]=f.col[3].b/255.0
304     else:
305         d=0
306
307
308     #print a,b,c
309     return a,b,c,d
310
311
312 def extract_faces(me,MENU):
313     global  TMATList, selmatlist 
314     if MENU==2:
315        listf=[]
316        for f in me.faces:
317           if f.mat in selmatlist:
318               listf.append(f)
319        return listf
320
321 def affiche_mesh(ME,x,y):
322     global LINE,xlimit,MMENU,XLIMIT,xwin,xlimit,LC
323     global LIM, EMPTY,TRANSP
324     if not NOLIM : LIM=[-1.0,1.0,-1.0,1.0]
325         
326     if ME.getType()=='Mesh':
327        me=ME.getData()
328        if MMENU.val==1:
329           se=me.faces
330        elif MMENU.val==3:
331           se=[s for s in me.faces if s in me.getSelectedFaces() or s.sel]
332        elif MMENU.val==2:
333            se=extract_faces(me,2) 
334        if not NOLIM : 
335          for s in se:
336            for u in s.uv:
337                     if u[0] >LIM[0] : LIM[0]=u[0]
338                     if u[0] <LIM[1] : LIM[1]=u[0]
339                     if u[1] >LIM[2] : LIM[2]=u[1]
340                     if u[1] <LIM[3] : LIM[3]=u[1]                                       
341        xlimit=0
342        for f in se:
343          a,b,c,d=transface(f,x,y)
344          if not EMPTY and not TRANSP: 
345            if len(f.v)==4:
346                Ftriangle(a,b,c)
347                Ftriangle(a,c,d)
348            elif len(f.v)==3:
349                Ftriangle(a,b,c)
350          elif not EMPTY : 
351            if len(f.v)==4:
352                Ttriangle(a,b,c)
353                Ttriangle(a,c,d)
354            elif len(f.v)==3:
355                Ttriangle(a,b,c)
356
357        if LINE.val==1 or EMPTY:
358          for f in se:
359            a,b,c,d=transface(f,x,y)
360            if len(f.v)==4:
361               Lcarre(a,b,c,d,LC)
362            elif len(f.v)==3:
363               Ltriangle(a,b,c,LC)
364          if XLIMIT.val==0:
365             Lcarre([1,1],[1,y-2],[xlimit+2,y-2],[xlimit+2,1]) 
366          else:
367             Lcarre([1,1],[1,y-2],[xwin-2,y-2],[xwin-2,1]) 
368         
369 def write_tgafile(loc2,bitmap,width,height,profondeur): 
370
371                   f=open(loc2,'wb') 
372                   Origine_en_haut_a_gauche=32 
373                   Origine_en_bas_a_gauche=0 
374                   Data_Type_2=2 
375                   RVB=profondeur*8 
376                   RVBA=32 
377                   entete0=[] 
378                   for t in range(18): 
379                     entete0.append(chr(0)) 
380
381                   entete0[2]=chr(Data_Type_2) 
382                   entete0[13]=chr(width/256) 
383                   entete0[12]=chr(width % 256) 
384                   entete0[15]=chr(height/256) 
385                   entete0[14]=chr(height % 256) 
386                   entete0[16]=chr(RVB) 
387                   entete0[17]=chr(Origine_en_bas_a_gauche) 
388
389                   #Origine_en_haut_a_gauche 
390
391                   for t in entete0: 
392                     f.write(t) 
393
394                   for t in bitmap:
395
396                     for c in [2,1,0,3]:
397                         #print t[c]%256      
398                         f.write(chr(t[c]*2)) 
399                   f.close() 
400
401
402 def save(x0,y0,dx,dy):
403     global SAVE
404     im = Buffer(GL_BYTE,[dx*(dy+1),4])
405     glReadPixels(x0,y0,dx,dy,GL_RGBA, GL_BYTE,im); 
406     print len(im), dx*dy, dx, dy, len(im)/dy    
407     write_tgafile(loc2,im,dx,dy+1,4)
408     SAVE=0
409     Blender.Redraw()
410
411 def DOCMat_list(TMATList,ME):
412     me=Blender.NMesh.GetRaw(ME.getData().name) 
413     if len(me.materials)!=0: 
414                 n=0 
415                 for mat in me.materials:
416                     TMATList[1][n][0]=mat.R
417                     TMATList[1][n][1]=mat.G
418                     TMATList[1][n][2]=mat.B
419                     n+=1
420                 TMATList[0]=n
421     else:
422               TMATList[0]=0
423     return TMATList
424
425 def SELMat_list():
426       global TMATList,selmatlist
427       Me=Blender.Object.GetSelected()
428       if Me!=[]:
429          if Me[0].getType()=='Mesh':   
430             TMATList=DOCMat_list(TMATList,Me[0])
431             selmatlist=[]
432             for TMat in TMATList[2]:
433                if TMat.val==1.0:
434                   selmatlist.append(TMATList[2].index(TMat))  
435             ERROR=0
436          else:
437             ERROR=1
438             TextERROR='Selected Object is not a mesh.'  
439       else:
440           ERROR=1
441           TextERROR='No Selected Object.'  
442       
443 def DOCBONEMENU(TBONEMENU):
444     pass
445
446 # ----------
447 # uvpaint1
448 # ----------
449 NSIZE=Create(1.0)
450 # ----------
451 # uvpaint2
452 # ----------
453 LINE=Create(0)
454 # ----------
455 # uvpaint3
456 # ----------
457 TEXT=Create(loc2)
458 # ----------
459 # uvpaint4
460 # ----------
461 TMENU="MODE MENU %t|All %x1|Material %x2|Selected %x3"
462 # ----------
463 # uvpaint4
464 # ----------
465 # coming soon : "|vertex group %x4", perhaps in uvpainter v0.5
466 LCOLOR= Create(64)
467 SAVE=0
468
469 MMENU=Create(3)
470 TDOCMat = Create(0)
471 # ----------
472 TMATList= [0,[],[]] 
473 for t in range(16):
474     TMATList[1].append([0.0,0.0,0.0])
475     TMATList[2].append(Create(0))
476 # ----------
477 TDOCMat = Create(1)
478 # ----------
479 TBONEMENU= Create(1) 
480 # ----------
481
482 XLIMIT=Create(0)
483
484 y=0
485 x=0
486 x0=0
487 y0=0
488 xwin=0
489
490 n0=32
491
492 def draw():
493     global NSIZE,LINE,x0,y0,y,x,TEXT,MMENU,TDOCMat
494     global XLIMIT,selmatlist,xwin, LCOLOR, SAVE
495     global mouse_xr,sel, ANC, X,Y, TRANSP, DOCU
496     global mouse_yr, POS, XY,size, TRANSP,EMPTY
497     global MENU, SAVE
498
499     size=Buffer(GL_FLOAT, 4)
500     glGetFloatv(GL_SCISSOR_BOX, size)
501     size=[int(s) for s in size ]
502     
503     n0=32
504     x0=size[0]
505     y0=size[1]
506     
507     x=size[2]
508     y=size[3]
509    
510     xwin=x
511     ywin=y
512    
513
514     glClear(GL_COLOR_BUFFER_BIT)
515     glShadeModel(GL_SMOOTH)
516     #transparence  
517     if TRANSP : 
518        glEnable(GL_BLEND)
519        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
520
521     SelecMESH=Blender.Object.GetSelected()
522     if SelecMESH!=[] and SelecMESH[0].getType()=='Mesh':
523        affiche_mesh(SelecMESH[0],int(y*NSIZE.val),int(y*NSIZE.val-2))
524
525     if MENU:
526         glColor3f(0.0,0.0,0.0)
527         glRectf(4,size[3],555,size[3]-32 )
528         glColor3f(1.0,1.0,1.0)
529        
530         glRasterPos2f(8, size[3]-13)
531         Text("uvpainter v0.8")
532          
533         glRasterPos2f(8, size[3]-28)
534         Text("Jm Soler, 08/2005")
535
536         Button("ReDraw"      ,16 ,290-118+61 ,size[3]-30  ,60 ,13)
537         Button("Exit"        ,1  ,250-122+63 ,size[3]-30  ,38 ,13)
538         Button("Save"        ,6  ,250-16+61  ,size[3]-30  ,40 ,13)
539
540         NSIZE= Slider("Sc:",4   ,290-118+61  ,size[3]-15 , 102, 13, NSIZE.val, 0.1,5.0,0,"SIZE.")
541         LINE=Toggle("line",   5   ,250-122+63   ,size[3]-15 , 38, 13, LINE.val, "Draw lines")
542
543         glRasterPos2f(250-130  ,size[3]-13,)
544         Text("Mode")
545
546         LCOLOR=Number("", 50, 250-77,size[3]-15,18,13,LCOLOR.val,1,64,'Line color, 64-lighter, 1-darker.')
547
548         MMENU= Menu(TMENU    ,2  ,250-130, size[3]-30, 63, 13, MMENU.val, "MODE menu.")
549
550         if MMENU.val==1 or MMENU.val==3:
551            glRasterPos2f( 250-16+61+42+80,size[3]-13)
552            if XLIMIT.val:
553                   xl=xwin
554            else:
555                   xl=xlimit
556
557            Text("x :"+"%d"%(xl+2))  
558
559            glRasterPos2f(250-16+61+42+65*2,size[3]-13)
560            Text("y :"+"%d"%(y-n0+1))  
561
562            TEXT=String("to:",   7   , 278+61  ,size[3]-28 , 213, 13, TEXT.val, 256, "Draw lines")
563            if XLIMIT.val==1:
564               limit='winlimit'
565            else:
566               limit='maxXlimit'
567            XLIMIT=Toggle(limit, 9   , 250-16+61+42   ,size[3]-15 , 60, 13, XLIMIT.val, "to save picture from x max uv limit, or x window max limit")
568
569         if MMENU.val==2:
570            TDOCMat=Toggle("doc"     ,24,250-130+35  ,size[3]-13 , 28, 13, TDOCMat.val)   
571            if TDOCMat.val==1:
572                  SELMat_list()  
573                  for t in range(TMATList[0]):
574                      glCl3(TMATList[1][t][0],
575                            TMATList[1][t][1],
576                            TMATList[1][t][2]) 
577                      glRct((293-16+61)+t*20,
578                            size[3]-13,
579                            (293-16+61)+t*20+20,
580                            size[3]-30,)
581                      TMATList[2][t]=Toggle("%s"%t , 32+t ,(293-16+61)+t*20  ,size[3]-13  ,20 , 13,TMATList[2][t].val)
582
583     #else:
584         #    save()
585
586     if DOCU:
587          Doc(size)
588                 
589 def event(evt, val):  
590     global mouse_x, x, mouse_y, y, LC
591     global LCOLOR, DOCU, MENU, SAVE
592     global mouse_xr,sel, ANC, X,Y ,NSIZE
593     global mouse_yr, POS, XY,size, TRANSP,EMPTY
594
595     if (evt== QKEY or evt== ESCKEY and not val): 
596       Exit()
597     elif (evt== TKEY and not val): 
598        TRANSP=abs(TRANSP-1)
599     elif (evt== EKEY and not val): 
600        EMPTY=abs(EMPTY-1)
601     elif (evt== MKEY and not val): 
602        MENU=abs(MENU-1)
603     elif (evt== SKEY and not val): 
604        SAVE=abs(MENU-1)
605     elif (evt== WKEY and not val): 
606        LC=1.0
607        LCOLOR.val=64
608     elif (evt== BKEY and not val): 
609        LC=0.0
610        LCOLOR.val=1     
611     elif (evt==LEFTARROWKEY and not val) :
612          POS[0]-=10
613     elif (evt==RIGHTARROWKEY and not val) :
614          POS[0]+=10
615     elif (evt==UPARROWKEY and not val) :
616          POS[1]+=10
617     elif (evt==DOWNARROWKEY and not val) :
618          POS[1]-=10
619     elif (evt==PADMINUS and not val) :
620          NSIZE.val-=0.1
621     elif (evt==PADPLUSKEY and not val) :
622          NSIZE.val+=0.1
623     elif (evt==LKEY and not val) :
624              LINE.val=abs(LINE.val-1)
625     elif (evt==HOMEKEY and not val) :
626          NSIZE.val=1.0
627          POS=[0,0]
628     elif (evt==DKEY and not val) :
629              DOCU=abs(DOCU-1)          
630     elif (evt == MOUSEX): mouse_xr = val
631     elif (evt == MOUSEY): mouse_yr = val
632         
633     elif (evt == RIGHTMOUSE and val):
634         if (sel==0 ) :
635            ANC=[(mouse_xr-size[0])-POS[0],(mouse_yr-size[1])-POS[1]]
636            sel=1        
637     elif (evt == RIGHTMOUSE and not val):
638         sel=0
639         ANC=0,0
640     Redraw(1)
641    
642
643 def bevent(evt):
644     global LINE,NSIZE,n0,x0,y0,y,TEXT, loc2
645     global TMATList, selmatlist, TDOCMat,XLIMIT
646     global xlimit,LCOLOR,LC,SAVE
647
648     if   (evt== 1):
649         Exit()
650
651     elif   (evt== 16):
652          pass
653
654     elif   (evt== 4):
655        ng=NSIZE.val
656
657     elif   (evt== 6):
658        if XLIMIT.val==1:
659         xi=xwin
660         save(x0,y0,xi+2,int(y-n0))
661        else:
662         xi=xlimit
663         save(x0,y0,xi+2,int(y*NSIZE.val)-n0)
664
665     elif (evt== 7):
666        if exist(TEXT.val):
667             loc2=TEXT.val
668        else:
669             TEXT.val=loc2
670  
671     elif (evt== 24) or (evt in [32,33,34,35,36,37,38,39,40,41,42,43,44]):
672        SELMat_list()
673
674     elif  (evt== 50):
675        LC=float(LCOLOR.val)/64.0
676
677
678     Blender.Redraw()
679
680 Register(draw, event, bevent)