4
Name: 'Nendo (.ndo)...'
7
Tooltip: 'Export selected mesh to Nendo File Format (*.ndo)'
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"
16
This script exports meshes to Nendo file format.
18
Nendo is (was) a commercial polygon modeler that has about half of the
19
features found in Wings. The .ndo file format is a simple, uncompressed,
20
memory dump of structures that represent the mesh objects, uv coords,
24
Select meshes to be exported and run this script from "File->Export" menu.
27
1. Exports meshes only. Hint: use ALT-C to convert non-mesh objects,
28
and CTRL-ALT-A if you have "dupliverts" objects.<br>
29
2. Exports Vertex Colors & Radiosity Solutions.
32
Materials and UV Coordinates info will be ignored.
35
Exports only well-behaved and topologically correct meshes (i.e,
36
closed meshes, manifolds, meshes imported from wings, etc). The mesh
37
cannot have duplicate vertices, missing faces (holes), open edges, etc.<br>
38
PowerUser Hint: In editmode, if CTRL-ALT-SHIFT-M results in a selection,
39
then your mesh is not a manifold and most likely will not export.
42
Blender & Wings can read/write ndo files with a maximum of 65,535 edges.
43
Nendo can read/write ndo files with a maximum of 32,767 edges.<br>
44
If you have a very large mesh that you want to import into nendo, modify
45
the 'write_edge_table' function to use a signed integer (i.e., ">h") for the 'len(edge_table)'
49
# $Id: nendo_export.py,v 1.6 2005/03/21 05:26:52 ianwill Exp $
51
# +---------------------------------------------------------+
52
# | Copyright (c) 2001 Anthony D'Agostino |
53
# | http://www.redrival.com/scorpius |
54
# | scorpius@netzero.com |
55
# | September 25, 2001 |
56
# | Released under the Blender Artistic Licence (BAL) |
57
# | Import Export Suite v0.5 |
58
# +---------------------------------------------------------+
59
# | Read and write Nendo File Format (*.nendo) |
60
# +---------------------------------------------------------+
62
import Blender, meshtools
63
import struct, time, sys, os
65
# ==============================
66
# === Write Nendo 1.1 Format ===
67
# ==============================
71
objects = Blender.Object.GetSelected()
72
objname = objects[0].name
73
meshname = objects[0].data.name
74
mesh = Blender.NMesh.GetRaw(meshname)
75
obj = Blender.Object.Get(objname)
77
numedges = len(mesh.verts)+len(mesh.faces)-2
78
maxedges = (2**16)-1 # Blender & Wings can read more edges
79
#maxedges = 32767 # Nendo can't
80
if numedges > maxedges:
81
message = objname + " can't be exported to Nendo format (too many edges)."
82
Blender.Draw.PupMenu("Nendo Export Error%t|"+message)
85
edge_table = meshtools.generate_edgetable(mesh)
88
edge_table = meshtools.generate_edgetable(mesh)
89
assert len(edge_table) <= maxedges
92
message = "Unable to generate Edge Table for the object named " + meshname
93
meshtools.print_boxed(message)
94
Blender.Draw.PupMenu("Edge Table Error%t|"+message)
95
Blender.Window.DrawProgressBar(1.0, "") # clear progressbar
98
file = open(filename, "wb")
100
write_object_flags(file, objname)
101
write_edge_table(file, edge_table)
102
write_face_table(file, edge_table)
103
write_vert_table(file, edge_table, mesh)
107
Blender.Window.DrawProgressBar(1.0, "") # clear progressbar
110
seconds = " in %.2f %s" % (end-start, "seconds")
111
message = "Successfully exported " + os.path.basename(filename) + seconds
112
meshtools.print_boxed(message)
114
# ====================
115
# === Write Header ===
116
# ====================
117
def write_header(file):
118
file.write("nendo 1.1")
120
file.write("\1") # numobjects
122
# ==========================
123
# === Write Object Flags ===
124
# ==========================
125
def write_object_flags(file, objname):
126
file.write("\1") # good flag
127
file.write(struct.pack(">H", len(objname)))
130
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)
131
data = "<<<< Nendo Export Script for Blender -- (c) 2004 Anthony D'Agostino >>>>"
134
# ========================
135
# === Write Edge Table ===
136
# ========================
137
def write_edge_table(file, edge_table):
138
"+--------------------------------------+"
139
"| Wings: Sv Ev | Lf Rf | Lp Ls | Rp Rs |"
140
"| Nendo: Ev Sv | Lf Rf | Ls Rs | Rp Lp |"
141
"+--------------------------------------+"
142
#$print "edge_table"; pprint.pprint(edge_table)
143
file.write(struct.pack(">H", len(edge_table)))
144
keys = edge_table.keys()
147
file.write(struct.pack(">2H", key[0], key[1])) # Ev Sv
148
file.write(struct.pack(">2H", edge_table[key][0], edge_table[key][1])) # Lf Rf
149
file.write(struct.pack(">2H", edge_table[key][3], edge_table[key][5])) # Ls Rs
150
file.write(struct.pack(">2H", edge_table[key][4], edge_table[key][2])) # Rp Lp
151
file.write(struct.pack(">1B", 0)) # Hard flag
153
r1,g1,b1 = map(lambda x:x*255, edge_table[key][8])
154
r2,g2,b2 = map(lambda x:x*255, edge_table[key][7])
156
r1,g1,b1 = map(lambda x:x*255, [0.9,0.8,0.7])
158
file.write(struct.pack(">8B", r1,g1,b1,0,r2,g2,b2,0))
160
# ========================
161
# === Write Face Table ===
162
# ========================
163
def write_face_table(file, edge_table):
164
face_table = build_face_table(edge_table)
165
#$print "face_table"; pprint.pprint(face_table)
166
file.write(struct.pack(">H", len(face_table)))
167
keys = face_table.keys()
170
file.write(struct.pack(">1H", face_table[key]))
172
# ========================
173
# === Write Vert Table ===
174
# ========================
175
def write_vert_table(file, edge_table, mesh):
176
vert_table = build_vert_table(edge_table)
177
#$print "vert_table"; pprint.pprint(vert_table)
178
file.write(struct.pack(">H", len(vert_table)))
179
keys = vert_table.keys()
182
vertex = mesh.verts[key].co
183
x,y,z = map(lambda x:x*10, vertex) # scale
184
idx = vert_table[key]
185
#$print "%i % f % f % f" % (idx, x, y, z)
186
file.write(struct.pack(">1H3f", idx, x, z, -y))
188
# =====================
189
# === Write Texture ===
190
# =====================
191
def write_texture(file):
194
# ========================
195
# === Build Vert Table ===
196
# ========================
197
def build_vert_table(edge_table): # For Nendo
199
for key in edge_table.keys():
200
i = edge_table[key][6]
207
# ========================
208
# === Build Face Table ===
209
# ========================
210
def build_face_table(edge_table): # For Nendo
212
for key in edge_table.keys():
213
i = edge_table[key][6]
214
Lf = edge_table[key][0]
215
Rf = edge_table[key][1]
220
def fs_callback(filename):
221
if filename.find('.ndo', -4) <= 0: filename += '.ndo'
224
Blender.Window.FileSelector(fs_callback, "Export Nendo")