use f.area where possible over python function and use len(mface) over len(mface.v)
[blender.git] / release / scripts / radiosity_import.py
1 #!BPY
2
3 """
4 Name: 'Radiosity (.radio)...'
5 Blender: 232
6 Group: 'Import'
7 Tooltip: 'Import Radiosity File Format (.radio) with vertex colors'
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 imports Radiosity files to Blender.
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         Execute this script from the "File->Import" menu and choose a Radiosity
24 file to open.
25 """
26
27 # $Id$
28 #
29 # +---------------------------------------------------------+
30 # | Copyright (c) 2002 Anthony D'Agostino                   |
31 # | http://www.redrival.com/scorpius                        |
32 # | scorpius@netzero.com                                    |
33 # | April 11, 2002                                          |
34 # | Read and write Radiosity File Format (*.radio)          |
35 # +---------------------------------------------------------+
36
37 # ***** BEGIN GPL LICENSE BLOCK *****
38 #
39 # This program is free software; you can redistribute it and/or
40 # modify it under the terms of the GNU General Public License
41 # as published by the Free Software Foundation; either version 2
42 # of the License, or (at your option) any later version.
43 #
44 # This program is distributed in the hope that it will be useful,
45 # but WITHOUT ANY WARRANTY; without even the implied warranty of
46 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
47 # GNU General Public License for more details.
48 #
49 # You should have received a copy of the GNU General Public License
50 # along with this program; if not, write to the Free Software Foundation,
51 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
52 #
53 # ***** END GPL LICENCE BLOCK *****
54
55 import Blender, meshtools
56 #import time
57
58 try:
59         import struct
60 except:
61         msg = "Error: you need a full Python install to run this script."
62         meshtools.print_boxed(msg)
63         Blender.Draw.PupMenu("ERROR%t|"+msg)
64
65 # ===============================
66 # ====== Read Radio Format ======
67 # ===============================
68 def read(filename):
69         #start = time.clock()
70         file = open(filename, "rb")
71         mesh = Blender.NMesh.GetRaw()
72         #mesh.addMaterial(Blender.Material.New())
73
74         # === Object Name ===
75         namelen, = struct.unpack("<h",  file.read(2))
76         objname, = struct.unpack("<"+`namelen`+"s", file.read(namelen))
77
78         # === Vertex List ===
79         numverts, = struct.unpack("<l", file.read(4))
80         for i in range(numverts):
81                 if not i%100 and meshtools.show_progress:
82                         Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Verts")
83                 x, y, z = struct.unpack("<fff", file.read(12))
84                 mesh.verts.append(Blender.NMesh.Vert(x, y, z))
85
86         # === Face List ===
87         numfaces, = struct.unpack("<l", file.read(4))
88         for i in range(numfaces):
89                 if not i%100 and meshtools.show_progress:
90                         Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces")
91
92                 face = Blender.NMesh.Face()
93                 numfaceverts, = struct.unpack("<b", file.read(1))
94
95                 for j in range(numfaceverts):
96                         index, = struct.unpack("<h", file.read(2))
97                         face.v.append(mesh.verts[index])
98
99                 for j in range(4):
100                         r, g, b, a = struct.unpack("<BBBB", file.read(4))
101                         vertexcolor = Blender.NMesh.Col(r, g, b, a)
102                         face.col.append(vertexcolor)
103
104                 if len(face.v) == 3:
105                         face.uv = [ (0,0), (0,1), (1,1) ]
106                 else:
107                         face.uv = [ (0,0), (0,1), (1,1), (1,0) ]
108
109                 face.mode = 0
110                 mesh.faces.append(face)
111
112         # ->tools.create_mesh(verts, faces, objname):
113         Blender.NMesh.PutRaw(mesh, objname)
114         object = Blender.Object.GetSelected()
115         object[0].name=objname
116         # ->tools.create_mesh(verts, faces, objname):
117
118         Blender.Window.DrawProgressBar(1.0, '')  # clear progressbar
119         file.close()
120         #end = time.clock()
121         #seconds = " in %.2f %s" % (end-start, "seconds")
122         message = "Successfully imported " + Blender.sys.basename(filename)# + seconds
123         meshtools.print_boxed(message)
124
125 def fs_callback(filename):
126         read(filename)
127
128 Blender.Window.FileSelector(fs_callback, "Import Radio")