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
enum classtype
{
- k_classtype_none = 0,
- k_classtype_gate = 1,
- k_classtype_block = 2,
- k_classtype_spawn = 3,
- k_classtype_water = 4,
- k_classtype_car_path = 5,
- k_classtype_instance = 6,
- k_classtype_capsule = 7,
- 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
+};
#pragma pack(push,1)
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
{
u32 identifier, version, file_length, pad0;
- u32 vertex_count, vertex_offset,
- indice_count, indice_offset,
- submesh_count, submesh_offset,
- material_count, material_offset,
- node_count, node_offset,
- anim_count, anim_offset,
- strings_length, strings_offset,
- entdata_length, entdata_offset,
- keyframe_count, keyframe_offset;
+ u32
+ 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,
+
+ keyframe_count, keyframe_offset,
+
+ vertex_count, vertex_offset,
+ indice_count, indice_offset,
+
+ pack_size, pack_offset;
};
/*
* Entity data structures
*/
-struct classtype_block
-{
- boxf bbx;
-};
-
struct classtype_gate
{
u32 target;
struct classtype_spawn
{
- u32 target;
+ u32 pstr_alias;
};
struct classtype_water
u32 temp;
};
-struct classtype_car_path
-{
- u32 target, target1;
-};
-
-struct classtype_instance
-{
- u32 pstr_file;
-};
-
-struct classtype_capsule
-{
- float height, radius;
-};
-
struct classtype_route_node
{
u32 target, target1;
struct classtype_route
{
u32 id_start;
+ u32 pstr_name;
v3f colour;
};
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
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;
mdl_vert *vertex_buffer; /* mdl_load_mesh_data() */
u32 *index_buffer;
+
+ void *pack; /* mdl_load_pack_data() */
};
/*
glDeleteVertexArrays( 1, &mesh->vao );
glDeleteBuffers( 1, &mesh->ebo );
glDeleteBuffers( 1, &mesh->vbo );
+ mesh->loaded = 0;
}
}
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);
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, 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
*/
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 */
/* create allocator */
u32 tot_size = temp_ctx.info.file_length + sizeof( mdl_context );
- void *data = vg_create_linear_allocator( lin_alloc, tot_size );
+ void *data = vg_create_linear_allocator( lin_alloc, tot_size,
+ VG_MEMORY_SYSTEM );
/* copy context and load all other data */
mdl_context *ctx = vg_linear_alloc( data, sizeof(mdl_context) );
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;
}
}
+VG_STATIC void mdl_invert_uv_coordinates( mdl_context *mdl )
+{
+ for( int i=0; i<mdl->info.vertex_count; i++ )
+ {
+ mdl_vert *vert = &mdl->vertex_buffer[i];
+ vert->uv[1] = 1.0f-vert->uv[1];
+ }
+}
#endif