#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
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)
u32 submesh_start,
submesh_count,
pstr_name,
- flags,
+ entity_id, /* upper 16 bits: type, lower 16 bits: index */
armature_id;
};
struct mdl_texture
{
mdl_file file;
- u32 type;
+ u32 glname;
};
struct mdl_array
/* mesh buffers */
verts,
- indices,
+ indices;
+
+ u32 pack_base_offset;
/* pack data */
- pack;
+ //pack;
};
* 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 )
{
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; i<mdl_arrcount(&mdl->index); 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 )
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
*/
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;
}
/*