diff options
Diffstat (limited to 'release/scripts/mod_meshtools.py')
-rw-r--r-- | release/scripts/mod_meshtools.py | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/release/scripts/mod_meshtools.py b/release/scripts/mod_meshtools.py new file mode 100644 index 00000000000..dbcdab513d5 --- /dev/null +++ b/release/scripts/mod_meshtools.py @@ -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() + |