View Single Post
  #2  
Old 05-14-2008, 05:04 PM
farshizzo farshizzo is offline
WorldViz Team Member
 
Join Date: Mar 2003
Posts: 2,849
Here is some sample code that should do what you want. It creates a class that allows to blend between an arbitrary number of values. The slider on the left will blend between 5 different colors and the slider on the right will blend between 5 different textures. Let me know if anything is unclear:
Code:
import viz
viz.go()

class MultiBlender(object):
	
	def __init__(self,values):
		"""Initialize blender with list of values"""
		self.values = values[:]
		self.dv = 1.0 / (len(values)-1)
		
	def getBlendValues(self,p):
		"""Returns begin,end, and percent value to blend between them, given total multiblend percent"""
		begin = int(p // self.dv)
		if begin < 0:
			return self.values[0],self.values[1],0.0
		elif begin >= (len(self.values)-1):
			return self.values[-2],self.values[-1],1.0
		return self.values[begin],self.values[begin+1],(p % self.dv) / self.dv
		
	def getInterpolatedValue(self,p):
		"""Return blended value at percent p, 0-1"""
		begin,end,p = self.getBlendValues(p)
		return vizmat.Interpolate(begin,end,p)
		

#Create quad and a blender that blends between 5 colors
colorQuad = viz.addTexQuad(pos=(-1,1.8,4))
colorBlender = MultiBlender([viz.RED,viz.BLACK,viz.WHITE,viz.BLUE,viz.GREEN])

#Add a slider for the blender
colorSlider = viz.addSlider(pos=(0.25,0.1,0))
def blendColor(pos,node,blender):
	node.color(blender.getInterpolatedValue(pos))
vizact.onslider(colorSlider,blendColor,colorQuad,colorBlender)


#Create quad and a blender that blends between 5 textures
textures = [
	'ball.jpg'
	,'brick.jpg'
	,'gb_noise.jpg'
	,'image2.jpg'
	,'lake3.jpg'
]

texQuad = viz.addTexQuad(pos=(1,1.8,4))
texBlender = MultiBlender([viz.addTexture(file) for file in textures])

#Add a slider for the blender
texSlider = viz.addSlider(pos=(0.75,0.1,0))
def blendTexture(pos,node,blender):
	begin,end,p = blender.getBlendValues(pos)
	node.texture(begin,unit=0)
	node.texture(end,unit=1)
	node.texblend(p,unit=1)
vizact.onslider(texSlider,blendTexture,texQuad,texBlender)
Reply With Quote