Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}