From 8c4811f8bdd533a01012495508e2e6a06e63fe05 Mon Sep 17 00:00:00 2001 From: laochailan Date: Sat, 20 Apr 2019 18:06:27 +0200 Subject: [PATCH] cool new black hole menus --- .../shader/mainmenubg.frag.glsl | 49 +++++++++++++++++++ .../00-taisei.pkgdir/shader/mainmenubg.prog | 2 + src/menu/charselect.c | 26 +++++----- src/menu/difficultyselect.c | 28 +++++++---- src/menu/ingamemenu.c | 4 +- src/menu/mainmenu.c | 24 ++++----- src/menu/mainmenu.h | 2 +- src/menu/menu.c | 2 +- src/menu/musicroom.c | 2 +- src/menu/options.c | 16 ++++-- src/menu/replayview.c | 2 +- src/menu/spellpractice.c | 2 +- src/menu/stagepractice.c | 2 +- src/menu/stageselect.c | 2 +- src/transition.c | 12 ----- src/transition.h | 2 - 16 files changed, 117 insertions(+), 60 deletions(-) create mode 100644 resources/00-taisei.pkgdir/shader/mainmenubg.frag.glsl create mode 100644 resources/00-taisei.pkgdir/shader/mainmenubg.prog diff --git a/resources/00-taisei.pkgdir/shader/mainmenubg.frag.glsl b/resources/00-taisei.pkgdir/shader/mainmenubg.frag.glsl new file mode 100644 index 00000000..a190e123 --- /dev/null +++ b/resources/00-taisei.pkgdir/shader/mainmenubg.frag.glsl @@ -0,0 +1,49 @@ +#version 330 core + +#include "lib/render_context.glslh" +#include "lib/util.glslh" +#include "interface/standard.glslh" + +UNIFORM(1) float R; +UNIFORM(2) vec2 bg_translation; +UNIFORM(3) vec2 center; + +const float bmin = 3*sqrt(3)/2; + +// approximate formula for the real thing I pulled out of my sleeve. +// b is the impact parameter (google) all units are in terms of +// Schwarzschild radii +float bending(float b) { + float x = b - bmin; + float a = 2.5; + float c = 1.136; + float d = 0.405; + return pi + 2/b - a*log(tanh(c*pow(x,d))); +} + +void main(void) { + float dx = dFdx(texCoord.x); + float dy = dFdy(texCoord.y); + vec2 d = texCoordRaw-vec2(0.5+center.x*dx,0.5+center.y*dy); + + d.y /= dy/dx; + + float b = length(d)/R; + if(b < bmin) { + discard; + } + + float theta = angle(d); + + float phi = bending(b); + + vec3 n = vec3(0); + n.zx = dir(phi); + n.xy = rot(theta)*n.xy; + + float antialiasing = smoothstep(bmin,bmin+0.03,b); + + + fragColor = r_color * texture(tex, n.xy+bg_translation); + fragColor.rgb *= antialiasing; +} diff --git a/resources/00-taisei.pkgdir/shader/mainmenubg.prog b/resources/00-taisei.pkgdir/shader/mainmenubg.prog new file mode 100644 index 00000000..a9297ec8 --- /dev/null +++ b/resources/00-taisei.pkgdir/shader/mainmenubg.prog @@ -0,0 +1,2 @@ + +objects = standard.vert mainmenubg.frag diff --git a/src/menu/charselect.c b/src/menu/charselect.c index ef828bad..52791d84 100644 --- a/src/menu/charselect.c +++ b/src/menu/charselect.c @@ -10,7 +10,7 @@ #include "charselect.h" #include "menu.h" -#include "options.h" +#include "mainmenu.h" #include "common.h" #include "global.h" #include "video.h" @@ -26,7 +26,7 @@ static void char_menu_input(MenuData*); static void update_char_menu(MenuData *menu) { for(int i = 0; i < menu->ecount; i++) { - menu->entries[i].drawdata += 0.08*(1.0*(menu->cursor != i) - menu->entries[i].drawdata); + menu->entries[i].drawdata += 0.08*((menu->cursor != i) - menu->entries[i].drawdata); } } @@ -36,7 +36,7 @@ MenuData* create_char_menu(void) { m->input = char_menu_input; m->draw = draw_char_menu; m->logic = update_char_menu; - m->transition = TransMenuDark; + m->transition = TransFadeBlack; m->flags = MF_Abortable; m->context = (void*)(intptr_t)progress.game_settings.shotmode; @@ -54,15 +54,15 @@ MenuData* create_char_menu(void) { void draw_char_menu(MenuData *menu) { CullFaceMode cull_saved = r_cull_current(); - draw_options_menu_bg(menu); + draw_main_menu_bg(menu, SCREEN_W/2+100, 0, 0.1*(1-menu->entries[menu->cursor].drawdata)); draw_menu_title(menu, "Select Character"); r_mat_push(); r_color4(0, 0, 0, 0.7); - r_mat_translate(SCREEN_W/4*3, SCREEN_H/2, 0); - r_mat_scale(300, SCREEN_H, 1); + r_mat_translate(0, SCREEN_H/2, 0); + r_mat_scale(700, SCREEN_H, 1); r_shader_standard_notex(); - r_draw_quad(); + //r_draw_quad(); r_shader_standard(); r_mat_pop(); @@ -83,10 +83,10 @@ void draw_char_menu(MenuData *menu) { float o = 1-menu->entries[i].drawdata*2; r_color4(o, o, o, o); - draw_sprite(SCREEN_W/3-200*menu->entries[i].drawdata, 2*SCREEN_H/3, spr); + draw_sprite(SCREEN_W/2+260+200*menu->entries[i].drawdata, 2*SCREEN_H/3, spr); r_mat_push(); - r_mat_translate(SCREEN_W/4*3, SCREEN_H/3, 0); + r_mat_translate(SCREEN_W/4, SCREEN_H/3, 0); r_mat_push(); @@ -111,7 +111,7 @@ void draw_char_menu(MenuData *menu) { text_draw(title, &(TextParams) { .align = ALIGN_CENTER, - .pos = { 0, 70 }, + .pos = { 60-20*o, 30 }, .shader = "text_default", .color = RGBA(o, o, o, o), }); @@ -120,7 +120,7 @@ void draw_char_menu(MenuData *menu) { } r_mat_push(); - r_mat_translate(SCREEN_W/4*3, SCREEN_H/3, 0); + r_mat_translate(SCREEN_W/4, SCREEN_H/3, 0); ShotModeID current_subshot = SELECTED_SUBSHOT(menu); @@ -144,12 +144,14 @@ void draw_char_menu(MenuData *menu) { r_mat_pop(); float o = 0.3*sin(menu->frames/20.0)+0.5; + o *= 1-menu->entries[menu->cursor].drawdata; r_color4(o, o, o, o); for(int i = 0; i <= 1; i++) { r_mat_push(); - r_mat_translate(60 + (SCREEN_W/2 - 30)*i, SCREEN_H/2+80, 0); + r_mat_translate(30 + 340*i, SCREEN_H/3+10, 0); + r_mat_scale(0.5,0.7,1); if(i) { r_mat_scale(-1,1,1); diff --git a/src/menu/difficultyselect.c b/src/menu/difficultyselect.c index f206380d..ba382110 100644 --- a/src/menu/difficultyselect.c +++ b/src/menu/difficultyselect.c @@ -10,7 +10,7 @@ #include "difficulty.h" #include "difficultyselect.h" -#include "options.h" +#include "mainmenu.h" #include "common.h" #include "global.h" #include "video.h" @@ -26,7 +26,7 @@ static void update_difficulty_menu(MenuData *menu) { menu->drawdata[0] += (menu->cursor-menu->drawdata[0])*0.1; for(int i = 0; i < menu->ecount; ++i) { - menu->entries[i].drawdata += 0.2 * (30*(i == menu->cursor) - menu->entries[i].drawdata); + menu->entries[i].drawdata += 0.2 * ((i == menu->cursor) - menu->entries[i].drawdata); } color_approach(&diff_color, difficulty_color(menu->cursor + D_Easy), 0.1); @@ -37,11 +37,11 @@ MenuData* create_difficulty_menu(void) { m->draw = draw_difficulty_menu; m->logic = update_difficulty_menu; - m->transition = TransMenuDark; + m->transition = TransFadeBlack; m->flags = MF_Abortable; add_menu_entry(m, "“All those bullets confuse me!”\nYou will be stuck here forever", set_difficulty, (void *)D_Easy); - add_menu_entry(m, "“So it's not just about shooting stuff?”\nSomewhat challenging", set_difficulty, (void *)D_Normal); + add_menu_entry(m, "“Do you even graze?”\nSomewhat challenging", set_difficulty, (void *)D_Normal); add_menu_entry(m, "“Pain is my ally!”\nActually challenging", set_difficulty, (void *)D_Hard); add_menu_entry(m, "“I have no fear.”\nWe never playtested this one", set_difficulty, (void *)D_Lunatic); @@ -58,14 +58,14 @@ MenuData* create_difficulty_menu(void) { } void draw_difficulty_menu(MenuData *menu) { - draw_options_menu_bg(menu); + draw_main_menu_bg(menu, 0, 0, 0.05); draw_menu_title(menu, "Select Difficulty"); Color c = diff_color; r_color(color_mul(&c, RGBA(0.07, 0.07, 0.07, 0.7))); r_mat_push(); - r_mat_translate(SCREEN_W/2+30 - 25*menu->drawdata[0], SCREEN_H/3 + 90*(0.7*menu->drawdata[0]),0); + r_mat_translate(SCREEN_W/2, SCREEN_H/2,0); r_mat_rotate_deg(4*menu->drawdata[0]-4,0,0,1); r_mat_push(); r_mat_scale(SCREEN_W*1.5,120,1); @@ -75,21 +75,29 @@ void draw_difficulty_menu(MenuData *menu) { r_color3(1,1,1); r_shader("text_default"); + + float amp = menu->cursor/2.; + float shake = 0.3*amp*menu->frames; text_draw(menu->entries[menu->cursor].name, &(TextParams) { - .pos = { 40+35*menu->drawdata[0], -12 }, + .pos = { 120+15*menu->drawdata[0]+amp*sin(shake), -12+amp*cos(1.57*shake) }, }); r_shader("sprite_default"); - r_mat_pop(); + + for(int i = 0; i < menu->ecount; ++i) { r_mat_push(); - r_mat_translate(SCREEN_W/2 + SCREEN_W*sign((i&1)-0.5)*(i!=menu->cursor)*menu_fade(menu) - (int)menu->entries[i].drawdata+25*i-50, SCREEN_H/3 + 90*(i-0.3*menu->drawdata[0]),0); + r_mat_translate(0, 240*tanh(0.7*(i-menu->drawdata[0])),0); + float scale = 0.5+menu->entries[i].drawdata; + r_color4(scale, scale, scale, scale); + r_mat_scale(scale, scale, 1); - r_color3(1,1,1); draw_sprite_batched(0, 0, difficulty_sprite_name(D_Easy+i)); r_mat_pop(); + r_color3(1,1,1); } + r_mat_pop(); r_shader_standard(); } diff --git a/src/menu/ingamemenu.c b/src/menu/ingamemenu.c index ad7a53b8..e4f5bb50 100644 --- a/src/menu/ingamemenu.c +++ b/src/menu/ingamemenu.c @@ -123,7 +123,7 @@ MenuData* create_ingame_menu(void) { m->transition = TransEmpty; m->cursor = 1; m->context = "Game Paused"; - add_menu_entry(m, "Options", menu_action_enter_options, NULL)->transition = TransMenuDark; + add_menu_entry(m, "Options", menu_action_enter_options, NULL)->transition = TransFadeBlack; add_menu_entry(m, "Return to Game", menu_action_close, NULL); add_menu_entry(m, "Restart the Game", restart_game, NULL)->transition = TransFadeBlack; add_menu_entry(m, "Stop the Game", return_to_title, NULL)->transition = TransFadeBlack; @@ -146,7 +146,7 @@ MenuData* create_ingame_menu_replay(void) { m->transition = TransEmpty; m->cursor = 1; m->context = "Replay Paused"; - add_menu_entry(m, "Options", menu_action_enter_options, NULL)->transition = TransMenuDark; + add_menu_entry(m, "Options", menu_action_enter_options, NULL)->transition = TransFadeBlack; add_menu_entry(m, "Continue Watching", menu_action_close, NULL); add_menu_entry(m, "Restart the Stage", restart_game, NULL)->transition = TransFadeBlack; add_menu_entry(m, "Skip the Stage", skip_stage, NULL)->transition = TransFadeBlack; diff --git a/src/menu/mainmenu.c b/src/menu/mainmenu.c index 28d72e4a..16bef89f 100644 --- a/src/menu/mainmenu.c +++ b/src/menu/mainmenu.c @@ -55,8 +55,7 @@ static void begin_main_menu(MenuData *m) { } static void update_main_menu(MenuData *menu) { - menu->drawdata[1] += (text_width(get_font("big"), menu->entries[menu->cursor].name, 0) - menu->drawdata[1])/10.0; - menu->drawdata[2] += (35*menu->cursor - menu->drawdata[2])/10.0; + menu->drawdata[1] += 0.1*(menu->cursor-menu->drawdata[1]); for(int i = 0; i < menu->ecount; i++) { menu->entries[i].drawdata += 0.2 * ((i == menu->cursor) - menu->entries[i].drawdata); @@ -126,24 +125,27 @@ MenuData* create_main_menu(void) { return m; } -void draw_main_menu_bg(MenuData* menu) { +void draw_main_menu_bg(MenuData* menu, double center_x, double center_y, double R) { r_color4(1, 1, 1, 1); + r_shader("mainmenubg"); + r_uniform_float("R", R/(1-menu_fade(menu))); + r_uniform_vec2("bg_translation", 0.001*menu->frames, 0); + r_uniform_vec2("center", center_x, center_y); fill_screen("menu/mainmenubg"); + r_shader_standard(); } void draw_main_menu(MenuData *menu) { - draw_main_menu_bg(menu); - draw_sprite(150.5, 100, "menu/logo"); + draw_main_menu_bg(menu, 0, 0, 0.05); + draw_sprite(390, 300, "menu/logo"); r_mat_push(); - r_mat_translate(0, SCREEN_H - 15 - 35 * menu->ecount, 0); - draw_menu_selector(50 + menu->drawdata[1]/2, menu->drawdata[2], 1.5 * menu->drawdata[1], 64, menu->frames); + r_mat_translate(0, SCREEN_H/2, 0); r_shader("text_default"); float o = 0.7; for(int i = 0; i < menu->ecount; i++) { - float s = 5*sin(menu->frames/80.0 + 20*i); if(menu->entries[i].action == NULL) { r_color4(0.2 * o, 0.3 * o, 0.5 * o, o); @@ -153,10 +155,8 @@ void draw_main_menu(MenuData *menu) { } text_draw(menu->entries[i].name, &(TextParams) { - .pos = { 50 + s, 35*i }, - .font = "big", - // .shader = "text_example", - // .custom = time_get() + .pos = { 50, 20*(i-menu->drawdata[1]) }, + .font = "standard", }); } diff --git a/src/menu/mainmenu.h b/src/menu/mainmenu.h index 106bd6c0..f5f21a9c 100644 --- a/src/menu/mainmenu.h +++ b/src/menu/mainmenu.h @@ -14,7 +14,7 @@ #include "menu.h" MenuData* create_main_menu(void); -void draw_main_menu_bg(MenuData *m); +void draw_main_menu_bg(MenuData *m, double center_x, double center_y, double R); void draw_main_menu(MenuData *m); void main_menu_update_practice_menus(void); void draw_loading_screen(void); diff --git a/src/menu/menu.c b/src/menu/menu.c index 452dde92..b451679c 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -46,7 +46,7 @@ void free_menu(MenuData *menu) { MenuData* alloc_menu(void) { MenuData *menu = calloc(1, sizeof(*menu)); menu->selected = -1; - menu->transition = TransMenu; // TransFadeBlack; + menu->transition = TransFadeBlack; menu->transition_in_time = FADE_TIME; menu->transition_out_time = FADE_TIME; menu->fade = 1.0; diff --git a/src/menu/musicroom.c b/src/menu/musicroom.c index 337cb398..09eb19f7 100644 --- a/src/menu/musicroom.c +++ b/src/menu/musicroom.c @@ -247,7 +247,7 @@ MenuData* create_musicroom_menu(void) { m->logic = musicroom_logic; m->draw = musicroom_draw; m->end = musicroom_free; - m->transition = TransMenuDark; + m->transition = TransFadeBlack; m->flags = MF_Abortable; add_bgm(m, "menu"); diff --git a/src/menu/options.c b/src/menu/options.c index 3df5ea93..c0f114c7 100644 --- a/src/menu/options.c +++ b/src/menu/options.c @@ -12,6 +12,7 @@ #include "menu.h" #include "common.h" #include "options.h" +#include "mainmenu.h" #include "global.h" #include "video.h" @@ -460,7 +461,7 @@ static void draw_options_menu(MenuData*); static MenuData* create_options_menu_base(const char *s) { MenuData *m = alloc_menu(); - m->transition = TransMenuDark; + m->transition = TransFadeBlack; m->flags = MF_Abortable; m->input = options_menu_input; m->draw = draw_options_menu; @@ -875,8 +876,17 @@ MenuData* create_options_menu(void) { // --- Drawing the menu --- // void draw_options_menu_bg(MenuData* menu) { - r_color(RGBA_MUL_ALPHA(0.3, 0.3, 0.3, 0.9 + 0.1 * sin(menu->frames/100.0))); - fill_screen("menu/mainmenubg"); + draw_main_menu_bg(menu, 0, 0, 0.05); + + r_mat_push(); + r_mat_scale(SCREEN_W, SCREEN_H, 1); + r_shader_standard_notex(); + r_mat_translate(0.5,0.5,0); + r_color(RGBA(0, 0, 0, 0.5)); + r_draw_quad(); + r_mat_pop(); + r_shader_standard(); + r_color4(1, 1, 1, 1); } diff --git a/src/menu/replayview.c b/src/menu/replayview.c index b7ab7021..224f6e4d 100644 --- a/src/menu/replayview.c +++ b/src/menu/replayview.c @@ -444,7 +444,7 @@ MenuData* create_replayview_menu(void) { m->input = replayview_menu_input; m->draw = replayview_draw; m->end = replayview_free; - m->transition = TransMenuDark; + m->transition = TransFadeBlack; ReplayviewContext *ctx = malloc(sizeof(ReplayviewContext)); memset(ctx, 0, sizeof(ReplayviewContext)); diff --git a/src/menu/spellpractice.c b/src/menu/spellpractice.c index 048d35f8..ec906607 100644 --- a/src/menu/spellpractice.c +++ b/src/menu/spellpractice.c @@ -29,7 +29,7 @@ MenuData* create_spell_menu(void) { m->draw = draw_spell_menu; m->logic = animate_menu_list; m->flags = MF_Abortable; - m->transition = TransMenuDark; + m->transition = TransFadeBlack; for(StageInfo *stg = stages; stg->procs; ++stg) { if(stg->type != STAGE_SPELL) { diff --git a/src/menu/stagepractice.c b/src/menu/stagepractice.c index ce64ccfe..2b1ed166 100644 --- a/src/menu/stagepractice.c +++ b/src/menu/stagepractice.c @@ -28,7 +28,7 @@ MenuData* create_stgpract_menu(Difficulty diff) { m->draw = draw_stgpract_menu; m->logic = animate_menu_list; m->flags = MF_Abortable; - m->transition = TransMenuDark; + m->transition = TransFadeBlack; for(StageInfo *stg = stages; stg->procs; ++stg) { if(stg->type != STAGE_STORY) { diff --git a/src/menu/stageselect.c b/src/menu/stageselect.c index 1934e964..76ccb83c 100644 --- a/src/menu/stageselect.c +++ b/src/menu/stageselect.c @@ -31,7 +31,7 @@ MenuData* create_stage_menu(void) { m->draw = draw_stage_menu; m->logic = animate_menu_list; m->flags = MF_Abortable; - m->transition = TransMenuDark; + m->transition = TransFadeBlack; for(int i = 0; stages[i].procs; ++i) { if(stages[i].difficulty < lastdiff || (stages[i].difficulty == D_Extra && lastdiff != D_Extra) || (stages[i].difficulty && !lastdiff)) { diff --git a/src/transition.c b/src/transition.c index 8a5f243a..d7b7d7b0 100644 --- a/src/transition.c +++ b/src/transition.c @@ -28,18 +28,6 @@ void TransLoader(double fade) { r_color4(1, 1, 1, 1); } -void TransMenu(double fade) { - r_color4(fade, fade, fade, fade); - fill_screen("menu/mainmenubg"); - r_color4(1, 1, 1, 1); -} - -void TransMenuDark(double fade) { - r_color4(fade * 0.3, fade * 0.3, fade * 0.3, fade); - fill_screen("menu/mainmenubg"); - r_color4(1, 1, 1, 1); -} - void TransEmpty(double fade) { } static bool popq(void) { diff --git a/src/transition.h b/src/transition.h index 372ceda3..2d0a8c77 100644 --- a/src/transition.h +++ b/src/transition.h @@ -45,8 +45,6 @@ extern Transition transition; void TransFadeBlack(double fade); void TransFadeWhite(double fade); void TransLoader(double fade); -void TransMenu(double fade); -void TransMenuDark(double fade); void TransEmpty(double fade); void set_transition(TransitionRule rule, int dur1, int dur2);