diff --git a/resources/00-taisei.pkgdir/shader/interface/reimu_gap.glslh b/resources/00-taisei.pkgdir/shader/interface/reimu_gap.glslh index f24959ba..5380fdbb 100644 --- a/resources/00-taisei.pkgdir/shader/interface/reimu_gap.glslh +++ b/resources/00-taisei.pkgdir/shader/interface/reimu_gap.glslh @@ -22,6 +22,7 @@ UNIFORM(3) vec2 gap_size; UNIFORM(4) vec2 gaps[NUM_GAPS]; UNIFORM(8) float gap_angles[NUM_GAPS]; UNIFORM(12) int gap_links[NUM_GAPS]; +UNIFORM(16) int draw_background; VARYING(0) vec2 texCoord; VARYING(1) vec2 gap_views[NUM_GAPS]; diff --git a/resources/00-taisei.pkgdir/shader/reimu_gap.frag.glsl b/resources/00-taisei.pkgdir/shader/reimu_gap.frag.glsl index e27eb88e..f9923485 100644 --- a/resources/00-taisei.pkgdir/shader/reimu_gap.frag.glsl +++ b/resources/00-taisei.pkgdir/shader/reimu_gap.frag.glsl @@ -31,8 +31,11 @@ void drawGap(inout vec4 frag_color, vec2 frag_loc, int i) { } void main(void) { - vec4 bg = texture(tex, texCoord); - fragColor = bg; + if(draw_background != 0) { + fragColor = texture(tex, texCoord); + } else { + fragColor = vec4(0); + } vec2 frag_loc = texCoord * viewport; frag_loc.y = viewport.y - frag_loc.y; diff --git a/src/plrmodes/reimu_b.c b/src/plrmodes/reimu_b.c index 2c21286d..740f0f27 100644 --- a/src/plrmodes/reimu_b.c +++ b/src/plrmodes/reimu_b.c @@ -220,16 +220,26 @@ static void reimu_dream_gap_renderer_visual(Enemy *e, int t, bool render) { } FBPair *framebuffers = stage_get_fbpair(FBPAIR_FG); + bool render_to_fg = r_framebuffer_current() == framebuffers->back; - fbpair_swap(framebuffers); - Framebuffer *target_fb = framebuffers->back; + if(render_to_fg) { + fbpair_swap(framebuffers); + Framebuffer *target_fb = framebuffers->back; - // This change must propagate - r_state_pop(); - r_framebuffer(target_fb); - r_state_push(); + // This change must propagate + r_state_pop(); + r_framebuffer(target_fb); + r_state_push(); + + r_shader("reimu_gap"); + r_uniform_int("draw_background", true); + r_blend(BLEND_NONE); + } else { + r_shader("reimu_gap"); + r_uniform_int("draw_background", false); + r_blend(BLEND_PREMUL_ALPHA); + } - r_shader("reimu_gap"); r_uniform_vec2("viewport", VIEWPORT_W, VIEWPORT_H); r_uniform_float("time", t / (float)FPS); r_uniform_vec2("gap_size", GAP_WIDTH/2.0, GAP_LENGTH/2.0); @@ -238,6 +248,8 @@ static void reimu_dream_gap_renderer_visual(Enemy *e, int t, bool render) { r_uniform_int_array("gap_links[0]", 0, NUM_GAPS, links); draw_framebuffer_tex(framebuffers->front, VIEWPORT_W, VIEWPORT_H); + r_blend(BLEND_PREMUL_ALPHA); + FOR_EACH_GAP(gap) { r_mat_push(); r_mat_translate(creal(gap->pos), cimag(gap->pos), 0);