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(); } }
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(); } }