X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=model.h;h=12a05b1678b36a64e350a79c3de9843f8afc4d4d;hb=3e8fda9c7cbc50d1ae95195905c953bdeedf71b9;hp=fb33e0bbad88bbaa45f7c1f61e708148c8a95d0b;hpb=be6707a307bfeec1b45cca8b3fb647e81262be87;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/model.h b/model.h index fb33e0b..12a05b1 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 @@ -28,31 +29,77 @@ typedef struct mdl_context mdl_context; enum classtype { - k_classtype_none = 0, - k_classtype_gate = 1, - k_classtype_spawn = 3, - k_classtype_water = 4, - k_classtype_route_node = 8, - k_classtype_route = 9, - k_classtype_bone = 10, - k_classtype_skeleton = 11, - k_classtype_skin = 12, - k_classtype_audio = 14, - k_classtype_trigger = 100, - k_classtype_logic_achievement = 101, - k_classtype_logic_relay = 102 + k_classtype_none = 0, + k_classtype_gate = 1, + k_classtype_spawn = 3, + k_classtype_water = 4, + k_classtype_route_node = 8, + k_classtype_route = 9, + k_classtype_bone = 10, + k_classtype_skeleton = 11, + k_classtype_skin = 12, + k_classtype_audio = 14, + k_classtype_trigger = 100, + k_classtype_logic_achievement = 101, + 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 +}; + +enum mdl_surface_prop +{ + k_surface_prop_concrete = 0, + k_surface_prop_wood = 1, + k_surface_prop_grass = 2 +}; + +enum material_flag +{ + k_material_flag_skate_surface = 0x1, + k_material_flag_collision = 0x2, + k_material_flag_grow_grass = 0x4, + k_material_flag_grind_surface = 0x8 +}; + +enum bone_flag +{ + k_bone_flag_deform = 0x1, + k_bone_flag_ik = 0x2, + k_bone_flag_collider_box = 0x4, + k_bone_flag_collider_capsule = 0x8, + k_bone_flag_collider_reserved0 = 0x10, + k_bone_flag_collider_reserved1 = 0x20, + k_bone_flag_collider_reserved2 = 0x40, + k_bone_flag_collider_reserved3 = 0x80, + k_bone_flag_collider_any = k_bone_flag_collider_box | + k_bone_flag_collider_capsule | + k_bone_flag_collider_reserved0 | + k_bone_flag_collider_reserved1 | + k_bone_flag_collider_reserved2 | + k_bone_flag_collider_reserved3, + k_bone_flag_cone_constraint = 0x100, + k_bone_flag_force_u32 = 0xffffffff }; #pragma pack(push,1) +/* 48 byte */ struct mdl_vert { - v3f co, - norm; - v2f uv; - u8 colour[4]; - u16 weights[4]; - u8 groups[4]; + v3f co, /* 3*32 */ + norm; /* 3*32 */ + v2f uv; /* 2*32 */ + + u8 colour[4]; /* 4*8 */ + u16 weights[4];/* 4*16 */ + u8 groups[4]; /* 4*8 */ }; struct mdl_submesh @@ -66,9 +113,26 @@ 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, + surface_prop; + + v4f colour, + colour1; + + u32 tex_diffuse, + tex_decal, + tex_normal; }; struct mdl_node @@ -111,6 +175,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 +183,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; }; /* @@ -155,14 +222,14 @@ struct classtype_route struct classtype_bone { - u32 deform, + u32 flags, ik_target, - ik_pole, - collider, - use_limits; + ik_pole; - v3f angle_limits[2]; boxf hitbox; + + v3f conevx, conevy, coneva; + float conet; }; struct classtype_skeleton @@ -214,6 +281,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 +290,8 @@ struct mdl_context mdl_vert *vertex_buffer; /* mdl_load_mesh_data() */ u32 *index_buffer; + + void *pack; /* mdl_load_pack_data() */ }; /* @@ -388,6 +458,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); @@ -400,8 +471,8 @@ VG_STATIC void mdl_load_mesh_data( mdl_context *mdl, void *lin_alloc ) { assert( mdl->file ); - u64 size_verts = mdl->info.vertex_count * sizeof(mdl_vert), - size_index = mdl->info.indice_count * sizeof(u32); + u64 size_verts = vg_align8( mdl->info.vertex_count * sizeof(mdl_vert) ), + size_index = vg_align8( mdl->info.indice_count * sizeof(u32) ); mdl->vertex_buffer = vg_linear_alloc( lin_alloc, size_verts ); mdl->index_buffer = vg_linear_alloc( lin_alloc, size_index ); @@ -430,7 +501,7 @@ VG_STATIC void mdl_load_anim_data( mdl_context *mdl, void *lin_alloc ) if( mdl->info.keyframe_count == 0 ) return; - u64 size_kf = mdl->info.keyframe_count * sizeof(mdl_keyframe); + u64 size_kf = vg_align8( mdl->info.keyframe_count * sizeof(mdl_keyframe) ); mdl->keyframe_buffer = vg_linear_alloc( lin_alloc, size_kf ); fseek( mdl->file, mdl->info.keyframe_offset, SEEK_SET ); @@ -439,6 +510,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, vg_align8( 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 +539,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 */ @@ -456,7 +547,7 @@ VG_STATIC mdl_context *mdl_load_full( void *lin_alloc, const char *path ) mdl_open( &temp_ctx, path ); /* create allocator */ - u32 tot_size = temp_ctx.info.file_length + sizeof( mdl_context ); + u32 tot_size = temp_ctx.info.file_length + sizeof( mdl_context ) + 64; void *data = vg_create_linear_allocator( lin_alloc, tot_size, VG_MEMORY_SYSTEM ); @@ -467,6 +558,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; @@ -605,5 +697,13 @@ VG_STATIC void mdl_link_materials( mdl_context *root, mdl_context *child ) } } +VG_STATIC void mdl_invert_uv_coordinates( mdl_context *mdl ) +{ + for( int i=0; iinfo.vertex_count; i++ ) + { + mdl_vert *vert = &mdl->vertex_buffer[i]; + vert->uv[1] = 1.0f-vert->uv[1]; + } +} #endif