forked from bartvdbraak/blender
a6d077bae2
- tiny updates for better behavior, unix line endings, cvs Id tags; - Updated DX7 exporter (thanks to author Ben Omari who's also working on a DX8 one); - added sysinfo script; Interface (scripts): - changed behavior for which win is chosen for script guis: Now there's a smarter order, guis will use either: - Scripts win - Buttons win (if not a script from groups Wizards or Utils) - Text win - Closest bigger area - Added a button to the scripts header so that it's faster to return to the buttons win (this can be made general), if that was the previous win used.
186 lines
5.7 KiB
Python
186 lines
5.7 KiB
Python
#!BPY
|
|
|
|
"""
|
|
Name: 'Nendo...'
|
|
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, "Nendo Export")
|