~ubuntu-branches/ubuntu/gutsy/blender/gutsy-security

« back to all changes in this revision

Viewing changes to release/scripts/nendo_export.py

  • Committer: Bazaar Package Importer
  • Author(s): Florian Ernst
  • Date: 2005-11-06 12:40:03 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20051106124003-3pgs7tcg5rox96xg
Tags: 2.37a-1.1
* Non-maintainer upload.
* Split out parts of 01_SConstruct_debian.dpatch again: root_build_dir
  really needs to get adjusted before the clean target runs - closes: #333958,
  see #288882 for reference

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
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,
 
21
and image textures.
 
22
 
 
23
Usage:<br>
 
24
        Select meshes to be exported and run this script from "File->Export" menu.
 
25
 
 
26
Supported:<br>
 
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.
 
30
 
 
31
Missing:<br>
 
32
        Materials and UV Coordinates info will be ignored.
 
33
 
 
34
Known issues:<br>
 
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.
 
40
 
 
41
Notes:<br>
 
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)'
 
46
field.
 
47
"""
 
48
 
 
49
# $Id: nendo_export.py,v 1.6 2005/03/21 05:26:52 ianwill Exp $
 
50
#
 
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
# +---------------------------------------------------------+
 
61
 
 
62
import Blender, meshtools
 
63
import struct, time, sys, os
 
64
 
 
65
# ==============================
 
66
# === Write Nendo 1.1 Format ===
 
67
# ==============================
 
68
def write(filename):
 
69
        start = time.clock()
 
70
 
 
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)
 
76
 
 
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)
 
83
                return
 
84
 
 
85
        edge_table = meshtools.generate_edgetable(mesh)
 
86
 
 
87
        try:
 
88
                edge_table = meshtools.generate_edgetable(mesh)
 
89
                assert len(edge_table) <= maxedges
 
90
        except:
 
91
                edge_table = {}
 
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
 
96
                return
 
97
 
 
98
        file = open(filename, "wb")
 
99
        write_header(file)
 
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)
 
104
        write_texture(file)
 
105
        file.close()
 
106
 
 
107
        Blender.Window.DrawProgressBar(1.0, "")    # clear progressbar
 
108
        print '\a\r',
 
109
        end = time.clock()
 
110
        seconds = " in %.2f %s" % (end-start, "seconds")
 
111
        message = "Successfully exported " + os.path.basename(filename) + seconds
 
112
        meshtools.print_boxed(message)
 
113
 
 
114
# ====================
 
115
# === Write Header ===
 
116
# ====================
 
117
def write_header(file):
 
118
        file.write("nendo 1.1")
 
119
        file.write("\0\0")
 
120
        file.write("\1") # numobjects
 
121
 
 
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)))
 
128
        file.write(objname)
 
129
        file.write("\1"*4)
 
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 >>>>"
 
132
        file.write(data)
 
133
 
 
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()
 
145
        keys.sort()
 
146
        for key in 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
 
152
                try:
 
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])
 
155
                except:
 
156
                        r1,g1,b1 = map(lambda x:x*255, [0.9,0.8,0.7])
 
157
                        r2,g2,b2 = r1,g1,b1
 
158
                file.write(struct.pack(">8B", r1,g1,b1,0,r2,g2,b2,0))
 
159
 
 
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()
 
168
        keys.sort()
 
169
        for key in keys:
 
170
                file.write(struct.pack(">1H", face_table[key]))
 
171
 
 
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()
 
180
        keys.sort()
 
181
        for key in 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))
 
187
 
 
188
# =====================
 
189
# === Write Texture ===
 
190
# =====================
 
191
def write_texture(file):
 
192
        file.write("\0"*5)
 
193
 
 
194
# ========================
 
195
# === Build Vert Table ===
 
196
# ========================
 
197
def build_vert_table(edge_table): # For Nendo
 
198
        vert_table = {}
 
199
        for key in edge_table.keys():
 
200
                i = edge_table[key][6]
 
201
                Sv = key[0]
 
202
                Ev = key[1]
 
203
                vert_table[Sv] = i
 
204
                vert_table[Ev] = i
 
205
        return vert_table
 
206
 
 
207
# ========================
 
208
# === Build Face Table ===
 
209
# ========================
 
210
def build_face_table(edge_table): # For Nendo
 
211
        face_table = {}
 
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]
 
216
                face_table[Lf] = i
 
217
                face_table[Rf] = i
 
218
        return face_table
 
219
 
 
220
def fs_callback(filename):
 
221
        if filename.find('.ndo', -4) <= 0: filename += '.ndo'
 
222
        write(filename)
 
223
 
 
224
Blender.Window.FileSelector(fs_callback, "Export Nendo")