From 5922c3ec6a02e7dd42a54b1faeb86f66c94e82e4 Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Thu, 11 Aug 2022 22:29:40 +0200 Subject: [PATCH] Update lib name and implement basis of lib interface --- RSEModel/CMakeLists.txt | 4 +- RSEModel/Model-Extractor.c | 2 +- RSEModel/obj_exporter.c | 2 +- RSPModelLib/CMakeLists.txt | 10 +-- RSPModelLib/config.h | 1 - RSPModelLib/config.h.in | 1 - RSPModelLib/errors_types.h | 28 ------ RSPModelLib/include/RSPModel.h | 82 ++++++++++++++++++ RSPModelLib/include/RSPModel_datatypes.h | 104 +++++++++++++++++++++++ RSPModelLib/include/RSPModel_errordefs.h | 43 ++++++++++ RSPModelLib/src/RSPModel.c | 42 +++++++++ RSPModelLib/src/config.h | 6 ++ RSPModelLib/src/config.h.in | 6 ++ RSPModelLib/{ => src}/hob_parser.c | 15 ++-- RSPModelLib/{ => src}/hob_parser.h | 4 +- RSPModelLib/{ => src}/hob_struct.h | 100 ++-------------------- RSPModelLib/{ => src}/options.h | 10 +-- 17 files changed, 316 insertions(+), 144 deletions(-) delete mode 100644 RSPModelLib/config.h delete mode 100644 RSPModelLib/config.h.in delete mode 100644 RSPModelLib/errors_types.h create mode 100644 RSPModelLib/include/RSPModel.h create mode 100644 RSPModelLib/include/RSPModel_datatypes.h create mode 100644 RSPModelLib/include/RSPModel_errordefs.h create mode 100644 RSPModelLib/src/RSPModel.c create mode 100644 RSPModelLib/src/config.h create mode 100644 RSPModelLib/src/config.h.in rename RSPModelLib/{ => src}/hob_parser.c (98%) rename RSPModelLib/{ => src}/hob_parser.h (78%) rename RSPModelLib/{ => src}/hob_struct.h (67%) rename RSPModelLib/{ => src}/options.h (84%) diff --git a/RSEModel/CMakeLists.txt b/RSEModel/CMakeLists.txt index d3e599f..843e9b1 100644 --- a/RSEModel/CMakeLists.txt +++ b/RSEModel/CMakeLists.txt @@ -26,8 +26,8 @@ SOURCE_GROUP("Source Files" FILES ${RSE_MOD_SOURCES}) # Building instructions for RSE-Model -if(DEFINED ENV{RSE-WS}) - set(CMAKE_BUILD_TYPE DEBUG) +if(DEFINED ENV{CI}) + set(CMAKE_BUILD_TYPE RELEASE) endif() add_executable(rse-model ${RSE_MOD_SOURCES}) set_property(TARGET rse-model PROPERTY C_STANDARD 90) diff --git a/RSEModel/Model-Extractor.c b/RSEModel/Model-Extractor.c index 2d44f4d..06894f6 100644 --- a/RSEModel/Model-Extractor.c +++ b/RSEModel/Model-Extractor.c @@ -15,7 +15,7 @@ #include #include #endif -#include +#include #include #include #include "config.h" diff --git a/RSEModel/obj_exporter.c b/RSEModel/obj_exporter.c index 0ac63c8..94faac0 100644 --- a/RSEModel/obj_exporter.c +++ b/RSEModel/obj_exporter.c @@ -9,8 +9,8 @@ #include #include #include -#include #include +#include #include "options.h" #include "rlk/obj.h" #include "obj_exporter.h" diff --git a/RSPModelLib/CMakeLists.txt b/RSPModelLib/CMakeLists.txt index 59d017a..fbe24d2 100644 --- a/RSPModelLib/CMakeLists.txt +++ b/RSPModelLib/CMakeLists.txt @@ -15,21 +15,21 @@ include(CheckIncludeFile) include(CheckCSourceCompiles) # Push compile infos to source -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/config.h @ONLY) # Define src/headers files -FILE(GLOB_RECURSE RSP_MOD_SOURCES ./*.c) +FILE(GLOB_RECURSE RSP_MOD_SOURCES ./src/*.c) SOURCE_GROUP("Source Files" FILES ${RSP_MOD_SOURCES}) # Building instructions for RSE-Model -if(DEFINED ENV{RSE-WS}) - set(CMAKE_BUILD_TYPE DEBUG) +if(DEFINED ENV{CI}) + set(CMAKE_BUILD_TYPE RELEASE) endif() add_library(rsp-model-lib ${RSP_MOD_SOURCES}) set_property(TARGET rsp-model-lib PROPERTY C_STANDARD 90) -target_include_directories(rsp-model-lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(rsp-model-lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) set_target_properties(rsp-model-lib PROPERTIES OUTPUT_NAME ${RSP_MODEL_LIB_NAME}) # Link externals libraries to the linker if(MSVC) diff --git a/RSPModelLib/config.h b/RSPModelLib/config.h deleted file mode 100644 index bc0d1b1..0000000 --- a/RSPModelLib/config.h +++ /dev/null @@ -1 +0,0 @@ -#define VERSION "1.0.0" diff --git a/RSPModelLib/config.h.in b/RSPModelLib/config.h.in deleted file mode 100644 index 32f49cf..0000000 --- a/RSPModelLib/config.h.in +++ /dev/null @@ -1 +0,0 @@ -#define VERSION "@PROJECT_VERSION@" diff --git a/RSPModelLib/errors_types.h b/RSPModelLib/errors_types.h deleted file mode 100644 index 6d101ab..0000000 --- a/RSPModelLib/errors_types.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * errors_types.h - * - * Created on: 26 juil. 2022 - * Author: JackCarterSmith - */ - -//#include "error.h" //TODO: use it as base for error ID - - -#ifndef SRC_ERRORS_TYPES_H_ -#define SRC_ERRORS_TYPES_H_ - -#ifdef NO_ERROR -#undef NO_ERROR -#endif -#define NO_ERROR 0 -#define ERROR_GENERIC 1 -#define ERROR_MEMORY 2 -#define ERROR_IO 3 -#define ERROR_PROCESS 4 - -#define ERROR_ARGS_NULL 10 -#define ERROR_ARGS_RANGE 11 - -#define ERROR_REALITY_BROKED -1 - -#endif /* SRC_ERRORS_TYPES_H_ */ diff --git a/RSPModelLib/include/RSPModel.h b/RSPModelLib/include/RSPModel.h new file mode 100644 index 0000000..70f81c5 --- /dev/null +++ b/RSPModelLib/include/RSPModel.h @@ -0,0 +1,82 @@ +/** + * @file RSPModel.h + * @date 11/08/2022 + * @author JackCarterSmith + * @copyright GPL-v3.0 + * @brief Rogue Squadron Parser model library, used to decode decode datas + * from original game file and access them through public interface. + * + */ + +#include "RSPModel_datatypes.h" + +#ifndef RSPMODEL_H_ +#define RSPMODEL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Library's functions declaration +/////////////////////////////////////////////////////////////////////////////// + +/** + * @brief Get the current library version. + * @return Char array of the version, escape char included. + */ +char* RSPModel_getVersion( void ); + +/** + * @brief Run model parser for the specified file in file system. + * @details Model library can process HOB file from file system. It's a easy + * approach using this library for debugging purpose. + * + * @param[out] hob HOB structure to be filled with parsed datas. + * @param[in] filePath Path to the HOB file in system. + * + * @return Error status, return RSPLIB_SUCCESS in nominal case. + */ +unsigned short RSPModel_processHOBFileMemory( T_RSPMODEL_HOB* hob, const char* const filePath ); + +/** + * @brief Run model parser for the specified file in memory. + * @details Model library can process HOB file directly stored in RAM memory, + * you must load the file beforehand through a malloc/memcpy call. + * @warning No controls routines are implemented to verify file length! + * + * @param[out] hob HOB structure to be filled with parsed datas. + * @param[in] memFilePtr Pointer to the beginning of the file in memory. + * @param[in] memFileSize Size of the file in bytes. + * + * @return Error status, return RSPLIB_SUCCESS in nominal case. + */ +unsigned short RSPModel_processHOBFile( T_RSPMODEL_HOB* hob, const void* const memFilePtr, const long memFileSize ); + +/** + * @brief Convert HOB's object datas to GL compatible format. + * @note Only available if GL module as specified at compilation. + * + * @param[in] objStruct Object datas from previously parsed HOB file. + * @param[out] glObj GL structure. + * + * @return Error status, return RSPLIB_SUCCESS in nominal case. + */ +unsigned short RSPModel_objectToGL( const T_RSPMODEL_OBJECT* objStruct, void* glObj ); + +/** + * @brief Convert HOB's object datas to Direct3D compatible format. + * @note Only available if D3D module as specified at compilation. + * + * @param[in] objStruct Object datas from previously parsed HOB file. + * @param[out] D3DObj Direct3D structure. + * + * @return Error status, return RSPLIB_SUCCESS in nominal case. + */ +unsigned short RSPModel_objectToD3D( const T_RSPMODEL_OBJECT* objStruct, void* D3DObj ); + +#ifdef __cplusplus +} +#endif + +#endif /* RSPMODEL_H_ */ diff --git a/RSPModelLib/include/RSPModel_datatypes.h b/RSPModelLib/include/RSPModel_datatypes.h new file mode 100644 index 0000000..53a4f15 --- /dev/null +++ b/RSPModelLib/include/RSPModel_datatypes.h @@ -0,0 +1,104 @@ +/** + * @file RSPModel_datatypes.h + * @date 11/08/2022 + * @author JackCarterSmith + * @copyright GPL-v3.0 + * @brief RSP Model workflow structures definitions + * + */ + +#ifndef RSPMODEL_DATATYPES_H_ +#define RSPMODEL_DATATYPES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Lib's structure definitions +/////////////////////////////////////////////////////////////////////////////// + +typedef unsigned int T_RGBA; + +typedef struct vector3 { float x,y,z; } T_VECTOR3; + +typedef struct vertex { short x,y,z,w; } T_VERTEX; + +typedef struct tex_coord { unsigned short u,v; } T_TEXCOORD; + +typedef struct face_flags { + unsigned int fUnknown0:1; + unsigned int fUnknown1:1; + unsigned int fHasTexture:1; + unsigned int fIsQuad:1; + unsigned int fSeparateColorVertex:1; + unsigned int fHasColor:1; + unsigned int fHasExtraBytesBeforeColor:1; + unsigned int fUnknown7:1; + unsigned int fUnknown8:1; + unsigned int fUnknown9:1; + unsigned int fUnknown10:1; + + unsigned int reserved:21; +} FACE_FLAGS; + +typedef struct hob_face { + union { + unsigned int flags; + FACE_FLAGS flags_bits; + }; + unsigned char b1; + unsigned char b2; + unsigned char b3; + unsigned char bsize; + unsigned short material_index; + unsigned short indices[4]; + T_RGBA vertex_colors[4]; //TODO: convert in R:8_G:8_B:8_A:8 format? Caution with BE/LE conversion + T_TEXCOORD tex_coords[4]; +} T_HOB_FACE; + +typedef struct hob_face_group { + unsigned int meshdef1_offset; + + unsigned int face_block_end_offset; + unsigned int face_block_offset; + unsigned int vertex_block_offset; + + unsigned int id; + T_VECTOR3 transform; + + unsigned int face_count; + T_HOB_FACE* faces; + + unsigned int vertex_count; + T_VERTEX* vertices; +} T_HOB_FACE_GROUP; + +typedef struct rspmodel_object { + char name[16]; + unsigned int face_group_offset; + unsigned int object_part_header_offset; + unsigned int face_group_header_offset; + + unsigned int object_part_count; + unsigned int face_group_count; + + T_HOB_FACE_GROUP* object_parts; +} T_RSPMODEL_OBJECT; + +/** + * @brief Model-Extractor HOB structure of an HOB file content. + * @details Used with malloc to create a clean method of bufferized + * model datas before saving it. + * @todo Export format to use it directly in other program. + */ +typedef struct rspmodel_hob { + unsigned int obj_count; + T_RSPMODEL_OBJECT* objects; +} T_RSPMODEL_HOB; + +#ifdef __cplusplus +} +#endif + +#endif /* RSPMODEL_DATATYPES_H_ */ diff --git a/RSPModelLib/include/RSPModel_errordefs.h b/RSPModelLib/include/RSPModel_errordefs.h new file mode 100644 index 0000000..fa33c03 --- /dev/null +++ b/RSPModelLib/include/RSPModel_errordefs.h @@ -0,0 +1,43 @@ +/** + * \file RSPModel_errordefs.h + * \date 26/07/2022 + * \author JackCarterSmith + * \copyright GPL-v3.0 + * \brief Errors type definition file. Used mostly by methods in this project. + * + */ + + +#ifndef RSPMODELLIB_ERRORS_H_ +#define RSPMODELLIB_ERRORS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Errors types definitions +/////////////////////////////////////////////////////////////////////////////// + +#ifndef NO_ERROR +#define NO_ERROR 0 // In case of dual declaration by GCC +#endif +#define RSPLIB_SUCCESS NO_ERROR //!< All is running good! + +#define RSPLIB_ERROR_GENERIC 1 //!< Misuse of the program +#define RSPLIB_ERROR_MEMORY 2 //!< Memory de/allocation failure +#define RSPLIB_ERROR_IO 3 //!< File system access failure +#define RSPLIB_ERROR_PROCESS 4 //!< Internal processing failure + +#define RSPLIB_ERROR_ARGS_NULL 16 //!< Method not NULL input expected +#define RSPLIB_ERROR_ARGS_RANGE 17 //!< Method input out of expected range + +#define RSPLIB_ERROR_MOD_DISABLED 64 //!< A necessary module hasn't been activated during compilation time + +#define RSPLIB_ERROR_REALITY_BRK -1 //!< This error can only appear in alternate reality + +#ifdef __cplusplus +} +#endif + +#endif /* RSPMODELLIB_ERRORS_H_ */ diff --git a/RSPModelLib/src/RSPModel.c b/RSPModelLib/src/RSPModel.c new file mode 100644 index 0000000..2dc0263 --- /dev/null +++ b/RSPModelLib/src/RSPModel.c @@ -0,0 +1,42 @@ +/** + * \file RSPModel.c + * \date 11/08/2022 + * \author JackCarterSmith + * \copyright GPL-v3.0 + * \brief HOB model parser and export to Waveform OBJ format. + * + */ + +#include +#include "config.h" +#include "options.h" +#include "RSPModel_errordefs.h" +#include "RSPModel.h" + +char* RSPModel_getVersion( void ) { + return PRG_VERSION; +} + +unsigned short RSPModel_processHOBFileMemory( T_RSPMODEL_HOB* hob, const char* const filePath ) { + return RSPLIB_SUCCESS; +} + +unsigned short RSPModel_processHOBFile( T_RSPMODEL_HOB* hob, const void* const memFilePtr, const long memFileSize ) { + return RSPLIB_SUCCESS; +} + +unsigned short RSPModel_objectToGL( const T_RSPMODEL_OBJECT* objStruct, void* glObj ) { +#ifndef GL_SUPPORT + return RSPLIB_ERROR_MOD_DISABLED; +#endif + + return RSPLIB_SUCCESS; +} + +unsigned short RSPModel_objectToD3D( const T_RSPMODEL_OBJECT* objStruct, void* D3DObj ) { +#ifndef D3D_SUPPORT + return RSPLIB_ERROR_MOD_DISABLED; +#endif + + return RSPLIB_SUCCESS; +} diff --git a/RSPModelLib/src/config.h b/RSPModelLib/src/config.h new file mode 100644 index 0000000..2a1d023 --- /dev/null +++ b/RSPModelLib/src/config.h @@ -0,0 +1,6 @@ +#ifndef CONFIG_H_ +#define CONFIG_H_ + +#define PRG_VERSION "1.0.0" + +#endif /* CONFIG_H_ */ diff --git a/RSPModelLib/src/config.h.in b/RSPModelLib/src/config.h.in new file mode 100644 index 0000000..3f2e0c4 --- /dev/null +++ b/RSPModelLib/src/config.h.in @@ -0,0 +1,6 @@ +#ifndef CONFIG_H_ +#define CONFIG_H_ + +#define PRG_VERSION "@PROJECT_VERSION@" + +#endif /* CONFIG_H_ */ diff --git a/RSPModelLib/hob_parser.c b/RSPModelLib/src/hob_parser.c similarity index 98% rename from RSPModelLib/hob_parser.c rename to RSPModelLib/src/hob_parser.c index 3ca2d46..7de9d42 100644 --- a/RSPModelLib/hob_parser.c +++ b/RSPModelLib/src/hob_parser.c @@ -9,13 +9,14 @@ #include #include #include -#include "errors_types.h" +#include "RSPModel_errordefs.h" +#include "RSPModel_datatypes.h" #include "options.h" #include "hob_struct.h" #include "hob_parser.h" -unsigned char RSP_ModelLib_ParseHOBFile(const char* fileName, T_HOB* hob_struct, T_PROG_OPTIONS* p_opts) { +unsigned char RSP_ModelLib_ParseHOBFile(const char* fileName, T_RSPMODEL_HOB* hob_struct, T_PROG_OPTIONS* p_opts) { unsigned char err = NO_ERROR; long fileSize; FILE* fStream = NULL; @@ -47,7 +48,7 @@ unsigned char RSP_ModelLib_ParseHOBFile(const char* fileName, T_HOB* hob_struct, if (hob_struct->obj_count > 0) { // Populate HOB structure with object descriptor - hob_struct->objects = calloc(hob_struct->obj_count, sizeof(T_HOB_OBJECT)); + hob_struct->objects = calloc(hob_struct->obj_count, sizeof(T_RSPMODEL_OBJECT)); for ( i = 0; i < hob_struct->obj_count; i++ ) { if (p_opts->debug_mode) printf("\n-=====================-Begin of Object part-======================-\n"); @@ -401,7 +402,7 @@ unsigned char RSP_ModelLib_ParseHOBFile(const char* fileName, T_HOB* hob_struct, free(offset_index); } else { - err = ERROR_GENERIC; + err = RSPLIB_ERROR_GENERIC; printf("[INFO] Can't process empty file!\n"); } @@ -409,14 +410,14 @@ unsigned char RSP_ModelLib_ParseHOBFile(const char* fileName, T_HOB* hob_struct, } else { fclose(fStream); - err = ERROR_MEMORY; + err = RSPLIB_ERROR_MEMORY; if (p_opts->verbose_mode) printf("[ERR] Can't allocate enough memory for file processing!\n"); } } else { - err = ERROR_IO; + err = RSPLIB_ERROR_IO; if (p_opts->verbose_mode) printf("[ERR] Input file %s not found!\n", fileName); } - } else err = ERROR_ARGS_NULL; + } else err = RSPLIB_ERROR_ARGS_NULL; return err; } diff --git a/RSPModelLib/hob_parser.h b/RSPModelLib/src/hob_parser.h similarity index 78% rename from RSPModelLib/hob_parser.h rename to RSPModelLib/src/hob_parser.h index 6739711..32b350d 100644 --- a/RSPModelLib/hob_parser.h +++ b/RSPModelLib/src/hob_parser.h @@ -7,12 +7,12 @@ */ #include "options.h" -#include "hob_struct.h" +#include "RSPModel_datatypes.h" #ifndef SRC_HOB_PARSER_H_ #define SRC_HOB_PARSER_H_ -unsigned char RSP_ModelLib_ParseHOBFile(const char* fileName, T_HOB* hob_struct, T_PROG_OPTIONS* p_opts); +unsigned char RSP_ModelLib_ParseHOBFile(const char* fileName, T_RSPMODEL_HOB* hob_struct, T_PROG_OPTIONS* p_opts); #endif /* SRC_HOB_PARSER_H_ */ diff --git a/RSPModelLib/hob_struct.h b/RSPModelLib/src/hob_struct.h similarity index 67% rename from RSPModelLib/hob_struct.h rename to RSPModelLib/src/hob_struct.h index 28b96a8..b374150 100644 --- a/RSPModelLib/hob_struct.h +++ b/RSPModelLib/src/hob_struct.h @@ -1,12 +1,14 @@ -/* - * hob_struct.h +/** + * \file hob_struct.h + * \date 26/07/2022 + * \author JackCarterSmith + * \copyright GPL-v3.0 + * \brief HOB file mapping definition. * - * Created on: 26 juil. 2022 - * Author: JackCarterSmith */ -#ifndef SRC_HOB_STRUCT_H_ -#define SRC_HOB_STRUCT_H_ +#ifndef RSPMODELLIB_HOB_STRUCT_H_ +#define RSPMODELLIB_HOB_STRUCT_H_ /* @@ -22,90 +24,6 @@ #define PACK __attribute__((packed)) #endif -/////////////////////////////////////////////////////////////////////////////// -// HOB file structure -/////////////////////////////////////////////////////////////////////////////// - -typedef unsigned int T_RGBA; - -typedef struct vector3 { float x,y,z; } T_VECTOR3; - -typedef struct vertex { short x,y,z,w; } T_VERTEX; - -typedef struct tex_coord { unsigned short u,v; } T_TEXCOORD; - -typedef struct face_flags { - unsigned int fUnknown0:1; - unsigned int fUnknown1:1; - unsigned int fHasTexture:1; - unsigned int fIsQuad:1; - unsigned int fSeparateColorVertex:1; - unsigned int fHasColor:1; - unsigned int fHasExtraBytesBeforeColor:1; - unsigned int fUnknown7:1; - unsigned int fUnknown8:1; - unsigned int fUnknown9:1; - unsigned int fUnknown10:1; - - unsigned int reserved:21; -} FACE_FLAGS; - -typedef struct hob_face { - union { - unsigned int flags; - FACE_FLAGS flags_bits; - }; - unsigned char b1; - unsigned char b2; - unsigned char b3; - unsigned char bsize; - unsigned short material_index; - unsigned short indices[4]; - T_RGBA vertex_colors[4]; //TODO: convert in R:8_G:8_B:8_A:8 format? Caution with BE/LE conversion - T_TEXCOORD tex_coords[4]; -} T_HOB_FACE; - -typedef struct hob_face_group { - unsigned int meshdef1_offset; - - unsigned int face_block_end_offset; - unsigned int face_block_offset; - unsigned int vertex_block_offset; - - unsigned int id; - T_VECTOR3 transform; - - unsigned int face_count; - T_HOB_FACE* faces; - - unsigned int vertex_count; - T_VERTEX* vertices; -} T_HOB_FACE_GROUP; - -typedef struct hob_object { - char name[16]; - unsigned int face_group_offset; - unsigned int object_part_header_offset; - unsigned int face_group_header_offset; - - unsigned int object_part_count; - unsigned int face_group_count; - - T_HOB_FACE_GROUP* object_parts; -} T_HOB_OBJECT; - -/** - * \brief Model-Extractor HOB structure of an HOB file content. - * \details Used with malloc to create a clean method of bufferized - * model datas before saving it. - * \todo Export format to use it directly in other program. - */ -typedef struct hob { - unsigned int obj_count; - T_HOB_OBJECT* objects; -} T_HOB; - - /////////////////////////////////////////////////////////////////////////////// // Declaration of Memory Mapped Structure // Caution: the place of variable is important for correct mapping! @@ -289,4 +207,4 @@ typedef struct PACK hobfile_vertex { #pragma pack(pop) #endif -#endif /* SRC_HOB_STRUCT_H_ */ +#endif /* RSPMODELLIB_HOB_STRUCT_H_ */ diff --git a/RSPModelLib/options.h b/RSPModelLib/src/options.h similarity index 84% rename from RSPModelLib/options.h rename to RSPModelLib/src/options.h index ec369ab..d731673 100644 --- a/RSPModelLib/options.h +++ b/RSPModelLib/src/options.h @@ -1,9 +1,9 @@ /** - * \file options.h - * \date 29/07/2022 - * \author JackCarterSmith - * \copyright GPL-v3.0 - * \brief Shared options structure definition and declaration. + * \file options.h + * \date 29/07/2022 + * \author JackCarterSmith + * \copyright GPL-v3.0 + * \brief Shared options structure definition and declaration. */ #ifndef OPTIONS_H_