//Set up variables bool DemoInit() { //Seed random number generator srand( (unsigned)time( NULL ) ); //Initialise the array of vertices numVertices=gridDensity*gridDensity; vertices=new SIMPLE_VERTEX[numVertices]; if(!vertices) { LOG::Instance()->OutputError("Unable to allocate space for %d vertices", numVertices); return false; } for(int i=0; i<gridDensity; ++i) { for(int j=0; j<gridDensity; ++j) { vertices[i*gridDensity+j].position.Set( (float(i)/(gridDensity-1))*2-1, 0.0f, (float(j)/(gridDensity-1))*2-1); vertices[i*gridDensity+j].normal.Set( 0.0f, 1.0f, 0.0f); vertices[i*gridDensity+j].texCoords.Set( (float(i)/(gridDensity-1)), -(float(j)/(gridDensity-1))); } } //Initialise the indices numIndices=2*(gridDensity)*(gridDensity-1); indices=new GLuint[numIndices]; if(!indices) { LOG::Instance()->OutputError("Unable to allocate space for %d indices", numIndices); return false; } for(int i=0; i<gridDensity-1; ++i) { for(int j=0; j<gridDensity; ++j) { indices[(i*gridDensity+j)*2 ]=(i+1)*gridDensity+j; indices[(i*gridDensity+j)*2+1]=i*gridDensity+j; } } //Load texture IMAGE floorImage; floorImage.Load("OpenGL.tga"); if(floorImage.paletted) floorImage.ExpandPalette(); glGenTextures(1, &floorTexture); glBindTexture(GL_TEXTURE_2D, floorTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_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); gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGBA8, floorImage.width, floorImage.height, floorImage.format, GL_UNSIGNED_BYTE, floorImage.data); //Initialise the lights for(int i=0; i<numLights; ++i) { lights[i].position.Set( (float(rand())/RAND_MAX)*2-1, 0.02f, (float(rand())/RAND_MAX)*2-1); lights[i].velocity.Set( (float(rand())/RAND_MAX)*2-1, 0.0f, (float(rand())/RAND_MAX)*2-1); lights[i].color.Set( (float(rand())/RAND_MAX)*0.75f, (float(rand())/RAND_MAX)*0.75f, (float(rand())/RAND_MAX)*0.75f, 1.0f); } //Load vertex programs if(GLEE_NV_vertex_program) { glGenProgramsNV(1, &vp1); glBindProgramNV(GL_VERTEX_PROGRAM_NV, vp1); LoadARB_program(GL_VERTEX_PROGRAM_NV, "vp1.txt"); } if(GLEE_NV_vertex_program2) { glGenProgramsNV(1, &vp2); glBindProgramNV(GL_VERTEX_PROGRAM_NV, vp2); LoadARB_program(GL_VERTEX_PROGRAM_NV, "vp2.txt"); } if(GLEE_NV_vertex_program || GLEE_NV_vertex_program2) { //Track modelview-projection matrix glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV); } //reset timer timer.Reset(); return true; }
//Called for initiation void Init(void) { //Check for and set up extensions // if( !SetUpARB_multitexture() || !SetUpARB_texture_cube_map() || // !SetUpARB_texture_env_combine() || !SetUpARB_texture_env_dot3()) // { // printf("Required Extension Unsupported\n"); // exit(0); // } //Load identity modelview glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //Shading states glShadeModel(GL_SMOOTH); glClearColor(0.2f, 0.4f, 0.2f, 0.0f); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //Depth states glClearDepth(1.0f); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); //Load normal map IMAGE normalMapImage; std::stringstream fn; fn << texture_path; fn << "NormalMap.bmp"; normalMapImage.Load(fn.str().c_str()); // normalMapImage.Load("NormalMap.bmp"); normalMapImage.ExpandPalette(); //Convert normal map to texture glGenTextures(1, &normalMap); glBindTexture(GL_TEXTURE_2D, normalMap); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, normalMapImage.width, normalMapImage.height, 0, normalMapImage.format, GL_UNSIGNED_BYTE, normalMapImage.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //Load decal image IMAGE decalImage; std::stringstream fn_decal; fn_decal << texture_path; fn_decal << "Decal.bmp"; decalImage.Load(fn_decal.str().c_str()); // decalImage.Load("Decal.bmp"); decalImage.ExpandPalette(); //Convert decal image to texture glGenTextures(1, &decalTexture); glBindTexture(GL_TEXTURE_2D, decalTexture); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, decalImage.width, decalImage.height, 0, decalImage.format, GL_UNSIGNED_BYTE, decalImage.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //Create normalisation cube map glGenTextures(1, &normalisationCubeMap); glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, normalisationCubeMap); GenerateNormalisationCubeMap(); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); }