X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=model.h;h=287eefd6e203692233ac71aaf973e632f7b8208f;hb=2a238d32da833812e837cf38e16a7685c98db5c3;hp=957001c40a193ad2b0e7be2d86472e81e7047baa;hpb=bdac014448b6ec968fe645f1581f321144f07dba;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/model.h b/model.h index 957001c..287eefd 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,20 +29,64 @@ 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_achievement_box = 13, - k_classtype_audio = 14, - k_classtype_trigger = 15 + 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) @@ -66,9 +111,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 +173,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 +181,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; }; /* @@ -149,19 +214,20 @@ struct classtype_route_node struct classtype_route { u32 id_start; + u32 pstr_name; v3f colour; }; 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 @@ -178,10 +244,19 @@ struct classtype_skin u32 skeleton; }; -struct classtype_achievement_box +struct classtype_trigger { - u32 pstr_name, - trigger; + u32 target; +}; + +struct classtype_logic_relay +{ + u32 targets[4]; +}; + +struct classtype_logic_achievement +{ + u32 pstr_name; }; struct classtype_audio @@ -204,6 +279,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; @@ -212,6 +288,8 @@ struct mdl_context mdl_vert *vertex_buffer; /* mdl_load_mesh_data() */ u32 *index_buffer; + + void *pack; /* mdl_load_pack_data() */ }; /* @@ -378,6 +456,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); @@ -390,8 +469,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 ); @@ -420,7 +499,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 ); @@ -429,6 +508,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 */ @@ -438,7 +537,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 */ @@ -446,7 +545,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 ); @@ -457,6 +556,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; @@ -595,5 +695,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