#include "..\shared\Includes.h"
#include "..\shared\ShaderUtilities.h"
#include "Texture1.h"
#include "Cube.h"
#include "Teapot.h"
void Render();
GLuint renderProgram,textureProgram,textureUniform;
GLuint MVPMatrixUniform;
Texture testTexture;
GLuint vertexbuffer;
GLuint uvbuffer;
GLuint normalbuffer;
GLuint elementbuffer;
glm::mat4 perspMatrix,MVPMatrix,camMatrix,scaleMatrix,transformMatrix;
VBOTeapot* teapot;
FBO frameBuf;
const std::string strVertexShaderFile1 = "render.vp";
const std::string strFragmentShaderFile1 = "render.fp";
const std::string strVertexShaderFile2 = "texture.vp";
const std::string strFragmentShaderFile2 = "texture.fp";
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Function prototypes!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
void InitVertexBuffer();
GLvoid Reshape(GLsizei width,GLsizei height);
void InitGL();
void DrawGLScene();
void Update();
static const GLfloat g_quad_vertex_buffer_data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
};
GLuint quad_vertexbuffer;
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowSize(640,480);
glutInitWindowPosition(0,0);
glutCreateWindow("ArcSynth shizznit");
GLenum err = glewInit();
if (GLEW_OK != err)
{
return 1;
}
//int things for this app
InitGL();
//callback funcs
glutDisplayFunc(DrawGLScene);
glutReshapeFunc(Reshape);
glutMainLoop();
glDeleteTextures(1,&frameBuf.texID);
glDeleteBuffers(1,&frameBuf.handle);
delete teapot;
return 0;
}
void InitVertexBuffer()
{
glGenBuffers(1, &quad_vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,0);
}
GLvoid Reshape(GLsizei width,GLsizei height)
{
if(height == 0)
height = 1;
glViewport(0,0,width,height);
//glMatrixMode(GL_PROJECTION);
//glLoadIdentity();
//glMatrixMode(GL_MODELVIEW);
//glLoadIdentity();
}
void InitProgramSpecificData()
{
MVPMatrixUniform = glGetUniformLocation(renderProgram,"MVPMatrix");
ZeroMemory(&frameBuf,sizeof(frameBuf));
frameBuf.depthWidth = 640;
frameBuf.depthHeight = 480;
FrameBufferObject(frameBuf,GL_NEAREST,GL_NEAREST);
perspMatrix = glm::perspective(45.0f,1.0f,0.2f,600.0f);
teapot = new VBOTeapot(8.0f,glm::translate(0.0f,0.0f,0.0f));
camMatrix = glm::lookAt(glm::vec3(0.0f,2.0f,-7.0f),
glm::vec3(0.0f,2.0f,0.0f),
glm::vec3(0.0f,1.0f,0.0f));
InitVertexBuffer();
}
void InitGL(GLvoid)
{
glShadeModel(GL_SMOOTH);
glClearColor(0.5f,0.0f,0.0f,0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_MULTISAMPLE);
InitVertexBuffer();
std::vector<GLchar*> attribs;
attribs.push_back("position");
InitShaderProgram(ReadFile(strVertexShaderFile1),ReadFile(strFragmentShaderFile1),renderProgram,attribs);
InitShaderProgram(ReadFile(strVertexShaderFile2),ReadFile(strFragmentShaderFile2),textureProgram,attribs);
InitProgramSpecificData();
}
void Update()
{
static float angle = 0.0f;
angle += 0.05f;
if(angle > 360.0f)
angle = 0.0f;
glm::mat4 rotateMatrix = glm::rotate(angle,0.0f,1.0f,0.0f);
transformMatrix = rotateMatrix * glm::rotate(-90.0f,1.0f,0.0f,0.0f);
}
void RenderToTexture()
{
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT );
glUseProgram(renderProgram);
glUniformMatrix4fv(MVPMatrixUniform,1,GL_FALSE,&MVPMatrix[0][0]);
//set variables for the fbo
glBindFramebuffer(GL_FRAMEBUFFER,frameBuf.handle);
glViewport(0,0,640,480);
glEnableVertexAttribArray(0);
teapot->render();
glUseProgram(0);
glDisableVertexAttribArray(0);
glBindFramebuffer(GL_FRAMEBUFFER,0);
//glBindTexture(GL_TEXTURE_2D,0);
}
void DrawTextureToQuad()
{
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT );
glViewport(0,0,640,480);
glUseProgram(textureProgram);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,frameBuf.texID);
GLuint texID = glGetUniformLocation(textureProgram, "renderedTexture");
glUniform1i(texID,0);
glEnableVertexAttribArray(0);
//Render to the screen
glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
glVertexAttribPointer(
0, // attribute 0. No particular reason for 0, but must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
// Draw the triangle !
glDrawArrays(GL_TRIANGLES, 0, 6); // From index 0 to 3 -> 1 triangle
glDisableVertexAttribArray(0);
glUseProgram(0);
}
void DrawGLScene(GLvoid)
{
MVPMatrix = perspMatrix * camMatrix * transformMatrix;
Update();
RenderToTexture();
DrawTextureToQuad();
glutSwapBuffers();
glutPostRedisplay();
}