#!BPY """ Name: 'Import 2D Cutout Images' Blender: 244 Group: 'Misc' Tooltip: 'Import alpha enabled .png files and automatically UV map them to a plane" """ #Copyright 2007: ivan.carzy'__at__'gmail.com #Script Published First on June 28, 2007. Posted to blenderartists.org import Blender from Blender import BGL, Draw, Image, Material, Mesh, Object, Scene, Texture, Window from Blender.Mathutils import * #Global Variables NO_EVT = 1000 SINGLE_IMG = 1 DIRECT_IMG = 2 CLR_PATH = 3 DO_SCRIPT = 4 CHG_EXT = 5 EXIT = 6 ImagePath = Draw.Create('') imgExt = Draw.Create('.png') showStatus = Draw.Create(0) pathList = [] ###################### def main(ImagePath): ################################################### #Create an Image object to hold Image img = Image.Load(ImagePath) name = Blender.sys.makename(ImagePath, strip = 1) ################################################## #Create a Plane with Aspect Ratio of Image me = Mesh.New(name) imgDimensions = img.getMaxXY() normFac = max(imgDimensions) dim = [] #One dimension will always be 1 for size in imgDimensions: dim.append(float(size)/normFac) #Max distance from origin in any direction will be 1 blender unit vert = me.verts vert.extend(dim[0], dim[1], 0) vert.extend(-dim[0], dim[1], 0) vert.extend(-dim[0], -dim[1], 0) vert.extend(dim[0], -dim[1], 0) me.faces.extend(vert[0], vert[1], vert[2], vert[3]) #Do UV Stuff me.faces[0].image = img me.faces[0].uv = [Vector(1.0, 1.0), Vector(0.0, 1.0), Vector(0.0, 0.0), Vector(1.0, 0.0)] ################################################## #Do Material/Texture Assignments #Make Material mat = Material.New(name) mat.setRef(1.0) mat.setSpec(0.0) mat.setAlpha(0.0) mat.mode |= Material.Modes.ZTRANSP #Makes an image texture tex = Texture.New(name) tex.setType('Image') tex.setImage(img) tex.useAlpha = Texture.ImageFlags.USEALPHA mat.setTexture(0, tex) mtex = mat.getTextures()[0] mtex.texco = Texture.TexCo.UV mtex.mapto = Texture.MapTo.COL + Texture.MapTo.ALPHA #Assign material to mesh me.materials += [mat] ################################################## #Pack into Object ob = Object.New('Mesh', name) ob.link(me) scn = Scene.GetCurrent() scn.objects.link(ob) return def setSinglePath(filename): global ImagePath, pathList ImagePath.val = filename pathList.append(filename) return def setDirPath(filename): global ImagePath, pathList, imgExt try: import os except: print "Full, updated install of python required for script to work" Draw.Exit() path = Blender.sys.dirname(filename) ImagePath.val = path for f in os.listdir(path): if f[-4:] == imgExt.val: pathList.append(os.path.join(path, f)) return def changeExtension(): global ImagePath, pathList try: import os except: print "Full, updated install of python required for script to work" Draw.Exit() pathList = [] for f in os.listdir(ImagePath.val): if f[-4:] == imgExt.val: pathList.append(os.path.join(ImagePath.val, f)) def event(evt, val): if evt == Draw.ESCKEY: Draw.Exit() return def bevent(evt): global NO_EVT, SINGLE_IMG, DIRECT_IMG, CLR_PATH, DO_SCRIPT, CHG_EXT, EXIT global ImagePath, pathList, showStatus if evt == NO_EVT: pass elif evt == SINGLE_IMG: Window.FileSelector(setSinglePath, 'Image') Draw.Redraw() elif evt == DIRECT_IMG: Window.FileSelector(setDirPath, 'Directory') Draw.Redraw() elif evt == CLR_PATH: ImagePath.val = '' Draw.Redraw() elif evt == DO_SCRIPT: total = len(pathList) for id,path in enumerate(pathList): main(path) if showStatus.val == 1: print "Imported %i of %i images" %(id+1, total) Blender.Redraw() elif evt == CHG_EXT: changeExtension() Draw.Redraw() elif evt == EXIT: Draw.Exit() else: print "Error: Unexpected Button Event" def GUI(): global NO_EVT, SINGLE_IMG, DIRECT_IMG, CLR_PATH, CHG_EXT, DO_SCRIPT, EXIT global ImagePath, imgExt, showStatus BGL.glClearColor(0.7, 0.7, 0.7 ,1) BGL.glClear(BGL.GL_COLOR_BUFFER_BIT) #Set Up Coordinates minx = 5 maxx = 500 miny = 5 maxy = 200 #Draw The Background BGL.glColor3f(0,0,0) BGL.glRecti(minx, miny, maxx, maxy) BGL.glColor3f(0.36, 0.95, 1.0) BGL.glRecti(minx+1, miny+1, maxx-1, maxy-1) BGL.glColor3f(0.5, 0.5, 0.5) BGL.glRecti(minx+2, miny+2, maxx-2, maxy-2) #Draw Title BGL.glColor3f(0.2, 0.2, 0.2) BGL.glRecti(minx+3, miny+150, maxx-3, maxy-3) BGL.glColor3f(0.929, 0.782, .268) title = "2D Cutout Image Import Script" tLength = Draw.GetStringWidth(title) BGL.glRasterPos2i(int((maxx-minx)/2 - tLength/2), miny + 168) Draw.Text(title) #Draw The Buttons if ImagePath.val == '': Draw.PushButton('Load Single Image', SINGLE_IMG, minx+4, miny+130, 150, 19, "Import a Single Image") Draw.PushButton('Load Directory', DIRECT_IMG, minx+155, miny+130, 150, 19, "Import all images in a Directory") else: Draw.PushButton('Clear', CLR_PATH, minx+4, miny+130, 50, 19, "Clear Path and allow a change of import options") Draw.PushButton('Import!', DO_SCRIPT, minx +4, miny+4, 50, 19, "Import image(s)") showStatus = Draw.Toggle('Show Progress', NO_EVT, minx + 55, miny + 4, 100, 19, showStatus.val, "Print the progress of the import to the Blender Console") ImagePath = Draw.String('Path: ', NO_EVT, minx + 4, miny + 110, (maxx - minx - 8), 19, ImagePath.val, 399, "Path to image to import") imgExt = Draw.String('Image Type: ', CHG_EXT, minx + 4, miny + 90, 105, 19, imgExt.val, 4, "Path to image to import") Draw.PushButton('Exit', EXIT, maxx - 54, miny+5, 50, 19, "Exit the script") #Draw Extra BGL.glColor3f(0.8, 0.0, 0.0) BGL.glRecti(minx+4, miny+4, maxx-4, miny + 85) Draw.Register(GUI, event, bevent)