def draw_callback(self): if not hasattr(self, '_edge_shader'): self._edge_shader = QtOpenGL.QGLShaderProgram() self._edge_shader.addShaderFromSourceFile( QtOpenGL.QGLShader.Vertex, os.path.join(os.path.dirname(__file__), 'edge.vs')) self._edge_shader.addShaderFromSourceFile( QtOpenGL.QGLShader.Fragment, os.path.join(os.path.dirname(__file__), 'edge.fs')) self._edge_shader.bindAttributeLocation('position', 0) if not self._edge_shader.link(): print('Failed to link edge shader!') self._node_shader = QtOpenGL.QGLShaderProgram() self._node_shader.addShaderFromSourceFile( QtOpenGL.QGLShader.Vertex, os.path.join(os.path.dirname(__file__), 'node.vs')) self._node_shader.addShaderFromSourceFile( QtOpenGL.QGLShader.Fragment, os.path.join(os.path.dirname(__file__), 'node.fs')) self._node_shader.bindAttributeLocation('position', 0) self._node_shader.bindAttributeLocation('offset', 1) self._node_shader.bindAttributeLocation('color', 2) self._node_shader.bindAttributeLocation('selected_marked', 3) if not self._node_shader.link(): print('Failed to link node shader!') self._edge_shader.bind() self._edge_shader.setUniformValue('projection', self.plot.projection) self._edge_shader.setUniformValue('model', self.plot.model) self._edge_shader.setUniformValue('view', self.plot.view) self._edge_shader.setUniformValue('translation', self.plot.plot_translation) self._edge_shader.setUniformValue('scale', self.plot.plot_scale) orangeqt.Canvas3D.draw_edges(self) self._edge_shader.release() self._node_shader.bind() self._node_shader.setUniformValue('projection', self.plot.projection) self._node_shader.setUniformValue('model', self.plot.model) self._node_shader.setUniformValue('view', self.plot.view) self._node_shader.setUniformValue('translation', self.plot.plot_translation) self._node_shader.setUniformValue('scale', self.plot.plot_scale) self._node_shader.setUniformValue('mode', 0.) orangeqt.Canvas3D.draw_nodes(self) self._node_shader.release()
def initializeGL(self): self.makeObject() glEnable(GL_DEPTH_TEST) glEnable(GL_CULL_FACE) vshader = QtOpenGL.QGLShader(QtOpenGL.QGLShader.Vertex, self) vshader.compileSourceCode(self.vsrc) fshader = QtOpenGL.QGLShader(QtOpenGL.QGLShader.Fragment, self) fshader.compileSourceCode(self.fsrc) self.program = QtOpenGL.QGLShaderProgram(self) self.program.addShader(vshader) self.program.addShader(fshader) self.program.bindAttributeLocation('vertex', self.PROGRAM_VERTEX_ATTRIBUTE) self.program.bindAttributeLocation('texCoord', self.PROGRAM_TEXCOORD_ATTRIBUTE) self.program.link() self.program.bind() self.program.setUniformValue('texture', 0) self.program.enableAttributeArray(self.PROGRAM_VERTEX_ATTRIBUTE) self.program.enableAttributeArray(self.PROGRAM_TEXCOORD_ATTRIBUTE) self.program.setAttributeArray(self.PROGRAM_VERTEX_ATTRIBUTE, self.vertices) self.program.setAttributeArray(self.PROGRAM_TEXCOORD_ATTRIBUTE, self.texCoords)
def __init__(self): self._projection = QMatrix4x4() self._model = QMatrix4x4() self._view = QMatrix4x4() ## Shader used to draw primitives. Position and color of vertices specified through uniforms. Nothing fancy. vertex_shader_source = ''' attribute float index; varying vec4 color; uniform vec3 positions[6]; // 6 vertices for quad uniform vec4 colors[6]; uniform mat4 projection, model, view; void main(void) { int i = int(index); gl_Position = projection * view * model * vec4(positions[i], 1.); color = colors[i]; } ''' fragment_shader_source = ''' varying vec4 color; void main(void) { gl_FragColor = color; } ''' self._shader = QtOpenGL.QGLShaderProgram() self._shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Vertex, vertex_shader_source) self._shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Fragment, fragment_shader_source) self._shader.bindAttributeLocation('index', 0) if not self._shader.link(): print('Failed to link dummy renderer shader!') indices = numpy.array(range(6), dtype=numpy.float32) self._vertex_buffer = VertexBuffer(indices, [(1, GL_FLOAT)])