forked from bartvdbraak/blender
Modernized radiosity i/o - better errors, optimized with LC's modifiers and matricies applied.
This commit is contained in:
parent
8a10a77345
commit
acef774a61
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user