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.
This commit is contained in:
178
release/scripts/mod_meshtools.py
Normal file
178
release/scripts/mod_meshtools.py
Normal file
@@ -0,0 +1,178 @@
|
||||
# +---------------------------------------------------------+
|
||||
# | 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()
|
||||
|
||||
Reference in New Issue
Block a user