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 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)))
|
file.write(struct.pack('<b', len(f) ))
|
||||||
for j in range(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))
|
for v in f.v:
|
||||||
|
file.write(struct.pack('<h', v.index))
|
||||||
|
|
||||||
for j in range(4): # .col always has a length of 4
|
f_col= f.col
|
||||||
file.write(struct.pack("<BBBB", mesh.faces[i].col[j].r,
|
for c in f_col: # .col always has a length of 4
|
||||||
mesh.faces[i].col[j].g,
|
file.write(struct.pack('<BBBB', c.r, c.g, c.b, c.a))
|
||||||
mesh.faces[i].col[j].b,
|
|
||||||
mesh.faces[i].col[j].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.v.append(mesh.verts[index])
|
|
||||||
|
|
||||||
for j in range(4):
|
face = Face(\
|
||||||
r, g, b, a = struct.unpack("<BBBB", file.read(4))
|
[\
|
||||||
vertexcolor = Blender.NMesh.Col(r, g, b, a)
|
mesh.verts[\
|
||||||
face.col.append(vertexcolor)
|
struct.unpack("<h", file.read(2))[0]] for j in xrange(numfaceverts)\
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
if len(face.v) == 3:
|
face.col= [ Col(r, g, b, a) \
|
||||||
face.uv = [ (0,0), (0,1), (1,1) ]
|
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:
|
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()
|
||||||
|
Loading…
Reference in New Issue
Block a user