blender/release/scripts/image_bake_normals.py
Campbell Barton 6bc2ada6fc Made all the scripts use the file browser for saving images
Added better docscrings

Added a texture baker for procedural textures,

Its able to make a WYSIWYG image from the texture, by using the texmesh property, so texture coords arnt lost up when flattening the mesh.

Use a high res image not to see any seams
2006-07-31 15:22:20 +00:00

119 lines
2.9 KiB
Python

#!BPY
"""
Name: 'Bake Normal Map Image from UVs'
Blender: 242
Group: 'Image'
Tooltip: 'Generate a normal map image from selected mesh objects.'
"""
__author__= ['Campbell Barton']
__url__= ('blender', 'elysiun', 'http://www.gametutorials.com')
__version__= '0.1'
__bpydoc__= '''\
Bake Vertex Normals to an image
This script makes an image from a meshes vertex normals, 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.
def worldnormals(ob):
nor_mtx= ob.matrixWorld.rotationPart()
me= ob.getData(mesh=1)
for v in me.verts:
v.no= v.no*nor_mtx
return me
ob_s= dict([\
(ob.getData(name_only=1), ob)\
for ob in Blender.Object.GetSelected()\
if ob.getType()=='Mesh' if ob.getData(mesh=1).faceUV]).values()
me_s= [worldnormals(ob) for ob in ob_s]
del ob_s
if not me_s:
BPyMessages.Error_NoMeshUvSelected()
return
newpath= Blender.Get('filename').split('/')[-1].split('\\')[-1].replace('.blend', '_nor.png')
###PREF_IMAGE_PATH = Create('//%s_nor' % newpath)
PREF_IMAGE_SIZE = Create(512)
PREF_IMAGE_BLEED = Create(4)
PREF_IMAGE_SMOOTH= Create(0)
PREF_SEL_FACES_ONLY= Create(0)
pup_block = [\
###('', PREF_IMAGE_PATH, 3, 100, 'Path to new Image. "//" for curent blend dir.'),\
('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('Texface Image Bake', pup_block):
# Update the normals before we exit
for me in me_s:
me.update()
return
# Defaults for VCol, user cant change
PREF_IMAGE_WIRE= False
PREF_IMAGE_WIRE_INVERT= False
PREF_IMAGE_WIRE_UNDERLAY= False
PREF_USE_IMAGE= False
PREF_USE_VCOL= False
PREF_USE_MATCOL= False
PREF_USE_TEXTURE= False
PREF_USE_NORMAL= True # of course we need this one
def file_sel(PREF_IMAGE_PATH):
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)
# Restore normals
for me in me_s:
me.update()
Blender.Window.RedrawAll()
Blender.Window.FileSelector(file_sel, 'SAVE PNG', newpath)
if __name__ == '__main__':
main()