Changeset 8564:058c72d9b000 in orange


Ignore:
Timestamp:
08/02/11 01:08:58 (3 years ago)
Author:
matejd <matejd@…>
Branch:
default
Convert:
7665e8f81ab2c6d0b4b65d45eb8dd946e6a863cd
Message:

Added 2d symbols plus outlines, bigger plots too dark for now, needs discussion

Location:
orange/OrangeWidgets/plot
Files:
10 added
2 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/plot/owplot3d.py

    r8563 r8564  
    151151SelectionType = enum('ZOOM', 'RECTANGLE', 'POLYGON') 
    152152 
    153 from owprimitives3d import get_symbol_data 
     153from owprimitives3d import get_symbol_data, get_2d_symbol_data, get_2d_symbol_edges 
    154154 
    155155class Legend(object): 
     
    488488            uniform bool encode_color; 
    489489            uniform bool hide_outside; 
     490            uniform vec4 force_color; 
    490491            uniform vec2 transparency; // vec2 instead of float, fixing a bug on windows 
    491492                                       // (setUniformValue with float crashes) 
     
    540541              gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * off_pos; 
    541542 
    542               if (encode_color) { 
     543              if (force_color.a > 0.) { 
     544                var_color = force_color; 
     545              } 
     546              else if (encode_color) { 
    543547                // We've packed example index into .w component of this vertex, 
    544548                // to output it to the screen, it has to be broken down into RGBA. 
     
    599603        self.symbol_shader_encode_color   = self.symbol_shader.uniformLocation('encode_color') 
    600604        self.symbol_shader_hide_outside   = self.symbol_shader.uniformLocation('hide_outside') 
     605        self.symbol_shader_force_color    = self.symbol_shader.uniformLocation('force_color') 
    601606 
    602607        # Create two FBOs (framebuffer objects): 
     
    679684                self.symbol_shader.setUniformValue(self.symbol_shader_scale,          *scale) 
    680685                self.symbol_shader.setUniformValue(self.symbol_shader_translation,    *self.translation) 
     686                self.symbol_shader.setUniformValue(self.symbol_shader_force_color,    0., 0., 0., 0.) 
    681687 
    682688                glBindVertexArray(vao_id) 
     
    684690                    glDisable(GL_DEPTH_TEST) 
    685691                    glDisable(GL_BLEND) 
    686                     glDrawArrays(GL_POINTS, 0, vao_id.num_vertices) 
     692                    glDrawArrays(GL_POINTS, 0, vao_id.num_3d_vertices) 
    687693                else: 
    688694                    glEnable(GL_DEPTH_TEST) 
    689695                    glEnable(GL_BLEND) 
    690696                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
    691                     glDrawArrays(GL_TRIANGLES, 0, vao_id.num_vertices) 
     697                    if self.use_2d_symbols: 
     698                        glDrawArrays(GL_TRIANGLES, vao_id.num_3d_vertices, vao_id.num_2d_vertices) 
     699                        # Draw outlines (somewhat dark, discuss) 
     700                        #self.symbol_shader.setUniformValue(self.symbol_shader_force_color, 
     701                            #0., 0., 0., self.transparency / 255. + 0.01) 
     702                        #glDisable(GL_DEPTH_TEST) 
     703                        #glDrawArrays(GL_LINES, vao_id.num_3d_vertices+vao_id.num_2d_vertices, vao_id.num_edge_vertices) 
     704                        #self.symbol_shader.setUniformValue(self.symbol_shader_force_color, 0., 0., 0., 0.) 
     705                    else: 
     706                        glDrawArrays(GL_TRIANGLES, 0, vao_id.num_3d_vertices) 
    692707                glBindVertexArray(0) 
    693708 
     
    741756                    self.symbol_shader.setUniformValue(self.symbol_shader_shrink_symbols, False) 
    742757                    glBindVertexArray(vao_id) 
    743                     glDrawArrays(GL_TRIANGLES, 0, vao_id.num_vertices) 
     758                    glDrawArrays(GL_TRIANGLES, 0, vao_id.num_3d_vertices) 
    744759                    glBindVertexArray(0) 
    745760                    self.symbol_shader.release() 
     
    757772                    glDisable(GL_BLEND) 
    758773                    glBindVertexArray(vao_id) 
    759                     glDrawArrays(GL_POINTS, 0, vao_id.num_vertices) 
     774                    glDrawArrays(GL_POINTS, 0, vao_id.num_3d_vertices) 
    760775                    glBindVertexArray(0) 
    761776                    self.symbol_shader.release() 
     
    11121127        # TODO: if self.use_2d_symbols 
    11131128 
     1129        num_3d_vertices = 0 
     1130        num_2d_vertices = 0 
     1131        num_edge_vertices = 0 
    11141132        vertices = [] 
    11151133        ai = -1 # Array index (used in color-picking). 
     
    11251143            ai += 1 
    11261144            for v0, v1, v2, n0, n1, n2 in triangles: 
     1145                num_3d_vertices += 3 
    11271146                vertices.extend([x,y,z, ai, ss*v0[0],ss*v0[1],ss*v0[2], r,g,b,a, n0[0],n0[1],n0[2], 
    11281147                                 x,y,z, ai, ss*v1[0],ss*v1[1],ss*v1[2], r,g,b,a, n1[0],n1[1],n1[2], 
    11291148                                 x,y,z, ai, ss*v2[0],ss*v2[1],ss*v2[2], r,g,b,a, n2[0],n2[1],n2[2]]) 
     1149 
     1150        for x, y, z, (r,g,b,a), size, symbol in zip(X, Y, Z, colors, sizes, symbols): 
     1151            x -= self.data_center[0] 
     1152            y -= self.data_center[1] 
     1153            z -= self.data_center[2] 
     1154            x *= scale_x 
     1155            y *= scale_y 
     1156            z *= scale_z 
     1157            triangles = get_2d_symbol_data(symbol) 
     1158            ss = size*0.02 
     1159            for v0, v1, v2, _, _, _ in triangles: 
     1160                num_2d_vertices += 3 
     1161                vertices.extend([x,y,z, 0, ss*v0[0],ss*v0[1],ss*v0[2], r,g,b,a, 0,0,0, 
     1162                                 x,y,z, 0, ss*v1[0],ss*v1[1],ss*v1[2], r,g,b,a, 0,0,0, 
     1163                                 x,y,z, 0, ss*v2[0],ss*v2[1],ss*v2[2], r,g,b,a, 0,0,0]) 
     1164 
     1165        for x, y, z, (r,g,b,a), size, symbol in zip(X, Y, Z, colors, sizes, symbols): 
     1166            x -= self.data_center[0] 
     1167            y -= self.data_center[1] 
     1168            z -= self.data_center[2] 
     1169            x *= scale_x 
     1170            y *= scale_y 
     1171            z *= scale_z 
     1172            edges = get_2d_symbol_edges(symbol) 
     1173            ss = size*0.02 
     1174            for v0, v1 in edges: 
     1175                num_edge_vertices += 2 
     1176                vertices.extend([x,y,z, 0, ss*v0[0],ss*v0[1],ss*v0[2], r,g,b,a, 0,0,0, 
     1177                                 x,y,z, 0, ss*v1[0],ss*v1[1],ss*v1[2], r,g,b,a, 0,0,0]) 
    11301178 
    11311179        # Build Vertex Buffer + Vertex Array Object. 
     
    11511199        glBindBuffer(GL_ARRAY_BUFFER, 0) 
    11521200 
    1153         vao_id.num_vertices = len(vertices) / (vertex_size / 4) 
     1201        vao_id.num_3d_vertices = num_3d_vertices 
     1202        vao_id.num_2d_vertices = num_2d_vertices 
     1203        vao_id.num_edge_vertices = num_edge_vertices 
    11541204        self.vertex_buffers.append(vertex_buffer_id) 
    11551205        self.vaos.append(vao_id) 
  • orange/OrangeWidgets/plot/owprimitives3d.py

    r8555 r8564  
    44 
    55symbol_map = { 
    6     Symbol.RECT:      'primitives/sphere.obj', 
     6    Symbol.RECT:      'primitives/cube.obj', 
    77    Symbol.TRIANGLE:  'primitives/pyramid.obj', 
    88    Symbol.DTRIANGLE: 'primitives/dpyramid.obj', 
     
    1616} 
    1717 
     18symbol_map_2d = { 
     19    Symbol.RECT:      'primitives/rect.obj', 
     20    Symbol.TRIANGLE:  'primitives/triangle.obj', 
     21    Symbol.DTRIANGLE: 'primitives/dtriangle.obj', 
     22    Symbol.CIRCLE:    'primitives/circle.obj', 
     23    Symbol.LTRIANGLE: 'primitives/ltriangle.obj', 
     24    Symbol.DIAMOND:   'primitives/diamond_2d.obj', 
     25    Symbol.WEDGE:     'primitives/wedge_2d.obj', 
     26    Symbol.LWEDGE:    'primitives/lwedge_2d.obj', 
     27    Symbol.CROSS:     'primitives/cross_2d.obj', 
     28    Symbol.XCROSS:    'primitives/xcross_2d.obj' 
     29} 
     30 
     31symbol_edge_map = { 
     32    Symbol.RECT:      'primitives/rect_edges.obj', 
     33    Symbol.TRIANGLE:  'primitives/triangle_edges.obj', 
     34    Symbol.DTRIANGLE: 'primitives/dtriangle_edges.obj', 
     35    Symbol.CIRCLE:    'primitives/circle_edges.obj', 
     36    Symbol.LTRIANGLE: 'primitives/ltriangle_edges.obj', 
     37    Symbol.DIAMOND:   'primitives/diamond_edges.obj', 
     38    Symbol.WEDGE:     'primitives/wedge_edges.obj', 
     39    Symbol.LWEDGE:    'primitives/lwedge_edges.obj', 
     40    Symbol.CROSS:     'primitives/cross_edges.obj', 
     41    Symbol.XCROSS:    'primitives/xcross_edges.obj' 
     42} 
     43 
    1844_symbol_data = {} # Cache: contains triangles + their normals for each needed symbol. 
     45_symbol_data_2d = {} 
     46_symbol_edges = {} 
    1947 
    2048def parse_obj(file_name): 
     
    5583    _symbol_data[symbol] = triangles 
    5684    return triangles 
     85 
     86def get_2d_symbol_data(symbol): 
     87    if not Symbol.is_valid(symbol): 
     88        return [] 
     89    if symbol in _symbol_data_2d: 
     90        return _symbol_data_2d[symbol] 
     91    file_name = symbol_map_2d[symbol] 
     92    file_name = os.path.join(os.path.dirname(__file__), file_name) 
     93    triangles = parse_obj(file_name) 
     94    _symbol_data_2d[symbol] = triangles 
     95    return triangles 
     96 
     97def get_2d_symbol_edges(symbol): 
     98    if not Symbol.is_valid(symbol): 
     99        return [] 
     100    if symbol in _symbol_edges: 
     101        return _symbol_edges[symbol] 
     102    file_name = symbol_edge_map[symbol] 
     103    file_name = os.path.join(os.path.dirname(__file__), file_name) 
     104    lines = open(file_name).readlines() 
     105    vertices_lines = filter(lambda line: line.startswith('v'), lines) 
     106    edges_lines =    filter(lambda line: line.startswith('f'), lines) 
     107    vertices = [map(float, line.split()[1:]) for line in vertices_lines] 
     108    edges_indices = [map(int, line.split()[1:]) for line in edges_lines] 
     109    edges = [] 
     110    for i0, i1 in edges_indices: 
     111        v0 = vertices[i0-1] 
     112        v1 = vertices[i1-1] 
     113        edges.append([v0, v1]) 
     114    _symbol_edges[symbol] = edges 
     115    return edges 
Note: See TracChangeset for help on using the changeset viewer.