From b3827b8820653f070d1736efaa9fb37a6fa88e7a Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Tue, 26 Jul 2022 20:57:50 +0200 Subject: [PATCH] Program structure --- src/Model-Extractor.c | 97 ++++++++++++++++++++++++++++-------- src/Model-Extractor.h | 22 -------- src/errors_types.h | 25 ++++++++++ src/hob_parser.c | 52 +++++++++++++++++++ src/hob_parser.h | 14 ++++++ src/hob_struct.h | 113 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 280 insertions(+), 43 deletions(-) delete mode 100644 src/Model-Extractor.h create mode 100644 src/errors_types.h create mode 100644 src/hob_parser.c create mode 100644 src/hob_parser.h create mode 100644 src/hob_struct.h diff --git a/src/Model-Extractor.c b/src/Model-Extractor.c index 461d125..011fb51 100644 --- a/src/Model-Extractor.c +++ b/src/Model-Extractor.c @@ -1,47 +1,102 @@ /* ================================================================================ - Name : Map-Extractor.c + Name : Model-Extractor.c Author : JackCarterSmith License : GPL-v3.0 - Description : DAT textures extractor to PNG format with enhanced function in C + Description : HOB model parser and export to Waveform OBJ format. ================================================================================ */ -#include "Model-Extractor.h" +#include +#include +#include +#if defined(_WIN32) + #include +#else + #include + #include +#endif +#include "errors_types.h" +#include "config.h" +#include "options.h" +#include "hob_struct.h" +#include "hob_parser.h" #include "rlk/obj.h" +/* + * Internal functions declarations + */ + +unsigned int mainProcess(int args_cnt, char *args_value[]); +void createSubDir(char *dirName); +int checkInputArgs(int arg_nbr, char *args[]); +//int exportTextures(HMT_FILE *hmt_f, char *filename); +void dispHelp(); + + +/* + * Global variables declaration + */ + int _options; // Global options settings variable + +/* + * - MAIN - + */ int main(int argc, char *argv[]) { // Init buffer vars - int file_index; - printf("\n*** RogueSquadron Extractor (RSE) - MAP module - v%s ***\n", VERSION); + + printf("\n*** RogueSquadron Extractor (RSE) - MODEL module - v%s ***\n", VERSION); // Check if filenames arguments exist if (argc < 2) { printf("\n[ERR] No input file/commands specified!\n"); dispHelp(); - return EXIT_FAILURE; //TODO: implement own error codes system + return ERROR_ARGS_NULL; } - _options = checkArgs(argv, argc); // Analyse program arguments - if (_options == -1) return EXIT_SUCCESS; + _options = checkInputArgs(argc, argv); // Analyse program arguments + if (_options == -1) return NO_ERROR; - // Do the work - for (file_index=(_options >> 8) & 0xFF; file_index> 8) & 0xFF; file_index < args_cnt; file_index++) + { + printf("\n=============================================\n[INFO] - Parsing file: %s ...\n", args_value[file_index]); + hobStruct = calloc(1, sizeof(T_HOB)); + // Parse data from HOB file and put in T_HOB structure. + if (parseHOBFile(args_value[file_index], hobStruct) != NO_ERROR) { + printf("[ERR] Failed to parse datas from %s\n", args_value[file_index]); + free(hobStruct); + return ERROR_PROCESS; + } + } + + free(hobStruct); + + + /* + if (exportTextures(hmt_fdatas, argv[file_index]) == EXIT_FAILURE) return EXIT_FAILURE; + purgeHMTFromMemory(hmt_fdatas); // Clean up memory (because I'm a good boy) + */ + + return NO_ERROR; +} + +int checkInputArgs(int arg_nbr, char *args[]) { int _o = 0x0002; // Default options parameters char test[256]; int i; @@ -86,6 +141,6 @@ void dispHelp() { printf("\n"); printf("Options:\n -h Print this message\n -v Activate verbose console output\n -no-subdir Extract textures inside current folder\n"); printf("\n"); - printf("Usage: RSE-Texture_%s [options] \n", VERSION); + printf("Usage: RSE-Model_%s [options] \n", VERSION); printf("\n"); } diff --git a/src/Model-Extractor.h b/src/Model-Extractor.h deleted file mode 100644 index bde7db8..0000000 --- a/src/Model-Extractor.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef MAP_EXTRACTOR_H_ -#define MAP_EXTRACTOR_H_ - -#include -#include -#include -#if defined(_WIN32) - #include -#else - #include - #include -#endif -#include "config.h" -#include "options.h" - - -void createSubDir(char *dirName); -int checkArgs(char *args[], int arg_nbr); -//int exportTextures(HMT_FILE *hmt_f, char *filename); -void dispHelp(); - -#endif diff --git a/src/errors_types.h b/src/errors_types.h new file mode 100644 index 0000000..e94fe6c --- /dev/null +++ b/src/errors_types.h @@ -0,0 +1,25 @@ +/* + * 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_ + +#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/src/hob_parser.c b/src/hob_parser.c new file mode 100644 index 0000000..9e34709 --- /dev/null +++ b/src/hob_parser.c @@ -0,0 +1,52 @@ +/* + * hob_parser.c + * + * Created on: 26 juil. 2022 + * Author: JackCarterSmith + */ + +#include +#include +#include "errors_types.h" +#include "options.h" +#include "hob_struct.h" +#include "hob_parser.h" + + +unsigned char parseHOBFile(const char* fileName, T_HOB* hob_struct) { + unsigned char err = NO_ERROR; + long fileSize; + FILE* fStream = NULL; + char* memFile = NULL; + + if (hob_struct != NULL && fileName != NULL) { + // Open file + fStream = fopen(fileName, "rb"); + + if (fStream != NULL) { + // Determine file size in bytes + fseek(fStream, 0, SEEK_END); + fileSize = ftell(fStream); + fseek(fStream, 0, SEEK_SET); + if (_options & VERBOSE_ENABLED) printf("\n[DBG] Input file size: %ld byte(s)\n", fileSize); + + memFile = malloc(fileSize + 1); + if (memFile != NULL) { + // Copy file in RAM + fread(memFile, fileSize, 1, fStream); + fclose(fStream); + hob_struct->obj_count = ((T_HOBFILE_HEADER *)memFile)->obj_count; + printf("[INFO] - Object(s) number: %d ...\n", hob_struct->obj_count); + } else { + fclose(fStream); + err = ERROR_MEMORY; + if (_options & VERBOSE_ENABLED) printf("\n[ERR] Can't allocate enough memory for file processing!\n"); + } + } else { + err = ERROR_IO; + if (_options & VERBOSE_ENABLED) printf("\n[ERR] Input file %s not found!\n", fileName); + } + } else err = ERROR_ARGS_NULL; + + return err; +} diff --git a/src/hob_parser.h b/src/hob_parser.h new file mode 100644 index 0000000..6b918bf --- /dev/null +++ b/src/hob_parser.h @@ -0,0 +1,14 @@ +/* + * hob_parser.h + * + * Created on: 26 juil. 2022 + * Author: JackCarterSmith + */ + + +#ifndef SRC_HOB_PARSER_H_ +#define SRC_HOB_PARSER_H_ + +unsigned char parseHOBFile(const char* fileName, T_HOB* hob_struct); + +#endif /* SRC_HOB_PARSER_H_ */ diff --git a/src/hob_struct.h b/src/hob_struct.h new file mode 100644 index 0000000..b72d3d3 --- /dev/null +++ b/src/hob_struct.h @@ -0,0 +1,113 @@ +/* + * hob_struct.h + * + * Created on: 26 juil. 2022 + * Author: JackCarterSmith + */ + +#ifndef SRC_HOB_STRUCT_H_ +#define SRC_HOB_STRUCT_H_ + + +/////////////////////////////////////////////////////////////////////////////// +// HOB file structure +/////////////////////////////////////////////////////////////////////////////// + +typedef unsigned int T_RGBA; + +typedef struct tex_coord { unsigned short u,v; } T_TEXCOORD; + +typedef struct hob_face { + unsigned int flags; + unsigned char b1; + unsigned char b2; + unsigned char b3; + unsigned char bsize; + unsigned char ftype; // 3-Tri / 4-Quad + unsigned __int64 material_index; //TODO: verify for 64bits width and adapt MinGW dependancy to __int64 + unsigned __int64 indices[4]; //TODO: verify for 64bits width and adapt MinGW dependancy to __int64 + 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 face_count; + T_HOB_FACE* faces; + + unsigned int vertex_count; + unsigned short* vertices; +} T_HOB_FACE_GROUP; + +typedef struct hob_object { + unsigned char name[16]; + unsigned int face_group_offset; + unsigned int face_group_header_offset; + unsigned int face_group_header2_offset; + + unsigned int face_group_count; + unsigned int face_group_count0; + + T_HOB_FACE_GROUP* face_groups; +} 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 +/////////////////////////////////////////////////////////////////////////////// + +typedef struct __attribute__((packed)) hobfile_header { + unsigned int obj_count; + unsigned int vertices_offset; +} T_HOBFILE_HEADER; + +typedef struct __attribute__((packed)) hobfile_obj_descriptor { + unsigned char object_name[16]; + unsigned int facegroup_header_offset; + unsigned int object_parts_offset; + unsigned int facegroup_header_2_offset; + + unsigned int reserved1; // 12B of zeros + unsigned int reserved2; + unsigned int reserved3; + + unsigned int unknow1; + unsigned int unknow2; + unsigned int unknow3; + float unknow4; + + unsigned int reserved4; // 12B of zeros + unsigned int reserved5; + unsigned int reserved6; + + float reserved7; + float reserved8; + float reserved9; + float reserved10; + float reserved11; + unsigned int end_mask; // Always equal to 0xFFFFFFFF + float reserved12; + float reserved13; + float reserved14; + float reserved15; + float reserved16; + float reserved17; +} T_HOBFILE_OBJ_DESCRIPTOR; + +#endif /* SRC_HOB_STRUCT_H_ */