All pastes #23291 Raw Edit

Someone

public python v1 · immutable
#23291 ·published 2005-09-18 18:36 UTC
rendered paste body
------ LipSync ------import mlsWidgetreload(mlsWidget)import Blenderimport Globalsfrom Blender import Draw,BGLfrom Blender.BGL import *from mlsWidget import *# GlobalsipoMenu = Draw.Create(1)wavMenu = Draw.Create(1)mouseDown = 0mx = 0my = 0aw = NonebP = 0## Thanks for timmeh for providing these two functions !#def get_space_size():	size=Buffer(GL_FLOAT, 4)	glGetFloatv(GL_SCISSOR_BOX, size)	size= size.list 	return int(size[0]), int(size[1])def area_mouse_coords():	a = get_space_size()	b = Blender.Window.GetMouseCoords()	return b[0]-a[0], b[1]-a[1]## Event handling routine#def event(evt, val):    # the function to handle input events			global areaContainer, mouseDown, aw, bP	# Get the mouse cursor position inside the area	loc = area_mouse_coords()					#	# Handle mouse 	#		# Button is pressed so call the widget which is under attack	if bP == 1:		if evt in [ Draw.MOUSEX, Draw.MOUSEY ]:			if aw != None:				aw.mPmM(loc[0],loc[1])				if val == 1:		if evt == Draw.LEFTMOUSE:			bP = 1			aw = areaContainer.overWidget(loc[0], loc[1])			if aw != None:				aw.mP(loc[0], loc[1])					elif val == 0:		if evt == Draw.LEFTMOUSE:			bP = 0			if aw != None:				if aw.isOver(loc[0], loc[1]):									aw.mR(loc[0], loc[1])			aw = None	# Handle Keyboard	if evt == Draw.ESCKEY:		Draw.Exit()                 # exit when user presses ESC		return	# If something changed, redraw the area	Draw.Redraw(1)def getCurrentWave():	global wavMenu	audioClips = Blender.Sound.Get()		return audioClips[wavMenu.val-1].getFilename()def menu_event(evt):  # the function to handle Draw Button events	global wavData		if evt == 0:		print "Jep"	elif evt == 1:		wavFileName = getCurrentWave()		waveWidget.setWave(wavFileName)		## GUI function which is called for redraw#	def gui():     	# Global variables	global ipoMenu, wavMenu, areaContainer	#		# Draw the UI	#		# Calculate the size of the area	areaSize = Blender.Window.GetAreaSize()			# Clear the background	glClearColor(0.6,0.6,0.6,1)	glClear(BGL.GL_COLOR_BUFFER_BIT)	#	# Print the Object information	#			# Backgound	glColor3f(0.4, 0.4, 0.4)	glBegin(BGL.GL_POLYGON)	glVertex2i(5, areaSize[1] - 5)	glVertex2i(areaSize[0] - 10, areaSize[1] - 5)	glVertex2i(areaSize[0] - 10, areaSize[1] - 28)	glVertex2i(5, areaSize[1] - 28)	glEnd()	glColor3f(0,0,0)			# Object name	glRasterPos2i(10, areaSize[1] - 20)			Draw.Text("Object: ")	glRasterPos2i(90, areaSize[1] - 20)		Draw.Text(Globals.selectedObj.getName())		# Menu to select the object IPO (getIpo is not working with RVK)	glRasterPos2i(150, areaSize[1] - 20)		Draw.Text("Object IPO: ")	objIpos = Blender.Ipo.Get()	menuStr = "Ipos %t"	for i in range(len(objIpos)):		menuStr = menuStr + "|" + objIpos[i].getName() + " %x" + str(i)	ipoMenu = Draw.Menu(menuStr, 0, 230,areaSize[1] - 25, 100,20, ipoMenu.val, "This is my menu")	glRasterPos2i(220, areaSize[1] - 20)			#	# Print the Waveform information	#				# Create sound menu string	audioClips = Blender.Sound.Get()	menuStr = "Waveforms %t"	for i in range(len(audioClips)):		menuStr = menuStr + "|" + audioClips[i].getName() + " %x" + str(i+1)	wavMenu = Draw.Menu(menuStr, 1, areaSize[0]-110,areaSize[1]-60, 100,20, wavMenu.val, "This is my menu")		# Draw all own widgets	areaContainer.redrawWidget()	class lsWave(mlsWaveWidget):		def sliderInteract(self, widget):		print "Jep1", widget		slider = widget.getValue()		print widget, slider		self.setStart(widget.getValue())		self.calcProperties()		# Get Area sizeareaSize = Blender.Window.GetAreaSize()	# Create own widgetsareaContainer = mlsContainerWidget()waveWidget = lsWave("", 100, areaSize[1]-60, areaSize[0]-100-10, 100)areaContainer.append(waveWidget)waveSlider = mlsSliderWidget(100, areaSize[1]-60-102, areaSize[0]-100-10, 15)waveSlider.addExtWidget(waveWidget, waveWidget.sliderInteract, waveSlider)areaContainer.append(waveSlider)zoominButton = mlsButtonWidget(100, areaSize[1]-38, 20, 20, "zoomin1.png")areaContainer.append(zoominButton)zoomoutButton = mlsButtonWidget(130, areaSize[1]-38, 20, 20, "zoomout4.png")areaContainer.append(zoomoutButton)Draw.Register(gui, event, menu_event)  # registering the 3 callbacks------ mlsWidget.py -----import Blenderfrom Blender import Drawimport waveimport structfrom Blender.BGL import *## External Event#class extEvent:		extData = []		def __init__(self, widget=None, evt=None):		# Erase the data chunk		self.extData = []				# Create the list		tmpData = []		if widget != None:			tmpData.append(widget)		if evt != None:			tmpData.append(evt)		# Add the tmp data to the list		self.extData.append(tmpData)		def addExtWidget(self, *args, **kwargs):		# Create the list		tmpData = []		if args[0] != None:			tmpData.append(args[0])		if args[1] != None:			tmpData.append(args[1])		for i in range(2,len(args)):			tmpData.append(args[i])		print tmpData				# Add the tmp data to the list		self.extData.append(tmpData)		def parameterChanged(self):				for i in self.extData:			if i[1] != None:				i[1](i[2:])			elif i[0] != None:								i[0].message(i[2:])		def message(self):		pass	## mlsWidget#	class mlsWidget(extEvent):	mX = 0	mY = 0		callBackEvent = None		def __init__(self):		pass	def isOver(self, x, y):					wl = self.getXYWH()								if x > wl[0] and x < wl[0]+wl[2] and y < wl[1] and y > wl[1]-wl[3]:				return True	def getXYWH(self):		return self.x, self.y, self.w, self.h		def mPmM(self, x, y):		# Mouse Button is pressed and the Mouse cursor is moving		if x > self.mX:			try:				self.increaseValue(x-self.mX)			except:				pass		elif x < self.mX:			try:				self.decreaseValue(self.mX-x)			except:				pass		self.setCoords(x, y)		def mP(self, x, y):		try:			self.pressed()		except:			pass		self.setCoords(x, y)			def mR(self,x, y):				try:			self.released()		except:			pass		self.setCoords(x, y)			def setCoords(self, x, y):		self.mX = x		self.mY = y	## Container to handle all widgets inside that#class mlsContainerWidget:	widgets = []		def __init__(self):		self.widgets = []		def overWidget(self, x, y):		for i in self.widgets:			wl = i.getXYWH()									if x > wl[0] and x < wl[0]+wl[2] and y < wl[1] and y > wl[1]-wl[3]:				return i		return None				def append(self, widget):		self.widgets.append(widget)			def redrawWidget(self):		for i in self.widgets:						i.redrawWidget()## Wave class to hold wave information and UI settings#class mlsWave(mlsWidget):	fileName = ""	frequency = 44100	channels = 2	size = 0	depth = 2				def __init__(self):					pass		def loadWavFile(self, fileName):					# Open the file		wavFile = wave.open(fileName, "rb")		parms = wavFile.getparams()				# Set class variables		self.fileName = fileName		self.frequency = parms[2]		self.channels = parms[0]		self.depth = parms[1]		self.size = parms[3]		self.data = wavFile.readframes(wavFile.getnframes())		# Close the file		wavFile.close()			def getFrequency():		return self.frequency		def getChannels():		return self.channels		def getDepth():		return self.depth		def getSize():		return self.size		def getData():		if self.channels == 2:				return self.data[:self.size/2], self.data[self.size/2:]		else:			return self.data## Wave Widget#class mlsWaveWidget(mlsWidget, mlsWave):	# Widget values	x = 0	y = 0	w = 0	h = 0				# Widget drawing variables	onscreen = 10.0 # 1.0 = All, 	steps = 10000 # How many visual steps we should see	xscale = 0	yscale = 0	wstart = 0	wend = 0		def __init__(self, fileName="", x=0, y=0, w=0, h=0):		# Call the super init method to initialize everything		if fileName != "":			self.setWave(fileName, x, y, w, h)		# Set values		self.x = x		self.y = y		self.w = w		self.h = h									self.wstart = 0							def redrawWidget(self):		self.drawWaveform()				def setWave(self, fileName):		# Do this in super class		self.loadWavFile(fileName)				# Set widget properties		self.calcProperties()			def calcProperties(self):				# Read the area size		areaSize = Blender.Window.GetAreaSize()				# Scaling factors for wave		self.xscale = self.onscreen * self.frequency / self.w		self.yscale = (self.h / 2) / float((2**(self.depth*8)))				# Start and end position in wave data		self.wend = int(self.onscreen * self.frequency)				print "calcProperties"			def setStart(self, start):			self.wstart = start			def setScale(self, ):			pass						def drawWaveform(self):		# Calculate the stepping		even = int((self.wend - self.wstart) / self.steps)		if even < 2:			stepping = 2		elif even%2 == 0:			stepping = even		elif even%2 == 1:			stepping = even-1					# Draw the Zero line		glBegin(GL_LINE_STRIP)		glVertex2i(self.x, self.y)		glVertex2i(self.x + self.w, self.y-self.h/2)		glEnd()			# Rectangular backgound		glColor3f(0.7,0.7,0.7)			glBegin(GL_POLYGON)		glVertex2i(self.x, self.y)		glVertex2i(self.x+self.w, self.y)		glVertex2i(self.x+self.w, self.y-self.h)		glVertex2i(self.x, self.y-self.h)		glEnd()		# Rectangular borders		glColor3f(0,0,0)			glBegin(GL_LINE_LOOP)		glVertex2i(self.x, self.y)		glVertex2i(self.x+self.w, self.y)		glVertex2i(self.x+self.w, self.y-self.h)		glVertex2i(self.x, self.y-self.h)		glEnd()					# Draw the wave		if self.depth == 1:			std = "B"		elif self.depth == 2:			std = "h" 		glColor3f(0.0,0.0,0.9)		glBegin(GL_LINE_STRIP)		for i in xrange(self.wstart, self.wend, stepping):			if i < self.size - 2:				sval = self.data[i:i+self.depth]				dval = struct.unpack(std, sval)[0]											intensity = int(dval * self.yscale + self.y)				glVertex2i(int(self.x+i/self.xscale), intensity-self.h/2)						glEnd()	## Slider Widget#						class mlsSliderWidget(mlsWidget):	x = 0	y = 0	w = 0	h = 0	min = 0	max = 1.0	value = 0.0		onscreen = 0.5		def __init__(self, x, y, w, h, value=0.0, onscreen=0.5):		self.x = x		self.y = y		self.w = w		self.h = h		self.value = value		self.onscreen = onscreen	#	# Parameter read/write methods	# 	def setValue(self, value):		# Change the value		self.value = value				# Inform other widgets about changes		self.parameterChanged()	def getValue(self):		return self.value		def increaseValue(self, value=3.0):		# Change value		self.value += value		if self.value + self.w*self.onscreen > self.w:			self.value = self.w*self.onscreen					# Inform other widges about changes		self.parameterChanged()						def decreaseValue(self, value=3.0):		# Change value		self.value -= value		if self.value < 0.0:			self.value = 0.0		# Inform other widges about changes		self.parameterChanged()					def setOnScreen(self, onscreen):		# Change onscreen value				self.onscreen = onscreen		# Inform other widges about changes		self.parameterChanged()	#	# Drawing methods	#				def redrawWidget(self):		# Rectangular backgound		glColor3f(0.7,0.7,0.7)			glBegin(GL_POLYGON)		glVertex2i(self.x, self.y)		glVertex2i(self.x+self.w, self.y)		glVertex2i(self.x+self.w, self.y-self.h)		glVertex2i(self.x, self.y-self.h)		glEnd()		# Rectangular borders		glColor3f(0,0,0)			glBegin(GL_LINE_LOOP)		glVertex2i(self.x, self.y)		glVertex2i(self.x+self.w, self.y)		glVertex2i(self.x+self.w, self.y-self.h)		glVertex2i(self.x, self.y-self.h)		glEnd()				# Draw the slider handle		glColor3f(0.7,0.7,0.7)			glBegin(GL_POLYGON)		glVertex2i(int(self.x+self.value+2), self.y-2) # 2 pixels for margin		glVertex2i(int(self.x+self.w*self.onscreen+self.value-2), self.y-2)		glVertex2i(int(self.x+self.w*self.onscreen+self.value-2), self.y-self.h+2)		glVertex2i(int(self.x+self.value+2), self.y-self.h+2)		glEnd()				# Effect for the handle		r=0.2		g=0.2		b=0.2		glColor3f(r, g, b)					for i in range(2,3):			glBegin(GL_LINE_LOOP)			glVertex2i(int(self.x+self.value+i), int(self.y-i)) # 2 pixels for margin			glVertex2i(int(self.x+self.w*self.onscreen+self.value-i), int(self.y-i))			glVertex2i(int(self.x+self.w*self.onscreen+self.value-i), int(self.y-self.h+i))			glVertex2i(int(self.x+self.value+i), int(self.y-self.h+i))			glEnd()			r+=0.2			g+=0.2			b+=0.2			glColor3f(r, g, b)		# And a bit more effects		glColor3f(0.5,0.5,0.5)			for i in range(-5,6,5):			glBegin(GL_LINE_STRIP)			glVertex2i(int(self.x+self.value+self.w*self.onscreen/2+2+i), int(self.y-4))			glVertex2i(int(self.x+self.value+self.w*self.onscreen/2-2+i), int(self.y-self.h+3))			glEnd()				## Button Widget#class mlsButtonWidget(mlsWidget):	x = 0	y = 0	w = 0	h = 0	imageFile = ""	image = None		def __init__(self, x, y, w, h, imageFile=""):		self.x = x		self.y = y		self.w = w		self.h = h		self.imageFile = imageFile					#	# Event handling methods	#		def pressed(self):		print "Pressed", self			def released(self):		print "Released", self	#	# Drawing methods	#			def redrawWidget(self):		# Rectangular backgound		glColor3f(0.7,0.7,0.7)			glBegin(GL_POLYGON)		glVertex2i(self.x, self.y)		glVertex2i(self.x+self.w, self.y)		glVertex2i(self.x+self.w, self.y-self.h)		glVertex2i(self.x, self.y-self.h)		glEnd()		# Rectangular borders		glColor3f(0,0,0)			glBegin(GL_LINE_LOOP)		glVertex2i(self.x, self.y)		glVertex2i(self.x+self.w, self.y)		glVertex2i(self.x+self.w, self.y-self.h)		glVertex2i(self.x, self.y-self.h)		glEnd()		# Draw the image inside		if self.imageFile != "":				self.image = Blender.Image.Load(self.imageFile)				imgWH = self.image.getSize()				x = int((self.w - imgWH[0]) / 2)				y = int((self.h - imgWH[1]) / 2)				Draw.Image(self.image, self.x+x, self.y-self.h+y)