Changeset 8487:95ea9a376838 in orange


Ignore:
Timestamp:
07/27/11 16:38:59 (3 years ago)
Author:
matejd <matejd@…>
Branch:
default
Convert:
622cd62f449b13fb9a6e06bcecca9832473a21b4
Message:

Added lighting to 3d symbols

File:
1 edited

Legend:

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

    r8484 r8487  
    8282 
    8383def normal_from_points(p1, p2, p3): 
    84     v1 = p2 - p1 
    85     v2 = p3 - p1 
     84    if isinstance(p1, (list, tuple)): 
     85        v1 = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]] 
     86        v2 = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]] 
     87    else: 
     88        v1 = p2 - p1 
     89        v2 = p3 - p1 
    8690    return normalize(numpy.cross(v1, v2)) 
    8791 
     
    453457            attribute vec3 offset; 
    454458            attribute vec4 color; 
     459            attribute vec3 normal; 
    455460 
    456461            uniform bool use_2d_symbols; 
     
    466471 
    467472            void main(void) { 
    468               // Calculate inverse of rotations (in this case, inverse 
    469               // is actually just transpose), so that polygons face 
    470               // camera all the time. 
    471               mat3 invs; 
    472  
    473               invs[0][0] = gl_ModelViewMatrix[0][0]; 
    474               invs[0][1] = gl_ModelViewMatrix[1][0]; 
    475               invs[0][2] = gl_ModelViewMatrix[2][0]; 
    476  
    477               invs[1][0] = gl_ModelViewMatrix[0][1]; 
    478               invs[1][1] = gl_ModelViewMatrix[1][1]; 
    479               invs[1][2] = gl_ModelViewMatrix[2][1]; 
    480  
    481               invs[2][0] = gl_ModelViewMatrix[0][2]; 
    482               invs[2][1] = gl_ModelViewMatrix[1][2]; 
    483               invs[2][2] = gl_ModelViewMatrix[2][2]; 
    484  
    485473              vec3 offset_rotated = offset; 
    486474              offset_rotated.x *= symbol_scale; 
    487475              offset_rotated.y *= symbol_scale; 
    488476 
    489               if (use_2d_symbols) 
    490                 offset_rotated = invs * offset_rotated; 
     477              if (use_2d_symbols) { 
     478                  // Calculate inverse of rotations (in this case, inverse 
     479                  // is actually just transpose), so that polygons face 
     480                  // camera all the time. 
     481                  mat3 invs; 
     482 
     483                  invs[0][0] = gl_ModelViewMatrix[0][0]; 
     484                  invs[0][1] = gl_ModelViewMatrix[1][0]; 
     485                  invs[0][2] = gl_ModelViewMatrix[2][0]; 
     486 
     487                  invs[1][0] = gl_ModelViewMatrix[0][1]; 
     488                  invs[1][1] = gl_ModelViewMatrix[1][1]; 
     489                  invs[1][2] = gl_ModelViewMatrix[2][1]; 
     490 
     491                  invs[2][0] = gl_ModelViewMatrix[0][2]; 
     492                  invs[2][1] = gl_ModelViewMatrix[1][2]; 
     493                  invs[2][2] = gl_ModelViewMatrix[2][2]; 
     494 
     495                  offset_rotated = invs * offset_rotated; 
     496              } 
    491497 
    492498              vec3 pos = position.xyz; 
     
    510516                float manhattan_distance = max(max(pos.x, pos.y), pos.z)+5.; 
    511517                float a = min(pow(min(1., view_edge / manhattan_distance), 5.), transparency); 
    512                 var_color = vec4(color.rgb, a); 
     518                // Calculate the amount of lighting this triangle receives (diffuse component only). 
     519                vec3 light_direction = normalize(vec3(1., 1., 0.5)); 
     520                float diffuse = max(0., dot(normalize((gl_ModelViewMatrix * vec4(normal, 0)).xyz), 
     521                                    light_direction)); 
     522                vec3 ambient = vec3(0.15, 0.15, 0.15); 
     523                var_color = vec4(color.rgb*diffuse+ambient, a); 
    513524              } 
    514525            } 
     
    585596        self.draw_grid_and_axes() 
    586597 
    587         glDisable(GL_DEPTH_TEST) 
     598        glEnable(GL_DEPTH_TEST) 
    588599        glEnable(GL_BLEND) 
    589600        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
     601 
    590602 
    591603        for (cmd, params) in self.commands: 
     
    976988            ss = size*0.1 
    977989            for (v1, v2, v3) in triangles: 
    978                 vertices.extend([x,y,z, ai, ss*v1[0],ss*v1[1],ss*v1[2], r,g,b,a]) 
    979                 vertices.extend([x,y,z, ai, ss*v2[0],ss*v2[1],ss*v2[2], r,g,b,a]) 
    980                 vertices.extend([x,y,z, ai, ss*v3[0],ss*v3[1],ss*v3[2], r,g,b,a]) 
     990                n = normal_from_points(v1, v2, v3) 
     991                vertices.extend([x,y,z, ai, ss*v1[0],ss*v1[1],ss*v1[2], r,g,b,a, n[0],n[1],n[2]]) 
     992                vertices.extend([x,y,z, ai, ss*v2[0],ss*v2[1],ss*v2[2], r,g,b,a, n[0],n[1],n[2]]) 
     993                vertices.extend([x,y,z, ai, ss*v3[0],ss*v3[1],ss*v3[2], r,g,b,a, n[0],n[1],n[2]]) 
    981994 
    982995        # Build Vertex Buffer + Vertex Array Object. 
     
    9891002        glBufferData(GL_ARRAY_BUFFER, numpy.array(vertices, 'f'), GL_STATIC_DRAW) 
    9901003 
    991         vertex_size = (4+3+4)*4 
    992         glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(0)) 
    993         glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(4*4)) 
    994         glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(7*4)) 
     1004        vertex_size = (4+3+3+4)*4 
     1005        glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(0))    # position 
     1006        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(4*4))  # offset 
     1007        glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(7*4))  # color 
     1008        glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(11*4)) # normal 
    9951009        glEnableVertexAttribArray(0) 
    9961010        glEnableVertexAttribArray(1) 
    9971011        glEnableVertexAttribArray(2) 
     1012        glEnableVertexAttribArray(3) 
    9981013 
    9991014        glBindVertexArray(0) 
     
    11121127        # TODO: figure out what' causing incorrect values, filter them out 
    11131128        # for now 
    1114         indices = [i for i in indices if i < len(self.commands[0][1][2][0])] 
     1129        indices = [i for i in indices if i < len(self.commands[0][1][1][0])] 
    11151130        return indices 
    11161131 
Note: See TracChangeset for help on using the changeset viewer.