Wednesday sync orange with bf-blender
[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 # | Released under the Blender Artistic Licence (BAL)       |
50 # | Import Export Suite v0.5                                |
51 # +---------------------------------------------------------+
52 # | Read and write Radiosity File Format (*.radio)          |
53 # +---------------------------------------------------------+
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 # ====== Write Radio Format ======
67 # ================================
68 def write(filename):
69         #start = time.clock()
70         file = open(filename, "wb")
71
72         objects = Blender.Object.GetSelected()
73         objname = objects[0].name
74         meshname = objects[0].data.name
75         mesh = Blender.NMesh.GetRaw(meshname)
76         obj = Blender.Object.Get(objname)
77
78         if not meshtools.has_vertex_colors(mesh):
79                 message = "Please assign vertex colors before exporting. \n"
80                 message += objname + " object was not saved."
81                 meshtools.print_boxed(message)
82                 Blender.Draw.PupMenu("ERROR%t|"+message)
83                 return
84
85         # === Object Name ===
86         file.write(struct.pack("<h", len(objname)))
87         file.write(struct.pack("<"+`len(objname)`+"s", objname))
88
89         # === Vertex List ===
90         file.write(struct.pack("<l", len(mesh.verts)))
91         for i in range(len(mesh.verts)):
92                 if not i%100 and meshtools.show_progress:
93                         Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts")
94
95                 x, y, z = mesh.verts[i].co
96                 file.write(struct.pack("<fff", x, y, z))
97
98         # === Face List ===
99         file.write(struct.pack("<l", len(mesh.faces)))
100         for i in range(len(mesh.faces)):
101                 if not i%100 and meshtools.show_progress:
102                         Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Faces")
103
104                 file.write(struct.pack("<b", len(mesh.faces[i].v)))
105                 for j in range(len(mesh.faces[i].v)):
106                         file.write(struct.pack("<h", mesh.faces[i].v[j].index))
107
108                 for j in range(4): # .col always has a length of 4
109                         file.write(struct.pack("<BBBB", mesh.faces[i].col[j].r,
110                                                                                         mesh.faces[i].col[j].g,
111                                                                                         mesh.faces[i].col[j].b,
112                                                                                         mesh.faces[i].col[j].a))
113
114         Blender.Window.DrawProgressBar(1.0, '')  # clear progressbar
115         file.close()
116         #end = time.clock()
117         #seconds = " in %.2f %s" % (end-start, "seconds")
118         message = "Successfully exported " + Blender.sys.basename(filename)# + seconds
119         meshtools.print_boxed(message)
120
121 def fs_callback(filename):
122         if filename.find('.radio', -6) <= 0: filename += '.radio'
123         write(filename)
124
125 Blender.Window.FileSelector(fs_callback, "Export Radio")