def DrawDialog(self): """Should be passed as the 'draw' argument to Blender.Draw.Register(). Defines how the dialog should be drawn on every redraw.""" BGL.glClear(BGL.GL_COLOR_BUFFER_BIT) #BGL.glEnable(BGL.GL_BLEND) #BGL.glBlendFunc( # BGL.GL_SRC_ALPHA, # BGL.GL_ONE_MINUS_SRC_ALPHA #) BGL.glRasterPos2d(self.column(1), self.line(0)) Draw.Text('PySoy importer', 'large') self.importfile = Draw.String('Import from: ', self.EVENT_IMPORTFROM, self.column(1), self.line(2), self.width(30), self.height(1), self.filepathSTR, 399, 'Import an element from this file') self.importfilebutton = Draw.PushButton('Set import file', self.EVENT_SETIMPORT, self.column(31), self.line(2), self.width(10), self.height(1), 'Set file to import from') if self.fileselected == True: self.importmenu = Draw.Menu('Import element:%t|Mesh|Material|Entity|Node', self.EVENT_IMPORTMENU, self.column(1), self.line(4), self.width(10), self.height(1), 1, 'Select element from file to import')
def bad_draw(): global _gui_edge_length_button, _gui_edge_angle_button, _gui_edge_weld_button try: BGL.glClear(BGL.GL_COLOR_BUFFER_BIT) BGL.glRasterPos2d(8, 40) Draw.Text('Blender Assisted Design', 'large') _gui_edge_length_button = Draw.Number('Edge length: ', GUI_EDGE_LENGTH, 8, 8, 200, 24, _gui_edge_length, 0.0, 1000.0, bad_set_length.__doc__) Draw.PushButton( 'Set', 0, 214, 8, 40, 24, bad_set_length.__doc__, lambda *a: bad_script_call(bad_script_set_length, float(_gui_edge_length)) ) _gui_edge_angle_button = Draw.Number('Edge angle: ', GUI_EDGE_ANGLE, 270, 8, 200, 24, _gui_edge_angle, 0.0, 180.0, bad_set_angle.__doc__) Draw.PushButton( 'Set', 0, 476, 8, 40, 24, bad_set_angle.__doc__, lambda *a: bad_script_call(bad_script_set_angle, float(_gui_edge_angle)) ) Draw.PushButton( 'Weld', 0, 534, 8, 50, 24, bad_weld_edges.__doc__, lambda *a: bad_script_call(bad_script_weld) ) except Exception, e: print e Draw.Exit()
def Create_Tab(X1,Y1,X2,Y2,Title,Buttons): # X1,Y1 = Top Left X2,Y2 = Bottom Right """ Create a bordered tab/frame/box with the given top left corner (X1,Y1) and bottom right corner (X2, Y2) with the given Title and Buttons. """ TITLE_HEIGHT = 15 INDENT = 6 BUTTON_GAP = 4 BGL.glColor3f(0.75, 0.75, 0.75) BGL.glRecti(X1,Y1,X2,Y2) Draw_Border(X1,Y1,X2,Y2); BGL.glColor3f(0.0,0.0,0.0) BGL.glRasterPos2d(X1+INDENT,Y1 - TITLE_HEIGHT) Draw.Text(Title) BUTTON_HEIGHT = 18 Button_X = X1 + INDENT Button_Y = Y1 - TITLE_HEIGHT - BUTTON_HEIGHT - 8 if (Buttons != 0): key= Buttons.keys() BUTTON_WIDTH = (X2 - (X1 + INDENT + BUTTON_GAP + INDENT)) / len(key) for k in key: Buttons[k][0]= Draw.Toggle(k,Buttons[k][1],Button_X,Button_Y, BUTTON_WIDTH,BUTTON_HEIGHT,Buttons[k][0].val,Buttons[k][2]) Button_X += BUTTON_WIDTH + BUTTON_GAP
def gui(): global buttons, offsets, rows, cols size=BGL.Buffer(BGL.GL_FLOAT, 4) BGL.glGetFloatv(BGL.GL_SCISSOR_BOX, size) size=size.list xoff=PANELPAD yoff=int(size[3]) # Default theme text =[ 0, 0, 0, 255] text_hi=[255, 255, 255, 255] header =[165, 165, 165, 255] panel =[255, 255, 255, 40] back =[180, 180, 180, 255] # Actual theme if Blender.Get('version') >= 235: theme=Blender.Window.Theme.Get() if theme: theme=theme[0] text=theme.get('ui').text space=theme.get('buts') text_hi=space.text_hi header=space.header header=[max(header[0]-30, 0), # 30 appears to be hard coded max(header[1]-30, 0), max(header[2]-30, 0), header[3]] panel=space.panel back=space.back BGL.glEnable (BGL.GL_BLEND) BGL.glBlendFunc (BGL.GL_SRC_ALPHA, BGL.GL_ONE_MINUS_SRC_ALPHA) BGL.glClearColor(float(back[0])/255, float(back[1])/255, float(back[2])/255, 1) BGL.glClear (BGL.GL_COLOR_BUFFER_BIT) BGL.glColor4ub(*header) BGL.glRectd(xoff, yoff-PANELTOP, xoff-PANELINDENT+PANELWIDTH, yoff-PANELTOP-PANELHEAD) BGL.glColor4ub(*panel) BGL.glRectd(xoff, yoff-PANELTOP-PANELHEAD, xoff-PANELINDENT+PANELWIDTH, yoff-60-PANELINDENT-rows*CONTROLSIZE) BGL.glColor4ub(*text_hi) BGL.glRasterPos2d(xoff+PANELINDENT, yoff-23) Draw.Text("Fixup UV mapping") BGL.glColor4ub(*text) BGL.glRasterPos2d(xoff+PANELINDENT, yoff-48) Draw.Text("Select where the old image is located in the new:") buttons=[] for i in range(rows): for j in range(cols): buttons.append(Draw.Button('', len(buttons)+CANCEL+1, xoff+PANELINDENT+j*CONTROLSIZE, yoff-80-i*CONTROLSIZE, CONTROLSIZE, CONTROLSIZE)) buttons.append(Draw.Button("Cancel", CANCEL, xoff-PANELINDENT*2+PANELWIDTH-4*CONTROLSIZE, yoff-60-rows*CONTROLSIZE, 4*CONTROLSIZE, CONTROLSIZE))
def drawdataref(datarefs, indices, eventbase, boneno, x, y): dataref = datarefs[boneno] valid = True mbutton = Draw.Menu('sim/%t|' + '/...|'.join(firstlevel) + '/...', DONTCARE + eventbase, x + 4, y, CONTROLSIZE, CONTROLSIZE, -1, 'Pick the dataref from a list', datarefmenucallback) bbutton = Draw.String( '', DATAREF_B + eventbase, x + 4 + CONTROLSIZE, y, PANELWIDTH - 2 * PANELINDENT - CONTROLSIZE, CONTROLSIZE, dataref, 100, 'Full name of the dataref used to animate this object') ibutton = None tbutton = None ref = dataref.split('/') if len(ref) <= 1 or ref[0] == 'sim': if len(ref) == 1 and ref[0] in lookup and not lookup[ref[0]]: BGL.glRasterPos2d(x + 4, y - 21) Draw.Text('This dataref name is ambiguous') valid = False else: try: thing = hierarchy for i in range(len(ref)): thing = thing[ref[i]] n = thing + 0 # check is a leaf - ie numeric if not n: BGL.glRasterPos2d(x + 4, y - 21) Draw.Text("This dataref can't be used for animation") valid = False elif n == 1: indices[boneno] = None else: if indices[boneno] == None or indices[boneno] >= n: indices[boneno] = 0 Draw.Label("Part number:", x, y - 26, 120, CONTROLSIZE) ibutton = Draw.Number('', INDICES_B + eventbase, x + 108, y - 26, 50, CONTROLSIZE, indices[boneno], 0, n - 1, 'The part number / array index') except: BGL.glRasterPos2d(x + 4, y - 21) Draw.Text("This is not a valid dataref") valid = False else: if indices[boneno] != None: val = 1 else: val = 0 tbutton = Draw.Toggle('Part number', INDICES_T + eventbase, x + 4, y - 26, 104, CONTROLSIZE, val, 'Whether this is an array dataref') if val: ibutton = Draw.Number('', INDICES_B + eventbase, x + 108, y - 26, 50, CONTROLSIZE, indices[boneno], 0, 729, 'The part number / array index') return (valid, mbutton, bbutton, ibutton, tbutton)
def gui(): global copynorm, copystrp size=BGL.Buffer(BGL.GL_FLOAT, 4) BGL.glGetFloatv(BGL.GL_SCISSOR_BOX, size) size=size.list x=int(size[2]) y=int(size[3]) # Default theme text =[ 0, 0, 0, 255] text_hi=[255, 255, 255, 255] header =[195, 195, 195, 255] panel =[255, 255, 255, 40] back =[180, 180, 180, 255] # Actual theme if Blender.Get('version') >= 235: theme=Blender.Window.Theme.Get() if theme: theme=theme[0] space=theme.get('buts') text=theme.get('ui').text text_hi=space.text_hi header=space.header panel=space.panel back=space.back BGL.glEnable (BGL.GL_BLEND) BGL.glBlendFunc (BGL.GL_SRC_ALPHA, BGL.GL_ONE_MINUS_SRC_ALPHA) BGL.glClearColor (float(back[0])/255, float(back[1])/255, float(back[2])/255, 1) BGL.glClear (BGL.GL_COLOR_BUFFER_BIT) BGL.glColor4ub (max(header[0]-30, 0), # 30 appears to be hard coded max(header[1]-30, 0), max(header[2]-30, 0), header[3]) BGL.glRectd(7, y-8, 295, y-28) BGL.glColor4ub (panel[0], panel[1], panel[2], panel[3]) BGL.glRectd(7, y-28, 295, y-130) BGL.glColor4ub (text_hi[0], text_hi[1], text_hi[2], text_hi[3]) BGL.glRasterPos2d(16, y-23) Draw.Text("UV Copy & Paste") BGL.glColor4ub (text[0], text[1], text[2], text[3]) BGL.glRasterPos2d(16, y-48) Draw.Text("Select the faces to paint and then press Paste") BGL.glRasterPos2d(16, y-75) Draw.Text("Copy type:", "small") copynorm = Draw.Toggle("Normal", 3, 73, y-79, 51, 17, copynorm.val, "Copy texture to selected faces in the same or a different mesh") copystrp = Draw.Toggle("Strip", 4, 124, y-79, 51, 17, copystrp.val, "Reverse copied texture as necessary to make a strip in the same mesh") Draw.Button("Paste", 2, 14, y-120, 100, 26) Draw.Button("Cancel", 1, 187, y-120, 100, 26)
def drawdataref(datarefs, indices, eventbase, boneno, x, y): dataref=datarefs[boneno] valid=True mbutton=Draw.Menu('sim/%t|'+'/...|'.join(firstlevel)+'/...', DONTCARE+eventbase, x+4, y, CONTROLSIZE, CONTROLSIZE, -1, 'Pick the dataref from a list', datarefmenucallback) bbutton=Draw.String('', DATAREF_B+eventbase, x+4+CONTROLSIZE, y, PANELWIDTH-2*PANELINDENT-CONTROLSIZE, CONTROLSIZE, dataref, 100, 'Full name of the dataref used to animate this object') ibutton=None tbutton=None ref=dataref.split('/') if len(ref)<=1 or ref[0]=='sim': if len(ref)==1 and ref[0] in lookup and not lookup[ref[0]]: BGL.glRasterPos2d(x+4, y-21) Draw.Text('This dataref name is ambiguous') valid=False else: try: thing=hierarchy for i in range(len(ref)): thing=thing[ref[i]] n=thing+0 # check is a leaf - ie numeric if not n: BGL.glRasterPos2d(x+4, y-21) Draw.Text("This dataref can't be used for animation") valid=False elif n==1: indices[boneno]=None else: if indices[boneno]==None or indices[boneno]>=n: indices[boneno]=0 Draw.Label("Part number:", x, y-26, 120, CONTROLSIZE) ibutton=Draw.Number('', INDICES_B+eventbase, x+108, y-26, 50, CONTROLSIZE, indices[boneno], 0, n-1, 'The part number / array index') except: BGL.glRasterPos2d(x+4, y-21) Draw.Text("This is not a valid dataref") valid=False else: if indices[boneno]!=None: val=1 else: val=0 tbutton=Draw.Toggle('Part number', INDICES_T+eventbase, x+4, y-26, 104, CONTROLSIZE, val, 'Whether this is an array dataref') if val: ibutton=Draw.Number('', INDICES_B+eventbase, x+108, y-26, 50, CONTROLSIZE, indices[boneno], 0, 729, 'The part number / array index') return (valid, mbutton,bbutton,ibutton,tbutton)
def gui(): global buttons, offsets, rows, cols size = BGL.Buffer(BGL.GL_FLOAT, 4) BGL.glGetFloatv(BGL.GL_SCISSOR_BOX, size) size = size.list xoff = PANELPAD yoff = int(size[3]) # Default theme text = [0, 0, 0, 255] text_hi = [255, 255, 255, 255] header = [165, 165, 165, 255] panel = [255, 255, 255, 40] back = [180, 180, 180, 255] # Actual theme if Blender.Get('version') >= 235: theme = Blender.Window.Theme.Get() if theme: theme = theme[0] text = theme.get('ui').text space = theme.get('buts') text_hi = space.text_hi header = space.header header = [ max(header[0] - 30, 0), # 30 appears to be hard coded max(header[1] - 30, 0), max(header[2] - 30, 0), header[3] ] panel = space.panel back = space.back BGL.glEnable(BGL.GL_BLEND) BGL.glBlendFunc(BGL.GL_SRC_ALPHA, BGL.GL_ONE_MINUS_SRC_ALPHA) BGL.glClearColor( float(back[0]) / 255, float(back[1]) / 255, float(back[2]) / 255, 1) BGL.glClear(BGL.GL_COLOR_BUFFER_BIT) BGL.glColor4ub(*header) BGL.glRectd(xoff, yoff - PANELTOP, xoff - PANELINDENT + PANELWIDTH, yoff - PANELTOP - PANELHEAD) BGL.glColor4ub(*panel) BGL.glRectd(xoff, yoff - PANELTOP - PANELHEAD, xoff - PANELINDENT + PANELWIDTH, yoff - 60 - PANELINDENT - rows * CONTROLSIZE) BGL.glColor4ub(*text_hi) BGL.glRasterPos2d(xoff + PANELINDENT, yoff - 23) Draw.Text("Fixup UV mapping") BGL.glColor4ub(*text) BGL.glRasterPos2d(xoff + PANELINDENT, yoff - 48) Draw.Text("Select where the old image is located in the new:") buttons = [] for i in range(rows): for j in range(cols): buttons.append( Draw.Button('', len(buttons) + CANCEL + 1, xoff + PANELINDENT + j * CONTROLSIZE, yoff - 80 - i * CONTROLSIZE, CONTROLSIZE, CONTROLSIZE)) buttons.append( Draw.Button("Cancel", CANCEL, xoff - PANELINDENT * 2 + PANELWIDTH - 4 * CONTROLSIZE, yoff - 60 - rows * CONTROLSIZE, 4 * CONTROLSIZE, CONTROLSIZE))
def gui(): global dataref_m, dataref_b, indices_b, indices_t, vals_b, clear_b, loops_b global hideshow_m, from_b, to_b, up_b, down_b, delete_b, addhs_b global cancel_b, apply_b global manipulator_m, manipulator_b, cursor_m, cursor_b dataref_m = [] dataref_b = [] indices_b = [] indices_t = [] vals_b = [] clear_b = None loops_b = [] hideshow_m = [] from_b = [] to_b = [] up_b = [] down_b = [] delete_b = [] addhs_b = None cancel_b = None apply_b = None # Default theme text = [0, 0, 0, 255] text_hi = [255, 255, 255, 255] header = [165, 165, 165, 255] panel = [255, 255, 255, 40] back = [180, 180, 180, 255] error = [255, 80, 80, 255] # where's the theme value for this? # Actual theme if Blender.Get('version') >= 235: theme = Blender.Window.Theme.Get() if theme: theme = theme[0] space = theme.get('buts') text = theme.get('ui').text text_hi = space.text_hi header = space.header header = [ max(header[0] - 30, 0), # 30 appears to be hard coded max(header[1] - 30, 0), max(header[2] - 30, 0), header[3] ] panel = space.panel back = space.back size = BGL.Buffer(BGL.GL_FLOAT, 4) BGL.glGetFloatv(BGL.GL_SCISSOR_BOX, size) size = size.list x = int(size[2]) y = int(size[3]) BGL.glEnable(BGL.GL_BLEND) BGL.glBlendFunc(BGL.GL_SRC_ALPHA, BGL.GL_ONE_MINUS_SRC_ALPHA) BGL.glClearColor( float(back[0]) / 255, float(back[1]) / 255, float(back[2]) / 255, 1) BGL.glClear(BGL.GL_COLOR_BUFFER_BIT) yoff = y - offset[1] if vertical: xoff = PANELPAD + PANELINDENT - offset[0] for boneno in range(bonecount): eventbase = boneno * EVENTMAX framecount = len(vals[boneno]) if not vertical: xoff = PANELPAD + boneno * (PANELWIDTH + PANELPAD) + PANELINDENT - offset[0] BGL.glColor4ub(*header) BGL.glRectd(xoff - PANELINDENT, yoff - PANELTOP, xoff - PANELINDENT + PANELWIDTH, yoff - PANELTOP - PANELHEAD) BGL.glColor4ub(*panel) BGL.glRectd(xoff - PANELINDENT, yoff - PANELTOP - PANELHEAD, xoff - PANELINDENT + PANELWIDTH, yoff - 170 - (CONTROLSIZE - 1) * framecount) txt = 'parent bone' if boneno: txt = 'grand' + txt txt = 'great-' * (boneno - 1) + txt txt = txt[0].upper() + txt[1:] BGL.glColor4ub(*text_hi) BGL.glRasterPos2d(xoff, yoff - 23) Draw.Text(txt) Draw.Label("Dataref:", xoff - 4, yoff - 54, 100, CONTROLSIZE) BGL.glColor4ub(*error) # For errors (valid, mbutton, bbutton, ibutton, tbutton) = drawdataref(datarefs, indices, eventbase, boneno, xoff - 4, yoff - 80) dataref_m.append(mbutton) dataref_b.append(bbutton) indices_b.append(ibutton) indices_t.append(tbutton) vals_b.append([]) if valid: # is a valid or custom dataref Draw.Label("Dataref values:", xoff - 4, yoff - 132, 150, CONTROLSIZE) for i in range(framecount): Draw.Label("Frame #%d:" % (i + 1), xoff - 4 + CONTROLSIZE, yoff - 152 - (CONTROLSIZE - 1) * i, 100, CONTROLSIZE) if i > 1: v9 = 'v9: ' else: v9 = '' vals_b[-1].append( Draw.Number( '', i + VALS_B + eventbase, xoff + 104, yoff - 152 - (CONTROLSIZE - 1) * i, 80, CONTROLSIZE, vals[boneno][i], -NUMBERMAX, NUMBERMAX, v9 + 'The dataref value that corresponds to the pose in frame %d' % (i + 1))) if framecount > 2: clear_b = Draw.Button( 'Delete', DELETE_B + eventbase, xoff + 208, yoff - 152 - (CONTROLSIZE - 1) * (framecount - 1), 80, CONTROLSIZE, 'Clear animation keys from this frame') Draw.Label("Loop:", xoff - 4 + CONTROLSIZE, yoff - 160 - (CONTROLSIZE - 1) * framecount, 100, CONTROLSIZE) loops_b.append( Draw.Number( '', LOOPS_B + eventbase, xoff + 104, yoff - 160 - (CONTROLSIZE - 1) * framecount, 80, CONTROLSIZE, loops[boneno], -NUMBERMAX, NUMBERMAX, 'v9: The animation will loop back to frame 1 when the dataref value exceeds this number. Enter 0 for no loop.' )) else: loops_b.append(None) if vertical: yoff -= (170 + (CONTROLSIZE - 1) * framecount) #Draw Manipulator GUI #This is broken #if valid: # Draw.Label("Manipulator:", xoff-4, yoff-220-(CONTROLSIZE-1)*i, 100, CONTROLSIZE) # drawmanipulator(manipulators, indices, eventbase, boneno, xoff-4, yoff-250-(CONTROLSIZE-1)*i) if not vertical: xoff = PANELPAD + bonecount * (PANELWIDTH + PANELPAD) + PANELINDENT - offset[0] BGL.glColor4ub(*header) BGL.glRectd(xoff - PANELINDENT, yoff - PANELTOP, xoff - PANELINDENT + PANELWIDTH, yoff - PANELTOP - PANELHEAD) BGL.glColor4ub(*panel) BGL.glRectd(xoff - PANELINDENT, yoff - PANELTOP - PANELHEAD, xoff - PANELINDENT + PANELWIDTH, yoff - 64 - len(hideshow) * 82) BGL.glColor4ub(*text_hi) BGL.glRasterPos2d(xoff, yoff - 23) Draw.Text("Hide/Show for all children of %s" % armature.name) for hs in range(len(hideshow)): eventbase = (bonecount + hs) * EVENTMAX BGL.glColor4ub(*panel) BGL.glRectd(xoff - 4, yoff - PANELTOP - PANELHEAD - 4 - hs * 82, xoff - 13 + PANELWIDTH, yoff - PANELTOP - 101 - hs * 82) BGL.glColor4ub(*error) # For errors (valid, mbutton, bbutton, ibutton, tbutton) = drawdataref(hideshow, hideshowindices, eventbase, hs, xoff - 4, yoff - 54 - hs * 82) dataref_m.append(mbutton) dataref_b.append(bbutton) indices_b.append(ibutton) indices_t.append(tbutton) if hs: up_b.append( Draw.Button('^', UP_B + eventbase, xoff + 217, yoff - 80 - hs * 82, CONTROLSIZE, CONTROLSIZE, 'Move this entry up')) else: up_b.append(None) if hs != len(hideshow) - 1: down_b.append( Draw.Button('v', DOWN_B + eventbase, xoff + 237, yoff - 80 - hs * 82, CONTROLSIZE, CONTROLSIZE, 'Move this entry down')) else: down_b.append(None) delete_b.append( Draw.Button('X', DELETE_B + eventbase, xoff + 267, yoff - 80 - hs * 82, CONTROLSIZE, CONTROLSIZE, 'Delete this entry')) if valid: # is a valid or custom dataref hideshow_m.append( Draw.Menu('Hide%x0|Show%x1', HIDEORSHOW_M + eventbase, xoff, yoff - 106 - hs * 82, 62, CONTROLSIZE, hideorshow[hs], 'Choose Hide or Show')) Draw.Label("when", xoff + 63, yoff - 106 - hs * 82, 60, CONTROLSIZE) from_b.append( Draw.Number( '', FROM_B + eventbase, xoff + 104, yoff - 106 - hs * 82, 80, CONTROLSIZE, hideshowfrom[hs], -NUMBERMAX, NUMBERMAX, 'The dataref value above which the animation will be hidden or shown' )) Draw.Label("to", xoff + 187, yoff - 106 - hs * 82, 60, CONTROLSIZE) to_b.append( Draw.Number( '', TO_B + eventbase, xoff + 207, yoff - 106 - hs * 82, 80, CONTROLSIZE, hideshowto[hs], -NUMBERMAX, NUMBERMAX, 'The dataref value below which the animation will be hidden or shown' )) else: hideshow_m.append(None) from_b.append(None) to_b.append(None) addhs_b = Draw.Button('Add New', ADD_B + bonecount * EVENTMAX, xoff + 217, yoff - 54 - len(hideshow) * 82, 70, CONTROLSIZE, 'Add a new Hide or Show entry') if vertical: xoff = PANELPAD - offset[0] yoff -= (64 + len(hideshow) * 82) else: xoff = PANELPAD + (bonecount + 1) * (PANELWIDTH + PANELPAD) - offset[0] apply_b = Draw.Button('Apply', APPLY_B + bonecount * EVENTMAX, xoff, yoff - PANELTOP - CONTROLSIZE * 2, 80, CONTROLSIZE * 2, 'Apply these settings', doapply) if vertical: cancel_b = Draw.Button('Cancel', CANCEL_B + bonecount * EVENTMAX, xoff + 80 + PANELPAD, yoff - PANELTOP - CONTROLSIZE * 2, 80, CONTROLSIZE * 2, 'Retain existing settings') else: cancel_b = Draw.Button('Cancel', CANCEL_B + bonecount * EVENTMAX, xoff, yoff - PANELTOP - CONTROLSIZE * 4 - PANELPAD, 80, CONTROLSIZE * 2, 'Retain existing settings')
def gui(): global dataref_m, dataref_b, indices_b, indices_t, vals_b, clear_b, loops_b global hideshow_m, from_b, to_b, up_b, down_b, delete_b, addhs_b global cancel_b, apply_b global manipulator_m, manipulator_b, cursor_m, cursor_b dataref_m=[] dataref_b=[] indices_b=[] indices_t=[] vals_b=[] clear_b=None loops_b=[] hideshow_m=[] from_b=[] to_b=[] up_b=[] down_b=[] delete_b=[] addhs_b=None cancel_b=None apply_b=None # Default theme text =[ 0, 0, 0, 255] text_hi=[255, 255, 255, 255] header =[165, 165, 165, 255] panel =[255, 255, 255, 40] back =[180, 180, 180, 255] error =[255, 80, 80, 255] # where's the theme value for this? # Actual theme if Blender.Get('version') >= 235: theme=Blender.Window.Theme.Get() if theme: theme=theme[0] space=theme.get('buts') text=theme.get('ui').text text_hi=space.text_hi header=space.header header=[max(header[0]-30, 0), # 30 appears to be hard coded max(header[1]-30, 0), max(header[2]-30, 0), header[3]] panel=space.panel back=space.back size=BGL.Buffer(BGL.GL_FLOAT, 4) BGL.glGetFloatv(BGL.GL_SCISSOR_BOX, size) size=size.list x=int(size[2]) y=int(size[3]) BGL.glEnable(BGL.GL_BLEND) BGL.glBlendFunc(BGL.GL_SRC_ALPHA, BGL.GL_ONE_MINUS_SRC_ALPHA) BGL.glClearColor(float(back[0])/255, float(back[1])/255, float(back[2])/255, 1) BGL.glClear(BGL.GL_COLOR_BUFFER_BIT) yoff=y-offset[1] if vertical: xoff=PANELPAD+PANELINDENT-offset[0] for boneno in range(bonecount): eventbase=boneno*EVENTMAX framecount=len(vals[boneno]) if not vertical: xoff=PANELPAD+boneno*(PANELWIDTH+PANELPAD)+PANELINDENT-offset[0] BGL.glColor4ub(*header) BGL.glRectd(xoff-PANELINDENT, yoff-PANELTOP, xoff-PANELINDENT+PANELWIDTH, yoff-PANELTOP-PANELHEAD) BGL.glColor4ub(*panel) BGL.glRectd(xoff-PANELINDENT, yoff-PANELTOP-PANELHEAD, xoff-PANELINDENT+PANELWIDTH, yoff-170-(CONTROLSIZE-1)*framecount) txt='parent bone' if boneno: txt='grand'+txt txt='great-'*(boneno-1)+txt txt=txt[0].upper()+txt[1:] BGL.glColor4ub(*text_hi) BGL.glRasterPos2d(xoff, yoff-23) Draw.Text(txt) Draw.Label("Dataref:", xoff-4, yoff-54, 100, CONTROLSIZE) BGL.glColor4ub(*error) # For errors (valid,mbutton,bbutton,ibutton,tbutton)=drawdataref(datarefs, indices, eventbase, boneno, xoff-4, yoff-80) dataref_m.append(mbutton) dataref_b.append(bbutton) indices_b.append(ibutton) indices_t.append(tbutton) vals_b.append([]) if valid: # is a valid or custom dataref Draw.Label("Dataref values:", xoff-4, yoff-132, 150, CONTROLSIZE) for i in range(framecount): Draw.Label("Frame #%d:" % (i+1), xoff-4+CONTROLSIZE, yoff-152-(CONTROLSIZE-1)*i, 100, CONTROLSIZE) if i>1: v9='v9: ' else: v9='' vals_b[-1].append(Draw.Number('', i+VALS_B+eventbase, xoff+104, yoff-152-(CONTROLSIZE-1)*i, 80, CONTROLSIZE, vals[boneno][i], -NUMBERMAX, NUMBERMAX, v9+'The dataref value that corresponds to the pose in frame %d' % (i+1))) if framecount>2: clear_b=Draw.Button('Delete', DELETE_B+eventbase, xoff+208, yoff-152-(CONTROLSIZE-1)*(framecount-1), 80, CONTROLSIZE, 'Clear animation keys from this frame') Draw.Label("Loop:", xoff-4+CONTROLSIZE, yoff-160-(CONTROLSIZE-1)*framecount, 100, CONTROLSIZE) loops_b.append(Draw.Number('', LOOPS_B+eventbase, xoff+104, yoff-160-(CONTROLSIZE-1)*framecount, 80, CONTROLSIZE, loops[boneno], -NUMBERMAX, NUMBERMAX, 'v9: The animation will loop back to frame 1 when the dataref value exceeds this number. Enter 0 for no loop.')) else: loops_b.append(None) if vertical: yoff-=(170+(CONTROLSIZE-1)*framecount) #Draw Manipulator GUI #This is broken #if valid: # Draw.Label("Manipulator:", xoff-4, yoff-220-(CONTROLSIZE-1)*i, 100, CONTROLSIZE) # drawmanipulator(manipulators, indices, eventbase, boneno, xoff-4, yoff-250-(CONTROLSIZE-1)*i) if not vertical: xoff=PANELPAD+bonecount*(PANELWIDTH+PANELPAD)+PANELINDENT-offset[0] BGL.glColor4ub(*header) BGL.glRectd(xoff-PANELINDENT, yoff-PANELTOP, xoff-PANELINDENT+PANELWIDTH, yoff-PANELTOP-PANELHEAD) BGL.glColor4ub(*panel) BGL.glRectd(xoff-PANELINDENT, yoff-PANELTOP-PANELHEAD, xoff-PANELINDENT+PANELWIDTH, yoff-64-len(hideshow)*82) BGL.glColor4ub(*text_hi) BGL.glRasterPos2d(xoff, yoff-23) Draw.Text("Hide/Show for all children of %s" % armature.name) for hs in range(len(hideshow)): eventbase=(bonecount+hs)*EVENTMAX BGL.glColor4ub(*panel) BGL.glRectd(xoff-4, yoff-PANELTOP-PANELHEAD-4-hs*82, xoff-13+PANELWIDTH, yoff-PANELTOP-101-hs*82) BGL.glColor4ub(*error) # For errors (valid,mbutton,bbutton,ibutton,tbutton)=drawdataref(hideshow, hideshowindices, eventbase, hs, xoff-4, yoff-54-hs*82) dataref_m.append(mbutton) dataref_b.append(bbutton) indices_b.append(ibutton) indices_t.append(tbutton) if hs: up_b.append(Draw.Button('^', UP_B+eventbase, xoff+217, yoff-80-hs*82, CONTROLSIZE, CONTROLSIZE, 'Move this entry up')) else: up_b.append(None) if hs!=len(hideshow)-1: down_b.append(Draw.Button('v', DOWN_B+eventbase, xoff+237, yoff-80-hs*82, CONTROLSIZE, CONTROLSIZE, 'Move this entry down')) else: down_b.append(None) delete_b.append(Draw.Button('X', DELETE_B+eventbase, xoff+267, yoff-80-hs*82, CONTROLSIZE, CONTROLSIZE, 'Delete this entry')) if valid: # is a valid or custom dataref hideshow_m.append(Draw.Menu('Hide%x0|Show%x1', HIDEORSHOW_M+eventbase, xoff, yoff-106-hs*82, 62, CONTROLSIZE, hideorshow[hs], 'Choose Hide or Show')) Draw.Label("when", xoff+63, yoff-106-hs*82, 60, CONTROLSIZE) from_b.append(Draw.Number('', FROM_B+eventbase, xoff+104, yoff-106-hs*82, 80, CONTROLSIZE, hideshowfrom[hs], -NUMBERMAX, NUMBERMAX, 'The dataref value above which the animation will be hidden or shown')) Draw.Label("to", xoff+187, yoff-106-hs*82, 60, CONTROLSIZE) to_b.append(Draw.Number('', TO_B+eventbase, xoff+207, yoff-106-hs*82, 80, CONTROLSIZE, hideshowto[hs], -NUMBERMAX, NUMBERMAX, 'The dataref value below which the animation will be hidden or shown')) else: hideshow_m.append(None) from_b.append(None) to_b.append(None) addhs_b=Draw.Button('Add New', ADD_B+bonecount*EVENTMAX, xoff+217, yoff-54-len(hideshow)*82, 70, CONTROLSIZE, 'Add a new Hide or Show entry') if vertical: xoff=PANELPAD-offset[0] yoff-=(64+len(hideshow)*82) else: xoff=PANELPAD+(bonecount+1)*(PANELWIDTH+PANELPAD)-offset[0] apply_b=Draw.Button('Apply', APPLY_B+bonecount*EVENTMAX, xoff, yoff-PANELTOP-CONTROLSIZE*2, 80, CONTROLSIZE*2, 'Apply these settings', doapply) if vertical: cancel_b=Draw.Button('Cancel', CANCEL_B+bonecount*EVENTMAX, xoff+80+PANELPAD, yoff-PANELTOP-CONTROLSIZE*2, 80, CONTROLSIZE*2, 'Retain existing settings') else: cancel_b=Draw.Button('Cancel', CANCEL_B+bonecount*EVENTMAX, xoff, yoff-PANELTOP-CONTROLSIZE*4-PANELPAD, 80, CONTROLSIZE*2, 'Retain existing settings')
def DrawDialog(self): """Should be passed as the 'draw' argument to Blender.Draw.Register(). Defines how the dialog should be drawn on every redraw.""" BGL.glClear(BGL.GL_COLOR_BUFFER_BIT) #BGL.glEnable(BGL.GL_BLEND) #BGL.glBlendFunc( # BGL.GL_SRC_ALPHA, # BGL.GL_ONE_MINUS_SRC_ALPHA #) BGL.glRasterPos2d(self.column(1), self.line(0)) Draw.Text('PySoy exporter', 'large') BGL.glRasterPos2d(self.column(1), self.line(2)) Draw.Text('Level export options:') self.activescene = Draw.Toggle('Only active scene', self.EVENT_ACTIVE_SCENE, self.column(1), self.line(4), self.width(13), self.height(1), self.activesceneBT, 'Only export the currently active scene as a level') self.allscenes = Draw.Toggle('All scenes', self.EVENT_ALL_SCENES, self.column(14), self.line(4), self.width(13), self.height(1), self.allscenesBT, 'Export all scenes as levels') self.rootpath = Draw.String('Root datapath: ', self.EVENT_ROOTPATH, self.column(1), self.line(5), self.width(30), self.height(1), self.rootpathSTR, 399, 'File path for game data') self.setroot = Draw.PushButton('Set root path', self.EVENT_SETPATH, self.column(31), self.line(5), self.width(10), self.height(1), 'Set another root path for data') self.meshdialog.DrawGroup(1, 6) self.entitydialog.DrawGroup(1, 8) self.nodedialog.DrawGroup(1, 10) self.materialdialog.DrawGroup(1, 12) self.heightmultiplier = Draw.Number('heightmultiplier', self.EVENT_HEIGHTMULT, self.column(32), self.line(14), self.width(15), self.height(1), self.heightmultFLT, 0.0, 10000.0, 'Intended scale of height for the heightmap') self.heightscale = Draw.Number('XY-scale', self.EVENT_HEIGHTSCALE, self.column(32), self.line(15), self.width(15), self.height(1), self.heightscaleFLT, 0.0, 10000.0, 'Intended scale for the X and Y axis of the heightmap.') self.heightmap = Draw.PushButton('Import heightmap', self.EVENT_HEIGHTMAP, self.column(17), self.line(15), self.width(15), self.height(2), 'Import heightmap for reference') self.exportlevel = Draw.PushButton('Export as level(s)', self.EVENT_EXPORTLEVEL, self.column(1), self.line(15), self.width(15), self.height(2), 'Export scene(s) as level(s)') BGL.glRasterPos2d(self.column(1), self.line(17)) Draw.Text('Model export options:') self.modelpath = Draw.String('Save model as: ', self.EVENT_MODELPATH, self.column(1), self.line(19), self.width(30), self.height(1), self.modelpathSTR, 399, 'File path for meshified model') self.setmodel = Draw.PushButton('Set model path', self.EVENT_SETMODEL, self.column(31), self.line(19), self.width(10), self.height(1), 'Set another path for meshes') self.exportmodel = Draw.PushButton('Export as mesh(es)', self.EVENT_EXPORTMODEL, self.column(1), self.line(21), self.width(15), self.height(2), 'Export each Group as a mesh')