enemy_classes: improve fairy summon effect

Makes it easier to tell when the fairy becomes active
This commit is contained in:
Andrei Alexeyev 2023-05-29 06:57:55 +02:00
parent 736e659bab
commit 08e0060e19
No known key found for this signature in database
GPG key ID: 72D26128040B9690
2 changed files with 35 additions and 10 deletions

View file

@ -2,20 +2,38 @@
#include "lib/sprite_main.frag.glslh"
#include "lib/render_context.glslh"
#include "lib/util.glslh"
vec2 extract_vec2(float x) {
uint bits = floatBitsToUint(customParams.z);
// NOTE: could use unpackUnorm2x16 in GLSL 410
return vec2(bits & 0xFFFFu, bits >> 16) / float((1 << 16) - 1);
}
void spriteMain(out vec4 fragColor) {
vec4 fairy = color * texture(tex, texCoord);
float t = customParams.x;
float p_cloak = customParams.y;
if(t >= 1) {
if(p_cloak == 0) {
fragColor = fairy;
return;
}
vec2 maskcoord = 4 * gl_FragCoord.xy / r_viewport.zw + customParams.yz;
float p_summon = customParams.x;
vec2 noise_ofs = extract_vec2(customParams.z);
float globaltime = customParams.w;
vec2 base_noise_coord = gl_FragCoord.xy / r_viewport.zw;
vec2 clknoise_coord = vec2(1, 20) * base_noise_coord + noise_ofs + vec2(globaltime);
float clk = fairy.a * texture(tex_aux[0], clknoise_coord).r;
vec3 n = vec3(0.5, 0.7, 1.0) * clk;
fairy.rgb = mix(fairy.rgb, lum(fairy.rgb) * n, p_cloak);
vec2 maskcoord = 4 * base_noise_coord + noise_ofs;
float mask = texture(tex_aux[0], maskcoord).r;
float m1 = 1 - smoothstep(t, t + 0.2, mask);
float m2 = 1 - smoothstep(t, t + 0.1, mask);
float m1 = 1 - smoothstep(p_summon, p_summon + 0.2, mask);
float m2 = 1 - smoothstep(p_summon, p_summon + 0.1, mask);
vec4 h = 20 * mix(vec4(0, 0, 1, 0), vec4(1, 0.25, 0, 0), m2);
fragColor = mix(fairy * m1, fairy.a * h, m1 - m2);

View file

@ -49,7 +49,8 @@ typedef struct FairyVisualParams {
BoxedProjectile circle;
struct {
float progress;
FloatOffset mask_ofs;
float cloak;
FloatBits mask_ofs_bits;
} summon;
} FairyVisualParams;
@ -76,8 +77,9 @@ SpriteParams ecls_anyfairy_sprite_params(
float b = 1.0f - vp->base.fakepos.blendfactor;
out_spbuf->color = *RGBA(o*b, o*b, o*b, o);
out_spbuf->shader_params.vector[0] = vp->summon.progress;
out_spbuf->shader_params.vector[1] = vp->summon.mask_ofs.x;
out_spbuf->shader_params.vector[2] = vp->summon.mask_ofs.y;
out_spbuf->shader_params.vector[1] = vp->summon.cloak;
out_spbuf->shader_params.vector[2] = vp->summon.mask_ofs_bits.val;
out_spbuf->shader_params.vector[3] = global.frames / 60.0f;
return (SpriteParams) {
.color = &out_spbuf->color,
@ -123,6 +125,11 @@ TASK(fairy_circle, {
for(;(e = ENT_UNBOX(ARGS.e)); YIELD) {
assert(fvp == e->visual.drawdata);
if(fvp->summon.progress >= 1 && fvp->summon.cloak > 0) {
fapproach_asymptotic_p(&fvp->summon.cloak, 0, 0.1, 1e-2);
}
circle->pos = visual_pos_e(e);
circle->angle += ARGS.spin_rate;
float s = ARGS.scale_base + ARGS.scale_osc_ampl * sinf(scale_osc_phase);
@ -493,8 +500,8 @@ void ecls_anyfairy_summon(Enemy *e, int duration) {
DrawLayer elayer = e->ent.draw_layer;
e->ent.draw_layer = LAYER_NODRAW;
vp->summon.progress = 0;
vp->summon.mask_ofs.x = rng_f32();
vp->summon.mask_ofs.y = rng_f32();
vp->summon.cloak = 0.75;
vp->summon.mask_ofs_bits.bits = rng_u32();
Projectile *circle = NOT_NULL(ENT_UNBOX(vp->circle));
Color circle_basecolor = circle->color;