Obj exporter include divide by 1024 (10bits rsh), keep this value in mind during parsing
272 lines
9.1 KiB
C
272 lines
9.1 KiB
C
/**
|
|
* @file hob_struct.h
|
|
* @date 18/09/2023
|
|
* @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 object_parts2_offset; // Optional offset - seem present in tieinter_HOB - point just after the 0xFFFFFFFF of the first one
|
|
unsigned int object_parts2_offset2; // Optional offset - seem present in tieinter_HOB
|
|
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, present in koelsch. worddevastator can have more answers...
|
|
unsigned int properties_offset; // Offset to different string (a_b/zf/zt/zb/etc.) Animation datas ? Empty with 6x float in train_hob, a_b object is canon beams in gun_turret
|
|
|
|
float unknown4; // 1.0F/1.125F - Look forward angle correction?
|
|
|
|
unsigned int reserved4; // 12B of zeros
|
|
unsigned int reserved5;
|
|
unsigned int reserved6;
|
|
|
|
float unknown5; // Something related to culling camera frustum (when reduced value, the gun_turret didn't render before getting out of camera view)
|
|
float unknown6; // Something related to collision detection (bigger float >100.0f)
|
|
|
|
float reserved7; // Something related to collision detection Translation matrix? Center of object?
|
|
float reserved8; // Something related to collision detection Translation matrix? Center of object?
|
|
float reserved9; // Something related to collision detection Translation matrix? Center of object?
|
|
|
|
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;
|
|
|
|
|
|
/*
|
|
* T_HOBFILE_OBJPARTS_HEADER
|
|
* |
|
|
* \
|
|
* |T_HOBFILE_OBJPART_HEADER
|
|
* \
|
|
* T_HOBFILE_OBJPART_HEADER
|
|
* |
|
|
* \
|
|
* |T_HOBFILE_FACEGROUP_HEADER
|
|
* \
|
|
* T_HOBFILE_FACEGROUP_HEADER
|
|
*/
|
|
typedef struct PACK hobfile_objparts_header {
|
|
unsigned short object_part_count;
|
|
unsigned short facegroup_count; //aka. meshdef count
|
|
} T_HOBFILE_OBJPARTS_HEADER;
|
|
|
|
typedef struct PACK hobfile_objpart_header {
|
|
unsigned int unknown0; // It is flags?
|
|
unsigned int facegroup_offset;
|
|
} T_HOBFILE_OBJPART_HEADER;
|
|
|
|
/* TODO: Not sure these exist
|
|
typedef struct PACK hobfile_facegroup_header_2 { //TODO: This is part of a bigger one
|
|
unsigned short object_part_count;
|
|
unsigned short facegroup_count;
|
|
} T_HOBFILE_FACEGROUP_HEADER_2;
|
|
|
|
typedef struct PACK hobfile_facegroup_offset_2 { //TODO: This is part of a bigger one
|
|
unsigned int unknownOffset0;
|
|
} T_HOBFILE_FACEGROUP_OFFSET_2;
|
|
*/
|
|
|
|
typedef struct PACK hobfile_objparts_nameid {
|
|
unsigned char name[8];
|
|
unsigned char unknown0; // Always zeros ?
|
|
unsigned char id;
|
|
} T_HOBFILE_OBJPARTS_NAMEID;
|
|
|
|
/* TODO:
|
|
typedef struct PACK hobfile_effects {
|
|
unsigned char something0;
|
|
unsigned short something1;
|
|
} T_HOBFILE_EFFECTS;
|
|
*/
|
|
|
|
typedef struct PACK hobfile_meshdef0 {
|
|
unsigned int offset1; // Brothers meshdef?
|
|
unsigned int offset2; // Brothers meshdef?
|
|
unsigned int parent_meshdef0_offset;
|
|
unsigned int children_meshdef0_offset;
|
|
unsigned int meshdef1_offset_plus_4;
|
|
|
|
unsigned int reserved1; // 8B of zeros
|
|
unsigned int reserved2;
|
|
|
|
float unknown3; // Always 1.0f?
|
|
|
|
unsigned int reserved3; // 12B of zeros
|
|
unsigned int reserved4;
|
|
unsigned int reserved5;
|
|
|
|
float unknown4; // Always 1.0f?
|
|
|
|
unsigned int reserved6; // 12B of zeros
|
|
unsigned int reserved7;
|
|
unsigned int reserved8;
|
|
|
|
float unknown5; // Always 1.0f?
|
|
|
|
unsigned int reserved9; // 12B of zeros
|
|
unsigned int reserved10;
|
|
unsigned int reserved11;
|
|
|
|
unsigned int vecsFlags; // Enabled local transforms (bit0=offset #1; bit1=scale #2; bit2=rotation #3; bit3=translation;)
|
|
|
|
float offsett_x; // Offset transform (aka. reverse translation)
|
|
float offsett_y;
|
|
float offsett_z;
|
|
|
|
float scalet_x; // Local transform - Scale
|
|
float scalet_y;
|
|
float scalet_z;
|
|
|
|
float rott_x; // Local transform - Rotation
|
|
float rott_y;
|
|
float rott_z;
|
|
|
|
float unknown16; // Always 0?
|
|
|
|
float transt_x; // Local transform - Translation
|
|
float transt_y;
|
|
float transt_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; // Seem to alter texture mapping on face, 49 -> quad face, 48 -> tri face, 47 -> N/A
|
|
unsigned char b2; // 61 -> texture right rotation, 71 -> little red overlay, 81 -> bigger red overlay, x1 -> don't do anything
|
|
unsigned char b3; // Seem to alter rendering matrix or maybe vertices position relative to
|
|
unsigned char faceBlockIntSize; // Bytes size divided by 4, count as number of UInt32 type.
|
|
unsigned short headerSeparator; // If header it's uncommon, it's probably because you made a wrong parsing
|
|
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_ */
|