def main(args): parser = argparse.ArgumentParser( description= 'Change package UUID in JavaScript loader generated by Emscripten\'s file_packager.py', prog=args[0]) parser.add_argument( 'loader', help='the .js loader file', metavar='FILE', type=Path, ) parser.add_argument( '--output', '-o', help='write result to FILE (default: overwrite input)', metavar='FILE', type=Path, ) g = parser.add_mutually_exclusive_group(required=True) g.add_argument( '--uuid', help='manually specify an UUID', metavar='UUID', type=str, ) g.add_argument( '--sha1', help='take SHA1 of FILE and use that as an UUID', metavar='FILE', type=Path, ) args = parser.parse_args(args[1:]) if args.uuid is None: args.uuid = hashlib.sha1(args.sha1.read_bytes()).hexdigest() if args.output is None: args.output = args.loader pre, meta, post = meta_re.match(args.loader.read_text()).groups() meta = json.loads(meta) meta['package_uuid'] = args.uuid meta = json.dumps(meta, separators=(',', ':'), check_circular=False, ensure_ascii=False) update_text_file(args.output, pre + meta + post)
def write_override_template(dst, size): dst.parent.mkdir(exist_ok=True, parents=True) text = ( '# This file was generated automatically, because this sprite doesn\'t have a custom override file.\n' '# To override this sprite\'s parameters, edit this file, remove the .renameme suffix and this comment, then commit it to the repository.\n\n' '# Modify these to change the virtual size of the sprite\n' 'w = {size[0]}\n' 'h = {size[1]}\n').format(size=size) update_text_file(dst.with_suffix(dst.suffix + '.renameme'), text)
def write_sprite_def(dst, texture, region, overrides=None): dst.parent.mkdir(exist_ok=True, parents=True) text = ('# Autogenerated by the atlas packer, do not modify\n\n' f'texture = {texture}\n' f'region_x = {region[0]}\n' f'region_y = {region[1]}\n' f'region_w = {region[2]}\n' f'region_h = {region[3]}\n') if overrides is not None: text += f'\n# -- Pasted from the override file --\n\n{overrides.strip()}\n' update_text_file(dst, text)
def update(args): shaders_root = args.rootdir / 'resources' / 'shader' subdir_map = {} for dir in sorted(shaders_root.glob('**/'), reverse=True): glsl_files = tuple(dir.glob('*.glsl')) try: subdirs = subdir_map[dir] except KeyError: subdirs = [] if glsl_files: d = dir while d.resolve() != shaders_root.resolve(): try: subdir_map[d.parent].append(d) except KeyError: subdir_map[d.parent] = [d] d = d.parent if glsl_files or subdirs: subdirs = tuple(sd.relative_to(dir) for sd in subdirs) glsl_files = tuple(f.relative_to(dir) for f in glsl_files) try: meson_text = (dir / 'meson.build').read_text() if meson_text.strip().startswith('# @overwrite'): meson_text = meson_template except FileNotFoundError: meson_text = meson_template glsl_filelist = '\n'.join( sorted(" '{!s}',".format(f) for f in glsl_files) + ['']) meson_text = re_glsl.sub(r'\1{}\3'.format(glsl_filelist), meson_text) subdirs_list = '\n'.join( sorted(" '{!s}',".format(sd) for sd in subdirs) + ['']) meson_text = re_subdirs.sub(r'\1{}\3'.format(subdirs_list), meson_text) meson_text = re_validate.sub(r'\1{}\n\3'.format(validation_code), meson_text) meson_text = re_header.sub(r'\1{}\n\3'.format(header), meson_text) update_text_file(dir / 'meson.build', meson_text)
def write_texture_def(dst, texture, texture_fmt, global_overrides=None, local_overrides=None): dst.parent.mkdir(exist_ok=True, parents=True) text = ('# Autogenerated by the atlas packer, do not modify\n\n' f'source = res/gfx/{texture}.{texture_fmt}\n') if global_overrides is not None: text += f'\n# -- Pasted from the global override file --\n\n{global_overrides.strip()}\n' if local_overrides is not None: text += f'\n# -- Pasted from the local override file --\n\n{local_overrides.strip()}\n' update_text_file(dst, text)
def write_texture_def(dst, texture, global_overrides=None, local_overrides=None): dst.parent.mkdir(exist_ok=True, parents=True) text = ('# Autogenerated by the atlas packer, do not modify\n\n' 'source = res/gfx/{texture}.png\n').format(texture=texture) if global_overrides is not None: text += '\n# -- Pasted from the global override file --\n\n{}\n'.format( global_overrides.strip()) if local_overrides is not None: text += '\n# -- Pasted from the local override file --\n\n{}\n'.format( local_overrides.strip()) update_text_file(dst, text)
def write_sprite_def(dst, texture, region, size, overrides=None): dst.parent.mkdir(exist_ok=True, parents=True) text = ( '# Autogenerated by the atlas packer, do not modify\n\n' 'texture = {texture}\n' 'region_x = {region[0]}\n' 'region_y = {region[1]}\n' 'region_w = {region[2]}\n' 'region_h = {region[3]}\n' # 'w = {size[0]}\n' # 'h = {size[1]}\n' ).format(texture=texture, region=region, size=size) if overrides is not None: text += '\n# -- Pasted from the override file --\n\n{}\n'.format(overrides.strip()) update_text_file(dst, text)
def main(args): parser = argparse.ArgumentParser(description='Change package UUID in JavaScript loader generated by Emscripten\'s file_packager.py', prog=args[0]) parser.add_argument('loader', help='the .js loader file', metavar='FILE', type=Path, ) parser.add_argument('--output', '-o', help='write result to FILE (default: overwrite input)', metavar='FILE', type=Path, ) g = parser.add_mutually_exclusive_group(required=True) g.add_argument('--uuid', help='manually specify an UUID', metavar='UUID', type=str, ) g.add_argument('--sha1', help='take SHA1 of FILE and use that as an UUID', metavar='FILE', type=Path, ) args = parser.parse_args(args[1:]) if args.uuid is None: args.uuid = hashlib.sha1(args.sha1.read_bytes()).hexdigest() if args.output is None: args.output = args.loader pre, meta, post = meta_re.match(args.loader.read_text()).groups() meta = json.loads(meta) meta['package_uuid'] = args.uuid meta = json.dumps(meta, separators=(',', ':'), check_circular=False, ensure_ascii=False) update_text_file(args.output, pre + meta + post)
def update(args, shaders_root): subdir_map = {} for dir in sorted(shaders_root.glob('**/'), reverse=True): glsl_files = tuple(dir.glob('*.glsl')) try: subdirs = subdir_map[dir] except KeyError: subdirs = [] if glsl_files: d = dir while d.resolve() != shaders_root.resolve(): try: subdir_map[d.parent].append(d) except KeyError: subdir_map[d.parent] = [d] d = d.parent if glsl_files or subdirs: subdirs = tuple(sd.relative_to(dir) for sd in subdirs) glsl_files = tuple(f.relative_to(dir) for f in glsl_files) try: meson_text = (dir / 'meson.build').read_text() if meson_text.strip().startswith('# @overwrite'): meson_text = meson_template except FileNotFoundError: meson_text = meson_template glsl_filelist = '\n'.join(sorted(" '{!s}',".format(f) for f in glsl_files) + ['']) meson_text = re_glsl.sub(r'\1{}\3'.format(glsl_filelist), meson_text) subdirs_list = '\n'.join(sorted(" '{!s}',".format(sd) for sd in subdirs) + ['']) meson_text = re_subdirs.sub(r'\1{}\3'.format(subdirs_list), meson_text) meson_text = re_validate.sub(r'\1{}\n\3'.format(validation_code), meson_text) meson_text = re_header.sub(r'\1{}\n\3'.format(header), meson_text) update_text_file(dir / 'meson.build', meson_text)
def write_sprite_def(dst, texture, region, texture_dimensions, overrides=None): dst.parent.mkdir(exist_ok=True, parents=True) text = ('# Autogenerated by the atlas packer, do not modify\n\n' f'texture = {texture}\n' 'region_x = {region_x:.17f}\n' 'region_y = {region_y:.17f}\n' 'region_w = {region_w:.17f}\n' 'region_h = {region_h:.17f}\n').format( region_x=region[0] / texture_dimensions[0], region_y=region[1] / texture_dimensions[1], region_w=region[2] / texture_dimensions[0], region_h=region[3] / texture_dimensions[1], ) if overrides is not None: text += f'\n# -- Pasted from the override file --\n\n{overrides.strip()}\n' update_text_file(dst, text)
def do_maintenance(self, path): guard = self.get_guard_name(path) if guard in self.used_guards: raise TaiseiError('Guard name conflict ({guard}), please fix the naming scheme') self.used_guards.add(guard) text = path.read_text() text = self.update_header(text) text = self.transform_include_guards(text, path) if path.suffixes[-1] == '.h': if missing_guard_test_regex.match(text): print(f"W: {path}: header missing include guard, fixing!", file=sys.stderr) text = text.replace('#include "taisei.h"', '#pragma once\n#include "taisei.h"') text = self.update_header(text) text = self.transform_include_guards(text, path) update_text_file(path, text)
def do_maintenance(self, path): guard = self.get_guard_name(path) if guard in self.used_guards: raise TaiseiError( 'Guard name conflict ({guard}), please fix the naming scheme') self.used_guards.add(guard) text = path.read_text() text = self.update_header(text) text = self.transform_include_guards(text, path) if path.suffixes[-1] == '.h': if missing_guard_test_regex.match(text): print(f"W: {path}: header missing include guard, fixing!", file=sys.stderr) text = text.replace('#include "taisei.h"', '#pragma once\n#include "taisei.h"') text = self.update_header(text) text = self.transform_include_guards(text, path) update_text_file(path, text)
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))
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))
def write_header(args): header = args.header srcdir = args.dir glfuncs = set(args.functions or []) glheaders = set(args.gl_headers or []) for h in glheaders: print("Using", h) glheaders = '\n'.join(h.read_text() for h in glheaders) for src in srcdir.glob('**/*.c'): for func in filter( None, itertools.chain(*regex_glcall.findall(src.read_text()))): glfuncs.add(func) glfuncs = sorted(glfuncs) typedefs = [] prototypes = [] for func in glfuncs: try: proto, rtype, callconv, params = re.findall( regex_glproto_template % func, glheaders, re.DOTALL | re.MULTILINE)[0] except IndexError: print( "Function '%s' not found in the GL headers. Either it really does not exist, or this script is bugged. Update aborted." % func) exit(1) proto = re.sub(r'\s+', ' ', proto, re.DOTALL | re.MULTILINE) params = ', '.join(re.split(r',\s*', params)) typename = 'ts%s_ptr' % func typedef = 'typedef %s (%s *%s)(%s);' % (rtype, callconv, typename, params) typedefs.append(typedef) prototypes.append(proto) print('Found %-50s: %s' % (func, proto)) text = header.read_text() subs = { 'gldefs': '#define GLDEFS \\\n' + ' \\\n'.join('GLDEF(%s, ts%s, ts%s_ptr)' % (f, f, f) for f in glfuncs), 'undefs': '\n'.join('#undef %s' % f for f in glfuncs), 'redefs': '\n'.join('#define %s ts%s' % (f, f) for f in glfuncs), 'reversedefs': '\n'.join('#define ts%s %s' % (f, f) for f in glfuncs), 'typedefs': '\n'.join(typedefs), 'protos': '\n'.join(prototypes), } for key, val in subs.items(): text = re.sub(r'(// @BEGIN:%s@)(.*?)(// @END:%s@)' % (key, key), r'\1\n%s\n\3' % val, text, flags=re.DOTALL | re.MULTILINE) update_text_file(str(header), text)