class ent_miniworld(Structure):#{
_fields_ = [("transform",mdl_transform),
("pstr_world",c_uint32),
- ("purpose",c_int32),
+ ("camera",c_uint32),
("proxy",c_uint32)]
sr_functions = { 0: 'zone', 1: 'leave' }
compile_obj_transform( obj, miniworld.transform )
miniworld.pstr_world = sr_compile_string( obj_data.world )
miniworld.proxy = sr_entity_id( obj_data.proxy )
+ miniworld.camera = sr_entity_id( obj_data.camera )
sr_ent_push( miniworld )
#}
elif ent_type == 'ent_prop':#{
proxy: bpy.props.PointerProperty( \
type=bpy.types.Object, name='proxy', \
poll=lambda self,obj: sr_filter_ent_type(obj,['ent_prop']))
+ camera: bpy.props.PointerProperty( \
+ type=bpy.types.Object, name="Camera", \
+ poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera']))
#}
class SR_UL_ROUTE_NODE_LIST(bpy.types.UIList):
#include "ent_miniworld.h"
#include "world_render.h"
#include "input.h"
+#include "gui.h"
+#include "menu.h"
static void ent_miniworld_call( world_instance *world, ent_call *call ){
ent_miniworld *miniworld = mdl_arritm( &world->ent_miniworld,
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;
}
else if( call->function == 1 ){
}
}
+static void miniworld_icon( camera *cam, enum gui_icon icon, v3f pos ){
+ 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} );
+
+ 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 );
+}
+
static void ent_miniworld_render( world_instance *host_world, camera *cam ){
if( host_world != &world_static.instances[k_world_purpose_hub] )
return;
if( !rendering )
return;
- m4x3f mmdl;
- mdl_transform_m4x3( &miniworld->transform, mmdl );
- render_world_override( dest_world, host_world, mmdl, cam );
- render_world_routes( dest_world, host_world, mmdl, cam, 0, 1 );
-}
+ render_world_override( dest_world, host_world, global_miniworld.mmdl, cam,
+ global_miniworld.dest_spawn );
+ 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;
-
- global_miniworld.cam = skaterift.cam;
- m4x3_transform_camera( global_miniworld.mmdl, &global_miniworld.cam );
- world_switch_instance(0);
+ /* icons
+ * ---------------------*/
+ font3d_bind( &gui.font, k_font_shader_default, 0, NULL, cam );
+ mesh_bind( &gui.icons_mesh );
+
+ glActiveTexture( GL_TEXTURE0 );
+ glBindTexture( GL_TEXTURE_2D, gui.icons_texture );
+ shader_model_font_uTexMain( 0 );
+ shader_model_font_uColour( (v4f){1,1,1,1} );
+
+ for( u32 i=0; i<mdl_arrcount(&dest_world->ent_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 );
+ }
+
+ for( u32 i=0; i<mdl_arrcount(&dest_world->ent_skateshop); i++ ){
+ ent_skateshop *shop = mdl_arritm( &dest_world->ent_skateshop, i );
+ if( shop->type == k_skateshop_type_boardshop ){
+ miniworld_icon( cam, k_gui_icon_board, shop->transform.co );
}
+ else if( shop->type == k_skateshop_type_worldshop ){
+ miniworld_icon( cam, k_gui_icon_world, shop->transform.co );
+ }
+ }
+
+ for( u32 i=0; i<mdl_arrcount(&dest_world->ent_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] );
}
+}
+
+static 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( !miniworld )
+
+ 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) ){
+
+ if( global_miniworld.mode ){
+ global_miniworld.mode = 0;
+ menu.disable_open = 0;
+ srinput.state = k_input_state_resume;
+ }
return;
+ }
- world_instance *world = world_current_instance();
+ if( button_down( k_srbind_miniworld_resume ) ){
+ global_miniworld.mode = 0;
+ global_miniworld.transition = 1;
+ global_miniworld.t = 0.0f;
+ global_miniworld.cam = skaterift.cam;
+
+ if( global_miniworld.dest_spawn ){
+ v3_copy( global_miniworld.dest_spawn->transform.co,
+ dest->player_co );
+ }
- if( global_miniworld.transition ){
+ world_switch_instance(1);
+ global_miniworld.dest_spawn = NULL;
+ srinput.state = k_input_state_resume;
+ menu.disable_open = 0;
}
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( global_miniworld.mode == 1 ){
+ if( button_down(k_srbind_mback) ){
+ global_miniworld.mode = 0;
+ global_miniworld.dest_spawn = NULL;
+ menu.disable_open = 0;
+ srinput.state = k_input_state_resume;
+ }
+ else {
+ m4x3f mmdl_inv;
+ m4x3_invert_full( global_miniworld.mmdl, mmdl_inv );
+ v3f lco;
+ m4x3_mulv( mmdl_inv, localplayer.rb.co, lco );
+ global_miniworld.dest_spawn = world_find_closest_spawn( dest, lco );
+ }
+ }
+ else {
+ if( button_down( k_srbind_miniworld_teleport ) ){
+ global_miniworld.mode = 1;
+ menu.disable_open = 1;
}
}
}
}
+
+static void ent_miniworld_goback(void){
+ global_miniworld.transition = -1;
+ global_miniworld.t = 1.0f;
+
+ global_miniworld.cam = skaterift.cam;
+ m4x3_transform_camera( global_miniworld.mmdl, &global_miniworld.cam );
+ world_switch_instance(0);
+}
struct {
ent_miniworld *active;
int transition;
+ int mode;
f32 t;
m4x3f mmdl;
camera cam;
+
+ ent_spawn *dest_spawn;
}
static global_miniworld;
static void ent_miniworld_call( world_instance *world, ent_call *call );
static void ent_miniworld_render( world_instance *host_world, camera *cam );
+static void ent_miniworld_goback(void);
#endif /* ENT_MINIWORLD_H */
struct ent_miniworld {
mdl_transform transform;
u32 pstr_world;
-
- i32 purpose_DELTED;
+ u32 camera;
u32 proxy;
};
k_srbind_home,
k_srbind_lobby,
k_srbind_chat,
+
+ k_srbind_miniworld_teleport,
+ k_srbind_miniworld_resume,
+
k_srbind_max,
};
[k_srbind_sit] = INPUT_BASIC( SDLK_z, SDL_CONTROLLER_BUTTON_B ),
[k_srbind_lobby] = INPUT_BASIC( SDLK_TAB, SDL_CONTROLLER_BUTTON_DPAD_LEFT ),
[k_srbind_chat ] = (vg_input_op[]){ vg_keyboard, SDLK_y, vg_end },
+
+[k_srbind_miniworld_resume] = INPUT_BASIC( SDLK_e, SDL_CONTROLLER_BUTTON_A ),
+[k_srbind_miniworld_teleport]= INPUT_BASIC( SDLK_r, SDL_CONTROLLER_BUTTON_X ),
+
[k_srbind_max]=NULL
};
#include "workshop.h"
#include "respawn.h"
#include "gui.h"
+#include "ent_miniworld.h"
#define MENU_STACK_SIZE 8
else if( MDL_CONST_PSTREQ( &menu.model, q, "reset" ) ){
menu_close();
- respawn_begin_chooser();
+ ent_miniworld_goback();
}
else if( MDL_CONST_PSTREQ( &menu.model, q, "credits" ) ){
[k_skaterift_replay] = "replay",
[k_skaterift_ent_focus] = "ent_focus",
[k_skaterift_default] = "default",
- [k_skaterift_respawning]= "respawning",
} [skaterift.activity] );
player__debugtext( 1, "time_rate: %.4f", skaterift.time_rate );
}
static void skaterift_replay_post_render(void){
+ if( world_static.active_instance != k_world_purpose_client )
+ return;
+
/* capture the current resume frame at the very last point */
if( button_down( k_srbind_reset ) ){
if( skaterift.activity == k_skaterift_default ){
#ifndef RESPAWN_C
#define RESPAWN_C
+#if 0
#include "respawn.h"
#include "skaterift.h"
#include "world.h"
shader_scene_override_uSpawnPos( uSpawnPos );
}
#endif
+#endif
#endif /* RESPAWN_C */
compute_motion_vectors();
- vec3 vfrag = vec3(0.7);
+ vec3 vfrag = vec3(0.898,0.811,0.716);
vec3 qnorm = aNorm.xyz;
qnorm = normalize(floor(aNorm.xyz*4.0)*0.25);
"\n"
" compute_motion_vectors();\n"
"\n"
-" vec3 vfrag = vec3(0.7);\n"
+" vec3 vfrag = vec3(0.898,0.811,0.716);\n"
" vec3 qnorm = aNorm.xyz;\n"
"\n"
" qnorm = normalize(floor(aNorm.xyz*4.0)*0.25);\n"
/* time rate */
f32 target = 1;
- if( skaterift.activity & (k_skaterift_replay|k_skaterift_menu|
- k_skaterift_respawning) ) {
+ if( skaterift.activity & (k_skaterift_replay|k_skaterift_menu) ){
target = 0;
}
world_update( world_current_instance(), localplayer.rb.co );
audio_ambient_sprites_update( world_current_instance(), localplayer.rb.co );
- respawn_chooser_pre_update();
}
static void vg_fixed_update(void){
}
}
- if( skaterift.activity == k_skaterift_respawning ){
- camera_copy( &respawn_chooser.cam, &skaterift.cam );
- skaterift.cam.nearz = 4.0f;
- skaterift.cam.farz = 3100.0f;
- }
-
camera_update_transform( &skaterift.cam );
camera_update_view( &skaterift.cam );
camera_update_projection( &skaterift.cam );
render_view_framebuffer_ui();
remote_player_network_imgui( vg.pv );
-
- if( skaterift.activity == k_skaterift_respawning ){
- remote_players_imgui_world( world_current_instance(), vg.pv,
- 2000.0f, 0 );
- remote_players_imgui_lobby();
- }
- else {
- remote_players_chat_imgui(); /* TODO: conditional */
- remote_players_imgui_world( world_current_instance(), vg.pv, 100.0f, 1 );
- }
+ remote_players_chat_imgui(); /* TODO: conditional */
+ remote_players_imgui_world( world_current_instance(), vg.pv, 100.0f, 1 );
}
k_skaterift_replay = 0x01,
k_skaterift_ent_focus = 0x02,
k_skaterift_menu = 0x04,
- k_skaterift_respawning = 0x08
+ k_skaterift_respawning_DELETED = 0x08,
}
activity;
}
static void world_switch_instance( u32 index ){
- assert( localplayer.subsystem == k_player_subsystem_walk );
+ localplayer.subsystem = k_player_subsystem_walk;
if( index >= vg_list_size(world_static.instances) ){
vg_error( "Instance ID out of range (%u)\n", index );
ent_skateshop *skateshop = mdl_arritm( &world->ent_skateshop, index );
skateshop_render( skateshop );
}
- else if( type == k_ent_challenge ){
- }
- else if( type == k_ent_route ){
- }
+ else if( type == k_ent_challenge ){}
+ else if( type == k_ent_route ){}
+ else if( type == k_ent_miniworld ){}
else {
vg_fatal_error( "Programming error\n" );
}
world_gates.sm_marker[i] = *sm;
}
- mdl_mesh *icosphere = mdl_find_mesh( &mgate, "rs_icosphere" );
- world_gates.sm_icosphere =
- *((mdl_submesh *)mdl_arritm( &mgate.submeshs, icosphere->submesh_start ));
-
mdl_async_load_glmesh( &mgate, &world_gates.mesh );
mdl_close( &mgate );
}
struct world_gates{
glmesh mesh;
- mdl_submesh sm_surface, sm_marker[4], sm_icosphere;
+ mdl_submesh sm_surface, sm_marker[4];
camera cam;
v3f userportal_co;
state->g_debug_indices = k_debug_light_indices;
state->g_light_preview = k_light_preview;
state->g_debug_complexity = k_debug_light_complexity;
-
- if( skaterift.activity == k_skaterift_respawning )
- state->g_time_of_day = 0.1f;
- else
- state->g_time_of_day = vg_fractf( world->time );
+ state->g_time_of_day = vg_fractf( world->time );
state->g_day_phase = cosf( state->g_time_of_day * VG_PIf * 2.0f );
state->g_sunset_phase= cosf( state->g_time_of_day * VG_PIf * 4.0f + VG_PIf );
static void render_world_override( world_instance *world,
world_instance *lighting_source,
m4x3f mmdl,
- camera *cam ){
+ camera *cam,
+ ent_spawn *dest_spawn ){
struct world_pass pass = {
.cam = cam,
.fn_bind_textures = bindpoint_override,
};
shader_scene_override_use();
-#if 0
- respawn_chooser_shader_uniforms();
-#endif
shader_scene_override_uTexGarbage(0);
shader_scene_override_uTexMain(1);
shader_scene_override_uPv( pass.cam->mtx.pv );
v3_copy( world->player_co, uPlayerPos );
- m4x3f mmdl_inv;
- m4x3_invert_full( mmdl, mmdl_inv );
- v3f localized;
- m4x3_mulv( mmdl_inv, localplayer.rb.co, localized );
- ent_spawn *spawn = world_find_closest_spawn( world, localized );
- if( spawn )
- v3_copy( spawn->transform.co, uSpawnPos );
+ if( dest_spawn && (v3_dist2(dest_spawn->transform.co,uPlayerPos) > 0.1f) )
+ v3_copy( dest_spawn->transform.co, uSpawnPos );
+ else
+ v3_add( uPlayerPos, (v3f){0,-1,0}, uSpawnPos );
uPlayerPos[3] = v3_dist(uPlayerPos,uSpawnPos);
uSpawnPos[3] = 1.0f/uPlayerPos[3];
static void render_world_override( world_instance *world,
world_instance *lighting_source,
m4x3f mmdl,
- camera *cam );
+ camera *cam,
+ ent_spawn *dest_spawn );
#define WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( WORLD, SHADER ) \
world_link_lighting_ub( WORLD, _shader_##SHADER.id ); \
for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
ent_route *route = mdl_arritm( &world->ent_route, i );
- int target = (route->active_checkpoint == 0xffff? 0: 1) ||
- skaterift.activity == k_skaterift_respawning;
+ int target = route->active_checkpoint == 0xffff? 0: 1;
route->factive = vg_lerpf( route->factive, target,
0.6f*vg.time_frame_delta );
}