void CGunTurret::DrawDebug() { IPersistantDebug *pDebug = gEnv->pGame->GetIGameFramework()->GetIPersistantDebug(); pDebug->Begin("CGunTurret::DrawDebug", true); Vec3 gun(ZERO),rocket(ZERO),radar(ZERO),barrel(ZERO); gun = GetSlotHelperPos(eIGS_ThirdPerson,m_fireHelper,true); rocket = GetSlotHelperPos(eIGS_ThirdPerson,m_rocketHelper,true); barrel = GetSlotHelperPos(eIGS_ThirdPerson,m_barrelHelper,true); radar = GetSlotHelperPos(eIGS_Aux0,m_radarHelper,true); pDebug->AddSphere(gun, 0.2f, ColorF(1,0,0,1), 1.f); pDebug->AddSphere(rocket, 0.2f, ColorF(0,1,0,1), 1.f); pDebug->AddSphere(radar, 0.2f, ColorF(0,0,1,1), 1.f); pDebug->AddSphere(barrel, 0.2f, ColorF(1,0,1,1), 1.f); }
/* * OpenGL (GLUT) calls this routine to display the scene */ void display() { const double len=1.5; // Length of axes // Erase the window and the depth buffer glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Enable Z-buffering in OpenGL glEnable(GL_DEPTH_TEST); // Undo previous transformations glLoadIdentity(); // Orthogonal - set world orientation if(mode == 0) { glRotatef(ph,1,0,0); glRotatef(th,0,1,0); } // Perspective - set eye position else if (mode == 1) { double Ex = -2*dim*Sin(th)*Cos(ph); double Ey = +2*dim *Sin(ph); double Ez = +2*dim*Cos(th)*Cos(ph); gluLookAt(Ex,Ey,Ez , 0,0,0 , 0,Cos(ph),0); } // First person view else{ // Recalculate where the camera is looking AX = -2*dim*Sin(th)*Cos(ph); AY = -2*dim*Sin(ph); AZ = -2*dim*Cos(th)*Cos(ph); // Orient the scene so it imitates first person movement gluLookAt(EX, EY, EZ, AX + EX, AY + EY, AZ + EZ, UX, UY, UZ); } // Flat or smooth shading // glShadeModel(smooth ? GL_SMOOTH : GL_FLAT); // Light switch if (light) { // Translate intensity to color vectors float Ambient[] = {0.3,0.3,0.3,1.0}; float Diffuse[] = {1,1,1,1}; float Specular[] = {1,1,0,1}; float white[] = {1,1,1,1}; // Light direction float Position[] = {5*Cos(idle),0,5*Sin(idle),1}; // printf("%f | %f | %f\n" , Position[0] , Position[1] , Position[2] ); // Draw light position as ball (still no lighting here) ball(Position[0],Position[1],Position[2] , 0.1); // Enable lighting with normalization glEnable(GL_NORMALIZE); // Enable lighting glEnable(GL_LIGHTING); // Location of viewer for specular calculations glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,local); // glColor sets ambient and diffuse color materials glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); // Enable light 0 glEnable(GL_LIGHT0); // Set ambient, diffuse, specular components and position of light 0 glLightfv(GL_LIGHT0,GL_AMBIENT ,Ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE ,Diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,Specular); glLightfv(GL_LIGHT0,GL_POSITION,Position); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,32.0f); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,white); } // Draw Barells barrel(0,0,0, 0.5,0.5,0.5 , 0); barrel(Cos(idle),Sin(idle), 0 ,.3,.3,.3 , Cos(3*idle)); barrel(0,2*Cos(idle),2*Sin(idle) ,.3,.3,.3 , Sin(2*idle)); barrel(3*Sin(idle), 0, 3*Cos(idle),.3,.3,.3 , 0); // disbale lighting from here on glDisable(GL_LIGHTING); // Draw axes glColor3f(1,1,1); if (axes) { glBegin(GL_LINES); glVertex3d(0.0,0.0,0.0); glVertex3d(len,0.0,0.0); glVertex3d(0.0,0.0,0.0); glVertex3d(0.0,len,0.0); glVertex3d(0.0,0.0,0.0); glVertex3d(0.0,0.0,len); glEnd(); // Label axes glRasterPos3d(len,0.0,0.0); Print("X"); glRasterPos3d(0.0,len,0.0); Print("Y"); glRasterPos3d(0.0,0.0,len); Print("Z"); } // Display parameters glWindowPos2i(10,10); Print("Angle=%d,%d Dim=%.1f FOV=%d Projection=%d",th,ph,dim,fov,mode); glFlush(); glutSwapBuffers(); }
GLvoid InitGL(){ //All the stuff we need to draw std::string hero_geo_file = "geo/tank.obj"; std::string target_geo_file = "geo/target.obj"; std::string swivel_geo_file = "geo/turret.obj"; std::string barrel_geo_file = "geo/barrel.obj"; std::string environment_geo_file = "geo/cube.obj"; std::string enemy_geo_file = "geo/enemy.obj"; std::string tile_geo_file = "geo/tile.obj"; std::string tree_geo_file = "geo/tree.obj"; std::string rock_geo_file = "geo/rocks.obj"; std::string hero_tex_file = "tex/tank.ppm"; std::string target_tex_file = "tex/target.ppm"; std::string swivel_tex_file = "tex/turret.ppm"; std::string barrel_tex_file = "tex/barrel.ppm"; std::string environment_tex_file = "tex/cubemape.ppm"; std::string enemy_tex_file = "tex/enemy.ppm"; std::string tile_tex_file = "tex/naked_tile_baked.ppm"; std::string tree_tex_file = "tex/tree.ppm"; std::string rock_tex_file = "tex/rocks.ppm"; std::string tree_tile_tex = "tex/tree_tile.ppm"; std::string rock_tile_tex = "tex/rocky_tile.ppm"; std::string blob_tile_tex = "tex/blob_shadow.ppm"; mesh hero(hero_geo_file); mesh target(target_geo_file); mesh swivel(swivel_geo_file); mesh barrel(barrel_geo_file); mesh environment(environment_geo_file); mesh enemy(enemy_geo_file); mesh tile(tile_geo_file); mesh tree(tree_geo_file); mesh rock(rock_geo_file); HERO_ID = meshes.size(); meshes.push_back(hero); TARGET_ID = meshes.size(); meshes.push_back(target); SWIVEL_ID = meshes.size(); meshes.push_back(swivel); BARREL_ID = meshes.size(); meshes.push_back(barrel); ENVIRONMENT_ID = meshes.size(); meshes.push_back(environment); ENEMY_ID = meshes.size(); meshes.push_back(enemy); TILE_ID = meshes.size(); meshes.push_back(tile); TREE_ID = meshes.size(); meshes.push_back(tree); ROCK_ID = meshes.size(); meshes.push_back(rock); glEnable(GL_TEXTURE_2D); glGenTextures(1, &HERO_TEX); glGenTextures(1, &TARGET_TEX); glGenTextures(1, &SWIVEL_TEX); glGenTextures(1, &BARREL_TEX); glGenTextures(1, &ENVIRONMENT_TEX); glGenTextures(1, &ENEMY_TEX); glGenTextures(1, &TILE_TEX); glGenTextures(1, &TREE_TEX); glGenTextures(1, &ROCK_TEX); glGenTextures(1, &TREETILE_TEX); glGenTextures(1, &ROCKTILE_TEX); glGenTextures(1, &BLOBTILE_TEX); loadPPM(hero_tex_file.c_str(), HERO_TEX); loadPPM(target_tex_file.c_str(), TARGET_TEX); loadPPM(swivel_tex_file.c_str(), SWIVEL_TEX); loadPPM(barrel_tex_file.c_str(), BARREL_TEX); loadPPM(environment_tex_file.c_str(), ENVIRONMENT_TEX); loadPPM(enemy_tex_file.c_str(), ENEMY_TEX); loadPPM(tile_tex_file.c_str(), TILE_TEX); loadPPM(tree_tex_file.c_str(), TREE_TEX); loadPPM(rock_tex_file.c_str(), ROCK_TEX); loadPPM(tree_tile_tex.c_str(), TREETILE_TEX); loadPPM(rock_tile_tex.c_str(), ROCKTILE_TEX); loadPPM(blob_tile_tex.c_str(), BLOBTILE_TEX, true); camera = new game_object(-1,-1,-1); game_object *hero_character = new game_object(characters.size(), HERO_ID, HERO_TEX); characters.push_back(hero_character); game_object *target_character = new game_object(characters.size(), TARGET_ID, TARGET_TEX); target_character->transform.translate(0.0,0.0,-7.0); characters.push_back(target_character); game_object *swivel_character = new game_object(characters.size(), SWIVEL_ID, SWIVEL_TEX); swivel_character->transform.translate(0.0,0.4,0.0); characters.push_back(swivel_character); game_object *barrel_character = new game_object(characters.size(), BARREL_ID, BARREL_TEX); barrel_character->transform.translate(0.0,0.0,-0.15); barrel_character->parent_to(characters[SWIVEL_ID]); characters.push_back(barrel_character); game_object *environment_character = new game_object(characters.size(), ENVIRONMENT_ID, ENVIRONMENT_TEX); environment_character->transform.scale(TILES_DIMENSION,TILES_DIMENSION,TILES_DIMENSION); environment_character->parent_to(camera); characters.push_back(environment_character); // game_object *enemy_character = new game_object(characters.size(), ENEMY_ID, ENEMY_TEX); // enemy_character->transform.translate(0.0, 0.0, -7.0); // enemy_character->parent_to(camera); // characters.push_back(enemy_character); // bad_guys.push_back(ENEMY_ID); srand(time(NULL)); int spread = TILES_DIMENSION; for(int i=1; i<BAD_GUY_COUNT; i++) { game_object *enemyX = new game_object(characters.size(), ENEMY_ID, ENEMY_TEX); enemyX->transform.translate(rand()%spread-spread/2, 0.0, rand()%spread-spread/2); enemyX->transform.rotateY(rand()%180); enemyX->parent_to(camera); bad_guys.push_back(characters.size()); colliders.push_back(characters.size()); characters.push_back(enemyX); } double tile_width = meshes[TILE_ID].xmax - meshes[TILE_ID].xmin; double tile_length = meshes[TILE_ID].zmax - meshes[TILE_ID].zmin; for(int i=0; i<TILES_DIMENSION; i++) { int xmult = i - TILES_DIMENSION/2; for(int j=0; j<TILES_DIMENSION; j++) { int zmult = j - TILES_DIMENSION/2; double rot = rand() % 4 * 90.0; // std::cout << rot << std::endl; game_object *tileX = new game_object(characters.size(), TILE_ID, TILE_TEX); tileX->transform.rotateY(rot); tileX->transform.translate(tile_width*xmult, 0.0, tile_length*zmult); tileX->parent_to(camera); characters.push_back(tileX); int tile_type = rand() % 100; if(tile_type >= 96 && tile_type < 98) { tileX->tex = TREETILE_TEX; game_object *treeX = new game_object(characters.size(), TREE_ID, TREE_TEX); treeX->transform = tileX->transform; treeX->parent_to(camera); bad_guys.push_back(characters.size()); colliders.push_back(characters.size()); characters.push_back(treeX); } else if(tile_type >= 98) { tileX->tex = ROCKTILE_TEX; game_object *rockX = new game_object(characters.size(), ROCK_ID, ROCK_TEX); rockX->transform = tileX->transform; rockX->parent_to(camera); bad_guys.push_back(characters.size()); colliders.push_back(characters.size()); characters.push_back(rockX); } } } game_object *blob_character = new game_object(characters.size(), TILE_ID, BLOBTILE_TEX); blob_character->transform.translate(0.0,0.001,0.0); blob_character->transform.scale(2.0, 1.0, 3.0); characters.push_back(blob_character); last_update = (double)clock() / ((double)CLOCKS_PER_SEC); //GL boilerplate initialization glShadeModel(GL_SMOOTH); // Enable Smooth Shading glClearColor(0.5f, 0.5f, 0.5f, 0.5f); // grey Background glClearDepth(1.0f); // Depth Buffer Setup glEnable(GL_DEPTH_TEST); // Enables Depth Testing glEnable(GL_CULL_FACE); glShadeModel(GL_SMOOTH); glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do glEnable(GL_COLOR_MATERIAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }