bool CarGraphics::LoadCameras( const PTree & cfg, const float cambounce, std::ostream & error_output) { const PTree * cfg_cams; if (!cfg.get("camera", cfg_cams)) { return false; } if (!cfg_cams->size()) { error_output << "No cameras defined." << std::endl; return false; } cameras.reserve(cfg_cams->size()); for (PTree::const_iterator i = cfg_cams->begin(); i != cfg_cams->end(); ++i) { Camera * cam = LoadCamera(i->second, cambounce, error_output); if (!cam) { ClearCameras(); return false; } cameras.push_back(cam); } return true; }
void XMLReader::LoadSceneFromFile(QFile &file, const QStringRef &local_path, Scene &scene, Integrator &integrator) { if(file.open(QIODevice::ReadOnly)) { QXmlStreamReader xml_reader; xml_reader.setDevice(&file); QMap<QString, QList<Geometry*>> material_to_geometry_map; while(!xml_reader.isEndDocument()) { xml_reader.readNext(); if(xml_reader.isStartElement()) { //Get the tag name QString tag(xml_reader.name().toString()); if(QString::compare(tag, QString("camera")) == 0) { scene.SetCamera(LoadCamera(xml_reader)); } else if(QString::compare(tag, QString("geometry")) == 0) { Geometry* geometry = LoadGeometry(xml_reader, material_to_geometry_map, local_path); if(geometry == NULL) { return; } scene.objects.append(geometry); } else if(QString::compare(tag, QString("material")) == 0) { Material* material = LoadMaterial(xml_reader, local_path); if(material == NULL) { return; } scene.materials.append(material); } else if(QString::compare(tag, QString("integrator")) == 0) { integrator = LoadIntegrator(xml_reader); } else if(QString::compare(tag, QString("pixelSampler"), Qt::CaseInsensitive) == 0) { PixelSampler* sampler = LoadPixelSampler(xml_reader); if(sampler == NULL) { std::cout << "Did not properly load a pixel sampler!" << std::endl; return; } if(scene.pixel_sampler != NULL) { delete scene.pixel_sampler; } scene.pixel_sampler = sampler; } } } //Associate the materials in the XML file with the geometries that use those materials. for(int i = 0; i < scene.materials.size(); i++) { QList<Geometry*> l = material_to_geometry_map.value(scene.materials[i]->name); for(int j = 0; j < l.size(); j++) { l[j]->SetMaterial(scene.materials[i]); } } //Copy emissive geometry from the list of objects to the list of lights QList<Geometry*> to_lights; for(Geometry *g : scene.objects) { g->create(); if(g->material->emissive) { to_lights.append(g); } } for(Geometry *g : to_lights) { scene.lights.append(g); } file.close(); } }
bool CAR::LoadGraphics( const PTree & cfg, const std::string & partspath, const std::string & carpath, const std::string & carname, const std::string & carpaint, const MATHVECTOR <float, 3> & carcolor, const int anisotropy, const float camerabounce, const bool damage, const bool debugmode, ContentManager & content, std::ostream & info_output, std::ostream & error_output) { //write_inf(cfg, std::cerr); cartype = carname; LoadDrawable loadDrawable(carpath, anisotropy, content, models, error_output); // load body first const PTree * cfg_body; std::string meshname; std::vector<std::string> texname; if (!cfg.get("body", cfg_body, error_output)) { error_output << "there is a problem with the .car file" << std::endl; return false; } if (!cfg_body->get("mesh", meshname, error_output)) return false; if (!cfg_body->get("texture", texname, error_output)) return false; if (carpaint != "default") texname[0] = carpaint; if (!loadDrawable(meshname, texname, *cfg_body, topnode, &bodynode)) return false; // load wheels const PTree * cfg_wheel; if (!cfg.get("wheel", cfg_wheel, error_output)) return false; for (PTree::const_iterator i = cfg_wheel->begin(); i != cfg_wheel->end(); ++i) { if (!LoadWheel(i->second, loadDrawable, topnode, error_output)) { error_output << "Failed to load wheels." << std::endl; return false; } } // load drawables LoadBody loadBody(topnode, bodynode, loadDrawable); for (PTree::const_iterator i = cfg.begin(); i != cfg.end(); ++i) { if (i->first != "body" && i->first != "steering" && i->first != "light-brake" && i->first != "light-reverse") { loadBody(i->second); } } // load steering wheel const PTree * cfg_steer; if (cfg.get("steering", cfg_steer)) { SCENENODE & bodynoderef = topnode.GetNode(bodynode); if (!loadDrawable(*cfg_steer, bodynoderef, &steernode, 0)) { error_output << "Failed to load steering wheel." << std::endl; return false; } cfg_steer->get("max-angle", steer_angle_max); steer_angle_max = steer_angle_max / 180.0 * M_PI; SCENENODE & steernoderef = bodynoderef.GetNode(steernode); steer_orientation = steernoderef.GetTransform().GetRotation(); } // load brake/reverse light point light sources (optional) int i = 0; std::string istr = "0"; const PTree * cfg_light; while (cfg.get("light-brake-"+istr, cfg_light)) { if (!LoadLight(*cfg_light, content, error_output)) { error_output << "Failed to load lights." << std::endl; return false; } std::stringstream sstr; sstr << ++i; istr = sstr.str(); } i = 0; istr = "0"; while (cfg.get("light-reverse-"+istr, cfg_light)) { if (!LoadLight(*cfg_light, content, error_output)) { error_output << "Failed to load lights." << std::endl; return false; } std::stringstream sstr; sstr << ++i; istr = sstr.str(); } // load car brake/reverse graphics (optional) if (cfg.get("light-brake", cfg_light)) { SCENENODE & bodynoderef = topnode.GetNode(bodynode); if (!loadDrawable(*cfg_light, bodynoderef, 0, &brakelights)) { error_output << "Failed to load lights." << std::endl; return false; } } if (cfg.get("light-reverse", cfg_light)) { SCENENODE & bodynoderef = topnode.GetNode(bodynode); if (!loadDrawable(*cfg_light, bodynoderef, 0, &reverselights)) { error_output << "Failed to load lights." << std::endl; return false; } } const PTree * cfg_cams; if (!cfg.get("camera", cfg_cams)) { return false; } if (!cfg_cams->size()) { error_output << "No cameras defined." << std::endl; return false; } cameras.reserve(cfg_cams->size()); for (PTree::const_iterator i = cfg_cams->begin(); i != cfg_cams->end(); ++i) { CAMERA * cam = LoadCamera(i->second, camerabounce, error_output); if (!cam) return false; cameras.push_back(cam); } SetColor(carcolor[0], carcolor[1], carcolor[2]); return true; }
void GLUTRedraw(void) { // Initialize OpenGL drawing modes glEnable(GL_LIGHTING); glDisable(GL_BLEND); glBlendFunc(GL_ONE, GL_ZERO); glDepthMask(true); // Clear window R3Rgb background = scene->background; glClearColor(background[0], background[1], background[2], background[3]); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Load camera LoadCamera(&camera); // Load scene lights LoadLights(scene); // Draw scene camera DrawCamera(scene); // Draw scene lights DrawLights(scene); // Draw particles DrawParticles(scene); // Draw particle sources DrawParticleSources(scene); // Draw particle sinks DrawParticleSinks(scene); // Draw particle springs DrawParticleSprings(scene); // Draw scene surfaces if (show_faces) { glEnable(GL_LIGHTING); DrawScene(scene); } // Draw scene edges if (show_edges) { glDisable(GL_LIGHTING); glColor3d(1 - background[0], 1 - background[1], 1 - background[2]); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); DrawScene(scene); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } // Save image if (save_image) { char image_name[256]; static int image_number = 1; for (;;) { sprintf(image_name, "image%d.jpg", image_number++); FILE *fp = fopen(image_name, "r"); if (!fp) break; else fclose(fp); } GLUTSaveImage(image_name); printf("Saved %s\n", image_name); save_image = 0; } // Save video if (save_video) { char frame_name[512]; static int next_frame = 0; static int num_frames_recorded = 0; for (;;) { sprintf(frame_name, "%sframe%04d.jpg", video_prefix, next_frame++); FILE *fp = fopen(frame_name, "r"); if (!fp) break; else fclose(fp); } GLUTSaveImage(frame_name); if (next_frame % 100 == 1) { printf("Saved %s\n", frame_name); } if (num_frames_to_record == ++num_frames_recorded) { save_video = 0; printf("Recorded %d frames, stopping as instructed.\n", num_frames_recorded); quit = 1; } } // Quit here so that can save image before exit if (quit) { if (output_image_name) GLUTSaveImage(output_image_name); GLUTStop(); } // Swap buffers glutSwapBuffers(); }
void XMLReader::LoadSceneFromFile(QFile &file, const QStringRef &local_path, Scene &scene, Integrator* &integrator) { if(file.open(QIODevice::ReadOnly)) { QXmlStreamReader xml_reader; xml_reader.setDevice(&file); QMap<QString, QList<Geometry*>> material_to_geometry_map; QMap<QString, QList<Material*>> bxdf_to_material_map;//Key is the bxdf's name while(!xml_reader.isEndDocument()) { xml_reader.readNext(); if(xml_reader.isStartElement()) { //Get the tag name QString tag(xml_reader.name().toString()); if(QString::compare(tag, QString("camera")) == 0) { scene.SetCamera(LoadCamera(xml_reader)); } else if(QString::compare(tag, QString("geometry")) == 0) { Geometry* geometry = LoadGeometry(xml_reader, material_to_geometry_map, local_path); if(geometry == NULL) { return; } scene.objects.append(geometry); } else if(QString::compare(tag, QString("material")) == 0) { Material* material = LoadMaterial(xml_reader, local_path, bxdf_to_material_map); if(material == NULL) { return; } scene.materials.append(material); } else if(QString::compare(tag, QString("bxdf")) == 0) { BxDF* bxdf = LoadBxDF(xml_reader); if(bxdf == NULL) { return; } scene.bxdfs.append(bxdf); } else if(QString::compare(tag, QString("integrator")) == 0) { integrator = LoadIntegrator(xml_reader); } else if(QString::compare(tag, QString("pixelSampleLength"), Qt::CaseInsensitive) == 0) { scene.sqrt_samples = LoadPixelSamples(xml_reader); } } } //Associate the materials in the XML file with the geometries that use those materials. for(int i = 0; i < scene.materials.size(); i++) { QList<Geometry*> l = material_to_geometry_map.value(scene.materials[i]->name); for(int j = 0; j < l.size(); j++) { l[j]->SetMaterial(scene.materials[i]); } } for(int i = 0; i < scene.bxdfs.size(); i++) { QList<Material*> l = bxdf_to_material_map.value(scene.bxdfs[i]->name); for(int j = 0; j < l.size(); j++) { l[j]->bxdfs.append(scene.bxdfs[i]); } } //Copy emissive geometry from the list of objects to the list of lights QList<Geometry*> to_lights; for(Geometry *g : scene.objects) { g->create(); if(g->material->is_light_source) { to_lights.append(g); } g->ComputeArea(); } for(Geometry *g : to_lights) { scene.lights.append(g); } file.close(); } }