X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_render.c;h=17eb34200aa3453053152b77587334e21de29091;hb=cbeec2e44e93ab43ccde54c2dd9cd02f559ebef8;hp=20d9a706262e1b11e9515e95c155174e6f9e53d3;hpb=fdd41609e59c7df548682b25001f0015dc1acbea;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_render.c b/player_render.c index 20d9a70..17eb342 100644 --- a/player_render.c +++ b/player_render.c @@ -39,60 +39,45 @@ VG_STATIC void player_avatar_load( struct player_avatar *av, const char *path ) /* TODO: Standard model load */ -VG_STATIC void player_model_load( struct player_model *mdl, const char *path ) +VG_STATIC void dynamic_model_load( mdl_context *ctx, + struct dynamic_model_1texture *mdl, + const char *path ) { - vg_linear_clear( vg_mem.scratch ); - - mdl_context ctx; - mdl_open( &ctx, path, vg_mem.scratch ); - mdl_load_metadata_block( &ctx, vg_mem.scratch ); - - if( !mdl_arrcount( &ctx.textures ) ) - vg_fatal_error( "No texture in player model" ); + if( !mdl_arrcount( &ctx->textures ) ) + vg_fatal_error( "No texture in model" ); - mdl_texture *tex0 = mdl_arritm( &ctx.textures, 0 ); + mdl_texture *tex0 = mdl_arritm( &ctx->textures, 0 ); void *data = vg_linear_alloc( vg_mem.scratch, tex0->file.pack_size ); - mdl_fread_pack_file( &ctx, &tex0->file, data ); + mdl_fread_pack_file( ctx, &tex0->file, data ); vg_tex2d_load_qoi_async( data, tex0->file.pack_size, VG_TEX2D_NEAREST|VG_TEX2D_CLAMP, &mdl->texture ); - mdl_async_load_glmesh( &ctx, &mdl->mesh ); - mdl_close( &ctx ); + mdl_async_load_glmesh( ctx, &mdl->mesh ); } /* TODO: allow error handling */ -VG_STATIC void player_board_load( struct player_board *mdl, const char *path ){ +VG_STATIC void player_board_load( struct player_board *board, + const char *path ){ + vg_linear_clear( vg_mem.scratch ); mdl_context ctx; mdl_open( &ctx, path, vg_mem.scratch ); mdl_load_metadata_block( &ctx, vg_mem.scratch ); + dynamic_model_load( &ctx, &board->mdl, path ); + mdl_array_ptr markers; mdl_load_array( &ctx, &markers, "ent_marker", vg_mem.scratch ); - if( !mdl_arrcount( &ctx.textures ) ) - vg_fatal_error( "No texture in board model" ); - - mdl_texture *tex0 = mdl_arritm( &ctx.textures, 0 ); - void *data = vg_linear_alloc( vg_mem.scratch, tex0->file.pack_size ); - mdl_fread_pack_file( &ctx, &tex0->file, data ); - - vg_tex2d_load_qoi_async( data, tex0->file.pack_size, - VG_TEX2D_CLAMP|VG_TEX2D_NEAREST, - &mdl->texture ); - - mdl_async_load_glmesh( &ctx, &mdl->mesh ); - mdl_close( &ctx ); - /* TODO: you get put into a new section, the above is standard mdl loads. */ for( int i=0; i<4; i++ ) - mdl->wheels[i].indice_count = 0; + board->wheels[i].indice_count = 0; for( int i=0; i<2; i++ ) - mdl->trucks[i].indice_count = 0; - mdl->board.indice_count = 0; + board->trucks[i].indice_count = 0; + board->board.indice_count = 0; for( u32 i=0; iwheels[ id ] = *sm0; - v3_copy( marker->transform.co, mdl->wheel_positions[ id ] ); + board->wheels[ id ] = *sm0; + v3_copy( marker->transform.co, board->wheel_positions[ id ] ); } else if( !strcmp( alias, "board" ) ){ - mdl->board = *sm0; - v3_copy( marker->transform.co, mdl->board_position ); + board->board = *sm0; + v3_copy( marker->transform.co, board->board_position ); } else if( !strcmp( alias, "truck" ) ){ - mdl->trucks[ fb ] = *sm0; - v3_copy( marker->transform.co, mdl->truck_positions[ fb ] ); + board->trucks[ fb ] = *sm0; + v3_copy( marker->transform.co, board->truck_positions[ fb ] ); } } + + mdl_close( &ctx ); } -VG_STATIC void player_board_unload( struct player_board *mdl ) -{ +VG_STATIC void dynamic_model_unload( struct dynamic_model_1texture *mdl ){ mesh_free( &mdl->mesh ); glDeleteTextures( 1, &mdl->texture ); } +VG_STATIC void player_board_unload( struct player_board *board ){ + dynamic_model_unload( &board->mdl ); +} + VG_STATIC void player__pre_render( player_instance *player ) { if( _player_animate[ player->subsystem ] ){ @@ -162,7 +152,9 @@ VG_STATIC void player__pre_render( player_instance *player ) _player_post_animate[ player->subsystem ]( player ); struct player_avatar *av = player->playeravatar; - struct player_board *board = player_get_player_board( player ); + struct player_board *board = + addon_cache_item_if_loaded( k_workshop_file_type_board, + player->board_view_slot ); v3f vp0, vp1; @@ -292,7 +284,7 @@ VG_STATIC void render_board( camera *cam, world_instance *world, v3f inverse; glActiveTexture( GL_TEXTURE0 ); - glBindTexture( GL_TEXTURE_2D, board->texture ); + glBindTexture( GL_TEXTURE_2D, board->mdl.texture ); if( shader == k_board_shader_player ){ shader_model_board_view_use(); @@ -334,7 +326,7 @@ VG_STATIC void render_board( camera *cam, world_instance *world, _uniform_model_entity_uLightsIndex, 4 ); } - mesh_bind( &board->mesh ); + mesh_bind( &board->mdl.mesh ); m4x4f m4mdl; @@ -408,7 +400,7 @@ VG_STATIC void render_playermodel( camera *cam, world_instance *world, shader_model_character_view_use(); glActiveTexture( GL_TEXTURE0 ); - glBindTexture( GL_TEXTURE_2D, model->texture ); + glBindTexture( GL_TEXTURE_2D, model->mdl.texture ); shader_model_character_view_uTexMain( 0 ); shader_model_character_view_uCamera( cam->transform[3] ); shader_model_character_view_uPv( cam->mtx.pv ); @@ -436,21 +428,28 @@ VG_STATIC void render_playermodel( camera *cam, world_instance *world, 0, (float *)skeleton->final_mtx ); - mesh_bind( &model->mesh ); - mesh_draw( &model->mesh ); + mesh_bind( &model->mdl.mesh ); + mesh_draw( &model->mdl.mesh ); } PLAYER_API void player__render( camera *cam, player_instance *player ) { world_instance *world = world_current_instance(); + SDL_AtomicLock( &addon_system.sl_cache_using_resources ); - struct player_model *model = player_get_player_model( player ); + struct player_model *model = + addon_cache_item_if_loaded( k_workshop_file_type_player, + player->playermodel_view_slot ); render_playermodel( cam, world, model, &player->playeravatar->sk ); - struct player_board *board = player_get_player_board( player ); + struct player_board *board = + addon_cache_item_if_loaded( k_workshop_file_type_board, + player->board_view_slot ); render_board( cam, world, board, player->playeravatar->sk.final_mtx[ player->playeravatar->id_board], k_board_shader_player ); + + SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); } #endif /* PLAYER_RENDER_C */