Example #1
0
	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)
Example #2
0
	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))
Example #3
0
	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)
Example #4
0
	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()
Example #5
0
    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)
Example #6
0
    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)