void* TextureProcessorMain(std::vector<std::string>* args)
{
	auto start = std::chrono::high_resolution_clock::now();

	std::string filename;
	int numArgs = args->size();
	if (numArgs > 0)
	{
		filename = (*args)[0];
	}
	else
	{
		cout << "ERROR : You must specify a filename.";
		cin.get();
	}

	if (numArgs > 1)
	{
		for (int i = 1; i < numArgs; ++i)
		{
			std::string argument = (*args)[i];

			if (argument.find("texformat") != string::npos)
			{
				if (numArgs >= i + 1)
					texFormat = (TEXTURE_FORMAT)atoi((*args)[i + 1].c_str());
				else cout << "Please provide a valid texture format.";
			}
			else if (argument.find("mipmaps") != string::npos)
			{
				generateMipmaps = true;
			}
			else if (argument.find("memory") != string::npos)
			{
				useMemory = true;
			}
			else if (argument.find("reverse") != string::npos)
			{
				reverseChannels = true;
			}
			else if (argument.find("flipvertical") != string::npos)
			{
				flipVertically = true;
			}

		}
	}

	string extension = filename.substr(filename.find(".") + 1);

	ImageLoader* loader = NULL;

	if (extension == "jpg" || extension == "jpeg")
	{
		loader = new JpegLoader();
	}
	else if (extension == "png")
	{
		loader = new PngLoader();
	}
	else if (extension == "bmp")
	{
		loader = new BmpLoader();
	}
	

	
	/*ilInit();

	ilEnable(IL_FILE_OVERWRITE);

	ilEnable(IL_ORIGIN_SET);
	ilSetInteger(IL_ORIGIN_MODE, IL_ORIGIN_UPPER_LEFT); */

	auto startLoad = std::chrono::high_resolution_clock::now();

	loader->Load(filename, reverseChannels == true ? ImageLoader::PixelChannelOrder::ORDER_BGR : ImageLoader::PixelChannelOrder::ORDER_RGB);

	if (flipVertically)
		loader->FlipVertically();


	auto endLoad = std::chrono::high_resolution_clock::now();

	long long  timeLoad = std::chrono::duration_cast<std::chrono::milliseconds>(endLoad - startLoad).count();

	//TextureLoader loader = TextureLoader(filename.c_str());
	
	//std::cout << "timeLoad : " << timeLoad << "\n";

	//loader.SetTextureFormat(texFormat);

	auto startMip = std::chrono::high_resolution_clock::now();

	if(generateMipmaps)
		loader->GenerateMipmaps();



	auto endMip = std::chrono::high_resolution_clock::now();

	long long  timeMip = std::chrono::duration_cast<std::chrono::milliseconds>(endMip - startMip).count();

//	std::cout << "timeMip : " << timeMip << "\n";

	if (!useMemory)
	{
		// Texture loaded, now write a binary file.
		filename = strtok((char *)filename.c_str(), ".");		// Remove the extension.
		char* extension = strtok(NULL, ".");

		// Get the new filename with extension .bbt 
		filename = strtok((char*)filename.c_str(), ".");		// Remove the extension.
		filename += ".bbt";

		loader->WriteBinary(filename.c_str(), generateMipmaps);

		delete loader;
	}
	else // Memory.
	{
		/*auto startMem = std::chrono::high_resolution_clock::now();

		int totalSize = jpegLoader->GetTotalSizeToWrite();

		char* memory = AllocateMem(totalSize);
		
		jpegLoader->WriteMemory(memory, generateMipmaps);

		auto endMem = std::chrono::high_resolution_clock::now();

		auto timeMem = std::chrono::duration_cast<std::chrono::milliseconds>(endMem - startMem).count();

		auto end = std::chrono::high_resolution_clock::now();

		auto time = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count(); 

		SetBinary(memory);

		return memory; */
		return loader;
	}

	return 0;
}