/** * @file hob_struct.h * @date 26/07/2022 * @author JackCarterSmith * @copyright GPL-v3.0 * @brief HOB file mapping definition. * */ #ifndef RSPMODELLIB_HOB_STRUCT_H_ #define RSPMODELLIB_HOB_STRUCT_H_ /* * long = 64bits??? * int = 32bits * short = 16bits * car = 8bits */ #if defined(_MSC_VER) #define PACK #elif defined(__GNUC__) #define PACK __attribute__((packed)) #endif /////////////////////////////////////////////////////////////////////////////// // Declaration of Memory Mapped Structure // Caution: the place of variable is important for correct mapping! /////////////////////////////////////////////////////////////////////////////// #if defined(_MSC_VER) #pragma pack(push, 1) #endif /* * - Global HOB file structure- * +------------------+--------------------------------------+----------------------------------------+ * | T_HOBFILE_HEADER | obj_count * T_HOBFILE_OBJ_DESCRIPTOR | obj_count * T_HOBFILE_FACEGROUP_HEADER | --> * +------------------+--------------------------------------+----------------------------------------+ * * - Facegroup sub-structure - * +------------------------------+--------------------------------------------------+ * --> | T_HOBFILE_FACEGROUP_HEADER_1 | object_part_count * T_HOBFILE_FACEGROUP_OFFSET_1 | * +------------------------------+--------------------------------------------------+ * * - Facegroup sub-structure 2 - * +------------------------------+------------------------------------------------------------------------+--------------------------------------------------------+ * | T_HOBFILE_FACEGROUP_HEADER_2 | ( object_part_count + facegroup_count ) * T_HOBFILE_FACEGROUP_OFFSET_2 | ( object_part_count - 1 ) * T_HOBFILE_FACEGROUP_NAMEID | + padding * +------------------------------+------------------------------------------------------------------------+--------------------------------------------------------+ */ typedef struct PACK hobfile_header { unsigned int obj_count; unsigned int vertices_offset; } T_HOBFILE_HEADER; typedef struct PACK hobfile_obj_header { unsigned char object_name[16]; // Name of the object unsigned int facegroup_start_offset; // First facegroup datas offset. Look in T_HOBFILE_FACEGROUP_HEADER for all offsets of facegroups of the current object. unsigned int object_parts_offset; // Object parts descriptor offset unsigned int object_parts_offset2; // Facegroup descriptor offset (subpart of Object parts descriptor) unsigned int opt_offset1; // Optional offset - empty on last obj_header - point to after end mask ffffff of current bloc unsigned int opt_offset2; // Optional offset - empty on last obj_header - point to after the previous opt_offset1 unsigned int reserved1; // Always zeros ? unsigned int subparts_namelist_offset; // Point to an array of string value (8 chars) + ID (2 chars - 1 to obj_parts-1). Seem like name of articulation points (some have name like "node_86"). unsigned int effects_offset; // Empty in gun_turret and no datas after, xwing have 0x5006. worddevastator should have the answer... unsigned int properties_offset; // Offset to different string (a_b/zf/zt/zb/etc.) Animation datas ? Empty with 6x float in train_hob float unknown4; // Probably scale: 1.0F/1.125F unsigned int reserved4; // 12B of zeros unsigned int reserved5; unsigned int reserved6; float unknown5; //Scale? ~20.0F float unknown6; //Scale? ~77-418.0F float reserved7; //Translation matrix? Center of object? float reserved8; float reserved9; unsigned int footer_offset; //To redefine, seem to be a copy of following bounding box? Maybe there are 2 box: render and collision? float bbox_start_x; // Bounding box start vector float bbox_start_y; float bbox_start_z; float bbox_end_x; // Bounding box start vector float bbox_end_y; float bbox_end_z; } T_HOBFILE_OBJ_HEADER; typedef struct PACK hobfile_facegroup_header_1 { unsigned short object_part_count; unsigned short facegroup_count; } T_HOBFILE_FACEGROUP_HEADER_1; typedef struct PACK hobfile_facegroup_offset_1 { unsigned int unknown0; // Flags? unsigned int facegroup_offset; } T_HOBFILE_FACEGROUP_OFFSET_1; typedef struct PACK hobfile_facegroup_header_2 { unsigned short object_part_count; unsigned short facegroup_count; } T_HOBFILE_FACEGROUP_HEADER_2; typedef struct PACK hobfile_facegroup_offset_2 { unsigned int unknownOffset0; } T_HOBFILE_FACEGROUP_OFFSET_2; typedef struct PACK hobfile_facegroup_nameid { unsigned char name[8]; unsigned short id; } T_HOBFILE_FACEGROUP_NAMEID; typedef struct PACK hobfile_meshdef0 { unsigned int offset1; unsigned int offset2; unsigned int prev_meshdef0_offset; unsigned int next_meshdef0_offset; unsigned int meshdef1_offset_plus_4; unsigned int reserved1; // 8B of zeros unsigned int reserved2; float unknown3; unsigned int reserved3; // 12B of zeros unsigned int reserved4; unsigned int reserved5; float unknown4; unsigned int reserved6; // 12B of zeros unsigned int reserved7; unsigned int reserved8; float unknown5; unsigned int reserved9; // 12B of zeros unsigned int reserved10; unsigned int reserved11; unsigned int object_id; float unknown12; // Can be a vector??? float unknown13; float unknown14; float unknown15; // Can be a vector??? float unknown16; float unknown17; float unknown18; // Can be a matrix??? float unknown19; float unknown20; float unknown21; float transform_x; float transform_y; float transform_z; } T_HOBFILE_MESHDEF0; typedef struct PACK hobfile_meshdef1 { unsigned int facedef_end_offset; unsigned int reserved1; // 20B of zeros unsigned int reserved2; unsigned int reserved3; unsigned int reserved4; unsigned int reserved5; unsigned int vertex_count; unsigned int unknown1; unsigned int reserved6; unsigned int faceblock_offset; unsigned int vertexblocks_offset; unsigned int reserved7; // 52B of zeros unsigned int reserved8; unsigned int reserved9; unsigned int reserved10; unsigned int reserved11; unsigned int reserved12; unsigned int reserved13; unsigned int reserved14; unsigned int reserved15; unsigned int reserved16; unsigned int reserved17; unsigned int reserved18; unsigned int reserved19; } T_HOBFILE_MESHDEF1; typedef struct PACK hobfile_faceblock { unsigned int reserved1; // 8B of zeros unsigned int reserved2; unsigned int facesOffset; unsigned int faceCounts; } T_HOBFILE_FACEBLOCK; typedef struct PACK hobfile_faces_header { unsigned int flags; unsigned char b1; // 74 = transparent / 75 = opaque unsigned char b2; unsigned char b3; unsigned char faceBlockIntSize; // Bytes size divided by 4, count as number of UInt32 type. unsigned short headerSeparator; unsigned short materialIndex; unsigned short vertexIndices[4]; // Relative to facegroup, the last value is equal to 0 when it's triangle shape. } T_HOBFILE_FACES_HEADER; typedef struct PACK hobfile_faces_extra_vertex_color { T_RSPMODEL_RGBA v1_rgba; T_RSPMODEL_RGBA v2_rgba; T_RSPMODEL_RGBA v3_rgba; T_RSPMODEL_RGBA v4_rgba; // Used with quad type face } T_HOBFILE_FACES_VERTEX_COLOR; typedef struct PACK hobfile_faces_extra_color { T_RSPMODEL_RGBA rgba; } T_HOBFILE_FACES_COLOR; typedef struct PACK hobfile_faces_extra_vertex_texture { T_RSPMODEL_TEXCOORD v1_texcoord; // Should be divided (no shifting) by 4096 to get 0...1 range T_RSPMODEL_TEXCOORD v2_texcoord; T_RSPMODEL_TEXCOORD v3_texcoord; T_RSPMODEL_TEXCOORD v4_texcoord; // Used with quad type face } T_HOBFILE_FACES_VERTEX_TEXTURE; typedef struct PACK hobfile_vertex { short x; short y; short z; short w; } T_HOBFILE_VERTEX; #if defined(_MSC_VER) #pragma pack(pop) #endif #endif /* RSPMODELLIB_HOB_STRUCT_H_ */