/* * hob_struct.h * * Created on: 26 juil. 2022 * Author: JackCarterSmith */ #ifndef SRC_HOB_STRUCT_H_ #define SRC_HOB_STRUCT_H_ /* * long = 64bits??? * int = 32bits * short = 16bits * car = 8bits */ /////////////////////////////////////////////////////////////////////////////// // HOB file structure /////////////////////////////////////////////////////////////////////////////// typedef unsigned int T_RGBA; 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 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 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_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 unknown1; unsigned int unknown2; unsigned int unknown3; float unknown4; 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; typedef struct __attribute__((packed)) hobfile_facegroup_header { unsigned short facegroup_count; unsigned short facegroup_count0; } T_HOBFILE_FACEGROUP_HEADER; typedef struct __attribute__((packed)) hobfile_facegroup_offset { unsigned int unknown1; unsigned int facegroup_offset; } T_HOBFILE_FACEGROUP_OFFSET; typedef struct __attribute__((packed)) hobfile_meshdef0_0 { unsigned int next_meshdef0_offset; unsigned int prev_meshdef0_offset_unsure; unsigned int offset_beginning_if_not_first; unsigned int offset_end_if_next_equal_0; unsigned int meshdef1_offset_plus_4; unsigned int reserved1; // 8B of zeros unsigned int reserved2; } T_HOBFILE_MESHDEF0_0; typedef struct __attribute__((packed)) hobfile_meshdef0_1 { float unknown1; unsigned int reserved1; // 12B of zeros unsigned int reserved2; unsigned int reserved3; } T_HOBFILE_MESHDEF0_1; typedef struct __attribute__((packed)) hobfile_meshdef0_2 { unsigned int Unknown1; float unknown2; // Can be a vector??? float unknown3; float unknown4; float unknown5; // Can be a vector??? float unknown6; float unknown7; float unknown8; // Can be a matrix??? float unknown9; float unknown10; float unknown11; float unknown12; // Can be a vector??? float unknown13; float unknown14; } T_HOBFILE_MESHDEF0_2; typedef struct __attribute__((packed)) 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 __attribute__((packed)) hobfile_faceblock { unsigned int reserved1; // 8B of zeros unsigned int reserved2; unsigned int facesOffset; unsigned int faceCounts; } T_HOBFILE_FACEBLOCK; typedef struct __attribute__((packed)) hobfile_faces_header { unsigned int flags; unsigned char b1; 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 __attribute__((packed)) hobfile_faces_extra_vertex_color { T_RGBA v1_rgba; T_RGBA v2_rgba; T_RGBA v3_rgba; T_RGBA v4_rgba; // Used with quad type face } T_HOBFILE_FACES_VERTEX_COLOR; typedef struct __attribute__((packed)) hobfile_faces_extra_color { T_RGBA rgba; } T_HOBFILE_FACES_COLOR; typedef struct __attribute__((packed)) hobfile_faces_extra_vertex_texture { T_TEXCOORD v1_texcoord; // Should be divided (no shifting) by 4096 to get 0...1 range T_TEXCOORD v2_texcoord; T_TEXCOORD v3_texcoord; T_TEXCOORD v4_texcoord; // Used with quad type face } T_HOBFILE_FACES_VERTEX_TEXTURE; typedef struct __attribute__((packed)) hobfile_vertex { short x; short y; short z; short w; } T_HOBFILE_VERTEX; #endif /* SRC_HOB_STRUCT_H_ */