auto_ptr<char> TIGER::decodePCD9(auto_ptr<char> dataStream, uint32_t &size, string &path, string &name) { PCD9_Header *table = (PCD9_Header*)dataStream.get(); switch (table->format) { case '1TXD': //DXT1 case '3TXD': //DXT3 case '5TXD': //DXT5 { string fullpath = path + "\\" + name + ".dds"; if ((currentMode == UNPACK) && (writeDDS)) { DDS dds(table->type, table->height, table->width, 0, table->mipmap + 1, table->format, (char*)dataStream.get() + sizeof(PCD9_Header), size - sizeof(PCD9_Header)); cout << "Writing \"" << fullpath << "\"\n"; dds.serialization(path + "\\" + name + ".dds"); size = 0; } else if (currentMode == PACK) { DDS dds; if (!dds.deserialization(fullpath)) { cout << "\nError opening dds file.\n"; exit(-1); } PCD9_Header tmp = *table; size = dds.dataSize + sizeof(PCD9_Header); dataStream.reset(new char[size]); table = (PCD9_Header*)dataStream.get(); memcpy((char*)table + sizeof(PCD9_Header), dds.data, dds.dataSize); *table = tmp; } return dataStream; } break; case 0x15: { string fullpath = path + "\\" + name + ".raw"; if (currentMode == UNPACK) { cout << "Writing \"" << fullpath << "\"\n"; fstream rawFile(fullpath, ios_base::binary | ios_base::out); if (!rawFile.is_open()) exit(errno); rawFile.write((char*)dataStream.get() + sizeof(PCD9_Header), size - sizeof(PCD9_Header)); rawFile.close(); } size = 0; return dataStream; } break; default: break; } cout << "Something went wrong." << __FILE__ << "," << __FUNCTIONW__ << "," << __LINE__ << "\n"; return dataStream; }
int main(int argc, char* argv[]) { // init random number generator for distribution rendering std::srand(int(time(nullptr))); if (argc <= 1) { std::cerr << "No Scene XML specified. If more than one XML spceified, scenes and settings will be combined into one." << std::endl; std::cerr << " Usage:" << std::endl; std::cerr << " ./raytracer <path to xml> ..." << std::endl; return 0; } // Create the 3 main objects that handle all functionality Scene scene; Raytracer raytracer; raytracer.setScene(&scene); CameraContainer cameras; // parse all scene info SceneXmlParser xmlParser(raytracer, scene, cameras); for (int i = 1; i < argc; ++i) { std::string sceneFilename(argv[i]); if(!xmlParser.parseSceneDefinition(sceneFilename) ) { std::cerr << "Parsing failed... Exiting." << std::endl; return 1; } } // preprocess the scene before rendering scene.preprocess(); std::string bmpSuffix(".bmp"); std::string rawSuffix(".rsd"); // Render for each camera. for (auto& cam : cameras) { std::cout << "Rendering camera \"" << cam->name << "\"" << std::endl; // if previous raw sensor data exists, // use it as starting point std::string rawFileName = cam->name + rawSuffix; std::ifstream rawFile(rawFileName.c_str()); if (rawFile.good()) { Image<SensorPixel> accummulatedSensor = readImageFromFile<Image<SensorPixel> >(rawFile); if (accummulatedSensor) { std::cout << "Reusing previously rendered data for iterative raytacing." << std::endl; cam->mergeSensor(accummulatedSensor); } rawFile.close(); } // render and dump to file raytracer.render(*cam.get()); cam->dumpToBMP(cam->name + bmpSuffix); // if raytracer flag says to also dump raw, do so if (raytracer.dumpRaw) { cam->dumpRawData(rawFileName); } } return 0; }