Advertisement
Guest User

Wireframed Shader

a guest
Nov 28th, 2013
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Genie 11.47 KB | None | 0 0
  1. /** SPHERE RENDER & UPDATE **/
  2. def override render ( alpha_stage : bool, view : array of GLfloat,
  3.                             projection : array of GLfloat)
  4.         if alpha_stage is not self._material.translucent
  5.             return
  6.  
  7.         i : int = 0
  8.         offset : int = 0
  9.  
  10.         // Lock against changes during render
  11.         mutex.lock()
  12.  
  13.         // get model matrix
  14.         model : array of GLfloat = self.model_matrix()
  15.  
  16.         model_view : array of GLfloat = self.calculate_model_view(model, view)
  17.  
  18.         // Update ebo/vbo as needed
  19.         if _updated
  20.             _update_sphere()
  21.         // Re-bind buffers when not updating
  22.         else
  23.             glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo)
  24.             glBindBuffer(GL_ARRAY_BUFFER, _vbo)
  25.  
  26.         // calculate tslvs
  27.         if _material.needsTSLVs
  28.             calculateTSLV(_vercache)
  29.             offset = (int) (tslvs.length * sizeof(GLfloat) * 11/3)
  30.             glBufferSubData(GL_ARRAY_BUFFER, (GLsizei) offset,
  31.                             (GLsizei) (tslvs.length * sizeof(GLfloat)), tslvs)
  32.  
  33.         // Render
  34.         self._material.enable(model_view, projection,
  35.                     (GLvoid*) (_offset))
  36.  
  37.         glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,
  38.                               (GLsizei) (sizeof(GLfloat) * 11),
  39.                               null)
  40.         glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE,
  41.                               (GLsizei) (sizeof(GLfloat) * 11),
  42.                               (GLvoid*) (sizeof(GLfloat) * 3))
  43.         glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE,
  44.                               (GLsizei) (sizeof(GLfloat) * 11),
  45.                               (GLvoid*) (sizeof(GLfloat) * 6))
  46.         glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE,
  47.                               (GLsizei) (sizeof(GLfloat) * 11),
  48.                               (GLvoid*) (sizeof(GLfloat) * 8))
  49.  
  50.         glEnableVertexAttribArray(0)
  51.         glEnableVertexAttribArray(1)
  52.         glEnableVertexAttribArray(2)
  53.         glEnableVertexAttribArray(3)
  54.  
  55.         var sub = (int) ceil(radius * 8)
  56.         glDrawElements(GL_TRIANGLES, (GLsizei) (3*24*sub*sub),
  57.                        GL_UNSIGNED_SHORT, (GLvoid*) 0)
  58.  
  59.         glDisableVertexAttribArray(0)
  60.         glDisableVertexAttribArray(1)
  61.         glDisableVertexAttribArray(2)
  62.         glDisableVertexAttribArray(3)
  63.        
  64.         // Render axis
  65.         //renderAxis()
  66.  
  67.         // Release lock
  68.         mutex.unlock()
  69.  
  70.  
  71.     // TODO: textures, buffer it better
  72.     def _update_sphere()
  73.         if _ebo == 0
  74.             buffers : array of GLuint = {0, 0}
  75.             glGenBuffers(buffers)
  76.             _ebo = buffers[0]
  77.             _vbo = buffers[1]
  78.  
  79.         // dimensional subdivisions
  80.         sub : int = (int) ceil(radius*8)
  81.  
  82.         // elements: 4*(total subdivided squares)
  83.         //
  84.         // _____
  85.         // |\ /|
  86.         // | X | for each square
  87.         // |/_\|
  88.         //
  89.         var elenum = (int) (24*sub*sub)
  90.  
  91.         // vertices: (vertices on corners of squares)+
  92.         //                                  (total subdivided squares [centers])
  93.         var vernum = (int) (6*(sub+1)*(sub+1)+elenum/4)
  94.  
  95.         elements : array of GLushort = new array of GLushort[elenum*3]
  96.         position : array of GLfloat = new array of GLfloat[vernum*3]
  97.         normal : array of GLfloat = new array of GLfloat[vernum*3]
  98.         texcoord : array of GLfloat = new array of GLfloat[vernum*2]
  99.         tangent : array of GLfloat = new array of GLfloat[vernum*3]
  100.  
  101.         var radius = _radius
  102.  
  103.         // generate faces
  104.         //
  105.         // order:
  106.         //
  107.         // top
  108.         // bottom
  109.         // front
  110.         // back
  111.         // right
  112.         // left
  113.         //
  114.         var voffset = 0
  115.         var eoffset = 0
  116.         _gen_face(radius, radius, radius, 0.625f, 0.25f, eoffset, voffset, 0, 2,
  117.                   elements, position, normal, texcoord, tangent)
  118.         voffset += (int) ((sub+1)*(sub+1)+sub*sub)
  119.         eoffset += (int) (4*sub*sub)
  120.         _gen_face(radius, -radius, -radius, 0.625f, 0.75f, eoffset, voffset, 0,
  121.                   2, elements, position, normal, texcoord, tangent)
  122.         voffset += (int) ((sub+1)*(sub+1)+sub*sub)
  123.         eoffset += (int) (4*sub*sub)
  124.         _gen_face(-radius, radius, radius, 0.125f, 0.5f, eoffset, voffset, 0, 1,
  125.                   elements, position, normal, texcoord, tangent)
  126.         voffset += (int) ((sub+1)*(sub+1)+sub*sub)
  127.         eoffset += (int) (4*sub*sub)
  128.         _gen_face(radius, radius, -radius, 0.625f, 0.5f, eoffset, voffset, 0, 1,
  129.                   elements, position, normal, texcoord, tangent)
  130.         voffset += (int) ((sub+1)*(sub+1)+sub*sub)
  131.         eoffset += (int) (4*sub*sub)
  132.         _gen_face(radius, radius, radius, 0.375f, 0.5f, eoffset, voffset, 2, 1,
  133.                   elements, position, normal, texcoord, tangent)
  134.         voffset += (int) ((sub+1)*(sub+1)+sub*sub)
  135.         eoffset += (int) (4*sub*sub)
  136.         _gen_face(-radius, radius, -radius, 0.875f, 0.5f, eoffset, voffset, 2,
  137.                   1, elements, position, normal, texcoord, tangent)
  138.         var vertices = packArrays(position, normal, texcoord, tangent)
  139.  
  140.         _vercache = vertices
  141.  
  142.         // bind elements
  143.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo)
  144.         glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizei) (3 * elenum * sizeof(
  145.                      GLushort)), elements, GL_STATIC_DRAW)
  146.  
  147.         // bind vertices
  148.         glBindBuffer(GL_ARRAY_BUFFER, _vbo)
  149.         var offset = 14 * vernum * sizeof(GLfloat)
  150.         var extra = self._material.get_extra_space_vbo(vernum, elenum)
  151.         glBufferData(GL_ARRAY_BUFFER, (GLsizei) (offset+extra),
  152.                      vertices, GL_STATIC_DRAW)
  153.                      
  154.         // add material-specific changes
  155.         self._material.update_model(position, elements, _vbo, _ebo, (GLsizei) offset)
  156.  
  157.         _offset = (GLsizei)offset
  158.  
  159.         // Reset updated flag
  160.         _updated = false
  161.  
  162. /** WIREFRAMED CLASS **/
  163.  
  164. class soy.materials.Wireframed : soy.materials.Material
  165.  
  166.     _m_size : GLsizei
  167.     _m_offset : GLsizei
  168.  
  169.     def override enable (mv : array of GLfloat, p : array of GLfloat,
  170.                         tslvs : GLvoid*, texmatrix : ode.Matrix3? = null)
  171.         if _program is 0
  172.             status : GLint
  173.             vertex_shader : array of string = {"
  174.                precision lowp float;
  175.                varying vec3 vBC;
  176.                attribute vec3 vertex, normal;
  177.                attribute vec3 barycentric;
  178.                uniform mat4 mv_matrix, p_matrix;
  179.                void main()
  180.                {
  181.                    vBC = barycentric;
  182.                    gl_Position = p_matrix*mv_matrix*vec4(vertex,1.0);
  183.                }
  184.            "}
  185.             fragment_shader : array of string = {"
  186.                #extension GL_OES_standard_derivatives : enable
  187.                precision lowp float;
  188.                varying vec3 vBC;
  189.                float edgeFactor(){
  190.                    vec3 d = fwidth(vBC);
  191.                    vec3 a3 = smoothstep(vec3(0.0), d*1.5, vBC);
  192.                    return min(min(a3.x, a3.y), a3.z);
  193.                }
  194.                void main()
  195.                {
  196.                    //if(any(lessThan(vBC, vec3(0.02)))){
  197.                    //    gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
  198.                    //} else{
  199.                    //    gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0);
  200.                    //}
  201.                    gl_FragColor.rgb = vBC.xyz; //mix(vec3(0.0), vec3(0.5), edgeFactor());
  202.                    gl_FragColor.a = 1.0;
  203.                    // gl_FragColor = vec4(0.0, 0.0, 0.0, (1.0-edgeFactor())*0.95);
  204.                }
  205.            "}
  206.             // initialize vertex shader
  207.             _vertex_shader = glCreateShader(GL_VERTEX_SHADER)
  208.             glShaderSource(_vertex_shader, 1, vertex_shader, {-1})
  209.             glCompileShader(_vertex_shader)
  210.            
  211.             j:int
  212.             log:string = ""
  213.             glGetShaderInfoLog(_vertex_shader, 1000, out j, log)
  214.             print log
  215.  
  216.             // check compile status
  217.             glGetShaderiv(_vertex_shader, GL_COMPILE_STATUS, out status)
  218.             assert status is not (GLint) GL_FALSE
  219.  
  220.             // initialize fragment shader
  221.             _fragment_shader = glCreateShader(GL_FRAGMENT_SHADER)
  222.             glShaderSource(_fragment_shader, 1, fragment_shader, {-1})
  223.             glCompileShader(_fragment_shader)
  224.            
  225.             glGetShaderInfoLog(_fragment_shader, 1000, out j, log)
  226.             print log
  227.  
  228.             // check compile status
  229.             glGetShaderiv(_fragment_shader, GL_COMPILE_STATUS, out status)
  230.            
  231.             assert status is not (GLint) GL_FALSE
  232.  
  233.             // initialize program
  234.             _program = glCreateProgram()
  235.             glAttachShader(_program, _vertex_shader)
  236.             glAttachShader(_program, _fragment_shader)
  237.             glBindAttribLocation(_program, 0, "vertex")
  238.             glBindAttribLocation(_program, 1, "normal")
  239.             glLinkProgram(_program)
  240.  
  241.             // check link status
  242.             glGetProgramiv(_program, GL_LINK_STATUS, out status)
  243.             glGetProgramInfoLog(_program, 1000, out j, log)
  244.             print log
  245.            
  246.             assert status is not (GLint) GL_FALSE
  247.  
  248.             // cleanup
  249.             glDetachShader(_program, _vertex_shader)
  250.             glDeleteShader(_vertex_shader)
  251.             glDetachShader(_program, _fragment_shader)
  252.             glDeleteShader(_fragment_shader)
  253.         glUseProgram(_program)
  254.         mv_loc : GLint = glGetUniformLocation(_program, "mv_matrix")
  255.         glUniformMatrix4fv(mv_loc, 1, GL_FALSE, mv)
  256.         p_loc : GLint = glGetUniformLocation(_program, "p_matrix")
  257.         glUniformMatrix4fv(p_loc, 1, GL_FALSE, p)
  258.         bc_loc : GLint = glGetAttribLocation(_program, "barycentric")
  259.         glVertexAttribPointer(bc_loc, 3, GL_FLOAT, GL_TRUE, 3, (GLvoid*)_m_offset)
  260.         glEnableVertexAttribArray(bc_loc)
  261.        
  262.        
  263.     def override get_extra_space_vbo (numVerts: GLsizei,
  264.                                     numElements: GLsizei) : GLsizei
  265.         _m_size = numVerts*3
  266.         return (GLsizei)(3*numVerts*sizeof(GLfloat))
  267.  
  268.     def override update_model (vertBuffer : array of GLfloat,
  269.                                 elemBuffer : array of GLushort,
  270.                                 vbo : GLuint, ebo : GLuint,
  271.                                 offset : GLsizei)
  272.         print "Updating model with offset=%d", offset
  273.         var adding = new array of GLfloat [_m_size]
  274.         var count = 0
  275.         for var i = 0 to (elemBuffer.length/3)
  276.             count++
  277.             var v0 = elemBuffer[i*3]
  278.             var v1 = elemBuffer[i*3+1]
  279.             var v2 = elemBuffer[i*3+2]
  280.             adding[v0*3]   = 1
  281.             adding[v0*3+1] = 0
  282.             adding[v0*3+2] = 0
  283.             adding[v1*3]   = 0
  284.             adding[v1*3+1] = 1
  285.             adding[v1*3+2] = 0
  286.             adding[v2*3]   = 0
  287.             adding[v2*3+1] = 0
  288.             adding[v2*3+2] = 1
  289.         print "     array size = %d", adding.length*(int)sizeof(GLfloat)
  290.         glBindBuffer(GL_ARRAY_BUFFER, vbo)
  291.         glBufferSubData(GL_ARRAY_BUFFER, offset,
  292.               (GLsizei)(sizeof(GLfloat)*adding.length), adding)
  293.         _m_offset = offset
  294.  
  295.     ////////////////////////////////////////////////////////////////////////
  296.     // Static
  297.  
  298.     _vertex_shader : static GLuint
  299.     _fragment_shader : static GLuint
  300.     _program : static GLuint
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement