taisei/scripts/gen-blur-shader.py
Andrei Alexeyev 49d0d54a2e
Lots of disorganized (mostly) visual overhaul (#156)
* 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
2019-01-05 00:59:39 +02:00

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)