Advertisement
alihelmy

compilation problems

Aug 16th, 2012
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.47 KB | None | 0 0
  1. #ifdef _WIN32
  2. #include <Windows.h>
  3. #endif
  4.  
  5. #ifdef __APPLE__
  6. #include <OpenGL/gl.h>
  7. #include <Glut/glut.h>
  8. #else
  9. #include <GL/gl.h>
  10. #include <GL/glut.h>
  11. #endif
  12.  
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <math.h>
  16. #include "glm/glm.hpp"
  17. #include "glm/gtc/matrix_transform.hpp"
  18. #include "glm/gtc/type_ptr.hpp"
  19.  
  20. //windowSize
  21. int windowWidth=640;
  22. int windowHeight=480;
  23.  
  24. GLuint shaderProgram;
  25. GLint shaderAttribute_coord3D;
  26. GLint shaderAttribute_vertexColour;
  27. GLint shaderAttribute_uniform_mvp;
  28. GLint shaderAttribute_uniform_animation;
  29. //model vertices
  30. GLuint modelDataVBO;
  31. GLuint modelElements;
  32.  
  33. char* readFile(const char* filename) {
  34.     FILE *inputFile=fopen(filename, "rb");
  35.     if(inputFile==NULL) {
  36.         return NULL;
  37.     }
  38.    
  39.     int resourceBufferSize=BUFSIZ;
  40.     char *resource=(char *)malloc(resourceBufferSize);
  41.     int resourceTotalRead=0;
  42.    
  43.     while (!feof(inputFile) && !ferror(inputFile)) {
  44.         if (resourceTotalRead+BUFSIZ > resourceBufferSize) {
  45.             if(resourceBufferSize > 10*1024*1024) {
  46.                 break;
  47.             }
  48.             resourceBufferSize*=2;
  49.             resource=(char *)realloc(resource, resourceBufferSize);
  50.         }
  51.         char *position=resource+resourceTotalRead;
  52.         resourceTotalRead+=fread(position, 1, BUFSIZ, inputFile);
  53.     }
  54.    
  55.     fclose(inputFile);
  56.     resource=(char *)realloc(resource, resourceTotalRead+1);
  57.     resource[resourceTotalRead]='\0';
  58.     return resource;
  59. }
  60.  
  61. void printCompilationLog(GLuint objectID) {
  62.     GLint shaderCompilationInfoLogLength = 0;  
  63.     glGetShaderiv(objectID, GL_INFO_LOG_LENGTH , &shaderCompilationInfoLogLength);
  64.     GLchar* compilerLog = new GLchar[shaderCompilationInfoLogLength];
  65.     GLsizei slen = 0;
  66.     glGetShaderInfoLog(objectID, shaderCompilationInfoLogLength, &slen, compilerLog);
  67.     fprintf(stderr, "compiler_log: %s", compilerLog);
  68.     delete compilerLog;
  69. }
  70.  
  71. bool bindShaderAttribute(GLint *shaderAttribute, GLuint shaderProgram, const char *shaderAttributeName) {
  72.     *shaderAttribute=glGetAttribLocation(shaderProgram, shaderAttributeName);
  73.     return *shaderAttribute!=-1;
  74. }
  75.  
  76. bool bindShaderUniformAttribute(GLint *shaderAttribute, GLuint shaderProgram, const char *shaderAttributeName){
  77.     *shaderAttribute=glGetUniformLocation(shaderProgram, shaderAttributeName);
  78.     return *shaderAttribute!=-1;
  79. }
  80.  
  81. GLuint createShader(const char *filename, GLenum shaderType) {
  82.     const char *shaderSource=readFile(filename);
  83.     if(shaderSource==NULL) {
  84.         fprintf(stderr, "ERROR: Could not open shader source file: %s", filename);
  85.         return 0;
  86.     }
  87.    
  88.     GLuint shaderID=glCreateShader(shaderType);
  89.     const GLchar *shaderSources[]={
  90.         // Define GLSL version
  91. #if defined(EMSCRIPTEN) || defined (GL_ES_VERSION_2_0)
  92.         "#version 100\n"
  93. #else
  94.         "#version 120\n"
  95. #endif
  96.         ,
  97.         // GLES2 precision specifiers
  98. #if defined(EMSCRIPTEN) || defined (GL_ES_VERSION_2_0)
  99.         // Define default float precision for fragment shaders:
  100.         (shaderType == GL_FRAGMENT_SHADER) ?
  101.         "#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
  102.         "precision highp float;           \n"
  103.         "#else                            \n"
  104.         "precision mediump float;         \n"
  105.         "#endif                           \n"
  106.         : ""
  107.         // Note: OpenGL ES automatically defines this:
  108.         // #define GL_ES
  109. #else
  110.         // Ignore GLES 2 precision specifiers:
  111.         "#define lowp   \n"
  112.         "#define mediump\n"
  113.         "#define highp  \n"
  114. #endif
  115.         ,
  116.         shaderSource
  117.     };
  118.     glShaderSource(shaderID, 3, shaderSources, NULL);
  119.     free((void *)shaderSource);
  120.     glCompileShader(shaderID);
  121.     GLint compilationSuccess=GL_FALSE;
  122.     glGetShaderiv(shaderID, GL_COMPILE_STATUS, &compilationSuccess);
  123.     if (compilationSuccess==GL_FALSE) {
  124.         fprintf(stderr, "Shader Compilation Failure\n");
  125.         printCompilationLog(shaderID);
  126.         glDeleteShader(shaderID);
  127.         return 0;
  128.     }
  129.    
  130.     return shaderID;
  131. }
  132.  
  133. bool initShaders() {
  134.     //load shaders & compile
  135.     GLint linkSuccess=GL_FALSE;
  136.    
  137.     //vertex shader
  138.     GLuint vertexShaderId=createShader("shaders/vertex.glsl", GL_VERTEX_SHADER);
  139.    
  140.     //fragment shader
  141.     GLuint fragmentShaderId=createShader("shaders/fragment.glsl", GL_FRAGMENT_SHADER);
  142.    
  143.     //program
  144.     shaderProgram=glCreateProgram();
  145.     glAttachShader(shaderProgram, vertexShaderId);
  146.     glAttachShader(shaderProgram, fragmentShaderId);
  147.     glLinkProgram(shaderProgram);
  148.     glGetProgramiv(shaderProgram, GL_LINK_STATUS, &linkSuccess);
  149.     if(linkSuccess==GL_FALSE){
  150.         fprintf(stderr, "Shader Linking Failure\n");
  151.         return false;
  152.     }
  153.    
  154.     //shader attributes
  155.     const char *coord2DAttributeName="coord3D";
  156.     if(!bindShaderAttribute(&shaderAttribute_coord3D, shaderProgram, coord2DAttributeName)){
  157.         fprintf(stderr, "Could not bind shader attribute %s\n", coord2DAttributeName);
  158.         return false;
  159.     }
  160.    
  161.     const char *vertexColourAttributeName="vertexColour";
  162.     if(!bindShaderAttribute(&shaderAttribute_vertexColour, shaderProgram, vertexColourAttributeName)){
  163.         fprintf(stderr, "Could not bind shader attribute %s\n", vertexColourAttributeName);
  164.         return false;
  165.     }
  166.    
  167.     const char *mvpMatrixAttributeName="mvp";
  168.     if(!bindShaderUniformAttribute(&shaderAttribute_uniform_mvp, shaderProgram, mvpMatrixAttributeName)){
  169.         fprintf(stderr, "Could not bind shader attribute %s\n", mvpMatrixAttributeName);
  170.         return false;
  171.     }
  172.    
  173.     const char *animationMatrixAttributeName="animation";
  174.     if(!bindShaderUniformAttribute(&shaderAttribute_uniform_animation, shaderProgram, animationMatrixAttributeName)){
  175.         fprintf(stderr, "Could not bind shader attribute %s\n", animationMatrixAttributeName);
  176.         return false;
  177.     }
  178.    
  179.     //if nothing fails till here, shader init is a success
  180.     return true;
  181. }
  182.  
  183. struct modelData {
  184.     GLfloat coord3D[3];
  185.     GLfloat colour3D[3];
  186. };
  187.  
  188. void initModels() {
  189.     struct modelData cube[] = {
  190.         //front face
  191.         {{-1.0, -1.0,  1.0}, {0.0, 0.0, 1.0}},
  192.         {{ 1.0, -1.0,  1.0}, {0.0, 1.0, 0.0}},
  193.         {{ 1.0,  1.0,  1.0}, {1.0, 0.0, 0.0}},
  194.         {{-1.0,  1.0,  1.0}, {0.0, 1.0, 0.0}},
  195.         //back face
  196.         {{-1.0, -1.0, -1.0}, {0.0, 1.0, 0.0}},
  197.         {{ 1.0, -1.0, -1.0}, {0.0, 0.0, 1.0}},
  198.         {{ 1.0,  1.0, -1.0}, {0.0, 1.0, 0.0}},
  199.         {{-1.0,  1.0, -1.0}, {1.0, 0.0, 0.0}}
  200.     };
  201.     glGenBuffers(1, &modelDataVBO);
  202.     glBindBuffer(GL_ARRAY_BUFFER, modelDataVBO);
  203.     glBufferData(GL_ARRAY_BUFFER, sizeof(cube), cube, GL_STATIC_DRAW);
  204.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  205.    
  206.     GLushort cubeElements[] = {
  207.         // front
  208.         0, 1, 2,
  209.         2, 3, 0,
  210.         // top
  211.         1, 5, 6,
  212.         6, 2, 1,
  213.         // back
  214.         7, 6, 5,
  215.         5, 4, 7,
  216.         // bottom
  217.         4, 0, 3,
  218.         3, 7, 4,
  219.         // left
  220.         4, 5, 1,
  221.         1, 0, 4,
  222.         // right
  223.         3, 2, 6,
  224.         6, 7, 3,
  225.     };
  226.     glGenBuffers(1, &modelElements);
  227.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelElements);
  228.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cubeElements), cubeElements, GL_STATIC_DRAW);
  229.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  230. }
  231.  
  232. bool initResources() {
  233.     initModels();
  234.     return initShaders();
  235. }
  236.  
  237. void freeResources() {
  238.     glDeleteProgram(shaderProgram);
  239.     //delete models
  240.     glDeleteBuffers(1, &modelDataVBO);
  241. }
  242.  
  243. void render() {
  244.     //clear screen
  245.     glClearColor(1.0, 1.0, 1.0, 1.0);
  246.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  247.    
  248.     //use the shader
  249.     glUseProgram(shaderProgram);
  250.    
  251.     //enable attributes in program
  252.     glEnableVertexAttribArray(shaderAttribute_coord3D);
  253.     glEnableVertexAttribArray(shaderAttribute_vertexColour);
  254.    
  255.     //describe arrays to program
  256.     glBindBuffer(GL_ARRAY_BUFFER, modelDataVBO);
  257.     glVertexAttribPointer(shaderAttribute_coord3D,  // attribute
  258.                           3,                        // number of elements per vertex, here (x,y)
  259.                           GL_FLOAT,                 // the type of each element
  260.                           GL_FALSE,                 // take our values as-is
  261.                           sizeof(struct modelData), // 2d coord every 5 elements
  262.                           0                         // offset of first element
  263.                           );
  264.    
  265.     glBindBuffer(GL_ARRAY_BUFFER, modelDataVBO);
  266.     glVertexAttribPointer(shaderAttribute_vertexColour, // attribute
  267.                           3,                            // number of elements per vertex, here (r,g,b)
  268.                           GL_FLOAT,                     // the type of each element
  269.                           GL_FALSE,                     // take our values as-is
  270.                           sizeof(struct modelData),     // colour every 5 elements
  271.                           (GLvoid *)(offsetof(struct modelData, colour3D))    // skip 2d coords
  272.                           );
  273.    
  274.     //draw the cube by going through its elements array
  275.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelElements);
  276.     int bufferSize;
  277.     glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufferSize);
  278.     glDrawElements(GL_TRIANGLES, bufferSize/sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
  279.    
  280.     //close up the attribute in program, no more need
  281.     glDisableVertexAttribArray(shaderAttribute_coord3D);
  282.     glDisableVertexAttribArray(shaderAttribute_vertexColour);
  283.    
  284.     //blit drawn screen
  285.     glutSwapBuffers();
  286. }
  287.  
  288. void reshape(int newWindowWidth, int newWindowHeight)
  289. {
  290.     windowWidth=newWindowWidth;
  291.     windowHeight=newWindowHeight;
  292.     glViewport(0, 0, windowWidth, windowHeight);
  293. }
  294.  
  295. void idle()
  296. {
  297.     //model matrix using model position vector
  298.     glm::vec3 modelPosition=glm::vec3(0,0,-4);
  299.     glm::mat4 model=glm::translate(glm::mat4(1.0f), modelPosition);
  300.    
  301.     //view matrix using look at
  302.     glm::vec3 cameraPosition=glm::vec3(0,2,0);
  303.     glm::vec3 cameraTarget=glm::vec3(0,0,-4); //same as model position to look at model
  304.     glm::vec3 cameraUp=glm::vec3(0,1,0);
  305.     glm::mat4 view=glm::lookAt(cameraPosition, cameraTarget, cameraUp);
  306.    
  307.     //projection matrix
  308.     GLfloat lensAngle=45.0f;
  309.     GLfloat aspectRatio=1.0*(windowWidth/windowHeight);
  310.     GLfloat nearClippingPlane=0.1f;
  311.     GLfloat farClippingPlane=10.0f;
  312.     glm::mat4 projection=glm::perspective(lensAngle, aspectRatio, nearClippingPlane, farClippingPlane);
  313.    
  314.     glm::mat4 mvp=projection*view*model;
  315.    
  316.     glUniformMatrix4fv(shaderAttribute_uniform_mvp, 1, GL_FALSE, glm::value_ptr(mvp));
  317.    
  318.     //animation matrix
  319.     float angle = glutGet(GLUT_ELAPSED_TIME) / 1000.0 * 45;  // 45° per second
  320.     glm::vec3 axis(1.0, -1.0, 0.0);
  321.     glm::mat4 anim = glm::rotate(glm::mat4(1.0f), angle, axis);
  322.     glUniformMatrix4fv(shaderAttribute_uniform_animation, 1, GL_FALSE, glm::value_ptr(anim));
  323.    
  324.     glutPostRedisplay();
  325. }
  326.  
  327. int main(int argc, char* argv[]) {
  328.     glutInit(&argc, argv);
  329.     glutInitDisplayMode(GLUT_RGBA|GLUT_ALPHA|GLUT_DOUBLE|GLUT_DEPTH);
  330.     glutInitWindowSize(windowWidth, windowHeight);
  331.     glutCreateWindow("Voxels");
  332.     glEnable(GL_BLEND);
  333.     glEnable(GL_DEPTH_TEST);
  334.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  335.     if(initResources()==true){
  336.         glutReshapeFunc(reshape);
  337.         glutDisplayFunc(render);
  338.         glutIdleFunc(idle);
  339.         glutMainLoop();
  340.     }
  341.    
  342.     freeResources();
  343.     return 0;
  344. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement