293 lines
6.8 KiB
C
293 lines
6.8 KiB
C
/*
|
|
* 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
|
|
*/
|
|
|
|
#if defined(_MSC_VER)
|
|
#define PACK
|
|
#elif defined(__GNUC__)
|
|
#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!
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#if defined(_MSC_VER)
|
|
#pragma pack(push, 1)
|
|
#endif
|
|
|
|
typedef struct PACK hobfile_header {
|
|
unsigned int obj_count;
|
|
unsigned int vertices_offset;
|
|
} T_HOBFILE_HEADER;
|
|
|
|
typedef struct PACK 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 unknownOffset1;
|
|
unsigned int unknownOffset2;
|
|
unsigned int unknownOffset3;
|
|
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 PACK hobfile_facegroup_header {
|
|
unsigned short object_part_count;
|
|
unsigned short facegroup_count;
|
|
} T_HOBFILE_FACEGROUP_HEADER;
|
|
|
|
typedef struct PACK hobfile_facegroup_offset {
|
|
unsigned int unknown1;
|
|
unsigned int facegroup_offset;
|
|
} T_HOBFILE_FACEGROUP_OFFSET;
|
|
|
|
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;
|
|
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_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 PACK hobfile_faces_extra_color {
|
|
T_RGBA rgba;
|
|
} T_HOBFILE_FACES_COLOR;
|
|
|
|
typedef struct PACK 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 PACK hobfile_vertex {
|
|
short x;
|
|
short y;
|
|
short z;
|
|
short w;
|
|
} T_HOBFILE_VERTEX;
|
|
|
|
#if defined(_MSC_VER)
|
|
#pragma pack(pop)
|
|
#endif
|
|
|
|
#endif /* SRC_HOB_STRUCT_H_ */
|