fix BGE bug #8668: Behavior of os.getcwd() is not consistent between operating systems
[blender-staging.git] / release / scripts / export_lightwave_motion.py
1 #!BPY
2
3 """ Registration info for Blender menus: <- these words are ignored
4 Name: 'Lightwave Motion (.mot)...'
5 Blender: 241
6 Group: 'Export'
7 Tip: 'Export Loc Rot Size chanels to a Lightwave .mot file'
8 """
9
10 __author__ = "Daniel Salazar (ZanQdo)"
11 __url__ = ("blender", "blenderartists.org",
12 "e-mail: zanqdo@gmail.com")
13 __version__ = "16/04/08"
14
15 __bpydoc__ = """\
16 This script exports the selected object's motion channels to Lightwave
17 motion files (.mot).
18
19 Usage:
20 Run the script with one or more objects selected (any kind), frames exported
21 are between Start and End frames in Render buttons.
22
23 """
24
25 # $Id$
26 # --------------------------------------------------------------------------
27 # ***** BEGIN GPL LICENSE BLOCK *****
28 #
29 # Copyright (C) 2003, 2004: A Vanpoucke
30 #
31 # This program is free software; you can redistribute it and/or
32 # modify it under the terms of the GNU General Public License
33 # as published by the Free Software Foundation; either version 2
34 # of the License, or (at your option) any later version.
35 #
36 # This program is distributed in the hope that it will be useful,
37 # but WITHOUT ANY WARRANTY; without even the implied warranty of
38 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
39 # GNU General Public License for more details.
40 #
41 # You should have received a copy of the GNU General Public License
42 # along with this program; if not, write to the Free Software Foundation,
43 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
44 #
45 # ***** END GPL LICENCE BLOCK *****
46 # --------------------------------------------------------------------------
47 import Blender as B
48 import math as M
49 #------------------------------------
50 #Declarados:
51 TotalCanales = 9
52 #------------------------------------
53
54 def FuncionPrincipal (Dir):
55         B.Window.WaitCursor(1)
56         ObjSelect = B.Object.GetSelected()
57         
58         if not ObjSelect:
59                 B.Draw.PupMenu('Select 1 or more objects, aborting.')
60                 return
61         
62         if not Dir.lower().endswith('.mot'):
63                 Dir += '.mot'
64                 
65         
66         SC = B.Scene.GetCurrent()
67         SCR = SC.getRenderingContext()
68         
69         for ob in ObjSelect:
70                 origName= NombreObjeto= ob.name
71                 print '----\nExporting Object "%s" motion file...' % origName
72
73                 FrameA = B.Get('curframe')
74                 FrameP = B.Get('staframe')
75                 FrameF = B.Get('endframe')
76
77                 FrameRate = float(SCR.framesPerSec())
78
79                 #---------------------------------------------
80
81                 # Replace danger characters by '_'
82                 for ch in ' /\\~!@#$%^&*()+=[];\':",./<>?\t\r\n':
83                         NombreObjeto = NombreObjeto.replace(ch, '_')
84
85                 # Check for file path extension
86                 if len(ObjSelect) > 1:
87                         DirN= '%s_%s.mot' % (Dir[:-4], NombreObjeto)
88                 else:
89                         DirN= Dir
90                 
91                 # Open the file
92                 File = open(DirN,'w')
93                 File.write ('LWMO\n3\n\n') # 3 is the version number.
94
95                 # number of channels
96                 File.write ('NumChannels %i\n' % TotalCanales)
97
98                 # ----------------------------
99                 # Main Cycle
100
101                 def CicloPrimario(NumCanal):
102                         B.Set('curframe', FrameP)
103
104                         File.write ('Channel %i\n{ Envelope\n  %i\n' % (NumCanal, (FrameF - FrameP + 1)))
105
106                         FrameA = FrameP
107                         while FrameA < (FrameF + 1):
108
109                                 B.Set('curframe', FrameA)
110                                 
111                                 mat= ob.mat # Worldspace matrix
112                                 
113                                 if NumCanal == 0:
114                                         Val = mat.translationPart().x
115                                 elif NumCanal == 1:
116                                         Val = mat.translationPart().z
117                                 elif NumCanal == 2:
118                                         Val = mat.translationPart().y
119                                 elif NumCanal == 3:
120                                         Val = M.radians (-mat.toEuler().z)
121                                 elif NumCanal == 4:
122                                         Val = M.radians (-mat.toEuler().x)
123                                 elif NumCanal == 5:
124                                         Val = M.radians (-mat.toEuler().y)
125                                 elif NumCanal == 6:
126                                         Val = mat.scalePart().x
127                                 elif NumCanal == 7:
128                                         Val = mat.scalePart().z
129                                 elif NumCanal == 8:
130                                         Val = mat.scalePart().y
131                                 File.write ('  Key %f %f 3 0 0 0 0 0 0\n' % (Val, (FrameA/FrameRate)))
132
133                                 FrameA += 1
134                         # Ending Stuff
135                         File.write ('  Behaviors 1 1\n}\n')
136
137                 NumObjetoActual = len(ObjSelect)
138                 Iteraciones = 0
139                 ProgBarVal = 0.0
140                 while Iteraciones < TotalCanales:
141                         CicloPrimario(Iteraciones)
142
143                         # Start Progress Bar
144                         B.Window.DrawProgressBar(ProgBarVal, origName)
145                         ProgBarVal = (float(Iteraciones) / TotalCanales) * 0.98
146                         Iteraciones += 1
147                         
148                 B.Window.DrawProgressBar(1.0, '') # Done
149                 print '\nDone, %s motion file location is:\n%s\n' % (origName, DirN)
150         B.Window.WaitCursor(0)
151
152 # Check if there are selected objects
153 def main():
154         B.Window.FileSelector(FuncionPrincipal, "Write .mot File", B.sys.makename(ext='.mot'))
155
156 if __name__=='__main__':
157         main()