#include <GLTools.h>
#include <GLShaderManager.h>
#include <GLFrustum.h>
#include <GLBatch.h>
#include <GLFrame.h>
#include <GLMatrixStack.h>
#include <GLGeometryTransform.h>
#include <GL/glut.h>
GLBatch floorBatch;
GLBatch cubeBatch;
GLShaderManager shaderManager;
GLMatrixStack projectionMatrix;
GLMatrixStack modelViewMatrix;
GLFrustum viewFrustum;
GLFrame cameraFrameFloor;
GLFrame cameraFrameObject;
GLFrame objectFrame;
GLGeometryTransform transformPipeline;
GLint myShader;
GLint locMVP;
GLint locColor;
GLfloat floorColor[] = {1, 0, 0, 1};
GLfloat cubeColor[] = {1, 1, 0, 1};
void SetupRC()
{
glClearColor(0.5f, 0.0f, 0.7f, 1.0f);
glEnable(GL_DEPTH_TEST);
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
shaderManager.InitializeStockShaders();
floorBatch.Begin(GL_LINES, 484);
for (GLfloat x = -30.0; x <= 30.0f; x += 0.5)
{
floorBatch.Vertex3f(x, -0.55f, 30.0f);
floorBatch.Vertex3f(x, -0.55f, -30.0f);
floorBatch.Vertex3f(30, -0.55f, x);
floorBatch.Vertex3f(-30, -0.55f, x);
}
floorBatch.End();
gltMakeCube(cubeBatch, 0.5);
cameraFrameFloor.MoveForward(-6.0f);
cameraFrameObject.MoveForward(-6.0f);
myShader = gltLoadShaderPairWithAttributes("shader.vp", "shader.fp", 1, GLT_ATTRIBUTE_VERTEX, "vVertex");
locMVP = glGetUniformLocation(myShader, "mvpMatrix");
locColor = glGetUniformLocation(myShader, "vColorValue");
}
void ChangeSize(int nWidth, int nHeight)
{
glViewport(0, 0, nWidth, nHeight);
viewFrustum.SetPerspective(35.0f, GLfloat(nWidth) / nHeight, 1.0f, 100.0f);
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
}
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
M3DMatrix44f mCamera;
M3DMatrix44f mObject;
modelViewMatrix.PushMatrix();
cameraFrameFloor.GetMatrix(mCamera);
modelViewMatrix.MultMatrix(mCamera);
objectFrame.GetMatrix(mObject);
//modelViewMatrix.MultMatrix(mObject);
glUseProgram(myShader);
glUniformMatrix4fv(locMVP, 1, GL_FALSE, transformPipeline.GetModelViewProjectionMatrix());
glUniform4fv(locColor, 1, floorColor);
floorBatch.Draw();
modelViewMatrix.PopMatrix();
modelViewMatrix.PushMatrix();
cameraFrameObject.GetCameraMatrix(mCamera);
modelViewMatrix.MultMatrix(mCamera);
// objectFrame.GetMatrix(mObject);
// modelViewMatrix.MultMatrix(mObject);
glUseProgram(myShader);
glUniformMatrix4fv(locMVP, 1, GL_FALSE, transformPipeline.GetModelViewProjectionMatrix());
glUniform4fv(locColor, 1, cubeColor);
cubeBatch.Draw();
modelViewMatrix.PopMatrix();
glutSwapBuffers();
glutPostRedisplay();
}
void SpecialKeys(int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_UP:
cameraFrameObject.MoveForward(-1.0f);
objectFrame.MoveForward(-1.0f);
break;
case GLUT_KEY_DOWN:
cameraFrameObject.MoveForward(1.0f);
objectFrame.MoveForward(1.0f);
break;
case GLUT_KEY_LEFT:
cameraFrameObject.RotateWorld(m3dDegToRad(-2.0f), 0.0f, 1.0f, 0.0f);
cameraFrameFloor.RotateWorld(m3dDegToRad(-2.0f), 0.0f, 1.0f, 0.0f);
break;
case GLUT_KEY_RIGHT:
cameraFrameObject.RotateWorld(m3dDegToRad(2.0f), 0.0f, 1.0f, 0.0f);
cameraFrameFloor.RotateWorld(m3dDegToRad(2.0f), 0.0f, 1.0f, 0.0f);
break;
default:
break;
}
glutPostRedisplay();
}
void ShutDownRC()
{
glDeleteShader(myShader);
}
int main(int argc, char* argv[])
{
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("MoveObject");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
glutSpecialFunc(SpecialKeys);
GLenum err = glewInit();
if (GLEW_OK != err)
{
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}
SetupRC();
glutMainLoop();
ShutDownRC();
return 0;
}