* Edited and consistent-ified the File->Import menu item labels and fileselect button...
[blender.git] / release / scripts / nendo_export.py
1 #!BPY
2
3 """
4 Name: 'Nendo (.ndo)...'
5 Blender: 232
6 Group: 'Export'
7 Tooltip: 'Export selected mesh to Nendo File Format (*.ndo)'
8 """
9
10 # $Id$
11 #
12 # +---------------------------------------------------------+
13 # | Copyright (c) 2001 Anthony D'Agostino                   |
14 # | http://www.redrival.com/scorpius                        |
15 # | scorpius@netzero.com                                    |
16 # | September 25, 2001                                      |
17 # | Released under the Blender Artistic Licence (BAL)       |
18 # | Import Export Suite v0.5                                |
19 # +---------------------------------------------------------+
20 # | Read and write Nendo File Format (*.nendo)              |
21 # +---------------------------------------------------------+
22
23 import Blender, mod_meshtools
24 import struct, time, sys, os
25
26 # ==============================
27 # === Write Nendo 1.1 Format ===
28 # ==============================
29 def write(filename):
30         start = time.clock()
31
32         objects = Blender.Object.GetSelected()
33         objname = objects[0].name
34         meshname = objects[0].data.name
35         mesh = Blender.NMesh.GetRaw(meshname)
36         obj = Blender.Object.Get(objname)
37
38         numedges = len(mesh.verts)+len(mesh.faces)-2
39         maxedges = (2**16)-1    # Blender & Wings can read more edges
40         #maxedges = 32767               # Nendo can't
41         if numedges > maxedges:
42                 message = objname + " can't be exported to Nendo format (too many edges)."
43                 Blender.Draw.PupMenu("Nendo Export Error%t|"+message)
44                 return
45
46         edge_table = mod_meshtools.generate_edgetable(mesh)
47
48         try:
49                 edge_table = mod_meshtools.generate_edgetable(mesh)
50                 assert len(edge_table) <= maxedges
51         except:
52                 edge_table = {}
53                 message = "Unable to generate Edge Table for the object named " + meshname
54                 mod_meshtools.print_boxed(message)
55                 Blender.Draw.PupMenu("Edge Table Error%t|"+message)
56                 Blender.Window.DrawProgressBar(1.0, "")    # clear progressbar
57                 return
58
59         file = open(filename, "wb")
60         write_header(file)
61         write_object_flags(file, objname)
62         write_edge_table(file, edge_table)
63         write_face_table(file, edge_table)
64         write_vert_table(file, edge_table, mesh)
65         write_texture(file)
66         file.close()
67
68         Blender.Window.DrawProgressBar(1.0, "")    # clear progressbar
69         print '\a\r',
70         end = time.clock()
71         seconds = " in %.2f %s" % (end-start, "seconds")
72         message = "Successfully exported " + os.path.basename(filename) + seconds
73         mod_meshtools.print_boxed(message)
74
75 # ====================
76 # === Write Header ===
77 # ====================
78 def write_header(file):
79         file.write("nendo 1.1")
80         file.write("\0\0")
81         file.write("\1") # numobjects
82
83 # ==========================
84 # === Write Object Flags ===
85 # ==========================
86 def write_object_flags(file, objname):
87         file.write("\1") # good flag
88         file.write(struct.pack(">H", len(objname)))
89         file.write(objname)
90         file.write("\1"*4)
91         data = struct.pack(">18f",0,0,0,1,1,1,1,1,1,1,1,1,0.2,0.2,0.2,1,100,1)
92         data = "<<<< Nendo Export Script for Blender -- (c) 2004 Anthony D'Agostino >>>>"
93         file.write(data)
94
95 # ========================
96 # === Write Edge Table ===
97 # ========================
98 def write_edge_table(file, edge_table):
99         "+--------------------------------------+"
100         "| Wings: Sv Ev | Lf Rf | Lp Ls | Rp Rs |"
101         "| Nendo: Ev Sv | Lf Rf | Ls Rs | Rp Lp |"
102         "+--------------------------------------+"
103         #$print "edge_table"; pprint.pprint(edge_table)
104         file.write(struct.pack(">H", len(edge_table)))
105         keys = edge_table.keys()
106         keys.sort()
107         for key in keys:
108                 file.write(struct.pack(">2H", key[0], key[1]))                          # Ev Sv
109                 file.write(struct.pack(">2H", edge_table[key][0], edge_table[key][1]))  # Lf Rf
110                 file.write(struct.pack(">2H", edge_table[key][3], edge_table[key][5]))  # Ls Rs
111                 file.write(struct.pack(">2H", edge_table[key][4], edge_table[key][2]))  # Rp Lp
112                 file.write(struct.pack(">1B", 0))                                       # Hard flag
113                 try:
114                         r1,g1,b1 = map(lambda x:x*255, edge_table[key][8])
115                         r2,g2,b2 = map(lambda x:x*255, edge_table[key][7])
116                 except:
117                         r1,g1,b1 = map(lambda x:x*255, [0.9,0.8,0.7])
118                         r2,g2,b2 = r1,g1,b1
119                 file.write(struct.pack(">8B", r1,g1,b1,0,r2,g2,b2,0))
120
121 # ========================
122 # === Write Face Table ===
123 # ========================
124 def write_face_table(file, edge_table):
125         face_table = build_face_table(edge_table)
126         #$print "face_table"; pprint.pprint(face_table)
127         file.write(struct.pack(">H", len(face_table)))
128         keys = face_table.keys()
129         keys.sort()
130         for key in keys:
131                 file.write(struct.pack(">1H", face_table[key]))
132
133 # ========================
134 # === Write Vert Table ===
135 # ========================
136 def write_vert_table(file, edge_table, mesh):
137         vert_table = build_vert_table(edge_table)
138         #$print "vert_table"; pprint.pprint(vert_table)
139         file.write(struct.pack(">H", len(vert_table)))
140         keys = vert_table.keys()
141         keys.sort()
142         for key in keys:
143                 vertex = mesh.verts[key].co
144                 x,y,z = map(lambda x:x*10, vertex) # scale
145                 idx = vert_table[key]
146                 #$print "%i % f % f % f" % (idx, x, y, z)
147                 file.write(struct.pack(">1H3f", idx, x, z, -y))
148
149 # =====================
150 # === Write Texture ===
151 # =====================
152 def write_texture(file):
153         file.write("\0"*5)
154
155 # ========================
156 # === Build Vert Table ===
157 # ========================
158 def build_vert_table(edge_table): # For Nendo
159         vert_table = {}
160         for key in edge_table.keys():
161                 i = edge_table[key][6]
162                 Sv = key[0]
163                 Ev = key[1]
164                 vert_table[Sv] = i
165                 vert_table[Ev] = i
166         return vert_table
167
168 # ========================
169 # === Build Face Table ===
170 # ========================
171 def build_face_table(edge_table): # For Nendo
172         face_table = {}
173         for key in edge_table.keys():
174                 i = edge_table[key][6]
175                 Lf = edge_table[key][0]
176                 Rf = edge_table[key][1]
177                 face_table[Lf] = i
178                 face_table[Rf] = i
179         return face_table
180
181 def fs_callback(filename):
182         if filename.find('.ndo', -4) <= 0: filename += '.ndo'
183         write(filename)
184
185 Blender.Window.FileSelector(fs_callback, "Export Nendo")