+/* 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 */
+ mdl_context temp_ctx;
+ mdl_open( &temp_ctx, path );
+
+ /* create allocator */
+ u32 tot_size = temp_ctx.info.file_length + sizeof( mdl_context );
+ 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) );
+ memcpy( ctx, &temp_ctx, 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;
+}
+
+/*
+ * Item getters
+ * ----------------------------------------------------------------------------
+ * TODO: Clamp access and oob errors
+ */
+VG_STATIC const char *mdl_pstr( mdl_context *mdl, u32 pstr )
+{
+ return mdl->string_buffer + pstr;
+}
+
+VG_STATIC mdl_node *mdl_node_from_id( mdl_context *mdl, u32 id )
+{
+ return &mdl->node_buffer[id];
+}
+
+VG_STATIC mdl_node *mdl_node_from_name( mdl_context *mdl, const char *name )
+{
+ for( int i=0; i < mdl->info.node_count; i++ )
+ {
+ mdl_node *pnode = mdl_node_from_id( mdl, i );
+
+ if( !strcmp( name, mdl_pstr( mdl, pnode->pstr_name )) )
+ return pnode;