X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=model.h;h=ea34a6ddf974f5769f1482a2672e4d0975d21581;hb=1f0e3292c021e8263716e5f4544a1efcedf3f03d;hp=fb33e0bbad88bbaa45f7c1f61e708148c8a95d0b;hpb=be6707a307bfeec1b45cca8b3fb647e81262be87;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/model.h b/model.h index fb33e0b..ea34a6d 100644 --- a/model.h +++ b/model.h @@ -16,6 +16,7 @@ typedef struct mdl_node mdl_node; typedef struct mdl_file_header mdl_file_header; typedef struct mdl_animation mdl_animation; typedef struct mdl_keyframe mdl_keyframe; +typedef struct mdl_texture mdl_texture; typedef struct mdl_context mdl_context; #define MDL_SIZE_MAX 0x1000000 @@ -43,6 +44,15 @@ enum classtype k_classtype_logic_relay = 102 }; +enum mdl_shader +{ + k_shader_standard = 0, + k_shader_standard_cutout = 1, + k_shader_terrain_blend = 2, + k_shader_standard_vertex_blend = 3, + k_shader_water = 4 +}; + #pragma pack(push,1) struct mdl_vert @@ -66,9 +76,25 @@ struct mdl_submesh u32 material_id; }; +struct mdl_texture +{ + u32 pstr_name, + pack_offset, + pack_length; +}; + struct mdl_material { - u32 pstr_name; + u32 pstr_name, + shader, + flags; + + v4f colour, + colour1; + + u32 tex_diffuse, + tex_decal, + tex_normal; }; struct mdl_node @@ -111,6 +137,7 @@ struct mdl_file_header node_count, node_offset, submesh_count, submesh_offset, material_count, material_offset, + texture_count, texture_offset, anim_count, anim_offset, entdata_size, entdata_offset, strings_size, strings_offset, @@ -118,7 +145,9 @@ struct mdl_file_header keyframe_count, keyframe_offset, vertex_count, vertex_offset, - indice_count, indice_offset; + indice_count, indice_offset, + + pack_size, pack_offset; }; /* @@ -214,6 +243,7 @@ struct mdl_context mdl_node *node_buffer; /* mdl_load_metadata() */ mdl_submesh *submesh_buffer; mdl_material *material_buffer; + mdl_texture *texture_buffer; mdl_animation *anim_buffer; void *entdata_buffer; const char *string_buffer; @@ -222,6 +252,8 @@ struct mdl_context mdl_vert *vertex_buffer; /* mdl_load_mesh_data() */ u32 *index_buffer; + + void *pack; /* mdl_load_pack_data() */ }; /* @@ -388,6 +420,7 @@ VG_STATIC void mdl_load_metadata( mdl_context *mdl, void *lin_alloc ) mdl->node_buffer = all_data + (mdl->info.node_offset - lheader); mdl->submesh_buffer = all_data + (mdl->info.submesh_offset - lheader); mdl->material_buffer = all_data + (mdl->info.material_offset - lheader); + mdl->texture_buffer = all_data + (mdl->info.texture_offset - lheader); mdl->anim_buffer = all_data + (mdl->info.anim_offset - lheader); mdl->entdata_buffer = all_data + (mdl->info.entdata_offset - lheader); mdl->string_buffer = all_data + (mdl->info.strings_offset - lheader); @@ -439,6 +472,26 @@ VG_STATIC void mdl_load_anim_data( mdl_context *mdl, void *lin_alloc ) mdl_load_fatal_corrupt( mdl ); } +/* + * Load pack contents + * + * TODO request specific files (low) + */ +VG_STATIC void mdl_load_pack_data( mdl_context *mdl, void *lin_alloc ) +{ + assert( mdl->file ); + + if( mdl->info.pack_size == 0 ) + return; + + mdl->pack = vg_linear_alloc( lin_alloc, mdl->info.pack_size ); + fseek( mdl->file, mdl->info.pack_offset, SEEK_SET ); + + u64 l = fread( mdl->pack, mdl->info.pack_size, 1, mdl->file ); + if( l != 1 ) + mdl_load_fatal_corrupt( mdl ); +} + /* * close file handle */ @@ -448,7 +501,7 @@ VG_STATIC void mdl_close( mdl_context *mdl ) mdl->file = NULL; } -/* open a model */ +/* open a model. TODO: make this flags ( ANIM_DATA|MESH_DATA ... ) */ VG_STATIC mdl_context *mdl_load_full( void *lin_alloc, const char *path ) { /* Inspect the header by opening it, give us the size needed */ @@ -467,6 +520,7 @@ VG_STATIC mdl_context *mdl_load_full( void *lin_alloc, const char *path ) mdl_load_metadata( ctx, data ); mdl_load_anim_data( ctx, data ); mdl_load_mesh_data( ctx, data ); + mdl_load_pack_data( ctx, data ); mdl_close( ctx ); return ctx;