13 static void respawn_chooser_get_dir( v3f dir
){
15 dir
[0] = -sqrtf(0.5f
);
21 static void respawn_chooser_get_plane( v4f plane
){
22 world_instance
*world
= &world_static
.instances
[ respawn_chooser
.world_id
];
23 f32 h
= localplayer
.rb
.co
[1];
24 if( respawn_chooser
.world_id
!= world_static
.active_instance
)
25 h
= (world
->scene_geo
.bbx
[0][1] + world
->scene_geo
.bbx
[1][1]) * 0.5f
;
27 v4_copy( (v4f
){0.0f
,1.0f
,0.0f
,h
}, plane
);
30 static void respawn_world_to_plane_pos( v3f pos
, v2f plane_pos
){
32 respawn_chooser_get_dir( dir
);
35 respawn_chooser_get_plane( plane
);
38 f32 t
= ray_plane( plane
, pos
, dir
);
39 v3_muladds( pos
, dir
, t
, co
);
44 static void respawn_chooser_setworld( u32 next
){
45 world_instance
*nw
= &world_static
.instances
[next
];
46 if( nw
->status
== k_world_status_loaded
){
47 respawn_chooser
.world_id
= next
;
50 if( next
== world_static
.active_instance
)
51 v3_copy( localplayer
.rb
.co
, target
);
53 scene_context
*sc
= &nw
->scene_geo
;
54 v3_lerp( sc
->bbx
[0], sc
->bbx
[1], 0.5f
, target
);
56 respawn_world_to_plane_pos( target
, respawn_chooser
.plane_pos
);
60 static void respawn_chooser_gohome(void){
61 respawn_chooser_setworld(0);
62 world_instance
*world
= &world_static
.instances
[ respawn_chooser
.world_id
];
64 const char **alias
= respawn_homes
[respawn_chooser
.home_select
];
65 ent_spawn
*spawn
= world_find_spawn_by_name( world
, alias
[0] );
68 respawn_world_to_plane_pos( spawn
->transform
.co
,
69 respawn_chooser
.plane_pos
);
71 gui_location_print_ccmd( 1, (const char *[]){ alias
[1] } );
74 gui_location_print_ccmd( 1, (const char *[]){ "Invalid home ID" } );
77 static void respawn_map_draw_icon( camera
*cam
,
78 enum gui_icon icon
, v3f pos
){
82 m4x4_mulv( cam
->mtx
.pv
, v
, v
);
83 v2_divs( v
, v
[3], v
);
85 gui_draw_icon( icon
, (v2f
){ v
[0]*0.5f
+0.5f
,v
[1]*0.5f
+0.5f
}, 1.0f
);
88 static void respawn_chooser_pre_update(void){
89 if( skaterift
.activity
!= k_skaterift_respawning
) return;
91 if( button_down( k_srbind_mback
) ){
92 srinput
.state
= k_input_state_resume
;
93 skaterift
.activity
= k_skaterift_menu
;
94 menu
.page
= 0xffffffff;
95 menu_open_page( "Main Menu", k_ent_menuitem_stack_append
);
99 if( button_down( k_srbind_maccept
) ){
100 skaterift
.activity
= k_skaterift_default
;
101 srinput
.state
= k_input_state_resume
;
103 if( respawn_chooser
.spawn
){
104 world_static
.active_instance
= respawn_chooser
.world_id
;
105 player__spawn( respawn_chooser
.spawn
);
110 if( button_down( k_srbind_world_left
) ){
111 if( respawn_chooser
.world_id
> 0 )
112 respawn_chooser_setworld( respawn_chooser
.world_id
-1 );
115 if( button_down( k_srbind_world_right
) ){
116 u32 next
= respawn_chooser
.world_id
+1;
117 if( next
< vg_list_size(world_static
.instances
) )
118 respawn_chooser_setworld( next
);
121 if( button_down(k_srbind_home
) ){
122 respawn_chooser
.home_select
++;
123 if( respawn_chooser
.home_select
>= vg_list_size(respawn_homes
) )
124 respawn_chooser
.home_select
= 0;
125 respawn_chooser_gohome();
128 world_instance
*world
= &world_static
.instances
[ respawn_chooser
.world_id
];
129 v3f
*bbx
= world
->scene_geo
.bbx
;
130 f32
*pos
= respawn_chooser
.plane_pos
;
133 joystick_state( k_srjoystick_steer
, steer
);
134 v2_normalize_clamp( steer
);
137 m2x2_create_rotation( rm
, -0.25f
*VG_PIf
);
138 m2x2_mulv( rm
, steer
, steer
);
140 v2_muladds( pos
, steer
, vg
.time_frame_delta
* 200.0f
, pos
);
141 v2_minv( (v2f
){ bbx
[1][0], bbx
[1][2] }, pos
, pos
);
142 v2_maxv( (v2f
){ bbx
[0][0], bbx
[0][2] }, pos
, pos
);
145 camera
*cam
= &respawn_chooser
.cam
;
147 respawn_chooser_get_dir(dir
);
150 respawn_chooser_get_plane( plane
);
152 v3f co
= { pos
[0], plane
[3]*plane
[1], pos
[1] };
153 v3_muladds( co
, dir
, respawn_chooser
.boom_dist
, cam
->pos
);
155 vg_line_cross( co
, VG__RED
, 10.0f
);
157 cam
->angles
[0] = 0.25f
* VG_PIf
;
158 cam
->angles
[1] = 0.25f
* VG_PIf
;
163 camera_update_transform( cam
);
164 camera_update_view( cam
);
165 camera_update_projection( cam
);
166 camera_finalize( cam
);
169 respawn_chooser
.spawn
= NULL
;
170 f32 closest2
= INFINITY
;
172 for( u32 i
=0; i
<mdl_arrcount(&world
->ent_spawn
); i
++ ){
173 ent_spawn
*spawn
= mdl_arritm(&world
->ent_spawn
,i
);
176 v3_copy( spawn
->transform
.co
, v
);
178 m4x4_mulv( cam
->mtx
.pv
, v
, v
);
179 v2_divs( v
, v
[3], v
);
181 f32 d2
= v2_length2(v
);
183 respawn_chooser
.spawn
= spawn
;
189 * ---------------------*/
190 for( u32 i
=0; i
<mdl_arrcount(&world
->ent_challenge
); i
++ ){
191 ent_challenge
*challenge
= mdl_arritm( &world
->ent_challenge
, i
);
193 enum gui_icon icon
= k_gui_icon_exclaim
;
194 if( challenge
->status
)
195 icon
= k_gui_icon_tick
;
197 respawn_map_draw_icon( cam
, icon
, challenge
->transform
.co
);
200 for( u32 i
=0; i
<mdl_arrcount(&world
->ent_skateshop
); i
++ ){
201 ent_skateshop
*shop
= mdl_arritm( &world
->ent_skateshop
, i
);
202 if( shop
->type
== k_skateshop_type_boardshop
){
203 respawn_map_draw_icon( cam
, k_gui_icon_board
, shop
->transform
.co
);
205 else if( shop
->type
== k_skateshop_type_worldshop
){
206 respawn_map_draw_icon( cam
, k_gui_icon_world
, shop
->transform
.co
);
210 for( u32 i
=0; i
<mdl_arrcount(&world
->ent_route
); i
++ ){
211 ent_route
*route
= mdl_arritm( &world
->ent_route
, i
);
214 v4_copy( route
->colour
, colour
);
215 v3_muls( colour
, 1.6666f
, colour
);
216 gui_icon_setcolour( colour
);
217 respawn_map_draw_icon( cam
, k_gui_icon_rift_run
,
218 route
->board_transform
[3] );
222 static void respawn_begin_chooser(void){
223 skaterift
.activity
= k_skaterift_respawning
;
224 respawn_chooser
.world_id
= world_static
.active_instance
;
226 world_instance
*world
= &world_static
.instances
[ respawn_chooser
.world_id
];
227 v3f
*bbx
= world
->scene_geo
.bbx
;
229 respawn_world_to_plane_pos( localplayer
.rb
.co
, respawn_chooser
.plane_pos
);
230 respawn_chooser
.boom_dist
= 400.0f
;
231 respawn_chooser
.home_select
= 0;
236 if( gui_new_helper( input_joy_list
[k_srjoystick_steer
], &text
) )
237 vg_strcat( &text
, "move" );
239 if( gui_new_helper( input_button_list
[k_srbind_mleft
], &text
) )
240 vg_strcat( &text
, "world" );
242 if( gui_new_helper( input_button_list
[k_srbind_maccept
], &text
) )
243 vg_strcat( &text
, "spawn" );
245 if( gui_new_helper( input_button_list
[k_srbind_home
], &text
) )
246 vg_strcat( &text
, "home" );
250 static void respawn_chooser_shader_uniforms(void){
251 v4f uPlayerPos
, uSpawnPos
;
252 v4_zero( uPlayerPos
);
253 v4_zero( uSpawnPos
);
255 v3_copy( localplayer
.rb
.co
, uPlayerPos
);
257 if( respawn_chooser
.spawn
)
258 v3_copy( respawn_chooser
.spawn
->transform
.co
, uSpawnPos
);
260 uPlayerPos
[3] = v3_dist(uPlayerPos
,uSpawnPos
);
261 uSpawnPos
[3] = 1.0f
/uPlayerPos
[3];
263 shader_scene_override_uPlayerPos( uPlayerPos
);
264 shader_scene_override_uSpawnPos( uSpawnPos
);
269 #endif /* RESPAWN_C */