Advertisement
thecplusplusguy

GLSL tutorial 5 - main.cpp

Aug 9th, 2012
1,092
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.90 KB | None | 0 0
  1. //http://www.youtube.com/user/thecplusplusguy
  2. //normalmapping (bump-mapping) main.cpp
  3. #include <iostream>
  4. #include <SDL/SDL.h>
  5. #include <SDL/SDL_image.h>
  6. #include "GLee.h"
  7. #include <GL/gl.h>
  8. #include <GL/glu.h>
  9. #include "camera.h"
  10. #include <vector>
  11. #include <string>
  12. #include <fstream>
  13. //#include "objloader.h"
  14. float angle=0.0;
  15. camera cam;
  16. float lpos;
  17. bool b;
  18. //objloader obj;
  19. //data->vertex->fragment
  20.  
  21. void loadFile(const char* fn,std::string& str)
  22. {
  23.     std::ifstream in(fn);
  24.     if(!in.is_open())
  25.     {
  26.         std::cout << "The file " << fn << " cannot be opened\n";
  27.         return;
  28.     }
  29.     char tmp[300];
  30.     while(!in.eof())
  31.     {
  32.         in.getline(tmp,300);
  33.         str+=tmp;
  34.         str+='\n';
  35.     }
  36. }
  37.  
  38. unsigned int loadShader(std::string& source,unsigned int mode)
  39. {
  40.     unsigned int id;
  41.     id=glCreateShader(mode);
  42.    
  43.     const char* csource=source.c_str();
  44.    
  45.     glShaderSource(id,1,&csource,NULL);
  46.     glCompileShader(id);
  47.     char error[1000];
  48.     glGetShaderInfoLog(id,1000,NULL,error);
  49.     std::cout << "Compile status: \n" << error << std::endl;
  50.     return id;
  51. }
  52.  
  53. unsigned int vs,fs,program;
  54.  
  55. void initShader(const char* vname,const char* fname)
  56. {
  57.     std::string source;
  58.     loadFile(vname,source);
  59.     vs=loadShader(source,GL_VERTEX_SHADER);
  60.     source="";
  61.     loadFile(fname,source);
  62.     fs=loadShader(source,GL_FRAGMENT_SHADER);
  63.    
  64.     program=glCreateProgram();
  65.     glAttachShader(program,vs);
  66.     glAttachShader(program,fs);
  67.    
  68.     glLinkProgram(program);
  69.     glUseProgram(program);
  70. }
  71.  
  72. void clean()
  73. {
  74.     glDetachShader(program,vs);
  75.     glDetachShader(program,fs);
  76.     glDeleteShader(vs);
  77.     glDeleteShader(fs);
  78.     glDeleteProgram(program);
  79. }
  80.  
  81. unsigned int loadTexture(const char* filename)
  82. {
  83.     unsigned int num;
  84.     glGenTextures(1,&num);
  85.     SDL_Surface* img=IMG_Load(filename);
  86.     if(img==NULL)
  87.     {
  88.         std::cout << "img was not loaded" << std::endl;
  89.         return -1;
  90.     }
  91.     SDL_PixelFormat form={NULL,32,4,0,0,0,0,0,0,0,0,0xff000000,0x00ff0000,0x0000ff00,0x000000ff,0,255};
  92.     SDL_Surface* img2=SDL_ConvertSurface(img,&form,SDL_SWSURFACE);
  93.     if(img2==NULL)
  94.     {
  95.         std::cout << "img2 was not loaded" << std::endl;
  96.         return -1;     
  97.     }
  98.     glBindTexture(GL_TEXTURE_2D,num);      
  99.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  100.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  101.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,img2->w,img2->h,0,GL_RGBA,GL_UNSIGNED_INT_8_8_8_8,img2->pixels);      
  102.     SDL_FreeSurface(img);
  103.     SDL_FreeSurface(img2);
  104.     return num;
  105. }
  106.  
  107. unsigned int myImg,myImg2/*,monkey*/;
  108.  
  109. void init()
  110. {
  111.     glClearColor(0,0,0,1);
  112.     glMatrixMode(GL_PROJECTION);
  113.         glLoadIdentity();
  114.         gluPerspective(50,640.0/480.0,1,1000);
  115.     glMatrixMode(GL_MODELVIEW);
  116.     glEnable(GL_DEPTH_TEST);
  117.     initShader("vertex.vs","fragment.frag");
  118.     myImg=loadTexture("brick.bmp");
  119.     myImg2=loadTexture("bricknormal.bmp");
  120. //  monkey=obj.load("monkey.obj");
  121. }
  122.  
  123. void display()
  124. {
  125.     if(b)
  126.     {
  127.         lpos+=0.1;
  128.         if(lpos>=10.0)
  129.             b=!b;
  130.     }else{
  131.         lpos-=0.1;
  132.         if(lpos<=-10.0)
  133.             b=!b;  
  134.     }
  135.     glLoadIdentity();
  136.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  137.     cam.Control();
  138.     cam.UpdateCamera();
  139.     angle+=3.0;
  140.     if(angle>=360)
  141.         angle-=360;
  142.    
  143.     glUniform3f(glGetUniformLocation(program,"lightPos"),lpos,0.0,3.0);
  144.    
  145.     glUniform3f(glGetUniformLocation(program,"mambient"),0.2,0.2,0.2);
  146.     glUniform3f(glGetUniformLocation(program,"mdiffuse"),0.6,0.6,0.6);
  147.     glUniform3f(glGetUniformLocation(program,"mspecular"),1.0,1.0,1.0);
  148.    
  149.     glUniform3f(glGetUniformLocation(program,"lambient"),0.2,0.2,0.2);
  150.     glUniform3f(glGetUniformLocation(program,"ldiffuse"),0.6,0.6,0.6);
  151.     glUniform3f(glGetUniformLocation(program,"lspecular"),1.0,1.0,1.0);
  152.        
  153.     glUniform1f(glGetUniformLocation(program,"shininess"),32.0);   
  154.    
  155.     glActiveTexture(GL_TEXTURE0);
  156.     glBindTexture(GL_TEXTURE_2D,myImg);
  157.     glUniform1i(glGetUniformLocation(program,"img"),0);
  158.  
  159.     glActiveTexture(GL_TEXTURE1);
  160.     glBindTexture(GL_TEXTURE_2D,myImg2);
  161.     glUniform1i(glGetUniformLocation(program,"normalmap"),1);
  162.    
  163. //  glRotatef(angle,0,1,0);
  164. //  glCallList(monkey);
  165.     glBegin(GL_QUADS);
  166.         glNormal3f(0.0,0.0,1.0);
  167.         glTexCoord2f(0,0);      //gl_MultiTexCoord0
  168.         glVertex3f(-1,1,-4);    //gl_Vertex
  169.         glTexCoord2f(0,1);
  170.         glVertex3f(-1,-1,-4);
  171.         glTexCoord2f(1,1);
  172.         glVertex3f(1,-1,-4);
  173.         glTexCoord2f(1,0);
  174.         glVertex3f(1,1,-4);
  175.     glEnd();
  176. }
  177.  
  178. int main()
  179. {
  180.     SDL_Init(SDL_INIT_EVERYTHING);
  181.     SDL_SetVideoMode(640,480,32,SDL_OPENGL);
  182.     Uint32 start;
  183.     SDL_Event event;
  184.     bool running=true;
  185.     init();
  186.     bool b=false;
  187.     while(running)
  188.     {
  189.         start=SDL_GetTicks();
  190.         while(SDL_PollEvent(&event))
  191.         {
  192.             switch(event.type)
  193.             {
  194.                 case SDL_QUIT:
  195.                     running=false;
  196.                     break;
  197.                 case SDL_KEYDOWN:
  198.                     switch(event.key.keysym.sym)
  199.                     {
  200.                         case SDLK_ESCAPE:
  201.                             running=false;
  202.                             break;
  203.                     }
  204.                     break;
  205.                 case SDL_MOUSEBUTTONDOWN:
  206.                     cam.mouseIn(true);
  207.                     break;
  208.                    
  209.             }
  210.         }
  211.         display();
  212.         SDL_GL_SwapBuffers();
  213.         if(1000.0/30>SDL_GetTicks()-start)
  214.             SDL_Delay(1000.0/30-(SDL_GetTicks()-start));
  215.     }
  216.     clean();
  217.     SDL_Quit();
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement