#!BPY
"""
Name: 'Import 2D Cutout Images'
Blender: 244
Group: 'Misc'
Tooltip: 'Import alpha enabled .png files and UV map them'
"""
__author__ = "Kevin Morgan (forTe)"
__url__ = ("Home page, http://gamulabs.freepgs.com")
__version__ = "1.1"
__bpydoc__ = """\
This Script will take an image with an alpha channel (or one without) and
UV map it to a plane sharing the same width to height ratio as the image.
Import options allow simple materials to be assigned to the plane as well.
Imports can be single images or whole directories of images depending on the chosen
option.
"""
#This program imports a single image or series of images stored in a directory
#And then proceeds to map them to planes. The script was originally written
#to help speed up the process of 2D image animation in Blender
####################################################
#Copyright (C) 2007: Kevin Morgan
####################################################
#-------------GPL LICENSE BLOCK-------------
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation, either version 3 of the License, or
#(at your option) any later version.
#
#This program is distributed in the hopes that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program. If not, see .
####################################################
##################################
#V1.0
#Basic Functionality
#Published June 28, 2007
##################################
#V1.1
#Added Support for enabling viewport transparency
#Added more options to the UI for materials
#Added Proportionality code (Pixels per unit)
#Added GPL License Block
#Published June 29, 2007
##################################
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
REDRAW =7
#Button Initializations
#Import Buttons
ImagePath = Draw.Create('')
imgExt = Draw.Create('.png')
#Material Buttons
matColR = Draw.Create(0.8)
matColG = Draw.Create(0.8)
matColB = Draw.Create(0.8)
matAlpha = Draw.Create(0.0)
matRef = Draw.Create(1.0)
matSpec = Draw.Create(0.0)
matHard = Draw.Create(50)
matZtransp = Draw.Create(1)
matShadeless = Draw.Create(0)
texCol = Draw.Create(1)
texAlpha = Draw.Create(1)
imgUseAlpha = Draw.Create(1)
imgCalcAlpha = Draw.Create(0)
#View and Creation Buttons
viewTransp = Draw.Create(1)
pixelsPerUnit = Draw.Create(500)
#Global path list for import
pathList = []
######################
def main(ImagePath):
global matColR, matColG, matColB, matAlpha, matRef, matSpec, matHard
global matZtransp, matShadeless
global texCol, texAlpha, imgUseAlpha, imgCalcAlpha
global viewTransp, pixelsPerUnit
###################################################
#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.getSize()
dim = [float(i) / pixelsPerUnit.val for i in imgDimensions]
#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)]
#Make face transparent in viewport
if viewTransp.val:
me.faces[0].transp = Mesh.FaceTranspModes.ALPHA
##################################################
#Do Material/Texture Assignments
#Make Material
mat = Material.New(name)
#Set Color
mat.rgbCol = [matColR.val, matColG.val, matColB.val]
#Set Shading Info
if matShadeless.val:
mat.mode |= Material.Modes.SHADELESS
else:
mat.setRef(matRef.val)
mat.setSpec(matSpec.val)
mat.setHardness(matHard.val)
#Set Transparency
mat.setAlpha(matAlpha.val)
if matZtransp.val:
mat.mode |= Material.Modes.ZTRANSP
#Makes an image texture
tex = Texture.New(name)
tex.setType('Image')
tex.setImage(img)
if imgUseAlpha.val:
tex.useAlpha = Texture.ImageFlags.USEALPHA
if imgCalcAlpha.val:
tex.calcAlpha = Texture.ImageFlags.CALCALPHA
mat.setTexture(0, tex)
mtex = mat.getTextures()[0]
mtex.texco = Texture.TexCo.UV
if texCol.val:
mtex.mapto |= Texture.MapTo.COL
if texAlpha.val:
mtex.mapto |= 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, REDRAW
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)
Window.DrawProgressBar(float(id)/total, "Imported %i of %i images" %(id+1, total))
Blender.Redraw()
Window.DrawProgressBar(1.0, "Finished Importing")
elif evt == CHG_EXT:
changeExtension()
Draw.Redraw()
elif evt == REDRAW:
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, REDRAW
global ImagePath, imgExt, showStatus
global matColR, matColG, matColB, matAlpha, matRef, matSpec, matHard, matZtransp, matShadeless
global texCol, texAlpha, imgUseAlpha, imgCalcAlpha
global viewTransp, pixelsPerUnit
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 = 325
#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, maxy-50, maxx-3, maxy-3)
BGL.glColor3f(0.929, 0.782, .268)
title = "2D Cutout Image Importer"
tLength = Draw.GetStringWidth(title, "large")
BGL.glRasterPos2i(int((maxx-minx)/2 - tLength/2), maxy-30)
Draw.Text(title, "large")
#Draw The Import Buttons
if ImagePath.val == '':
Draw.PushButton('Load Single Image', SINGLE_IMG, minx+4, maxy-70, 150, 19, "Import a Single Image")
Draw.PushButton('Load Directory', DIRECT_IMG, minx+155, maxy-70, 150, 19, "Import all images in a Directory")
BGL.glRasterPos2i(minx+4, miny+9)
Draw.Text("You must select a valid path to be able to import images")
else:
Draw.PushButton('Clear', CLR_PATH, minx+4, maxy - 70, 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)")
ImagePath = Draw.String('Path: ', NO_EVT, minx + 4, maxy - 90, (maxx - minx - 8), 19, ImagePath.val, 399, "Path to image to import")
imgExt = Draw.String('Image Type: ', CHG_EXT, minx + 4, maxy - 110, 105, 19, imgExt.val, 4, "Path to image to import")
pixelsPerUnit = Draw.Slider('Pixels Per Unit: ', NO_EVT, minx + 245, maxy - 110, 245, 19, pixelsPerUnit.val, 1, 5000, 0, "Set the number of pixels per blender unit")
Draw.PushButton('Exit', EXIT, maxx - 54, miny+5, 50, 19, "Exit the script")
#Draw Material Options Title/Box
BGL.glColor3f(0.2, 0.2, 0.2)
BGL.glRecti(minx+3, maxy-140, maxx-3, maxy-112)
BGL.glColor3f(0.929, 0.782, .268)
opText = "Material Options"
tLength = Draw.GetStringWidth(opText)
BGL.glRasterPos2i(int((maxx-minx)/2 - tLength/2), maxy-130)
Draw.Text(opText)
#Draw Options Buttons
#Draw Color Rectangle
BGL.glColor3f(matColR.val, matColG.val, matColB.val)
BGL.glRecti(minx + 4, maxy - 198, minx + 29, maxy - 142)
#Draw Color Sliders
matColR = Draw.Slider('R: ', REDRAW, minx + 30, maxy - 160, 150, 19, matColR.val, 0.0, 1.0, 0, "Set the Red Value of the created material")
matColG = Draw.Slider('G: ', REDRAW, minx + 30, maxy - 179, 150, 19, matColG.val, 0.0, 1.0, 0, "Set the Green Value of the created material")
matColB = Draw.Slider('B: ', REDRAW, minx + 30, maxy - 198, 150, 19, matColB.val, 0.0, 1.0, 0, "Set the Blue Value of the created material")
#Draw Alpha Slider
matAlpha = Draw.Slider('Alpha: ', NO_EVT, minx + 4, maxy - 217, 176, 19, matAlpha.val, 0.0, 1.0, 0, "Set the Alpha Value of the created material")
#Draw Shader Sliders
matRef = Draw.Slider('Ref: ', NO_EVT, minx + 200, maxy - 160, 150, 19, matRef.val, 0.0, 1.0, 0, "Change the Ref Value of the created material")
matSpec = Draw.Slider('Spec: ', NO_EVT, minx + 200, maxy - 179, 150, 19, matSpec.val, 0.0, 1.0, 0, "Change the Spec Value of the created material")
matHard = Draw.Slider('Hard: ', NO_EVT, minx + 200, maxy - 198, 150, 19, matHard.val, 0, 511, 0, "Change the Hardness Value of the created material")
#Draw Transp and Shading Options
matZtransp = Draw.Toggle('ZTransp', NO_EVT, minx + 200, maxy - 217, 75, 19, matZtransp.val, "Enable (default)/Disable ZTransparency")
matShadeless = Draw.Toggle('Shadeless', NO_EVT, minx + 275, maxy - 217, 75, 19, matShadeless.val, "Enable (default)/Disable Shadeless on Material (Disregards above settings)")
#Draw Texture Options
BGL.glColor3f(0.929, 0.782, .268)
BGL.glRasterPos2i(390, maxy - 154)
Draw.Text("Texture Settings")
texCol = Draw.Toggle('Color', NO_EVT, minx + 366, maxy - 179, 62, 19, texCol.val, "Map To Color Channel")
texAlpha = Draw.Toggle('Alpha', NO_EVT, minx + 428, maxy - 179, 62, 19, texAlpha.val, "Map To Alpha Channel")
#Image Settings
imgUseAlpha = Draw.Toggle('Use Alpha', NO_EVT, minx + 366, maxy - 198, 124, 19, imgUseAlpha.val, "Use the Images' Alpha Channel(s)")
imgCalcAlpha = Draw.Toggle('Calc Alpha', NO_EVT, minx + 366, maxy - 217,124, 19, imgCalcAlpha.val, "Calculate Alpha from RGB Values")
#Draw Mesh Options
BGL.glColor3f(0.2, 0.2, 0.2)
BGL.glRecti(minx+3, maxy-248, maxx-3, maxy-220)
BGL.glColor3f(0.929, 0.782, .268)
Text = "Display Options"
tLength = Draw.GetStringWidth(Text)
BGL.glRasterPos2i(int((maxx-minx)/2 - tLength/2), maxy - 238)
Draw.Text(Text)
#Viewport Display
viewTransp = Draw.Toggle('3D Viewport Transparency', NO_EVT, minx + 150, maxy - 269, 200, 19, viewTransp.val, "Allows use of alpha channel in the 3D viewport")
#Draw Execution Options
BGL.glColor3f(0.2, 0.2, 0.2)
BGL.glRecti(minx+3, maxy-296, maxx-3, maxy-271)
BGL.glColor3f(0.929, 0.782, .268)
Text = "Script Execution"
tLength = Draw.GetStringWidth(Text)
BGL.glRasterPos2i(int((maxx-minx)/2 - tLength/2), maxy - 287)
Draw.Text(Text)
Draw.Register(GUI, event, bevent)