Refactor matrix stack API to get rid of matrix mode (#177)
This replaces the r_mat_foo functions with specialized r_mat_{mv,tex,proj}_foo counterparts that operate explicitly on the modelview, texture, and projection matrix stacks respectively.
This commit is contained in:
parent
fa5757191c
commit
9d3bf87559
46 changed files with 948 additions and 930 deletions
78
src/boss.c
78
src/boss.c
|
@ -86,6 +86,8 @@ void draw_extraspell_bg(Boss *boss, int time) {
|
|||
// overlay for all extra spells
|
||||
// FIXME: Please replace this with something that doesn't look like shit.
|
||||
|
||||
r_state_push();
|
||||
|
||||
float opacity = 0.7;
|
||||
r_color4(0.2 * opacity, 0.1 * opacity, 0, 0);
|
||||
fill_viewport(sin(time) * 0.015, time / 50.0, 1, "stage3/wspellclouds");
|
||||
|
@ -96,8 +98,8 @@ void draw_extraspell_bg(Boss *boss, int time) {
|
|||
));
|
||||
fill_viewport(cos(time) * 0.015, time / 70.0, 1, "stage4/kurumibg2");
|
||||
fill_viewport(sin(time*1.1+2.1) * 0.015, time / 30.0, 1, "stage4/kurumibg2");
|
||||
r_blend(BLEND_PREMUL_ALPHA);
|
||||
r_color4(1, 1, 1, 1);
|
||||
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
static inline bool healthbar_style_is_radial(void) {
|
||||
|
@ -349,9 +351,9 @@ static void draw_radial_healthbar(Boss *boss) {
|
|||
}
|
||||
|
||||
r_state_push();
|
||||
r_mat_push();
|
||||
r_mat_translate(creal(boss->pos), cimag(boss->pos), 0);
|
||||
r_mat_scale(220, 220, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(creal(boss->pos), cimag(boss->pos), 0);
|
||||
r_mat_mv_scale(220, 220, 0);
|
||||
r_shader("healthbar_radial");
|
||||
r_uniform_vec4_rgba("borderColor", RGBA(0.75, 0.75, 0.75, 0.75));
|
||||
r_uniform_vec4_rgba("glowColor", RGBA(0.5, 0.5, 1.0, 0.75));
|
||||
|
@ -361,7 +363,7 @@ static void draw_radial_healthbar(Boss *boss) {
|
|||
r_uniform_vec2("fill", boss->healthbar.fill_total, boss->healthbar.fill_alt);
|
||||
r_uniform_float("opacity", boss->healthbar.opacity);
|
||||
r_draw_quad();
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
|
@ -376,9 +378,9 @@ static void draw_linear_healthbar(Boss *boss) {
|
|||
const float height = 24;
|
||||
|
||||
r_state_push();
|
||||
r_mat_push();
|
||||
r_mat_translate(1 + width/2, height/2 - 3, 0);
|
||||
r_mat_scale(width, height, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(1 + width/2, height/2 - 3, 0);
|
||||
r_mat_mv_scale(width, height, 0);
|
||||
r_shader("healthbar_linear");
|
||||
r_uniform_vec4_rgba("borderColor", RGBA(0.75, 0.75, 0.75, 0.75));
|
||||
r_uniform_vec4_rgba("glowColor", RGBA(0.5, 0.5, 1.0, 0.75));
|
||||
|
@ -388,7 +390,7 @@ static void draw_linear_healthbar(Boss *boss) {
|
|||
r_uniform_vec2("fill", boss->healthbar.fill_total, boss->healthbar.fill_alt);
|
||||
r_uniform_float("opacity", opacity);
|
||||
r_draw_quad();
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
|
@ -431,11 +433,11 @@ static void draw_spell_name(Boss *b, int time, bool healthbar_radial) {
|
|||
int delay = b->current->type == AT_ExtraSpell ? ATTACK_START_DELAY_EXTRA : ATTACK_START_DELAY;
|
||||
float warn_progress = clamp((time + delay) / 120.0, 0, 1);
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(creal(x), cimag(x),0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(creal(x), cimag(x),0);
|
||||
float scale = f+1.*(1-f)*(1-f)*(1-f);
|
||||
r_mat_scale(scale,scale,1);
|
||||
r_mat_rotate(glm_ease_quad_out(f) * 2 * M_PI, 0.8, -0.2, 0);
|
||||
r_mat_mv_scale(scale,scale,1);
|
||||
r_mat_mv_rotate(glm_ease_quad_out(f) * 2 * M_PI, 0.8, -0.2, 0);
|
||||
|
||||
float spellname_opacity_noplr = opacity_noplr * min(1, warn_progress/0.6);
|
||||
float spellname_opacity = spellname_opacity_noplr * b->hud.plrproximity_opacity;
|
||||
|
@ -443,13 +445,13 @@ static void draw_spell_name(Boss *b, int time, bool healthbar_radial) {
|
|||
draw_boss_text(ALIGN_RIGHT, strw/2*(1-f), 0, b->current->name, font, color_mul_scalar(RGBA(1, 1, 1, 1), spellname_opacity));
|
||||
|
||||
if(spellname_opacity_noplr < 1) {
|
||||
r_mat_push();
|
||||
r_mat_scale(2 - spellname_opacity_noplr, 2 - spellname_opacity_noplr, 1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_scale(2 - spellname_opacity_noplr, 2 - spellname_opacity_noplr, 1);
|
||||
draw_boss_text(ALIGN_RIGHT, strw/2*(1-f), 0, b->current->name, font, color_mul_scalar(RGBA(1, 1, 1, 1), spellname_opacity_noplr * 0.5));
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
|
||||
r_capability(RCAP_CULL_FACE, cullcap_saved);
|
||||
|
||||
|
@ -466,8 +468,8 @@ static void draw_spell_name(Boss *b, int time, bool healthbar_radial) {
|
|||
|
||||
float bonus_ofs = 220;
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(
|
||||
bonus_ofs * pow(1 - a, 2),
|
||||
font_get_lineskip(font) + y_offset + y_text_offset + 0.5,
|
||||
0);
|
||||
|
@ -508,7 +510,7 @@ static void draw_spell_name(Boss *b, int time, bool healthbar_radial) {
|
|||
|
||||
font_set_kerning_enabled(font, kern);
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -540,9 +542,9 @@ static void draw_spell_portrait(Boss *b, int time) {
|
|||
|
||||
Sprite *char_spr = &b->portrait;
|
||||
|
||||
r_mat_push();
|
||||
r_mat_scale(-1, 1, 1);
|
||||
r_mat_translate(-VIEWPORT_W, 0, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_scale(-1, 1, 1);
|
||||
r_mat_mv_translate(-VIEWPORT_W, 0, 0);
|
||||
r_cull(CULL_FRONT);
|
||||
|
||||
for(int i = 1; i <= 3; ++i) {
|
||||
|
@ -570,7 +572,7 @@ static void draw_spell_portrait(Boss *b, int time) {
|
|||
.scale.both = 1.0 + 0.1 * (1 - char_out),
|
||||
});
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
|
@ -646,9 +648,9 @@ static void spawn_particle_effects(Boss *boss) {
|
|||
}
|
||||
|
||||
void draw_boss_background(Boss *boss) {
|
||||
r_mat_push();
|
||||
r_mat_translate(creal(boss->pos), cimag(boss->pos), 0);
|
||||
r_mat_rotate_deg(global.frames*4.0, 0, 0, -1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(creal(boss->pos), cimag(boss->pos), 0);
|
||||
r_mat_mv_rotate(global.frames * 4.0 * DEG2RAD, 0, 0, -1);
|
||||
|
||||
float f = 0.8+0.1*sin(global.frames/8.0);
|
||||
|
||||
|
@ -657,12 +659,12 @@ void draw_boss_background(Boss *boss) {
|
|||
f -= t*(t-0.7)/max(0.01, 1-t);
|
||||
}
|
||||
|
||||
r_mat_scale(f, f, 1);
|
||||
r_mat_mv_scale(f, f, 1);
|
||||
r_draw_sprite(&(SpriteParams) {
|
||||
.sprite = "boss_circle",
|
||||
.color = RGBA(1, 1, 1, 0),
|
||||
});
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
static void ent_draw_boss(EntityInterface *ent) {
|
||||
|
@ -679,9 +681,11 @@ static void ent_draw_boss(EntityInterface *ent) {
|
|||
boss_alpha = (1 - t) + 0.3;
|
||||
}
|
||||
|
||||
r_color(RGBA_MUL_ALPHA(1, 1-red, 1-red/2, boss_alpha));
|
||||
draw_sprite_batched_p(creal(boss->pos), cimag(boss->pos) + 6*sin(global.frames/25.0), aniplayer_get_frame(&boss->ani));
|
||||
r_color4(1, 1, 1, 1);
|
||||
r_draw_sprite(&(SpriteParams) {
|
||||
.sprite_ptr = aniplayer_get_frame(&boss->ani),
|
||||
.pos = { creal(boss->pos), cimag(boss->pos) + 6*sin(global.frames/25.0) },
|
||||
.color = RGBA_MUL_ALPHA(1, 1-red, 1-red/2, boss_alpha),
|
||||
});
|
||||
}
|
||||
|
||||
void draw_boss_fake_overlay(Boss *boss) {
|
||||
|
@ -761,7 +765,7 @@ void draw_boss_overlay(Boss *boss) {
|
|||
r_shader("sprite_default");
|
||||
|
||||
// remaining spells
|
||||
r_color4(0.7 * o, 0.7 * o, 0.7 * o, 0.7 * o);
|
||||
Color *clr = RGBA(0.7 * o, 0.7 * o, 0.7 * o, 0.7 * o);
|
||||
Sprite *star = get_sprite("star");
|
||||
float x = 10 + star->w * 0.5;
|
||||
bool spell_found = false;
|
||||
|
@ -774,7 +778,11 @@ void draw_boss_overlay(Boss *boss) {
|
|||
) {
|
||||
// I guess we can just always skip the first one
|
||||
if(spell_found) {
|
||||
draw_sprite_batched_p(x, 40 + 8 * !radial_style, star);
|
||||
r_draw_sprite(&(SpriteParams) {
|
||||
.sprite_ptr = star,
|
||||
.pos = { x, 40 + 8 * !radial_style },
|
||||
.color = clr,
|
||||
});
|
||||
x += star->w * 1.1;
|
||||
} else {
|
||||
spell_found = true;
|
||||
|
|
|
@ -197,11 +197,11 @@ static void credits_towerwall_draw(vec3 pos) {
|
|||
r_uniform_sampler("tex", "stage6/towerwall");
|
||||
r_uniform_float("lendiv", 2800.0 + 300.0 * sin(global.frames / 77.7));
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(pos[0], pos[1], pos[2]);
|
||||
r_mat_scale(30,30,30);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(pos[0], pos[1], pos[2]);
|
||||
r_mat_mv_scale(30,30,30);
|
||||
r_draw_model("towerwall");
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
|
||||
r_shader_standard();
|
||||
}
|
||||
|
@ -304,27 +304,17 @@ static void credits_draw_entry(CreditsEntry *e) {
|
|||
yukkuri_spr = get_sprite("kyoukkuri");
|
||||
}
|
||||
|
||||
r_mat_push();
|
||||
r_state_push();
|
||||
r_mat_mv_push();
|
||||
|
||||
if(fadein < 1) {
|
||||
r_mat_translate(0, SCREEN_W * pow(1 - fadein, 2) * 0.5, 0);
|
||||
r_mat_mv_translate(0, SCREEN_W * pow(1 - fadein, 2) * 0.5, 0);
|
||||
} else if(fadeout < 1) {
|
||||
r_mat_translate(0, SCREEN_W * pow(1 - fadeout, 2) * -0.5, 0);
|
||||
r_mat_mv_translate(0, SCREEN_W * pow(1 - fadeout, 2) * -0.5, 0);
|
||||
}
|
||||
|
||||
// for debugging: draw a quad as tall as the entry is expected to be
|
||||
/*
|
||||
render_push();
|
||||
render_color4(1, 0, 0, fadein * fadeout);
|
||||
render_shader_standard_notex();
|
||||
render_scale(300, h_total, 1);
|
||||
render_draw_quad();
|
||||
render_shader_standard();
|
||||
render_pop();
|
||||
*/
|
||||
|
||||
r_color(RGBA_MUL_ALPHA(1, 1, 1, fadein * fadeout));
|
||||
r_mat_translate(0, h_body * -0.5, 0);
|
||||
r_mat_mv_translate(0, h_body * -0.5, 0);
|
||||
|
||||
for(int i = 0; i < e->lines; ++i) {
|
||||
if(yukkuri_spr && !i) {
|
||||
|
@ -341,7 +331,7 @@ static void credits_draw_entry(CreditsEntry *e) {
|
|||
.scale.y = 1.0 + squeeze,
|
||||
});
|
||||
|
||||
r_mat_translate(0, halfheight, 0);
|
||||
r_mat_mv_translate(0, halfheight, 0);
|
||||
} else {
|
||||
Font *font = get_font(i ? "standard" : "big");
|
||||
r_shader("text_default");
|
||||
|
@ -350,39 +340,39 @@ static void credits_draw_entry(CreditsEntry *e) {
|
|||
.font_ptr = font,
|
||||
});
|
||||
r_shader_standard();
|
||||
r_mat_translate(0, font_get_lineskip(font), 0);
|
||||
r_mat_mv_translate(0, font_get_lineskip(font), 0);
|
||||
}
|
||||
}
|
||||
|
||||
r_mat_pop();
|
||||
r_color4(1, 1, 1, 1);
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
static void credits_draw(void) {
|
||||
r_clear(CLEAR_ALL, RGBA(0, 0, 0, 1), 1);
|
||||
colorfill(1, 1, 1, 1); // don't use r_clear for this, it screws up letterboxing
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(-SCREEN_W/2, 0, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(-SCREEN_W/2, 0, 0);
|
||||
r_enable(RCAP_DEPTH_TEST);
|
||||
|
||||
set_perspective_viewport(&stage_3d_context, 100, 9000, 0, 0, SCREEN_W, SCREEN_H);
|
||||
draw_stage3d(&stage_3d_context, 10000);
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
set_ortho(SCREEN_W, SCREEN_H);
|
||||
|
||||
r_mat_push();
|
||||
r_mat_mv_push();
|
||||
r_color4(0, 0, 0, credits.panelalpha * 0.7);
|
||||
r_mat_translate(SCREEN_W/4*3, SCREEN_H/2, 0);
|
||||
r_mat_scale(300, SCREEN_H, 1);
|
||||
r_mat_mv_translate(SCREEN_W/4*3, SCREEN_H/2, 0);
|
||||
r_mat_mv_scale(300, SCREEN_H, 1);
|
||||
r_shader_standard_notex();
|
||||
r_draw_quad();
|
||||
r_color4(1, 1, 1, 1);
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(SCREEN_W/4*3, SCREEN_H/2, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(SCREEN_W/4*3, SCREEN_H/2, 0);
|
||||
|
||||
r_shader_standard();
|
||||
|
||||
|
@ -390,7 +380,7 @@ static void credits_draw(void) {
|
|||
credits_draw_entry(&(credits.entries[i]));
|
||||
}
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
|
||||
draw_transition();
|
||||
}
|
||||
|
|
51
src/dialog.c
51
src/dialog.c
|
@ -156,13 +156,13 @@ void dialog_draw(Dialog *dialog) {
|
|||
r_state_push();
|
||||
r_shader("sprite_default");
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(VIEWPORT_X, 0, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(VIEWPORT_X, 0, 0);
|
||||
|
||||
const double dialog_width = VIEWPORT_W * 1.2;
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(dialog_width/2.0, 64, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(dialog_width/2.0, 64, 0);
|
||||
|
||||
int cur_idx = message_index(dialog, 0);
|
||||
int pre_idx = message_index(dialog, -1);
|
||||
|
@ -201,29 +201,29 @@ void dialog_draw(Dialog *dialog) {
|
|||
float portrait_w = sprite_padded_width(portrait);
|
||||
float portrait_h = sprite_padded_height(portrait);
|
||||
|
||||
r_mat_push();
|
||||
r_mat_mv_push();
|
||||
|
||||
if(i == DIALOG_MSG_LEFT) {
|
||||
r_cull(CULL_FRONT);
|
||||
r_mat_scale(-1, 1, 1);
|
||||
r_mat_mv_scale(-1, 1, 1);
|
||||
} else {
|
||||
r_cull(CULL_BACK);
|
||||
}
|
||||
|
||||
if(o < 1) {
|
||||
r_mat_translate(120 * (1 - o), 0, 0);
|
||||
r_mat_mv_translate(120 * (1 - o), 0, 0);
|
||||
}
|
||||
|
||||
float dir = (1 - 2 * (i == cur_side));
|
||||
float ofs = 10 * dir;
|
||||
|
||||
if(page_alpha < 10 && ((i != pre_side && i == cur_side) || (i == pre_side && i != cur_side))) {
|
||||
r_mat_translate(ofs * page_alpha, ofs * page_alpha, 0);
|
||||
r_mat_mv_translate(ofs * page_alpha, ofs * page_alpha, 0);
|
||||
float brightness = min(1.0 - 0.5 * page_alpha * dir, 1);
|
||||
clr.r = clr.g = clr.b = brightness;
|
||||
clr.a = 1;
|
||||
} else {
|
||||
r_mat_translate(ofs, ofs, 0);
|
||||
r_mat_mv_translate(ofs, ofs, 0);
|
||||
clr = *RGB(1 - (dir > 0) * 0.5, 1 - (dir > 0) * 0.5, 1 - (dir > 0) * 0.5);
|
||||
}
|
||||
|
||||
|
@ -237,10 +237,10 @@ void dialog_draw(Dialog *dialog) {
|
|||
.sprite_ptr = portrait,
|
||||
});
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
|
||||
o *= smooth(clamp((global.frames - dialog->birthtime - 10) / 30.0, 0, 1));
|
||||
|
@ -250,25 +250,23 @@ void dialog_draw(Dialog *dialog) {
|
|||
.offset = { VIEWPORT_W/2, VIEWPORT_H-55 },
|
||||
};
|
||||
|
||||
r_mat_push();
|
||||
r_mat_mv_push();
|
||||
if(o < 1) {
|
||||
r_mat_translate(0, 100 * (1 - o), 0);
|
||||
r_mat_mv_translate(0, 100 * (1 - o), 0);
|
||||
}
|
||||
r_color4(0, 0, 0, 0.8 * o);
|
||||
r_mat_push();
|
||||
r_mat_translate(dialog_bg_rect.x, dialog_bg_rect.y, 0);
|
||||
r_mat_scale(dialog_bg_rect.w, dialog_bg_rect.h, 1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(dialog_bg_rect.x, dialog_bg_rect.y, 0);
|
||||
r_mat_mv_scale(dialog_bg_rect.w, dialog_bg_rect.h, 1);
|
||||
r_shader_standard_notex();
|
||||
r_draw_quad();
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
|
||||
Font *font = get_font("standard");
|
||||
|
||||
r_mat_mode(MM_TEXTURE);
|
||||
r_mat_push();
|
||||
// r_mat_scale(2, 0.2, 0);
|
||||
// r_mat_translate(0, -global.frames/page_text_time, 0);
|
||||
r_mat_mode(MM_MODELVIEW);
|
||||
r_mat_tex_push();
|
||||
// r_mat_tex_scale(2, 0.2, 0);
|
||||
// r_mat_tex_translate(0, -global.frames/page_text_time, 0);
|
||||
|
||||
dialog_bg_rect.w = VIEWPORT_W * 0.86;
|
||||
dialog_bg_rect.x -= dialog_bg_rect.w * 0.5;
|
||||
|
@ -315,12 +313,9 @@ void dialog_draw(Dialog *dialog) {
|
|||
.overlay_projection = &dialog_bg_rect,
|
||||
});
|
||||
|
||||
r_mat_mode(MM_TEXTURE);
|
||||
r_mat_pop();
|
||||
r_mat_mode(MM_MODELVIEW);
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_pop();
|
||||
r_mat_tex_pop();
|
||||
r_mat_mv_pop();
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
|
|
|
@ -188,7 +188,12 @@ static void ending_draw(Ending *e) {
|
|||
r_color4(s, s, s, s);
|
||||
|
||||
if(e->entries[e->pos].sprite) {
|
||||
draw_sprite_p(SCREEN_W/2, SCREEN_H/2, e->entries[e->pos].sprite);
|
||||
r_draw_sprite(&(SpriteParams) {
|
||||
.sprite_ptr = e->entries[e->pos].sprite,
|
||||
.pos = { SCREEN_W/2, SCREEN_H/2 },
|
||||
.shader = "sprite_default",
|
||||
.color = r_color_current(),
|
||||
});
|
||||
}
|
||||
|
||||
r_shader("text_default");
|
||||
|
|
|
@ -213,14 +213,14 @@ void draw_char_menu(MenuData *menu) {
|
|||
portrait_params.sprite_ptr = get_sprite(face);
|
||||
r_draw_sprite(&portrait_params);
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(SCREEN_W/4, SCREEN_H/3, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(SCREEN_W/4, SCREEN_H/3, 0);
|
||||
|
||||
r_mat_push();
|
||||
r_mat_mv_push();
|
||||
|
||||
if(menu->entries[i].drawdata != 0) {
|
||||
r_mat_translate(0,-300*menu->entries[i].drawdata, 0);
|
||||
r_mat_rotate_deg(180*menu->entries[i].drawdata, 1,0,0);
|
||||
r_mat_mv_translate(0, -300 * menu->entries[i].drawdata, 0);
|
||||
r_mat_mv_rotate(M_PI * menu->entries[i].drawdata, 1, 0, 0);
|
||||
}
|
||||
|
||||
text_draw(name, &(TextParams) {
|
||||
|
@ -230,7 +230,7 @@ void draw_char_menu(MenuData *menu) {
|
|||
.color = RGBA(o, o, o, o),
|
||||
});
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
|
||||
if(menu->entries[i].drawdata) {
|
||||
o = 1-menu->entries[i].drawdata*3;
|
||||
|
@ -245,11 +245,11 @@ void draw_char_menu(MenuData *menu) {
|
|||
.color = RGBA(o, o, o, o),
|
||||
});
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(SCREEN_W/4, SCREEN_H/3, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(SCREEN_W/4, SCREEN_H/3, 0);
|
||||
|
||||
ShotModeID current_subshot = SELECTED_SUBSHOT(menu);
|
||||
|
||||
|
@ -258,12 +258,12 @@ void draw_char_menu(MenuData *menu) {
|
|||
|
||||
r_color4(0, 0, 0, 0.5);
|
||||
r_shader_standard_notex();
|
||||
r_mat_push();
|
||||
r_mat_translate(-150, selbg_ofs + menu->drawdata[2] * 0.5, 0);
|
||||
r_mat_scale(650, menu->drawdata[2], 1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(-150, selbg_ofs + menu->drawdata[2] * 0.5, 0);
|
||||
r_mat_mv_scale(650, menu->drawdata[2], 1);
|
||||
r_draw_quad();
|
||||
r_shader_standard();
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
|
||||
for(ShotModeID shot = PLR_SHOT_A; shot < NUM_SHOT_MODES_PER_CHARACTER; shot++) {
|
||||
PlayerMode *mode = plrmode_find(current_char, shot);
|
||||
|
@ -300,7 +300,7 @@ void draw_char_menu(MenuData *menu) {
|
|||
}
|
||||
}
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
|
||||
float o = 0.3*sin(menu->frames/20.0)+0.5;
|
||||
o *= 1-menu->entries[menu->cursor].drawdata;
|
||||
|
|
|
@ -184,13 +184,16 @@ void start_game_no_difficulty_menu(MenuData *m, void *arg) {
|
|||
|
||||
void draw_menu_selector(float x, float y, float w, float h, float t) {
|
||||
Sprite *bg = get_sprite("part/smoke");
|
||||
r_mat_push();
|
||||
r_mat_translate(x, y, 0);
|
||||
r_mat_scale(w / bg->w, h / bg->h, 1);
|
||||
r_mat_rotate_deg(t*2,0,0,1);
|
||||
r_color4(0,0,0,0.5 * (1 - transition.fade));
|
||||
draw_sprite(0, 0, "part/smoke");
|
||||
r_mat_pop();
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(x, y, 0);
|
||||
r_mat_mv_scale(w / bg->w, h / bg->h, 1);
|
||||
r_mat_mv_rotate(t * 2 * DEG2RAD, 0, 0, 1);
|
||||
r_draw_sprite(&(SpriteParams) {
|
||||
.sprite_ptr = bg,
|
||||
.color = RGBA(0, 0, 0, 0.5 * (1 - transition.fade)),
|
||||
.shader = "sprite_default",
|
||||
});
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
void draw_menu_title(MenuData *m, const char *title) {
|
||||
|
@ -204,9 +207,9 @@ void draw_menu_title(MenuData *m, const char *title) {
|
|||
}
|
||||
|
||||
void draw_menu_list(MenuData *m, float x, float y, void (*draw)(MenuEntry*, int, int), float scroll_threshold) {
|
||||
r_mat_push();
|
||||
r_mat_mv_push();
|
||||
float offset = smoothmin(0, scroll_threshold * 0.8 - y - m->drawdata[2], 80);
|
||||
r_mat_translate(x, y + offset, 0);
|
||||
r_mat_mv_translate(x, y + offset, 0);
|
||||
|
||||
draw_menu_selector(m->drawdata[0], m->drawdata[2], m->drawdata[1], 34, m->frames);
|
||||
ShaderProgram *text_shader = r_shader_get("text_default");
|
||||
|
@ -243,7 +246,7 @@ void draw_menu_list(MenuData *m, float x, float y, void (*draw)(MenuEntry*, int,
|
|||
}
|
||||
}
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
void animate_menu_list_entry(MenuData *m, int i) {
|
||||
|
|
|
@ -58,20 +58,22 @@ MenuData* create_difficulty_menu(void) {
|
|||
}
|
||||
|
||||
void draw_difficulty_menu(MenuData *menu) {
|
||||
r_state_push();
|
||||
|
||||
draw_main_menu_bg(menu, 0, 0, 0.05, "menu/mainmenubg", "stage1/cirnobg");
|
||||
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, 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);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(SCREEN_W/2, SCREEN_H/2,0);
|
||||
r_mat_mv_rotate((4 * menu->drawdata[0] - 4) * DEG2RAD, 0, 0, 1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_scale(SCREEN_W*1.5,120,1);
|
||||
r_shader_standard_notex();
|
||||
r_draw_quad();
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
r_color3(1,1,1);
|
||||
|
||||
r_shader("text_default");
|
||||
|
@ -84,20 +86,16 @@ void draw_difficulty_menu(MenuData *menu) {
|
|||
|
||||
r_shader("sprite_default");
|
||||
|
||||
|
||||
|
||||
for(int i = 0; i < menu->ecount; ++i) {
|
||||
r_mat_push();
|
||||
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);
|
||||
|
||||
draw_sprite_batched(0, 0, difficulty_sprite_name(D_Easy+i));
|
||||
r_mat_pop();
|
||||
r_color3(1,1,1);
|
||||
float scale = 0.5 + menu->entries[i].drawdata;
|
||||
r_draw_sprite(&(SpriteParams) {
|
||||
.sprite = difficulty_sprite_name(D_Easy + i),
|
||||
.pos = { 0, 240*tanh(0.7*(i-menu->drawdata[0])) },
|
||||
.color = RGBA(scale, scale, scale, scale),
|
||||
.scale.both = scale,
|
||||
});
|
||||
}
|
||||
|
||||
r_mat_pop();
|
||||
r_shader_standard();
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
}
|
||||
|
|
|
@ -175,19 +175,17 @@ void update_ingame_menu(MenuData *menu) {
|
|||
|
||||
void draw_ingame_menu(MenuData *menu) {
|
||||
set_ortho(SCREEN_W, SCREEN_H);
|
||||
|
||||
r_mat_push();
|
||||
|
||||
draw_ingame_menu_bg(menu, 1.0-menu_fade(menu));
|
||||
r_state_push();
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(VIEWPORT_X, VIEWPORT_Y, 0);
|
||||
r_mat_translate(VIEWPORT_W/2, VIEWPORT_H/4, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(VIEWPORT_X, VIEWPORT_Y, 0);
|
||||
r_mat_mv_translate(VIEWPORT_W/2, VIEWPORT_H/4, 0);
|
||||
|
||||
draw_menu_selector(0, menu->drawdata[0], menu->drawdata[1]*2, 41, menu->frames);
|
||||
|
||||
ShaderProgram *sh_prev = r_shader_current();
|
||||
r_shader("text_default");
|
||||
|
||||
if(menu->context) {
|
||||
float s = 0.3 + 0.2 * sin(menu->frames/10.0);
|
||||
r_color(RGBA_MUL_ALPHA(1-s/2, 1-s/2, 1-s, 1-menu_fade(menu)));
|
||||
|
@ -216,10 +214,8 @@ void draw_ingame_menu(MenuData *menu) {
|
|||
});
|
||||
}
|
||||
|
||||
r_color4(1,1,1,1);
|
||||
r_mat_pop();
|
||||
r_mat_pop();
|
||||
r_shader_ptr(sh_prev);
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
|
||||
// TODO handle dialog somehow
|
||||
|
||||
|
|
|
@ -141,6 +141,7 @@ void draw_main_menu_bg(MenuData* menu, double center_x, double center_y, double
|
|||
|
||||
void draw_main_menu(MenuData *menu) {
|
||||
draw_main_menu_bg(menu, 0, 0, 0.05, "menu/mainmenubg", "stage1/cirnobg");
|
||||
r_state_push();
|
||||
|
||||
float rot = sqrt(menu->frames/120.0);
|
||||
float rotfac = (1 - pow(menu_fade(menu), 2.0));
|
||||
|
@ -154,8 +155,8 @@ void draw_main_menu(MenuData *menu) {
|
|||
.color = color_mul_scalar(RGBA(1, 1, 1, 1), min(1, rot) * rotfac),
|
||||
});
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(0, SCREEN_H/2, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(0, SCREEN_H/2, 0);
|
||||
r_shader("text_default");
|
||||
|
||||
float o = 0.7;
|
||||
|
@ -175,11 +176,9 @@ void draw_main_menu(MenuData *menu) {
|
|||
});
|
||||
}
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
|
||||
bool cullcap_saved = r_capability_current(RCAP_CULL_FACE);
|
||||
r_disable(RCAP_CULL_FACE);
|
||||
r_color4(1, 1, 1, 0);
|
||||
r_shader("sprite_default");
|
||||
|
||||
for(int i = 0; i < 50; i++) { // who needs persistent state for a particle system?
|
||||
|
@ -204,16 +203,17 @@ void draw_main_menu(MenuData *menu) {
|
|||
if(posx > SCREEN_W+20 || posy < -20 || posy > SCREEN_H+20)
|
||||
continue;
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(posx,posy,0);
|
||||
r_mat_scale(0.2,0.2,0.2);
|
||||
r_mat_rotate_deg(2*(t%period),rx,ry,rz);
|
||||
draw_sprite_batched(0,0,"part/petal");
|
||||
r_mat_pop();
|
||||
r_draw_sprite(&(SpriteParams) {
|
||||
.sprite = "part/petal",
|
||||
.color = RGBA(1, 1, 1, 0),
|
||||
.pos = { posx, posy },
|
||||
.scale.both = 0.2,
|
||||
.rotation.angle = DEG2RAD * 2 * (t % period),
|
||||
.rotation.vector = { rx, ry, rz },
|
||||
});
|
||||
}
|
||||
|
||||
r_shader("text_default");
|
||||
r_capability(RCAP_CULL_FACE, cullcap_saved);
|
||||
r_enable(RCAP_CULL_FACE);
|
||||
|
||||
char version[32];
|
||||
snprintf(version, sizeof(version), "v%s", TAISEI_VERSION);
|
||||
|
@ -221,9 +221,11 @@ void draw_main_menu(MenuData *menu) {
|
|||
.align = ALIGN_RIGHT,
|
||||
.pos = { SCREEN_W-5, SCREEN_H-10 },
|
||||
.font = "small",
|
||||
.shader = "text_default",
|
||||
.color = RGBA(1, 1, 1, 1),
|
||||
});
|
||||
|
||||
r_shader_standard();
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
void draw_loading_screen(void) {
|
||||
|
|
|
@ -141,12 +141,12 @@ static void musicroom_draw(MenuData *m) {
|
|||
float comment_offset = smoothstep(0, 1, (1 - comment_alpha)) * comment_height;
|
||||
|
||||
r_shader_standard_notex();
|
||||
r_mat_push();
|
||||
r_mat_translate(SCREEN_W * 0.5, SCREEN_H - comment_height * 0.5 + comment_offset, 0);
|
||||
r_mat_scale(SCREEN_W, comment_height, 1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(SCREEN_W * 0.5, SCREEN_H - comment_height * 0.5 + comment_offset, 0);
|
||||
r_mat_mv_scale(SCREEN_W, comment_height, 1);
|
||||
r_color4(0, 0, 0, 0.6 * comment_alpha);
|
||||
r_draw_quad();
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
|
||||
Font *const text_font = get_font("standard");
|
||||
|
|
|
@ -916,16 +916,15 @@ MenuData* create_options_menu(void) {
|
|||
void draw_options_menu_bg(MenuData* menu) {
|
||||
draw_main_menu_bg(menu, 0, 0, 0.05, "abstract_brown", "stage1/cirnobg");
|
||||
|
||||
r_mat_push();
|
||||
r_mat_scale(SCREEN_W, SCREEN_H, 1);
|
||||
r_state_push();
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_scale(SCREEN_W, SCREEN_H, 1);
|
||||
r_shader_standard_notex();
|
||||
r_mat_translate(0.5,0.5,0);
|
||||
r_mat_mv_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);
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
static void update_options_menu(MenuData *menu) {
|
||||
|
@ -948,8 +947,8 @@ static void draw_options_menu(MenuData *menu) {
|
|||
draw_options_menu_bg(menu);
|
||||
draw_menu_title(menu, ctx->title);
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(100, 100, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(100, 100, 0);
|
||||
|
||||
draw_menu_selector(menu->drawdata[0], menu->drawdata[2], menu->drawdata[1], 34, menu->frames);
|
||||
|
||||
|
@ -1219,24 +1218,24 @@ static void draw_options_menu(MenuData *menu) {
|
|||
if(!strcmp(tmp, "-0%"))
|
||||
strcpy(tmp, "0%");
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(origin - (w+cw) * 0.5, 20 * i, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(origin - (w+cw) * 0.5, 20 * i, 0);
|
||||
text_draw(tmp, &(TextParams) {
|
||||
.pos = { -((w+cw) * 0.5 + 10), 0 },
|
||||
.align = ALIGN_RIGHT,
|
||||
.color = &clr,
|
||||
});
|
||||
r_shader_standard_notex();
|
||||
r_mat_push();
|
||||
r_mat_scale(w+cw, h, 1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_scale(w+cw, h, 1);
|
||||
r_color(RGBA_MUL_ALPHA(1, 1, 1, (0.1 + 0.2 * a) * alpha));
|
||||
r_draw_quad();
|
||||
r_mat_pop();
|
||||
r_mat_translate(w * (pos - 0.5), 0, 0);
|
||||
r_mat_scale(cw, h, 0);
|
||||
r_mat_mv_pop();
|
||||
r_mat_mv_translate(w * (pos - 0.5), 0, 0);
|
||||
r_mat_mv_scale(cw, h, 0);
|
||||
r_color(RGBA_MUL_ALPHA(0.9, 0.6, 0.2, alpha));
|
||||
r_draw_quad();
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
r_shader("text_default");
|
||||
|
||||
break;
|
||||
|
@ -1245,7 +1244,7 @@ static void draw_options_menu(MenuData *menu) {
|
|||
}
|
||||
}
|
||||
r_shader_standard();
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
// --- Input/event processing --- //
|
||||
|
|
|
@ -156,15 +156,16 @@ static void replayview_freearg(void *a) {
|
|||
}
|
||||
|
||||
static void replayview_draw_submenu_bg(float width, float height, float alpha) {
|
||||
r_mat_push();
|
||||
r_mat_translate(SCREEN_W*0.5, SCREEN_H*0.5, 0);
|
||||
r_mat_scale(width, height, 1);
|
||||
r_state_push();
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(SCREEN_W*0.5, SCREEN_H*0.5, 0);
|
||||
r_mat_mv_scale(width, height, 1);
|
||||
alpha *= 0.7;
|
||||
r_color4(0.1 * alpha, 0.1 * alpha, 0.1 * alpha, alpha);
|
||||
r_shader_standard_notex();
|
||||
r_draw_quad();
|
||||
r_shader("text_default");
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
static void replayview_draw_messagebox(MenuData* m) {
|
||||
|
@ -175,15 +176,12 @@ static void replayview_draw_messagebox(MenuData* m) {
|
|||
float width = text_width(get_font("standard"), m->entries->name, 0) + 64;
|
||||
replayview_draw_submenu_bg(width, height, alpha);
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(SCREEN_W*0.5, SCREEN_H*0.5, 0);
|
||||
|
||||
text_draw(m->entries->name, &(TextParams) {
|
||||
.align = ALIGN_CENTER,
|
||||
.color = RGBA_MUL_ALPHA(0.9, 0.6, 0.2, alpha),
|
||||
.pos = { SCREEN_W*0.5, SCREEN_H*0.5 },
|
||||
.shader = "text_default",
|
||||
});
|
||||
|
||||
r_mat_pop();
|
||||
}
|
||||
|
||||
static void replayview_draw_stagemenu(MenuData *m) {
|
||||
|
@ -195,8 +193,8 @@ static void replayview_draw_stagemenu(MenuData *m) {
|
|||
|
||||
replayview_draw_submenu_bg(width, height, alpha);
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(SCREEN_W*0.5, (SCREEN_H-(m->ecount-1)*20)*0.5, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(SCREEN_W*0.5, (SCREEN_H-(m->ecount-1)*20)*0.5, 0);
|
||||
|
||||
for(int i = 0; i < m->ecount; ++i) {
|
||||
MenuEntry *e = &(m->entries[i]);
|
||||
|
@ -215,10 +213,11 @@ static void replayview_draw_stagemenu(MenuData *m) {
|
|||
.align = ALIGN_CENTER,
|
||||
.pos = { 0, 20*i },
|
||||
.color = &clr,
|
||||
.shader = "text_default",
|
||||
});
|
||||
}
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
static void replayview_drawitem(MenuEntry *e, int item, int cnt) {
|
||||
|
|
|
@ -50,15 +50,15 @@ static void draw_saverpy_menu(MenuData *m) {
|
|||
|
||||
draw_menu_selector(SCREEN_W/2 + 100 * m->drawdata[0] - 50, SCREEN_H/2, 163, 81, m->frames);
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(SCREEN_W/2, SCREEN_H/2 - 100, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(SCREEN_W/2, SCREEN_H/2 - 100, 0);
|
||||
text_draw("Save Replay?", &(TextParams) {
|
||||
.font = "big",
|
||||
.align = ALIGN_CENTER,
|
||||
.shader = "text_default",
|
||||
.color = RGBA(1, 1, 1, 1),
|
||||
});
|
||||
r_mat_translate(0, 100, 0);
|
||||
r_mat_mv_translate(0, 100, 0);
|
||||
|
||||
for(int i = 0; i < m->ecount; i++) {
|
||||
MenuEntry *e = &(m->entries[i]);
|
||||
|
@ -83,7 +83,7 @@ static void draw_saverpy_menu(MenuData *m) {
|
|||
});
|
||||
}
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
static bool savepry_input_handler(SDL_Event *event, void *arg) {
|
||||
|
|
20
src/player.c
20
src/player.c
|
@ -204,8 +204,8 @@ void player_draw_overlay(Player *plr) {
|
|||
|
||||
Font *font = get_font("standard");
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(spell_x - spell_spr->w * 0.5 + 10, spell_y + 5 - font_get_metrics(font)->descent, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(spell_x - spell_spr->w * 0.5 + 10, spell_y + 5 - font_get_metrics(font)->descent, 0);
|
||||
|
||||
TextParams tp = {
|
||||
// .pos = { spell_x - spell_spr->w * 0.5 + 10, spell_y + 5 - font_get_metrics(font)->descent },
|
||||
|
@ -214,12 +214,12 @@ void player_draw_overlay(Player *plr) {
|
|||
.color = color_mul_scalar(RGBA(1, 1, 1, spell_in), spell_opacity),
|
||||
};
|
||||
|
||||
r_mat_push();
|
||||
r_mat_scale(2 - 1 * spell_opacity, 2 - 1 * spell_opacity, 1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_scale(2 - 1 * spell_opacity, 2 - 1 * spell_opacity, 1);
|
||||
text_draw(plr->mode->spellcard_name, &tp);
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
|
@ -316,9 +316,9 @@ static void player_focus_circle_visual(Enemy *e, int t, bool render) {
|
|||
|
||||
if(ps_opacity > 0) {
|
||||
r_state_push();
|
||||
r_mat_push();
|
||||
r_mat_translate(creal(e->pos), cimag(e->pos), 0);
|
||||
r_mat_scale(140, 140, 0);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(creal(e->pos), cimag(e->pos), 0);
|
||||
r_mat_mv_scale(140, 140, 0);
|
||||
r_shader("healthbar_radial");
|
||||
r_uniform_vec4_rgba("borderColor", RGBA(0.5, 0.5, 0.5, 0.5));
|
||||
r_uniform_vec4_rgba("glowColor", RGBA(0.5, 0.5, 0.5, 0.75));
|
||||
|
@ -328,7 +328,7 @@ static void player_focus_circle_visual(Enemy *e, int t, bool render) {
|
|||
r_uniform_vec2("fill", global.plr.powersurge.positive * ps_fill_factor, global.plr.powersurge.negative * ps_fill_factor);
|
||||
r_uniform_float("opacity", ps_opacity);
|
||||
r_draw_quad();
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
r_state_pop();
|
||||
|
||||
char buf[64];
|
||||
|
|
|
@ -103,27 +103,26 @@ static void draw_masterspark_ring(int t, float width) {
|
|||
}
|
||||
|
||||
static void draw_masterspark_beam(complex origin, complex size, float angle, int t, float alpha) {
|
||||
r_mat_push();
|
||||
r_mat_translate(creal(origin), cimag(origin), 0);
|
||||
r_mat_rotate(angle, 0, 0, 1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(creal(origin), cimag(origin), 0);
|
||||
r_mat_mv_rotate(angle, 0, 0, 1);
|
||||
|
||||
r_shader("masterspark");
|
||||
r_uniform_float("t", t);
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(0, cimag(size) * -0.5, 0);
|
||||
r_mat_scale(alpha * creal(size), cimag(size), 1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(0, cimag(size) * -0.5, 0);
|
||||
r_mat_mv_scale(alpha * creal(size), cimag(size), 1);
|
||||
r_draw_quad();
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
|
||||
for(int i = 0; i < 4; i++) {
|
||||
draw_masterspark_ring(t % 20 + 10 * i, alpha * creal(size));
|
||||
}
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
|
||||
void marisa_common_masterspark_draw(int numBeams, MarisaBeamInfo *beamInfos, float alpha) {
|
||||
r_state_push();
|
||||
|
||||
|
|
|
@ -31,27 +31,22 @@ static void draw_laser_beam(complex src, complex dst, double size, double step,
|
|||
complex dir = dst - src;
|
||||
complex center = (src + dst) * 0.5;
|
||||
|
||||
r_mat_push();
|
||||
r_mat_mv_push();
|
||||
|
||||
r_mat_translate(creal(center), cimag(center), 0);
|
||||
r_mat_rotate_deg(180/M_PI*carg(dir), 0, 0, 1);
|
||||
r_mat_scale(cabs(dir), size, 1);
|
||||
r_mat_mv_translate(creal(center), cimag(center), 0);
|
||||
r_mat_mv_rotate(carg(dir), 0, 0, 1);
|
||||
r_mat_mv_scale(cabs(dir), size, 1);
|
||||
|
||||
r_mat_mode(MM_TEXTURE);
|
||||
r_mat_identity();
|
||||
r_mat_translate(-cimag(src) / step + t, 0, 0);
|
||||
r_mat_scale(cabs(dir) / step, 1, 1);
|
||||
r_mat_mode(MM_MODELVIEW);
|
||||
r_mat_tex_push_identity();
|
||||
r_mat_tex_translate(-cimag(src) / step + t, 0, 0);
|
||||
r_mat_tex_scale(cabs(dir) / step, 1, 1);
|
||||
|
||||
r_uniform_sampler("tex", tex);
|
||||
r_uniform_float(u_length, cabs(dir) / step);
|
||||
r_draw_quad();
|
||||
|
||||
r_mat_mode(MM_TEXTURE);
|
||||
r_mat_identity();
|
||||
r_mat_mode(MM_MODELVIEW);
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_tex_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
static void trace_laser(Enemy *e, complex vel, float damage) {
|
||||
|
|
|
@ -45,9 +45,9 @@ static int marisa_star_projectile(Projectile *p, int t) {
|
|||
//float c = 0.3 * psin(t * 0.2);
|
||||
//p->color = *RGB(1 - c, 0.7 + 0.3 * psin(t * 0.1), 0.9 + c/3);
|
||||
|
||||
|
||||
|
||||
float freq = 0.1;
|
||||
|
||||
|
||||
double focus = 1 - abs(global.plr.focus) / 30.0;
|
||||
|
||||
double focusfac = 1;
|
||||
|
@ -61,7 +61,7 @@ static int marisa_star_projectile(Projectile *p, int t) {
|
|||
|
||||
double brightener = -1/(1+sqrt(0.03*fabs(creal(p->pos-center))));
|
||||
p->color = *RGBA(0.3+(1-focus)*0.7+brightener,0.8+brightener,1.0-(1-focus)*0.7+brightener,0.2+brightener);
|
||||
|
||||
|
||||
double verticalfac = - 5*t*(1+0.01*t) + 10*t/(0.01*t+1);
|
||||
p->pos0 = p->pos;
|
||||
p->pos = center + focusfac*cbrt(0.1*t)*creal(p->args[0])* 70 * sin(freq*t+cimag(p->args[0])) + I*verticalfac;
|
||||
|
@ -87,7 +87,7 @@ static int marisa_star_projectile(Projectile *p, int t) {
|
|||
static int marisa_star_slave(Enemy *e, int t) {
|
||||
for(int i = 0; i < 2; ++i) {
|
||||
if(player_should_shoot(&global.plr, true) && !((global.frames+2*i) % 5)) {
|
||||
float fac = e->args[0]/M_PI/2;
|
||||
float fac = e->args[0]/M_PI/2;
|
||||
complex v = (1-2*i);
|
||||
v = creal(v)/cabs(v);
|
||||
v *= 1-0.9*fac;
|
||||
|
@ -173,7 +173,7 @@ static int marisa_star_orbit(Enemy *e, int t) {
|
|||
if(t%1 == 0) {
|
||||
Color *color2 = COLOR_COPY(&color);
|
||||
color_mul_scalar(color2, 0.5);
|
||||
|
||||
|
||||
PARTICLE(
|
||||
.sprite_ptr = get_sprite("part/maristar_orbit"),
|
||||
.pos = e->pos,
|
||||
|
@ -237,15 +237,21 @@ static void marisa_star_orbit_visual(Enemy *e, int t, bool render) {
|
|||
marisa_common_masterspark_draw(NUM_MARISTAR_SLAVES, beams, fade);
|
||||
}
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(creal(e->pos),cimag(e->pos),0);
|
||||
color.a = 0;
|
||||
r_color(&color);
|
||||
r_mat_rotate_deg(t*10,0,0,1);
|
||||
draw_sprite_batched(0,0,"fairy_circle");
|
||||
r_mat_scale(0.6,0.6,1);
|
||||
draw_sprite_batched(0,0,"part/lightningball");
|
||||
r_mat_pop();
|
||||
|
||||
SpriteParams sp = { 0 };
|
||||
sp.pos.x = creal(e->pos);
|
||||
sp.pos.y = cimag(e->pos);
|
||||
sp.color = &color;
|
||||
sp.rotation = (SpriteRotationParams) {
|
||||
.angle = t * 10 * DEG2RAD,
|
||||
.vector = { 0, 0, 1 },
|
||||
};
|
||||
sp.sprite = "fairy_circle";
|
||||
r_draw_sprite(&sp);
|
||||
sp.sprite = "part/lightningball";
|
||||
sp.scale.both = 0.6;
|
||||
r_draw_sprite(&sp);
|
||||
}
|
||||
|
||||
static void marisa_star_bomb(Player *plr) {
|
||||
|
@ -265,7 +271,7 @@ static void marisa_star_bombbg(Player *plr) {
|
|||
}
|
||||
|
||||
float t = player_get_bomb_progress(&global.plr);
|
||||
|
||||
|
||||
ShaderProgram *s = r_shader_get("maristar_bombbg");
|
||||
r_shader_ptr(s);
|
||||
r_uniform_float("t", t);
|
||||
|
|
|
@ -78,12 +78,12 @@ static int reimu_spirit_needle(Projectile *p, int t) {
|
|||
#define REIMU_SPIRIT_HOMING_SCALE 0.75
|
||||
|
||||
static void reimu_spirit_homing_draw(Projectile *p, int t) {
|
||||
r_mat_push();
|
||||
r_mat_translate(creal(p->pos), cimag(p->pos), 0);
|
||||
r_mat_rotate(p->angle + M_PI/2, 0, 0, 1);
|
||||
r_mat_scale(REIMU_SPIRIT_HOMING_SCALE, REIMU_SPIRIT_HOMING_SCALE, 1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(creal(p->pos), cimag(p->pos), 0);
|
||||
r_mat_mv_rotate(p->angle + M_PI/2, 0, 0, 1);
|
||||
r_mat_mv_scale(REIMU_SPIRIT_HOMING_SCALE, REIMU_SPIRIT_HOMING_SCALE, 1);
|
||||
ProjDrawCore(p, &p->color);
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
|
||||
static Projectile* reimu_spirit_spawn_ofuda_particle(Projectile *p, int t, double vfactor) {
|
||||
|
|
|
@ -192,12 +192,12 @@ static void reimu_dream_gap_draw_lights(int time, double strength) {
|
|||
const float len = GAP_LENGTH * 3 * sqrt(log(strength + 1) / 0.693);
|
||||
complex center = gap->pos - gap->pos0 * (len * 0.5 - GAP_WIDTH * 0.6);
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(creal(center), cimag(center), 0);
|
||||
r_mat_rotate(carg(gap->pos0)+M_PI, 0, 0, 1);
|
||||
r_mat_scale(len, GAP_LENGTH, 1);
|
||||
r_mat_mv_push();
|
||||
r_mat_mv_translate(creal(center), cimag(center), 0);
|
||||
r_mat_mv_rotate(carg(gap->pos0)+M_PI, 0, 0, 1);
|
||||
r_mat_mv_scale(len, GAP_LENGTH, 1);
|
||||
r_draw_quad();
|
||||
r_mat_pop();
|
||||
r_mat_mv_pop();
|
||||
}
|
||||
}
|
||||
|
||||
|