scene::scene(string filename){ cout << "Reading scene from " << filename << " ..." << endl; cout << " " << endl; char* fname = (char*)filename.c_str(); fp_in.open(fname); if(fp_in.is_open()){ while(fp_in.good()){ string line; utilityCore::safeGetline(fp_in,line); if(!line.empty()){ vector<string> tokens = utilityCore::tokenizeString(line); if(strcmp(tokens[0].c_str(), "MATERIAL")==0){ loadMaterial(tokens[1]); cout << " " << endl; }else if(strcmp(tokens[0].c_str(), "OBJECT")==0){ loadObject(tokens[1]); cout << " " << endl; }else if(strcmp(tokens[0].c_str(), "LIGHT")==0){ loadLight(tokens[1]); cout << " " << endl; }else if(strcmp(tokens[0].c_str(), "VOLUME")==0){ loadVolume(tokens[1]); cout << " " << endl; }else if(strcmp(tokens[0].c_str(), "CAMERA")==0){ loadCamera(); cout << " " << endl; } } } } }
Scene *SceneParser::loadScene(KeyValues *data) { Scene *scene = new Scene(); KeyValues *key = data->firstSubKey(); while(key) { const char *name = key->name(); if(strcmp(name, "object") == 0) { Object *object = loadObject(key); if(object) { scene->addObject(object); } else { fprintf(stderr, "Failed to load Object\n"); } } else if(strcmp(name, "light") == 0) { Light *light = loadLight(key); if(light) { scene->addLight(light); } else { fprintf(stderr, "Failed to load Light\n"); } } else { fprintf(stderr, "Unknown element: %s\n", name); } key = key->nextKey(); } return scene; }
bool SceneLoader::loadIllumination() { int doublesided, local; if((illuminationElement->QueryIntAttribute("doublesided", &doublesided)) == TIXML_SUCCESS && (illuminationElement->QueryIntAttribute("local", &local) == TIXML_SUCCESS)) { if(doublesided==1) illumination.doublesided=true; else if(doublesided==0) illumination.doublesided=false; else { cout<<"erro: doublesided deve ter valor boleano!\n"; system("pause"); return false; } if(local==1) illumination.local=true; else if(local==0) illumination.local=false; else { cout<<"erro: local deve ter valor boleano!\n"; system("pause"); return false; } cout<<"Illumination:\n\tDoubleSided: "<<illumination.doublesided<<", Local: "<<illumination.local<<endl; } else { cout<<"Erro parsing illumination\n"; system("pause"); return false; } ambientElement = illuminationElement->FirstChildElement("ambient"); if(ambientElement!=NULL) { if(ambientElement->QueryFloatAttribute("r", &illumination.ambient[0]) == TIXML_SUCCESS && ambientElement->QueryFloatAttribute("g", &illumination.ambient[1]) == TIXML_SUCCESS && ambientElement->QueryFloatAttribute("b", &illumination.ambient[2]) == TIXML_SUCCESS && ambientElement->QueryFloatAttribute("a", &illumination.ambient[3]) == TIXML_SUCCESS) cout<<"\tAmbient R, G, B, A: "<<illumination.ambient[0]<<", "<<illumination.ambient[1]<<", "<<illumination.ambient[2]<<", "<<illumination.ambient[3]<<endl; else { cout<<"Erro parsing ambiente de illumination\n"; system("pause"); return false; } } else { cout<<"problema com ambient de illumination\n"; system("pause"); return false; } backgroundElement = illuminationElement->FirstChildElement("background"); if(backgroundElement!=NULL) { if(backgroundElement->QueryFloatAttribute("r", &illumination.backgroud[0]) == TIXML_SUCCESS && backgroundElement->QueryFloatAttribute("g", &illumination.backgroud[1]) == TIXML_SUCCESS && backgroundElement->QueryFloatAttribute("b", &illumination.backgroud[2]) == TIXML_SUCCESS && backgroundElement->QueryFloatAttribute("a", &illumination.backgroud[3]) == TIXML_SUCCESS) cout<<"\tBackground R, G, B, A: "<<illumination.backgroud[0]<<", "<<illumination.backgroud[1] <<", "<<illumination.backgroud[2]<<", "<<illumination.backgroud[3]<<endl; else { cout<<"Erro parsing background de illumination\n"; system("pause"); return false; } } else { cout<<"Erro parsing background de illumination\n"; system("pause"); return false; } TiXmlElement *luzes=illuminationElement->FirstChildElement("lights"); lightsElement=luzes->FirstChildElement("light"); int nLights = 0; while(lightsElement!=NULL) { if(nLights == global.maxlights) { cout<<"Ja chegou limite de maxLights\n"; system("pause"); return false; } else if(strcmp(lightsElement->Value(), "light") == 0) loadLight(); else { cout<<"Erro parsing light de lights de illumination\n"; system("pause"); return false; } lightsElement = lightsElement->NextSiblingElement(); nLights++; } cout<<endl; return true; }
void WorldState::loadLights() { for (unsigned int i = 0; i < lights.size(); i++) loadLight(i); }
/** * http://cse.csusb.edu/tongyu/courses/cs420/notes/lighting.php * Sombreado por medio de la técnica Gouraud Shading. */ int main(int argc, char* argv[]) { // Crear una ventana de 750x750 pixels. int cw = 750; int ch = 750; cg_init(cw, ch, NULL); // Actualizar la pantalla: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glViewport(0,0,cw, ch); glFrustum(-1,1,-1,1,1,1000); //Habilito la iluminación del pipeline estático de OpenGL. glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); // GL_LIGHT0 Vec4 *vec4La0 = vec4Contructor(0.10f, 0.10f, 0.10f, 1.0f); Vec4 *vec4Ld0 = vec4Contructor(1.0f, 1.0f, 1.0f, 1.0f); Vec4 *vec4Ls0 = vec4Contructor(1.0f, 1.0f, 1.0f, 1.0f); Vec4 *vec4Lp0 = vec4Contructor(1.0f, 1.0f, 1.0f, 0.0f); loadLight(GL_LIGHT0, vec4La0, vec4Ld0, vec4Lp0, vec4Ls0); // GL_LIGHT1 Vec4 *vec4La1 = vec4Contructor(0.5f,0.5f,0.5f,1.0f); Vec4 *vec4Ld1 = vec4Contructor(0.5f, 0.3f, 0.2f, 1.0f); Vec4 *vec4Ls1 = vec4Contructor(1.0f,1.0f,1.0f,1.0f); Vec4 *vec4Lp1 = vec4Contructor(1.0f, 1.0f, 1.0f, 0.0f); loadLight(GL_LIGHT1, vec4La1, vec4Ld1, vec4Lp1, vec4Ls1); // GLfloat spot_direction[] = { -1.0, -1.0, 0.0 }; // glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.5); // glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.5); // glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.2); // glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 45.0); // glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction); // glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0); // GL_LIGHT2 Vec4 *vec4La2 = vec4Contructor( 0.2f, 0.2f, 0.2f, 1.0f); Vec4 *vec4Ld2 = vec4Contructor(0.8f, 0.8f, 0.8, 1.0f ); Vec4 *vec4Lp2 = vec4Contructor(-1.5f, 1.0f, -4.0f, 1.0f ); Vec4 *vec4Ls2 = vec4Contructor(0.5f, 0.5f, 0.5f, 1.0f ); loadLight(GL_LIGHT2, vec4La2, vec4Ld2, vec4Lp2, vec4Ls2); // TODO, GL_LIGHT3, GL_LIGHT4, GL_LIGHT5, GL_LIGHT6, GL_LIGHT7 Obj* obj = obj_load("../Models/knight.obj"); float ang = 0.0f; float pitch = 0.0f; float ang_vel = 1.0f; char done = 0; char wireframe = 0; char gourandShading = 0; char bfc = 0; char zbuff = 1; char enableLight0 = 0; char enableLight1 = 0; char enableLight2 = 0; char enableLight3 = 0; char enableLight4 = 0; char enableLight5 = 0; char enableLight6 = 0; char enableLight7 = 0; unsigned char key_pressed[1024]; memset(key_pressed, 0, 1024); while (!done) { SDL_Event event; while(SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: key_pressed[event.key.keysym.sym] = 1; if (event.key.keysym.sym == SDLK_z) { zbuff = !zbuff; if(zbuff) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); break; } else if (event.key.keysym.sym == SDLK_b) { bfc = !bfc; if(bfc) { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CW); } else glDisable(GL_CULL_FACE); break; } else if (event.key.keysym.sym == SDLK_m) { wireframe = !wireframe; if(wireframe) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); break; } else if (event.key.keysym.sym == SDLK_g) { gourandShading = !gourandShading; if(gourandShading) glShadeModel(GL_FLAT); else glShadeModel(GL_SMOOTH); break; } else if (event.key.keysym.sym == SDLK_0) { enableLight0 = !enableLight0; if(enableLight0) glEnable(GL_LIGHT0); else glDisable(GL_LIGHT0); break; } else if (event.key.keysym.sym == SDLK_1) { enableLight1 = !enableLight1; if(enableLight1) glEnable(GL_LIGHT1); else glDisable(GL_LIGHT1); break; } else if (event.key.keysym.sym == SDLK_2) { enableLight2 = !enableLight2; if(enableLight2) glEnable(GL_LIGHT2); else glDisable(GL_LIGHT2); break; } else if (event.key.keysym.sym == SDLK_3) { enableLight3 = !enableLight3; if(enableLight3) glEnable(GL_LIGHT3); else glDisable(GL_LIGHT3); break; } else if (event.key.keysym.sym == SDLK_4) { enableLight4 = !enableLight4; if(enableLight4) glEnable(GL_LIGHT4); else glDisable(GL_LIGHT4); break; } else if (event.key.keysym.sym == SDLK_5) { enableLight5 = !enableLight5; if(enableLight5) glEnable(GL_LIGHT5); else glDisable(GL_LIGHT5); break; } else if (event.key.keysym.sym == SDLK_6) { enableLight6 = !enableLight6; if(enableLight6) glEnable(GL_LIGHT6); else glDisable(GL_LIGHT6); break; } else if (event.key.keysym.sym == SDLK_7) { enableLight7 = !enableLight7; if(enableLight7) glEnable(GL_LIGHT7); else glDisable(GL_LIGHT7); break; } else if (event.key.keysym.sym != SDLK_ESCAPE) break; case SDL_QUIT : done = 1; break; case SDL_KEYUP: key_pressed[event.key.keysym.sym] = 0; } } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -50.0f); glRotatef(pitch, 1.0f, 0.0f, 0.0f); glRotatef(ang, 0.0f, 1.0f, 0.0f); glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); if(key_pressed[SDLK_RIGHT]) ang += ang_vel; if(key_pressed[SDLK_LEFT]) ang -= ang_vel; if(key_pressed[SDLK_UP]) pitch += ang_vel; if(key_pressed[SDLK_DOWN]) pitch -= ang_vel; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); obj_render(obj); cg_repaint(); } // Liberar recursos: obj_free(obj); cg_close(); return 0; }