Changeset 8847:04a476b09d7f in orange


Ignore:
Timestamp:
08/30/11 12:09:12 (3 years ago)
Author:
matejd <matejd@…>
Branch:
default
Convert:
8d8c1f9708cc0a40836d843319e0d8925e9d8f9c
Message:

Flipped cones in sphereviz, added new camera options (center, random attribute), field of view slider; added mouse sensitivity option; work on opengl renderer

Location:
orange/OrangeWidgets
Files:
5 edited

Legend:

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

    r8828 r8847  
    4242                    "graph.showLegend", "graph.useDifferentSymbols", "autoSendSelection", "graph.useDifferentColors", "graph.showValueLines", 
    4343                    "graph.tooltipKind", "graph.tooltipValue", "toolbarSelection", 
    44                     "graph.showProbabilities", "graph.squareGranularity", "graph.spaceBetweenCells", "graph.useAntialiasing" 
     44                    "graph.showProbabilities", "graph.squareGranularity", "graph.spaceBetweenCells", "graph.useAntialiasing", 
    4545                    "valueScalingType", "showAllAttributes", "colorSettings", "selectedSchemaIndex", "addProjectedPositions"] 
    4646    jitterSizeNums = [0.0, 0.01, 0.1, 0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20] 
     
    101101        self.graph.showValueLines = 0 
    102102        self.graph.valueLineLength = 5 
     103        self.dark_theme = False 
     104 
     105        if "3d" in name_lower: 
     106            self.settingsList.append("graph.use_2d_symbols") 
     107            self.settingsList.append("graph.mouse_sensitivity") 
     108            self.settingsList.append("dark_theme") 
    103109 
    104110        #load settings 
     
    229235 
    230236        if "3d" in name_lower: 
    231             self.dark_theme = False 
    232237            OWGUI.checkBox(box, self, 'dark_theme', 'Dark theme', callback=self.on_theme_change) 
    233             OWGUI.checkBox(box, self, 'graph.camera_in_center', 'Camera in center', callback = self.updateGraph, tooltip = "Look at the data from the center") 
    234238            OWGUI.checkBox(box, self, 'graph.use_2d_symbols', '2D symbols', callback = self.updateGraph, tooltip = "Use 2D symbols") 
     239            self.on_theme_change() 
     240            if "sphereviz" in name_lower: 
     241                box = OWGUI.widgetBox(self.SettingsTab, 'Camery type', orientation = "horizontal") 
     242                c = OWGUI.comboBox(box, self, 'graph.camera_type', callback=self.graph.update_camera_type, sendSelectedValue=0) 
     243                c.addItem('Default') 
     244                c.addItem('Center') 
     245                c.addItem('Random attribute') 
     246                OWGUI.hSlider(box, self, 'graph.camera_angle', label='FOV', minValue=45, maxValue=180, step=1, callback = self.graph.update, tooltip='Field of view angle') 
     247            box = OWGUI.widgetBox(self.SettingsTab, 'Mouse', orientation = "horizontal") 
     248            OWGUI.hSlider(box, self, 'graph.mouse_sensitivity', label='Sensitivity', minValue=1, maxValue=10, step=1, callback = self.graph.update, tooltip='Change mouse sensitivity') 
    235249        else: 
    236250            self.graph.gui.filled_symbols_check_box(box) 
  • orange/OrangeWidgets/Visualize Qt/OWScatterPlot3D.py

    r8838 r8847  
    280280                    'plot.show_chassis', 'plot.show_axes', 
    281281                    'auto_send_selection', 'auto_send_selection_update', 
    282                     'plot.jitter_size', 'plot.jitter_continuous'] 
     282                    'plot.jitter_size', 'plot.jitter_continuous', 'dark_theme'] 
    283283    contextHandlers = {'': DomainContextHandler('', ['x_attr', 'y_attr', 'z_attr'])} 
    284284    jitter_sizes = [0.0, 0.1, 0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 30, 40, 50] 
     
    430430        self.loadSettings() 
    431431        self.plot.update_camera() 
     432        self.on_theme_change() 
    432433 
    433434        self._set_behavior_replace() 
  • orange/OrangeWidgets/Visualize Qt/OWSphereviz3D.py

    r8845 r8847  
    55''' 
    66 
     7from math import pi 
     8from random import choice 
     9 
    710from plot.owplot3d import * 
    811from plot.primitives import parse_obj 
     
    1720    def __init__(self, widget, parent=None, name='SpherevizPlot'): 
    1821        OWLinProj3DPlot.__init__(self, widget, parent, name) 
     22 
     23        self.camera_angle = 90 
     24        self.camera_type = 0 # Default, center, attribute 
    1925 
    2026    def _build_anchor_grid(self): 
     
    121127        fragment_shader_source = ''' 
    122128            varying float transparency; 
    123             uniform bool invert_transparency; 
     129            uniform bool use_transparency; 
    124130 
    125131            void main(void) 
    126132            { 
    127133                gl_FragColor = vec4(0.5, 0.5, 0.5, 1. - transparency - 0.6); 
    128                 if (invert_transparency) 
    129                     gl_FragColor.a = transparency; 
     134                if (!use_transparency) 
     135                    gl_FragColor.a = 1.; 
    130136            } 
    131137            ''' 
     
    173179        self.before_draw_callback = lambda: self.before_draw() 
    174180 
     181    def update_camera_type(self): 
     182        if self.camera_type == 2: 
     183            self._random_anchor = choice(self.anchor_data) 
     184        self.update() 
     185 
    175186    def before_draw(self): 
    176         # Override modelview (scatterplot points camera somewhat below the center, which doesn't 
    177         # look good with sphere) 
    178187        modelview = QMatrix4x4() 
    179         if self.camera_in_center: 
     188        if self.camera_type == 2: 
     189            modelview.lookAt( 
     190                QVector3D(self._random_anchor[0], self._random_anchor[1], self._random_anchor[2]), 
     191                QVector3D(self.camera[0], 
     192                          self.camera[1], 
     193                          self.camera[2]), 
     194                QVector3D(0, 1, 0)) 
     195            projection = QMatrix4x4() 
     196            projection.perspective(self.camera_angle, float(self.width()) / self.height(), 
     197                                   0.01, 5.) 
     198            self.projection = projection 
     199        elif self.camera_type == 1: 
    180200            modelview.lookAt( 
    181201                QVector3D(0, 0, 0), 
     
    185205                QVector3D(0, 1, 0)) 
    186206            projection = QMatrix4x4() 
    187             projection.perspective(90., float(self.width()) / self.height(), 
     207            projection.perspective(self.camera_angle, float(self.width()) / self.height(), 
    188208                                   0.01, 5.) 
    189209            self.projection = projection 
     
    228248                modelview = modelview * rotation 
    229249                modelview.rotate(-90, 1, 0, 0) 
    230                 modelview.translate(0, -0.02, 0) 
    231                 modelview.scale(-0.02, -0.02, -0.02) 
     250                modelview.translate(0, -0.05, 0) 
     251                modelview.scale(0.02, 0.02, 0.02) 
    232252                self.cone_shader.setUniformValue('modelview', modelview) 
    233253 
     
    267287        self.sphere_shader.setUniformValue('modelview', self.modelview) 
    268288        self.sphere_shader.setUniformValue('cam_position', QVector3D(*self.camera)*self.camera_distance) 
    269         self.sphere_shader.setUniformValue('invert_transparency', self.camera_in_center) 
     289        self.sphere_shader.setUniformValue('use_transparency', self.camera_type == 0) 
    270290        glBindVertexArray(self.sphere_vao_id) 
    271291 
     
    276296 
    277297    def mouseMoveEvent(self, event): 
    278         self.invert_mouse_x = self.camera_in_center 
     298        self.invert_mouse_x = self.camera_type != 0 
    279299        OWLinProj3DPlot.mouseMoveEvent(self, event) 
    280300 
    281301class OWSphereviz3D(OWLinProjQt): 
    282     settingsList = ['showAllAttributes'] 
    283  
    284302    def __init__(self, parent=None, signalManager=None): 
    285303        OWLinProjQt.__init__(self, parent, signalManager, "Sphereviz 3D", graphClass=OWSphereviz3DPlot) 
  • orange/OrangeWidgets/plot/owopenglrenderer.py

    r8786 r8847  
     1import OpenGL 
     2OpenGL.ERROR_CHECKING = False 
     3OpenGL.ERROR_LOGGING = False 
     4OpenGL.FULL_LOGGING = False 
     5OpenGL.ERROR_ON_COPY = False 
     6from OpenGL.GL import * 
     7from OpenGL.GL.ARB.vertex_array_object import * 
     8from OpenGL.GL.ARB.vertex_buffer_object import * 
     9from ctypes import c_void_p, c_char, c_char_p, POINTER 
    110 
    2 class VAO: 
     11class VertexBuffer: 
    312    def __init__(self, data, format_description): 
    413        ''' 
    5         Sample usage: geometry = VAO(data, size, [(3, GL_FLOAT), (4, GL_FLOAT)], GL_STATIC_DRAW) 
     14        Sample usage: geometry = VertexBuffer(data, size, [(3, GL_FLOAT), (4, GL_FLOAT)], GL_STATIC_DRAW) 
     15 
     16        Uses Vertex Arrays Object (OpenGL 3.0) if possible. Vertex Buffer Objects were introduced in 1.5 (2003). 
    617        ''' 
    718        pass 
     
    1324       the usage of that functionality by providing methods which resemble immediate mode.''' 
    1425    def __init__(self): 
    15         pass 
     26        self._projection = QMatrix4x4() 
     27        self._modelview = QMatrix4x4() 
     28 
     29        vertex_shader_source = ''' 
     30            in vec3 position; // TODO: research qualifiers 
     31 
     32            uniform mat4 projection; 
     33            uniform mat4 modelview; 
     34 
     35            void main(void) 
     36            { 
     37                gl_Position = projection * modelview * vec4(position, 1.); 
     38            } 
     39            ''' 
     40 
     41        fragment_shader_source = ''' 
     42            uniform vec4 color; 
     43 
     44            void main(void) 
     45            { 
     46                gl_FragColor = color; 
     47            } 
     48            ''' 
     49 
     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) 
     53 
     54        self.grid_shader.bindAttributeLocation('position', 0) 
     55 
     56        if not self.grid_shader.link(): 
     57            print('Failed to link grid shader!') 
     58 
     59    def set_transform(self, projection, modelview, viewport=None): 
     60        self._projection = projection 
     61        self._modelview = modelview 
     62        if viewport: 
     63            glViewport(*viewport) 
    1664 
    1765    def draw_point(self, location): 
     
    1967 
    2068    def draw_line(self, beginning, end): 
    21         pass 
     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() 
    2275 
    2376    def draw_rectangle(self, vertex_min, vertex_max): 
    24         pass 
     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() 
    2584 
    2685    def draw_triangle(self, vertex0, vertex1, vertex2): 
    27         pass 
     86        # TODO 
     87        if len(vertex0) == 2: 
     88            glBegin(GL_TRIANGLES) 
     89            glVertex2f(*vertex0) 
     90            glVertex2f(*vertex1) 
     91            glVertex2f(*vertex2) 
     92            glEnd() 
     93        else: 
     94            glBegin(GL_TRIANGLES) 
     95            glVertex3f(*vertex0) 
     96            glVertex3f(*vertex1) 
     97            glVertex3f(*vertex2) 
     98            glEnd() 
  • orange/OrangeWidgets/plot/owplot3d.py

    r8837 r8847  
    241241        self.symbol_scale = 1. 
    242242        self.alpha_value = 255 
    243         self.zoomed_size = [1., 1., 1.] 
     243        self._zoomed_size = [1., 1., 1.] 
    244244 
    245245        self.state = PlotState.IDLE 
     
    257257        self.mouse_position = QPoint(0, 0) 
    258258        self.invert_mouse_x = False 
     259        self.mouse_sensitivity = 5 
    259260 
    260261        # TODO: these should be moved down to Scatterplot3D 
     
    275276        self.plot_translation = -array([0.5, 0.5, 0.5]) 
    276277 
    277         self.zoom_stack = [] 
     278        self._zoom_stack = [] 
    278279        self.zoom_into_selection = True # If True, zoom is done after selection, else SelectionBehavior is considered 
    279280 
     
    958959 
    959960    def set_new_zoom(self, x_min, x_max, y_min, y_max, z_min, z_max, plot_coordinates=False): 
    960         '''Specifies new zoom in data coordinates.''' 
    961         self.zoom_stack.append((self.plot_scale, self.plot_translation)) 
     961        '''Specifies new zoom in data or plot coordinates.''' 
     962        self._zoom_stack.append((self.plot_scale, self.plot_translation)) 
    962963 
    963964        max = array([x_max, y_max, z_max]).copy() 
     
    972973        # Avoid division by zero by adding a small value (this happens when zooming in 
    973974        # on elements with the same value of an attribute). 
    974         self.zoomed_size = array(map(lambda i: i+1e-5 if i == 0 else i, max-min)) 
    975         new_scale = 1. / self.zoomed_size 
     975        self._zoomed_size = array(map(lambda i: i+1e-5 if i == 0 else i, max-min)) 
     976        new_scale = 1. / self._zoomed_size 
    976977        self._animate_new_scale_translation(new_scale, new_translation) 
    977978 
     
    981982        # Animate zooming: translate first for a number of steps, 
    982983        # then scale. Make sure it doesn't take too long. 
     984        print('animating') 
    983985        start = time.time() 
    984986        for i in range(num_steps): 
     
    996998 
    997999    def zoom_out(self): 
    998         if len(self.zoom_stack) < 1: 
     1000        if len(self._zoom_stack) < 1: 
    9991001            new_translation = -array([0.5, 0.5, 0.5]) 
    10001002            new_scale = array([1., 1., 1.]) 
    10011003        else: 
    1002             new_scale, new_translation = self.zoom_stack.pop() 
     1004            new_scale, new_translation = self._zoom_stack.pop() 
    10031005        self._animate_new_scale_translation(new_scale, new_translation) 
    1004         self.zoomed_size = 1. / new_scale 
     1006        self._zoomed_size = 1. / new_scale 
    10051007 
    10061008    def save_to_file(self): 
     
    10871089 
    10881090    def _check_mouseover(self, pos): 
    1089         if self.mouseover_callback != None and self.state == PlotState.IDLE:# and\ 
    1090             #(not self.show_legend or not self.legend.contains(pos.x(), pos.y())): 
     1091        if self.mouseover_callback != None and self.state == PlotState.IDLE: 
    10911092            if abs(pos.x() - self.tooltip_win_center[0]) > 100 or\ 
    10921093               abs(pos.y() - self.tooltip_win_center[1]) > 100: 
     
    11251126            self._legend.mouseMoveEvent(event) 
    11261127        elif self.state == PlotState.ROTATING: 
    1127             self.yaw += dx / (self.rotation_factor*self.width()) 
    1128             self.pitch += dy / (self.rotation_factor*self.height()) 
     1128            self.yaw += (self.mouse_sensitivity / 5.) * dx / (self.rotation_factor*self.width()) 
     1129            self.pitch += (self.mouse_sensitivity / 5.) * dy / (self.rotation_factor*self.height()) 
    11291130            self.update_camera() 
    11301131        elif self.state == PlotState.PANNING: 
     
    11381139            dx = pos.x() - self.scaling_init_pos.x() 
    11391140            dy = pos.y() - self.scaling_init_pos.y() 
    1140             dx /= float(self.zoomed_size[0]) # TODO 
    1141             dy /= float(self.zoomed_size[1]) 
     1141            dx /= float(self._zoomed_size[0]) # TODO 
     1142            dy /= float(self._zoomed_size[1]) 
    11421143            dx /= self.scale_factor * self.width() 
    11431144            dy /= self.scale_factor * self.height() 
     
    12321233 
    12331234    def clear_plot_transformations(self): 
    1234         self.zoom_stack = [] 
    1235         self.zoomed_size = [1., 1., 1.] 
     1235        self._zoom_stack = [] 
     1236        self._zoomed_size = [1., 1., 1.] 
    12361237        self.plot_translation = -array([0.5, 0.5, 0.5]) 
    12371238        self.plot_scale = array([1., 1., 1.]) 
Note: See TracChangeset for help on using the changeset viewer.