X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=model.h;h=fffd26d111228c8661989f7291208afec53d5b48;hb=1b522daa02f28128498b04def4d60b63e590d1f3;hp=c92960f04569b11ea2b8e5a6b62776c07e8f59dd;hpb=a1056ed8198f0f5be0e0f341da8bd49aa6c47198;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/model.h b/model.h index c92960f..fffd26d 100644 --- a/model.h +++ b/model.h @@ -7,14 +7,15 @@ #include "common.h" - 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 + k_shader_water = 4, + k_shader_invisible = 5, + k_shader_boundary = 6 }; enum mdl_surface_prop @@ -22,15 +23,18 @@ 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 { - k_material_flag_skate_surface = 0x1, + k_material_flag_skate_target = 0x1, k_material_flag_collision = 0x2, k_material_flag_grow_grass = 0x4, - k_material_flag_grind_surface = 0x8 + k_material_flag_grindable = 0x8, + k_material_flag_invisible = 0x10, + k_material_flag_boundary = 0x20 }; #pragma pack(push,1) @@ -149,7 +153,7 @@ struct mdl_mesh u32 submesh_start, submesh_count, pstr_name, - flags, + entity_id, /* upper 16 bits: type, lower 16 bits: index */ armature_id; }; @@ -163,7 +167,7 @@ struct mdl_file struct mdl_texture { mdl_file file; - u32 type; + u32 glname; }; struct mdl_array @@ -208,10 +212,12 @@ struct mdl_context /* mesh buffers */ verts, - indices, + indices; + + u32 pack_base_offset; /* pack data */ - pack; + //pack; }; @@ -226,6 +232,32 @@ 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 const char *mdl_pstr( mdl_context *mdl, u32 pstr ); +VG_STATIC +void mdl_fread_pack_file( mdl_context *mdl, mdl_file *info, void *dst ) +{ + if( !info->pack_size ){ + vg_warn( "path: %s\n", mdl_pstr( mdl, info->pstr_path ) ); + vg_fatal_exit_loop( "Packed file is only a header; it is not packed" ); + } + + 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 +288,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,11 +349,6 @@ VG_STATIC int mdl_load_animation_block( mdl_context *mdl, void *lin_alloc ) return mdl_load_array( mdl, &mdl->keyframes, "mdl_keyframe", lin_alloc ); } -VG_STATIC int mdl_load_pack_block( mdl_context *mdl, void *lin_alloc ) -{ - return mdl_load_array( mdl, &mdl->pack, "pack", lin_alloc ); -} - /* * if calling mdl_open, and the file does not exist, the game will fatal quit */ @@ -328,6 +367,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; } /*