cool new black hole menus
This commit is contained in:
parent
aecf8942ea
commit
8c4811f8bd
16 changed files with 117 additions and 60 deletions
49
resources/00-taisei.pkgdir/shader/mainmenubg.frag.glsl
Normal file
49
resources/00-taisei.pkgdir/shader/mainmenubg.frag.glsl
Normal 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;
|
||||
}
|
2
resources/00-taisei.pkgdir/shader/mainmenubg.prog
Normal file
2
resources/00-taisei.pkgdir/shader/mainmenubg.prog
Normal file
|
@ -0,0 +1,2 @@
|
|||
|
||||
objects = standard.vert mainmenubg.frag
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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",
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue