X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=ent_miniworld.c;h=fcdba0b12c20cf62967d84c6037cda3ab9d97fe1;hb=b440efbe5785d114d08bb3f5ec0e09cad943006d;hp=9c439c7c797a5c7f44bd7abc233f8d7540e93560;hpb=d171c9ad5de05c9ac8563fcf9f23760b93fb50f8;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/ent_miniworld.c b/ent_miniworld.c index 9c439c7..fcdba0b 100644 --- a/ent_miniworld.c +++ b/ent_miniworld.c @@ -1,9 +1,16 @@ #include "entity.h" #include "ent_miniworld.h" #include "world_render.h" +#include "world_load.h" #include "input.h" +#include "gui.h" +#include "menu.h" +#include "audio.h" -static void ent_miniworld_call( world_instance *world, ent_call *call ){ +struct global_miniworld global_miniworld; + +void ent_miniworld_call( world_instance *world, ent_call *call ) +{ ent_miniworld *miniworld = mdl_arritm( &world->ent_miniworld, mdl_entity_id_id(call->id) ); @@ -13,10 +20,18 @@ static void ent_miniworld_call( world_instance *world, ent_call *call ){ const char *uid = mdl_pstr( &world->meta, miniworld->pstr_world ); skaterift_load_world_command( 1, (const char *[]){ uid } ); + mdl_transform_m4x3( &miniworld->transform, global_miniworld.mmdl ); global_miniworld.active = miniworld; + + gui_helper_clear(); + vg_str text; + + if( gui_new_helper( input_button_list[k_srbind_miniworld_resume], &text )) + vg_strcat( &text, "Enter World" ); } else if( call->function == 1 ){ global_miniworld.active = NULL; + gui_helper_clear(); if( miniworld->proxy ){ ent_prop *prop = mdl_arritm( &world->ent_prop, @@ -26,7 +41,32 @@ static void ent_miniworld_call( world_instance *world, ent_call *call ){ } } -static void ent_miniworld_render( world_instance *host_world, camera *cam ){ +static void miniworld_icon( vg_camera *cam, enum gui_icon icon, + v3f pos, f32 size) +{ + m4x3f mmdl; + v3_copy( cam->transform[2], mmdl[2] ); + mmdl[2][1] = 0.0f; + v3_normalize( mmdl[2] ); + v3_copy( (v3f){0,1,0}, mmdl[1] ); + v3_cross( mmdl[1], mmdl[2], mmdl[0] ); + m4x3_mulv( global_miniworld.mmdl, pos, mmdl[3] ); + + shader_model_font_uMdl( mmdl ); + shader_model_font_uOffset( (v4f){0,0,0,20.0f*size} ); + + m4x4f m4mdl; + m4x3_expand( mmdl, m4mdl ); + m4x4_mul( cam->mtx_prev.pv, m4mdl, m4mdl ); + shader_model_font_uPvmPrev( m4mdl ); + + mdl_submesh *sm = gui.icons[ icon ]; + if( sm ) + mdl_draw_submesh( sm ); +} + +void ent_miniworld_render( world_instance *host_world, vg_camera *cam ) +{ if( host_world != &world_static.instances[k_world_purpose_hub] ) return; @@ -54,44 +94,108 @@ static void ent_miniworld_render( world_instance *host_world, camera *cam ){ if( !rendering ) return; - m4x3f mmdl; - mdl_transform_m4x3( &miniworld->transform, mmdl ); - render_world_override( dest_world, host_world, mmdl, cam ); - //render_world_routes( , &skaterift.cam, 1 ); -} + render_world_override( dest_world, host_world, global_miniworld.mmdl, cam, + NULL, (v4f){dest_world->tar_min,10000.0f,0.0f,0.0f} ); + render_world_routes( dest_world, host_world, + global_miniworld.mmdl, cam, 0, 1 ); -static void ent_miniworld_preupdate(void){ - if( world_static.active_instance == k_world_purpose_client ){ - if( button_down(k_srbind_mleft) ){ - global_miniworld.transition = -1; - global_miniworld.t = 1.0f; + /* icons + * ---------------------*/ + font3d_bind( &gui.font, k_font_shader_default, 0, NULL, cam ); + mesh_bind( &gui.icons_mesh ); - global_miniworld.cam = skaterift.cam; - m4x3_transform_camera( global_miniworld.mmdl, &global_miniworld.cam ); - world_switch_instance(0); + glActiveTexture( GL_TEXTURE0 ); + glBindTexture( GL_TEXTURE_2D, gui.icons_texture ); + shader_model_font_uTexMain( 0 ); + shader_model_font_uColour( (v4f){1,1,1,1} ); + + miniworld_icon( cam, k_gui_icon_player, dest_world->player_co, + 1.0f + sinf(vg.time)*0.2f ); + + for( u32 i=0; ient_challenge); i++ ){ + ent_challenge *challenge = mdl_arritm( &dest_world->ent_challenge, i ); + + enum gui_icon icon = k_gui_icon_exclaim; + if( challenge->status ) + icon = k_gui_icon_tick; + + miniworld_icon( cam, icon, challenge->transform.co, 1.0f ); + } + + for( u32 i=0; ient_route); i++ ){ + ent_route *route = mdl_arritm( &dest_world->ent_route, i ); + + if( route->flags & k_ent_route_flag_achieve_gold ){ + miniworld_icon( cam, k_gui_icon_rift_run_gold, + route->board_transform[3],1.0f); + } + else if( route->flags & k_ent_route_flag_achieve_silver ){ + miniworld_icon( cam, k_gui_icon_rift_run_silver, + route->board_transform[3],1.0f); } } - ent_miniworld *miniworld = global_miniworld.active; - if( !miniworld ) - return; + for( u32 i=0; ient_route); i++ ){ + ent_route *route = mdl_arritm( &dest_world->ent_route, i ); + + v4f colour; + v4_copy( route->colour, colour ); + v3_muls( colour, 1.6666f, colour ); + shader_model_font_uColour( colour ); + miniworld_icon( cam, k_gui_icon_rift_run, route->board_transform[3],1.0f); + } +} - world_instance *world = world_current_instance(); +void ent_miniworld_preupdate(void) +{ + world_instance *hub = world_current_instance(), + *dest = &world_static.instances[k_world_purpose_client]; + + ent_miniworld *miniworld = global_miniworld.active; - if( global_miniworld.transition ){ + if( (localplayer.subsystem != k_player_subsystem_walk) || + (global_miniworld.transition) || + (world_static.active_instance != k_world_purpose_hub) || + (!miniworld) || + (dest->status != k_world_status_loaded) || + (skaterift.activity != k_skaterift_default)) { + return; } - else { - int rendering = 1; - if( world_static.instances[k_world_purpose_client].status - == k_world_status_loaded ){ - if( button_down( k_srbind_mright ) ){ - global_miniworld.transition = 1; - global_miniworld.t = 0.0f; - global_miniworld.cam = skaterift.cam; - - mdl_transform_m4x3( &miniworld->transform, global_miniworld.mmdl ); - world_switch_instance(1); + + if( button_down( k_srbind_miniworld_resume ) ){ + if( skaterift.demo_mode ){ + if( world_static.instance_addons[1]->flags & ADDON_REG_PREMIUM ){ + skaterift.activity = k_skaterift_menu; + menu.page = 0xffffffff; + menu_open_page( "Premium", k_ent_menuitem_stack_append ); + return; } } + + global_miniworld.transition = 1; + global_miniworld.t = 0.0f; + global_miniworld.cam = skaterift.cam; + + world_switch_instance(1); + srinput.state = k_input_state_resume; + menu.disable_open = 0; + gui_helper_clear(); + audio_lock(); + audio_oneshot( &audio_ui[2], 1.0f, 0.0f ); + audio_unlock(); } } + +void ent_miniworld_goback(void) +{ + audio_lock(); + audio_oneshot( &audio_ui[2], 1.0f, 0.0f ); + audio_unlock(); + + global_miniworld.transition = -1; + global_miniworld.t = 1.0f; + + global_miniworld.cam = skaterift.cam; + vg_m4x3_transform_camera( global_miniworld.mmdl, &global_miniworld.cam ); + world_switch_instance(0); +}