X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=workshop.c;h=8c24e03b308de083eabef432d6ae4f22cb3c1c35;hb=464b46038fbbf1439d088e64bdce8965e44a91cd;hp=bcb8574a016497006818e5ad81084cc8083c7876;hpb=7fb47c3eb672f4468da8b5b452c09d44e1389d5f;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/workshop.c b/workshop.c index bcb8574..8c24e03 100644 --- a/workshop.c +++ b/workshop.c @@ -534,7 +534,19 @@ VG_STATIC void _workshop_form_load_thread( void *data ) VG_STATIC void workshop_op_load_model(void) { if( workshop_form.submission.type == k_workshop_file_type_world ){ - vg_error( "Currently unsupported\n" ); + vg_warn( "WORLD LOAD INFO Currently unsupported\n" ); + return; + } + + workshop_form.view_world = world_current_instance(); + + if( mdl_arrcount( &workshop_form.view_world->ent_swspreview ) ){ + workshop_form.ptr_ent = + mdl_arritm( &workshop_form.view_world->ent_swspreview, 0 ); + } + else{ + vg_error( "There is no ent_swspreview in the level. " + "Cannot publish here\n" ); return; } @@ -563,6 +575,12 @@ VG_STATIC void workshop_form_async_imageload( void *data, u32 len ) stbi_image_free( data ); vg_success( "Loaded workshop preview image\n" ); } + else{ + snprintf( workshop_form.error_msg, sizeof(workshop_form.error_msg), + "Preview image could not be loaded. Reason: %s\n", + stbi_failure_reason() ); + ui_start_modal( workshop_form.error_msg, UI_MODAL_BAD ); + } skaterift_end_op(); } @@ -596,8 +614,6 @@ VG_STATIC void _workshop_load_preview_thread( void *data ) } } else{ - vg_error( "Failed to load workshop_preview.jpg: '%s'\n", - stbi_failure_reason() ); vg_async_call( workshop_form_async_imageload, NULL, 0 ); } } @@ -683,7 +699,7 @@ VG_STATIC void workshop_op_download_and_view_submission( int result_index ) vg_msg root; vg_msg_init( &root, metadata_buf, len/2 ); - vg_msg workshop; + vg_msg workshop = root; if( vg_msg_seekframe( &workshop, "workshop", k_vg_msg_first )){ vg_msg_cmd kv_type = vg_msg_seekkv( &workshop, "type", k_vg_msg_first ); @@ -862,7 +878,7 @@ VG_STATIC void on_workshop_UGCQueryComplete( void *data, void *userdata ) VG_STATIC int workshop_submit_command( int argc, const char *argv[] ) { if( !steam_ready ){ - vg_error( "Steam API is not ready or loaded\n" ); + ui_start_modal( "Steam API is not initialized\n", UI_MODAL_BAD ); return 0; } @@ -900,26 +916,24 @@ VG_STATIC void workshop_init(void) vg_console_reg_cmd( "workshop_submit", workshop_submit_command, NULL ); } -VG_STATIC void workshop_find_preview_entity(void) -{ - workshop_form.view_world = world_current_instance(); +VG_STATIC void workshop_render_world_preview(void){ + render_fb_bind( gpipeline.fb_workshop_preview, 0 ); - if( mdl_arrcount( &workshop_form.view_world->ent_swspreview ) ){ - workshop_form.ptr_ent = - mdl_arritm( &workshop_form.view_world->ent_swspreview, 0 ); - workshop_form.page = k_workshop_form_edit; - } - else{ - vg_error( "There is no ent_swspreview in the level. " - "Cannot publish here\n" ); - } + glClearColor( 0.0f, 0.0f, 0.3f, 1.0f ); + glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT ); + glEnable( GL_DEPTH_TEST ); + glDisable( GL_BLEND ); + + render_world( localplayer.viewable_world, &main_camera, 1 ); + + glBindFramebuffer( GL_FRAMEBUFFER, 0 ); + glViewport( 0,0, vg.window_x, vg.window_y ); } /* * Redraw the model file into the workshop framebuffer */ -VG_STATIC void workshop_render_preview(void) -{ +VG_STATIC void workshop_render_board_preview(void){ if( !workshop_form.ptr_ent ){ return; } @@ -1024,88 +1038,65 @@ VG_STATIC void workshop_changed_description( char *buf, u32 len ){ workshop_form.submission.submit_description = 1; } -VG_STATIC void workshop_form_gui_edit_page( ui_rect content ) -{ - if( workshop_form.submission.type == k_workshop_file_type_none ){ - ui_rect box; - rect_copy( content, box ); - box[3] = 128; - box[2] = (box[2]*2)/3; - ui_rect_center( content, box ); - - ui_rect row; - ui_split( box, k_ui_axis_h, 28, 0, row, box ); - ui_text( row, "Select the type of item\n", 1, k_ui_align_middle_center,0); - ui_split( box, k_ui_axis_h, 28, 0, row, box ); - ui_enum( row, "Type:", workshop_form_type_opts, - 3, &workshop_form.submission.submission_type_selection ); - ui_split( box, k_ui_axis_h, 8, 0, row, box ); - ui_split( box, k_ui_axis_h, 28, 0, row, box ); - - ui_rect button_l, button_r; - rect_copy( row, button_l ); - button_l[2] = 128*2; - ui_rect_center( row, button_l ); - ui_split_ratio( button_l, k_ui_axis_v, 0.5f, 2, button_l, button_r ); - - if( workshop_form.submission.submission_type_selection.value != - k_workshop_file_type_none ){ - if( ui_button_text( button_l, "OK", 1 ) ){ - workshop_form.submission.type = +VG_STATIC void workshop_form_gui_page_undecided( ui_rect content ){ + ui_rect box; + rect_copy( content, box ); + box[3] = 128; + box[2] = (box[2]*2)/3; + ui_rect_center( content, box ); + + ui_rect row; + ui_split( box, k_ui_axis_h, 28, 0, row, box ); + ui_text( row, "Select the type of item\n", 1, k_ui_align_middle_center,0); + ui_split( box, k_ui_axis_h, 28, 0, row, box ); + ui_enum( row, "Type:", workshop_form_type_opts, + 3, &workshop_form.submission.submission_type_selection ); + ui_split( box, k_ui_axis_h, 8, 0, row, box ); + ui_split( box, k_ui_axis_h, 28, 0, row, box ); + + ui_rect button_l, button_r; + rect_copy( row, button_l ); + button_l[2] = 128*2; + ui_rect_center( row, button_l ); + ui_split_ratio( button_l, k_ui_axis_v, 0.5f, 2, button_l, button_r ); + + if( workshop_form.submission.submission_type_selection.value != + k_workshop_file_type_none ){ + if( ui_button_text( button_l, "OK", 1 ) ){ + enum workshop_file_type type = workshop_form.submission.submission_type_selection.value; + workshop_form.submission.type = type; + + if( type == k_workshop_file_type_world ){ + workshop_form.view_changed = 1; + workshop_form.file_intent = k_workshop_form_file_intent_new; } } - else{ - ui_fill( button_l, ui_colour(k_ui_bg) ); - ui_text( button_l, "OK", 1, k_ui_align_middle_center, - ui_colour(k_ui_bg+4) ); - } - - if( ui_button_text( button_r, "Cancel", 1 ) ){ - workshop_form.page = k_workshop_form_open; - workshop_form.file_intent = k_workshop_form_file_intent_none; - } - return; } - - if( workshop_form.submission.type == k_workshop_file_type_world ){ - ui_rect box; - rect_copy( content, box ); - box[3] = 128; - box[2] = (box[2]*2)/3; - ui_rect_center( content, box ); - - ui_rect row; - ui_split( box, k_ui_axis_h, 28, 0, row, box ); - ui_text( row, "World submissions are currently not ready, sorry.", - 1, k_ui_align_middle_center,0); - ui_split( box, k_ui_axis_h, 8, 0, row, box ); - ui_split( box, k_ui_axis_h, 28, 0, row, box ); - - ui_rect button; - rect_copy( row, button ); - button[2] = 128; - ui_rect_center( row, button ); - if( ui_button_text( button, "OK", 1 ) ){ - workshop_form.page = k_workshop_form_open; - workshop_form.file_intent = k_workshop_form_file_intent_none; - } - - return; + else{ + ui_fill( button_l, ui_colour(k_ui_bg) ); + ui_text( button_l, "OK", 1, k_ui_align_middle_center, + ui_colour(k_ui_bg+4) ); } + + if( ui_button_text( button_r, "Cancel", 1 ) ){ + workshop_form.page = k_workshop_form_open; + workshop_form.file_intent = k_workshop_form_file_intent_none; + } +} - ui_rect image_plane; - ui_split( content, k_ui_axis_h, 300, 0, image_plane, content ); - ui_fill( image_plane, ui_colour( k_ui_bg+0 ) ); - - ui_rect img_box; - ui_fit_item( image_plane, (ui_px[2]){ 3, 2 }, img_box ); - +VG_STATIC void workshop_form_gui_draw_preview( ui_rect img_box ){ + enum workshop_file_type type = workshop_form.submission.type; if( workshop_form.file_intent == k_workshop_form_file_intent_keep_old ){ ui_image( img_box, gpipeline.fb_workshop_preview->attachments[0].id ); } else if( workshop_form.file_intent == k_workshop_form_file_intent_new ){ ui_image( img_box, gpipeline.fb_workshop_preview->attachments[0].id ); + + if( type == k_workshop_file_type_world ){ + return; + } + int hover = ui_inside_rect( img_box, vg_ui.mouse ), target = ui_inside_rect( img_box, vg_ui.mouse_click ); @@ -1159,12 +1150,28 @@ VG_STATIC void workshop_form_gui_edit_page( ui_rect content ) ui_text( img_box, "No image", 1, k_ui_align_middle_center, ui_colour( k_ui_orange ) ); } +} + +VG_STATIC void workshop_form_gui_edit_page( ui_rect content ){ + enum workshop_file_type type = workshop_form.submission.type; + + if( type == k_workshop_file_type_none ){ + workshop_form_gui_page_undecided( content ); + return; + } + + ui_rect image_plane; + ui_split( content, k_ui_axis_h, 300, 0, image_plane, content ); + ui_fill( image_plane, ui_colour( k_ui_bg+0 ) ); + + ui_rect img_box; + ui_fit_item( image_plane, (ui_px[2]){ 3, 2 }, img_box ); + workshop_form_gui_draw_preview( img_box ); /* file path */ ui_rect null, file_entry, file_button, file_label; ui_split( content, k_ui_axis_h, 8, 0, null, content ); ui_split( content, k_ui_axis_h, 28, 0, file_entry, content ); - ui_split( file_entry, k_ui_axis_v, -128, 0, file_entry, file_button ); if( workshop_form.submission.type == k_workshop_file_type_board ){ ui_label( file_entry, "Addon folder: skaterift/boards/", @@ -1175,27 +1182,36 @@ VG_STATIC void workshop_form_gui_edit_page( ui_rect content ) 1, 8, file_entry ); } - if( workshop_form.file_intent != k_workshop_form_file_intent_none ){ - ui_text( file_entry, workshop_form.addon_folder, 1, - k_ui_align_middle_left, ui_colour( k_ui_fg+4 ) ); - - if( ui_button_text( file_button, "Remove", 1 ) ){ - player_board_unload( &workshop_form.board_model ); - workshop_form.file_intent = k_workshop_form_file_intent_none; - workshop_form.addon_folder[0] = '\0'; - } - } - else{ + if( type == k_workshop_file_type_world ){ struct ui_textbox_callbacks callbacks = { .change = workshop_changed_model_path }; - ui_textbox( file_entry, workshop_form.addon_folder, vg_list_size(workshop_form.addon_folder), 0, &callbacks ); + } + else{ + ui_split( file_entry, k_ui_axis_v, -128, 0, file_entry, file_button ); + if( workshop_form.file_intent != k_workshop_form_file_intent_none ){ + ui_text( file_entry, workshop_form.addon_folder, 1, + k_ui_align_middle_left, ui_colour( k_ui_fg+4 ) ); + + if( ui_button_text( file_button, "Remove", 1 ) ){ + player_board_unload( &workshop_form.board_model ); + workshop_form.file_intent = k_workshop_form_file_intent_none; + workshop_form.addon_folder[0] = '\0'; + } + } + else{ + struct ui_textbox_callbacks callbacks = { + .change = workshop_changed_model_path + }; + + ui_textbox( file_entry, workshop_form.addon_folder, + vg_list_size(workshop_form.addon_folder), 0, &callbacks ); - if( ui_button_text( file_button, "Load", 1 ) ){ - workshop_find_preview_entity(); - workshop_op_load_model(); + if( ui_button_text( file_button, "Load", 1 ) ){ + workshop_op_load_model(); + } } } @@ -1369,7 +1385,6 @@ VG_STATIC void workshop_form_gui_sidebar( ui_rect sidebar ) workshop_form.submission.submit_description = 1; workshop_form.submission.submit_file_and_image = 1; workshop_form.page = k_workshop_form_edit; - workshop_find_preview_entity(); } for( int i=0; ilen = j; } -#if 0 -VG_STATIC void vg_strsan_ascii( char *buf, u32 len ) -{ - for( u32 i=0; i 126 ){ - buf[i] = '?'; - } - } - buf[len-1] = '\0'; -} - -#define VG_STRSAN_ASCII( X ) vg_strsan_ascii( X, vg_list_size(X) ) - -VG_STATIC void workshop_load_metadata( const char *path, - struct workshop_file_info *info ) -{ - FILE *fp = fopen( path, "rb" ); - - if( fp ){ - if( fread( info, sizeof( struct workshop_file_info ), 1, fp ) ){ - VG_STRSAN_ASCII( info->author_name ); - VG_STRSAN_ASCII( info->title ); - } - fclose( fp ); - } -} -#endif - #endif /* WORKSHOP_C */