// This code example is created for educational purpose // by Thorsten Thormaehlen (contact: www.thormae.de). // It is distributed without any warranty. #include #include // we use glut here as window manager #define _USE_MATH_DEFINES #include #include #include #include #include using namespace std; class Renderer { private: struct Vertex { float position[3]; float color[4]; }; public: float t; private: enum {Triangle, numVAOs}; enum {TriangleAll, numVBOs}; GLuint vaoID[numVAOs]; GLuint bufID[numVBOs]; int triangleVertNo; int cubeIndicesNo; public: // constructor Renderer() : t(0.0), triangleVertNo(0), cubeIndicesNo(0) {} //destructor ~Renderer() { glDeleteVertexArrays(numVAOs, vaoID); glDeleteBuffers(numVBOs, bufID); } public: void init() { glEnable(GL_DEPTH_TEST); // create a Vertex Array Objects (VAO) glGenVertexArrays(numVAOs, vaoID); // generate a Vertex Buffer Object (VBO) glGenBuffers(numVBOs, bufID); // binding the Triangle VAO glBindVertexArray(vaoID[Triangle]); float triangleVertexData[] = { 0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, -0.5f,-0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.5f,-0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, }; triangleVertNo = 3; glBindBuffer(GL_ARRAY_BUFFER, bufID[TriangleAll]); glBufferData(GL_ARRAY_BUFFER, triangleVertNo*sizeof(Vertex), triangleVertexData, GL_STATIC_DRAW); int stride = sizeof(Vertex); char *offset = (char*)NULL; // position int vertexLoc = 0; glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, stride, offset); glEnableVertexAttribArray(vertexLoc); } void resize(int w, int h) { glViewport(0, 0, w, h); } void display() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // bind Triangle VAO glBindVertexArray(vaoID[Triangle]); // render data glDrawArrays(GL_TRIANGLES, 0, triangleVertNo); } }; //this is a static pointer to a Renderer used in the glut callback functions static Renderer *renderer; //glut static callbacks start static void glutResize(int w, int h) { renderer->resize(w,h); } static void glutDisplay() { renderer->display(); glutSwapBuffers(); glutReportErrors(); } static void timer(int v) { float offset = 1.0f; renderer->t += offset; glutDisplay(); glutTimerFunc(unsigned(20), timer, ++v); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(320, 320); glutCreateWindow("First OpenGL 3 Forward Compatible Example"); GLenum err = glewInit(); if (GLEW_OK != err) { fprintf(stderr, "Glew error: %s\n", glewGetErrorString(err)); } glutDisplayFunc(glutDisplay); //glutIdleFunc(glutDisplay); glutReshapeFunc(glutResize); renderer = new Renderer; renderer->init(); glutTimerFunc(unsigned(20), timer, 0); glutMainLoop(); }