X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=model.h;h=05790c655d204ed18668b8e1b101c4f03cba2989;hb=4af3f141e332ae426ecda80ca4ccd8cf4e84d0cb;hp=b7e0e96e6f43a512cb52e5282f767ce699ef2d65;hpb=6e29d444f89478d5965fc652373272e5d70e84e4;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/model.h b/model.h index b7e0e96..05790c6 100644 --- a/model.h +++ b/model.h @@ -209,10 +209,12 @@ struct mdl_context /* mesh buffers */ verts, - indices, + indices; + + u32 pack_base_offset; /* pack data */ - pack; + //pack; }; @@ -227,6 +229,26 @@ VG_STATIC void mdl_load_fatal_corrupt( mdl_context *mdl ) * Model implementation */ +VG_STATIC u32 mdl_query_array_size( mdl_array *arr ) +{ + if( arr->item_count ){ + u32 size = arr->item_size*arr->item_count; + return vg_align8(size); + } + else + return 0; +} + +VG_STATIC +void mdl_fread_pack_file( mdl_context *mdl, mdl_file *info, void *dst ) +{ + fseek( mdl->file, mdl->pack_base_offset+info->pack_offset, SEEK_SET ); + u64 l = fread( dst, info->pack_size, 1, mdl->file ); + + if( l != 1 ) + mdl_load_fatal_corrupt( mdl ); +} + VG_STATIC void mdl_load_array_file( mdl_context *mdl, mdl_array_ptr *ptr, mdl_array *arr, void *lin_alloc ) { @@ -257,22 +279,34 @@ VG_STATIC u32 mdl_arrcount( mdl_array_ptr *arr ) return arr->count; } -VG_STATIC int mdl_load_array( mdl_context *mdl, mdl_array_ptr *ptr, - const char *name, void *lin_alloc ) +VG_STATIC mdl_array *mdl_find_array( mdl_context *mdl, const char *name ) { for( u32 i=0; iindex); i++ ){ mdl_array *arr = mdl_arritm( &mdl->index, i ); if( !strncmp(arr->name,name,16) ){ - mdl_load_array_file( mdl, ptr, arr, lin_alloc ); - return 1; + return arr; } } - ptr->data = NULL; - ptr->count = 0; - ptr->stride = 0; - return 0; + return NULL; +} + +VG_STATIC int mdl_load_array( mdl_context *mdl, mdl_array_ptr *ptr, + const char *name, void *lin_alloc ) +{ + mdl_array *arr = mdl_find_array( mdl, name ); + + if( arr ){ + mdl_load_array_file( mdl, ptr, arr, lin_alloc ); + return 1; + } + else{ + ptr->data = NULL; + ptr->count = 0; + ptr->stride = 0; + return 0; + } } VG_STATIC int mdl_load_mesh_block( mdl_context *mdl, void *lin_alloc ) @@ -306,10 +340,12 @@ VG_STATIC int mdl_load_animation_block( mdl_context *mdl, void *lin_alloc ) return mdl_load_array( mdl, &mdl->keyframes, "mdl_keyframe", lin_alloc ); } +#if 0 VG_STATIC int mdl_load_pack_block( mdl_context *mdl, void *lin_alloc ) { return mdl_load_array( mdl, &mdl->pack, "pack", lin_alloc ); } +#endif /* * if calling mdl_open, and the file does not exist, the game will fatal quit @@ -329,6 +365,10 @@ VG_STATIC void mdl_open( mdl_context *mdl, const char *path, void *lin_alloc ) mdl_load_fatal_corrupt( mdl ); mdl_load_array_file( mdl, &mdl->index, &mdl->info.index, lin_alloc ); + + mdl_array *pack = mdl_find_array( mdl, "pack" ); + if( pack ) mdl->pack_base_offset = pack->file_offset; + else mdl->pack_base_offset = 0; } /*