Scripts updated:
- Jean-Michel Soler: 1) paths import -- ai module; 2) tex2uvbaker; - Campbell Barton: obj exporter. BPython: - Campbell also provided a patch (+docs) to add shader data access to Blender.Material. Again, thanks guys and sorry for the long delay.
This commit is contained in:
@@ -316,6 +316,8 @@ def ligne_fermee(l,n0,CP):
|
||||
del courbes.ITEM[n0].beziers_knot[0]
|
||||
return courbes,n0,CP
|
||||
|
||||
def passe(l,n0,CP):
|
||||
return courbes,n0,CP
|
||||
|
||||
Actions= { "C" : courbe_vers_c,
|
||||
"c" : courbe_vers_c,
|
||||
@@ -326,12 +328,14 @@ Actions= { "C" : courbe_vers_c,
|
||||
"m" : mouvement_vers,
|
||||
"l" : ligne_tracee_l,
|
||||
"L" : ligne_tracee_l,
|
||||
|
||||
"F" : passe,
|
||||
"f" : ligne_fermee,
|
||||
"B" : passe,
|
||||
"b" : ligne_fermee,
|
||||
"S" : passe,
|
||||
"s" : ligne_fermee,
|
||||
|
||||
"N" : ligne_fermee,
|
||||
"n" : passe,
|
||||
}
|
||||
|
||||
TAGcourbe=Actions.keys()
|
||||
|
||||
@@ -21,7 +21,7 @@ Run this script from "File->Export" menu to export all meshes.
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# OBJ Export v0.9 by Campbell Barton (AKA Ideasman)
|
||||
# OBJ Export v0.9b by Campbell Barton (AKA Ideasman)
|
||||
# --------------------------------------------------------------------------
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
@@ -63,6 +63,7 @@ def save_mtl(filename):
|
||||
file.write('Kd %.6f %.6f %.6f\n' % tuple(mat.getRGBCol())) # Diffuse
|
||||
file.write('Ka %.6f %.6f %.6f\n' % tuple(mat.getMirCol())) # Ambient, uses mirror colour,
|
||||
file.write('Ks %.6f %.6f %.6f\n' % tuple(mat.getSpecCol())) # Specular
|
||||
file.write('Ni %.6f\n' % mat.getIOR()) # Refraction index
|
||||
file.write('d %.6f\n' % mat.getAlpha()) # Alpha (obj uses 'd' for dissolve)
|
||||
|
||||
# illum, 0 to disable lightng, 2 is normal.
|
||||
@@ -80,7 +81,7 @@ def save_obj(filename):
|
||||
save_mtl(mtlfilename)
|
||||
|
||||
file = open(filename, "w")
|
||||
|
||||
|
||||
# Write Header
|
||||
file.write('# Blender OBJ File: %s\n' % (Get('filename')))
|
||||
file.write('# www.blender.org\n')
|
||||
@@ -91,6 +92,8 @@ def save_obj(filename):
|
||||
# Initialize totals, these are updated each object
|
||||
totverts = totuvco = 0
|
||||
|
||||
globalUVCoords = {}
|
||||
|
||||
# Get all meshs
|
||||
for ob in scn.getChildren():
|
||||
if ob.getType() != 'Mesh':
|
||||
@@ -100,7 +103,14 @@ def save_obj(filename):
|
||||
|
||||
if not m.faces: # Make sure there is somthing to write
|
||||
continue #dont bother with this mesh.
|
||||
|
||||
|
||||
faces = [ f for f in m.faces if len(f) > 2 ]
|
||||
materials = m.materials
|
||||
|
||||
# Sort by Material so we dont over context switch in the obj file.
|
||||
if len(materials) > 1:
|
||||
faces.sort(lambda a,b: cmp(a.mat, b.mat))
|
||||
|
||||
# Set the default mat
|
||||
currentMatName = NULL_MAT
|
||||
currentImgName = NULL_IMG
|
||||
@@ -112,24 +122,27 @@ def save_obj(filename):
|
||||
file.write('v %.6f %.6f %.6f\n' % tuple(v.co))
|
||||
|
||||
# UV
|
||||
for f in m.faces:
|
||||
for uvIdx in range(len(f.v)):
|
||||
if f.uv:
|
||||
file.write('vt %.6f %.6f 0.0\n' % f.uv[uvIdx])
|
||||
else:
|
||||
file.write('vt 0.0 0.0 0.0\n')
|
||||
|
||||
if m.hasFaceUV():
|
||||
for f in faces:
|
||||
for uv in f.uv:
|
||||
uvKey = '%.6f %.6f' % uv
|
||||
try:
|
||||
dummy = globalUVCoords[uvKey]
|
||||
except KeyError:
|
||||
totuvco +=1 # 1 based index.
|
||||
globalUVCoords[uvKey] = totuvco
|
||||
file.write('vt %s 0.0\n' % uvKey)
|
||||
|
||||
# NORMAL
|
||||
for f in m.faces:
|
||||
for v in f.v:
|
||||
file.write('vn %.6f %.6f %.6f\n' % tuple(v.no))
|
||||
for v in m.verts:
|
||||
file.write('vn %.6f %.6f %.6f\n' % tuple(v.no))
|
||||
|
||||
uvIdx = 0
|
||||
for f in m.faces:
|
||||
for f in faces:
|
||||
# Check material and change if needed.
|
||||
if len(m.materials) > f.mat:
|
||||
if currentMatName != m.materials[f.mat].getName():
|
||||
currentMatName = m.materials[f.mat].getName()
|
||||
if len(materials) > 0:
|
||||
if currentMatName != materials[f.mat].getName():
|
||||
currentMatName = materials[f.mat].getName()
|
||||
file.write('usemtl %s\n' % (currentMatName))
|
||||
|
||||
elif currentMatName != NULL_MAT:
|
||||
@@ -146,19 +159,23 @@ def save_obj(filename):
|
||||
|
||||
elif currentImgName != NULL_IMG: # Not using an image so set to NULL_IMG
|
||||
currentImgName = NULL_IMG
|
||||
# Set a new image for all following faces
|
||||
# Set a ne w image for all following faces
|
||||
file.write( 'usemap %s\n' % currentImgName) # No splitting needed.
|
||||
|
||||
file.write('f ')
|
||||
for v in f.v:
|
||||
file.write( '%s/%s/%s ' % (v.index + totverts+1, uvIdx+totuvco+1, uvIdx+totuvco+1))
|
||||
|
||||
uvIdx+=1
|
||||
|
||||
file.write('f')
|
||||
if m.hasFaceUV():
|
||||
for vi, v in enumerate(f.v):
|
||||
uvIdx = globalUVCoords[ '%.6f %.6f' % f.uv[vi] ]
|
||||
i = v.index + totverts + 1
|
||||
file.write( ' %d/%d/%d' % (i, uvIdx, i)) # vert, uv, normal
|
||||
|
||||
else: # No UV's
|
||||
for v in f.v:
|
||||
file.write( ' %d' % (v.index + totverts+1))
|
||||
file.write('\n')
|
||||
|
||||
# Make the indicies global rather then per mesh
|
||||
totverts += len(m.verts)
|
||||
totuvco += uvIdx
|
||||
file.close()
|
||||
print "obj export time: %.2f" % (sys.time() - time1)
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ __author__ = "Jean-Michel Soler (jms)"
|
||||
__url__ = ("blender", "elysiun",
|
||||
"Official Page, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_mesh3d2uv2d_en.htm",
|
||||
"Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender")
|
||||
__version__ = "0.2.6 2005/5/29"
|
||||
__version__ = "0.2.8 2005/7/20"
|
||||
|
||||
__bpydoc__ = """\
|
||||
Texture Baker "bakes" Blender procedural materials (including textures): it saves them as 2d uv-mapped images.
|
||||
@@ -37,7 +37,7 @@ Notes:<br>
|
||||
"""
|
||||
|
||||
#---------------------------------------------
|
||||
# Last release : 0.2.6 , 2005/05/29 , 22h00
|
||||
# Last release : 0.2.8 , 2005/07/20 , 17h10
|
||||
#---------------------------------------------
|
||||
#---------------------------------------------
|
||||
# (c) jm soler 07/2004 : 'Procedural Texture Baker'
|
||||
@@ -47,6 +47,26 @@ Notes:<br>
|
||||
#
|
||||
# Released under Blender Artistic Licence
|
||||
#
|
||||
# 0.2.8
|
||||
# -- added the forgotten image property in face
|
||||
# data. a little longer but better.
|
||||
# ( a remove double in the resulting mesh may be
|
||||
# useful .)
|
||||
# -- the data.update() function problem is
|
||||
# corrected too
|
||||
# -- no more layers problem . CAM and MESH are
|
||||
# localised in layer 20 . This layer is
|
||||
# the active one for the image rendering .
|
||||
# -- mesh creation is cleaner, loop in double was
|
||||
# removed and the abskey is set in frame 1
|
||||
# only . This solves an other deform problem .
|
||||
# -- if user does not want an autosaved image,
|
||||
# the "no replace" option leaves the render
|
||||
# window on the screen
|
||||
#
|
||||
# 0.2.7
|
||||
# -- minor correction on line 147: "!=-1" added
|
||||
#
|
||||
# 0.2.6
|
||||
# -- Creation of LAMP object is removed and replaced
|
||||
# by the use of the shadeless option in material object
|
||||
@@ -142,7 +162,7 @@ DIRNAME=Blender.Get('filename')
|
||||
# the file name from the path name
|
||||
#-----------------------------------
|
||||
|
||||
if DIRNAME.find(os.sep):
|
||||
if DIRNAME.find(os.sep)!=-1:
|
||||
k0=DIRNAME.split(os.sep)
|
||||
else:
|
||||
k0=DIRNAME.split('/')
|
||||
@@ -178,6 +198,8 @@ LIMIT=0
|
||||
XYLIMIT = [0.0, 0.0,1.0,1.0]
|
||||
OBJPOS = 100.0
|
||||
DEBUG=1
|
||||
RENDERLAYER=20
|
||||
SCENELAYERS=[]
|
||||
|
||||
helpmsg = """
|
||||
Texture Baker:
|
||||
@@ -234,7 +256,7 @@ def RenameImage(RDIR, MYDIR, FILENAME, name):
|
||||
name = Draw.PupStrInput ('ReName Image, please :', name, 32)
|
||||
RenameImage(RDIR, MYDIR, FILENAME, name)
|
||||
|
||||
def SAVE_image (rc, name, FRAME):
|
||||
def SAVE_image (rc, name, FRAME, result):
|
||||
"""
|
||||
# ---------------------------
|
||||
# Function SAVE_image
|
||||
@@ -268,26 +290,25 @@ def SAVE_image (rc, name, FRAME):
|
||||
rc.startFrame(NEWFRAME)
|
||||
rc.endFrame(NEWFRAME)
|
||||
rc.renderAnim()
|
||||
Blender.Scene.Render.CloseRenderWindow()
|
||||
|
||||
FILENAME = "%04d" % NEWFRAME
|
||||
FILENAME = FILENAME.replace (' ', '0')
|
||||
FILENAME = RDIR + MYDIR + FILENAME + '.png'
|
||||
|
||||
RenameImage(RDIR, MYDIR, FILENAME, name)
|
||||
|
||||
if result!=2 and not KEEPRENDERWINDOW:
|
||||
Blender.Scene.Render.CloseRenderWindow()
|
||||
FILENAME = "%04d" % NEWFRAME
|
||||
FILENAME = FILENAME.replace (' ', '0')
|
||||
FILENAME = RDIR + MYDIR + FILENAME + '.png'
|
||||
RenameImage(RDIR, MYDIR, FILENAME, name)
|
||||
|
||||
rc.endFrame(OLDEFRAME)
|
||||
rc.startFrame(OLDSFRAME)
|
||||
rc.setRenderPath(RENDERDIR)
|
||||
|
||||
def SHOOT (XYlimit, frame, obj, name, FRAME):
|
||||
def SHOOT (XYlimit, frame, obj, name, FRAME, result):
|
||||
"""
|
||||
# ---------------------------
|
||||
# Function SHOOT
|
||||
#
|
||||
# IN : XYlimit list of 4 floats, smallest and biggest
|
||||
# uvcoords
|
||||
# frame cureente frame
|
||||
# frame current frame
|
||||
# obj for object location
|
||||
# name image name
|
||||
# FRAME the last animation's frame
|
||||
@@ -305,6 +326,7 @@ def SHOOT (XYlimit, frame, obj, name, FRAME):
|
||||
CAM, SC = GET_newobject('Camera','UVCAMERA')
|
||||
CAM.link(Cam)
|
||||
CAM.setName('UVCAMERA')
|
||||
CAM.layers=[RENDERLAYER]
|
||||
Cam.lens = 30
|
||||
Cam.name = 'UVCamera'
|
||||
|
||||
@@ -333,13 +355,15 @@ def SHOOT (XYlimit, frame, obj, name, FRAME):
|
||||
elif (tres) == 5: res = 2048
|
||||
else: res = 512
|
||||
|
||||
SCENELAYERS=SC.layers
|
||||
SC.layers = [20]
|
||||
context.imageSizeY(res)
|
||||
context.imageSizeX(res)
|
||||
SAVE_image (context, name, FRAME)
|
||||
SAVE_image (context, name, FRAME, result)
|
||||
context.imageSizeY(OLDy)
|
||||
context.imageSizeX(OLDx)
|
||||
|
||||
if Camold :SC.setCurrentCamera(Camold)
|
||||
SC.layers = SCENELAYERS
|
||||
if Camold : SC.setCurrentCamera(Camold)
|
||||
|
||||
Blender.Set ('curframe', frame)
|
||||
|
||||
@@ -393,6 +417,8 @@ def Mesh2UVCoord (LIMIT):
|
||||
# OUT: nothing
|
||||
# ---------------------------
|
||||
"""
|
||||
global PUTRAW, FRAME, SCENELAYERS
|
||||
|
||||
try:
|
||||
MESH3D = Object.GetSelected()[0]
|
||||
if MESH3D.getType() == 'Mesh':
|
||||
@@ -401,18 +427,21 @@ def Mesh2UVCoord (LIMIT):
|
||||
try:
|
||||
NewOBJECT=Blender.Object.Get('UVOBJECT')
|
||||
CurSCENE=Blender.Scene.getCurrent()
|
||||
MESH2 = NewOBJECT.getData()
|
||||
|
||||
except:
|
||||
NewOBJECT, CurSCENE = GET_newobject('Mesh','UVOBJECT')
|
||||
MESH2 = Blender.NMesh.GetRaw()
|
||||
MESH2 = NewOBJECT.getData()
|
||||
NewOBJECT.layers=[RENDERLAYER]
|
||||
|
||||
MESH2.faces=[]
|
||||
for f in MESH.faces:
|
||||
f1 = Blender.NMesh.Face()
|
||||
|
||||
for v in f.v:
|
||||
v1 = Blender.NMesh.Vert (v.co[0], v.co[1], v.co[2])
|
||||
v1 = Blender.NMesh.Vert (0.0, 0.0, 0.0)
|
||||
for n in [0,1]:
|
||||
v1.co[n] = f.uv[f.v.index(v)][n]
|
||||
exec "if v1.co[%s] > XYLIMIT[%s]: XYLIMIT[%s] = v1.co[%s]" % (n, n+2, n+2, n)
|
||||
exec "if v1.co[%s] < XYLIMIT[%s]: XYLIMIT[%s] = v1.co[%s]" % (n, n, n, n)
|
||||
v1.co[2] = 0.0
|
||||
MESH2.verts.append(v1)
|
||||
f1.v.append(MESH2.verts[len(MESH2.verts) - 1])
|
||||
|
||||
@@ -423,32 +452,23 @@ def Mesh2UVCoord (LIMIT):
|
||||
f1.mode = f.mode
|
||||
f1.flag = f.flag
|
||||
f1.mat = f.mat
|
||||
#-----------------------------------
|
||||
# release : 0.2.8 , 2005/07/19 , end
|
||||
#-----------------------------------
|
||||
try:
|
||||
f1.image=f.image
|
||||
except :
|
||||
pass
|
||||
|
||||
MESH2.materials = MESH.materials[:]
|
||||
|
||||
NewOBJECT.setLocation (OBJPOS, OBJPOS, 0.0)
|
||||
NewOBJECT.setEuler (0.0, 0.0, 0.0)
|
||||
|
||||
MESH2.removeAllKeys()
|
||||
|
||||
MESH2.update()
|
||||
MESH2.insertKey (1, 'absolute')
|
||||
MESH2.update()
|
||||
|
||||
for f in MESH2.faces:
|
||||
for v in f.v:
|
||||
for n in [0,1]:
|
||||
v.co[n] = f.uv[f.v.index(v)][n]
|
||||
exec "if v.co[%s] > XYLIMIT[%s]: XYLIMIT[%s] = v.co[%s]" % (n, n+2, n+2, n)
|
||||
exec "if v.co[%s] < XYLIMIT[%s]: XYLIMIT[%s] = v.co[%s]" % (n, n, n, n)
|
||||
v.co[2] = 0.0
|
||||
|
||||
if DEBUG: print XYLIMIT
|
||||
|
||||
MESH2.update()
|
||||
MESH2.insertKey (FRAME, 'absolute')
|
||||
MESH2.update()
|
||||
|
||||
imagename = 'uvtext'
|
||||
|
||||
name = "CHANGE IMAGE NAME ? %t | Replace it | No replacing | Script help"
|
||||
@@ -467,9 +487,9 @@ def Mesh2UVCoord (LIMIT):
|
||||
#-----------------------------------
|
||||
|
||||
if LIMIT :
|
||||
SHOOT(XYLIMIT, FRAME, NewOBJECT, imagename, FRAME)
|
||||
SHOOT(XYLIMIT, FRAME, NewOBJECT, imagename, FRAME,result)
|
||||
else :
|
||||
SHOOT([0.0,0.0,1.0,1.0], FRAME, NewOBJECT, imagename, FRAME)
|
||||
SHOOT([0.0,0.0,1.0,1.0], FRAME, NewOBJECT, imagename, FRAME, result)
|
||||
#-----------------------------------
|
||||
# release : 0.2.6, 2005/05/29 , 00h00
|
||||
#-----------------------------------
|
||||
|
||||
Reference in New Issue
Block a user