Changeset 8856:c62455efcbf5 in orange


Ignore:
Timestamp:
08/31/11 00:10:39 (3 years ago)
Author:
matejd <matejd@…>
Branch:
default
Convert:
e5f0b1122af9250cc84840d21dde9b97e92a8e5b
Message:

Implemented most of OpenGL renderer; converted old code in widgets to use it; few bits remain

Location:
orange/OrangeWidgets
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Visualize Qt/OWLinProj3DPlot.py

    r8852 r8856  
    177177        glMultMatrixd(numpy.array(self.modelview.data(), dtype=float)) 
    178178 
     179        self.renderer.set_transform(self.projection, self.modelview) 
     180 
    179181        if self.showAnchors: 
    180182            for anchor in self.anchor_data: 
     
    211213                self.renderText(x*1.2, y*1.2, z*1.2, label) 
    212214 
    213                 self.qglColor(self._theme.axis_color) 
    214                 glBegin(GL_LINES) 
    215                 glVertex3f(0, 0, 0) 
    216                 glVertex3f(x, y, z) 
    217                 glEnd() 
     215                self.renderer.draw_line( 
     216                    QVector3D(0, 0, 0), 
     217                    QVector3D(x, y, z), 
     218                    color=self._theme.axis_color) 
    218219 
    219220        glDepthMask(GL_TRUE) 
     
    222223            glEnable(GL_DEPTH_TEST) 
    223224            if self._arrow_lines: 
     225                # TODO: thick lines 
    224226                glLineWidth(3) 
    225227                for x, y, z, value, factor, color in self._arrow_lines: 
  • orange/OrangeWidgets/Visualize Qt/OWScatterPlot3D.py

    r8854 r8856  
    183183 
    184184    def before_draw(self): 
     185        if self.show_grid: 
     186            self.draw_grid() 
     187        if self.show_chassis: 
     188            self.draw_chassis() 
     189 
     190    def draw_chassis(self): 
    185191        glMatrixMode(GL_PROJECTION) 
    186192        glLoadIdentity() 
     
    190196        glMultMatrixd(numpy.array(self.modelview.data(), dtype=float)) 
    191197 
    192         if self.show_grid: 
    193             self.draw_grid() 
    194         if self.show_chassis: 
    195             self.draw_chassis() 
    196  
    197     def draw_chassis(self): 
     198        # TODO: line stipple with shaders? 
    198199        self.qglColor(self._theme.axis_values_color) 
    199200        glEnable(GL_LINE_STIPPLE) 
     
    221222 
    222223    def draw_grid(self): 
     224        self.renderer.set_transform(self.projection, self.modelview) 
     225 
    223226        cam_in_space = numpy.array([ 
    224227          self.camera[0]*self.camera_distance, 
     
    228231 
    229232        def _draw_grid(axis0, axis1, normal0, normal1, i, j): 
    230             self.qglColor(self._theme.grid_color) 
    231233            for axis, normal, coord_index in zip([axis0, axis1], [normal0, normal1], [i, j]): 
    232234                start, end = axis.copy() 
     
    238240                        continue 
    239241                    position = start + (end-start)*((value-start_value) / float(end_value-start_value)) 
    240                     glBegin(GL_LINES) 
    241                     glVertex3f(*position) 
    242                     glVertex3f(*(position-normal*1.)) 
    243                     glEnd() 
     242                    self.renderer.draw_line( 
     243                        QVector3D(*position), 
     244                        QVector3D(*(position-normal*1.)), 
     245                        color=self._theme.grid_color) 
    244246 
    245247        glDisable(GL_DEPTH_TEST) 
    246         glLineWidth(1) 
    247248        glEnable(GL_BLEND) 
    248249        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
  • orange/OrangeWidgets/plot/owopenglrenderer.py

    r8854 r8856  
     1from ctypes import c_void_p, c_char, c_char_p, POINTER 
     2 
     3from PyQt4.QtCore import * 
     4from PyQt4.QtGui import * 
     5from PyQt4 import QtOpenGL 
     6 
    17import OpenGL 
    28OpenGL.ERROR_CHECKING = False 
     
    713from OpenGL.GL.ARB.vertex_array_object import * 
    814from OpenGL.GL.ARB.vertex_buffer_object import * 
    9 from ctypes import c_void_p, c_char, c_char_p, POINTER 
     15import numpy 
    1016 
    1117class VertexBuffer: 
    12     def __init__(self, data, format_description): 
     18    def __init__(self, data, format_description, usage=GL_STATIC_DRAW): 
    1319        ''' 
    1420        Sample usage: geometry = VertexBuffer(data, size, [(3, GL_FLOAT), (4, GL_FLOAT)], GL_STATIC_DRAW) 
    1521 
     22        Currently available attribute types: GL_FLOAT # TODO 
     23 
    1624        Uses Vertex Arrays Object (OpenGL 3.0) if possible. Vertex Buffer Objects were introduced in 1.5 (2003). 
    1725        ''' 
    18         pass 
     26        self._format_description = format_description 
     27 
     28        if glGenVertexArrays: 
     29            self._vao = GLuint(42) 
     30            glGenVertexArrays(1, self._vao) 
     31            glBindVertexArray(self._vao) 
     32            vertex_buffer_id = glGenBuffers(1) 
     33            glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id) 
     34            glBufferData(GL_ARRAY_BUFFER, data, usage) 
     35 
     36            vertex_size = sum(attribute[0]*4 for attribute in format_description) 
     37            current_size = 0 
     38            for i, (num_components, type) in enumerate(format_description): 
     39                glVertexAttribPointer(i, num_components, type, GL_FALSE, vertex_size, c_void_p(current_size)) 
     40                glEnableVertexAttribArray(i) 
     41                current_size += num_components*4 
     42 
     43            glBindVertexArray(0) 
     44            glBindBuffer(GL_ARRAY_BUFFER, 0) 
     45        else: 
     46            self._vbo_id = glGenBuffers(1) 
     47            glBindBuffer(GL_ARRAY_BUFFER, self._vbo_id) 
     48            glBufferData(GL_ARRAY_BUFFER, data, usage) 
     49            glBindBuffer(GL_ARRAY_BUFFER, 0) 
     50 
     51    def draw(self, primitives, first, count): 
     52        '''glDrawArrays''' 
     53        if hasattr(self, '_vao'): 
     54            glBindVertexArray(self._vao) 
     55            glDrawArrays(primitives, first, count) 
     56            glBindVertexArray(0) 
     57        else: 
     58            glBindBuffer(GL_ARRAY_BUFFER, self._vbo_id) 
     59 
     60            vertex_size = sum(attribute[0]*4 for attribute in self._format_description) 
     61            current_size = 0 
     62            for i, (num_components, type) in enumerate(self._format_description): 
     63                glVertexAttribPointer(i, num_components, type, GL_FALSE, vertex_size, c_void_p(current_size)) 
     64                glEnableVertexAttribArray(i) 
     65                current_size += num_components*4 
     66 
     67            glDrawArrays(primitives, first, count) 
     68            for i in range(len(self._format_description)): 
     69                glDisableVertexAttribArray(i) 
     70            glBindBuffer(GL_ARRAY_BUFFER, 0) 
    1971 
    2072class OWOpenGLRenderer: 
     
    2779        self._modelview = QMatrix4x4() 
    2880 
     81        ## Shader used to draw primitives. Position and color of vertices specified through uniforms. Nothing fancy. 
    2982        vertex_shader_source = ''' 
    30             in vec3 position; 
     83            in float index; 
     84            varying vec4 color; 
     85 
     86            uniform vec3 positions[6]; // 6 vertices for quad 
     87            uniform vec4 colors[6]; 
    3188 
    3289            uniform mat4 projection; 
     
    3592            void main(void) 
    3693            { 
    37                 gl_Position = projection * modelview * vec4(position, 1.); 
     94                int i = int(index); 
     95                gl_Position = projection * modelview * vec4(positions[i], 1.); 
     96                color = colors[i]; 
    3897            } 
    3998            ''' 
    4099 
    41100        fragment_shader_source = ''' 
    42             uniform vec4 color; 
     101            in vec4 color; 
    43102 
    44103            void main(void) 
     
    48107            ''' 
    49108 
    50         self.grid_shader = QtOpenGL.QGLShaderProgram() 
    51         self.grid_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Vertex, vertex_shader_source) 
    52         self.grid_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Fragment, fragment_shader_source) 
     109        self._shader = QtOpenGL.QGLShaderProgram() 
     110        self._shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Vertex, vertex_shader_source) 
     111        self._shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Fragment, fragment_shader_source) 
    53112 
    54         self.grid_shader.bindAttributeLocation('position', 0) 
     113        self._shader.bindAttributeLocation('index', 0) 
    55114 
    56         if not self.grid_shader.link(): 
    57             print('Failed to link grid shader!') 
     115        if not self._shader.link(): 
     116            print('Failed to link dummy renderer shader!') 
     117 
     118        indices = numpy.array(range(6), dtype=numpy.float32)  
     119        self._vertex_buffer = VertexBuffer(indices, [(1, GL_FLOAT)]) 
    58120 
    59121    def set_transform(self, projection, modelview, viewport=None): 
     
    62124        if viewport: 
    63125            glViewport(*viewport) 
     126        self._shader.bind() 
     127        self._shader.setUniformValue('projection', projection) 
     128        self._shader.setUniformValue('modelview', modelview) 
     129        self._shader.release() 
    64130 
    65     def draw_point(self, location): 
    66         pass 
     131    def draw_line(self, position0, position1, color0=QColor(0, 0, 0), color1=QColor(0, 0 ,0), color=None): 
     132        '''Draws a line. position0 and position1 must be instances of QVector3D. colors are specified with QColor''' 
    67133 
    68     def draw_line(self, beginning, end): 
    69         '''Draws a line. beginnig and end must be instances of QVector3D.''' 
    70         # TODO 
    71         glBegin(GL_LINES) 
    72         glVertex3f(beginning.x(), beginning.y(), beginning.z()) 
    73         glVertex3f(end.x(), end.y(), end.z()) 
    74         glEnd() 
     134        if color: 
     135            colors = [color.redF(), color.greenF(), color.blueF(), color.alphaF()] * 2 
     136        else: 
     137            colors = [color0.redF(), color0.greenF(), color0.blueF(), color0.alphaF(), 
     138                      color1.redF(), color1.greenF(), color1.blueF(), color1.alphaF()] 
    75139 
    76     def draw_rectangle(self, vertex_min, vertex_max): 
    77         if len(vertex_min) == 2: 
    78             glBegin(GL_QUADS) 
    79             glVertex2f(vertex_min[0], vertex_min[1]) 
    80             glVertex2f(vertex_max[0], vertex_min[1]) 
    81             glVertex2f(vertex_max[0], vertex_max[1]) 
    82             glVertex2f(vertex_min[0], vertex_max[1]) 
    83             glEnd() 
     140        positions = [position0.x(), position0.y(), position0.z(), 
     141                     position1.x(), position1.y(), position1.z()] 
    84142 
    85     def draw_triangle(self, vertex0, vertex1, vertex2): 
    86         # TODO 
    87         if len(vertex0) == 2: 
    88             glBegin(GL_TRIANGLES) 
    89             glVertex2f(*vertex0) 
    90             glVertex2f(*vertex1) 
    91             glVertex2f(*vertex2) 
    92             glEnd() 
     143        self._shader.bind() 
     144        glUniform4fv(glGetUniformLocation(self._shader.programId(), 'colors'), len(colors)/4, numpy.array(colors, numpy.float32)) 
     145        glUniform3fv(glGetUniformLocation(self._shader.programId(), 'positions'), len(positions)/3, numpy.array(positions, numpy.float32)) 
     146        self._vertex_buffer.draw(GL_LINES, 0, 2) 
     147        self._shader.release() 
     148 
     149    def draw_rectangle(self, position0, position1, position2, position3, 
     150                       color0=QColor(0, 0, 0), color1=QColor(0, 0, 0), color2=QColor(0, 0, 0), color3=QColor(0, 0, 0), color=None): 
     151        if color: 
     152            colors = [color.redF(), color.greenF(), color.blueF(), color.alphaF()] * 6 
    93153        else: 
    94             glBegin(GL_TRIANGLES) 
    95             glVertex3f(*vertex0) 
    96             glVertex3f(*vertex1) 
    97             glVertex3f(*vertex2) 
    98             glEnd() 
     154            colors = [color0.redF(), color0.greenF(), color0.blueF(), color0.alphaF(), 
     155                      color1.redF(), color1.greenF(), color1.blueF(), color1.alphaF(), 
     156                      color3.redF(), color3.greenF(), color3.blueF(), color3.alphaF(), 
     157 
     158                      color3.redF(), color3.greenF(), color3.blueF(), color3.alphaF(), 
     159                      color1.redF(), color1.greenF(), color1.blueF(), color1.alphaF(), 
     160                      color2.redF(), color2.greenF(), color2.blueF(), color2.alphaF()] 
     161 
     162        positions = [position0.x(), position0.y(), position0.z(), 
     163                     position1.x(), position1.y(), position1.z(), 
     164                     position3.x(), position3.y(), position3.z(), 
     165 
     166                     position3.x(), position3.y(), position3.z(), 
     167                     position1.x(), position1.y(), position1.z(), 
     168                     position2.x(), position2.y(), position2.z()] 
     169 
     170        self._shader.bind() 
     171        glUniform4fv(glGetUniformLocation(self._shader.programId(), 'colors'), len(colors)/4, numpy.array(colors, numpy.float32)) 
     172        glUniform3fv(glGetUniformLocation(self._shader.programId(), 'positions'), len(positions)/3, numpy.array(positions, numpy.float32)) 
     173        self._vertex_buffer.draw(GL_TRIANGLES, 0, 6) 
     174        self._shader.release() 
     175 
     176    def draw_triangle(self, position0, position1, position2, 
     177                       color0=QColor(0, 0, 0), color1=QColor(0, 0, 0), color2=QColor(0, 0, 0), color=None): 
     178        if color: 
     179            colors = [color.redF(), color.greenF(), color.blueF(), color.alphaF()] * 3 
     180        else: 
     181            colors = [color0.redF(), color0.greenF(), color0.blueF(), color0.alphaF(), 
     182                      color1.redF(), color1.greenF(), color1.blueF(), color1.alphaF(), 
     183                      color2.redF(), color2.greenF(), color2.blueF(), color2.alphaF()] 
     184 
     185        positions = [position0.x(), position0.y(), position0.z(), 
     186                     position1.x(), position1.y(), position1.z(), 
     187                     position2.x(), position2.y(), position2.z()] 
     188 
     189        self._shader.bind() 
     190        glUniform4fv(glGetUniformLocation(self._shader.programId(), 'colors'), len(colors)/4, numpy.array(colors, numpy.float32)) 
     191        glUniform3fv(glGetUniformLocation(self._shader.programId(), 'positions'), len(positions)/3, numpy.array(positions, numpy.float32)) 
     192        self._vertex_buffer.draw(GL_TRIANGLES, 0, 3) 
     193        self._shader.release() 
  • orange/OrangeWidgets/plot/owplot3d.py

    r8855 r8856  
    3131from owplot import OWPlot 
    3232from owlegend import OWLegend, OWLegendItem, OWLegendTitle, OWLegendGradient 
     33from owopenglrenderer import OWOpenGLRenderer 
    3334 
    3435from OWColorPalette import ColorPaletteGenerator 
     
    5354except: 
    5455    pass 
    55  
    56 # TODO: move to owopenglrenderer 
    57 def draw_triangle(x0, y0, x1, y1, x2, y2): 
    58     glBegin(GL_TRIANGLES) 
    59     glVertex2f(x0, y0) 
    60     glVertex2f(x1, y1) 
    61     glVertex2f(x2, y2) 
    62     glEnd() 
    63  
    64 def draw_line(x0, y0, x1, y1): 
    65     glBegin(GL_LINES) 
    66     glVertex2f(x0, y0) 
    67     glVertex2f(x1, y1) 
    68     glEnd() 
    6956 
    7057def plane_visible(plane, location): 
     
    130117        self._symbol_geometry[symbol] = geometry 
    131118 
    132     def _draw_item_background(self, pos, item): 
     119    def _draw_item_background(self, pos, item, color): 
    133120        rect = item.rect().normalized().adjusted(pos.x(), pos.y(), pos.x(), pos.y()) 
    134         glBegin(GL_QUADS) 
    135         glVertex2f(rect.left(), rect.top()) 
    136         glVertex2f(rect.left(), rect.bottom()) 
    137         glVertex2f(rect.right(), rect.bottom()) 
    138         glVertex2f(rect.right(), rect.top()) 
    139         glEnd() 
     121        self.widget.renderer.draw_rectangle( 
     122            QVector3D(rect.left(), rect.top(), 0), 
     123            QVector3D(rect.left(), rect.bottom(), 0), 
     124            QVector3D(rect.right(), rect.bottom(), 0), 
     125            QVector3D(rect.right(), rect.top(), 0), 
     126            color=color) 
    140127 
    141128    def _draw_symbol(self, pos, symbol): 
     
    143130        color = symbol.color() 
    144131        size = symbol.size() / 2 
    145         glColor3f(color.red()/255., color.green()/255., color.blue()/255.) 
    146132        for v0, v1 in zip(edges[::2], edges[1::2]): 
    147133            x0, y0 = v0.x(), v0.y() 
    148134            x1, y1 = v1.x(), v1.y() 
    149             glBegin(GL_LINES) 
    150             glVertex2f(x0*size + pos.x(), -y0*size + pos.y()) 
    151             glVertex2f(x1*size + pos.x(), -y1*size + pos.y()) 
    152             glEnd() 
     135            self.widget.renderer.draw_line( 
     136                QVector3D(x0*size + pos.x(), -y0*size + pos.y(), 0), 
     137                QVector3D(x1*size + pos.x(), -y1*size + pos.y(), 0), 
     138                color=color) 
    153139 
    154140    def _paint(self, widget): 
    155141        '''Does all the drawing itself.''' 
     142        self.widget = widget 
    156143        glDisable(GL_DEPTH_TEST) 
    157144        glDisable(GL_BLEND) 
     
    162149            for item in items: 
    163150                if isinstance(item, OWLegendTitle): 
    164                     widget.qglColor(widget._theme.background_color) 
    165151                    pos = self.pos() + item.pos() 
    166                     self._draw_item_background(pos, item.rect_item) 
     152                    self._draw_item_background(pos, item.rect_item, widget._theme.background_color) 
    167153 
    168154                    widget.qglColor(widget._theme.labels_color) 
     
    170156                    widget.renderText(pos.x(), pos.y(), item.text_item.toPlainText(), item.text_item.font()) 
    171157                elif isinstance(item, OWLegendItem): 
    172                     widget.qglColor(widget._theme.background_color) 
    173158                    pos = self.pos() + item.pos() 
    174                     self._draw_item_background(pos, item.rect_item) 
     159                    self._draw_item_background(pos, item.rect_item, widget._theme.background_color) 
    175160 
    176161                    widget.qglColor(widget._theme.labels_color) 
     
    182167                    self._draw_symbol(pos, symbol) 
    183168                elif isinstance(item, OWLegendGradient): 
    184                     widget.qglColor(widget._theme.background_color) 
    185169                    pos = self.pos() + item.pos() 
    186170                    proxy = lambda: None 
    187171                    proxy.rect = lambda: item.rect 
    188                     self._draw_item_background(pos, proxy) 
     172                    self._draw_item_background(pos, proxy, widget._theme.background_color) 
    189173 
    190174                    widget.qglColor(widget._theme.labels_color) 
     
    195179                    pos = self.pos() + item.pos() + item.gradient_item.pos() 
    196180                    rect = item.gradient_item.rect().normalized().adjusted(pos.x(), pos.y(), pos.x(), pos.y()) 
    197                     glBegin(GL_QUADS) 
    198                     glColor3f(0, 0, 0) 
    199                     glVertex2f(rect.left(), rect.top()) 
    200                     glColor3f(0, 0, 1) 
    201                     glVertex2f(rect.left(), rect.bottom()) 
    202                     glVertex2f(rect.right(), rect.bottom()) 
    203                     glColor3f(0, 0, 0) 
    204                     glVertex2f(rect.right(), rect.top()) 
    205                     glEnd() 
     181                    widget.renderer.draw_rectangle( 
     182                        QVector3D(rect.left(), rect.top(), 0), 
     183                        QVector3D(rect.left(), rect.bottom(), 0), 
     184                        QVector3D(rect.right(), rect.bottom(), 0), 
     185                        QVector3D(rect.right(), rect.top(), 0), 
     186                        QColor(0, 0, 0), 
     187                        QColor(0, 0, 255), 
     188                        QColor(0, 0, 255), 
     189                        QColor(0, 0, 0)) 
    206190 
    207191class OWPlot3D(orangeqt.Plot3D): 
     
    327311 
    328312        # TODO: check hardware for OpenGL 3.x+ support 
     313 
     314        self.renderer = OWOpenGLRenderer() 
    329315 
    330316        if self._use_opengl_3: 
     
    622608 
    623609    def draw_helpers(self): 
    624         # TODO: use owopenglrenderer 
    625         glMatrixMode(GL_PROJECTION) 
    626         glLoadIdentity() 
    627         glOrtho(0, self.width(), self.height(), 0, -1, 1) 
    628         glMatrixMode(GL_MODELVIEW) 
    629         glLoadIdentity() 
    630610        glEnable(GL_BLEND) 
     611        glDisable(GL_DEPTH_TEST) 
     612 
     613        projection = QMatrix4x4() 
     614        projection.ortho(0, self.width(), self.height(), 0, -1, 1) 
     615        modelview = QMatrix4x4() 
     616 
     617        self.renderer.set_transform(projection, modelview) 
    631618 
    632619        if self.state == PlotState.SCALING: 
    633620            x, y = self.mouse_position.x(), self.mouse_position.y() 
    634             #TODO: replace with an image 
    635             self.qglColor(self._theme.helpers_color) 
    636             draw_triangle(x-5, y-30, x+5, y-30, x, y-40) 
    637             draw_line(x, y, x, y-30) 
    638             draw_triangle(x-5, y-10, x+5, y-10, x, y) 
    639  
    640             draw_triangle(x+10, y, x+20, y-5, x+20, y+5) 
    641             draw_line(x+10, y, x+40, y) 
    642             draw_triangle(x+50, y, x+40, y-5, x+40, y+5) 
     621            self.renderer.draw_triangle(QVector3D(x-5, y-30, 0), 
     622                                        QVector3D(x+5, y-30, 0), 
     623                                        QVector3D(x, y-40, 0), 
     624                                        color=self._theme.helpers_color) 
     625            self.renderer.draw_line(QVector3D(x, y, 0), 
     626                                    QVector3D(x, y-30, 0), 
     627                                    color=self._theme.helpers_color) 
     628            self.renderer.draw_triangle(QVector3D(x-5, y-10, 0), 
     629                                        QVector3D(x+5, y-10, 0), 
     630                                        QVector3D(x, y, 0), 
     631                                        color=self._theme.helpers_color) 
     632 
     633            self.renderer.draw_triangle(QVector3D(x+10, y, 0), 
     634                                        QVector3D(x+20, y-5, 0), 
     635                                        QVector3D(x+20, y+5, 0), 
     636                                        color=self._theme.helpers_color) 
     637            self.renderer.draw_line(QVector3D(x+10, y, 0), 
     638                                    QVector3D(x+40, y, 0), 
     639                                    color=self._theme.helpers_color) 
     640            self.renderer.draw_triangle(QVector3D(x+50, y, 0), 
     641                                        QVector3D(x+40, y-5, 0), 
     642                                        QVector3D(x+40, y+5, 0), 
     643                                        color=self._theme.helpers_color) 
     644 
     645            glMatrixMode(GL_PROJECTION) 
     646            glLoadIdentity() 
     647            glOrtho(0, self.width(), self.height(), 0, -1, 1) 
     648            glMatrixMode(GL_MODELVIEW) 
     649            glLoadIdentity() 
    643650 
    644651            self.renderText(x, y-50, 'Scale y axis', font=self._theme.labels_font) 
    645652            self.renderText(x+60, y+3, 'Scale x and z axes', font=self._theme.labels_font) 
    646653        elif self.state == PlotState.SELECTING: 
    647             self.qglColor(QColor(168, 202, 236, 50)) 
    648             glBegin(GL_QUADS) 
    649             glVertex2f(self._selection.left(), self._selection.top()) 
    650             glVertex2f(self._selection.right(), self._selection.top()) 
    651             glVertex2f(self._selection.right(), self._selection.bottom()) 
    652             glVertex2f(self._selection.left(), self._selection.bottom()) 
    653             glEnd() 
    654  
    655             self.qglColor(QColor(51, 153, 255, 192)) 
    656             draw_line(self._selection.left(), self._selection.top(), 
    657                       self._selection.right(), self._selection.top()) 
    658             draw_line(self._selection.right(), self._selection.top(), 
    659                       self._selection.right(), self._selection.bottom()) 
    660             draw_line(self._selection.right(), self._selection.bottom(), 
    661                       self._selection.left(), self._selection.bottom()) 
    662             draw_line(self._selection.left(), self._selection.bottom(), 
    663                       self._selection.left(), self._selection.top()) 
     654            internal_color = QColor(168, 202, 236, 50) 
     655            self.renderer.draw_rectangle(QVector3D(self._selection.left(), self._selection.top(), 0), 
     656                                         QVector3D(self._selection.right(), self._selection.top(), 0), 
     657                                         QVector3D(self._selection.right(), self._selection.bottom(), 0), 
     658                                         QVector3D(self._selection.left(), self._selection.bottom(), 0), 
     659                                         internal_color, 
     660                                         internal_color, 
     661                                         internal_color, 
     662                                         internal_color) 
     663 
     664            border_color = QColor(51, 153, 255, 192) 
     665            self.renderer.draw_line(QVector3D(self._selection.left(), self._selection.top(), 0), 
     666                                    QVector3D(self._selection.right(), self._selection.top(), 0), 
     667                                    border_color, border_color) 
     668            self.renderer.draw_line(QVector3D(self._selection.right(), self._selection.top(), 0), 
     669                                    QVector3D(self._selection.right(), self._selection.bottom(), 0), 
     670                                    border_color, border_color) 
     671            self.renderer.draw_line(QVector3D(self._selection.right(), self._selection.bottom(), 0), 
     672                                    QVector3D(self._selection.left(), self._selection.bottom(), 0), 
     673                                    border_color, border_color) 
     674            self.renderer.draw_line(QVector3D(self._selection.left(), self._selection.bottom(), 0), 
     675                                    QVector3D(self._selection.left(), self._selection.top(), 0), 
     676                                    border_color, border_color) 
    664677 
    665678    def build_axes(self): 
     
    703716        glMultMatrixd(numpy.array(self.modelview.data(), dtype=float)) 
    704717 
     718        self.renderer.set_transform(self.projection, self.modelview) 
     719 
    705720        def draw_axis(line): 
    706721            self.qglColor(self._theme.axis_color) 
    707             glLineWidth(2) 
     722            glLineWidth(2) # TODO: how to draw thick lines? 
    708723            glBegin(GL_LINES) 
    709724            glVertex3f(*line[0]) 
     
    720735                if start_value <= value <= end_value: 
    721736                    position = start + (end-start)*((value-start_value) / length) 
    722                     glBegin(GL_LINES) 
    723                     glVertex3f(*(position)) 
    724                     glVertex3f(*(position+normal*0.03)) 
    725                     glEnd() 
     737                    self.renderer.draw_line( 
     738                        QVector3D(*position), 
     739                        QVector3D(*(position + normal*0.03)), 
     740                        color=self._theme.axis_values_color) 
    726741                    position += normal * 0.1 
    727742                    self.renderText(position[0], 
     
    731746 
    732747        def draw_values(axis, coord_index, normal, axis_labels): 
    733             self.qglColor(self._theme.axis_values_color) 
    734748            glLineWidth(1) 
    735749            if axis_labels != None: 
     
    745759                position = start + (end-start)*((value-start_value) / float(end_value-start_value)) 
    746760                text = ('%%.%df' % num_frac) % value 
    747                 glBegin(GL_LINES) 
    748                 glVertex3f(*(position)) 
    749                 glVertex3f(*(position+normal*0.03)) 
    750                 glEnd() 
     761                self.renderer.draw_line( 
     762                    QVector3D(*position), 
     763                    QVector3D(*(position+normal*0.03)), 
     764                    color=self._theme.axis_values_color) 
    751765                position += normal * 0.1 
    752766                self.renderText(position[0], 
     
    11891203                    self.auto_send_selection_callback() 
    11901204 
     1205        self.tooltip_fbo_dirty = True 
    11911206        self.unsetCursor() 
    11921207        self.state = PlotState.IDLE 
Note: See TracChangeset for help on using the changeset viewer.