Scripts:
[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 # | Released under the Blender Artistic Licence (BAL)       |
35 # | Import Export Suite v0.5                                |
36 # +---------------------------------------------------------+
37 # | Read and write Radiosity File Format (*.radio)          |
38 # +---------------------------------------------------------+
39
40 import Blender, mod_meshtools
41 #import time
42
43 try:
44         import struct
45 except:
46         msg = "Error: you need a full Python install to run this script."
47         mod_meshtools.print_boxed(msg)
48         Blender.Draw.PupMenu("ERROR%t|"+msg)
49
50 # ===============================
51 # ====== Read Radio Format ======
52 # ===============================
53 def read(filename):
54         #start = time.clock()
55         file = open(filename, "rb")
56         mesh = Blender.NMesh.GetRaw()
57         #mesh.addMaterial(Blender.Material.New())
58
59         # === Object Name ===
60         namelen, = struct.unpack("<h",  file.read(2))
61         objname, = struct.unpack("<"+`namelen`+"s", file.read(namelen))
62
63         # === Vertex List ===
64         numverts, = struct.unpack("<l", file.read(4))
65         for i in range(numverts):
66                 if not i%100 and mod_meshtools.show_progress:
67                         Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Verts")
68                 x, y, z = struct.unpack("<fff", file.read(12))
69                 mesh.verts.append(Blender.NMesh.Vert(x, y, z))
70
71         # === Face List ===
72         numfaces, = struct.unpack("<l", file.read(4))
73         for i in range(numfaces):
74                 if not i%100 and mod_meshtools.show_progress:
75                         Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces")
76
77                 face = Blender.NMesh.Face()
78                 numfaceverts, = struct.unpack("<b", file.read(1))
79
80                 for j in range(numfaceverts):
81                         index, = struct.unpack("<h", file.read(2))
82                         face.v.append(mesh.verts[index])
83
84                 for j in range(4):
85                         r, g, b, a = struct.unpack("<BBBB", file.read(4))
86                         vertexcolor = Blender.NMesh.Col(r, g, b, a)
87                         face.col.append(vertexcolor)
88
89                 if len(face.v) == 3:
90                         face.uv = [ (0,0), (0,1), (1,1) ]
91                 else:
92                         face.uv = [ (0,0), (0,1), (1,1), (1,0) ]
93
94                 face.mode = 0
95                 mesh.faces.append(face)
96
97         # ->tools.create_mesh(verts, faces, objname):
98         Blender.NMesh.PutRaw(mesh, objname)
99         object = Blender.Object.GetSelected()
100         object[0].name=objname
101         # ->tools.create_mesh(verts, faces, objname):
102
103         Blender.Window.DrawProgressBar(1.0, '')  # clear progressbar
104         file.close()
105         #end = time.clock()
106         #seconds = " in %.2f %s" % (end-start, "seconds")
107         message = "Successfully imported " + Blender.sys.basename(filename)# + seconds
108         mod_meshtools.print_boxed(message)
109
110 def fs_callback(filename):
111         read(filename)
112
113 Blender.Window.FileSelector(fs_callback, "Import Radio")