Changeset 8748:ab54e7ebaa6c in orange


Ignore:
Timestamp:
08/23/11 21:02:14 (3 years ago)
Author:
matejd <matejd@…>
Branch:
default
Convert:
9390ae006108e3d3f5e39ef6defb4900f5be4b6c
Message:

Moved some code to OWLinProj3DPlot to avoid future duplication; temporary state override (state variable gets modified by OWPlotGUI)

Location:
orange/OrangeWidgets
Files:
4 edited

Legend:

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

    r8747 r8748  
    1111 
    1212class OWLinProj3D(OWLinProjQt): 
    13     settingsList = ['showAllAttributes'] 
     13    settingsList = ['showAllAttributes'] #TODO 
    1414 
    1515    def __init__(self, parent=None, signalManager=None): 
  • orange/OrangeWidgets/Visualize Qt/OWLinProj3DPlot.py

    r8747 r8748  
    11from plot.owplot3d import * 
    22from plot.owplotgui import * 
     3from plot.primitives import parse_obj 
    34 
    45from Orange.preprocess.scaling import ScaleLinProjData3D 
     
    3334    def setData(self, data, subsetData=None, **args): 
    3435        ScaleLinProjData3D.setData(self, data, subsetData, **args) 
    35         #self.initializeGL() # Apparently this is not called already 
    3636        self.makeCurrent() 
     37        self.state = PlotState.IDLE # Override for now, apparently this is modified by OWPlotGUI 
     38 
     39        cone_data = parse_obj('cone_hq.obj') 
     40        vertices = [] 
     41        for v0, v1, v2, n0, n1, n2 in cone_data: 
     42            vertices.extend([v0[0],v0[1],v0[2], n0[0],n0[1],n0[2], 
     43                             v1[0],v1[1],v1[2], n1[0],n1[1],n1[2], 
     44                             v2[0],v2[1],v2[2], n2[0],n2[1],n2[2]]) 
     45 
     46        self.cone_vao_id = GLuint(0) 
     47        glGenVertexArrays(1, self.cone_vao_id) 
     48        glBindVertexArray(self.cone_vao_id) 
     49 
     50        vertex_buffer_id = glGenBuffers(1) 
     51        glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id) 
     52        glBufferData(GL_ARRAY_BUFFER, numpy.array(vertices, 'f'), GL_STATIC_DRAW) 
     53 
     54        vertex_size = (3+3)*4 
     55        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(0)) 
     56        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(3*4)) 
     57        glEnableVertexAttribArray(0) 
     58        glEnableVertexAttribArray(1) 
     59 
     60        glBindVertexArray(0) 
     61        glBindBuffer(GL_ARRAY_BUFFER, 0) 
     62 
     63        self.cone_vao_id.num_vertices = len(vertices) / (vertex_size / 4) 
     64 
     65        vertex_shader_source = '''#version 150 
     66            in vec3 position; 
     67            in vec3 normal; 
     68 
     69            out vec4 color; 
     70 
     71            uniform mat4 projection; 
     72            uniform mat4 modelview; 
     73 
     74            const vec3 light_direction = normalize(vec3(-0.7, 0.42, 0.21)); 
     75 
     76            void main(void) 
     77            { 
     78                gl_Position = projection * modelview * vec4(position, 1.); 
     79                float diffuse = clamp(dot(light_direction, normalize((modelview * vec4(normal, 0.)).xyz)), 0., 1.); 
     80                color = vec4(vec3(0., 1., 0.) * diffuse, 1.); 
     81            } 
     82            ''' 
     83 
     84        fragment_shader_source = '''#version 150 
     85            in vec4 color; 
     86 
     87            void main(void) 
     88            { 
     89                gl_FragColor = color; 
     90            } 
     91            ''' 
     92 
     93        self.cone_shader = QtOpenGL.QGLShaderProgram() 
     94        self.cone_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Vertex, vertex_shader_source) 
     95        self.cone_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Fragment, fragment_shader_source) 
     96 
     97        self.cone_shader.bindAttributeLocation('position', 0) 
     98        self.cone_shader.bindAttributeLocation('normal', 1) 
     99 
     100        if not self.cone_shader.link(): 
     101            print('Failed to link cone shader!') 
    37102 
    38103    def updateData(self, labels=None, setAnchors=0, **args): 
  • orange/OrangeWidgets/Visualize Qt/OWSphereviz3D.py

    r8747 r8748  
    5151 
    5252        self.sphere_vao_id.num_vertices = len(vertices) / (vertex_size / 4) 
    53  
    54         cone_data = parse_obj('cone_hq.obj') 
    55         vertices = [] 
    56         for v0, v1, v2, n0, n1, n2 in cone_data: 
    57             vertices.extend([v0[0],v0[1],v0[2], n0[0],n0[1],n0[2], 
    58                              v1[0],v1[1],v1[2], n1[0],n1[1],n1[2], 
    59                              v2[0],v2[1],v2[2], n2[0],n2[1],n2[2]]) 
    60  
    61         self.cone_vao_id = GLuint(0) 
    62         glGenVertexArrays(1, self.cone_vao_id) 
    63         glBindVertexArray(self.cone_vao_id) 
    64  
    65         vertex_buffer_id = glGenBuffers(1) 
    66         glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id) 
    67         glBufferData(GL_ARRAY_BUFFER, numpy.array(vertices, 'f'), GL_STATIC_DRAW) 
    68  
    69         vertex_size = (3+3)*4 
    70         glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(0)) 
    71         glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(3*4)) 
    72         glEnableVertexAttribArray(0) 
    73         glEnableVertexAttribArray(1) 
    74  
    75         glBindVertexArray(0) 
    76         glBindBuffer(GL_ARRAY_BUFFER, 0) 
    77  
    78         self.cone_vao_id.num_vertices = len(vertices) / (vertex_size / 4) 
    7953 
    8054        # Geometry shader-based wireframe rendering 
     
    164138        if not self.sphere_shader.link(): 
    165139            print('Failed to link sphere shader!') 
    166  
    167         vertex_shader_source = '''#version 150 
    168             in vec3 position; 
    169             in vec3 normal; 
    170  
    171             out vec4 color; 
    172  
    173             uniform mat4 projection; 
    174             uniform mat4 modelview; 
    175  
    176             const vec3 light_direction = normalize(vec3(-0.7, 0.42, 0.21)); 
    177  
    178             void main(void) 
    179             { 
    180                 gl_Position = projection * modelview * vec4(position, 1.); 
    181                 float diffuse = clamp(dot(light_direction, normalize((modelview * vec4(normal, 0.)).xyz)), 0., 1.); 
    182                 color = vec4(vec3(0., 1., 0.) * diffuse, 1.); 
    183             } 
    184             ''' 
    185         fragment_shader_source = '''#version 150 
    186             in vec4 color; 
    187  
    188             void main(void) 
    189             { 
    190                 gl_FragColor = color; 
    191             } 
    192             ''' 
    193  
    194         self.cone_shader = QtOpenGL.QGLShaderProgram() 
    195         self.cone_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Vertex, vertex_shader_source) 
    196         self.cone_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Fragment, fragment_shader_source) 
    197  
    198         self.cone_shader.bindAttributeLocation('position', 0) 
    199         self.cone_shader.bindAttributeLocation('normal', 1) 
    200  
    201         if not self.cone_shader.link(): 
    202             print('Failed to link cone shader!') 
    203140 
    204141        self.before_draw_callback = lambda: self.before_draw() 
     
    227164                QVector3D(0, 1, 0)) 
    228165        self.modelview = modelview 
     166 
    229167        self.draw_sphere() 
     168 
     169        glEnable(GL_DEPTH_TEST) 
     170        glDisable(GL_BLEND) 
     171 
     172        if self.showAnchors: 
     173            for anchor in self.anchor_data: 
     174                x, y, z, label = anchor 
     175 
     176                direction = QVector3D(x, y, z) 
     177                up = QVector3D(0, 1, 0) 
     178                right = QVector3D.crossProduct(direction, up).normalized() 
     179                up = QVector3D.crossProduct(right, direction) 
     180                rotation = QMatrix4x4() 
     181                rotation.setColumn(0, QVector4D(right, 0)) 
     182                rotation.setColumn(1, QVector4D(up, 0)) 
     183                rotation.setColumn(2, QVector4D(direction, 0)) 
     184 
     185                self.cone_shader.bind() 
     186                self.cone_shader.setUniformValue('projection', self.projection) 
     187                modelview = QMatrix4x4(self.modelview) 
     188                modelview.translate(x, y, z) 
     189                modelview = modelview * rotation 
     190                modelview.rotate(-90, 1, 0, 0) 
     191                modelview.translate(0, -0.03, 0) 
     192                modelview.scale(-0.03, -0.03, -0.03) 
     193                self.cone_shader.setUniformValue('modelview', modelview) 
     194 
     195                glBindVertexArray(self.cone_vao_id) 
     196                glDrawArrays(GL_TRIANGLES, 0, self.cone_vao_id.num_vertices) 
     197                glBindVertexArray(0) 
     198 
     199                self.cone_shader.release() 
     200 
     201                glColor4f(0, 0, 0, 1) 
     202                self.renderText(x*1.2, y*1.2, z*1.2, label) 
     203 
     204            num_parts = 30 
     205            anchors = array([a[:3] for a in self.anchor_data]) 
     206            for anchor in self.anchor_data: 
     207                a0 = array(anchor[:3]) 
     208                neighbours = anchors.copy() 
     209                neighbours = [(((n-a0)**2).sum(), n)  for n in neighbours] 
     210                neighbours.sort(key=lambda e: e[0]) 
     211                for i in range(1, min(len(anchors), 4)):  
     212                    difference = neighbours[i][1]-a0 
     213                    glBegin(GL_LINES) 
     214                    for j in range(num_parts): 
     215                        glVertex3f(*normalize(a0 + difference*j/float(num_parts))) 
     216                        glVertex3f(*normalize(a0 + difference*(j+1)/float(num_parts))) 
     217                    glEnd(GL_LINES) 
    230218 
    231219    def draw_sphere(self): 
     
    295283            #glEnd() 
    296284 
    297         glEnable(GL_DEPTH_TEST) 
    298         glDisable(GL_BLEND) 
    299         radius = 1. 
    300  
    301         if self.showAnchors: 
    302             for anchor in self.anchor_data: 
    303                 x, y, z, label = anchor 
    304  
    305                 direction = QVector3D(x, y, z) 
    306                 up = QVector3D(0, 1, 0) 
    307                 right = QVector3D.crossProduct(direction, up).normalized() 
    308                 up = QVector3D.crossProduct(right, direction) 
    309                 rotation = QMatrix4x4() 
    310                 rotation.setColumn(0, QVector4D(right, 0)) 
    311                 rotation.setColumn(1, QVector4D(up, 0)) 
    312                 rotation.setColumn(2, QVector4D(direction, 0)) 
    313  
    314                 self.cone_shader.bind() 
    315                 self.cone_shader.setUniformValue('projection', self.projection) 
    316                 modelview = QMatrix4x4(self.modelview) 
    317                 modelview.translate(x, y, z) 
    318                 modelview = modelview * rotation 
    319                 modelview.rotate(-90, 1, 0, 0) 
    320                 modelview.translate(0, -0.03, 0) 
    321                 modelview.scale(-0.03, -0.03, -0.03) 
    322                 self.cone_shader.setUniformValue('modelview', modelview) 
    323  
    324                 glBindVertexArray(self.cone_vao_id) 
    325                 glDrawArrays(GL_TRIANGLES, 0, self.cone_vao_id.num_vertices) 
    326                 glBindVertexArray(0) 
    327  
    328                 self.cone_shader.release() 
    329  
    330                 glColor4f(0, 0, 0, 1) 
    331                 self.renderText(x*1.2*radius, y*1.2*radius, z*1.2*radius, label) 
    332  
    333             num_parts = 30 
    334             anchors = array([a[:3] for a in self.anchor_data]) 
    335             for anchor in self.anchor_data: 
    336                 a0 = array(anchor[:3]) 
    337                 neighbours = anchors.copy() 
    338                 neighbours = [(((n-a0)**2).sum(), n)  for n in neighbours] 
    339                 neighbours.sort(key=lambda e: e[0]) 
    340                 for i in range(1, min(len(anchors), 4)):  
    341                     difference = neighbours[i][1]-a0 
    342                     glBegin(GL_LINES) 
    343                     for j in range(num_parts): 
    344                         glVertex3f(*normalize(a0 + difference*j/float(num_parts))) 
    345                         glVertex3f(*normalize(a0 + difference*(j+1)/float(num_parts))) 
    346                     glEnd(GL_LINES) 
    347  
    348285    def mouseMoveEvent(self, event): 
    349286        self.invert_mouse_x = self.camera_in_center 
  • orange/OrangeWidgets/plot/owplot3d.py

    r8744 r8748  
    341341        self.ortho_near = -1 
    342342        self.ortho_far = 2000 
    343         self.perspective_near = 0.1 
    344         self.perspective_far = 2000 
     343        self.perspective_near = 0.01 
     344        self.perspective_far = 5. 
    345345        self.camera_fov = 30. 
    346346        self.zoom_factor = 2000. 
Note: See TracChangeset for help on using the changeset viewer.