forked from bartvdbraak/blender
d34f89b755
* Added items for importing DXF, VRML, etc. in the File->Import menu, that just call the normal Open function. Most people don't even know that you can open these formats through the normal Open fileselect, so this will make it more obvious. * Removed the 'Export Selected' menu, and put poor old lonely STL in the Import and Export menus too. Most of the exporters export only the selected object anyway, so it's not really a necessary distinction to make.
186 lines
5.7 KiB
Python
186 lines
5.7 KiB
Python
#!BPY
|
|
|
|
"""
|
|
Name: 'Nendo (.ndo)...'
|
|
Blender: 232
|
|
Group: 'Export'
|
|
Tooltip: 'Export selected mesh to Nendo File Format (*.ndo)'
|
|
"""
|
|
|
|
# $Id$
|
|
#
|
|
# +---------------------------------------------------------+
|
|
# | Copyright (c) 2001 Anthony D'Agostino |
|
|
# | http://www.redrival.com/scorpius |
|
|
# | scorpius@netzero.com |
|
|
# | September 25, 2001 |
|
|
# | Released under the Blender Artistic Licence (BAL) |
|
|
# | Import Export Suite v0.5 |
|
|
# +---------------------------------------------------------+
|
|
# | Read and write Nendo File Format (*.nendo) |
|
|
# +---------------------------------------------------------+
|
|
|
|
import Blender, mod_meshtools
|
|
import struct, time, sys, os
|
|
|
|
# ==============================
|
|
# === Write Nendo 1.1 Format ===
|
|
# ==============================
|
|
def write(filename):
|
|
start = time.clock()
|
|
|
|
objects = Blender.Object.GetSelected()
|
|
objname = objects[0].name
|
|
meshname = objects[0].data.name
|
|
mesh = Blender.NMesh.GetRaw(meshname)
|
|
obj = Blender.Object.Get(objname)
|
|
|
|
numedges = len(mesh.verts)+len(mesh.faces)-2
|
|
maxedges = (2**16)-1 # Blender & Wings can read more edges
|
|
#maxedges = 32767 # Nendo can't
|
|
if numedges > maxedges:
|
|
message = objname + " can't be exported to Nendo format (too many edges)."
|
|
Blender.Draw.PupMenu("Nendo Export Error%t|"+message)
|
|
return
|
|
|
|
edge_table = mod_meshtools.generate_edgetable(mesh)
|
|
|
|
try:
|
|
edge_table = mod_meshtools.generate_edgetable(mesh)
|
|
assert len(edge_table) <= maxedges
|
|
except:
|
|
edge_table = {}
|
|
message = "Unable to generate Edge Table for the object named " + meshname
|
|
mod_meshtools.print_boxed(message)
|
|
Blender.Draw.PupMenu("Edge Table Error%t|"+message)
|
|
Blender.Window.DrawProgressBar(1.0, "") # clear progressbar
|
|
return
|
|
|
|
file = open(filename, "wb")
|
|
write_header(file)
|
|
write_object_flags(file, objname)
|
|
write_edge_table(file, edge_table)
|
|
write_face_table(file, edge_table)
|
|
write_vert_table(file, edge_table, mesh)
|
|
write_texture(file)
|
|
file.close()
|
|
|
|
Blender.Window.DrawProgressBar(1.0, "") # clear progressbar
|
|
print '\a\r',
|
|
end = time.clock()
|
|
seconds = " in %.2f %s" % (end-start, "seconds")
|
|
message = "Successfully exported " + os.path.basename(filename) + seconds
|
|
mod_meshtools.print_boxed(message)
|
|
|
|
# ====================
|
|
# === Write Header ===
|
|
# ====================
|
|
def write_header(file):
|
|
file.write("nendo 1.1")
|
|
file.write("\0\0")
|
|
file.write("\1") # numobjects
|
|
|
|
# ==========================
|
|
# === Write Object Flags ===
|
|
# ==========================
|
|
def write_object_flags(file, objname):
|
|
file.write("\1") # good flag
|
|
file.write(struct.pack(">H", len(objname)))
|
|
file.write(objname)
|
|
file.write("\1"*4)
|
|
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)
|
|
data = "<<<< Nendo Export Script for Blender -- (c) 2004 Anthony D'Agostino >>>>"
|
|
file.write(data)
|
|
|
|
# ========================
|
|
# === Write Edge Table ===
|
|
# ========================
|
|
def write_edge_table(file, edge_table):
|
|
"+--------------------------------------+"
|
|
"| Wings: Sv Ev | Lf Rf | Lp Ls | Rp Rs |"
|
|
"| Nendo: Ev Sv | Lf Rf | Ls Rs | Rp Lp |"
|
|
"+--------------------------------------+"
|
|
#$print "edge_table"; pprint.pprint(edge_table)
|
|
file.write(struct.pack(">H", len(edge_table)))
|
|
keys = edge_table.keys()
|
|
keys.sort()
|
|
for key in keys:
|
|
file.write(struct.pack(">2H", key[0], key[1])) # Ev Sv
|
|
file.write(struct.pack(">2H", edge_table[key][0], edge_table[key][1])) # Lf Rf
|
|
file.write(struct.pack(">2H", edge_table[key][3], edge_table[key][5])) # Ls Rs
|
|
file.write(struct.pack(">2H", edge_table[key][4], edge_table[key][2])) # Rp Lp
|
|
file.write(struct.pack(">1B", 0)) # Hard flag
|
|
try:
|
|
r1,g1,b1 = map(lambda x:x*255, edge_table[key][8])
|
|
r2,g2,b2 = map(lambda x:x*255, edge_table[key][7])
|
|
except:
|
|
r1,g1,b1 = map(lambda x:x*255, [0.9,0.8,0.7])
|
|
r2,g2,b2 = r1,g1,b1
|
|
file.write(struct.pack(">8B", r1,g1,b1,0,r2,g2,b2,0))
|
|
|
|
# ========================
|
|
# === Write Face Table ===
|
|
# ========================
|
|
def write_face_table(file, edge_table):
|
|
face_table = build_face_table(edge_table)
|
|
#$print "face_table"; pprint.pprint(face_table)
|
|
file.write(struct.pack(">H", len(face_table)))
|
|
keys = face_table.keys()
|
|
keys.sort()
|
|
for key in keys:
|
|
file.write(struct.pack(">1H", face_table[key]))
|
|
|
|
# ========================
|
|
# === Write Vert Table ===
|
|
# ========================
|
|
def write_vert_table(file, edge_table, mesh):
|
|
vert_table = build_vert_table(edge_table)
|
|
#$print "vert_table"; pprint.pprint(vert_table)
|
|
file.write(struct.pack(">H", len(vert_table)))
|
|
keys = vert_table.keys()
|
|
keys.sort()
|
|
for key in keys:
|
|
vertex = mesh.verts[key].co
|
|
x,y,z = map(lambda x:x*10, vertex) # scale
|
|
idx = vert_table[key]
|
|
#$print "%i % f % f % f" % (idx, x, y, z)
|
|
file.write(struct.pack(">1H3f", idx, x, z, -y))
|
|
|
|
# =====================
|
|
# === Write Texture ===
|
|
# =====================
|
|
def write_texture(file):
|
|
file.write("\0"*5)
|
|
|
|
# ========================
|
|
# === Build Vert Table ===
|
|
# ========================
|
|
def build_vert_table(edge_table): # For Nendo
|
|
vert_table = {}
|
|
for key in edge_table.keys():
|
|
i = edge_table[key][6]
|
|
Sv = key[0]
|
|
Ev = key[1]
|
|
vert_table[Sv] = i
|
|
vert_table[Ev] = i
|
|
return vert_table
|
|
|
|
# ========================
|
|
# === Build Face Table ===
|
|
# ========================
|
|
def build_face_table(edge_table): # For Nendo
|
|
face_table = {}
|
|
for key in edge_table.keys():
|
|
i = edge_table[key][6]
|
|
Lf = edge_table[key][0]
|
|
Rf = edge_table[key][1]
|
|
face_table[Lf] = i
|
|
face_table[Rf] = i
|
|
return face_table
|
|
|
|
def fs_callback(filename):
|
|
if filename.find('.ndo', -4) <= 0: filename += '.ndo'
|
|
write(filename)
|
|
|
|
Blender.Window.FileSelector(fs_callback, "Export Nendo")
|