def setFieldValueCommand(self, field, value): '''Be careful, this is usually called from a qt callback, so we mustn't rebuild qt objects here.''' if self.value_is_adjusting: return #print 'setFieldValueCommand', repr(field), repr(value) #print '/%s/attrs/%s' % (State.getSel(),field) State.setKey('/%s/attrs/%s' % (State.getSel(),field),value) self.edit_signal.emit(State.getSel(),field,value) # DH self.clean_state() # if changing the field has side effects, these should happen before the push (I think) State.push('Set %s' % str(field)) undoCmd = State.getUndoCmd() self.undoItem.setText('&Undo' if undoCmd is None else '&Undo [%s]' % undoCmd) redoCmd = State.getRedoCmd() self.redoItem.setText('Re&do' if redoCmd is None else 'Re&do [%s]' % redoCmd)
def updateFieldKey(self, key): #print 'updateFieldKey',key if not State.hasKey(key): return # TODO maybe need to remove something from UI sel = State.getSel() if sel is None: return self.qfields.setKeyValue(key, State.getKey(key)) s = '/%s/attrs/'%sel.strip('/') #print 'updateFieldKey',s,key if key.startswith(s): self.qfields.setKeyValue(key[len(s):], State.getKey(key))
def sync(self): '''synchronize the selection with the State selection''' index = self.selectionModel().currentIndex() key = State.getSel() if key is None: return if index.isValid(): item = self.index_to_item(index) if item.data() == key: return item = self.generate_path_to(key) self.selectionModel().setCurrentIndex(self.item_to_index(item), QtGui.QItemSelectionModel.ClearAndSelect)
def updateMenus(self): '''Keeps the GUI menus and the attribute editor in sync with the actual state.''' undoCmd = State.getUndoCmd() self.undoItem.setText('&Undo' if undoCmd is None else '&Undo [%s]' % undoCmd) redoCmd = State.getRedoCmd() self.redoItem.setText('Re&do' if redoCmd is None else 'Re&do [%s]' % redoCmd) #print undoCmd, redoCmd if self.attributeEditor is not None: sel = State.getSel() if sel is None: self.qfields.setFields('',[],{}) else: st = State.getKey(sel+'/type',None) sa = State.getKey(sel+'/attrs',{}) global fields self.qfields.setFields(sel, fields.get(st,[]), sa) self.attributeEditor.setWidget(self.qfields) self.updateGL()
def paintGL(self, p0=0, p1=None, drawOpts=DRAWOPT_DEFAULT): ''' :param drawOpts: OR combination of draw flags. default is :data:`UI.DRAWOPT_DEFAULT` ''' #if not self.d['draw'] or not self.d['visible']: return if not self.visible: return if p1 is None: p1 = len(self) if not self.GL_is_initialised: self.initializeGL() if p1 == 0: return # don't render if no vertices GL.glEnableClientState(GL.GL_VERTEX_ARRAY) self.vs.bind() GL.glVertexPointerf(self.vs) if self.image is not self.bindImage: self.create_bindImage() self.shader,self.shader_bi,self.shader_myMat,self.shader_bo = \ self.shader_deform,self.shader_notex_bi,self.shader_notex_myMat,self.shader_notex_bo if self.bindImage is not None: GL.glEnable(GL.GL_TEXTURE_2D) GL.glBindTexture(GL.GL_TEXTURE_2D, self.bindId) self.shader,self.shader_bi,self.shader_myMat,self.shader_bo = \ self.shader_tex,self.shader_tex_bi,self.shader_tex_myMat,self.shader_tex_bo if self.vts is not None: GL.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY) self.vts.bind() GL.glTexCoordPointerf(self.vts) if self.vns is not None: GL.glEnableClientState(GL.GL_NORMAL_ARRAY) self.vns.bind() GL.glNormalPointerf(self.vns) sel = State.getSel() self.selectedIndex = self.names.index( sel[5:]) if (sel is not None and sel.startswith('_OBJ_') and sel[5:] in self.names) else -1 if sel is not None: print 'selection', sel, sel[5:], self.selectedIndex, self.names[ self.selectedIndex], self.names[:5] GL.glEnable(GL.GL_BLEND) GL.glShadeModel(GL.GL_SMOOTH) GL.glEnable(GL.GL_LIGHTING) GL.glEnable(GL.GL_LIGHT0) Pmat = GL.glGetDoublev(GL.GL_PROJECTION_MATRIX) lightDir = -Pmat[:3, 2] # the direction the camera is looking GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, lightDir) #GL.glEnable(GL.GL_CULL_FACE) GL.glCullFace(GL.GL_BACK) GL.glFrontFace(GL.GL_CCW) ranges = [] for t0 in xrange(p0, p1, 128): # draw the geometries in batches of 128 t1 = min(t0 + 128, p1) if self.selectedIndex in xrange(t0, t1): if t0 < self.selectedIndex: ranges.append((t0, self.selectedIndex)) if t1 > self.selectedIndex + 1: ranges.append((self.selectedIndex + 1, t1)) else: ranges.append((t0, t1)) GL.glUseProgram(self.shader) GL.glEnableVertexAttribArray(self.shader_gvs0) GL.glEnableVertexAttribArray(self.shader_gvs1) GL.glEnableVertexAttribArray(self.shader_gvs2) GL.glEnableVertexAttribArray(self.shader_gvs3) self.gvs.bind() GL.glVertexAttribPointer(self.shader_gvs0, 4, GL.GL_FLOAT, GL.GL_FALSE, 64, self.gvs) GL.glVertexAttribPointer(self.shader_gvs1, 4, GL.GL_FLOAT, GL.GL_FALSE, 64, self.gvs + 16) GL.glVertexAttribPointer(self.shader_gvs2, 4, GL.GL_FLOAT, GL.GL_FALSE, 64, self.gvs + 32) GL.glVertexAttribPointer(self.shader_gvs3, 4, GL.GL_FLOAT, GL.GL_FALSE, 64, self.gvs + 48) GL.glEnableVertexAttribArray(self.shader_boneIndex) self.boneIndices.bind() GL.glVertexAttribIPointer(self.shader_boneIndex, 4, GL.GL_UNSIGNED_INT, 0, self.boneIndices) if self.pose is not None: size_mat = min(128, self.pose.shape[0]) GL.glUniformMatrix4fv(self.shader_transforms, size_mat, GL.GL_FALSE, self.pose[:size_mat]) else: GL.glUniformMatrix4fv(self.shader_transforms, 128, GL.GL_FALSE, np.eye((128, 4, 4), dtype=np.float32)) i = self.selectedIndex if drawOpts & DRAWOPT_GEOMS and ( self.drawStyle == 'smooth' or self.drawStyle == 'wire_over_smooth'): # draw triangles if self.colour is not None: GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, self.colour) self.tris.bind() for t0, t1 in ranges: tr0, tr1 = self.tsplits[t0], self.tsplits[t1] if tr1 > tr0: GL.glDrawElements(GL.GL_TRIANGLES, (tr1 - tr0) * 3, GL.GL_UNSIGNED_INT, self.tris + tr0 * 3 * 4) self.tris.unbind() if drawOpts & DRAWOPT_GEOMS and (self.drawStyle == 'wire' or self.drawStyle == 'wire_over_smooth'): # draw edges GL.glLineWidth(1) GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, [0, 0, 0, 1]) self.edges.bind() for t0, t1 in ranges: e0, e1 = self.esplits[t0], self.esplits[t1] if e1 > e0: # GL.glUniformMatrix4fv(self.shader_myMat, t1-t0, GL.GL_FALSE, self.transforms[t0:t1]) # put the transforms in myMat # GL.glUniform1i(self.shader_bo, t0) # put the offset GL.glDrawElements(GL.GL_LINES, (e1 - e0) * 2, GL.GL_UNSIGNED_INT, self.edges + e0 * 2 * 4) self.edges.unbind() # GL.glBindVertexArray(0) # self.vtis.unbind() self.gvs.unbind() GL.glDisableVertexAttribArray(self.shader_gvs0) GL.glDisableVertexAttribArray(self.shader_gvs1) GL.glDisableVertexAttribArray(self.shader_gvs2) GL.glDisableVertexAttribArray(self.shader_gvs3) self.boneIndices.unbind() GL.glDisableVertexAttribArray(self.shader_boneIndex) GL.glUseProgram(0) if self.vts is not None: self.vts.unbind() GL.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY) if self.vns is not None: self.vns.unbind() GL.glDisableClientState(GL.GL_NORMAL_ARRAY) GL.glDisable(GL.GL_LIGHTING) GL.glDisable(GL.GL_BLEND) GL.glDisable(GL.GL_TEXTURE_2D) GL.glBindTexture(GL.GL_TEXTURE_2D, 0) self.vs.unbind() GL.glDisableClientState(GL.GL_VERTEX_ARRAY)
def paintGL(self, p0=0, p1=None, drawOpts=DRAWOPT_DEFAULT): ''' :param drawOpts: OR combination of draw flags. default is :data:`UI.DRAWOPT_DEFAULT` ''' #if not self.d['draw'] or not self.d['visible']: return if not self.visible: return doingSelection = (p1 is not None) if p1 is None: p1 = len(self) if not self.GL_is_initialised: self.initializeGL() if p1 == 0: return # don't render if no vertices GL.glEnableClientState(GL.GL_VERTEX_ARRAY) self.vs.bind() GL.glVertexPointerf(self.vs) if self.image is not self.bindImage: self.create_bindImage() self.shader,self.shader_bi,self.shader_myMat,self.shader_bo = \ self.shader_notex,self.shader_notex_bi,self.shader_notex_myMat,self.shader_notex_bo if self.bindImage is not None: GL.glEnable(GL.GL_TEXTURE_2D) GL.glBindTexture(GL.GL_TEXTURE_2D, self.bindId) self.shader,self.shader_bi,self.shader_myMat,self.shader_bo = \ self.shader_tex,self.shader_tex_bi,self.shader_tex_myMat,self.shader_tex_bo if self.vts is not None: GL.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY) self.vts.bind() GL.glTexCoordPointerf(self.vts) if self.vns is not None: GL.glEnableClientState(GL.GL_NORMAL_ARRAY) self.vns.bind() GL.glNormalPointerf(self.vns) sel = State.getSel() if sel is None: self.selectedIndex, self.selectedName = -1, None if sel is not None: if self.selectedIndex == -1 or self.selectedName != sel: try: self.selectedIndex, self.selectedName = self.names.index( sel), sel except: self.selectedIndex, self.selectedName = -1, sel #if sel is not None: print ('selection',sel,sel[5:], self.selectedIndex, self.names[self.selectedIndex], self.names[:5]) GL.glEnable(GL.GL_BLEND) GL.glShadeModel(GL.GL_SMOOTH) GL.glEnable(GL.GL_LIGHTING) GL.glEnable(GL.GL_LIGHT0) Pmat = GL.glGetDoublev(GL.GL_PROJECTION_MATRIX) lightDir = -Pmat[:3, 2] # the direction the camera is looking GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, lightDir) #GL.glEnable(GL.GL_CULL_FACE) GL.glCullFace(GL.GL_BACK) GL.glFrontFace(GL.GL_CCW) GL.glEnableVertexAttribArray(self.shader_bi) self.vtis.bind() GL.glVertexAttribIPointer(self.shader_bi, 1, GL.GL_UNSIGNED_INT, 0, self.vtis) # write the vtis to bi ranges = [] for t0 in xrange(p0, p1, 128): # draw the geometries in batches of 128 t1 = min(t0 + 128, p1) if self.selectedIndex in xrange(t0, t1): if t0 < self.selectedIndex: ranges.append((t0, self.selectedIndex)) if t1 > self.selectedIndex + 1: ranges.append((self.selectedIndex + 1, t1)) else: ranges.append((t0, t1)) #print ('ranges',ranges) if self.selectedIndex >= p0 and self.selectedIndex < p1: # draw the selected object GL.glUseProgram(self.shader) i = self.selectedIndex GL.glUniformMatrix4fv( self.shader_myMat, 1, GL.GL_FALSE, self.transforms[i]) # put the transforms in myMat GL.glUniform1i(self.shader_bo, i) # put the offset if drawOpts & DRAWOPT_GEOMS: tr0, tr1 = self.tsplits[i], self.tsplits[i + 1] if tr1 > tr0: GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, [1, 0, 0, 1]) self.tris.bind() GL.glDrawElements(GL.GL_TRIANGLES, (tr1 - tr0) * 3, GL.GL_UNSIGNED_INT, self.tris + tr0 * 3 * 4) self.tris.unbind() e0, e1 = self.esplits[i], self.esplits[i + 1] if e1 > e0: GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, [0, 0, 0, 1]) self.edges.bind() GL.glLineWidth(0.5) GL.glDrawElements(GL.GL_LINES, (e1 - e0) * 2, GL.GL_UNSIGNED_INT, self.edges + e0 * 2 * 4) self.edges.unbind() if drawOpts & DRAWOPT_BONES: # draw bones b0, b1 = self.bsplits[i], self.bsplits[i + 1] if b1 > b0: GL.glLineWidth(1) GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, [1, 1, 0, 1]) self.bones.bind() GL.glDrawElements(GL.GL_LINES, (b1 - b0) * 2, GL.GL_UNSIGNED_INT, self.bones + b0 * 2 * 4) self.bones.unbind() if drawOpts & DRAWOPT_JOINTS: # draw joints #GL.glUseProgram(self.shader_point) #GL.glDrawArrays(GL.GL_POINTS, 0, 1) b0, b1 = self.bsplits[i], self.bsplits[i + 1] if b1 > b0: GL.glPointSize(self.pointSize) GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, [1, 0, 0, 1]) self.bones.bind() GL.glDrawElements(GL.GL_POINTS, (b1 - b0) * 2, GL.GL_UNSIGNED_INT, self.bones + b0 * 2 * 4) self.bones.unbind() if drawOpts & DRAWOPT_AXES: # draw axes TODO does this depend on len(vs) > 6 ? GL.glUseProgram(self.shader_xform) GL.glLineWidth(2) GL.glUniformMatrix4fv( self.shader_xform_myMat, 1, GL.GL_FALSE, self.transforms[i]) # put the transforms in myMat GL.glDrawArrays(GL.GL_LINES, 0, 6) GL.glUseProgram(self.shader) if drawOpts & DRAWOPT_GEOMS and ( self.drawStyle == 'smooth' or self.drawStyle == 'wire_over_smooth'): # draw triangles GL.glMaterialfv( GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, self.colour if self.colour is not None else [0.9, 0.9, 0.9, 1.0]) self.tris.bind() for t0, t1 in ranges: tr0, tr1 = self.tsplits[t0], self.tsplits[t1] if tr1 > tr0: GL.glUniformMatrix4fv( self.shader_myMat, t1 - t0, GL.GL_FALSE, self.transforms[t0:t1]) # put the transforms in myMat GL.glUniform1i(self.shader_bo, t0) # put the offset GL.glDrawElements(GL.GL_TRIANGLES, (tr1 - tr0) * 3, GL.GL_UNSIGNED_INT, self.tris + tr0 * 3 * 4) self.tris.unbind() if drawOpts & DRAWOPT_GEOMS and (self.drawStyle == 'wire' or self.drawStyle == 'wire_over_smooth'): # draw edges GL.glLineWidth(1) GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, [0, 0, 0, 1]) self.edges.bind() for t0, t1 in ranges: e0, e1 = self.esplits[t0], self.esplits[t1] if e1 > e0: GL.glUniformMatrix4fv( self.shader_myMat, t1 - t0, GL.GL_FALSE, self.transforms[t0:t1]) # put the transforms in myMat GL.glUniform1i(self.shader_bo, t0) # put the offset GL.glDrawElements(GL.GL_LINES, (e1 - e0) * 2, GL.GL_UNSIGNED_INT, self.edges + e0 * 2 * 4) self.edges.unbind() if drawOpts & DRAWOPT_BONES: # draw bones GL.glUseProgram(self.shader_notex) GL.glLineWidth(1) bone_colour = self.colour if self.colour is not None else [ 1, 1, 1, 1. ] GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, bone_colour) self.bones.bind() for t0, t1 in ranges: b0, b1 = self.bsplits[t0], self.bsplits[t1] if b1 > b0: GL.glUniformMatrix4fv( self.shader_notex_myMat, t1 - t0, GL.GL_FALSE, self.transforms[t0:t1]) # put the transforms in myMat GL.glUniform1i(self.shader_notex_bo, t0) # put the offset GL.glDrawElements(GL.GL_LINES, (b1 - b0) * 2, GL.GL_UNSIGNED_INT, self.bones + b0 * 2 * 4) self.bones.unbind() if drawOpts & DRAWOPT_JOINTS: # draw joints GL.glUseProgram(self.shader_notex) GL.glPointSize(self.pointSize) bone_colour = self.colour if self.colour is not None else [ 0, 1, 1, 1 ] GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, bone_colour) self.bones.bind() for t0, t1 in ranges: b0, b1 = self.bsplits[t0], self.bsplits[t1] if b1 > b0: GL.glUniformMatrix4fv( self.shader_notex_myMat, t1 - t0, GL.GL_FALSE, self.transforms[t0:t1]) # put the transforms in myMat GL.glUniform1i(self.shader_notex_bo, t0) # put the offset GL.glDrawElements(GL.GL_POINTS, (b1 - b0) * 2, GL.GL_UNSIGNED_INT, self.bones + b0 * 2 * 4) self.bones.unbind() if drawOpts & DRAWOPT_AXES: # draw axes TODO does this depend on len(vs) > 6 ? GL.glUseProgram(self.shader_xform) GL.glLineWidth(2) for t0, t1 in ranges: GL.glUniformMatrix4fv( self.shader_xform_myMat, t1 - t0, GL.GL_FALSE, self.transforms[t0:t1]) # put the transforms in myMat GL.glDrawArrays(GL.GL_LINES, 0, 6 * (t1 - t0)) GL.glDisableVertexAttribArray(self.shader_bi) self.vtis.unbind() GL.glUseProgram(0) if self.vts is not None: self.vts.unbind() GL.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY) if self.vns is not None: self.vns.unbind() GL.glDisableClientState(GL.GL_NORMAL_ARRAY) GL.glDisable(GL.GL_LIGHTING) GL.glDisable(GL.GL_BLEND) GL.glDisable(GL.GL_TEXTURE_2D) GL.glBindTexture(GL.GL_TEXTURE_2D, 0) self.vs.unbind() GL.glDisableClientState(GL.GL_VERTEX_ARRAY)