enemy_classes: improve fairy summon effect
Makes it easier to tell when the fairy becomes active
This commit is contained in:
parent
736e659bab
commit
08e0060e19
2 changed files with 35 additions and 10 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue