|
|
|
@ -60,10 +60,10 @@ unsigned char parseHOBFile(const char* fileName, T_HOB* hob_struct) {
|
|
|
|
|
+ sizeof(T_HOBFILE_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_OBJ_DESCRIPTOR) * i))->facegroup_offset;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Face group offset: 0x%X\n", hob_struct->objects[i].face_group_offset);
|
|
|
|
|
hob_struct->objects[i].face_group_header_offset = ((T_HOBFILE_OBJ_DESCRIPTOR *)(memFile
|
|
|
|
|
hob_struct->objects[i].object_part_header_offset = ((T_HOBFILE_OBJ_DESCRIPTOR *)(memFile
|
|
|
|
|
+ sizeof(T_HOBFILE_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_OBJ_DESCRIPTOR) * i))->object_parts_offset;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Face group header/object parts offset: 0x%X\n", hob_struct->objects[i].face_group_header_offset);
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Face group header/object parts offset: 0x%X\n", hob_struct->objects[i].object_part_header_offset);
|
|
|
|
|
hob_struct->objects[i].face_group_header2_offset = ((T_HOBFILE_OBJ_DESCRIPTOR *)(memFile
|
|
|
|
|
+ sizeof(T_HOBFILE_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_OBJ_DESCRIPTOR) * i))->facegroup_header_2_offset;
|
|
|
|
@ -71,85 +71,104 @@ unsigned char parseHOBFile(const char* fileName, T_HOB* hob_struct) {
|
|
|
|
|
|
|
|
|
|
// Get count and offsets from the facegroup header
|
|
|
|
|
hob_struct->objects[i].face_group_count = ((T_HOBFILE_FACEGROUP_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_group_header_offset))->facegroup_count;
|
|
|
|
|
+ hob_struct->objects[i].object_part_header_offset))->facegroup_count;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Face group count: %d\n", hob_struct->objects[i].face_group_count);
|
|
|
|
|
hob_struct->objects[i].face_group_count0 = ((T_HOBFILE_FACEGROUP_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_group_header_offset))->facegroup_count0;
|
|
|
|
|
+ hob_struct->objects[i].object_part_header_offset))->facegroup_count0;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Face group count0: %d\n", hob_struct->objects[i].face_group_count0);
|
|
|
|
|
if (hob_struct->objects[i].face_group_count != hob_struct->objects[i].face_group_count0 && (_options & VERBOSE_ENABLED)) printf("[DBG] > Facegroup count are different!\n");
|
|
|
|
|
|
|
|
|
|
// Get facegroup datas
|
|
|
|
|
offset_index = calloc(hob_struct->objects[i].face_group_count, sizeof(int));
|
|
|
|
|
hob_struct->objects[i].face_groups = calloc(hob_struct->objects[i].face_group_count, sizeof(T_HOB_FACE_GROUP));
|
|
|
|
|
hob_struct->objects[i].object_parts = calloc(hob_struct->objects[i].face_group_count, sizeof(T_HOB_FACE_GROUP));
|
|
|
|
|
for ( j = 0; j < hob_struct->objects[i].face_group_count; j++ ) {
|
|
|
|
|
offset_index[j] = ((T_HOBFILE_FACEGROUP_OFFSET *)(memFile + hob_struct->objects[i].face_group_header_offset
|
|
|
|
|
offset_index[j] = ((T_HOBFILE_FACEGROUP_OFFSET *)(memFile + hob_struct->objects[i].object_part_header_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEGROUP_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEGROUP_OFFSET) * j))->facegroup_offset;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("\n[DBG] > Face group meshdef0 offset: 0x%X\n", offset_index[j]);
|
|
|
|
|
|
|
|
|
|
// Get meshdef1 (mesh descriptor) offset
|
|
|
|
|
hob_struct->objects[i].face_groups[j].meshdef1_offset = ((T_HOBFILE_MESHDEF0_0 *)(memFile
|
|
|
|
|
+ offset_index[j]))->meshdef1_offset_plus_4;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Face group meshdef1 offset: 0x%X\n", hob_struct->objects[i].face_groups[j].meshdef1_offset);
|
|
|
|
|
// Get meshdef0 datas
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("\n[DBG] > Next meshdef0 offset: 0x%X",((T_HOBFILE_MESHDEF0 *)(memFile + offset_index[j]))->next_meshdef0_offset);
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("\n[DBG] > Prev meshdef0 offset: 0x%X",((T_HOBFILE_MESHDEF0 *)(memFile + offset_index[j]))->prev_meshdef0_offset);
|
|
|
|
|
hob_struct->objects[i].object_parts[j].id = ((T_HOBFILE_MESHDEF0 *)(memFile + offset_index[j]))->object_id;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("\n[DBG] > Facegroup/object ID: %d\n", hob_struct->objects[i].object_parts[j].id);
|
|
|
|
|
hob_struct->objects[i].object_parts[j].transform.x = ((T_HOBFILE_MESHDEF0 *)(memFile + offset_index[j]))->transform_x;
|
|
|
|
|
hob_struct->objects[i].object_parts[j].transform.y = ((T_HOBFILE_MESHDEF0 *)(memFile + offset_index[j]))->transform_y;
|
|
|
|
|
hob_struct->objects[i].object_parts[j].transform.z = ((T_HOBFILE_MESHDEF0 *)(memFile + offset_index[j]))->transform_z;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("\n[DBG] > Facegroup/object transform matrix: [%.8f %.8f %.8f]\n",
|
|
|
|
|
hob_struct->objects[i].object_parts[j].transform.x,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].transform.y,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].transform.z
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (hob_struct->objects[i].face_groups[j].meshdef1_offset > 0) {
|
|
|
|
|
// Get meshdef1 (mesh descriptor) offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].meshdef1_offset = ((T_HOBFILE_MESHDEF0 *)(memFile
|
|
|
|
|
+ offset_index[j]))->meshdef1_offset_plus_4;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Face group meshdef1 offset: 0x%X\n", hob_struct->objects[i].object_parts[j].meshdef1_offset);
|
|
|
|
|
|
|
|
|
|
if( ((T_HOBFILE_MESHDEF0 *)(memFile + offset_index[j]))->reserved1 != 0 ||
|
|
|
|
|
((T_HOBFILE_MESHDEF0 *)(memFile + offset_index[j]))->reserved2 != 0 ) {
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Face group meshdef0: no 0!\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hob_struct->objects[i].object_parts[j].meshdef1_offset > 0) {
|
|
|
|
|
// Read meshdef1 datas
|
|
|
|
|
hob_struct->objects[i].face_groups[j].face_block_end_offset = ((T_HOBFILE_MESHDEF1 *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].meshdef1_offset - 4))->facedef_end_offset;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].vertex_count = ((T_HOBFILE_MESHDEF1 *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].meshdef1_offset - 4))->vertex_count;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].face_block_offset = ((T_HOBFILE_MESHDEF1 *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].meshdef1_offset - 4))->faceblock_offset;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Faces offset: 0x%X\n", hob_struct->objects[i].face_groups[j].face_block_offset);
|
|
|
|
|
hob_struct->objects[i].face_groups[j].vertex_block_offset = ((T_HOBFILE_MESHDEF1 *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].meshdef1_offset - 4))->vertexblocks_offset;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Vertex offset: 0x%X\n\n", hob_struct->objects[i].face_groups[j].vertex_block_offset);
|
|
|
|
|
hob_struct->objects[i].object_parts[j].face_block_end_offset = ((T_HOBFILE_MESHDEF1 *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].meshdef1_offset - 4))->facedef_end_offset;
|
|
|
|
|
hob_struct->objects[i].object_parts[j].vertex_count = ((T_HOBFILE_MESHDEF1 *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].meshdef1_offset - 4))->vertex_count;
|
|
|
|
|
hob_struct->objects[i].object_parts[j].face_block_offset = ((T_HOBFILE_MESHDEF1 *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].meshdef1_offset - 4))->faceblock_offset;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Faces offset: 0x%X\n", hob_struct->objects[i].object_parts[j].face_block_offset);
|
|
|
|
|
hob_struct->objects[i].object_parts[j].vertex_block_offset = ((T_HOBFILE_MESHDEF1 *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].meshdef1_offset - 4))->vertexblocks_offset;
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Vertex offset: 0x%X\n\n", hob_struct->objects[i].object_parts[j].vertex_block_offset);
|
|
|
|
|
|
|
|
|
|
// Get face datas
|
|
|
|
|
if( ((T_HOBFILE_FACEBLOCK *)(memFile + hob_struct->objects[i].face_groups[j].face_block_offset))->reserved1 != 0 ||
|
|
|
|
|
((T_HOBFILE_FACEBLOCK *)(memFile + hob_struct->objects[i].face_groups[j].face_block_offset))->reserved2 != 0 ) {
|
|
|
|
|
if( ((T_HOBFILE_FACEBLOCK *)(memFile + hob_struct->objects[i].object_parts[j].face_block_offset))->reserved1 != 0 ||
|
|
|
|
|
((T_HOBFILE_FACEBLOCK *)(memFile + hob_struct->objects[i].object_parts[j].face_block_offset))->reserved2 != 0 ) {
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Face block: uncommon zero header!\n");
|
|
|
|
|
}
|
|
|
|
|
if ( ((T_HOBFILE_FACEBLOCK *)(memFile + hob_struct->objects[i].face_groups[j].face_block_offset))->facesOffset !=
|
|
|
|
|
hob_struct->objects[i].face_groups[j].face_block_offset + sizeof(T_HOBFILE_FACEBLOCK)) {
|
|
|
|
|
if ( ((T_HOBFILE_FACEBLOCK *)(memFile + hob_struct->objects[i].object_parts[j].face_block_offset))->facesOffset !=
|
|
|
|
|
hob_struct->objects[i].object_parts[j].face_block_offset + sizeof(T_HOBFILE_FACEBLOCK)) {
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Face block: uncommon face data offset position!\n");
|
|
|
|
|
}
|
|
|
|
|
hob_struct->objects[i].face_groups[j].face_count = ((T_HOBFILE_FACEBLOCK *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset))->faceCounts;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces = calloc(hob_struct->objects[i].face_groups[j].face_count, sizeof(T_HOB_FACE));
|
|
|
|
|
hob_struct->objects[i].object_parts[j].face_count = ((T_HOBFILE_FACEBLOCK *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset))->faceCounts;
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces = calloc(hob_struct->objects[i].object_parts[j].face_count, sizeof(T_HOB_FACE));
|
|
|
|
|
facesExtraOffset = 0;
|
|
|
|
|
for ( k = 0; k < hob_struct->objects[i].face_groups[j].face_count; k++ ) {
|
|
|
|
|
for ( k = 0; k < hob_struct->objects[i].object_parts[j].face_count; k++ ) {
|
|
|
|
|
// Get flags
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].flags = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].flags = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->flags;
|
|
|
|
|
|
|
|
|
|
// Get unknown bytes
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].b1 = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].b1 = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->b1;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].b2 = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].b2 = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->b2;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].b3 = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].b3 = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->b3;
|
|
|
|
|
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].bsize = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].bsize = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->faceBlockIntSize * 4; // Multiply by 4 to get the bytes exact number
|
|
|
|
|
if (((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->headerSeparator != 0) {
|
|
|
|
@ -157,48 +176,48 @@ unsigned char parseHOBFile(const char* fileName, T_HOB* hob_struct) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get materials index
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].material_index = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].material_index = ((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->materialIndex;
|
|
|
|
|
|
|
|
|
|
// Get vertex indices
|
|
|
|
|
memcpy(hob_struct->objects[i].face_groups[j].faces[k].indices,
|
|
|
|
|
memcpy(hob_struct->objects[i].object_parts[j].faces[k].indices,
|
|
|
|
|
((T_HOBFILE_FACES_HEADER *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->vertexIndices,
|
|
|
|
|
sizeof(unsigned short) * 4);
|
|
|
|
|
|
|
|
|
|
// Recalculate the dynamic extra bytes offset size - if present
|
|
|
|
|
if (hob_struct->objects[i].face_groups[j].faces[k].flags_bits.fHasExtraBytesBeforeColor) facesExtraOffset += 8;
|
|
|
|
|
if (hob_struct->objects[i].object_parts[j].faces[k].flags_bits.fHasExtraBytesBeforeColor) facesExtraOffset += 8;
|
|
|
|
|
|
|
|
|
|
// Get vertex color - if present
|
|
|
|
|
if (hob_struct->objects[i].face_groups[j].faces[k].flags_bits.fHasColor) {
|
|
|
|
|
if (hob_struct->objects[i].face_groups[j].faces[k].flags_bits.fSeparateColorVertex) {
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[0] = ((T_HOBFILE_FACES_VERTEX_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
if (hob_struct->objects[i].object_parts[j].faces[k].flags_bits.fHasColor) {
|
|
|
|
|
if (hob_struct->objects[i].object_parts[j].faces[k].flags_bits.fSeparateColorVertex) {
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[0] = ((T_HOBFILE_FACES_VERTEX_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->v1_rgba;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[1] = ((T_HOBFILE_FACES_VERTEX_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[1] = ((T_HOBFILE_FACES_VERTEX_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->v2_rgba;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[2] = ((T_HOBFILE_FACES_VERTEX_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[2] = ((T_HOBFILE_FACES_VERTEX_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->v3_rgba;
|
|
|
|
|
if (hob_struct->objects[i].face_groups[j].faces[k].flags_bits.fIsQuad) {
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[3] = ((T_HOBFILE_FACES_VERTEX_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
if (hob_struct->objects[i].object_parts[j].faces[k].flags_bits.fIsQuad) {
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[3] = ((T_HOBFILE_FACES_VERTEX_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
@ -208,26 +227,26 @@ unsigned char parseHOBFile(const char* fileName, T_HOB* hob_struct) {
|
|
|
|
|
facesExtraOffset += sizeof(T_HOBFILE_FACES_VERTEX_COLOR) - sizeof(T_RGBA);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[0] = ((T_HOBFILE_FACES_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[0] = ((T_HOBFILE_FACES_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->rgba;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[1] = ((T_HOBFILE_FACES_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[1] = ((T_HOBFILE_FACES_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->rgba;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[2] = ((T_HOBFILE_FACES_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[2] = ((T_HOBFILE_FACES_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->rgba;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[3] = ((T_HOBFILE_FACES_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[3] = ((T_HOBFILE_FACES_COLOR *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
@ -237,28 +256,28 @@ unsigned char parseHOBFile(const char* fileName, T_HOB* hob_struct) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get UV map - if present
|
|
|
|
|
if (hob_struct->objects[i].face_groups[j].faces[k].flags_bits.fHasTexture) {
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[0] = ((T_HOBFILE_FACES_VERTEX_TEXTURE *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
if (hob_struct->objects[i].object_parts[j].faces[k].flags_bits.fHasTexture) {
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[0] = ((T_HOBFILE_FACES_VERTEX_TEXTURE *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->v1_texcoord;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[1] = ((T_HOBFILE_FACES_VERTEX_TEXTURE *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[1] = ((T_HOBFILE_FACES_VERTEX_TEXTURE *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->v2_texcoord;
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[2] = ((T_HOBFILE_FACES_VERTEX_TEXTURE *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[2] = ((T_HOBFILE_FACES_VERTEX_TEXTURE *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
|
+ facesExtraOffset))->v3_texcoord;
|
|
|
|
|
if (hob_struct->objects[i].face_groups[j].faces[k].flags_bits.fIsQuad) {
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[3] = ((T_HOBFILE_FACES_VERTEX_TEXTURE *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].face_block_offset
|
|
|
|
|
if (hob_struct->objects[i].object_parts[j].faces[k].flags_bits.fIsQuad) {
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[3] = ((T_HOBFILE_FACES_VERTEX_TEXTURE *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].face_block_offset
|
|
|
|
|
+ sizeof(T_HOBFILE_FACEBLOCK)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER)
|
|
|
|
|
+ sizeof(T_HOBFILE_FACES_HEADER) * k
|
|
|
|
@ -271,78 +290,78 @@ unsigned char parseHOBFile(const char* fileName, T_HOB* hob_struct) {
|
|
|
|
|
|
|
|
|
|
if (_options & VERBOSE_ENABLED) {
|
|
|
|
|
printf("[DBG] > Face %d details: 0x%X, %d, %d, %d, %d\n", k,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].flags,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].b1,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].b2,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].b3,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].bsize
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].flags,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].b1,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].b2,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].b3,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].bsize
|
|
|
|
|
);
|
|
|
|
|
printf("[DBG] - Type is Quad: %d\n", hob_struct->objects[i].face_groups[j].faces[k].flags_bits.fIsQuad);
|
|
|
|
|
printf("[DBG] - Material offset: 0x%X\n", hob_struct->objects[i].face_groups[j].faces[k].material_index);
|
|
|
|
|
printf("[DBG] - Type is Quad: %d\n", hob_struct->objects[i].object_parts[j].faces[k].flags_bits.fIsQuad);
|
|
|
|
|
printf("[DBG] - Material offset: 0x%X\n", hob_struct->objects[i].object_parts[j].faces[k].material_index);
|
|
|
|
|
printf("[DBG] - Vertex indices: %d, %d, %d, %d\n",
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].indices[0],
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].indices[1],
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].indices[2],
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].indices[3]
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].indices[0],
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].indices[1],
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].indices[2],
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].indices[3]
|
|
|
|
|
);
|
|
|
|
|
printf("[DBG] - Vertex colors: 0x%X, 0x%X, 0x%X, 0x%X\n",
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[0],
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[1],
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[2],
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].vertex_colors[3]
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[0],
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[1],
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[2],
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].vertex_colors[3]
|
|
|
|
|
);
|
|
|
|
|
printf("[DBG] - Vertex UV coord (divided by 4096):\n");
|
|
|
|
|
printf("[DBG] > %.8f(%d), %.8f(%d)\n",
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].face_groups[j].faces[k].tex_coords[0].u,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[0].u,
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].face_groups[j].faces[k].tex_coords[0].v,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[0].v
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].object_parts[j].faces[k].tex_coords[0].u,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[0].u,
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].object_parts[j].faces[k].tex_coords[0].v,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[0].v
|
|
|
|
|
);
|
|
|
|
|
printf("[DBG] > %.8f(%d), %.8f(%d)\n",
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].face_groups[j].faces[k].tex_coords[1].u,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[1].u,
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].face_groups[j].faces[k].tex_coords[1].v,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[1].v
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].object_parts[j].faces[k].tex_coords[1].u,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[1].u,
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].object_parts[j].faces[k].tex_coords[1].v,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[1].v
|
|
|
|
|
);
|
|
|
|
|
printf("[DBG] > %.8f(%d), %.8f(%d)\n",
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].face_groups[j].faces[k].tex_coords[2].u,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[2].u,
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].face_groups[j].faces[k].tex_coords[2].v,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[2].v
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].object_parts[j].faces[k].tex_coords[2].u,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[2].u,
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].object_parts[j].faces[k].tex_coords[2].v,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[2].v
|
|
|
|
|
);
|
|
|
|
|
printf("[DBG] > %.8f(%d), %.8f(%d)\n",
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].face_groups[j].faces[k].tex_coords[3].u,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[3].u,
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].face_groups[j].faces[k].tex_coords[3].v,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].faces[k].tex_coords[3].v
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].object_parts[j].faces[k].tex_coords[3].u,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[3].u,
|
|
|
|
|
((double) 1/4096) * hob_struct->objects[i].object_parts[j].faces[k].tex_coords[3].v,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].faces[k].tex_coords[3].v
|
|
|
|
|
);
|
|
|
|
|
printf("\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get vertex datas
|
|
|
|
|
hob_struct->objects[i].face_groups[j].vertices = calloc(hob_struct->objects[i].face_groups[j].vertex_count, sizeof(T_VERTEX));
|
|
|
|
|
for ( k = 0; k < hob_struct->objects[i].face_groups[j].vertex_count; k++ ) {
|
|
|
|
|
hob_struct->objects[i].face_groups[j].vertices[k].x = ((T_HOBFILE_VERTEX *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].vertex_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].vertices = calloc(hob_struct->objects[i].object_parts[j].vertex_count, sizeof(T_VERTEX));
|
|
|
|
|
for ( k = 0; k < hob_struct->objects[i].object_parts[j].vertex_count; k++ ) {
|
|
|
|
|
hob_struct->objects[i].object_parts[j].vertices[k].x = ((T_HOBFILE_VERTEX *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].vertex_block_offset
|
|
|
|
|
+ sizeof(T_VERTEX) * k))->x;
|
|
|
|
|
|
|
|
|
|
hob_struct->objects[i].face_groups[j].vertices[k].y = ((T_HOBFILE_VERTEX *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].vertex_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].vertices[k].y = ((T_HOBFILE_VERTEX *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].vertex_block_offset
|
|
|
|
|
+ sizeof(T_VERTEX) * k))->y;
|
|
|
|
|
|
|
|
|
|
hob_struct->objects[i].face_groups[j].vertices[k].z = ((T_HOBFILE_VERTEX *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].vertex_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].vertices[k].z = ((T_HOBFILE_VERTEX *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].vertex_block_offset
|
|
|
|
|
+ sizeof(T_VERTEX) * k))->z;
|
|
|
|
|
|
|
|
|
|
hob_struct->objects[i].face_groups[j].vertices[k].w = ((T_HOBFILE_VERTEX *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].face_groups[j].vertex_block_offset
|
|
|
|
|
hob_struct->objects[i].object_parts[j].vertices[k].w = ((T_HOBFILE_VERTEX *)(memFile
|
|
|
|
|
+ hob_struct->objects[i].object_parts[j].vertex_block_offset
|
|
|
|
|
+ sizeof(T_VERTEX) * k))->w; // Always 0???
|
|
|
|
|
|
|
|
|
|
if (_options & VERBOSE_ENABLED) printf("[DBG] > Found vertex %d: (%d, %d, %d)\n", k,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].vertices[k].x,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].vertices[k].y,
|
|
|
|
|
hob_struct->objects[i].face_groups[j].vertices[k].z
|
|
|
|
|
hob_struct->objects[i].object_parts[j].vertices[k].x,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].vertices[k].y,
|
|
|
|
|
hob_struct->objects[i].object_parts[j].vertices[k].z
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|