forked from bartvdbraak/blender
bdc624452b
-- 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.
179 lines
5.8 KiB
Python
179 lines
5.8 KiB
Python
# +---------------------------------------------------------+
|
|
# | 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()
|
|
|