chaos pt 3
[carveJwlIkooP6JGAAIwe30JlM.git] / respawn.c
1 #ifndef RESPAWN_C
2 #define RESPAWN_C
3
4 #if 0
5 #include "respawn.h"
6 #include "skaterift.h"
7 #include "world.h"
8 #include "input.h"
9 #include "gui.h"
10 #include "menu.h"
11 #include "scene.h"
12
13 static void respawn_chooser_get_dir( v3f dir ){
14 /* idk */
15 dir[0] = -sqrtf(0.5f);
16 dir[2] = sqrtf(0.5f);
17 dir[1] = 1.0f;
18 v3_normalize(dir);
19 }
20
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;
26
27 v4_copy( (v4f){0.0f,1.0f,0.0f,h}, plane );
28 }
29
30 static void respawn_world_to_plane_pos( v3f pos, v2f plane_pos ){
31 v3f dir;
32 respawn_chooser_get_dir( dir );
33 v3_negate(dir,dir);
34 v4f plane;
35 respawn_chooser_get_plane( plane );
36
37 v3f co;
38 f32 t = ray_plane( plane, pos, dir );
39 v3_muladds( pos, dir, t, co );
40 plane_pos[0] = co[0];
41 plane_pos[1] = co[2];
42 }
43
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;
48
49 v3f target;
50 if( next == world_static.active_instance )
51 v3_copy( localplayer.rb.co, target );
52 else {
53 scene_context *sc = &nw->scene_geo;
54 v3_lerp( sc->bbx[0], sc->bbx[1], 0.5f, target );
55 }
56 respawn_world_to_plane_pos( target, respawn_chooser.plane_pos );
57 }
58 }
59
60 static void respawn_chooser_gohome(void){
61 respawn_chooser_setworld(0);
62 world_instance *world = &world_static.instances[ respawn_chooser.world_id ];
63
64 const char **alias = respawn_homes[respawn_chooser.home_select];
65 ent_spawn *spawn = world_find_spawn_by_name( world, alias[0] );
66
67 if( spawn ){
68 respawn_world_to_plane_pos( spawn->transform.co,
69 respawn_chooser.plane_pos );
70
71 gui_location_print_ccmd( 1, (const char *[]){ alias[1] } );
72 }
73 else
74 gui_location_print_ccmd( 1, (const char *[]){ "Invalid home ID" } );
75 }
76
77 static void respawn_map_draw_icon( camera *cam,
78 enum gui_icon icon, v3f pos ){
79 v4f v;
80 v3_copy( pos, v );
81 v[3] = 1.0f;
82 m4x4_mulv( cam->mtx.pv, v, v );
83 v2_divs( v, v[3], v );
84
85 gui_draw_icon( icon, (v2f){ v[0]*0.5f+0.5f,v[1]*0.5f+0.5f }, 1.0f );
86 }
87
88 static void respawn_chooser_pre_update(void){
89 if( skaterift.activity != k_skaterift_respawning ) return;
90
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 );
96 return;
97 }
98
99 if( button_down( k_srbind_maccept ) ){
100 skaterift.activity = k_skaterift_default;
101 srinput.state = k_input_state_resume;
102
103 if( respawn_chooser.spawn ){
104 world_static.active_instance = respawn_chooser.world_id;
105 player__spawn( respawn_chooser.spawn );
106 }
107 return;
108 }
109
110 if( button_down( k_srbind_world_left ) ){
111 if( respawn_chooser.world_id > 0 )
112 respawn_chooser_setworld( respawn_chooser.world_id-1 );
113 }
114
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 );
119 }
120
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();
126 }
127
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;
131
132 v2f steer;
133 joystick_state( k_srjoystick_steer, steer );
134 v2_normalize_clamp( steer );
135
136 m2x2f rm;
137 m2x2_create_rotation( rm, -0.25f*VG_PIf );
138 m2x2_mulv( rm, steer, steer );
139
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 );
143
144 /* update camera */
145 camera *cam = &respawn_chooser.cam;
146 v3f dir;
147 respawn_chooser_get_dir(dir);
148
149 v4f plane;
150 respawn_chooser_get_plane( plane );
151
152 v3f co = { pos[0], plane[3]*plane[1], pos[1] };
153 v3_muladds( co, dir, respawn_chooser.boom_dist, cam->pos );
154
155 vg_line_cross( co, VG__RED, 10.0f );
156
157 cam->angles[0] = 0.25f * VG_PIf;
158 cam->angles[1] = 0.25f * VG_PIf;
159 cam->farz = 5000.0f;
160 cam->nearz = 10.0f;
161 cam->fov = 40.0f;
162
163 camera_update_transform( cam );
164 camera_update_view( cam );
165 camera_update_projection( cam );
166 camera_finalize( cam );
167
168 /* pick spawn */
169 respawn_chooser.spawn = NULL;
170 f32 closest2 = INFINITY;
171
172 for( u32 i=0; i<mdl_arrcount(&world->ent_spawn); i++ ){
173 ent_spawn *spawn = mdl_arritm(&world->ent_spawn,i);
174
175 v4f v;
176 v3_copy( spawn->transform.co, v );
177 v[3] = 1.0f;
178 m4x4_mulv( cam->mtx.pv, v, v );
179 v2_divs( v, v[3], v );
180
181 f32 d2 = v2_length2(v);
182 if( d2 < closest2 ){
183 respawn_chooser.spawn = spawn;
184 closest2 = d2;
185 }
186 }
187
188 /* icons
189 * ---------------------*/
190 for( u32 i=0; i<mdl_arrcount(&world->ent_challenge); i++ ){
191 ent_challenge *challenge = mdl_arritm( &world->ent_challenge, i );
192
193 enum gui_icon icon = k_gui_icon_exclaim;
194 if( challenge->status )
195 icon = k_gui_icon_tick;
196
197 respawn_map_draw_icon( cam, icon, challenge->transform.co );
198 }
199
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 );
204 }
205 else if( shop->type == k_skateshop_type_worldshop ){
206 respawn_map_draw_icon( cam, k_gui_icon_world, shop->transform.co );
207 }
208 }
209
210 for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
211 ent_route *route = mdl_arritm( &world->ent_route, i );
212
213 v4f colour;
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] );
219 }
220 }
221
222 static void respawn_begin_chooser(void){
223 skaterift.activity = k_skaterift_respawning;
224 respawn_chooser.world_id = world_static.active_instance;
225
226 world_instance *world = &world_static.instances[ respawn_chooser.world_id ];
227 v3f *bbx = world->scene_geo.bbx;
228
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;
232
233 gui_helper_clear();
234
235 vg_str text;
236 if( gui_new_helper( input_joy_list[k_srjoystick_steer], &text ) )
237 vg_strcat( &text, "move" );
238
239 if( gui_new_helper( input_button_list[k_srbind_mleft], &text ) )
240 vg_strcat( &text, "world" );
241
242 if( gui_new_helper( input_button_list[k_srbind_maccept], &text ) )
243 vg_strcat( &text, "spawn" );
244
245 if( gui_new_helper( input_button_list[k_srbind_home], &text ) )
246 vg_strcat( &text, "home" );
247 }
248
249 #if 0
250 static void respawn_chooser_shader_uniforms(void){
251 v4f uPlayerPos, uSpawnPos;
252 v4_zero( uPlayerPos );
253 v4_zero( uSpawnPos );
254
255 v3_copy( localplayer.rb.co, uPlayerPos );
256
257 if( respawn_chooser.spawn )
258 v3_copy( respawn_chooser.spawn->transform.co, uSpawnPos );
259
260 uPlayerPos[3] = v3_dist(uPlayerPos,uSpawnPos);
261 uSpawnPos[3] = 1.0f/uPlayerPos[3];
262
263 shader_scene_override_uPlayerPos( uPlayerPos );
264 shader_scene_override_uSpawnPos( uSpawnPos );
265 }
266 #endif
267 #endif
268
269 #endif /* RESPAWN_C */