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