X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=model.h;h=05790c655d204ed18668b8e1b101c4f03cba2989;hb=6b9993651343af73bd48e2213910bbaadb41edaf;hp=c92960f04569b11ea2b8e5a6b62776c07e8f59dd;hpb=a1056ed8198f0f5be0e0f341da8bd49aa6c47198;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/model.h b/model.h index c92960f..05790c6 100644 --- a/model.h +++ b/model.h @@ -22,7 +22,8 @@ enum mdl_surface_prop k_surface_prop_concrete = 0, k_surface_prop_wood = 1, k_surface_prop_grass = 2, - k_surface_prop_tiles = 3 + k_surface_prop_tiles = 3, + k_surface_prop_metal = 4 }; enum material_flag @@ -208,10 +209,12 @@ struct mdl_context /* mesh buffers */ verts, - indices, + indices; + + u32 pack_base_offset; /* pack data */ - pack; + //pack; }; @@ -226,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 ) { @@ -256,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 ) @@ -305,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 @@ -328,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; } /*