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 time
import BPyMesh
try:
import struct
NULL_COLOR= struct.pack('<BBBB', 255,255,255,255)
except:
msg = "Error: you need a full Python install to run this script."
meshtools.print_boxed(msg)
Blender.Draw.PupMenu("ERROR%t|"+msg)
struct= None
# ================================
# ====== Write Radio Format ======
# ================================
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")
objects = Blender.Object.GetSelected()
objname = objects[0].name
meshname = objects[0].data.name
mesh = Blender.NMesh.GetRaw(meshname)
obj = Blender.Object.Get(objname)
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
if not mesh.faceUV:
mesh.faceUV= 1
#message = 'Please assign vertex colors before exporting "%s"|object was not saved' % object.name
#Blender.Draw.PupMenu("ERROR%t|"+message)
#return
# === Object Name ===
file.write(struct.pack("<h", len(objname)))
@ -103,38 +118,45 @@ def write(filename):
# === Vertex List ===
file.write(struct.pack("<l", len(mesh.verts)))
for i in range(len(mesh.verts)):
if not i%100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts")
x, y, z = mesh.verts[i].co
for v in mesh.verts:
#if not i%100 and meshtools.show_progress:
# Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts")
x, y, z = tuple(v.co)
file.write(struct.pack("<fff", x, y, z))
# === Face List ===
file.write(struct.pack("<l", len(mesh.faces)))
for i in range(len(mesh.faces)):
if not i%100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Faces")
file.write(struct.pack('<l', len(mesh.faces)))
#for i in range(len(mesh.faces)):
for f in mesh.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("<h", mesh.faces[i].v[j].index))
file.write(struct.pack('<b', len(f) ))
#for j in range(len(mesh.faces[i].v)):
for v in f.v:
file.write(struct.pack('<h', v.index))
for j in range(4): # .col always has a length of 4
file.write(struct.pack("<BBBB", mesh.faces[i].col[j].r,
mesh.faces[i].col[j].g,
mesh.faces[i].col[j].b,
mesh.faces[i].col[j].a))
f_col= f.col
for c in f_col: # .col always has a length of 4
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
file.close()
#end = time.clock()
#seconds = " in %.2f %s" % (end-start, "seconds")
message = "Successfully exported " + Blender.sys.basename(filename)# + seconds
end = Blender.sys.time()
message = 'Successfully exported "%s" in %.2f seconds' % (Blender.sys.basename(filename), end-start)
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 *****
import Blender, meshtools
#import time
try:
import struct
except:
msg = "Error: you need a full Python install to run this script."
meshtools.print_boxed(msg)
Blender.Draw.PupMenu("ERROR%t|"+msg)
struct= None
# ===============================
# ====== Read Radio Format ======
# ===============================
def read(filename):
#start = time.clock()
start = Blender.sys.time()
file = open(filename, "rb")
mesh = Blender.NMesh.GetRaw()
#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 ===
namelen, = struct.unpack("<h", file.read(2))
objname, = struct.unpack("<"+`namelen`+"s", file.read(namelen))
# === Vertex List ===
Vert= Blender.NMesh.Vert
numverts, = struct.unpack("<l", file.read(4))
for i in range(numverts):
if not i%100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Verts")
x, y, z = struct.unpack("<fff", file.read(12))
mesh.verts.append(Blender.NMesh.Vert(x, y, z))
# Se we can run in a LC
def _vert_():
x,y,z= struct.unpack('<fff', file.read(12))
return Vert(x, y, z)
mesh.verts= [_vert_() for i in xrange(numverts)]
del _vert_
# === Face List ===
Face= Blender.NMesh.Face
Col= Blender.NMesh.Col
numfaces, = struct.unpack("<l", file.read(4))
for i in range(numfaces):
if not i%100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces")
for i in xrange(numfaces):
#if not i%100 and meshtools.show_progress:
# Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces")
face = Blender.NMesh.Face()
numfaceverts, = struct.unpack("<b", file.read(1))
for j in range(numfaceverts):
index, = struct.unpack("<h", file.read(2))
face.v.append(mesh.verts[index])
for j in range(4):
r, g, b, a = struct.unpack("<BBBB", file.read(4))
vertexcolor = Blender.NMesh.Col(r, g, b, a)
face.col.append(vertexcolor)
face = Face(\
[\
mesh.verts[\
struct.unpack("<h", file.read(2))[0]] for j in xrange(numfaceverts)\
]
)
if len(face.v) == 3:
face.uv = [ (0,0), (0,1), (1,1) ]
face.col= [ Col(r, g, b, a) \
for j in xrange(4)\
for r,g,b,a in ( struct.unpack("<BBBB", file.read(4)), )]
if len(face) == 3:
face.uv = NULL_UV3
else:
face.uv = [ (0,0), (0,1), (1,1), (1,0) ]
face.uv = NULL_UV4
face.mode = 0
mesh.faces.append(face)
# ->tools.create_mesh(verts, faces, objname):
Blender.NMesh.PutRaw(mesh, objname)
object = Blender.Object.GetSelected()
object[0].name=objname
# ->tools.create_mesh(verts, faces, objname):
scn= Blender.Scene.GetCurrent()
for obj in scn.getChildren():
obj.sel= 0
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
file.close()
#end = time.clock()
#seconds = " in %.2f %s" % (end-start, "seconds")
message = "Successfully imported " + Blender.sys.basename(filename)# + seconds
end = Blender.sys.time()
message = 'Successfully imported "%s" in %.2f seconds' % (Blender.sys.basename(filename), end-start)
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()