diff options
Diffstat (limited to 'release/scripts/nendo_import.py')
-rw-r--r-- | release/scripts/nendo_import.py | 269 |
1 files changed, 0 insertions, 269 deletions
diff --git a/release/scripts/nendo_import.py b/release/scripts/nendo_import.py deleted file mode 100644 index be896db98be..00000000000 --- a/release/scripts/nendo_import.py +++ /dev/null @@ -1,269 +0,0 @@ -#!BPY - -""" -Name: 'Nendo (.ndo)...' -Blender: 232 -Group: 'Import' -Tooltip: 'Import Nendo Object File Format (.ndo)' -""" - -__author__ = "Anthony D'Agostino (Scorpius)" -__url__ = ("blender", "elysiun", -"Author's homepage, http://www.redrival.com/scorpius") -__version__ = "Part of IOSuite 0.5" - -__bpydoc__ = """\ -This script imports Nendo files to Blender. - -Nendo is (was) a commercial polygon modeler that has about half of the -features found in Wings. The .ndo file format is a simple, uncompressed, -memory dump of structures that represent the mesh objects, uv coords, -and image textures. - -Usage:<br> - Execute this script from the "File->Import" menu and choose a Nendo file -to open. - -Supported:<br> - Meshes only. - -Missing:<br> - Materials, UV Coordinates, and Vertex Color info will be ignored. - -Known issues:<br> - Triangulation of convex polygons works fine, and uses a very simple -fanning algorithm. Convex polygons (i.e., shaped like the letter "U") -require a different algorithm, and will be triagulated incorrectly. - -Notes:<br> - Last tested with Wings 3D 0.98.25 & Nendo 1.1.6. Some models cannot be -imported due to the fact that Nendo erroneously creates doubled back -edges during the course of modeling. -""" - -# $Id$ -# -# +---------------------------------------------------------+ -# | Copyright (c) 2001 Anthony D'Agostino | -# | http://www.redrival.com/scorpius | -# | scorpius@netzero.com | -# | September 25, 2001 | -# | Read and write Nendo File Format (*.nendo) | -# +---------------------------------------------------------+ - -# ***** BEGIN GPL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# ***** END GPL LICENCE BLOCK ***** - -import Blender, meshtools -try: - import struct, os -except: - struct= None - -# ============================= -# === Read Nendo 1.x Format === -# ============================= -def read(filename): - start = Blender.sys.time() - - scn= Blender.Scene.GetCurrent() - for obj in scn.objects: - obj.sel= 0 - - file = open(filename, "rb") - version, numobjs = read_header(file) - - for object in xrange(numobjs): - good, = struct.unpack(">B", file.read(1)) - if not good: continue # an empty object - objname = read_object_flags(file) - edge_table = read_edge_table(file, version) - face_table = read_face_table(file) - vert_table = read_vert_table(file) - uv = read_uv(file) - verts = make_verts(vert_table) - faces = make_faces(edge_table) - meshtools.create_mesh(verts, faces, objname) - - Blender.Window.DrawProgressBar(1.0, "Done") # clear progressbar - file.close() - end = Blender.sys.time() - seconds = " in %.2f %s" % (end-start, "seconds") - message = "Successfully imported " + filename.split(Blender.sys.sep)[-1] + seconds - message += " (%s)" % version.title() - meshtools.print_boxed(message) - -# ======================= -# === Read The Header === -# ======================= -def read_header(file): - version, = struct.unpack(">9s", file.read(9)) - misc, = struct.unpack(">H", file.read(2)) - numobjs, = struct.unpack(">B", file.read(1)) - if (version != "nendo 1.0") and (version != "nendo 1.1"): - meshtools.print_boxed(file.name, "is not a Nendo file") - return - return version, numobjs - -# ========================= -# === Read Object Flags === -# ========================= -def read_object_flags(file): - namelen, = struct.unpack(">H", file.read(2)) - objname = file.read(namelen) - visible, = struct.unpack(">B", file.read(1)) - sensity, = struct.unpack(">B", file.read(1)) - other, = struct.unpack(">H", file.read(2)) # or 2 more flags? - misc = struct.unpack(">18f", file.read(72)) - return objname - -# ======================= -# === Read Edge Table === -# ======================= -def read_edge_table(file, version): - numedges, = struct.unpack(">H", file.read(2)) - edge_table = {} - for i in xrange(numedges): - if not i%100 and meshtools.show_progress: - Blender.Window.DrawProgressBar(float(i)/numedges, "Reading Edge Table") - edge = struct.unpack(">8H", file.read(16)) - if version == "nendo 1.1": - hard, = struct.unpack(">B", file.read(1)) # edge hardness flag - color = struct.unpack(">8B", file.read(8)) - edge_table[i] = edge - return edge_table - -# ======================= -# === Read Face Table === -# ======================= -def read_face_table(file): - numfaces, = struct.unpack(">H", file.read(2)) - face_table = {} - for i in xrange(numfaces): - if not i%100 and meshtools.show_progress: - Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Face Table") - face_table[i] = struct.unpack(">H", file.read(2))[0] - return face_table - -# ======================= -# === Read Vert Table === -# ======================= -def read_vert_table(file): - numverts, = struct.unpack(">H", file.read(2)) - vert_table = [] - for i in xrange(numverts): - if not i%100 and meshtools.show_progress: - Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Vertex Table") - w, x, y, z = struct.unpack(">H3f", file.read(14)) - vert_table.append((w,(x, y, z))) - return vert_table - -# ==================== -# === Read Texture === -# ==================== -def read_uv(file): - numuvs, = struct.unpack(">H", file.read(2)) - uvlist = struct.unpack(">"+`numuvs`+"H", file.read(numuvs*2)) - numfacesT, = struct.unpack(">H", file.read(2)) - facesT = struct.unpack(">"+`numfacesT`+"H", file.read(numfacesT*2)) - textureflag, = struct.unpack(">B", file.read(1)) - if textureflag: - xres, yres = struct.unpack(">2H", file.read(4)) - print "%ix%i" % (xres, yres) - pixel = 0 - while pixel < (xres*yres): - if not pixel%100 and meshtools.show_progress: - Blender.Window.DrawProgressBar(float(pixel)/xres*yres, "Reading Texture") - count, = struct.unpack(">B", file.read(1)) - rgb = file.read(3) - pixel = pixel+count - return numuvs - -# ================== -# === Make Verts === -# ================== -def make_verts(vert_table): - matrix = [ # Rotate 90*x and Scale 0.1 - [0.1, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.1, 0.0], - [0.0,-0.1, 0.0, 0.0], - [0.0, 0.0, 0.0, 1.0]] - verts = [] - for i in xrange(len(vert_table)): - vertex = vert_table[i][1] - vertex = meshtools.apply_transform(vertex, matrix) - verts.append(vertex) - return verts - -# ======================= -# === Make Face Table === -# ======================= -def make_face_table(edge_table): # For Nendo - face_table = {} - for i in xrange(len(edge_table)): - Lf = edge_table[i][2] - Rf = edge_table[i][3] - face_table[Lf] = face_table[Rf] = i - return face_table - -# ======================= -# === Make Vert Table === -# ======================= -def make_vert_table(edge_table): # For Nendo - vert_table = {} - for i in xrange(len(edge_table)): - Sv = edge_table[i][1] - Ev = edge_table[i][0] - vert_table[Sv] = vert_table[Ev]= i - return vert_table - -# ================== -# === Make Faces === -# ================== -def make_faces(edge_table): # For Nendo - face_table = make_face_table(edge_table) - faces=[] - #for i in range(len(face_table)): - for i in face_table.iterkeys(): # avoids a whole class of errors - face_verts = [] - current_edge = face_table[i] - while(1): - if i == edge_table[current_edge][3]: - next_edge = edge_table[current_edge][5] # Right successor edge - next_vert = edge_table[current_edge][1] - else: - next_edge = edge_table[current_edge][4] # Left successor edge - next_vert = edge_table[current_edge][0] - face_verts.append(next_vert) - current_edge = next_edge - if current_edge == face_table[i]: break - face_verts.reverse() # Flip all face normals - faces.append(face_verts) - return faces - - -def main(): - if not struct: - Blender.Draw.PupMenu('This importer requires a full python install') - return - - Blender.Window.FileSelector(read, 'Import Nendo', '*.ndo') - -if __name__=='__main__': - main() - |