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)