Modernized radiosity i/o - better errors, optimized with LC's modifiers and matricies applied.

This commit is contained in:
Campbell Barton 2006-07-03 04:12:53 +00:00
parent 8a10a77345
commit acef774a61
2 changed files with 128 additions and 84 deletions

@ -69,33 +69,48 @@ specular highlights to the vertex colors.
import Blender, meshtools import Blender, meshtools
#import time #import time
import BPyMesh
try: try:
import struct import struct
NULL_COLOR= struct.pack('<BBBB', 255,255,255,255)
except: except:
msg = "Error: you need a full Python install to run this script." struct= None
meshtools.print_boxed(msg)
Blender.Draw.PupMenu("ERROR%t|"+msg)
# ================================ # ================================
# ====== Write Radio Format ====== # ====== Write Radio Format ======
# ================================ # ================================
def write(filename): def write(filename):
#start = time.clock() if not filename.lower().endswith('.radio'):
filename += '.radio'
scn= Blender.Scene.GetCurrent()
object= scn.getActiveObject()
if not object:
Blender.Draw.PupMenu('Error%t|Select 1 active object')
return
objname= object.name
file = open(filename, 'wb')
mesh = BPyMesh.getMeshFromObject(object, None, True, False, scn)
if not mesh:
Blender.Draw.PupMenu('Error%t|Could not get mesh data from active object')
return
mesh.transform(object.matrixWorld)
start = Blender.sys.time()
file = open(filename, "wb") file = open(filename, "wb")
objects = Blender.Object.GetSelected() if not mesh.faceUV:
objname = objects[0].name mesh.faceUV= 1
meshname = objects[0].data.name #message = 'Please assign vertex colors before exporting "%s"|object was not saved' % object.name
mesh = Blender.NMesh.GetRaw(meshname) #Blender.Draw.PupMenu("ERROR%t|"+message)
obj = Blender.Object.Get(objname) #return
if not meshtools.has_vertex_colors(mesh):
message = "Please assign vertex colors before exporting. \n"
message += objname + " object was not saved."
meshtools.print_boxed(message)
Blender.Draw.PupMenu("ERROR%t|"+message)
return
# === Object Name === # === Object Name ===
file.write(struct.pack("<h", len(objname))) file.write(struct.pack("<h", len(objname)))
@ -103,38 +118,45 @@ def write(filename):
# === Vertex List === # === Vertex List ===
file.write(struct.pack("<l", len(mesh.verts))) file.write(struct.pack("<l", len(mesh.verts)))
for i in range(len(mesh.verts)): for v in mesh.verts:
if not i%100 and meshtools.show_progress: #if not i%100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts") # Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts")
x, y, z = tuple(v.co)
x, y, z = mesh.verts[i].co
file.write(struct.pack("<fff", x, y, z)) file.write(struct.pack("<fff", x, y, z))
# === Face List === # === Face List ===
file.write(struct.pack("<l", len(mesh.faces))) file.write(struct.pack('<l', len(mesh.faces)))
for i in range(len(mesh.faces)): #for i in range(len(mesh.faces)):
if not i%100 and meshtools.show_progress: for f in mesh.faces:
Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Faces") #if not i%100 and meshtools.show_progress:
# Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Faces")
file.write(struct.pack("<b", len(mesh.faces[i].v)))
for j in range(len(mesh.faces[i].v)): file.write(struct.pack('<b', len(f) ))
file.write(struct.pack("<h", mesh.faces[i].v[j].index)) #for j in range(len(mesh.faces[i].v)):
for v in f.v:
for j in range(4): # .col always has a length of 4 file.write(struct.pack('<h', v.index))
file.write(struct.pack("<BBBB", mesh.faces[i].col[j].r,
mesh.faces[i].col[j].g, f_col= f.col
mesh.faces[i].col[j].b, for c in f_col: # .col always has a length of 4
mesh.faces[i].col[j].a)) file.write(struct.pack('<BBBB', c.r, c.g, c.b, c.a))
# Write the last values out again. always have 4 cols even for tris
if len(f_col) == 3:
file.write(NULL_COLOR)
Blender.Window.DrawProgressBar(1.0, '') # clear progressbar Blender.Window.DrawProgressBar(1.0, '') # clear progressbar
file.close() file.close()
#end = time.clock() end = Blender.sys.time()
#seconds = " in %.2f %s" % (end-start, "seconds") message = 'Successfully exported "%s" in %.2f seconds' % (Blender.sys.basename(filename), end-start)
message = "Successfully exported " + Blender.sys.basename(filename)# + seconds
meshtools.print_boxed(message) meshtools.print_boxed(message)
def fs_callback(filename):
if filename.find('.radio', -6) <= 0: filename += '.radio'
write(filename)
Blender.Window.FileSelector(fs_callback, "Export Radio") def main():
if not struct:
Blender.Draw.PupMenu('ERROR%t|Error: you need a full Python install to run this script')
return
Blender.Window.FileSelector(write, 'Export Radio', Blender.sys.makename(ext='.radio'))
if __name__ == '__main__':
main()

@ -53,76 +53,98 @@ file to open.
# ***** END GPL LICENCE BLOCK ***** # ***** END GPL LICENCE BLOCK *****
import Blender, meshtools import Blender, meshtools
#import time
try: try:
import struct import struct
except: except:
msg = "Error: you need a full Python install to run this script." struct= None
meshtools.print_boxed(msg)
Blender.Draw.PupMenu("ERROR%t|"+msg)
# =============================== # ===============================
# ====== Read Radio Format ====== # ====== Read Radio Format ======
# =============================== # ===============================
def read(filename): def read(filename):
#start = time.clock() start = Blender.sys.time()
file = open(filename, "rb") file = open(filename, "rb")
mesh = Blender.NMesh.GetRaw() mesh = Blender.NMesh.GetRaw()
#mesh.addMaterial(Blender.Material.New()) #mesh.addMaterial(Blender.Material.New())
NULL_UV3= [ (0,0), (0,1), (1,1) ]
NULL_UV4= [ (0,0), (0,1), (1,1), (1,0) ]
# === Object Name === # === Object Name ===
namelen, = struct.unpack("<h", file.read(2)) namelen, = struct.unpack("<h", file.read(2))
objname, = struct.unpack("<"+`namelen`+"s", file.read(namelen)) objname, = struct.unpack("<"+`namelen`+"s", file.read(namelen))
# === Vertex List === # === Vertex List ===
Vert= Blender.NMesh.Vert
numverts, = struct.unpack("<l", file.read(4)) numverts, = struct.unpack("<l", file.read(4))
for i in range(numverts):
if not i%100 and meshtools.show_progress: # Se we can run in a LC
Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Verts") def _vert_():
x, y, z = struct.unpack("<fff", file.read(12)) x,y,z= struct.unpack('<fff', file.read(12))
mesh.verts.append(Blender.NMesh.Vert(x, y, z)) return Vert(x, y, z)
mesh.verts= [_vert_() for i in xrange(numverts)]
del _vert_
# === Face List === # === Face List ===
Face= Blender.NMesh.Face
Col= Blender.NMesh.Col
numfaces, = struct.unpack("<l", file.read(4)) numfaces, = struct.unpack("<l", file.read(4))
for i in range(numfaces): for i in xrange(numfaces):
if not i%100 and meshtools.show_progress: #if not i%100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces") # Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces")
face = Blender.NMesh.Face()
numfaceverts, = struct.unpack("<b", file.read(1)) numfaceverts, = struct.unpack("<b", file.read(1))
for j in range(numfaceverts):
index, = struct.unpack("<h", file.read(2)) face = Face(\
face.v.append(mesh.verts[index]) [\
mesh.verts[\
for j in range(4): struct.unpack("<h", file.read(2))[0]] for j in xrange(numfaceverts)\
r, g, b, a = struct.unpack("<BBBB", file.read(4)) ]
vertexcolor = Blender.NMesh.Col(r, g, b, a) )
face.col.append(vertexcolor)
face.col= [ Col(r, g, b, a) \
if len(face.v) == 3: for j in xrange(4)\
face.uv = [ (0,0), (0,1), (1,1) ] for r,g,b,a in ( struct.unpack("<BBBB", file.read(4)), )]
if len(face) == 3:
face.uv = NULL_UV3
else: else:
face.uv = [ (0,0), (0,1), (1,1), (1,0) ] face.uv = NULL_UV4
face.mode = 0 face.mode = 0
mesh.faces.append(face) mesh.faces.append(face)
# ->tools.create_mesh(verts, faces, objname): scn= Blender.Scene.GetCurrent()
Blender.NMesh.PutRaw(mesh, objname) for obj in scn.getChildren():
object = Blender.Object.GetSelected() obj.sel= 0
object[0].name=objname
# ->tools.create_mesh(verts, faces, objname): obj= Blender.Object.New('Mesh', objname)
mesh.name= objname
obj.link(mesh)
scn.link(obj)
obj.sel= 1
obj.Layers= scn.Layers
Blender.Window.DrawProgressBar(1.0, '') # clear progressbar Blender.Window.DrawProgressBar(1.0, '') # clear progressbar
file.close() file.close()
#end = time.clock() end = Blender.sys.time()
#seconds = " in %.2f %s" % (end-start, "seconds") message = 'Successfully imported "%s" in %.2f seconds' % (Blender.sys.basename(filename), end-start)
message = "Successfully imported " + Blender.sys.basename(filename)# + seconds
meshtools.print_boxed(message) meshtools.print_boxed(message)
def fs_callback(filename):
read(filename)
Blender.Window.FileSelector(fs_callback, "Import Radio") def main():
if not struct:
Blender.Draw.PupMenu('ERROR%t|Error: you need a full Python install to run this script')
return
Blender.Window.FileSelector(read, "Import Radio", Blender.sys.makename(ext='.radio'))
if __name__ == '__main__':
main()