blender/release/scripts/tex2uvbaker.py

255 lines
6.9 KiB
Python
Raw Normal View History

#!BPY
""" Registration info for Blender menus:
Name: 'Texture Baker'
Blender: 233
Group: 'UV'
Tooltip: 'Procedural to uvmapped texture baker'
"""
#---------------------------------------------
# Last release : 0.2.2 , 2004/08/01 , 22h13
#---------------------------------------------
#---------------------------------------------
# (c) jm soler 07/2004 : 'Procedural Texture Baker'
# Based on a Martin Theeth' Poirier's really
# good idea :
# it makes a rvk mesh with uv coords of the
# original mesh.
# released under Blender Artistic Licence
#
# 0.2.2 : if the uv mesh objet exists it used,
# no creation of a new one. As the lamp and
# the camera
# 0.2.1 : This script automaticaly frame and shoot the
# new uv mesh . The image file is saved ine the
# /render folder.
#
#---------------------------------------------
# On user-friendly side :
#---------------------------------------------
#- Tadje Vobovnik adds the Select Image Size Menu
#
#---------------------------------------------
# Official Page :
# http://jmsoler.free.fr/util/blenderfile/py/text2uvbaker.py
# For problems and errors:
# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
#---------------------------------------------
import Blender
from Blender import NMesh, Draw, Object, Scene, Camera
FRAME = 100
XYLIMIT = [0.0, 0.]
OBJPOS = 100.0
helpmsg = """
Texture Baker:
This script saves an uv texture layout of the chosen mesh, that can be used as
an uv map for it. It is a way to export procedural textures from Blender as
normal image textures that can be edited with a 2d image manipulation program
or used with the mesh in games and other 3d applications.
Basic instructions:
- Enter face mode and define uv coordinates for your mesh;
- Define its materials and textures and set "Map Input" coordinates to UV;
- Run this script and check the console.
"""
def GET_newobject (TYPE):
SCENE = Blender.Scene.getCurrent()
OBJECT = Blender.Object.New(TYPE)
SCENE.link(OBJECT)
return OBJECT, SCENE
def SAVE_image (rc, name, FRAME):
MYDIR = ''
RENDERDIR = rc.getRenderPath()
rc.setRenderPath(RENDERDIR + MYDIR)
print "Render folder:", RENDERDIR + MYDIR
IMAGETYPE = Blender.Scene.Render.PNG
rc.setImageType(IMAGETYPE)
NEWFRAME = FRAME
OLDEFRAME = rc.endFrame()
OLDSFRAME = rc.startFrame()
rc.startFrame(NEWFRAME)
rc.endFrame(NEWFRAME)
rc.renderAnim()
try:
import nt
os = nt
except:
import posix
os = posix
FILENAME = "%04d" % NEWFRAME
FILENAME = FILENAME.replace (' ', '0')
FILENAME = RENDERDIR + MYDIR + FILENAME + '.png'
try:
TRUE = os.stat(FILENAME)
newfname = RENDERDIR + MYDIR + name
if newfname.find('.png', -4) < 0: newfname += '.png'
os.rename(FILENAME, newfname)
print "Renamed to:", newfname
except:
pass
rc.endFrame(OLDEFRAME)
rc.startFrame(OLDSFRAME)
rc.setRenderPath(RENDERDIR)
def SHOOT (XYlimit, frame, obj, name, FRAME):
try:
CAM = Blender.Object.Get('UVCAMERA')
Cam = CAM.getData()
SC = Blender.Scene.getCurrent()
except:
Cam = Blender.Camera.New()
Cam.name = 'UVCamera'
CAM, SC = GET_newobject('Camera')
CAM.link(Cam)
CAM.setName('UVCAMERA')
Cam.lens = 30
Cam.name = 'UVCamera'
CAM.setLocation(obj.getLocation())
CAM.LocX += XYlimit[0] / 2.0
CAM.LocY += XYlimit[1] / 2.0
CAM.LocZ += max (XYlimit[0], XYlimit[1])
CAM.setEuler (0.0, 0.0, 0.0)
try:
LAMP = Blender.Object.Get('Eclairage')
lampe = LAMP.getData()
SC = Blender.Scene.getCurrent()
except:
lampe = Blender.Lamp.New()
lampe.name = 'lumin'
LAMP, SC = GET_newobject('Lamp')
LAMP.link(lampe)
LAMP.setName('Eclairage')
LAMP.setLocation(obj.getLocation())
LAMP.LocX += XYlimit[0] / 2.0
LAMP.LocY += XYlimit[1] / 2.0
LAMP.LocZ += max (XYlimit[0], XYlimit[1])
LAMP.setEuler (0.0, 0.0, 0.0)
context = SC.getRenderingContext()
Camold = SC.getCurrentCamera()
SC.setCurrentCamera(CAM)
OLDy = context.imageSizeY()
OLDx = context.imageSizeX()
tres = Draw.PupMenu('TEXTURE OUT RESOLUTION : %t | 256 %x1 | 512 %x2 | 768 %x3 | 1024 %x4')
if (tres) == 1: res = 256
elif (tres) == 2: res = 512
elif (tres) == 3: res = 768
elif (tres) == 4: res = 1024
else: res = 512
context.imageSizeY(res)
context.imageSizeX(res)
SAVE_image (context, name, FRAME)
context.imageSizeY(OLDy)
context.imageSizeX(OLDx)
SC.setCurrentCamera(Camold)
Blender.Set ('curframe', frame)
def Mesh2UVCoord ():
try:
MESH3D = Object.GetSelected()[0]
if MESH3D.getType() == 'Mesh':
MESH = MESH3D.getData()
MESH2 = Blender.NMesh.GetRaw()
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])
MESH2.verts.append(v1)
f1.v.append(MESH2.verts[len(MESH2.verts) - 1])
MESH2.faces.append(f1)
f1.uv = f.uv[:]
f1.col = f.col[:]
f1.smooth = f.smooth
f1.mode = f.mode
f1.flag = f.flag
f1.mat = f.mat
MESH2.materials = MESH.materials[:]
try:
NewOBJECT=Blender.Object.Get('UVOBJECT')
CurSCENE=Blender.Scene.getCurrent()
except:
NewOBJECT, CurSCENE = GET_newobject('Mesh')
NewOBJECT.link(MESH2)
#NewOBJECT, CurSCENE = GET_newobject('Mesh')
#NewOBJECT.link(MESH2)
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, n, n)
v.co[2] = 0.0
print XYLIMIT
MESH2.update()
MESH2.insertKey (FRAME, 'absolute')
MESH2.update()
imagename = 'uvtext'
name = "CHANGE IMAGE NAME ? %t | Replace it | No replace | Script help"
result = Draw.PupMenu(name)
if result == 1:
imagename = Draw.PupStrInput ('Image Name:', imagename, 32)
if result != 3:
SHOOT (XYLIMIT, FRAME, NewOBJECT, imagename, FRAME)
Blender.Redraw()
else:
Draw.PupMenu("Ready%t|Please check console for instructions")
print helpmsg
else:
name = "Error%t|Active object is not a mesh or has no UV coordinates"
result = Draw.PupMenu(name)
print 'problem : no object selected or not mesh'
except:
name = "Error%t|Active object is not a mesh or has no UV coordinates"
result = Draw.PupMenu(name)
print 'problem : no object selected or not mesh'
Mesh2UVCoord()