void initFloorBatch() { float alpha = 0.25f; floorBatch.Begin(GL_TRIANGLE_FAN,4,1); floorBatch.Color4f(0.0f,1.0f,0.0f,alpha); floorBatch.MultiTexCoord2f(0,0.0,0.0); floorBatch.Normal3f(0.0,1.0,0.0); floorBatch.Vertex3f(-20.0f,-0.4f,20.0f); floorBatch.Color4f(0.0f,1.0f,0.0f,alpha); floorBatch.MultiTexCoord2f(0,10.0,0.0); floorBatch.Normal3f(0.0,1.0,0.0); floorBatch.Vertex3f(20.0f,-0.4f,20.0f); floorBatch.Color4f(0.0f,1.0f,0.0f,alpha); floorBatch.MultiTexCoord2f(0,10.0,10.0); floorBatch.Normal3f(0.0,1.0,0.0); floorBatch.Vertex3f(20.0f,-0.4f,-20.0f); floorBatch.Color4f(0.0f,1.0f,0.0f,alpha); floorBatch.MultiTexCoord2f(0,0.0,10.0); floorBatch.Normal3f(0.0,1.0,0.0); floorBatch.Vertex3f(-20.0f,-0.4f,-20.0f); floorBatch.End(); }
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(); }
/////////////////////////////////////////////////////////////////////////////////////// // Make a cube, centered at the origin, and with a specified "radius" void gltMakeCube(GLBatch& cubeBatch, GLfloat fRadius ) { cubeBatch.Begin(GL_TRIANGLES, 36, 1); ///////////////////////////////////////////// // Top of cube cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, fRadius); cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, fRadius); cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, fRadius); //////////////////////////////////////////// // Bottom of cube cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, -fRadius, fRadius); cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, -fRadius, fRadius); cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, -fRadius, fRadius); /////////////////////////////////////////// // Left side of cube cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, fRadius); cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(-fRadius, fRadius, -fRadius); cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, fRadius); cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, -fRadius, fRadius); // Right side of cube cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, fRadius, -fRadius); cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, fRadius); cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, fRadius); cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(fRadius, -fRadius, fRadius); cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, -fRadius); // Front and Back // Front cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, fRadius); cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, fRadius); cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, fRadius); cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, fRadius); cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, fRadius); cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, fRadius); // Back cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, -fRadius); cubeBatch.End(); }
/////////////////////////////////////////////////////////////////////////////// // OpenGL related startup code is safe to put here. Load textures, etc. void SetupRC(void) { #ifndef ANGLE GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); } #endif // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); // Black glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gltMakeTorus(torusBatch, 0.4f, 0.15f, 35, 35); GLfloat alpha = 0.25f; floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, -20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f); floorBatch.End(); glGenTextures(1, textures); glBindTexture(GL_TEXTURE_2D, textures[0]); LoadBMPTexture("marble.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); // Create blur program blurProg = gltLoadShaderPairWithAttributes("blur.vs", "blur.fs", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "texCoord0"); // Create blur textures glGenTextures(6, blurTextures); // XXX I don't think this is necessary. Should set texture data to NULL // Allocate a pixel buffer to initialize textures and PBOs pixelDataSize = screenWidth*screenHeight*3*sizeof(unsigned int); // XXX This should be unsigned byte void* data = (void*)malloc(pixelDataSize); memset(data, 0x00, pixelDataSize); // Setup 6 texture units for blur effect // Initialize texture data for (int i=0; i<6;i++) { glActiveTexture(GL_TEXTURE1+i); glBindTexture(GL_TEXTURE_2D, blurTextures[i]); #ifndef OPENGL_ES glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); #else glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); #endif glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screenWidth, screenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, data); } // Alloc space for copying pixels so we dont call malloc on every draw #ifndef OPENGL_ES glGenBuffers(1, pixBuffObjs); glBindBuffer(GL_PIXEL_PACK_BUFFER, pixBuffObjs[0]); glBufferData(GL_PIXEL_PACK_BUFFER, pixelDataSize, pixelData, GL_DYNAMIC_COPY); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); #endif // Create geometry and a matrix for screen aligned drawing gltGenerateOrtho2DMat(screenWidth, screenHeight, orthoMatrix, screenQuad); // Make sure all went well gltCheckErrors(); }
/////////////////////////////////////////////////////////////////////////////// // Make a cube out of a batch of triangles. Texture coordinates and normals // are also provided. void MakeCube(GLBatch& cubeBatch) { cubeBatch.Begin(GL_TRIANGLES, 36, 1); ///////////////////////////////////////////// // Top of cube cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f); //////////////////////////////////////////// // Bottom of cube cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f); cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, 1.0f); cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f); /////////////////////////////////////////// // Left side of cube cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, 1.0f); // Right side of cube cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f); cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f); // Front and Back // Front cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f); // Back cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f); cubeBatch.End(); }
/////////////////////////////////////////////////////////////////////////////// // This function does any needed initialization on the rendering context. // This is the first opportunity to do any OpenGL related tasks. void SetupRC() { GLbyte *pBytes; GLint nWidth, nHeight, nComponents; GLenum format; shaderManager.InitializeStockShaders(); // Black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); glEnable(GL_DEPTH_TEST); glLineWidth(2.5f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix); cameraFrame.MoveForward(-15.0f); cameraFrame.MoveUp(6.0f); cameraFrame.RotateLocalX(float(m3dDegToRad(20.0f))); MakeCube(cubeBatch); MakeFloor(floorBatch); // Make top topBlock.Begin(GL_TRIANGLE_FAN, 4, 1); topBlock.Normal3f(0.0f, 1.0f, 0.0f); topBlock.MultiTexCoord2f(0, 0.0f, 0.0f); topBlock.Vertex3f(-1.0f, 1.0f, 1.0f); topBlock.Normal3f(0.0f, 1.0f, 0.0f); topBlock.MultiTexCoord2f(0, 1.0f, 0.0f); topBlock.Vertex3f(1.0f, 1.0f, 1.0f); topBlock.Normal3f(0.0f, 1.0f, 0.0f); topBlock.MultiTexCoord2f(0, 1.0f, 1.0f); topBlock.Vertex3f(1.0f, 1.0f, -1.0f); topBlock.Normal3f(0.0f, 1.0f, 0.0f); topBlock.MultiTexCoord2f(0, 0.0f, 1.0f); topBlock.Vertex3f(-1.0f, 1.0f, -1.0f); topBlock.End(); // Make Front frontBlock.Begin(GL_TRIANGLE_FAN, 4, 1); frontBlock.Normal3f(0.0f, 0.0f, 1.0f); frontBlock.MultiTexCoord2f(0, 0.0f, 0.0f); frontBlock.Vertex3f(-1.0f, -1.0f, 1.0f); frontBlock.Normal3f(0.0f, 0.0f, 1.0f); frontBlock.MultiTexCoord2f(0, 1.0f, 0.0f); frontBlock.Vertex3f(1.0f, -1.0f, 1.0f); frontBlock.Normal3f(0.0f, 0.0f, 1.0f); frontBlock.MultiTexCoord2f(0, 1.0f, 1.0f); frontBlock.Vertex3f(1.0f, 1.0f, 1.0f); frontBlock.Normal3f(0.0f, 0.0f, 1.0f); frontBlock.MultiTexCoord2f(0, 0.0f, 1.0f); frontBlock.Vertex3f(-1.0f, 1.0f, 1.0f); frontBlock.End(); // Make left leftBlock.Begin(GL_TRIANGLE_FAN, 4, 1); leftBlock.Normal3f(-1.0f, 0.0f, 0.0f); leftBlock.MultiTexCoord2f(0, 0.0f, 0.0f); leftBlock.Vertex3f(-1.0f, -1.0f, -1.0f); leftBlock.Normal3f(-1.0f, 0.0f, 0.0f); leftBlock.MultiTexCoord2f(0, 1.0f, 0.0f); leftBlock.Vertex3f(-1.0f, -1.0f, 1.0f); leftBlock.Normal3f(-1.0f, 0.0f, 0.0f); leftBlock.MultiTexCoord2f(0, 1.0f, 1.0f); leftBlock.Vertex3f(-1.0f, 1.0f, 1.0f); leftBlock.Normal3f(-1.0f, 0.0f, 0.0f); leftBlock.MultiTexCoord2f(0, 0.0f, 1.0f); leftBlock.Vertex3f(-1.0f, 1.0f, -1.0f); leftBlock.End(); // Create shadow projection matrix GLfloat floorPlane[] = { 0.0f, 1.0f, 0.0f, 1.0f}; m3dMakePlanarShadowMatrix(shadowMatrix, floorPlane, vLightPos); // Load up four textures glGenTextures(4, textures); // Wood floor pBytes = gltReadTGABits("floor.tga", &nWidth, &nHeight, &nComponents, &format); glBindTexture(GL_TEXTURE_2D, textures[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexImage2D(GL_TEXTURE_2D,0,nComponents,nWidth, nHeight, 0, format, GL_UNSIGNED_BYTE, pBytes); free(pBytes); // One of the block faces pBytes = gltReadTGABits("Block4.tga", &nWidth, &nHeight, &nComponents, &format); glBindTexture(GL_TEXTURE_2D, textures[1]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexImage2D(GL_TEXTURE_2D,0,nComponents,nWidth, nHeight, 0, format, GL_UNSIGNED_BYTE, pBytes); free(pBytes); // Another block face pBytes = gltReadTGABits("block5.tga", &nWidth, &nHeight, &nComponents, &format); glBindTexture(GL_TEXTURE_2D, textures[2]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexImage2D(GL_TEXTURE_2D,0,nComponents,nWidth, nHeight, 0, format, GL_UNSIGNED_BYTE, pBytes); free(pBytes); // Yet another block face pBytes = gltReadTGABits("block6.tga", &nWidth, &nHeight, &nComponents, &format); glBindTexture(GL_TEXTURE_2D, textures[3]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexImage2D(GL_TEXTURE_2D,0,nComponents,nWidth, nHeight, 0, format, GL_UNSIGNED_BYTE, pBytes); free(pBytes); }
// This function does any needed initialization on the rendering // context. void SetupRC() { // Black background glClearColor(0.0f, 0.0f, 0.75f, 1.0f ); // glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); shaderManager.InitializeStockShaders(); tubeBatch.Begin(GL_QUADS, 200); float fZ = 100.0f; float bZ = -100.0f; tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-50.0f, 50.0f, 100.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-50.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f,50.0f,fZ); // Right Panel tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(50.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(50.0f,-50.0f,fZ); // Top Panel tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, 35.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, 35.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, 50.0f,fZ); // Bottom Panel tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, -35.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, -35.0f,fZ); // Top length section //////////////////////////// // Normal points up Y axis tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 1.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 1.0f, 0.0f); tubeBatch.Vertex3f(50.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 1.0f, 0.0f); tubeBatch.Vertex3f(50.0f, 50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 1.0f, 0.0f); tubeBatch.Vertex3f(-50.0f,50.0f,bZ); // Bottom section tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, -1.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, -1.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, -50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, -1.0f, 0.0f); tubeBatch.Vertex3f(50.0f, -50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, -1.0f, 0.0f); tubeBatch.Vertex3f(50.0f, -50.0f, fZ); // Left section tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(50.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(50.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(50.0f, -50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(50.0f, 50.0f, bZ); // Right Section tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, 50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, -50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, -50.0f, fZ); // Pointing straight out Z // Left Panel tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-50.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-50.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f,50.0f,fZ); // Right Panel tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(50.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(50.0f,-50.0f,fZ); // Top Panel tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, 35.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, 35.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, 50.0f,fZ); // Bottom Panel tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, -35.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, -35.0f,fZ); // Top length section //////////////////////////// // Normal points up Y axis tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 1.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 1.0f, 0.0f); tubeBatch.Vertex3f(50.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 1.0f, 0.0f); tubeBatch.Vertex3f(50.0f, 50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, 1.0f, 0.0f); tubeBatch.Vertex3f(-50.0f,50.0f,bZ); // Bottom section tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, -1.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, -1.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, -50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, -1.0f, 0.0f); tubeBatch.Vertex3f(50.0f, -50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(0.0f, -1.0f, 0.0f); tubeBatch.Vertex3f(50.0f, -50.0f, fZ); // Left section tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(50.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(50.0f, -50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(50.0f, -50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(50.0f, 50.0f, bZ); // Right Section tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, 50.0f, fZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, 50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, -50.0f, bZ); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); tubeBatch.Vertex3f(-50.0f, -50.0f, fZ); // Left Panel tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f,50.0f,bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, -50.0f, bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-50.0f, -50.0f, bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-50.0f, 50.0f, bZ); // Right Panel tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(50.0f,-50.0f,bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, -50.0f, bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, 50.0f, bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(50.0f, 50.0f, bZ); // Top Panel tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, 50.0f, bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, 35.0f, bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, 35.0f, bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, 50.0f, bZ); // Bottom Panel tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, -35.0f,bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(35.0f, -50.0f, bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, -50.0f, bZ); tubeBatch.Normal3f(0.0f, 0.0f, -1.0f); tubeBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); tubeBatch.Vertex3f(-35.0f, -35.0f, bZ); tubeBatch.End(); innerBatch.Begin(GL_QUADS, 40); // Insides ///////////////////////////// // Normal points up Y axis innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(0.0f, 1.0f, 0.0f); innerBatch.Vertex3f(-35.0f, 35.0f, fZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(0.0f, 1.0f, 0.0f); innerBatch.Vertex3f(35.0f, 35.0f, fZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(0.0f, 1.0f, 0.0f); innerBatch.Vertex3f(35.0f, 35.0f, bZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(0.0f, 1.0f, 0.0f); innerBatch.Vertex3f(-35.0f,35.0f,bZ); // Bottom section innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(0.0f, 1.0f, 0.0f); innerBatch.Vertex3f(-35.0f, -35.0f, fZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(0.0f, 1.0f, 0.0f); innerBatch.Vertex3f(-35.0f, -35.0f, bZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(0.0f, 1.0f, 0.0f); innerBatch.Vertex3f(35.0f, -35.0f, bZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(0.0f, 1.0f, 0.0f); innerBatch.Vertex3f(35.0f, -35.0f, fZ); // Left section innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(1.0f, 0.0f, 0.0f); innerBatch.Vertex3f(-35.0f, 35.0f, fZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(1.0f, 0.0f, 0.0f); innerBatch.Vertex3f(-35.0f, 35.0f, bZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(1.0f, 0.0f, 0.0f); innerBatch.Vertex3f(-35.0f, -35.0f, bZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(1.0f, 0.0f, 0.0f); innerBatch.Vertex3f(-35.0f, -35.0f, fZ); // Right Section innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(-1.0f, 0.0f, 0.0f); innerBatch.Vertex3f(35.0f, 35.0f, fZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(-1.0f, 0.0f, 0.0f); innerBatch.Vertex3f(35.0f, -35.0f, fZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(-1.0f, 0.0f, 0.0f); innerBatch.Vertex3f(35.0f, -35.0f, bZ); innerBatch.Color4f(0.75f, 0.75f, 0.75f, 1.0f); innerBatch.Normal3f(-1.0f, 0.0f, 0.0f); innerBatch.Vertex3f(35.0f, 35.0f, bZ); innerBatch.End(); }
void SetupRC(void) { shaderManager.InitializeStockShaders(); glGenTextures(TEXTURE_COUNT, uiTextures); GLbyte *pBits; int nWidth, nHeight, nComponents; GLenum eFormat; for (size_t i = 0; i < TEXTURE_COUNT; ++i) { glBindTexture(GL_TEXTURE_2D, uiTextures[i]); // Read the texture bits pBits = gltReadTGABits(uiTextureName[i], &nWidth, &nHeight, &nComponents, &eFormat); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, nComponents, nWidth, nHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBits); glGenerateMipmap(GL_TEXTURE_2D); free(pBits); } glClearColor(0.0f,0.0f,0.0f,1.0f); GLfloat z; floorBatch.Begin(GL_TRIANGLE_STRIP, 28,1); for (z = 60.f; z >= 0.0f; z -= 10.0f) { floorBatch.Normal3f(0.0f, 1.0f, 0.0f); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Vertex3f(-10.0f, -10.0f, z); floorBatch.Normal3f(0.0f, 1.0f, 0.0f); floorBatch.MultiTexCoord2f(0, 1.0f, 0.0f); floorBatch.Vertex3f(10.0f, -10.0f, z); floorBatch.Normal3f(0.0f, 1.0f, 0.0f); floorBatch.MultiTexCoord2f(0, 0.0f, 1.0f); floorBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f); floorBatch.Normal3f(0.0f, 1.0f, 0.0f); floorBatch.MultiTexCoord2f(0, 1.0f, 1.0f); floorBatch.Vertex3f(10.0f,-10.0f , z - 10.0f); } floorBatch.End(); ceilingBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);// 哪里来,哪里回;根据法线来确认逆时针方向。strip的画法要熟悉,从其实的两个顶点开始已折线的形式前进 for (z = 60.f; z >= 0.0f; z -= 10.0f) { ceilingBatch.Normal3f(0.0f, -1.0f, 0.0f); ceilingBatch.MultiTexCoord2f(0, 0.0f, 0.0f); ceilingBatch.Vertex3f(10.0f, 10.0f, z); ceilingBatch.Normal3f(0.0f, -1.0f, 0.0f); ceilingBatch.MultiTexCoord2f(0, 1.0f, 0.0f); ceilingBatch.Vertex3f(-10.0f, 10.0f, z); ceilingBatch.Normal3f(0.0f, -1.0f, 0.0f); ceilingBatch.MultiTexCoord2f(0, 1.0f, 1.0f); ceilingBatch.Vertex3f(10.0f, 10.0f, z - 10.0f); ceilingBatch.Normal3f(0.0f, -1.0f, 0.0f); ceilingBatch.MultiTexCoord2f(0, 0.0f, 1.0f); ceilingBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f); } ceilingBatch.End(); leftWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1); for (z = 60.f; z >= 0.0f; z -= 10.0f) { leftWallBatch.Normal3f(1.0f, 0.0f, 0.0f); leftWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f); leftWallBatch.Vertex3f(-10.0f, 10.0f, z); leftWallBatch.Normal3f(1.0f, 0.0f, 0.0f); leftWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f); leftWallBatch.Vertex3f(-10.0f, -10.0f, z); leftWallBatch.Normal3f(1.0f, 0.0f, 0.0f); leftWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f); leftWallBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f); leftWallBatch.Normal3f(1.0f, 0.0f, 0.0f); leftWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f); leftWallBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f); } leftWallBatch.End(); rightWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1); for (z = 60.f; z >= 0.0f; z -= 10.0f) { rightWallBatch.Normal3f(-1.0f, 0.0f, 0.0f); rightWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f); rightWallBatch.Vertex3f(10.0f, -10.0f, z); rightWallBatch.Normal3f(-1.0f, 0.0f, 0.0f); rightWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f); rightWallBatch.Vertex3f(10.0f, 10.0f, z); rightWallBatch.Normal3f(-1.0f, 0.0f, 0.0f); rightWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f); rightWallBatch.Vertex3f(10.0f, -10.0f, z - 10.0f); rightWallBatch.Normal3f(-1.0f, 1.0f, 1.0f); rightWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f); rightWallBatch.Vertex3f(10.0f, 10.0f, z - 10.0f); } rightWallBatch.End(); }
/////////////////////////////////////////////////////////////////////////////// // OpenGL related startup code is safe to put here. Load textures, etc. void SetupRC(void) { GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); } glEnable(GL_DEPTH_TEST); exposure = 1.0f; // Light Blue glClearColor(vSkyBlue[0], vSkyBlue[1], vSkyBlue[2], vSkyBlue[3]); // Load geometry GLfloat alpha = 0.25f; floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 1.00f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 1.00f, 1.00f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, -20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 1.00f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f); floorBatch.End(); windowBatch.Begin(GL_TRIANGLE_FAN, 4, 1); windowBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); windowBatch.MultiTexCoord2f(0, 0.0f, 0.0f); windowBatch.Normal3f( 0.0f, 1.0f, 0.0f); windowBatch.Vertex3f(-1.0f, 0.0f, 0.0f); windowBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); windowBatch.MultiTexCoord2f(0, 1.0f, 0.0f); windowBatch.Normal3f(0.0f, 1.0f, 0.0f); windowBatch.Vertex3f(1.0f, 0.0f, 0.0f); windowBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); windowBatch.MultiTexCoord2f(0, 1.0f, 1.0f); windowBatch.Normal3f(0.0f, 1.0f, 0.0f); windowBatch.Vertex3f(1.0f, 2.0f, 0.0f); windowBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); windowBatch.MultiTexCoord2f(0, 0.0f, 1.0f); windowBatch.Normal3f( 0.0f, 1.0f, 0.0f); windowBatch.Vertex3f(-1.0f, 2.0f, 0.0f); windowBatch.End(); const float width = 0.2f; windowBorderBatch.Begin(GL_TRIANGLE_STRIP, 13); windowBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(-1.01f, width, 0.01f); windowBorderBatch.Normal3f(0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(-1.01f, 0.0f, 0.01f); windowBorderBatch.Normal3f(0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(1.01f, width, 0.01f); windowBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(1.01f, 0.0f, 0.01f); windowBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(1.01-width, 0.0f, 0.01f); windowBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(1.01f, 2.0f, 0.01f); windowBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(1.01-width, 2.0f, 0.01f); windowBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(1.01f, 2.0-width, 0.01f); windowBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(-1.01f, 2.f, 0.01f); windowBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(-1.01f, 2.0-width, 0.01f); windowBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(-1.01+width, 2.f, 0.01f); windowBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(-1.01f, 0.0f, 0.01f); windowBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowBorderBatch.Vertex3f(-1.01+width, 0.0f, 0.01f); windowBorderBatch.End(); const float gridWidth = (float)0.01; const int gridLineCount = 24; windowGridBatch.Begin(GL_TRIANGLES, gridLineCount*2*6); // bottom horizontal for(int i=0; i<gridLineCount; i++) { float offset = 2*((float)(i+1)/(float)(gridLineCount+1)); windowGridBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(-1.0f, offset+gridWidth, 0.01f); windowGridBatch.Normal3f(0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(-1.0f, offset-gridWidth, 0.01f); windowGridBatch.Normal3f(0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(1.0f, offset-gridWidth, 0.01f); windowGridBatch.Normal3f(0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(1.0f,offset-gridWidth, 0.01f); windowGridBatch.Normal3f(0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(1.0f, offset+gridWidth, 0.01f); windowGridBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(-1.0f, offset+gridWidth, 0.01f); } // Verticals for(int i=0; i<gridLineCount; i++) { float offset = 2*((float)(i+1)/(float)(gridLineCount+1)) - 1.0; windowGridBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(offset+gridWidth, 0.0f, 0.01f); windowGridBatch.Normal3f(0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(offset-gridWidth, 0.0f, 0.01f); windowGridBatch.Normal3f(0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(offset-gridWidth, 2.0f, 0.01f); windowGridBatch.Normal3f(0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(offset-gridWidth, 2.0f, 0.01f); windowGridBatch.Normal3f(0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(offset+gridWidth, 2.0, 0.01f); windowGridBatch.Normal3f( 0.0f, 0.0f, 1.0f); windowGridBatch.Vertex3f(offset+gridWidth, 0.0f, 0.01f); } windowGridBatch.End(); glGenTextures(1, textures); glBindTexture(GL_TEXTURE_2D, textures[0]); LoadBMPTexture("marble.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); // Setup HDR render texture glGenTextures(1, hdrTextures); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, hdrTextures[0]); glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_RGB16F, screenWidth, screenHeight, GL_FALSE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Attach HDR texture to fbo // Create and bind an FBO glGenFramebuffers(1,hdrFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, hdrFBO[0]); glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, hdrTextures[0], 0); // Create window texture glGenTextures(1, &windowTexture); glBindTexture(GL_TEXTURE_2D, windowTexture); GLuint texWidth = 0; GLuint texHeight = 0; // Load HDR image from EXR file LoadOpenEXRImage("window.exr", windowTexture, texWidth, texHeight); // Load flat color shader flatColorProg = gltLoadShaderPairWithAttributes("basic.vs", "color.fs", 3, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_NORMAL, "vNormal", GLT_ATTRIBUTE_TEXTURE0, "vTexCoord0"); glBindFragDataLocation(flatColorProg, 0, "oColor"); glBindFragDataLocation(flatColorProg, 1, "oBright"); glLinkProgram(flatColorProg); // Load texture replace shader texReplaceProg = gltLoadShaderPairWithAttributes("basic.vs", "tex_replace.fs", 3, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_NORMAL, "vNormal", GLT_ATTRIBUTE_TEXTURE0, "vTexCoord0"); glBindFragDataLocation(texReplaceProg, 0, "oColor"); glBindFragDataLocation(texReplaceProg, 1, "oBright"); glLinkProgram(texReplaceProg); // Load bloom shader hdrResolve = gltLoadShaderPairWithAttributes("basic.vs", "hdr_exposure.fs", 3, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_NORMAL, "vNormal", GLT_ATTRIBUTE_TEXTURE0, "vTexCoord0"); glBindFragDataLocation(hdrResolve, 0, "oColor"); glLinkProgram(hdrResolve); // Uncomment the line below to get the correct behavior. floorBatch.Draw(); // Get the location of each multisample sample int sampleCount = 0; glGetIntegerv(GL_SAMPLES, &sampleCount); float positions[64]; // Enough for at least 32 samples for(int i =0; i < sampleCount; i++) { glGetMultisamplefv(GL_SAMPLE_POSITION, i, &positions[i*2]); } // Limit sample count to 8x //assert(sampleCount >= 8); sampleCount = 8; float invertedSampleDistances[8]; // The maxDist is used for doing the distance inversion // You could use the actual max dist a sample could be, but that // would mean that sample would receive a weighting of 0, use 1.0 instead. //float maxDist = sqrt(0.5*0.5*2); float maxDist = 1.0f; // calculate the distance of each sample from the center, // then invert it so that samples closer to the center recieve more weight for(int i=0; i<8; i++) { double xDist = positions[i*2 ]-0.5; double yDist = positions[i*2+1]-0.5; invertedSampleDistances[i] = maxDist - sqrt(xDist*xDist + yDist*yDist); } // zero out sample weights array for(int i=0; i<8; i++) { for(int j=0; j<8; j++) { sampleWeights[i][j] = 0.0f; } } // First array is easy, 1 sample so that samples weight is 1 sampleWeights[0][0] = 1.0f; // Add up the distances to get the total used for calculating weights for(int i=1; i<8; i++) { float totalWeight = 0.0f; for(int j=0; j<=i; j++) totalWeight += invertedSampleDistances[j]; // Invert to get the factor used for each sample, the sum of all sample weights is always 1.0 float perSampleFactor = 1 / totalWeight; for(int j=0; j<=i; j++) sampleWeights[i][j] = invertedSampleDistances[j] * perSampleFactor; } // Setup a texture buffer object for holding the sample weights glGenBuffers(1, &sampleWeightBuf); glBindBuffer(GL_TEXTURE_BUFFER_ARB, sampleWeightBuf); glBufferData(GL_TEXTURE_BUFFER_ARB, sizeof(float)*8, sampleWeights, GL_DYNAMIC_DRAW); glBindBuffer(GL_TEXTURE_BUFFER_ARB, 0); // Load the texBO into texture 1 glActiveTexture(GL_TEXTURE1); glGenTextures(1, &texBOTexture); glBindTexture(GL_TEXTURE_BUFFER_ARB, texBOTexture); glTexBufferARB(GL_TEXTURE_BUFFER_ARB, GL_R32F, sampleWeightBuf); glActiveTexture(GL_TEXTURE0); // Reset framebuffer binding glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); }
/////////////////////////////////////////////////////////////////////////////// // OpenGL related startup code is safe to put here. Load textures, etc. void SetupRC() { #ifndef ANGLE GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); } #endif // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); // Black glClearColor(0.0f, 0.0f, 0.0f, 1.0f); #if defined __APPLE__ || defined ANGLE ninja.LoadFromSBM("ninja.sbm", GLT_ATTRIBUTE_VERTEX, GLT_ATTRIBUTE_NORMAL, GLT_ATTRIBUTE_TEXTURE0); #else ninja.LoadFromSBM("../../../Src/Models/Ninja/ninja.sbm", GLT_ATTRIBUTE_VERTEX, GLT_ATTRIBUTE_NORMAL, GLT_ATTRIBUTE_TEXTURE0); #endif gltMakeTorus(torusBatch, 0.4f, 0.15f, 35, 35); gltMakeSphere(sphereBatch, 0.1f, 26, 13); GLfloat alpha = 0.25f; floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, -20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f); floorBatch.End(); glGenTextures(1, textures); glBindTexture(GL_TEXTURE_2D, textures[0]); LoadBMPTexture("marble.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); glGenTextures(1, ninjaTex); glBindTexture(GL_TEXTURE_2D, ninjaTex[0]); #if defined __APPLE__ LoadBMPTexture("NinjaComp.bmp", GL_LINEAR, GL_LINEAR, GL_CLAMP); #elif defined ANGLE LoadBMPTexture("NinjaComp.bmp", GL_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); #else LoadBMPTexture("../../../Src/Models/Ninja/NinjaComp.bmp", GL_LINEAR, GL_LINEAR, GL_CLAMP); #endif glGenFramebuffers(1,&fboName); // Create depth renderbuffer glGenRenderbuffers(1, &depthBufferName); glBindRenderbuffer(GL_RENDERBUFFER, depthBufferName); #ifndef ANGLE glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32, screenWidth, screenHeight); #else glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, screenWidth, screenHeight); #endif // Create 3 color renderbuffers glGenRenderbuffers(3, renderBufferNames); glBindRenderbuffer(GL_RENDERBUFFER, renderBufferNames[0]); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, screenWidth, screenHeight); glBindRenderbuffer(GL_RENDERBUFFER, renderBufferNames[1]); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, screenWidth, screenHeight); glBindRenderbuffer(GL_RENDERBUFFER, renderBufferNames[2]); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, screenWidth, screenHeight); // Attach all 4 renderbuffers to FBO glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboName); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBufferName); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderBufferNames[0]); #ifndef OPENGL_ES glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, renderBufferNames[1]); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_RENDERBUFFER, renderBufferNames[2]); #endif // See bind frag location in Chapter 9 processProg = gltLoadShaderPairWithAttributes("multibuffer.vs", "multibuffer_frag_location.fs", 3, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_NORMAL, "vNormal", GLT_ATTRIBUTE_TEXTURE0, "texCoord0"); #ifndef OPENGL_ES glBindFragDataLocation(processProg, 0, "oStraightColor"); glBindFragDataLocation(processProg, 1, "oGreyscale"); glBindFragDataLocation(processProg, 2, "oLumAdjColor"); #endif glLinkProgram(processProg); #ifndef OPENGL_ES // Create 3 new buffer objects glGenBuffers(3,texBO); glGenTextures(1, &texBOTexture); int count = 0; float* fileData = 0; // Load first texBO with a tangent-like curve, 1024 values fileData = LoadFloatData("LumTan.data", &count); if (count > 0) { glBindBuffer(GL_TEXTURE_BUFFER_ARB, texBO[0]); glBufferData(GL_TEXTURE_BUFFER_ARB, sizeof(float)*count, fileData, GL_STATIC_DRAW); delete fileData; } // Load second texBO with a sine-like curve, 1024 values fileData = LoadFloatData("LumSin.data", &count); if (count > 0) { glBindBuffer(GL_TEXTURE_BUFFER_ARB, texBO[1]); glBufferData(GL_TEXTURE_BUFFER_ARB, sizeof(float)*count, fileData, GL_STATIC_DRAW); delete fileData; } // Load third texBO with a linear curve, 1024 values fileData = LoadFloatData("LumLinear.data", &count); if (count > 0) { glBindBuffer(GL_TEXTURE_BUFFER_ARB, texBO[2]); glBufferData(GL_TEXTURE_BUFFER_ARB, sizeof(float)*count, fileData, GL_STATIC_DRAW); delete fileData; } // Load the Tan ramp first glBindBuffer(GL_TEXTURE_BUFFER_ARB, 0); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_BUFFER_ARB, texBOTexture); glTexBufferARB(GL_TEXTURE_BUFFER_ARB, GL_R32F, texBO[0]); #endif glActiveTexture(GL_TEXTURE0); // Reset framebuffer binding glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); // Make sure all went well gltCheckErrors(); }
/////////////////////////////////////////////////////////////////////////////// // OpenGL related startup code is safe to put here. Load textures, etc. void SetupRC() { GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); } // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); // Black glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gltMakeTorus(torusBatch, 0.4f, 0.15f, 35, 35); gltMakeSphere(sphereBatch, 0.1f, 26, 13); gltMakeCylinder(cylinderBatch,0.3f, 0.2f, 1.0, 10,10); GLfloat alpha = 0.25f; floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, -20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f); floorBatch.End(); mirrorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); mirrorBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); mirrorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); mirrorBatch.Normal3f( 0.0f, 1.0f, 0.0f); mirrorBatch.Vertex3f(-1.0f, 0.0f, 0.0f); mirrorBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); mirrorBatch.MultiTexCoord2f(0, 1.0f, 0.0f); mirrorBatch.Normal3f(0.0f, 1.0f, 0.0f); mirrorBatch.Vertex3f(1.0f, 0.0f, 0.0f); mirrorBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); mirrorBatch.MultiTexCoord2f(0, 1.0f, 1.0f); mirrorBatch.Normal3f(0.0f, 1.0f, 0.0f); mirrorBatch.Vertex3f(1.0f, 2.0f, 0.0f); mirrorBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); mirrorBatch.MultiTexCoord2f(0, 0.0f, 1.0f); mirrorBatch.Normal3f( 0.0f, 1.0f, 0.0f); mirrorBatch.Vertex3f(-1.0f, 2.0f, 0.0f); mirrorBatch.End(); mirrorBorderBatch.Begin(GL_TRIANGLE_STRIP, 13); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-1.0f, 0.1f, 0.01f); mirrorBorderBatch.Normal3f(0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-1.0f, 0.0f, 0.01f); mirrorBorderBatch.Normal3f(0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(1.0f, 0.1f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(1.0f, 0.0f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(0.9f, 0.0f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(1.0f, 2.0f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(0.9f, 2.0f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(1.0f, 1.9f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-1.0f, 2.f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-1.0f, 1.9f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-0.9f, 2.f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-1.0f, 0.0f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-0.9f, 0.0f, 0.01f); mirrorBorderBatch.End(); glGenTextures(1, textures); glBindTexture(GL_TEXTURE_2D, textures[0]); LoadBMPTexture("marble.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); // Create and bind an FBO glGenFramebuffers(1,&fboName); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboName); // Create depth renderbuffer glGenRenderbuffers(1, &depthBufferName); glBindRenderbuffer(GL_RENDERBUFFER, depthBufferName); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32, mirrorTexWidth, mirrorTexHeight); // Create the reflection texture glGenTextures(1, &mirrorTexture); glBindTexture(GL_TEXTURE_2D, mirrorTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, mirrorTexWidth, mirrorTexHeight, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Attach texture to first color attachment and the depth RBO glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mirrorTexture, 0); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBufferName); // Make sure all went well gltCheckErrors(); // Reset framebuffer binding glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); }
void generateCuboidBatch(GLBatch& batch, float length, float width, float height) { float halfLength = length / 2; float halfWidth = width / 2; float halfHeight = height / 2; M3DVector3f frontLeftBottom = {-halfLength, -halfHeight, halfWidth}; M3DVector3f frontLeftTop = {-halfLength, halfHeight, halfWidth}; M3DVector3f frontRightBottom = { halfLength, -halfHeight, halfWidth}; M3DVector3f frontRightTop = { halfLength, halfHeight, halfWidth}; M3DVector3f backLeftBottom = {-halfLength, -halfHeight, -halfWidth}; M3DVector3f backLeftTop = {-halfLength, halfHeight, -halfWidth}; M3DVector3f backRightBottom = { halfLength, -halfHeight, -halfWidth}; M3DVector3f backRightTop = { halfLength, halfHeight, -halfWidth}; batch.Begin(GL_QUADS, 24, 1); // bottom face batch.Normal3f(0, -1, 0); batch.MultiTexCoord2f(0, 0, 1); batch.Vertex3fv(frontLeftBottom); batch.Normal3f(0, -1, 0); batch.MultiTexCoord2f(0, 0, 0); batch.Vertex3fv(backLeftBottom); batch.Normal3f(0, -1, 0); batch.MultiTexCoord2f(0, 1, 0); batch.Vertex3fv(backRightBottom); batch.Normal3f(0, -1, 0); batch.MultiTexCoord2f(0, 1, 1); batch.Vertex3fv(frontRightBottom); // up face batch.Normal3f(0, 1, 0); batch.MultiTexCoord2f(0, 0, 1); batch.Vertex3fv(frontLeftTop); batch.Normal3f(0, 1, 0); batch.MultiTexCoord2f(0, 1, 1); batch.Vertex3fv(frontRightTop); batch.Normal3f(0, 1, 0); batch.MultiTexCoord2f(0, 1, 0); batch.Vertex3fv(backRightTop); batch.Normal3f(0, 1, 0); batch.MultiTexCoord2f(0, 0, 0); batch.Vertex3fv(backLeftTop); // front face batch.Normal3f(0, 0, 1); batch.MultiTexCoord2f(0, 0, 3); batch.Vertex3fv(frontLeftTop); batch.Normal3f(0, 0, 1); batch.MultiTexCoord2f(0, 0, 0); batch.Vertex3fv(frontLeftBottom); batch.Normal3f(0, 0, 1); batch.MultiTexCoord2f(0, 3, 0); batch.Vertex3fv(frontRightBottom); batch.Normal3f(0, 0, 1); batch.MultiTexCoord2f(0, 3, 3); batch.Vertex3fv(frontRightTop); // back face batch.Normal3f(0, 0, -1); batch.MultiTexCoord2f(0, 0, 1); batch.Vertex3fv(backLeftTop); batch.Normal3f(0, 0, -1); batch.MultiTexCoord2f(0, 1, 1); batch.Vertex3fv(backRightTop); batch.Normal3f(0, 0, -1); batch.MultiTexCoord2f(0, 1, 0); batch.Vertex3fv(backRightBottom); batch.Normal3f(0, 0, -1); batch.MultiTexCoord2f(0, 0, 0); batch.Vertex3fv(backLeftBottom); // left face batch.Normal3f(-1, 0, 0); batch.MultiTexCoord2f(0, 0, 3); batch.Vertex3fv(backLeftTop); batch.Normal3f(-1, 0, 0); batch.MultiTexCoord2f(0, 0, 0); batch.Vertex3fv(backLeftBottom); batch.Normal3f(-1, 0, 0); batch.MultiTexCoord2f(0, 3, 0); batch.Vertex3fv(frontLeftBottom); batch.Normal3f(-1, 0, 0); batch.MultiTexCoord2f(0, 3, 3); batch.Vertex3fv(frontLeftTop); // right face batch.Normal3f(1, 0, 0); batch.MultiTexCoord2f(0, 0, 1); batch.Vertex3fv(backRightTop); batch.Normal3f(1, 0, 0); batch.MultiTexCoord2f(0, 1, 1); batch.Vertex3fv(frontRightTop); batch.Normal3f(1, 0, 0); batch.MultiTexCoord2f(0, 1, 0); batch.Vertex3fv(frontRightBottom); batch.Normal3f(1, 0, 0); batch.MultiTexCoord2f(0, 0, 0); batch.Vertex3fv(backRightBottom); batch.End(); }