49d0d54a2e
* WIP some projectile effects * fix segfault * Laser smoothing and glow via post-processing blur magic TODO: make it optional * fix memory corruption * fix memory corruption for realsies now * fix color_get_hsl for out-of-range colors * some more bullet flare tweaks * some lame clear effect workarounds * spawn bullet flares after frame 0; looks better and fixes some problems * New baryon explosion; fix petal_explosion; leanify everything * Add missing bullet flare sprite, rebuild main atlas * improve batching efficiency with bullet spawn flares * forgot git add * Group projectiles/particles by shader where possible * Another take on baryon explosion; make fg framebuffers 16bit * WIP some settings for toasters * remove stupid debug log * microoptimization that probably does nothing anyway * somewhat more intuitive quality settings * Whitelist more particles (MarisaB is on hold) * Whitelist (and fix) some more stage6 particles (mostly ToE) * Add a spell name background * Experimental radial healthbar for bosses * healthbar tweaks * thiccer healthbars in response to feedback * remove healthbar survival timer; just fade out on survivals * Add linear healthbars option; WIP other boss HUD tweaks * Use the proper spell card name format * New font and some random garbage to go along with it * Generate static font outlines for use in text shaders * Use outlines in overlay text shader * Complete boss HUD/healthbar fading logic * fix boss timer limit * stage5 bombs explosion effect * split PFLAG_NOSPAWNZOOM into PFLAG_NOSPAWNFLARE and PFLAG_NOSPAWNFADE; introduce PFLAG_NOSPAWNEFFECTS which disables both (it's just the two values OR'd together) simplify vampiric vapor bullet spawning effect * Remove spawn fade-in from super-fast stage5 fairy projectiles (limiters) * lower particle density in v.vapor in minimal mode * graze effect tweaks * fix text shortening, tweak replay menu layout * stupid debug spam * revisit grazing effects again * dumb debug spam again * improve boss attack timer * overlay effect for boss deaths (similar to the player one) * spice up spellcard declaration (HUD) * don't spawn boss death overlay if fleed * modify Exo2 font to use tabular figures * adjust replay menu for the font change * draw timer & power with standard font (phasing out the numbers font) * WIP new HUD; random fixes/tweaks * hud: move difficulty indicator * hud: move debug stuff around * preloads, mostly * fix youmuA batching conflict * shitty workaround for the shitty screenshake shit * remove extraspell lag by stopping to draw stagebg sooner which is possible because extra spells have a different spellcard_intro timing. Fun fact of the day: the duration of spellcard_intro is always ATTACK_START_DELAY_EXTRA even for normal spells! * new stain particle * i disabled background rendering… * "batch" marisa_b masterspark draws * remove these once a new atlas is generated * make toe quick again * hopefully fix all occurences of changed stain and ScaleFade behavior * tweaking reimu_a and toe boson launch effects * make lhc fast again * softer involnerability effect * fix stage 1 snow on the water bug (and improve performance) translated the time to the future a bit because it only seemed to be an issue for small time values * remove unnecessary spawnflare from toe * tone down extra spell start effect * experimental ReimuB gap shader optimization * fix python3 shebangs * generate simple blur shaders w/ hardcoded kernels * New loading screen * lasers: fix incorrect draw hook registration * add webp support for atlas generator * Use ImageMagick for atlas composition (adds 16-bit support) * Atlas maintenance * make the vampiric vapor bullets less prone to invisibility * Revert a few particles to the quadratic fade curve * experimental baryon effect * improve baryon sprites * disable the baryon effect on minimal postprocessing setting
151 lines
3.6 KiB
Python
Executable file
151 lines
3.6 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
from taiseilib.common import (
|
|
add_common_args,
|
|
run_main,
|
|
update_text_file,
|
|
)
|
|
|
|
from math import (
|
|
exp,
|
|
)
|
|
|
|
import argparse
|
|
|
|
|
|
def gen_comment(args):
|
|
return f'Generated by gen-blur-shader.py. kernel size = {args.kernel_size}; sigma = {args.sigma}'
|
|
|
|
|
|
def gen_shader_func(args):
|
|
s = ""
|
|
kernel = gen_kernel(args.kernel_size, args.sigma)
|
|
kernel_half_size = args.kernel_size // 2
|
|
|
|
s += f'vec4 sample_{args.name}(sampler2D tex, vec2 uv, vec2 dir) {"{"}\n'
|
|
s += f' return\n'
|
|
|
|
for i in range(-kernel_half_size, kernel_half_size+1):
|
|
prefix = ' ' * 8
|
|
term = ';' if i == kernel_half_size else ' +'
|
|
|
|
uv_ofs_mul = f' * {float(abs(i))}' if abs(i) > 1 else ''
|
|
uv_ofs = ((' + dir' if i >= 0 else ' - dir') + uv_ofs_mul) if i != 0 else ""
|
|
s += f'{prefix}texture(tex, uv{uv_ofs}) * {kernel[kernel_half_size + i]}{term}\n'
|
|
|
|
s += '}\n'
|
|
|
|
return s
|
|
|
|
|
|
def gen_lib_shader(args):
|
|
macro = f'BLUR_{args.name}_H'
|
|
|
|
return (
|
|
'\n'
|
|
f'// {gen_comment(args)}\n'
|
|
'\n'
|
|
f'#ifndef {macro}\n'
|
|
f'#define {macro}\n'
|
|
'\n'
|
|
f'{gen_shader_func(args)}'
|
|
'\n'
|
|
'#endif\n'
|
|
)
|
|
|
|
|
|
def gen_fragment_shader(args):
|
|
return (
|
|
'#version 330 core\n'
|
|
'\n'
|
|
f'// {gen_comment(args)}\n'
|
|
'\n'
|
|
'#include "interface/standard.glslh"\n'
|
|
f'#include "lib/blur/{args.name}.glslh"\n'
|
|
'\n'
|
|
'UNIFORM(1) vec2 blur_resolution;\n'
|
|
'UNIFORM(2) vec2 blur_direction;\n'
|
|
'\n'
|
|
'void main(void) {\n'
|
|
f' fragColor = sample_{args.name}(tex, texCoord, blur_direction / blur_resolution);\n'
|
|
'}\n'
|
|
)
|
|
|
|
|
|
def gen_meta(args):
|
|
return (
|
|
'\n'
|
|
f'# {gen_comment(args)}\n'
|
|
'\n'
|
|
f'objects = standardnotex.vert {args.name}.frag\n'
|
|
)
|
|
|
|
|
|
def normpdf(x, sigma):
|
|
return 0.39894 * exp(-0.5 * x ** 2 / sigma ** 2) / sigma
|
|
|
|
|
|
def gen_kernel(size, sigma):
|
|
assert size & 1
|
|
|
|
kernel = [0] * size
|
|
halfsize = size // 2
|
|
ksum = 0.0
|
|
|
|
kernel[halfsize] = normpdf(0, sigma);
|
|
ksum += kernel[halfsize];
|
|
|
|
for i in range(1, halfsize + 1):
|
|
k = normpdf(i, sigma)
|
|
kernel[halfsize + i] = kernel[halfsize - i] = k
|
|
ksum += k * 2
|
|
|
|
for i in range(0, size):
|
|
kernel[i] /= ksum
|
|
|
|
return kernel
|
|
|
|
|
|
def main(args):
|
|
parser = argparse.ArgumentParser(description='Generate a reusable gaussian blur shader.', prog=args[0])
|
|
|
|
def kernsize(v):
|
|
v = int(v)
|
|
if not v & 1:
|
|
raise ValueError('Kernel size must be an odd integer')
|
|
return v
|
|
|
|
parser.add_argument('kernel_size',
|
|
help='size of the 1D convolution kernel, must be odd',
|
|
type=kernsize,
|
|
)
|
|
|
|
parser.add_argument('sigma',
|
|
help='standard deviation value for the probability density function',
|
|
type=float,
|
|
)
|
|
|
|
parser.add_argument('name',
|
|
help='name of the shader, defaults to blurX, where X is the kernel size',
|
|
type=str,
|
|
default=None,
|
|
nargs='?',
|
|
)
|
|
|
|
add_common_args(parser)
|
|
args = parser.parse_args()
|
|
|
|
if args.name is None:
|
|
args.name = f'blur{args.kernel_size}'
|
|
|
|
shaders = args.rootdir / 'resources' / 'shader'
|
|
blurs = shaders / 'lib' / 'blur'
|
|
blurs.mkdir(parents=True, exist_ok=True)
|
|
|
|
update_text_file(blurs / f'{args.name}.glslh', gen_lib_shader(args))
|
|
update_text_file(shaders / f'{args.name}.frag.glsl', gen_fragment_shader(args))
|
|
update_text_file(shaders / f'{args.name}.prog', gen_meta(args))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
run_main(main)
|