Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Pyramid.cpp
- // OpenGL SuperBible, Chapter 5
- // Demonstrates Texture mapping a pyramid
- // Program by Richard S. Wright Jr.
- #include <GLTools.h> // OpenGL toolkit
- #include <GLMatrixStack.h>
- #include <GLFrame.h>
- #include <GLFrustum.h>
- #include <GLBatch.h>
- #include <GLGeometryTransform.h>
- #include <math.h>
- #ifdef __APPLE__
- #include <glut/glut.h>
- #else
- #define FREEGLUT_STATIC
- #include <GL/glut.h>
- #endif
- /////////////////////////////////////////////////////////////////////////////////
- // An assortment of needed classes
- GLShaderManager shaderManager;
- GLMatrixStack modelViewMatrix;
- GLMatrixStack projectionMatrix;
- GLFrame cameraFrame;
- GLFrame objectFrame;
- GLFrustum viewFrustum;
- GLBatch pyramidBatch;
- GLuint textureID;
- GLGeometryTransform transformPipeline;
- M3DMatrix44f shadowMatrix;
- void MakePyramid(GLBatch& pyramidBatch)
- {
- pyramidBatch.Begin(GL_TRIANGLES, 18, 1);
- // Bottom of pyramid
- pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);
- pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
- pyramidBatch.Vertex3f(-1.0f, -1.0f, -1.0f);
- pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);
- pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
- pyramidBatch.Vertex3f(1.0f, -1.0f, -1.0f);
- pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);
- pyramidBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
- pyramidBatch.Vertex3f(1.0f, -1.0f, 1.0f);
- pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);
- pyramidBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
- pyramidBatch.Vertex3f(-1.0f, -1.0f, 1.0f);
- pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);
- pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
- pyramidBatch.Vertex3f(-1.0f, -1.0f, -1.0f);
- pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);
- pyramidBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
- pyramidBatch.Vertex3f(1.0f, -1.0f, 1.0f);
- M3DVector3f vApex = { 0.0f, 1.0f, 0.0f };
- M3DVector3f vFrontLeft = { -1.0f, -1.0f, 1.0f };
- M3DVector3f vFrontRight = { 1.0f, -1.0f, 1.0f };
- M3DVector3f vBackLeft = { -1.0f, -1.0f, -1.0f };
- M3DVector3f vBackRight = { 1.0f, -1.0f, -1.0f };
- M3DVector3f n;
- // Front of Pyramid
- m3dFindNormal(n, vApex, vFrontLeft, vFrontRight);
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);
- pyramidBatch.Vertex3fv(vApex); // Apex
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
- pyramidBatch.Vertex3fv(vFrontLeft); // Front left corner
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
- pyramidBatch.Vertex3fv(vFrontRight); // Front right corner
- m3dFindNormal(n, vApex, vBackLeft, vFrontLeft);
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);
- pyramidBatch.Vertex3fv(vApex); // Apex
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
- pyramidBatch.Vertex3fv(vBackLeft); // Back left corner
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
- pyramidBatch.Vertex3fv(vFrontLeft); // Front left corner
- m3dFindNormal(n, vApex, vFrontRight, vBackRight);
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);
- pyramidBatch.Vertex3fv(vApex); // Apex
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
- pyramidBatch.Vertex3fv(vFrontRight); // Front right corner
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
- pyramidBatch.Vertex3fv(vBackRight); // Back right cornder
- m3dFindNormal(n, vApex, vBackRight, vBackLeft);
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);
- pyramidBatch.Vertex3fv(vApex); // Apex
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
- pyramidBatch.Vertex3fv(vBackRight); // Back right cornder
- pyramidBatch.Normal3fv(n);
- pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
- pyramidBatch.Vertex3fv(vBackLeft); // Back left corner
- pyramidBatch.End();
- }
- // Load a TGA as a 2D Texture. Completely initialize the state
- bool LoadTGATexture(const char *szFileName, GLenum minFilter, GLenum magFilter, GLenum wrapMode)
- {
- GLbyte *pBits;
- int nWidth, nHeight, nComponents;
- GLenum eFormat;
- // Read the texture bits
- pBits = gltReadTGABits(szFileName, &nWidth, &nHeight, &nComponents, &eFormat);
- if(pBits == NULL)
- return false;
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glTexImage2D(GL_TEXTURE_2D, 0, nComponents, nWidth, nHeight, 0,
- eFormat, GL_UNSIGNED_BYTE, pBits);
- free(pBits);
- if(minFilter == GL_LINEAR_MIPMAP_LINEAR ||
- minFilter == GL_LINEAR_MIPMAP_NEAREST ||
- minFilter == GL_NEAREST_MIPMAP_LINEAR ||
- minFilter == GL_NEAREST_MIPMAP_NEAREST)
- glGenerateMipmap(GL_TEXTURE_2D);
- return true;
- }
- ///////////////////////////////////////////////////////////////////////////////
- // This function does any needed initialization on the rendering context.
- // This is the first opportunity to do any OpenGL related tasks.
- void SetupRC()
- {
- // Black background
- glClearColor(0.7f, 0.7f, 0.7f, 1.0f );
- shaderManager.InitializeStockShaders();
- glEnable(GL_DEPTH_TEST);
- glGenTextures(1, &textureID);
- glBindTexture(GL_TEXTURE_2D, textureID);
- LoadTGATexture("stone.tga", GL_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE);
- MakePyramid(pyramidBatch);
- cameraFrame.MoveForward(-7.0f);
- }
- ///////////////////////////////////////////////////////////////////////////////
- // Cleanup... such as deleting texture objects
- void ShutdownRC(void)
- {
- glDeleteTextures(1, &textureID);
- }
- ///////////////////////////////////////////////////////////////////////////////
- // Called to draw scene
- void RenderScene(void)
- {
- static GLfloat vLightPos [] = { 1.0f, 1.0f, 0.0f };
- static GLfloat vWhite [] = { 1.0f, 1.0f, 1.0f, 1.0f };
- // Clear the window with current clearing color
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- modelViewMatrix.PushMatrix();
- M3DMatrix44f mCamera;
- cameraFrame.GetCameraMatrix(mCamera);
- modelViewMatrix.MultMatrix(mCamera);
- M3DMatrix44f mObjectFrame;
- objectFrame.GetMatrix(mObjectFrame);
- modelViewMatrix.MultMatrix(mObjectFrame);
- glBindTexture(GL_TEXTURE_2D, textureID);
- shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,
- transformPipeline.GetModelViewMatrix(),
- transformPipeline.GetProjectionMatrix(),
- vLightPos, vWhite, 0);
- pyramidBatch.Draw();
- modelViewMatrix.PopMatrix();
- // Flush drawing commands
- glutSwapBuffers();
- }
- // Respond to arrow keys by moving the camera frame of reference
- void SpecialKeys(int key, int x, int y)
- {
- if(key == GLUT_KEY_UP)
- objectFrame.RotateWorld(m3dDegToRad(-5.0f), 1.0f, 0.0f, 0.0f);
- if(key == GLUT_KEY_DOWN)
- objectFrame.RotateWorld(m3dDegToRad(5.0f), 1.0f, 0.0f, 0.0f);
- if(key == GLUT_KEY_LEFT)
- objectFrame.RotateWorld(m3dDegToRad(-5.0f), 0.0f, 1.0f, 0.0f);
- if(key == GLUT_KEY_RIGHT)
- objectFrame.RotateWorld(m3dDegToRad(5.0f), 0.0f, 1.0f, 0.0f);
- glutPostRedisplay();
- }
- ///////////////////////////////////////////////////////////////////////////////
- // Window has changed size, or has just been created. In either case, we need
- // to use the window dimensions to set the viewport and the projection matrix.
- void ChangeSize(int w, int h)
- {
- glViewport(0, 0, w, h);
- viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);
- projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
- transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
- }
- ///////////////////////////////////////////////////////////////////////////////
- // Main entry point for GLUT based programs
- int main(int argc, char* argv[])
- {
- gltSetWorkingDirectory(argv[0]);
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
- glutInitWindowSize(800, 600);
- glutCreateWindow("Pyramid");
- glutReshapeFunc(ChangeSize);
- glutSpecialFunc(SpecialKeys);
- glutDisplayFunc(RenderScene);
- GLenum err = glewInit();
- if (GLEW_OK != err) {
- fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
- return 1;
- }
- SetupRC();
- glutMainLoop();
- ShutdownRC();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement