Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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)
Пример #7
0
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)
Пример #8
0
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)
Пример #9
0
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)
Пример #10
0
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)
Пример #11
0
    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)
Пример #12
0
    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)
Пример #13
0
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))
Пример #14
0
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))
Пример #15
0
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)