#!BPY
""" Released under the Blender Artistic Licence (BAL)
Name: 'Vertcol 2 Heightmap'
Blender: 235
Group: 'Object'
Submenu: 'Update active object' update
Submenu: 'Show GUI' gui
Tooltip: 'Use a meshs vertex color as heightmap'
"""
__author__ = "pat"
__version__ = "1.3b - 01/10/05 -"
__email__ = ('Author, pat:psycho3d*de')
__url__ = ("Author's website, www.psycho3d.de")
__bpydoc__ ="""\
This script modifies each verts z coordinate depending on the vertex color.
When starting, the script offers to update the active object immediately
using the red vertex color, or to show the GUI
The script uses the vertex color to set each verts z coordinate
to a value between 0 and 1.
I assume that heightmaps are greyscale, but you may use the two unused
colors for whatever you like since you can select which color to use.
You will have to scale the object's z axis after applying the heightmap.
Buttons:
Select Object: Change the script's active object.
Update Mesh: Apply the selected color as heightmap.
Flatten Mesh: Reset the mesh to a flat plane, might be easier to edit vertcols.
Hotkeys:
Q: [Q]uit
"""
from Blender.Object import GetSelected
from Blender.Draw import *
from Blender.BGL import *
from Blender.Window import Theme
colmenu = Create(0)
message = ""
ob = None
##############################
#select active object
def getObject():
global ob, message
try:
ob = None #to avoid errors
ob = GetSelected()[0]
if ob.getType() == "Mesh":
message = "The script now works on: %s" % ob.name
else:
message = "Active object is not a mesh! Select a mesh and click \"Select Object\"."
ob = None
except IndexError:
message = "No object active! Select a mesh and click \"Select Object\"."
Redraw()
##############################
def UpdateHeight():
global ob, message
if ob == None:
message = "No object active! Select a mesh and click \"Select Object\"."
else:
#first update our mesh to current status
me = ob.getData()
facelist = me.faces
message = "Updated"
for f in facelist:
collist = []
if colmenu.val == 2:
for color in f.col:
collist.append(color.b)
elif colmenu.val == 1:
for color in f.col:
collist.append(color.g)
else:
for color in f.col:
collist.append(color.r)
try:
f.v[0].co.z = collist[0] / 255.0
except IndexError:
message = "Error: mesh has no vertex colors!"
else:
f.v[1].co.z = collist[1] / 255.0
try: #for edges & tris
f.v[2].co.z = collist[2] / 255.0
f.v[3].co.z = collist[3] / 255.0
except IndexError:
pass
me.update()
Redraw()
def flatten():
global ob, message
if ob == None:
message = "No object active! Select a mesh and click \"Select Object\"."
else:
me = ob.getData()
facelist = me.faces
message = "Flattened"
for f in facelist:
f.v[0].co.z = 0
f.v[1].co.z = 0
f.v[2].co.z = 0
try:
f.v[3].co.z = 0
except IndexError:
pass
me.update()
Redraw()
def gui():
global colmenu
col = Theme.Get()[0].get("buts").back
glClearColor(col[0]/255., col[1]/255., col[2]/255., col[3]/255.)
glClear(GL_COLOR_BUFFER_BIT)
col = Theme.Get()[0].get("buts").text_hi
glColor3f(col[0]/255., col[1]/255., col[2]/255.)
name = "Color to use%t|Red%x0|Green%x1|Blue%x2"
colmenu = Menu(name, 2, 10, 150, 100, 20, colmenu.val, "Just a test menu.")
Button("Exit", 1, 10, 10, 100, 20, "This one should explain itself :)")
Button("Select Object", 5, 10, 60, 100, 20, "Change the object the script works on")
Button("Update Mesh", 3, 10, 112, 100, 28, "Change the verts z coordinate depending on vertex color")
Button("Flatten Mesh", 4, 10, 90, 100, 20, "Reset the verts z coordinate to 0")
glRasterPos2i(10, 40)
Text(message)
def event(evt, val):
if (evt == QKEY and not val): Exit()
def bevent(evt):
if (evt == 1): Exit()
elif (evt == 3): UpdateHeight()
elif evt == 4: flatten()
elif (evt == 5): getObject()
getObject()
arg = __script__['arg']
if arg == 'update':
if message == "No object active! Select a mesh and click \"Select Object\".":
PupMenu("Error%t|There is no active mesh object.")
elif message == "Active object is not a mesh! Select a mesh and click \"Select Object\".":
PupMenu("Error%t|The active object is not a mesh.")
else:
UpdateHeight()
else:
Register(gui, event, bevent)