blender/release/scripts/image_bake_texture.py

106 lines
2.7 KiB
Python
Raw Normal View History

#!BPY
"""
Name: 'Bake Texture Image from UVs'
Blender: 242
Group: 'Image'
Tooltip: 'Generate a texture image from the selected mesh objects UV coords'
"""
__author__= ['Campbell Barton']
__url__= ('blender', 'elysiun', 'http://www.gametutorials.com')
__version__= '0.1'
__bpydoc__= '''\
Bake Procedural Textures to an image
This script makes an image from a meshes textures, using the UV coordinates
to draw the faces into the image.
Make sure your UV Coordinates do not overlap.
LSCM Unwrapper or archimap unwrapper work well to automaticaly do this.
'''
import Blender
import BPyRender
reload(BPyRender)
import BPyMessages
Vector= Blender.Mathutils.Vector
Create= Blender.Draw.Create
def main():
# Create the variables.
# Filename without path or extension.
# Big LC, gets all unique mesh objects from the selection that have UV coords.
me_s= dict([\
(ob.getData(name_only=1), ob.getData(mesh=1))\
for ob in Blender.Object.GetSelected()\
if ob.getType()=='Mesh' if ob.getData(mesh=1).faceUV]).values()
if not me_s:
BPyMessages.Error_NoMeshUvSelected()
return
newpath= Blender.Get('filename').split('/')[-1].split('\\')[-1].replace('.blend', '_tex.png')
PREF_IMAGE_PATH = Create('//%s_wire' % newpath)
PREF_IMAGE_SIZE = Create(512)
PREF_IMAGE_BLEED = Create(4)
PREF_IMAGE_SMOOTH= Create(0)
PREF_SEL_FACES_ONLY= Create(0)
pup_block = [\
('Pixel Size:', PREF_IMAGE_SIZE, 64, 4096, 'Image Width and Height.'),\
('Pixel Bleed:', PREF_IMAGE_BLEED, 0, 64, 'Extend pixels from boundry edges to avoid mipmapping errors on rendering.'),\
('Smooth lines', PREF_IMAGE_SMOOTH, 'Render smooth lines.'),\
'',\
('Selected Faces only', PREF_SEL_FACES_ONLY, 'Only bake from selected faces.'),\
]
if not Blender.Draw.PupBlock('Wire Bake', pup_block):
return
# Defaults for VCol, user cant change
PREF_IMAGE_WIRE= False
PREF_USE_IMAGE= False
PREF_IMAGE_WIRE_INVERT= False
PREF_IMAGE_WIRE_UNDERLAY= False
PREF_USE_VCOL= False
PREF_USE_MATCOL= False
PREF_USE_NORMAL= False
PREF_USE_TEXTURE= True # of course we need this one
def file_sel(PREF_IMAGE_PATH):
if not (BPyMessages.Warning_SaveOver(PREF_IMAGE_PATH) and \
BPyMessages.Warning_SaveOver(PREF_IMAGE_PATH+'.png')):
return
image = BPyRender.vcol2image(me_s,\
PREF_IMAGE_PATH,\
PREF_IMAGE_SIZE.val,\
PREF_IMAGE_BLEED.val,\
PREF_IMAGE_SMOOTH.val,\
PREF_IMAGE_WIRE,\
PREF_IMAGE_WIRE_INVERT,\
PREF_IMAGE_WIRE_UNDERLAY,\
PREF_USE_IMAGE,\
PREF_USE_VCOL,\
PREF_USE_MATCOL,\
PREF_USE_NORMAL,\
PREF_USE_TEXTURE,\
PREF_SEL_FACES_ONLY.val)
if image:
image.makeCurrent()
Blender.Window.RedrawAll()
Blender.Window.FileSelector(file_sel, 'SAVE PNG', newpath)
if __name__ == '__main__':
main()