gltut / Tut 03 OpenGLs Moving Triangle / vertPositionOffset.cpp

Jason McKesson 80244e0 

Jason McKesson ff914d3 
Jason McKesson 80244e0 

Jason McKesson c689e4d 

Jason McKesson 80244e0 

Jason McKesson c689e4d 
Jason McKesson 80244e0 

#include <string>
#include <vector>
#include <math.h>
#include <glloader/gl_3_2_comp.h>
#include <GL/freeglut.h>
#include "../framework/framework.h"

GLuint theProgram;
GLuint offsetLocation;

void InitializeProgram()
	std::vector<GLuint> shaderList;

	shaderList.push_back(Framework::LoadShader(GL_VERTEX_SHADER, "positionOffset.vert"));
	shaderList.push_back(Framework::LoadShader(GL_FRAGMENT_SHADER, "standard.frag"));

	theProgram = Framework::CreateProgram(shaderList);

	offsetLocation = glGetUniformLocation(theProgram, "offset");

const float vertexPositions[] = {
	0.25f, 0.25f, 0.0f, 1.0f,
	0.25f, -0.25f, 0.0f, 1.0f,
	-0.25f, -0.25f, 0.0f, 1.0f,

GLuint positionBufferObject;
GLuint vao;

void InitializeVertexBuffer()
	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.
void init()

	glGenVertexArrays(1, &vao);

void ComputePositionOffsets(float &fXOffset, float &fYOffset)
	const float fLoopDuration = 5.0f;
	const float fScale = 3.14159f * 2.0f / fLoopDuration;

	float fElapsedTime = glutGet(GLUT_ELAPSED_TIME) / 1000.0f;

	float fCurrTimeThroughLoop = fmodf(fElapsedTime, fLoopDuration);

	fXOffset = cosf(fCurrTimeThroughLoop * fScale) * 0.5f;
	fYOffset = sinf(fCurrTimeThroughLoop * fScale) * 0.5f;

//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.
void display()
	float fXOffset = 0.0f, fYOffset = 0.0f;
	ComputePositionOffsets(fXOffset, fYOffset);

	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);


	glUniform2f(offsetLocation, fXOffset, fYOffset);

	glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
	glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

	glDrawArrays(GL_TRIANGLES, 0, 3);



//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.
void reshape (int w, int h)
	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.
void keyboard(unsigned char key, int x, int y)
	switch (key)
	case 27: