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.template_loaded = _board_maker.template_selection;
_board_maker.compositor_state = k_board_maker_compositor_dirty;
_board_maker.base_shader = NULL;
_board_maker.base_shader = mat0->props.compiled;
}
-static void _board_maker_load_template( void *_ )
+struct ui_enum_opt _board_maker_template_opts[] =
{
- vg_linear_clear( _board_maker.template_heap );
+ { 0, "Old School" },
+ { 1, "Popsicle" },
+ { 2, "Longboard" }
+};
- const char *mdl_path = "models/workshop/regular.mdl";
+const char *_board_maker_template_paths[] =
+{
+ [0] = "models/workshop/regular.mdl",
+ [1] = "models/workshop/popsicle.mdl",
+ [2] = "models/workshop/longboard.mdl"
+};
- if( _board_maker.board_type == k_board_maker_type_regular ){}
+static void _board_maker_load_template( void *_ )
+{
+ vg_linear_clear( _board_maker.template_heap );
mdl_context *mdl = &_board_maker.template_mdl;
- mdl_open( mdl, mdl_path, _board_maker.template_heap );
+ mdl_open( mdl, _board_maker_template_paths[_board_maker.template_selection], _board_maker.template_heap );
mdl_load_metadata_block( mdl, _board_maker.template_heap );
/* we need this for compiling it back down */
if( _board_maker.state == k_board_maker_state_none )
{
- if( _board_maker.model_loaded )
+ if( _board_maker.template_loaded == _board_maker.template_selection )
{
if( _board_maker.compositor_state == k_board_maker_compositor_dirty )
{
shader_workshop_compositor_uTexMain( 0 );
shader_workshop_compositor_uTexDecal( 1 );
-
if( _board_maker.base_shader )
{
for( u32 i=0; i<k_workshop_shader_part_max; i ++ )
}
else
{
+ if( _board_maker.template_loaded != -1 )
+ {
+ mdl_sync_std_unload( &_board_maker.template_mdl );
+ _board_maker.template_loaded = -1;
+ }
+
if( vg_loader_availible() )
{
_board_maker.state = k_board_maker_state_loading_template;
}
}
- //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 );
+ _board_maker.zoom += _board_maker.zoom_v * vg.time_frame_delta;
+ _board_maker.zoom = vg_clampf( _board_maker.zoom, 0.1f, 2.0f );
+
+ vg_camera cam;
+ v3f v0;
+ v3_sub( _board_maker.origin, _board_maker.camera_pos, v0 );
+ v3_normalize( v0 );
+ v3_angles( v0, cam.angles );
+ cam.fov = 90.0f;
+ v3_muladds( _board_maker.origin, v0, -_board_maker.zoom, cam.pos );
+ world_set_entity_driven_camera( &cam );
+
+ v3f vx;
+ v3_cross( v0, (v3f){0,1,0}, vx );
+
+ v4f qy, qx;
+ q_axis_angle( qy, (v3f){0,1,0}, _board_maker.w[0] * vg.time_frame_delta );
+ q_mul( qy, _board_maker.q, _board_maker.q );
+ q_normalize( _board_maker.q );
+
+ q_axis_angle( qx, vx, _board_maker.w[1] * vg.time_frame_delta );
+ q_mul( qx, _board_maker.q, _board_maker.q );
+ q_normalize( _board_maker.q );
+
+ /* dampen movement */
+ f32 damp = vg_maxf(0.0f, 1.0f-(vg.time_frame_delta * 5.0f) );
+ _board_maker.zoom_v *= damp;
+ v2_muls( _board_maker.w, damp, _board_maker.w );
}
void _board_maker_render( world_instance *world, vg_camera *cam )
if( _world.event != k_world_event_board_maker )
return;
- if( _board_maker.model_loaded )
+ if( _board_maker.template_loaded >= 0 )
{
vg_framebuffer_bind_texture( &_board_maker.compositor_fb, 0, 0 );
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 );
-
+ q_m3x3( _board_maker.q, root_mmdl );
v3_copy( _board_maker.origin, root_mmdl[3] );
mdl_context *mdl = &_board_maker.template_mdl;
ui_rect root = { 8, 8, 200, 600 }, panel;
ui_panel( ctx, root, panel );
+ ui_info( ctx, panel, "\xbf Drag and drop colors\n"
+ "to copy them." );
+
+ ui_enum( ctx, panel, "template", _board_maker_template_opts, 3, &_board_maker.template_selection );
+
+ bool click_out_of_panel = 1,
+ scroll_out_of_panel = 1;
+
+ if( ui_inside_rect( root, ctx->mouse_click ) )
+ click_out_of_panel = 0;
+ if( ui_inside_rect( root, ctx->mouse ) )
+ scroll_out_of_panel = 0;
if( !ui_click_up( ctx, UI_MOUSE_LEFT ) )
_board_maker.ui_dropper_colour = NULL;
ui_fill( ctx, bib, colour );
}
+ ui_spacer( ctx, panel );
+
ui_rect export_box;
ui_standard_widget( ctx, panel, export_box, 2 );
if( ui_button_text( ctx, export_box, "Export", 1 ) == k_ui_button_click )
_board_maker.pop_panel[2] = 300;
_board_maker.pop_panel[3] = 176;
+ if( ui_inside_rect( _board_maker.pop_panel, ctx->mouse_click ) )
+ click_out_of_panel = 0;
+ if( ui_inside_rect( _board_maker.pop_panel, ctx->mouse ) )
+ scroll_out_of_panel = 0;
+
ui_rect picker_panel, ok_box;
ui_panel( ctx, _board_maker.pop_panel, picker_panel );
_board_maker.pop_panel[0] = root[0] + root[2] + 8;
_board_maker.pop_panel[2] = 400;
_board_maker.pop_panel[3] = 127;
+
+ if( ui_inside_rect( _board_maker.pop_panel, ctx->mouse_click ) )
+ click_out_of_panel = 0;
+ if( ui_inside_rect( _board_maker.pop_panel, ctx->mouse ) )
+ scroll_out_of_panel = 0;
+
ui_panel( ctx, _board_maker.pop_panel, decal_panel );
/* top bar */
ui_rect fb_rect = { root[0]+root[2]+8, root[1], 800, 600 };
ui_panel( ctx, fb_rect, fb_rect );
+ click_out_of_panel = 0;
+ scroll_out_of_panel = 0;
+
enum filebrowser_action action = vg_filebrowser_ui( ctx, fb_rect, _board_maker.browser );
if( action != k_filebrowser_action_none )
};
ui_start_modal( ctx, "Exit board maker?", "EXIT", UI_MODAL_OK|UI_MODAL_CANCEL, &callbacks );
}
+
+ if( ui_clicking( ctx, UI_MOUSE_LEFT ) && click_out_of_panel )
+ {
+ v2f a = { vg.mouse_delta[0], vg.mouse_delta[1] };
+ v2_muladds( _board_maker.w, a, vg.time_frame_delta * 2.0f, _board_maker.w );
+ }
+
+ if( scroll_out_of_panel )
+ {
+ _board_maker.zoom_v += (f32)vg.mouse_wheel[1] * vg.time_frame_delta * -15.0f;
+ }
}
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 );
+ q_identity( _board_maker.q );
+ v3_zero( _board_maker.w );
+ _board_maker.zoom = 1.0f;
+ _board_maker.template_loaded = -1;
+ _board_maker.template_selection = 0;
+
_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" );
vg_filebrowser_set_path_to_home( browser );
browser->mode = k_filebrowser_mode_pick_file;
browser->filter = 0x1 << k_media_type_image;
+
+ localplayer.immobile = 1;
+ menu.disable_open = 1;
+ srinput.state = k_input_state_resume;
}
void _board_maker_close(void)
_board_maker.template_heap = NULL;
_board_maker.state = k_board_maker_state_not_ready;
mdl_sync_std_unload( &_board_maker.template_mdl );
- _board_maker.model_loaded = 0;
+ _board_maker.template_loaded = -1;
+
+ localplayer.immobile = 0;
+ menu.disable_open = 0;
+ srinput.state = k_input_state_resume;
}