#include <string>#include <vector>#include <math.h>#include <stdio.h>#include <string.h>#include <glload/gl_3_3.h>#include <GL/freeglut.h>#include "../framework/framework.h"GLuinttheProgram;GLuintelapsedTimeUniform;voidInitializeProgram(){std::vector<GLuint>shaderList;shaderList.push_back(Framework::LoadShader(GL_VERTEX_SHADER,"calcOffset.vert"));shaderList.push_back(Framework::LoadShader(GL_FRAGMENT_SHADER,"standard.frag"));theProgram=Framework::CreateProgram(shaderList);elapsedTimeUniform=glGetUniformLocation(theProgram,"time");GLuintloopDurationUnf=glGetUniformLocation(theProgram,"loopDuration");glUseProgram(theProgram);glUniform1f(loopDurationUnf,5.0f);glUseProgram(0);}constfloatvertexPositions[]={0.25f,0.25f,0.0f,1.0f,0.25f,-0.25f,0.0f,1.0f,-0.25f,-0.25f,0.0f,1.0f,};GLuintpositionBufferObject;GLuintvao;voidInitializeVertexBuffer(){glGenBuffers(1,&positionBufferObject);glBindBuffer(GL_ARRAY_BUFFER,positionBufferObject);glBufferData(GL_ARRAY_BUFFER,sizeof(vertexPositions),vertexPositions,GL_STATIC_DRAW);glBindBuffer(GL_ARRAY_BUFFER,0);}//Called after the window and OpenGL are initialized. Called exactly once, before the main loop.voidinit(){InitializeProgram();InitializeVertexBuffer();glGenVertexArrays(1,&vao);glBindVertexArray(vao);}//Called to update the display.//You should call glutSwapBuffers after all of your rendering to display what you rendered.//If you need continuous updates of the screen, call glutPostRedisplay() at the end of the function.voiddisplay(){glClearColor(0.0f,0.0f,0.0f,0.0f);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(theProgram);glUniform1f(elapsedTimeUniform,glutGet(GLUT_ELAPSED_TIME)/1000.0f);glBindBuffer(GL_ARRAY_BUFFER,positionBufferObject);glEnableVertexAttribArray(0);glVertexAttribPointer(0,4,GL_FLOAT,GL_FALSE,0,0);glDrawArrays(GL_TRIANGLES,0,3);glDisableVertexAttribArray(0);glUseProgram(0);glutSwapBuffers();glutPostRedisplay();}//Called whenever the window is resized. The new window size is given, in pixels.//This is an opportunity to call glViewport or glScissor to keep up with the change in size.voidreshape(intw,inth){glViewport(0,0,(GLsizei)w,(GLsizei)h);}//Called whenever a key on the keyboard was pressed.//The key is given by the ''key'' parameter, which is in ASCII.//It's often a good idea to have the escape key (ASCII value 27) call glutLeaveMainLoop() to //exit the program.voidkeyboard(unsignedcharkey,intx,inty){switch(key){case27:glutLeaveMainLoop();break;}}unsignedintdefaults(unsignedintdisplayMode,int&width,int&height){returndisplayMode;}