From: hgn Date: Wed, 19 Mar 2025 03:14:28 +0000 (+0000) Subject: board compositor basics X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=451809fb90e15f6fcdbf3795e4930bb821217af4;p=carveJwlIkooP6JGAAIwe30JlM.git board compositor basics --- diff --git a/build.c b/build.c index 3ea8b8d..59ea1a0 100644 --- a/build.c +++ b/build.c @@ -189,6 +189,7 @@ void build_shaders(void){ /* 2D */ //_S( "blit", "blit.vs", "blit.fs" ); + _S( "workshop_compositor", "workshop_compositor.vs", "workshop_compositor.fs" ); _S( "blitblur", "blit.vs", "blitblur.fs" ); _S( "blitcolour","blit.vs", "colour.fs" ); _S( "blit_transition", "blit.vs", "blit_transition.fs" ); diff --git a/content_skaterift/maps/dev_flatworld/main.mdl b/content_skaterift/maps/dev_flatworld/main.mdl index f9c326c..36d5e52 100644 Binary files a/content_skaterift/maps/dev_flatworld/main.mdl and b/content_skaterift/maps/dev_flatworld/main.mdl differ diff --git a/content_skaterift/maps/mp_spawn/main.mdl b/content_skaterift/maps/mp_spawn/main.mdl index 5862ad4..99025d2 100644 Binary files a/content_skaterift/maps/mp_spawn/main.mdl and b/content_skaterift/maps/mp_spawn/main.mdl differ diff --git a/content_skaterift/models/workshop/regular.mdl b/content_skaterift/models/workshop/regular.mdl new file mode 100644 index 0000000..dc4952f Binary files /dev/null and b/content_skaterift/models/workshop/regular.mdl differ diff --git a/shaders/workshop_compositor.fs b/shaders/workshop_compositor.fs new file mode 100644 index 0000000..7011c33 --- /dev/null +++ b/shaders/workshop_compositor.fs @@ -0,0 +1,11 @@ +out vec4 FragColor; +uniform sampler2D uTexMain; + +uniform vec4 uColour; + +in vec2 aUv; + +void main() +{ + FragColor = texture( uTexMain, aUv ) * uColour; +} diff --git a/shaders/workshop_compositor.vs b/shaders/workshop_compositor.vs new file mode 100644 index 0000000..2593725 --- /dev/null +++ b/shaders/workshop_compositor.vs @@ -0,0 +1,8 @@ +layout (location=0) in vec2 a_co; +out vec2 aUv; + +void main() +{ + gl_Position = vec4(a_co*2.0-1.0,0.0,1.0); + aUv = a_co; +} diff --git a/skaterift_blender/sr_main.py b/skaterift_blender/sr_main.py index c84112c..0ced07b 100644 --- a/skaterift_blender/sr_main.py +++ b/skaterift_blender/sr_main.py @@ -1089,9 +1089,12 @@ class SR_MATERIAL_PANEL(bpy.types.Panel): info = material_info( active_mat ) - if 'tex_diffuse' in info:#{ - _.layout.label( icon='INFO', \ - text=F"{info['tex_diffuse'].name} will be compiled" ) + for prop in info: + #{ + if type(info[prop]) == bpy.types.Image: + #{ + _.layout.label( icon='INFO', text=F"{info[prop].name} will be compiled" ) + #} #} _.layout.prop( active_mat.SR_data, "shader" ) @@ -2175,7 +2178,8 @@ class SR_MATERIAL_PROPERTIES(bpy.types.PropertyGroup): ('fxglow','FX Glow',''), ('cubemap','Cubemap',''), ('walking','Walking',''), - ('foliage','Foliage','') + ('foliage','Foliage',''), + ('workshop','Workshop','') ]) surface_prop: bpy.props.EnumProperty( diff --git a/skaterift_blender/sr_mat.py b/skaterift_blender/sr_mat.py index 66e9261..3539666 100644 --- a/skaterift_blender/sr_mat.py +++ b/skaterift_blender/sr_mat.py @@ -38,6 +38,18 @@ cxr_graph_mapping = \ "Emission": { "Color": material_tex_image("tex_diffuse") + }, + "Workshop": + { + "Truck1": material_tex_image("truck1"), + "Truck2": material_tex_image("truck2"), + "Wheel1": material_tex_image("wheel1"), + "Wheel2": material_tex_image("wheel2"), + "Wheel3": material_tex_image("wheel3"), + "Wheel4": material_tex_image("wheel4"), + "Edge": material_tex_image("edge"), + "Griptape": material_tex_image("griptape"), + "Deck": material_tex_image("deck"), } } @@ -232,6 +244,18 @@ def sr_compile_material( mat ): #{ m.shader = 9 #} + if mat.SR_data.shader == 'workshop': + #{ + m.shader = 11 + + for prop in inf: + #{ + if type(inf[prop]) == bpy.types.Image: + #{ + shader_prop_texture( msg, prop, inf[prop] ) + #} + #} + #} # sr_lib.vg_msg_print( byref(msg), msg.cur.co ) diff --git a/src/board_maker.c b/src/board_maker.c new file mode 100644 index 0000000..e8b8a1f --- /dev/null +++ b/src/board_maker.c @@ -0,0 +1,336 @@ +#include "board_maker.h" +#include "shaders/workshop_compositor.h" + +struct _board_maker _board_maker = +{ + .compositor_fb = + { + .display_name = "Workshop Compositor texture", + .resolution_div = 0, + .fixed_w = 512, .fixed_h = 512, + .attachments = (vg_framebuffer_attachment[]) + { + { + .display_name = "RGBA", + .purpose = k_framebuffer_attachment_type_texture, + .quality = k_framebuffer_quality_all, + .internalformat = GL_RGBA, + .format = GL_RGBA, + .type = GL_UNSIGNED_BYTE, + .attachment = GL_COLOR_ATTACHMENT0 + } + }, + .attachment_count = 1 + } +}; + +/* model loader thread + * ----------------------------------------- */ + +static void _async_board_maker_load_finish( void *payload, u32 size ) +{ + _board_maker.state = k_board_maker_state_none; + _board_maker.model_loaded = 1; + _board_maker.compositor_state = k_board_maker_compositor_dirty; + + _board_maker.base_shader = NULL; + + mdl_context *mdl = &_board_maker.template_mdl; + if( mdl->version <= 105 ) + return; + + if( mdl->material_count < 1 ) + return; + + mdl_material *mat0 = &mdl->materials[0]; + if( mat0->shader != k_shader_workshop ) + return; + + _board_maker.base_shader = mat0->props.compiled; +} + +static void _board_maker_load_template( void *_ ) +{ + vg_linear_clear( _board_maker.template_heap ); + + const char *mdl_path = "models/workshop/regular.mdl"; + + if( _board_maker.board_type == k_board_maker_type_regular ){} + + mdl_context *mdl = &_board_maker.template_mdl; + mdl_open( mdl, mdl_path, _board_maker.template_heap ); + mdl_load_metadata_block( mdl, _board_maker.template_heap ); + mdl_async_full_load_std( mdl, NULL ); + mdl_close( mdl ); + + vg_async_call( _async_board_maker_load_finish, NULL, 0 ); +} + +/* system init thread + * ----------------------------------------------------- */ + +static void _async_board_maker_init_finish( void *payload, u32 size ) +{ + _board_maker.state = k_board_maker_state_none; +} + +static void _board_maker_init_thread( void *_ ) +{ + vg_framebuffer_create( &_board_maker.compositor_fb ); + vg_async_call( _async_board_maker_init_finish, NULL, 0 ); +} + +/* update loop */ +void _board_maker_pre_update(void) +{ + if( _world.event != k_world_event_board_maker ) + return; + + if( _board_maker.state == k_board_maker_state_none ) + { + if( _board_maker.model_loaded ) + { + if( _board_maker.compositor_state == k_board_maker_compositor_dirty ) + { + vg_framebuffer_bind( &_board_maker.compositor_fb, 1.0f ); + glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); + glClear( GL_COLOR_BUFFER_BIT ); + + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + + shader_workshop_compositor_use(); + shader_workshop_compositor_uTexMain( 0 ); + + glActiveTexture( GL_TEXTURE0 ); + + if( _board_maker.base_shader ) + { + for( u32 i=0; itex_all[i]; + + if( tex_id ) + { + mdl_texture *tex = &_board_maker.template_mdl.textures[ tex_id-1 ]; + shader_workshop_compositor_uColour( _board_maker.colours[i] ); + glBindTexture( GL_TEXTURE_2D, tex->glname ); + vg_render_fullscreen_quad(); + } + } + } + + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + + _board_maker.compositor_state = k_board_maker_compositor_done; + } + } + else + { + if( vg_loader_availible() ) + { + _board_maker.state = k_board_maker_state_loading_template; + vg_loader_start( _board_maker_load_template, NULL ); + } + } + } + else + { + if( _board_maker.state == k_board_maker_state_not_ready ) + { + if( vg_loader_availible() ) + { + _board_maker.state = k_board_maker_state_initializing; + vg_loader_start( _board_maker_init_thread, NULL ); + return; + } + } + } + + //vg_camera temp; + //ent_camera_unpack( af_arritm( &world->ent_camera, mdl_entity_id_id(challenge->camera_id) ), &temp ); + //world_set_entity_driven_camera( &temp ); +} + +void _board_maker_render( world_instance *world, vg_camera *cam ) +{ + if( _world.event != k_world_event_board_maker ) + return; + + if( _board_maker.model_loaded ) + { + vg_framebuffer_bind_texture( &_board_maker.compositor_fb, 0, 0 ); + + shader_model_entity_use(); + shader_model_entity_uTexMain( 0 ); + shader_model_entity_uCamera( cam->transform[3] ); + shader_model_entity_uPv( cam->mtx.pv ); + + WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( world, model_entity ); + + m4x3f root_mmdl; + m4x3_identity( root_mmdl ); + + v4f qx, qy, qq; + q_axis_angle( qx, (v3f){1,0,0}, vg.time*0.1f ); + q_axis_angle( qy, (v3f){0,1,0}, vg.time*0.2f ); + q_mul( qx, qy, qq ); + q_normalize( qq ); + q_m3x3( qq, root_mmdl ); + + v3_copy( _board_maker.origin, root_mmdl[3] ); + + mdl_context *mdl = &_board_maker.template_mdl; + mesh_bind( &mdl->mesh ); + + for( u32 i=0; imesh_count; i ++ ) + { + mdl_mesh *mesh = &mdl->meshes[ i ]; + + m4x3f mmdl; + mdl_transform_m4x3( &mesh->transform, mmdl ); + m4x3_mul( root_mmdl, mmdl, mmdl ); + + m4x4f m4mdl; + m4x3_expand( mmdl, m4mdl ); + m4x4_mul( cam->mtx_prev.pv, m4mdl, m4mdl ); + shader_model_entity_uPvmPrev( m4mdl ); + shader_model_entity_uMdl( mmdl ); + + for( u32 j=0; jsubmesh_count; j ++ ) + { + mdl_submesh *sm = &mdl->submeshes[ mesh->submesh_start + j ]; + mdl_draw_submesh( sm ); + } + } + } +} + +static void _board_maker_colour_button( ui_context *ctx, ui_rect rect, f32 *colour_pointer ) +{ + enum ui_button_state state = ui_button_base( ctx, rect ); + + u32 colour = v4f_u32_colour( colour_pointer ); + ui_fill( ctx, rect, colour ); + + if( state == k_ui_button_hover ) + ui_outline( ctx, rect, -1, ui_colour( ctx, k_ui_fg ), 0 ); + + if( state == k_ui_button_click ) + { + _board_maker.ui_target_colour = colour_pointer; + _board_maker.ui_state = k_board_maker_ui_state_pick_colour; + _board_maker.picker_panel[1] = rect[1]; + } + + if( state == k_ui_button_holding_outside ) + { + _board_maker.ui_dropper_colour = colour_pointer; + } + + if( ui_inside_rect( rect, ctx->mouse ) ) + { + if( ui_click_up( ctx, UI_MOUSE_LEFT ) ) + { + if( _board_maker.ui_dropper_colour ) + { + v4_copy( _board_maker.ui_dropper_colour, colour_pointer ); + _board_maker.compositor_state = k_board_maker_compositor_dirty; + } + } + } +} + +void _board_maker_ui( ui_context *ctx ) +{ + if( _world.event != k_world_event_board_maker ) + return; + + ui_capture_mouse( ctx, 1 ); + + ui_rect panel = { 8, 8, 200, 600 }; + + if( !ui_click_up( ctx, UI_MOUSE_LEFT ) ) + _board_maker.ui_dropper_colour = NULL; + + ui_info( ctx, panel, "Wheels" ); + ui_rect w1, w2, w3, w4, wheel_row; + ui_standard_widget( ctx, panel, wheel_row, 1 ); + ui_split_ratio( wheel_row, k_ui_axis_v, 0.5f, 2, w1, w3 ); + ui_split_ratio( w1, k_ui_axis_v, 0.5f, 2, w1, w2 ); + ui_split_ratio( w3, k_ui_axis_v, 0.5f, 2, w3, w4 ); + _board_maker_colour_button( ctx, w1, _board_maker.colours[ k_workshop_shader_part_wheel1 ] ); + _board_maker_colour_button( ctx, w2, _board_maker.colours[ k_workshop_shader_part_wheel2 ] ); + _board_maker_colour_button( ctx, w3, _board_maker.colours[ k_workshop_shader_part_wheel3 ] ); + _board_maker_colour_button( ctx, w4, _board_maker.colours[ k_workshop_shader_part_wheel4 ] ); + + ui_info( ctx, panel, "Trucks" ); + ui_rect truck_row, t1, t2; + ui_standard_widget( ctx, panel, truck_row, 1 ); + ui_split_ratio( truck_row, k_ui_axis_v, 0.5f, 2, t1, t2 ); + _board_maker_colour_button( ctx, t1, _board_maker.colours[ k_workshop_shader_part_truck1 ] ); + _board_maker_colour_button( ctx, t2, _board_maker.colours[ k_workshop_shader_part_truck2 ] ); + + ui_info( ctx, panel, "Deck" ); + ui_rect deck_row, deckc, decki, decke; + ui_standard_widget( ctx, panel, deck_row, 1 ); + ui_split_ratio( deck_row, k_ui_axis_v, 0.66666f, 2, deckc, decke ); + ui_split_ratio( deckc, k_ui_axis_v, 0.5f, 2, deckc, decki ); + _board_maker_colour_button( ctx, deckc, _board_maker.colours[ k_workshop_shader_part_deck ] ); + _board_maker_colour_button( ctx, decke, _board_maker.colours[ k_workshop_shader_part_edge ] ); + + ui_info( ctx, panel, "Griptape" ); + ui_rect griptape_row, gtc, gti; + ui_standard_widget( ctx, panel, griptape_row, 1 ); + ui_split_ratio( griptape_row, k_ui_axis_v, 0.5f, 2, gtc, gti ); + _board_maker_colour_button( ctx, gtc, _board_maker.colours[ k_workshop_shader_part_griptape ] ); + + if( _board_maker.ui_dropper_colour ) + { + ui_rect bib = { ctx->mouse[0], ctx->mouse[1], 16, 16 }; + u32 colour = v4f_u32_colour( _board_maker.ui_dropper_colour ); + ui_fill( ctx, bib, colour ); + } + + if( _board_maker.ui_state == k_board_maker_ui_state_pick_colour ) + { + _board_maker.picker_panel[0] = panel[0] + panel[2] + 8; + _board_maker.picker_panel[2] = 300; + _board_maker.picker_panel[3] = 160; + + ui_rect picker_panel, ok_box; + rect_copy( _board_maker.picker_panel, picker_panel ); + ui_outline( ctx, picker_panel, 1, ui_colour( ctx, k_ui_fg ), 0 ); + + if( ui_colourpicker( ctx, picker_panel, NULL, _board_maker.ui_target_colour, k_ui_colour_type_rgb ) ) + _board_maker.compositor_state = k_board_maker_compositor_dirty; + + ui_split( picker_panel, k_ui_axis_h, -24, 0, picker_panel, ok_box ); + + ctx->font = &vgf_default_large; + if( ui_button_text( ctx, ok_box, "\xb3", 1 ) == k_ui_button_click ) + { + _board_maker.ui_state = k_board_maker_ui_state_default; + } + ctx->font = &vgf_default_small; + } +} + +void _board_maker_open(void) +{ + VG_ASSERT( _board_maker.state == k_board_maker_state_not_ready ); + VG_ASSERT( _board_maker.model_loaded == 0 ); + VG_ASSERT( _board_maker.static_heap == NULL ); + VG_ASSERT( _board_maker.template_heap == NULL ); + + _board_maker.static_heap = _vg_create_linear_allocator( NULL, 8*1024*1024, VG_MEMORY_SYSTEM, "Board maker static" ); + _board_maker.template_heap = _vg_create_linear_allocator( NULL, 16*1024*1024, VG_MEMORY_SYSTEM, "Board maker dynamic" ); + + for( u32 i=0; itex_diffuse, - NULL ); - vg_msg_getkvvecf( msg, "sand_colour", k_vg_msg_v4f, - props->sand_colour, (v4f){ 0.79, 0.63, 0.48, 1.0 } ); - vg_msg_getkvvecf( msg, "blend_offset", k_vg_msg_v2f, - props->blend_offset, (v2f){ 0.5, 0.0 } ); + vg_msg_getkvintg( msg, "tex_diffuse", k_vg_msg_u32, &props->tex_diffuse, NULL ); + vg_msg_getkvvecf( msg, "sand_colour", k_vg_msg_v4f, props->sand_colour, (v4f){ 0.79, 0.63, 0.48, 1.0 } ); + vg_msg_getkvvecf( msg, "blend_offset", k_vg_msg_v2f, props->blend_offset, (v2f){ 0.5, 0.0 } ); return props; } @@ -153,8 +150,33 @@ void *mdl_shader_cubemapped( vg_msg *msg, void *alloc ) return props; } -static bool mdl_legacy_v105_properties( struct mdl_material_v105 *mat, - vg_msg *dst ) +// TODO: Shitty place for this to be +const char *_shader_prop_workshop_keys[] = +{ + [k_workshop_shader_part_truck1 ] = "truck1", + [k_workshop_shader_part_truck2 ] = "truck2", + [k_workshop_shader_part_wheel1 ] = "wheel1", + [k_workshop_shader_part_wheel2 ] = "wheel2", + [k_workshop_shader_part_wheel3 ] = "wheel3", + [k_workshop_shader_part_wheel4 ] = "wheel4", + [k_workshop_shader_part_edge ] = "edge", + [k_workshop_shader_part_griptape] = "griptape", + [k_workshop_shader_part_deck ] = "deck" +}; + +void *mdl_shader_workshop( vg_msg *msg, void *alloc ) +{ + struct shader_props_workshop *props = vg_linear_alloc( alloc, sizeof(struct shader_props_workshop) ); + + for( u32 i=0; itex_all[i], NULL ); + } + + return props; +} + +static bool mdl_legacy_v105_properties( struct mdl_material_v105 *mat, vg_msg *dst ) { vg_msg_wkvnum( dst, "tex_diffuse", k_vg_msg_u32, 1, &mat->tex_diffuse ); @@ -220,8 +242,7 @@ void mdl_load_materials( mdl_context *mdl, void *lin_alloc ) else #endif { - vg_msg_init( &msg, data.data + mat->props.kvs.offset, - mat->props.kvs.size ); + vg_msg_init( &msg, data.data + mat->props.kvs.offset, mat->props.kvs.size ); } if( mat->shader == k_shader_standard || @@ -247,6 +268,10 @@ void mdl_load_materials( mdl_context *mdl, void *lin_alloc ) { mat->props.compiled = mdl_shader_water( &msg, lin_alloc ); } + else if( mat->shader == k_shader_workshop ) + { + mat->props.compiled = mdl_shader_workshop( &msg, lin_alloc ); + } else mat->props.compiled = NULL; } diff --git a/src/model.h b/src/model.h index 690bb90..4e79695 100644 --- a/src/model.h +++ b/src/model.h @@ -21,6 +21,7 @@ enum mdl_shader{ k_shader_cubemap = 8, k_shader_walking = 9, k_shader_foliage = 10, + k_shader_workshop = 11, k_shader_override = 30000 }; diff --git a/src/player_remote.c b/src/player_remote.c index 903ba98..88dbb6c 100644 --- a/src/player_remote.c +++ b/src/player_remote.c @@ -943,14 +943,14 @@ void remote_players_imgui_world( ui_context *ctx, ui_flush( ctx, k_ui_shader_colour, NULL ); } -static void chat_escape( ui_context *ctx ) +static void chat_escape( ui_context *ctx, void *userdata ) { netplayers.chatting = -1; } -static void chat_enter( ui_context *ctx, char *buf, u32 len ){ - vg_strncpy( buf, netplayers.chat_message, NETWORK_MAX_CHAT, - k_strncpy_always_add_null ); +static void chat_enter( ui_context *ctx, char *buf, u32 len, void *userdata ) +{ + vg_strncpy( buf, netplayers.chat_message, NETWORK_MAX_CHAT, k_strncpy_always_add_null ); netplayers.chatting = -1; netplayers.chat_time = vg.time_real; chat_send_message( buf ); diff --git a/src/scripts/generic.c b/src/scripts/generic.c new file mode 100644 index 0000000..9c983cb --- /dev/null +++ b/src/scripts/generic.c @@ -0,0 +1,28 @@ + +static bool _skaterift_script_board_maker( ent_script_event *event ) +{ + if( on_function_trigger( event, 0 ) ) + { + v3_zero( _board_maker.angles ); + + if( world_set_event( k_world_event_board_maker ) ) + { + ent_list *list = event->entity_list; + for( u32 i=0; ientity_ref_count; i ++ ) + { + file_entity_ref *ref = af_arritm( &event->world->file_entity_ref, list->entity_ref_start + i ); + + u32 type = mdl_entity_id_type( ref->entity_id ), + index = mdl_entity_id_id( ref->entity_id ); + + if( type == k_ent_marker ) + { + ent_marker *marker = af_arritm( &event->world->ent_marker, index ); + v3_copy( marker->transform.co, _board_maker.origin ); + } + } + _board_maker_open(); + } + } + return 1; +} diff --git a/src/shader_props.h b/src/shader_props.h index 29e79f5..05f9ef0 100644 --- a/src/shader_props.h +++ b/src/shader_props.h @@ -35,3 +35,22 @@ struct shader_props_cubemapped u32 cubemap_entity; v4f tint; }; + +enum workshop_shader_part +{ + k_workshop_shader_part_truck1, + k_workshop_shader_part_truck2, + k_workshop_shader_part_wheel1, + k_workshop_shader_part_wheel2, + k_workshop_shader_part_wheel3, + k_workshop_shader_part_wheel4, + k_workshop_shader_part_edge, + k_workshop_shader_part_griptape, + k_workshop_shader_part_deck, + k_workshop_shader_part_max +}; +struct shader_props_workshop +{ + u32 tex_all[k_workshop_shader_part_max]; +}; +extern const char *_shader_prop_workshop_keys[k_workshop_shader_part_max]; diff --git a/src/skaterift.c b/src/skaterift.c index 63b7089..3aab6ac 100644 --- a/src/skaterift.c +++ b/src/skaterift.c @@ -53,6 +53,7 @@ #include "skaterift_script.h" #include "ent_challenge.h" #include "ent_script.h" +#include "board_maker.h" struct skaterift_globals skaterift = { @@ -184,6 +185,7 @@ void vg_pre_update(void) target = 0; world_update( &_world.main, localplayer.rb.co ); + _board_maker_pre_update(); cutscene_update( vg.time_rate * vg.time_frame_delta ); @@ -528,6 +530,7 @@ void vg_gui( ui_context *ctx ) vg_framebuffer_inverse_ratio( _vg_render.fb_main, vg_ui.bg_inverse_ratio ); _cutscene_gui( ctx ); + _board_maker_ui( ctx ); menu_gui( ctx ); player__im_gui( ctx ); world_instance *world = &_world.main; @@ -613,3 +616,4 @@ void vg_framebuffer_resize( int w, int h ) #include "control_overlay.c" #include "ent_camera.c" #include "skaterift_script.c" +#include "board_maker.c" diff --git a/src/skaterift_script.c b/src/skaterift_script.c index 0ed9e47..e9dc62d 100644 --- a/src/skaterift_script.c +++ b/src/skaterift_script.c @@ -691,7 +691,9 @@ enum generic_cutscene_event challenge_video_wrapper( const struct generic_cutsce return cs_event; } +#include "scripts/generic.c" #include "scripts/blocker_break.c" + #include "scripts/heaven.c" #include "scripts/hub.c" #include "scripts/tutorial_island.c" @@ -704,6 +706,8 @@ enum generic_cutscene_event challenge_video_wrapper( const struct generic_cutsce struct ent_script_table_entry _ent_script_table[] = { + { "board_maker", _skaterift_script_board_maker }, + { "intro", _skaterift_script_intro }, { "hub", _skaterift_script_hub }, diff --git a/src/utest.c b/src/utest.c index fcf768d..c28578c 100644 --- a/src/utest.c +++ b/src/utest.c @@ -87,6 +87,9 @@ void vg_render(void) void vg_gui( ui_context *ctx ) { ui_capture_mouse( ctx, 1 ); + + ui_rect rect = { 8,8, vg.window_x-16, vg.window_y-16 }; + } void vg_framebuffer_resize( int w, int h ){} diff --git a/src/workshop.c b/src/workshop.c index a2c1ef3..6c3e7eb 100644 --- a/src/workshop.c +++ b/src/workshop.c @@ -1071,17 +1071,17 @@ static void workshop_render_board_preview(void) * ----------------------------------------------------------------------------- */ -static void workshop_changed_model_path( ui_context *ctx, char *buf, u32 len ) +static void workshop_changed_model_path( ui_context *ctx, char *buf, u32 len, void *userdata ) { workshop_form.submission.submit_file_and_image = 1; } -static void workshop_changed_title( ui_context *ctx, char *buf, u32 len ) +static void workshop_changed_title( ui_context *ctx, char *buf, u32 len, void *userdata ) { workshop_form.submission.submit_title = 1; } -static void workshop_changed_description( ui_context *ctx, char *buf, u32 len ) +static void workshop_changed_description( ui_context *ctx, char *buf, u32 len, void *userdata ) { workshop_form.submission.submit_description = 1; } diff --git a/src/world.h b/src/world.h index cc329f8..2c99f1b 100644 --- a/src/world.h +++ b/src/world.h @@ -263,7 +263,8 @@ struct world_static k_world_event_challenge, k_world_event_shop, k_world_event_route_leaderboard, - k_world_event_interact + k_world_event_interact, + k_world_event_board_maker } event; diff --git a/src/world_render.c b/src/world_render.c index 02008d5..c18406b 100644 --- a/src/world_render.c +++ b/src/world_render.c @@ -14,6 +14,7 @@ #include "shaders/model_sky_cubemap.h" #include "shaders/scene_preview.h" #include "shaders/scene_override.h" +#include "board_maker.h" struct world_render world_render; @@ -1153,8 +1154,7 @@ void render_world( world_instance *world, vg_camera *cam, glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); - glDrawBuffers( 2, (GLenum[]){ GL_COLOR_ATTACHMENT0, - GL_COLOR_ATTACHMENT1 } ); + glDrawBuffers( 2, (GLenum[]){ GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 } ); } render_world_fxglow( world, world, cam, NULL, 1, 1, 0 ); @@ -1182,6 +1182,7 @@ void render_world( world_instance *world, vg_camera *cam, render_remote_players( world, cam ); render_other_entities( world, cam ); ent_miniworld_render( world, cam ); + _board_maker_render( world, cam ); if( stenciled ) { @@ -1577,8 +1578,7 @@ void imgui_world_light_edit( ui_context *ctx, world_instance *world ) static i32 option_to_edit = 0; ui_enum( ctx, panel, "option", skybox_setting_options, 5, &option_to_edit ); - ui_colourpicker( ctx, panel, "colour", - skybox_prop_location( world, option_to_edit ) ); + ui_colourpicker( ctx, panel, "colour", skybox_prop_location( world, option_to_edit ), k_ui_colour_type_rgba ); if( ui_button( ctx, panel, "save tweaker file ('/tmp/tweaker.txt')\n" ) == 1 ) {