Guest User

Untitled

a guest
Jan 23rd, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.58 KB | None | 0 0
  1.    
  2.     struct shader {
  3.     shader() :
  4.         shader_vert(0),
  5.         shader_frag(0),
  6.         shader_prog(0)
  7.     {}
  8.     void vsource(const char *data) { shader_vert_s = new char[strlen(data)]; strcpy(shader_vert_s, data); }
  9.     void fsource(const char *data) { shader_frag_s = new char[strlen(data)]; strcpy(shader_frag_s, data); }
  10.    
  11.     void create ();
  12.    
  13.     GLenum shader_vert;
  14.     GLenum shader_frag;
  15.     GLenum shader_prog;
  16.     char  *shader_vert_s;
  17.     char  *shader_frag_s;
  18.     };    
  19.  
  20.     void shader::create()
  21.     {
  22.     int len = strlen(shader_vert_s);
  23.    
  24.     shader_prog = glCreateProgramObjectARB();
  25.     shader_vert = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  26.     shader_frag = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  27.    
  28.     glShaderSourceARB(shader_vert, 1, (const GLchar**)&shader_vert_s, &len);
  29.     len = strlen(shader_frag_s);
  30.     glShaderSourceARB(shader_frag, 1, (const GLchar**)&shader_frag_s, &len);
  31.    
  32.     glCompileShaderARB(shader_vert);
  33.     glCompileShaderARB(shader_frag);
  34.     glAttachObjectARB(shader_prog, shader_vert);
  35.     glAttachObjectARB(shader_prog, shader_frag);
  36.     glLinkProgramARB(shader_prog);
  37.    
  38.     char info[1024];
  39.     int  ilen=0;
  40.     glGetInfoLogARB(shader_vert, 1024-1, &ilen, info);
  41.     printf("error: %s\n", info);
  42.     glGetInfoLogARB(shader_frag, 1024-1, &ilen, info);
  43.     printf("error: %s\n", info);
  44.     }  
  45.  
  46.  
  47.     shader world;    
  48.  
  49.     world.vsource(
  50.         "void main()\n"
  51.         "{\n"
  52.             "\tgl_TexCoord[0] = gl_MultiTexCoord0;\n"
  53.             "\tgl_TexCoord[1] = gl_MultiTexCoord1;\n"
  54.             "\tgl_Position    = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
  55.         "}\n"
  56.     );
  57.     world.fsource(
  58.         "#version 120\n"
  59.         "uniform sampler2D tex_n;\n"
  60.         "uniform sampler2D tex_l;\n"
  61.         "\n"
  62.         "void main()\n"
  63.         "{\n"
  64.             "\tvec4 tx1 = texture2D(tex_n, gl_TexCoord[0].st);\n"
  65.             "\tvec4 tx2 = texture2D(tex_l, gl_TexCoord[1].st);\n"
  66.             "\tgl_FragColor = tx1 + tx2;\n"
  67.         "}\n"
  68.     );
  69.    
  70.     world.create();
  71.  
  72.     // render
  73.     glUseProgramObjectARB(world.shader_prog);
  74.     renderq(w, h);
  75.     glUseProgramObjectARB(0);
  76.  
  77.     // map render
  78. void renderq(int w, int h)
  79. {
  80.     glEnableClientState(GL_VERTEX_ARRAY);
  81.  
  82.     visiblecubes(worldroot, hdr.worldsize/2, 0, 0, 0, w, h);
  83.    
  84.     vtxarray *va = visibleva;
  85.     while(va)
  86.     {
  87.         glVertexPointer  (3, GL_FLOAT, sizeof(vertex), &(va->vbuf[0].x));
  88.         glTexCoordPointer(2, GL_FLOAT, sizeof(vertex), &(va->vbuf[0].u));
  89.  
  90.         lodlevel &lod = va->curlod ? va->l1 : va->l0;
  91.  
  92.         extern vector<GLuint> lmtexids;
  93.  
  94.         unsigned short *ebuf = lod.ebuf;
  95.         for(int i=0; i < lod.texs; i++)
  96.         {
  97.             glActiveTexture(GL_TEXTURE0);
  98.             glBindTexture(GL_TEXTURE_2D, lookuptexture(lod.eslist[i].texture)->gl);
  99.             glEnable(GL_TEXTURE_2D);
  100.            
  101.             glActiveTexture(GL_TEXTURE1);
  102.             glBindTexture(GL_TEXTURE_2D, lmtexids[lod.eslist[i].lmid]);
  103.             glEnable(GL_TEXTURE_2D);
  104.            
  105.             glUniform1iARB(glGetUniformLocationARB(world.shader_prog, "tex_n"), 0);
  106.             glUniform1iARB(glGetUniformLocationARB(world.shader_prog, "tex_l"), 1);
  107.  
  108.             for(int l=0; l<3; l++) if (lod.eslist[i].length[l])
  109.             {
  110.                 glDrawElements(GL_QUADS, lod.eslist[i].length[l], GL_UNSIGNED_SHORT, ebuf);
  111.                 ebuf += lod.eslist[i].length[l];  // Advance to next array.
  112.                 glde++;
  113.             }
  114.         }
  115.         va = va->next;
  116.     }
  117.     glActiveTexture(GL_TEXTURE0);
  118.     glDisable(GL_TEXTURE_2D);
  119.     glActiveTexture(GL_TEXTURE1);
  120.     glDisable(GL_TEXTURE_2D);
  121.     glActiveTexture(GL_TEXTURE0);
  122.     glDisableClientState(GL_VERTEX_ARRAY);
  123. }
  124.  
  125. // all textures in map are solid colors, why?
Add Comment
Please, Sign In to add comment