/** * @file hmp_struct.h * @date 05/02/2023 * @author JackCarterSmith * @copyright GPL-v3.0 * @brief HMP file mapping definition. * */ #ifndef RSPTERRAINLIB_HMP_STRUCT_H_ #define RSPTERRAINLIB_HMP_STRUCT_H_ /* * long = 64bits??? (8 Bytes) * int = 32bits (4 Bytes) * short = 16bits (2 Bytes) * char = 8bits (1 Bytes) */ #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 HMP file structure- * +------------------+-----------------------------------------+----------------------+----------------------------+ * | T_HMPFILE_HEADER | (width_BLK*height_BLK) * T_TILE_INDICES | T_HMPFILE_LIGHTDATAS | obj_count * T_HMPFILE_TILE | * +------------------+-----------------------------------------+----------------------+----------------------------+ * */ typedef struct PACK hmpfile_header { unsigned int reserved0; //12B of zeros unsigned int reserved1; unsigned int reserved2; float reserved3; // Always 0x3F000000 float height_scale; float reserved4; // Always 0x3F000000 unsigned short tiles_count; unsigned short textures_count; /* * #Thanaclara * *textures_count* note - Some levels contain tiles with an animation for a texture. * This animation consists of multiple textures, or "frames" for the animation. * However each animation counts only as 1 towards the terrain texture count. * An example of an animated terrain texture is a tile that is textured to look like water. */ unsigned int tiles_start_offset; unsigned int lighting_datas_offset; unsigned short width_BLK; unsigned short height_BLK; } T_HMPFILE_HEADER; typedef struct PACK global_light_obj { T_R8G8B8A8 shadow_color; T_R8G8B8A8 world_light_color; T_R8G8B8_F terrain_light_color; unsigned int reserved0; // 4B of zeros T_RSPTERRAIN_VECTOR3 terrain_light_normal; unsigned int reserved1; // 4B of zeros } T_HMPFILE_GLOBALLIGHT; typedef struct PACK light_shadow_obj { /* * In light mode higher values = brighter light * Shadow mode is inverted, higher values = darker shadows * but the inversion also extends to the shadow color (i.e if you * want to make a blue shadow you would need to set the blue * channel to 0.0f and the red and green channel to 255.0f */ T_R8G8B8_F light_color; unsigned char activated; unsigned char shadow_mode; unsigned char intensity_boost; unsigned char unknown0; T_RSPTERRAIN_VECTOR3 light_position; float light_scale; } T_HMPFILE_LSO; typedef struct PACK lighting_datas { // Lights and shadows object count unsigned int ls_obj_count; T_HMPFILE_GLOBALLIGHT global_light; T_HMPFILE_LSO* pLSO; // array size = (ls_obj_count - 1) because global_light count as a light element } T_HMPFILE_LIGHTDATAS; typedef unsigned short T_TILE_INDICES; typedef struct PACK hmpfile_tile { unsigned short texmap_id; unsigned char unknown0; unsigned char low_height; // LOD application? Clipping? Terrain render quadrants? unsigned char high_height; unsigned char height_values[5][5]; // first and last row/column overlap with a neighboring tile, "glue" for tiles, need to be identical to avoid "hill" effect } T_HMPFILE_TILE; #if defined(_MSC_VER) #pragma pack(pop) #endif #endif /* RSPTERRAINLIB_HMP_STRUCT_H_ */