cool new black hole menus

This commit is contained in:
laochailan 2019-04-20 18:06:27 +02:00
parent aecf8942ea
commit 8c4811f8bd
16 changed files with 117 additions and 60 deletions

View file

@ -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;
}

View file

@ -0,0 +1,2 @@
objects = standard.vert mainmenubg.frag

View file

@ -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);

View file

@ -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();
}

View file

@ -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;

View file

@ -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",
});
}

View file

@ -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);

View file

@ -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;

View file

@ -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");

View file

@ -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);
}

View file

@ -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));

View file

@ -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) {

View file

@ -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) {

View file

@ -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)) {

View file

@ -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) {

View file

@ -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);