From c37e9984baefeaabfbfba6769d69a7f28577cccc Mon Sep 17 00:00:00 2001 From: Jan Date: Mon, 23 Sep 2024 19:29:58 +0200 Subject: [PATCH] chore: add base for image converter tool --- premake5.lua | 2 + src/ImageConverter.lua | 50 ++++++++++ src/ImageConverter/ImageConverter.cpp | 27 ++++++ src/ImageConverter/ImageConverter.h | 24 +++++ src/ImageConverter/ImageConverterArgs.cpp | 110 ++++++++++++++++++++++ src/ImageConverter/ImageConverterArgs.h | 28 ++++++ src/ImageConverter/main.cpp | 8 ++ 7 files changed, 249 insertions(+) create mode 100644 src/ImageConverter.lua create mode 100644 src/ImageConverter/ImageConverter.cpp create mode 100644 src/ImageConverter/ImageConverter.h create mode 100644 src/ImageConverter/ImageConverterArgs.cpp create mode 100644 src/ImageConverter/ImageConverterArgs.h create mode 100644 src/ImageConverter/main.cpp diff --git a/premake5.lua b/premake5.lua index 0ac4a6ac..3ffa7dcc 100644 --- a/premake5.lua +++ b/premake5.lua @@ -112,6 +112,7 @@ group "" -- ======================== include "src/Common.lua" include "src/Crypto.lua" +include "src/ImageConverter.lua" include "src/Linker.lua" include "src/Parser.lua" include "src/RawTemplater.lua" @@ -155,6 +156,7 @@ group "" group "Tools" Linker:project() Unlinker:project() + ImageConverter:project() group "" group "Raw" diff --git a/src/ImageConverter.lua b/src/ImageConverter.lua new file mode 100644 index 00000000..e4552cd0 --- /dev/null +++ b/src/ImageConverter.lua @@ -0,0 +1,50 @@ +ImageConverter = {} + +function ImageConverter:include(includes) + if includes:handle(self:name()) then + includedirs { + path.join(ProjectFolder(), "ImageConverter") + } + end +end + +function ImageConverter:link(links) + +end + +function ImageConverter:use() + dependson(self:name()) +end + +function ImageConverter:name() + return "ImageConverter" +end + +function ImageConverter:project() + local folder = ProjectFolder() + local includes = Includes:create() + local links = Links:create() + + project(self:name()) + targetdir(TargetDirectoryBin) + location "%{wks.location}/src/%{prj.name}" + kind "ConsoleApp" + language "C++" + + files { + path.join(folder, "ImageConverter/**.h"), + path.join(folder, "ImageConverter/**.cpp") + } + + self:include(includes) + Utils:include(includes) + ObjLoading:include(includes) + ObjWriting:include(includes) + + Raw:use() + + links:linkto(Utils) + links:linkto(ObjLoading) + links:linkto(ObjWriting) + links:linkall() +end diff --git a/src/ImageConverter/ImageConverter.cpp b/src/ImageConverter/ImageConverter.cpp new file mode 100644 index 00000000..5f1fec26 --- /dev/null +++ b/src/ImageConverter/ImageConverter.cpp @@ -0,0 +1,27 @@ +#include "ImageConverter.h" + +#include "ImageConverterArgs.h" + +class ImageConverterImpl final : public ImageConverter +{ +public: + bool Start(const int argc, const char** argv) override + { + auto shouldContinue = true; + if (!m_args.ParseArgs(argc, argv, shouldContinue)) + return false; + + if (!shouldContinue) + return true; + + return true; + } + +private: + ImageConverterArgs m_args; +}; + +std::unique_ptr ImageConverter::Create() +{ + return std::make_unique(); +} diff --git a/src/ImageConverter/ImageConverter.h b/src/ImageConverter/ImageConverter.h new file mode 100644 index 00000000..d0e37a87 --- /dev/null +++ b/src/ImageConverter/ImageConverter.h @@ -0,0 +1,24 @@ +#pragma once +#include + +class ImageConverter +{ +public: + ImageConverter() = default; + virtual ~ImageConverter() = default; + + ImageConverter(const ImageConverter& other) = delete; + ImageConverter(ImageConverter&& other) noexcept = delete; + ImageConverter& operator=(const ImageConverter& other) = delete; + ImageConverter& operator=(ImageConverter&& other) noexcept = delete; + + /** + * \brief Starts the ImageConverter application logic. + * \param argc The amount of command line arguments specified. + * \param argv The command line arguments. + * \return \c true if the application was successful or \c false if an error occurred. + */ + virtual bool Start(int argc, const char** argv) = 0; + + static std::unique_ptr Create(); +}; diff --git a/src/ImageConverter/ImageConverterArgs.cpp b/src/ImageConverter/ImageConverterArgs.cpp new file mode 100644 index 00000000..69a3a1ae --- /dev/null +++ b/src/ImageConverter/ImageConverterArgs.cpp @@ -0,0 +1,110 @@ +#include "ImageConverterArgs.h" + +#include "GitVersion.h" +#include "ObjLoading.h" +#include "ObjWriting.h" +#include "Utils/Arguments/UsageInformation.h" + +#include +#include +#include + +// clang-format off +const CommandLineOption* const OPTION_HELP = + CommandLineOption::Builder::Create() + .WithShortName("?") + .WithLongName("help") + .WithDescription("Displays usage information.") + .Build(); + +const CommandLineOption* const OPTION_VERSION = + CommandLineOption::Builder::Create() + .WithLongName("version") + .WithDescription("Prints the application version.") + .Build(); + +const CommandLineOption* const OPTION_VERBOSE = + CommandLineOption::Builder::Create() + .WithShortName("v") + .WithLongName("verbose") + .WithDescription("Outputs a lot more and more detailed messages.") + .Build(); +// clang-format on + +const CommandLineOption* const COMMAND_LINE_OPTIONS[]{ + OPTION_HELP, + OPTION_VERSION, + OPTION_VERBOSE, +}; + +ImageConverterArgs::ImageConverterArgs() + : m_verbose(false), + m_argument_parser(COMMAND_LINE_OPTIONS, std::extent_v) +{ +} + +void ImageConverterArgs::PrintUsage() +{ + UsageInformation usage("ImageConverter.exe"); + + for (const auto* commandLineOption : COMMAND_LINE_OPTIONS) + { + usage.AddCommandLineOption(commandLineOption); + } + + usage.AddArgument("fileToConvert"); + usage.SetVariableArguments(true); + + usage.Print(); +} + +void ImageConverterArgs::PrintVersion() +{ + std::cout << std::format("OpenAssetTools ImageConverter {}\n", GIT_VERSION); +} + +void ImageConverterArgs::SetVerbose(const bool isVerbose) +{ + m_verbose = isVerbose; + ObjLoading::Configuration.Verbose = isVerbose; + ObjWriting::Configuration.Verbose = isVerbose; +} + +bool ImageConverterArgs::ParseArgs(const int argc, const char** argv, bool& shouldContinue) +{ + shouldContinue = true; + if (!m_argument_parser.ParseArguments(argc - 1, &argv[1])) + { + PrintUsage(); + return false; + } + + // Check if the user requested help + if (m_argument_parser.IsOptionSpecified(OPTION_HELP)) + { + PrintUsage(); + shouldContinue = false; + return true; + } + + // Check if the user wants to see the version + if (m_argument_parser.IsOptionSpecified(OPTION_VERSION)) + { + PrintVersion(); + shouldContinue = false; + return true; + } + + m_files_to_convert = m_argument_parser.GetArguments(); + if (m_files_to_convert.empty()) + { + // No files to convert specified... + PrintUsage(); + return false; + } + + // -v; --verbose + SetVerbose(m_argument_parser.IsOptionSpecified(OPTION_VERBOSE)); + + return true; +} diff --git a/src/ImageConverter/ImageConverterArgs.h b/src/ImageConverter/ImageConverterArgs.h new file mode 100644 index 00000000..87ed6ce6 --- /dev/null +++ b/src/ImageConverter/ImageConverterArgs.h @@ -0,0 +1,28 @@ +#pragma once + +#include "Utils/Arguments/ArgumentParser.h" +#include "Utils/ClassUtils.h" + +#include +#include + +class ImageConverterArgs +{ +public: + ImageConverterArgs(); + bool ParseArgs(int argc, const char** argv, bool& shouldContinue); + + bool m_verbose; + std::vector m_files_to_convert; + +private: + /** + * \brief Prints a command line usage help text for the ImageConverter tool to stdout. + */ + static void PrintUsage(); + static void PrintVersion(); + + void SetVerbose(bool isVerbose); + + ArgumentParser m_argument_parser; +}; diff --git a/src/ImageConverter/main.cpp b/src/ImageConverter/main.cpp new file mode 100644 index 00000000..23145c36 --- /dev/null +++ b/src/ImageConverter/main.cpp @@ -0,0 +1,8 @@ +#include "ImageConverter.h" + +int main(const int argc, const char** argv) +{ + const auto imageConverter = ImageConverter::Create(); + + return imageConverter->Start(argc, argv) ? 0 : 1; +}