Scripts:
[blender.git] / release / scripts / radiosity_export.py
1 #!BPY
2
3 """
4 Name: 'Radiosity (.radio)...'
5 Blender: 232
6 Group: 'Export'
7 Tooltip: 'Export selected mesh (with vertex colors) to Radiosity File Format (.radio)'
8 """
9
10 __author__ = "Anthony D'Agostino (Scorpius)"
11 __url__ = ("blender", "elysiun",
12 "Author's homepage, http://www.redrival.com/scorpius")
13 __version__ = "Part of IOSuite 0.5"
14
15 __bpydoc__ = """\
16 This script exports meshes to Radiosity file format.
17
18 The Radiosity file format is my own personal format. I created it to
19 learn how meshes and vertex colors were stored. See IO-Examples.zip, the
20 example *.radio files on my web page.
21
22 Usage:<br>
23         Select meshes to be exported and run this script from "File->Export" menu.
24
25 Notes:<br>
26         Before exporting to .radio format, the mesh must have vertex colors.
27 Here's how to assign them:
28
29 1. Use radiosity!
30
31 2. Set up lights and materials, select a mesh, switch the drawing mode
32 to "textured," press the VKEY.
33
34 3. Press the VKEY and paint manually.
35
36 4. Use a custom script to calculate and apply simple diffuse shading and
37 specular highlights to the vertex colors.
38
39 5. The Videoscape format also allows vertex colors to be specified.
40 """
41
42 # $Id$
43 #
44 # +---------------------------------------------------------+
45 # | Copyright (c) 2002 Anthony D'Agostino                   |
46 # | http://www.redrival.com/scorpius                        |
47 # | scorpius@netzero.com                                    |
48 # | April 11, 2002                                          |
49 # | Read and write Radiosity File Format (*.radio)          |
50 # +---------------------------------------------------------+
51
52 # ***** BEGIN GPL LICENSE BLOCK *****
53 #
54 # This program is free software; you can redistribute it and/or
55 # modify it under the terms of the GNU General Public License
56 # as published by the Free Software Foundation; either version 2
57 # of the License, or (at your option) any later version.
58 #
59 # This program is distributed in the hope that it will be useful,
60 # but WITHOUT ANY WARRANTY; without even the implied warranty of
61 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
62 # GNU General Public License for more details.
63 #
64 # You should have received a copy of the GNU General Public License
65 # along with this program; if not, write to the Free Software Foundation,
66 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
67 #
68 # ***** END GPL LICENCE BLOCK *****
69
70 import Blender, meshtools
71 #import time
72
73 try:
74         import struct
75 except:
76         msg = "Error: you need a full Python install to run this script."
77         meshtools.print_boxed(msg)
78         Blender.Draw.PupMenu("ERROR%t|"+msg)
79
80 # ================================
81 # ====== Write Radio Format ======
82 # ================================
83 def write(filename):
84         #start = time.clock()
85         file = open(filename, "wb")
86
87         objects = Blender.Object.GetSelected()
88         objname = objects[0].name
89         meshname = objects[0].data.name
90         mesh = Blender.NMesh.GetRaw(meshname)
91         obj = Blender.Object.Get(objname)
92
93         if not meshtools.has_vertex_colors(mesh):
94                 message = "Please assign vertex colors before exporting. \n"
95                 message += objname + " object was not saved."
96                 meshtools.print_boxed(message)
97                 Blender.Draw.PupMenu("ERROR%t|"+message)
98                 return
99
100         # === Object Name ===
101         file.write(struct.pack("<h", len(objname)))
102         file.write(struct.pack("<"+`len(objname)`+"s", objname))
103
104         # === Vertex List ===
105         file.write(struct.pack("<l", len(mesh.verts)))
106         for i in range(len(mesh.verts)):
107                 if not i%100 and meshtools.show_progress:
108                         Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts")
109
110                 x, y, z = mesh.verts[i].co
111                 file.write(struct.pack("<fff", x, y, z))
112
113         # === Face List ===
114         file.write(struct.pack("<l", len(mesh.faces)))
115         for i in range(len(mesh.faces)):
116                 if not i%100 and meshtools.show_progress:
117                         Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Faces")
118
119                 file.write(struct.pack("<b", len(mesh.faces[i].v)))
120                 for j in range(len(mesh.faces[i].v)):
121                         file.write(struct.pack("<h", mesh.faces[i].v[j].index))
122
123                 for j in range(4): # .col always has a length of 4
124                         file.write(struct.pack("<BBBB", mesh.faces[i].col[j].r,
125                                                                                         mesh.faces[i].col[j].g,
126                                                                                         mesh.faces[i].col[j].b,
127                                                                                         mesh.faces[i].col[j].a))
128
129         Blender.Window.DrawProgressBar(1.0, '')  # clear progressbar
130         file.close()
131         #end = time.clock()
132         #seconds = " in %.2f %s" % (end-start, "seconds")
133         message = "Successfully exported " + Blender.sys.basename(filename)# + seconds
134         meshtools.print_boxed(message)
135
136 def fs_callback(filename):
137         if filename.find('.radio', -6) <= 0: filename += '.radio'
138         write(filename)
139
140 Blender.Window.FileSelector(fs_callback, "Export Radio")