Skip to content
Snippets Groups Projects
Commit bdc62445 authored by Willian Padovani Germano's avatar Willian Padovani Germano
Browse files

BPython:

-- fixing a last minute bug: scripts w/o guis that called the file selector were
   not being checked for errors, which could cause crash dumps upon exiting.
-- docs: updates for Draw (fixed example) and Material (added tex related methods docs)

Scripts:
-- added some more scripts, all I could get in shape in time (at least they export / import back).
   Only tested on linux.
parent abe7425f
Branches
Tags
No related merge requests found
# +---------------------------------------------------------+
# | Copyright (c) 2002 Anthony D'Agostino |
# | http://ourworld.compuserve.com/homepages/scorpius |
# | scorpius@compuserve.com |
# | October 25, 2002 |
# | Released under the Blender Artistic Licence (BAL) |
# | Import Export Suite v0.5 |
# +---------------------------------------------------------+
# | Share Global Variables Across Modules |
# +---------------------------------------------------------+
import Blender
blender_version = Blender.Get('version')
blender_version_str = `blender_version`[0] + '.' + `blender_version`[1:]
show_progress = 1 # Set to 0 for faster performance
average_vcols = 1 # Off for per-face, On for per-vertex
overwrite_mesh_name = 0 # Set to 0 for safety
# +---------------------------------------------------------+
# | Copyright (c) 2001 Anthony D'Agostino |
# | http://ourworld.compuserve.com/homepages/scorpius |
# | scorpius@compuserve. |
# | September 28, 2002 |
# | Released under the Blender Artistic Licence (BAL) |
# | Import Export Suite v0.5 |
# +---------------------------------------------------------+
# | Common Functions For All Modules |
# +---------------------------------------------------------+
import Blender
import sys#, random, operator
import mod_flags
try:
import random, operator
# ===================================
# ==== Append Faces To Face List ====
# ===================================
def append_faces(mesh, faces, facesuv, uvcoords):
r = random.randrange(200, 255, 50)
g = random.randrange(100, 200, 50)
b = random.randrange(0, 100, 50)
for i in range(len(faces)):
if not i%100 and mod_flags.show_progress: Blender.Window.DrawProgressBar(float(i)/len(faces), "Generating Faces")
numfaceverts=len(faces[i])
if numfaceverts <= 4: # This face is a triangle or quad
face = Blender.NMesh.Face()
for j in range(numfaceverts):
index = faces[i][j]
face.v.append(mesh.verts[index])
if len(uvcoords) > 1:
uvidx = facesuv[i][j]
face.uv.append(uvcoords[uvidx])
face.mode = 0
#face.col = [Blender.NMesh.Col(r, g, b)]*4 # Random color
face.col = [Blender.NMesh.Col()]*4
mesh.faces.append(face)
else: # Triangulate n-sided convex polygon.
a, b, c = 0, 1, 2 # Indices of first triangle.
for j in range(numfaceverts-2): # Number of triangles in polygon.
face = Blender.NMesh.Face()
face.v.append(mesh.verts[faces[i][a]])
face.v.append(mesh.verts[faces[i][b]])
face.v.append(mesh.verts[faces[i][c]])
b = c; c += 1
mesh.faces.append(face)
#face.smooth = 1
# =====================================
# ==== Append Verts to Vertex List ====
# =====================================
def append_verts(mesh, verts, normals):
#print "Number of normals:", len(normals)
#print "Number of verts :", len(verts)
for i in range(len(verts)):
if not i%100 and mod_flags.show_progress: Blender.Window.DrawProgressBar(float(i)/len(verts), "Generating Verts")
x, y, z = verts[i]
mesh.verts.append(Blender.NMesh.Vert(x, y, z))
if normals:
mesh.verts[i].no[0] = normals[i][0]
mesh.verts[i].no[1] = normals[i][1]
mesh.verts[i].no[2] = normals[i][2]
# =============================
# ==== Create Blender Mesh ====
# =============================
def create_mesh(verts, faces, objname, facesuv=[], uvcoords=[], normals=[]):
if normals: normal_flag = 0
else: normal_flag = 1
mesh = Blender.NMesh.GetRaw()
append_verts(mesh, verts, normals)
append_faces(mesh, faces, facesuv, uvcoords)
if not mod_flags.overwrite_mesh_name:
objname = versioned_name(objname)
Blender.NMesh.PutRaw(mesh, objname, normal_flag) # Name the Mesh
Blender.Object.GetSelected()[0].name=objname # Name the Object
Blender.Redraw()
except ImportError: pass
# ================================
# ==== Increment Name Version ====
# ================================
def versioned_name(objname):
existing_names = []
for object in Blender.Object.Get():
existing_names.append(object.name)
existing_names.append(object.data.name)
if objname in existing_names: # don't over-write other names
try:
name, ext = objname.split('.')
except ValueError:
name, ext = objname, ''
try:
num = int(ext)
root = name
except ValueError:
root = objname
for i in xrange(1, 1000):
objname = "%s.%03d" % (root, i)
if objname not in existing_names:
break
return objname
# =============================
# ==== Print Text In A Box ====
# =============================
def print_boxed(text):
lines = text.splitlines()
maxlinelen = max(map(len, lines))
print '+-' + '-'*maxlinelen + '-+'
for line in lines: print '| ' + line.ljust(maxlinelen) + ' |'
print '+-' + '-'*maxlinelen + '-+'
print '\a\r', # beep when done
# =================================================
# ==== Get Euler Angles From A Rotation Matrix ====
# =================================================
#def mat2euler(mat):
# angle_y = -math.asin(mat[0][2])
# c = math.cos(angle_y)
# if math.fabs(c) > 0.005:
# angle_x = math.atan2(mat[1][2]/c, mat[2][2]/c)
# angle_z = math.atan2(mat[0][1]/c, mat[0][0]/c)
# else:
# angle_x = 0.0
# angle_z = -math.atan2(mat[1][0], mat[1][1])
# return (angle_x, angle_y, angle_z)
# ============================
# ==== Transpose A Matrix ====
# ============================
def transpose(A):
S = len(A)
T = len(A[0])
B = [[None]*S for i in range(T)]
for i in range(T):
for j in range(S):
B[i][j] = A[j][i]
return B
#def append_ntimes(Seq, N):
# Seq = reduce(operator.add, Seq) # Flatten once
# if N == 1: return Seq
# return append_ntimes(Seq, N-1)
# print "mesh.has_col ", mesh.has_col
# print "mesh.hasVertexColours()", mesh.hasVertexColours()
# print "mesh.hasFaceUV() ", mesh.hasFaceUV()
# print "mesh.has_uvco ", mesh.has_uvco
# # =============================
# # ==== Create Blender Mesh ====
# # =============================
# def create_mesh_old(verts, faces, objname):
# mesh = Blender.NMesh.GetRaw()
# # === Vertex List ===
# for i in range(len(verts)):
# x, y, z = verts[i]
# mesh.verts.append(Blender.NMesh.Vert(x, y ,z))
# # === Face List ===
# for i in range(len(faces)):
# face = Blender.NMesh.Face()
# for j in range(len(faces[i])):
# index = faces[i][j]
# face.v.append(mesh.verts[index])
# mesh.faces.append(face)
# # === Name the Object ===
# Blender.NMesh.PutRaw(mesh, objname)
# object = Blender.Object.GetSelected()
# object[0].name=objname
# Blender.Redraw()
#!BPY
"""
Name: 'OFF...'
Blender: 232
Group: 'Export'
Tooltip: 'Export selected mesh to Object File Format (*.off)'
"""
# +---------------------------------------------------------+
# | Copyright (c) 2002 Anthony D'Agostino |
# | http://ourworld.compuserve.com/homepages/scorpius |
# | scorpius@compuserve.com |
# | February 3, 2001 |
# | Released under the Blender Artistic Licence (BAL) |
# | Import Export Suite v0.5 |
# +---------------------------------------------------------+
# | Read and write Object File Format (*.off) |
# +---------------------------------------------------------+
import Blender
#import time
import mod_flags, mod_meshtools
# ==============================
# ====== Write OFF Format ======
# ==============================
def write(filename):
#start = time.clock()
file = open(filename, "wb")
objects = Blender.Object.GetSelected()
objname = objects[0].name
meshname = objects[0].data.name
mesh = Blender.NMesh.GetRaw(meshname)
#mesh = Blender.NMesh.GetRawFromObject(meshname) # for SubSurf
obj = Blender.Object.Get(objname)
# === OFF Header ===
file.write("OFF\n")
file.write("%d %d %d\n" % (len(mesh.verts), len(mesh.faces), 0))
# === Vertex List ===
for i in range(len(mesh.verts)):
if not i%100 and mod_flags.show_progress:
Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts")
x, y, z = mesh.verts[i].co
file.write("%f %f %f\n" % (x, y, z))
# === Face List ===
for i in range(len(mesh.faces)):
if not i%100 and mod_flags.show_progress:
Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Faces")
file.write(`len(mesh.faces[i].v)`+' ')
mesh.faces[i].v.reverse()
for j in range(len(mesh.faces[i].v)):
file.write(`mesh.faces[i].v[j].index`+' ')
file.write("\n")
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
mod_meshtools.print_boxed(message)
def fs_callback(filename):
if filename.find('.off', -4) <= 0: filename += '.off'
write(filename)
Blender.Window.FileSelector(fs_callback, "OFF Export")
#!BPY
"""
Name: 'OFF...'
Blender: 232
Group: 'Import'
Tooltip: 'Import Object File Format (*.off)'
"""
# +---------------------------------------------------------+
# | Copyright (c) 2002 Anthony D'Agostino |
# | http://ourworld.compuserve.com/homepages/scorpius |
# | scorpius@compuserve.com |
# | February 3, 2001 |
# | Released under the Blender Artistic Licence (BAL) |
# | Import Export Suite v0.5 |
# +---------------------------------------------------------+
# | Read and write Object File Format (*.off) |
# +---------------------------------------------------------+
import Blender
#import time
import mod_flags, mod_meshtools
# =============================
# ====== Read OFF Format ======
# =============================
def read(filename):
#start = time.clock()
file = open(filename, "rb")
verts = []
faces = []
# === OFF Header ===
offheader = file.readline()
numverts, numfaces, null = file.readline().split()
numverts = int(numverts)
numfaces = int(numfaces)
# === Vertex List ===
for i in range(numverts):
if not i%100 and mod_flags.show_progress:
Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Verts")
x, y, z = file.readline().split()
x, y, z = float(x), float(y), float(z)
verts.append((x, y, z))
# === Face List ===
for i in range(numfaces):
if not i%100 and mod_flags.show_progress:
Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces")
line = file.readline().split()
numfaceverts = len(line)-1
facev = []
for j in range(numfaceverts):
index = int(line[j+1])
facev.append(index)
facev.reverse()
faces.append(facev)
objname = Blender.sys.splitext(Blender.sys.basename(filename))[0]
mod_meshtools.create_mesh(verts, faces, objname)
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
mod_meshtools.print_boxed(message)
def fs_callback(filename):
read(filename)
Blender.Window.FileSelector(fs_callback, "OFF Import")
#!BPY
"""
Name: 'Radiosity...'
Blender: 232
Group: 'Export'
Tooltip: 'Export selected mesh (with vertex colors) to Radiosity File Format (*.radio)'
"""
# +---------------------------------------------------------+
# | Copyright (c) 2002 Anthony D'Agostino |
# | http://ourworld.compuserve.com/homepages/scorpius |
# | scorpius@compuserve.com |
# | April 11, 2002 |
# | Released under the Blender Artistic Licence (BAL) |
# | Import Export Suite v0.5 |
# +---------------------------------------------------------+
# | Read and write Radiosity File Format (*.radio) |
# +---------------------------------------------------------+
import Blender
#import time
import mod_flags, mod_meshtools
try:
import struct
except:
msg = "Error: you need a full Python install to run this script."
mod_meshtools.print_boxed(msg)
# ================================
# ====== Write Radio Format ======
# ================================
def write(filename):
#start = time.clock()
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 mesh.hasVertexColours():
message = "Please assign vertex colors before exporting.\n"
message += objname + " object was not saved."
mod_meshtools.print_boxed(message)
return
# === Object Name ===
file.write(struct.pack("<h", len(objname)))
file.write(struct.pack("<"+`len(objname)`+"s", objname))
# === Vertex List ===
file.write(struct.pack("<l", len(mesh.verts)))
for i in range(len(mesh.verts)):
if not i%100 and mod_flags.show_progress:
Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts")
x, y, z = mesh.verts[i].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 mod_flags.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))
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))
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
mod_meshtools.print_boxed(message)
def fs_callback(filename):
if filename.find('.radio', -6) <= 0: filename += '.radio'
write(filename)
Blender.Window.FileSelector(fs_callback, "Radio Export")
#!BPY
"""
Name: 'Radiosity...'
Blender: 232
Group: 'Import'
Tooltip: 'Import Radiosity File Format (*.radio) with vertex colors'
"""
# +---------------------------------------------------------+
# | Copyright (c) 2002 Anthony D'Agostino |
# | http://ourworld.compuserve.com/homepages/scorpius |
# | scorpius@compuserve.com |
# | April 11, 2002 |
# | Released under the Blender Artistic Licence (BAL) |
# | Import Export Suite v0.5 |
# +---------------------------------------------------------+
# | Read and write Radiosity File Format (*.radio) |
# +---------------------------------------------------------+
import Blender
#import time
import mod_flags, mod_meshtools
try:
import struct
except:
msg = "Error: you need a full Python install to run this script."
mod_meshtools.print_boxed(msg)
# ===============================
# ====== Read Radio Format ======
# ===============================
def read(filename):
#start = time.clock()
file = open(filename, "rb")
mesh = Blender.NMesh.GetRaw()
mesh.addMaterial(Blender.Material.New())
# === Object Name ===
namelen, = struct.unpack("<h", file.read(2))
objname, = struct.unpack("<"+`namelen`+"s", file.read(namelen))
# === Vertex List ===
numverts, = struct.unpack("<l", file.read(4))
for i in range(numverts):
if not i%100 and mod_flags.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))
# === Face List ===
numfaces, = struct.unpack("<l", file.read(4))
for i in range(numfaces):
if not i%100 and mod_flags.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)
if len(face.v) == 3:
face.uv = [ (0,0), (0,1), (1,1) ]
else:
face.uv = [ (0,0), (0,1), (1,1), (1,0) ]
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):
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
mod_meshtools.print_boxed(message)
def fs_callback(filename):
read(filename)
Blender.Window.FileSelector(fs_callback, "Radio Import")
#!BPY
"""
Name: 'Raw Triangle...'
Blender: 232
Group: 'Export'
Tooltip: 'Export selected mesh to Raw Triangle Format (*.raw)'
"""
# +---------------------------------------------------------+
# | Copyright (c) 2002 Anthony D'Agostino |
# | http://ourworld.compuserve.com/homepages/scorpius |
# | scorpius@compuserve.com |
# | April 28, 2002 |
# | Released under the Blender Artistic Licence (BAL) |
# | Import Export Suite v0.5 |
# +---------------------------------------------------------+
# | Read and write RAW Triangle File Format (*.raw) |
# +---------------------------------------------------------+
import Blender, sys
#import time
import mod_flags, mod_meshtools
# ===================================
# ==== Write RAW Triangle Format ====
# ===================================
def write(filename):
#start = time.clock()
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)
std=sys.stdout
sys.stdout=file
for face in mesh.faces:
if len(face.v) == 3: # triangle
v1, v2, v3 = face.v
faceverts = tuple(v1.co) + tuple(v2.co) + tuple(v3.co)
print "% f % f % f % f % f % f % f % f % f" % faceverts
else: # quadrilateral
v1, v2, v3, v4 = face.v
faceverts1 = tuple(v1.co) + tuple(v2.co) + tuple(v3.co)
faceverts2 = tuple(v3.co) + tuple(v4.co) + tuple(v1.co)
print "% f % f % f % f % f % f % f % f % f" % faceverts1
print "% f % f % f % f % f % f % f % f % f" % faceverts2
sys.stdout=std
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
mod_meshtools.print_boxed(message)
def fs_callback(filename):
if filename.find('.raw', -4) <= 0: filename += '.raw'
write(filename)
Blender.Window.FileSelector(fs_callback, "Raw Export")
#!BPY
"""
Name: 'Raw Triangle...'
Blender: 232
Group: 'Import'
Tooltip: 'Import Raw Triangle File Format (*.raw)'
"""
# +---------------------------------------------------------+
# | Copyright (c) 2002 Anthony D'Agostino |
# | http://ourworld.compuserve.com/homepages/scorpius |
# | scorpius@compuserve.com |
# | April 28, 2002 |
# | Released under the Blender Artistic Licence (BAL) |
# | Import Export Suite v0.5 |
# +---------------------------------------------------------+
# | Read and write RAW Triangle File Format (*.raw) |
# +---------------------------------------------------------+
import Blender
#import time
import mod_flags, mod_meshtools
# ==================================
# ==== Read RAW Triangle Format ====
# ==================================
def read(filename):
#start = time.clock()
file = open(filename, "rb")
# Collect data from RAW format
faces = []
for line in file.readlines():
try:
f1, f2, f3, f4, f5, f6, f7, f8, f9 = map(float, line.split())
faces.append([(f1, f2, f3), (f4, f5, f6), (f7, f8, f9)])
except: # Quad
f1, f2, f3, f4, f5, f6, f7, f8, f9, A, B, C = map(float, line.split())
faces.append([(f1, f2, f3), (f4, f5, f6), (f7, f8, f9), (A, B, C)])
# Generate verts and faces lists, without duplicates
verts = []
coords = {}
index = 0
for i in range(len(faces)):
for j in range(len(faces[i])):
vertex = faces[i][j]
if not coords.has_key(vertex):
coords[vertex] = index
index += 1
verts.append(vertex)
faces[i][j] = coords[vertex]
objname = Blender.sys.splitext(Blender.sys.basename(filename))[0]
mod_meshtools.create_mesh(verts, faces, objname)
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
mod_meshtools.print_boxed(message)
def fs_callback(filename):
read(filename)
Blender.Window.FileSelector(fs_callback, "Raw Import")
#!BPY
"""
Name: 'Videoscape (with Vertex Colors)...'
Blender: 232
Group: 'Export'
Tooltip: 'Export selected mesh to VideoScape File Format (*.obj)'
"""
# +---------------------------------------------------------+
# | Copyright (c) 2001 Anthony D'Agostino |
# | http://ourworld.compuserve.com/homepages/scorpius |
# | scorpius@compuserve.com |
# | June 5, 2001 |
# | Released under the Blender Artistic Licence (BAL) |
# | Import Export Suite v0.5 |
# +---------------------------------------------------------+
# | Write Videoscape File Format (*.obj NOT WAVEFRONT OBJ) |
# | Includes a *fast* algorithm for averaging vertex colors |
# | Blender's a|w doesn't export proper vertex colors |
# +---------------------------------------------------------+
import Blender, mod_meshtools
#import time
import mod_flags
# =====================================
# ====== Write VideoScape Format ======
# =====================================
def write(filename):
#start = time.clock()
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 mesh.hasVertexColours():
message = "Please assign vertex colors before exporting.\n"
message += objname + " object was not saved."
mod_meshtools.print_boxed(message)
return
vcols = average_vertexcolors(mesh)
# === Write Videoscape Header ===
file.write("GOUR\n")
file.write("%d\n" % len(mesh.verts))
# === Write Vertex List & Vertex Colors ===
for i in range(len(mesh.verts)):
if not i%100 and mod_flags.show_progress:
Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts")
file.write("% f % f % f 0x" % tuple(mesh.verts[i].co))
for j in range(len(vcols[i])):
file.write("%02X" % vcols[i][j])
file.write("\n")
# === Write Face List ===
for i in range(len(mesh.faces)):
if not i%100 and mod_flags.show_progress:
Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Faces")
file.write("%d " % len(mesh.faces[i].v)) # numfaceverts
for j in range(len(mesh.faces[i].v)):
file.write("%d " % mesh.faces[i].v[j].index)
file.write("\n")
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
mod_meshtools.print_boxed(message)
# ===========================================
# === Vector Operations for Vertex Colors ===
# ===========================================
vcolor_add = lambda u, v: [u[0]+v[0], u[1]+v[1], u[2]+v[2], u[3]+v[3]]
vcolor_div = lambda u, s: [u[0]/s, u[1]/s, u[2]/s, u[3]/s]
# ========================================
# === Average All Vertex Colors (Fast) ===
# ========================================
def average_vertexcolors(mesh, debug=0):
vertexcolors = {}
for i in range(len(mesh.faces)): # get all vcolors that share this vertex
if not i%100 and mod_flags.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Finding Shared VColors")
for j in range(len(mesh.faces[i].v)):
index = mesh.faces[i].v[j].index
color = mesh.faces[i].col[j]
r,g,b,a = color.r, color.g, color.b, color.a
vertexcolors.setdefault(index, []).append([r,g,b,a])
if debug: print 'before'; vcprint(vertexcolors)
for i in range(len(vertexcolors)): # average them
if not i%100 and mod_flags.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Averaging Vertex Colors")
vcolor = [0,0,0,0] # rgba
for j in range(len(vertexcolors[i])):
vcolor = vcolor_add(vcolor, vertexcolors[i][j])
shared = len(vertexcolors[i])
vertexcolors[i] = vcolor_div(vcolor, shared)
if debug: print 'after'; vcprint(vertexcolors)
return vertexcolors
# ========================================
# === Average all Vertex Colors Slow 1 ===
# ========================================
def average_vertexcolors_slow_1(mesh, debug=0):
vertexcolors = []
i = 0
for vertex in mesh.verts:
if not i%100 and mod_flags.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Averaging Vertex Colors")
i += 1
vcolor = [0,0,0,0] # rgba
shared = 0
for face in mesh.faces:
if vertex in face.v:
index = face.v.index(vertex)
color = face.col[index]
r,g,b,a = color.r, color.g, color.b, color.a
vcolor = vcolor_add(vcolor, [r,g,b,a])
shared += 1
if not shared: print "Error, vertex %d is not shared." % i; shared += 1
vertexcolors.append(vcolor_div(vcolor, shared))
if debug: print 'after'; vcprint(vertexcolors)
return vertexcolors
# ========================================
# === Average all Vertex Colors Slow 2 ===
# ========================================
def average_vertexcolors_slow_2(mesh, debug=0):
vertexcolors = []
for i in range(len(mesh.verts)):
if not i%100 and mod_flags.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Averaging Vertex Colors")
vcolor = [0,0,0,0] # rgba
shared = 0
for j in range(len(mesh.faces)):
if mesh.verts[i] in mesh.faces[j].v:
index = mesh.faces[j].v.index(mesh.verts[i])
color = mesh.faces[j].col[index]
r,g,b,a = color.r, color.g, color.b, color.a
vcolor = vcolor_add(vcolor, [r,g,b,a])
shared += 1
vertexcolors.append(vcolor_div(vcolor, shared))
if debug: print 'after'; vcprint(vertexcolors)
return vertexcolors
# ========================================
# === Average all Vertex Colors Slow 3 ===
# ========================================
def average_vertexcolors_slow_3(mesh, debug=0):
vertexcolors = []
for i in range(len(mesh.verts)):
if not i%100 and mod_flags.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Averaging Vertex Colors")
vcolor = [0,0,0,0] # rgba
shared = 0
for j in range(len(mesh.faces)):
if len(mesh.faces[j].v) == 4:
v1,v2,v3,v4 = mesh.faces[j].v
faceverts = v1.index, v2.index, v3.index, v4.index
else:
v1,v2,v3 = mesh.faces[j].v
faceverts = v1.index, v2.index, v3.index
if i in faceverts:
index = mesh.faces[j].v.index(mesh.verts[i])
color = mesh.faces[j].col[index]
r,g,b,a = color.r, color.g, color.b, color.a
vcolor = vcolor_add(vcolor, [r,g,b,a])
shared += 1
vertexcolors.append(vcolor_div(vcolor, shared))
if debug: print 'after'; vcprint(vertexcolors)
return vertexcolors
def fs_callback(filename):
if filename.find('.obj', -4) <= 0: filename += '.VIDEOSCAPE.obj'
write(filename)
Blender.Window.FileSelector(fs_callback, "Videoscape Export")
# filename = "VIDEOSCAPE_" + objname + ".obj"
# filename = 'nul'
# file = open(filename, "wb")
# debug = 0
# time_functions = 1
# time_loop = 0
#
# if time_functions:
# funcs = [ average_vertexcolors,
# average_vertexcolors_slow_1,
# average_vertexcolors_slow_2,
# average_vertexcolors_slow_3 ]
#
# print
# for func in funcs:
# start = time.clock()
# vcols = func(mesh, debug)
# end = time.clock()
# seconds = "in %.2f %s" % (end-start, "seconds")
# print func.__name__, "finished in", seconds
#
# elif time_loop:
# total = 0
# loops = 6
# for i in range(loops):
# start = time.clock()
# vcols = average_vertexcolors(mesh, debug)
# end = time.clock()
# total += (end-start)
# print "Total: %5.2f Avg: %.2f " % (total, total/loops)
# else:
# start = time.clock()
# vcols = average_vertexcolors(mesh, debug)
# # =====================================
# # === Print Vertex Colors for Debug ===
# # =====================================
# def vcprint(data):
# print type(data)
# for i in range(len(data)):
# print "%2d" % i,
# for j in range(len(data[i])):
# try:
# print "[%3d %3d %3d %3d]" % tuple(data[i][j]), # before
# except:
# print "[%3d]" % data[i][j], # after
# print
# print
#
This diff is collapsed.
...@@ -396,8 +396,6 @@ int BPY_txt_do_python(struct SpaceText* st) ...@@ -396,8 +396,6 @@ int BPY_txt_do_python(struct SpaceText* st)
if (!st->text) return 0; if (!st->text) return 0;
PyErr_Clear();
/* check if this text is already running */ /* check if this text is already running */
while (script) { while (script) {
if (!strcmp(script->id.name+2, st->text->id.name+2)) { if (!strcmp(script->id.name+2, st->text->id.name+2)) {
...@@ -488,8 +486,6 @@ int BPY_menu_do_python(short menutype, int event) ...@@ -488,8 +486,6 @@ int BPY_menu_do_python(short menutype, int event)
if (!pym) return 0; if (!pym) return 0;
PyErr_Clear();
if (pym->version > G.version) if (pym->version > G.version)
notice ("Version mismatch: script was written for Blender %d. " notice ("Version mismatch: script was written for Blender %d. "
"It may fail with yours: %d.", pym->version, G.version); "It may fail with yours: %d.", pym->version, G.version);
...@@ -632,6 +628,11 @@ void BPY_free_finished_script(Script *script) ...@@ -632,6 +628,11 @@ void BPY_free_finished_script(Script *script)
{ {
if (!script) return; if (!script) return;
if (PyErr_Occurred()) { /* if script ended after filesel */
PyErr_Print(); /* eventual errors are handled now */
error ("Python script error: check console");
}
free_libblock(&G.main->script, script); free_libblock(&G.main->script, script);
return; return;
} }
......
...@@ -14,11 +14,11 @@ mouse button code values in its dictionary (print dir(Blender.Draw)). ...@@ -14,11 +14,11 @@ mouse button code values in its dictionary (print dir(Blender.Draw)).
Example:: Example::
import Blender import Blender
from Blender import Draw, BGL from Blender import Draw, BGL
#
mystring = "" mystring = ""
mymsg = "" mymsg = ""
toggle = 0 toggle = 0
#
def event(evt, val): # the function to handle input events def event(evt, val): # the function to handle input events
global mystring, mymsg global mystring, mymsg
...@@ -36,19 +36,17 @@ Example:: ...@@ -36,19 +36,17 @@ Example::
elif evt == Draw.SPACEKEY: mystring += ' ' elif evt == Draw.SPACEKEY: mystring += ' '
elif evt == Draw.BACKSPACEKEY and len(mystring): elif evt == Draw.BACKSPACEKEY and len(mystring):
mystring = mystring[:-1] mystring = mystring[:-1]
else: return # this is important: only re-register if an event was caught else: return # no need to redraw if nothing changed
Draw.Redraw(1)
Draw.Register(gui, event, button_event) # re-register to stay in the loop
#
def button_event(evt): # the function to handle Draw Button events def button_event(evt): # the function to handle Draw Button events
global mymsg, toggle global mymsg, toggle
if evt == 1: if evt == 1:
mymsg = "You pressed the toggle button." mymsg = "You pressed the toggle button."
toggle = 1 - toggle toggle = 1 - toggle
Draw.Redraw(1) Draw.Redraw(1)
else:
Draw.Register(gui, event, button_event)
#
def gui(): # the function to draw the screen def gui(): # the function to draw the screen
global mystring, mymsg, toggle global mystring, mymsg, toggle
if len(mystring) > 90: mystring = "" if len(mystring) > 90: mystring = ""
...@@ -67,9 +65,14 @@ Example:: ...@@ -67,9 +65,14 @@ Example::
BGL.glColor3f(1,0.4,0.3) BGL.glColor3f(1,0.4,0.3)
BGL.glRasterPos2i(340, 70) BGL.glRasterPos2i(340, 70)
Draw.Text(mymsg, "tiny") Draw.Text(mymsg, "tiny")
#
Draw.Register(gui, event, button_event) # registering the 3 callbacks Draw.Register(gui, event, button_event) # registering the 3 callbacks
@note: The example above was fixed to call Draw.Register only once. It's
not necessary to re-register the callbacks, they will stay until Draw.Exit
is called. It's enough to redraw the screen when a relevant event is caught.
Apologies for the confusion.
@warn: Inside the windowing loop (after Draw.Register() has been executed and @warn: Inside the windowing loop (after Draw.Register() has been executed and
before Draw.Exit() is called), don't use the redraw functions from other before Draw.Exit() is called), don't use the redraw functions from other
modules (Blender and Window). The Draw submodule has its own Draw.Redraw() and modules (Blender and Window). The Draw submodule has its own Draw.Redraw() and
......
...@@ -117,6 +117,8 @@ class Material: ...@@ -117,6 +117,8 @@ class Material:
that range: if val < Min, then val = Min, if val > Max, then val = Max. that range: if val < Min, then val = Min, if val > Max, then val = Max.
""" """
import Texture
def getName(): def getName():
""" """
Get the name of this Material object. Get the name of this Material object.
...@@ -471,3 +473,30 @@ class Material: ...@@ -471,3 +473,30 @@ class Material:
@type nrings: int @type nrings: int
@param nrings: The new value in [0, 24]. @param nrings: The new value in [0, 24].
""" """
def setTexture(index, texture, texco, mapto):
"""
Assign a Blender Texture object to slot number 'number'.
@type index: int
@param index: material's texture index in [0, 7].
@type texture: Blender Texture
@param texture: a Blender Texture object.
@type texco: int
@param texco: optional or'ed bitflag -- defaults to TexCo.ORCO. See TexCo var in L{Texture}.
@type mapto: int
@param mapto: optional or'ed bitflag -- defaults to MapTo.COL. See MapTo var in L{Texture}.
"""
def clearTexture(index):
"""
Clear the ith (given by 'index') texture channel of this material.
@type index: int
@param index: material's texture channel index in [0, 7].
"""
def getTextures ():
"""
Get this Material's Texture list.
@rtype: list
@return: a list of Blender Textures. None is returned for each empty texture slot.
"""
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment