X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;ds=sidebyside;f=world_map.c;fp=world_map.c;h=e2fbe7a2f8dc83f8b76dca47251ff76897743ab6;hb=14267d2fb3d228060aef8e4de729254813ec245f;hp=0000000000000000000000000000000000000000;hpb=0c3d1d55160d5ce911ead69de84b1d8200a0036f;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_map.c b/world_map.c new file mode 100644 index 0000000..e2fbe7a --- /dev/null +++ b/world_map.c @@ -0,0 +1,202 @@ +#ifndef RESPAWN_C +#define RESPAWN_C + +#include "world_map.h" +#include "skaterift.h" +#include "world.h" +#include "input.h" +#include "gui.h" +#include "menu.h" +#include "scene.h" + +static void world_map_get_dir( v3f dir ){ + /* idk */ + dir[0] = -sqrtf(0.5f); + dir[2] = sqrtf(0.5f); + dir[1] = 1.0f; + v3_normalize(dir); +} + +static void world_map_get_plane( v4f plane ){ + world_instance *world = &world_static.instances[ world_map.world_id ]; + f32 h = localplayer.rb.co[1]; + if( world_map.world_id != world_static.active_instance ) + h = (world->scene_geo.bbx[0][1] + world->scene_geo.bbx[1][1]) * 0.5f; + + v4_copy( (v4f){0.0f,1.0f,0.0f,h}, plane ); +} + +static void respawn_world_to_plane_pos( v3f pos, v2f plane_pos ){ + v3f dir; + world_map_get_dir( dir ); + v3_negate(dir,dir); + v4f plane; + world_map_get_plane( plane ); + + v3f co; + f32 t = ray_plane( plane, pos, dir ); + v3_muladds( pos, dir, t, co ); + plane_pos[0] = co[0]; + plane_pos[1] = co[2]; +} + +static void respawn_map_draw_icon( camera *cam, + enum gui_icon icon, v3f pos ){ + v4f v; + v3_copy( pos, v ); + v[3] = 1.0f; + m4x4_mulv( cam->mtx.pv, v, v ); + v2_divs( v, v[3], v ); + + gui_draw_icon( icon, (v2f){ v[0]*0.5f+0.5f,v[1]*0.5f+0.5f }, 1.0f ); +} + +static void world_map_pre_update(void){ + if( skaterift.activity != k_skaterift_world_map ) return; + + if( button_down( k_srbind_mback ) ){ + gui_helper_clear(); + srinput.state = k_input_state_resume; + skaterift.activity = k_skaterift_menu; + menu.page = 0xffffffff; + menu_open_page( "Main Menu", k_ent_menuitem_stack_append ); + return; + } + + if( button_down( k_srbind_maccept ) ){ + skaterift.activity = k_skaterift_default; + srinput.state = k_input_state_resume; + + if( world_map.spawn ){ + world_static.active_instance = world_map.world_id; + player__spawn( world_map.spawn ); + } + return; + } + + world_instance *world = &world_static.instances[ world_map.world_id ]; + v3f *bbx = world->scene_geo.bbx; + f32 *pos = world_map.plane_pos; + + v2f steer; + joystick_state( k_srjoystick_steer, steer ); + v2_normalize_clamp( steer ); + + m2x2f rm; + m2x2_create_rotation( rm, -0.25f*VG_PIf ); + m2x2_mulv( rm, steer, steer ); + + v2_muladds( pos, steer, vg.time_frame_delta * 200.0f, pos ); + v2_minv( (v2f){ bbx[1][0], bbx[1][2] }, pos, pos ); + v2_maxv( (v2f){ bbx[0][0], bbx[0][2] }, pos, pos ); + + /* update camera */ + camera *cam = &world_map.cam; + v3f dir; + world_map_get_dir(dir); + + v4f plane; + world_map_get_plane( plane ); + + v3f co = { pos[0], plane[3]*plane[1], pos[1] }; + v3_muladds( co, dir, world_map.boom_dist, cam->pos ); + + vg_line_cross( co, VG__RED, 10.0f ); + + cam->angles[0] = 0.25f * VG_PIf; + cam->angles[1] = 0.25f * VG_PIf; + cam->farz = 5000.0f; + cam->nearz = 10.0f; + cam->fov = 40.0f; + + camera_update_transform( cam ); + camera_update_view( cam ); + camera_update_projection( cam ); + camera_finalize( cam ); + + /* pick spawn */ + world_map.spawn = NULL; + f32 closest2 = INFINITY; + + for( u32 i=0; ient_spawn); i++ ){ + ent_spawn *spawn = mdl_arritm(&world->ent_spawn,i); + + v4f v; + v3_copy( spawn->transform.co, v ); + v[3] = 1.0f; + m4x4_mulv( cam->mtx.pv, v, v ); + v2_divs( v, v[3], v ); + + f32 d2 = v2_length2(v); + if( d2 < closest2 ){ + world_map.spawn = spawn; + closest2 = d2; + } + } + + /* icons + * ---------------------*/ + for( u32 i=0; ient_challenge); i++ ){ + ent_challenge *challenge = mdl_arritm( &world->ent_challenge, i ); + + enum gui_icon icon = k_gui_icon_exclaim_2d; + if( challenge->status ) + icon = k_gui_icon_tick_2d; + + respawn_map_draw_icon( cam, icon, challenge->transform.co ); + } + + for( u32 i=0; ient_skateshop); i++ ){ + ent_skateshop *shop = mdl_arritm( &world->ent_skateshop, i ); + if( shop->type == k_skateshop_type_boardshop ){ + respawn_map_draw_icon( cam, k_gui_icon_board, shop->transform.co ); + } + else if( shop->type == k_skateshop_type_worldshop ){ + respawn_map_draw_icon( cam, k_gui_icon_world, shop->transform.co ); + } + } + + for( u32 i=0; ient_gate); i++ ){ + ent_gate *gate = mdl_arritm( &world->ent_gate, i ); + if( gate->flags & k_ent_gate_nonlocal ){ + respawn_map_draw_icon( cam, k_gui_icon_rift, gate->co[0] ); + } + } + + for( u32 i=0; ient_route); i++ ){ + ent_route *route = mdl_arritm( &world->ent_route, i ); + + v4f colour; + v4_copy( route->colour, colour ); + v3_muls( colour, 1.6666f, colour ); + gui_icon_setcolour( colour ); + respawn_map_draw_icon( cam, k_gui_icon_rift_run_2d, + route->board_transform[3] ); + } +} + +static void world_map_enter(void){ + skaterift.activity = k_skaterift_world_map; + world_map.world_id = world_static.active_instance; + + world_instance *world = &world_static.instances[ world_map.world_id ]; + v3f *bbx = world->scene_geo.bbx; + + respawn_world_to_plane_pos( localplayer.rb.co, world_map.plane_pos ); + world_map.boom_dist = 400.0f; + world_map.home_select = 0; + + gui_helper_clear(); + + vg_str text; + if( gui_new_helper( input_joy_list[k_srjoystick_steer], &text ) ) + vg_strcat( &text, "move" ); + + if( gui_new_helper( input_button_list[k_srbind_maccept], &text ) ) + vg_strcat( &text, "spawn" ); + + if( gui_new_helper( input_button_list[k_srbind_mback], &text ) ) + vg_strcat( &text, "exit" ); +} + +#endif /* RESPAWN_C */