Integrated Freestyle to rendering pipeline
[blender.git] / release / scripts / rvk1_torvk2.py
1 #!BPY
2 # coding: utf-8
3 """ Registration info for Blender menus: <- these words are ignored
4 Name: 'Deformed mesh to Rvk'
5 Blender: 248
6 Group: 'Mesh'
7 Tip: 'Copy deform data (not surf. subdiv) of active obj to rvk of the 2nd selected obj'
8 """
9
10 __author__ = "Jean-Michel Soler (jms)"
11 __url__ = ("blender", "blenderartists.org",
12 "Script's homepage, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_rvk1versrvk2.htm",
13 "Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender")
14 __version__ = "2009/05/18"
15
16 __bpydoc__ = """\
17 "DEFORM to RVK2" copies deformed data (except all data with not exactly 
18 the same number of vertices like EDGESPLIT,DECIMATE,SUBSURF, BOOLEAN, 
19 BUILD, MIRROR, ARRAY) of the active object to the RVK (relative vertex 
20 key, now called Shapes key) of the other selected object.
21
22 It is presupposed that the second mesh object is built exactly like the first
23 one. In fact, it is better to use a true copy with at least one basic shape
24 key. If there is no other object selected, the script can create a copy.
25
26 The new version of this scrit (Blender 2.43) manages the modifier changes.
27 There are a lot of modifiers but only the ones which just deforms the shape
28 can be used : LATTICE, CURVE, WAVE, ARMATURE, CAST, DISPLACE, SMOOTH. 
29 SIMPLEDEFORM and SHRINKWRAP are not correctly seen before Blender 2.49, but
30 they can be copied too. You can unset one or more of these modifiers from 
31 the script.
32
33 Usage:
34
35 Select the object that will receive the rvk info, then select the deformed
36 object, enter Edit Mode and run this script from the "Mesh->Scripts" menu of
37 the 3d View.  If the active object has subsurf turned on and nonzero subdiv
38 level, the script will ask if it should change that.  Before copying data to
39 the rvk it will also ask whether it should replace or add a new vertex group.
40
41
42 """
43 #----------------------------------------------
44 # jm soler (c) 2004-2009 : 'Deformed mesh to Rvk'  
45 # released under GPL licence
46 #----------------------------------------------
47 """
48 Ce programme est libre, vous pouvez le redistribuer et/ou
49 le modifier selon les termes de la Licence Publique Générale GNU
50 publiée par la Free Software Foundation (version 2 ou bien toute
51 autre version ultérieure choisie par vous).
52
53 Ce programme est distribué car potentiellement utile, mais SANS
54 AUCUNE GARANTIE, ni explicite ni implicite, y compris les garanties
55 de commercialisation ou d'adaptation dans un but spécifique.
56 Reportez-vous à la Licence Publique Générale GNU pour plus de détails.
57
58 Vous devez avoir reçu une copie de la Licence Publique Générale GNU
59 en même temps que ce programme ; si ce n'est pas le cas, écrivez à la
60 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
61 MA 02111-1307, États-Unis.
62
63
64 This program is free software; you can redistribute it and/or modify
65 it under the terms of the GNU General Public License as published by
66 the Free Software Foundation; either version 2 of the License, or
67 (at your option) any later version.
68
69 This program is distributed in the hope that it will be useful,
70 but WITHOUT ANY WARRANTY; without even the implied warranty of
71 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
72 GNU General Public License for more details.
73
74 You should have received a copy of the GNU General Public License
75 along with this program; if not, write to the Free Software
76 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
77 """
78 #----------------------------------------------
79 # official Page :
80 # http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_rvk1versrvk2.htm
81 # download the script :
82 # http://jmsoler.free.fr/util/blenderfile/py/rvk1_torvk2.py
83 # Communicate upon problems or errors:
84 # http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
85 #----------------------------------------------
86 # Page officielle :
87 #   http://jmsoler.free.fr/util/blenderfile/py/rvk1_torvk2.py
88 # Communiquer les problemes et erreurs sur:
89 #   http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
90 #---------------------------------------------
91
92 import Blender
93 from Blender import NMesh,Draw,Object,Modifier
94
95 DEBUG=0
96
97 def Value(t):
98         exec "t=Modifier.Types.%s"%t
99         return t
100
101 def copy_shapes(RVK1,RVK2):
102         POSSMOD_list=['EDGESPLIT',
103                                                         'DECIMATE',
104                                                         'SUBSURF',
105                                                         'BOOLEAN',
106                                                         'BUILD',
107                                                         'MIRROR',
108                                                         'ARRAY',
109                                                         'BEVEL',
110                                                         'EXPLODE']
111
112         AUTHMOD_list=['LATTICE',
113                           'CURVE',
114                           'WAVE',
115                           'ARMATURE',
116                           'SMOOTH',
117                           'SIMPLEDEFORM',
118                           'SHRINKWRAP',
119                         'CAST',
120                                                         'DISPLACE',                                                             
121                                                         'MESHDEFORM']
122
123         
124         BMOD=[['Possible Modifiers'],
125                         ['Allowed Modifiers']]
126         # =============================================================
127         # must be 2 meshes ============================================
128         # =============================================================
129         if RVK1.getType()=='Mesh' and RVK2.getType()=='Mesh':
130                 #MODIFIERS=0
131                 FRAME=Blender.Get('curframe')
132                 DATA2=RVK2.getData()
133                 if DEBUG: print DATA2.getKey()
134                 # ============================================================
135                 # at least the second must have a shape key ==================
136                 # ============================================================
137                 def select_modifier(RVK1, RVK2, DATA2):
138                         # ======================================================
139                         # in case of modifiers, use =============================
140                         # ======================================================
141                         if RVK1.modifiers:
142                                 #MODIFIERS=1
143                                 POSSMOD=[Value(t) for t in POSSMOD_list]
144                                 AUTHMOD=[Value(t) for t in AUTHMOD_list]
145                                 if DEBUG: print 'POSSMOD:',POSSMOD,'\nAUTHMOD:', AUTHMOD
146                                 MODRVK1=RVK1.modifiers
147                                 block = []
148                                 # ===================================================
149                                 # ===  Bloc Menu Modifiers ===1 doc =================
150                                 # ===================================================
151                                 m=0
152                                 for mod in  MODRVK1:
153                                         if DEBUG: print mod.type
154                                         if mod.type in POSSMOD:
155                                                 BMOD[0].append([Draw.Create(0),mod.type,
156                                                                                                                                 m,
157                                                                                                                                 POSSMOD_list[POSSMOD.index(mod.type)],
158                                                                                                                                 mod[Modifier.Settings.RENDER]==1,
159                                                                                                                                 mod[Modifier.Settings.EDITMODE]==1
160                                                                                                                                 ])
161                                         elif mod.type in AUTHMOD:
162                                                 BMOD[1].append([Draw.Create(1),
163                                                                                                                 mod.type,
164                                                                                                                                 m,
165                                                                                                                                 AUTHMOD_list[AUTHMOD.index(mod.type)],
166                                                                                                                                 mod[Modifier.Settings.RENDER]==1,
167                                                                                                                                 mod[Modifier.Settings.EDITMODE]==1
168                                                                                                                                 ])
169                                         m+=1
170                                 # ===================================================
171                                 # ===  Bloc Menu Modifiers ===2 display =============
172                                 # ===================================================
173                                 block.append(BMOD[1][0])
174                                 for     B in BMOD[1][1:]:
175                                         block.append((B[3],B[0],""))
176                                 block.append(BMOD[0][0])
177                                 block.append("not alredy implemented")
178                                 block.append("in this script.")
179                                 for     B in BMOD[0][1:]:
180                                         block.append((B[3],B[0],""))
181                                 retval = Blender.Draw.PupBlock("MESH 2 RVK", block)
182                                 # ===================================================
183                                 # ===  unset Modifiers  =============================
184                                 # ===================================================
185                                 for     B in BMOD[0][1:]:
186                                         if DEBUG: print B[2]
187                                         MODRVK1[B[2]][Modifier.Settings.RENDER]=0
188                                 for     B in BMOD[1]:
189                                         if not B[1]:
190                                                 MODRVK1[B[2]][Modifier.Settings.RENDER]=0
191                                 # ===================================================
192                                 # ===  update Modifiers =============================
193                                 # ===================================================
194                                 #RVK1.makeDisplayList()
195                         # =======================================================
196                         # ===  get deformed mesh ================================
197                         # =======================================================
198                         RVK1NAME=Object.GetSelected()[0].getName()
199                         meshrvk1=NMesh.GetRawFromObject(RVK1NAME)
200                         if DEBUG: print len(meshrvk1.verts)
201                         # =======================================================
202                         # ===  get normal mesh for vertex group =================
203                         # =======================================================
204                         DATA1=RVK1.getData()
205                         # =======================================================
206                         # ===  get destination mesh  ============================
207                         # =======================================================
208                         DATA2=RVK2.getData()
209                         if DEBUG: print len(meshrvk1.verts)
210                         if DEBUG: print len(DATA2.verts)
211                         # ========================================================
212                         # ===== is there the same number of vertices =============
213                         # ========================================================
214                         if len(meshrvk1.verts)==len(DATA2.verts):
215                                 name = "Do you want to replace or add vertex groups ? %t| YES %x1| NO ? %x2 "
216                                 result = Draw.PupMenu(name)
217                                 if result==1:
218                                         # =====================================================
219                                         # ===== Do we save vertex groups ?  ===================
220                                         # =====================================================
221                                         GROUPNAME2=DATA2.getVertGroupNames()
222                                         if len(GROUPNAME2)!=0:
223                                                 for GROUP2 in GROUPNAME2:
224                                                         DATA2.removeVertGroup(GROUP2)
225                                         GROUPNAME1=DATA1.getVertGroupNames()
226                                         if len(GROUPNAME1)!=0:
227                                                 for GROUP1 in GROUPNAME1:
228                                                         DATA2.addVertGroup(GROUP1)
229                                                         DATA2.assignVertsToGroup(GROUP1,DATA1.getVertsFromGroup(GROUP1),1.0,'replace')
230                                 # ========================================================
231                                 # ===== now copy the vertices coords =====================
232                                 # ========================================================
233                                 for v in meshrvk1.verts:
234                                         i= meshrvk1.verts.index(v)
235                                         v1=DATA2.verts[i]
236                                         for n in [0,1,2]:
237                                                 v1.co[n]=v.co[n]
238                                 DATA2.update()
239                                 DATA2.insertKey(FRAME,'relative')
240                                 DATA2.update()
241                                 RVK2.makeDisplayList()
242                                 
243                                 if RVK1.modifiers:
244                                         # ===================================================
245                                         # ===  unset Modifiers  =============================
246                                         # ===================================================
247                                         for     B in BMOD[0][1:]:
248                                                 MODRVK1[B[2]][Modifier.Settings.RENDER]|=B[-2]
249                                         for     B in BMOD[1]:
250                                                 if not B[1]:
251                                                         MODRVK1[B[2]][Modifier.Settings.RENDER]|=B[-2]
252                                                         
253                         else:
254                                 name = "Meshes Objects must have the same number of vertices %t|Ok. %x1"
255                                 result = Draw.PupMenu(name)
256                                 return                          
257                 if DATA2.getKey():
258                         select_modifier(RVK1, RVK2, DATA2)
259                 else:
260                         name = "Second Object must have  at least a shape key %t| Ok. %x1| Add one ? %x2"
261                         result = Draw.PupMenu(name)
262                         if result :
263                                 RVK2.insertShapeKey()
264                                 DATA2=RVK2.getData()
265                                 select_modifier(RVK1, RVK2, DATA2)
266                         else:
267                                 return
268         else:
269                 name = "Object must be Meshes %t| Ok. %x1"
270                 result = Draw.PupMenu(name)
271                 return
272
273 def deform2rvk():
274         scn = Blender.Scene.GetCurrent()
275         #       =================================================================
276         # at leat 2 objects ===============================================
277         #       =================================================================
278         if len(scn.objects.selected) >1 :
279                 RVK1 = Object.GetSelected()[0]                  
280                 RVK2=Object.GetSelected()[1]
281                 if RVK2.getType()=='Mesh' :                     
282                         copy_shapes(RVK1,RVK2)                  
283         #       =================================================================
284         # ... but if only one...===========================================
285         #       =================================================================                       
286         elif len(scn.objects.selected)==1:
287                 name = "At least 2 Meshes  must be selected %t| Ok. %x1| Add one ? %x2"
288                 result = Draw.PupMenu(name)
289                 RVK1 = Object.GetSelected()[0]                                  
290                 if result and  RVK1.getType()=='Mesh' :
291                         Blender.Object.Duplicate(mesh=1)
292                         RVK2=scn.objects.active
293                         mod = RVK2.modifiers
294                         for m in mod :
295                                 RVK2.modifiers.remove(m)                        
296                         RVK2.LocX+=2.0
297                         copy_shapes(RVK1,RVK2)
298                         scn.objects.selected=[]
299                         RVK2.sel=1
300                         RVK1.sel=1              
301                 #       ================================================================
302                 # ... and not a mesh...===========================================
303                 #       ================================================================                                                
304                 elif  result:   
305                         name = "Selected object must be a mesh %t| Ok. %x1"
306                         result = Draw.PupMenu(name)                     
307                         return
308                 else :
309                         return
310         #       ================================================================
311         # ... if not object at all.  =====================================
312         #       ================================================================                                                                
313         else:
314                 name = "At least one Mesh object must be selected %t| Ok. %x1"
315                 result = Draw.PupMenu(name)
316                 return
317         
318         Blender.Redraw()
319
320 EDITMODE=Blender.Window.EditMode()
321 Blender.Window.EditMode(0)
322 END = 0
323 DEFAULT= Blender.Get('curframe')
324
325 while not END:
326         deform2rvk()
327         name = "Do you want to copy at a new frame %t| Yes ? %x1| No ? %x2"
328         result = Draw.PupMenu(name)
329         if result == 1:
330                 msg = "Frame :"
331                 inputresult = Draw.PupIntInput(msg, DEFAULT , Blender.Get('staframe'), Blender.Get('endframe'))
332                 print inputresult 
333                 if inputresult != None:
334                         Blender.Set('curframe',inputresult)
335                         Blender.Window.RedrawAll()
336                 else:
337                         END = 1  
338         else:
339                         END = 1
340                         
341 Blender.Window.EditMode(EDITMODE)