+static void render_glider_model( camera *cam, world_instance *world,
+ m4x3f mmdl, enum board_shader shader ){
+ u32 current_tex = 0xffffffff;
+ glActiveTexture( GL_TEXTURE0 );
+
+ mdl_context *mdl = &player_glide.glider;
+ mesh_bind( &player_glide.glider_mesh );
+
+ for( u32 i=0; i<mdl_arrcount(&mdl->meshs); i ++ ){
+ mdl_mesh *mesh = mdl_arritm( &mdl->meshs, i );
+
+ m4x3f mmmdl;
+ mdl_transform_m4x3( &mesh->transform, mmmdl );
+ m4x3_mul( mmdl, mmmdl, mmmdl );
+
+ if( shader == k_board_shader_player )
+ shader_model_board_view_uMdl( mmmdl );
+ else if( shader == k_board_shader_entity ){
+ m4x4f m4mmmdl;
+ m4x3_expand( mmmdl, m4mmmdl );
+ m4x4_mul( cam->mtx_prev.pv, m4mmmdl, m4mmmdl );
+
+ shader_model_entity_uMdl( mmmdl );
+ shader_model_entity_uPvmPrev( m4mmmdl );
+ }
+
+ for( u32 j=0; j<mesh->submesh_count; j ++ ){
+ mdl_submesh *sm = mdl_arritm( &mdl->submeshs, mesh->submesh_start+j );
+ if( !sm->material_id ) {
+ vg_error( "Invalid material ID 0\n" );
+ continue;
+ }
+
+ mdl_material *mat = mdl_arritm( &mdl->materials, sm->material_id-1 );
+ if( mat->tex_diffuse != current_tex ){
+ glBindTexture( GL_TEXTURE_2D,
+ player_glide.glider_textures[ mat->tex_diffuse ] );
+ current_tex = mat->tex_diffuse;
+ }
+
+ mdl_draw_submesh( sm );
+ }
+ }
+}
+