commit de58ecb7adca2f4c56baf5beba6ca10415d84d3e Author: Antonio Niño Díaz Date: Thu Feb 1 18:17:54 2024 +0000 all: Import initial version and examples diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..355626d --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# Python cache files +__pycache__/ + +# Setuptools +build/ +dist/ +*.egg-info/ + +# Vim +.*swp + +# Virtual environments +env/ diff --git a/architectds/__init__.py b/architectds/__init__.py new file mode 100644 index 0000000..6cc0bc0 --- /dev/null +++ b/architectds/__init__.py @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: MIT +# +# Copyright (c) 2024 Antonio Niño Díaz + +from .architectds import (Arm9Binary, Arm7Binary, TeakBinary, NitroFS, FatFS, + NdsRom, AUTHOR_STRING, VERSION_STRING) + +__all__ = ['Arm9Binary', 'Arm7Binary', 'TeakBinary', 'NitroFS', 'FatFS', 'NdsRom'] +__author__ = AUTHOR_STRING +__version__ = VERSION_STRING diff --git a/architectds/architectds.py b/architectds/architectds.py new file mode 100644 index 0000000..09cf597 --- /dev/null +++ b/architectds/architectds.py @@ -0,0 +1,1908 @@ +# SPDX-License-Identifier: MIT +# +# Copyright (c) 2024 Antonio Niño Díaz + +# Useful ninja-build commands: +# +# - Build: +# +# ninja +# +# - Clean: +# +# ninja -t clean +# +# - Dependency graph: +# +# sudo apt install graphviz +# ninja -t graph | dot -Tpng -ograph.png +# +# GRF format documentation: +# +# - https://www.coranac.com/man/grit/html/grit.htm + +import json +import os + +AUTHOR_STRING = 'Antonio Niño Díaz' +VERSION_STRING = '0.1.0' + +BLOCKSDS = os.environ.get('BLOCKSDS', '/opt/blocksds/core') +BLOCKSDSEXT = os.environ.get('BLOCKSDSEXT', '/opt/blocksds/external') +WONDERFUL_TOOLCHAIN = os.environ.get('WONDERFUL_TOOLCHAIN', '/opt/wonderful') + +class CJSONDecoder(json.JSONDecoder): + ''' + Decoder of CJSON (JSON with C-style comments). + ''' + def __init__(self, **kw): + super().__init__(**kw) + + def decode(self, s: str): + lines = [] + for l in s.split('\n'): + lines.append(l.split('//')[0]) + s = '\n'.join(lines) + return super().decode(s) + +def load_json(path): + ''' + This loads a JSON file and returns a JSON instance. + ''' + with open(path) as f: + return json.load(f, cls=CJSONDecoder) + +def get_parent_dir(path): + ''' + From a path that includes a folder and a file name it returns the path of + the folder where the file is located. If the path only includes a file name, + it returns None. + Example: get_parent_dir('my/dir/file.png') -> 'my/dir' + ''' + parent = os.path.split(path)[0] + if len(parent) > 0: + return parent + else: + return None + +def get_file_name(path): + ''' + From a path that includes a folder and a file name it returns the file + name. If the path only includes a file name, it returns it unmodified. + Example: get_file_name('my/dir/file.png') -> 'file.png' + ''' + name = os.path.split(path)[1] + if len(name) > 1: + return name + else: + return None + +def replace_ext(path, old_ext, new_ext): + ''' + Removes the previous extension of the path if it matches 'old_ext', and + appends 'new_ext'. Example: replace_ext('file.png', '.png', '') -> 'file' + ''' + return path.removesuffix(old_ext) + new_ext + +def remove_ext(path): + ''' + Removes the extension from a path, or None if there is nothing to return. + ''' + path_no_ext = os.path.splitext(path)[0] + if len(path_no_ext) > 0: + return path_no_ext + else: + return None + +def gen_input_file_list(dir_path, extensions=None): + ''' + This generates a list of paths to files inside the provided path in + 'dir_path'. By default it will look for files with any extension, but you + can also specify a list of extensions. For example: + + gen_input_file_list('audio', extensions=['.wav', '.mod', '.s3m', '.it', '.xm']) + ''' + in_files = [] + for root, dirs, files in os.walk(dir_path): + for _file in files: + if extensions is not None: + if not _file.endswith(extensions): + continue; + in_files.append(os.path.join(root, _file)) + + return in_files + +def gen_out_file_list(in_files, in_prefix, out_prefix, in_suffix, out_suffix): + ''' + This function takes a list of files as input and returns a list of objects + with attributes 'in_path' (the initial path provided as input) and + 'out_path'. The out path is generated by removing 'in_prefix' and + 'in_suffix' (if they are found) and adding 'out_prefix' and 'out_suffix'. + ''' + class InOutFile(): + def __init__(self, in_path, out_path): + self.in_path = in_path + self.out_path = out_path + + files = [] + for in_file in in_files: + tmp = out_prefix + in_file.removeprefix(in_prefix) + tmp = tmp.removesuffix(in_suffix) + out_suffix + files.append(InOutFile(in_file, tmp)) + + return files + +class GenericBinary(): + ''' + Class that defines any binary that may be built as a combination of multiple + inputs. For example, this may represent a CPU binary, or a filesystem image. + ''' + + def __init__(self, flag_assets_name): + self.flag_assets_name = flag_assets_name + self.contents = '' + self.dir_targets = set() + + def print(self, string): + ''' + Add contents to the rule container of this binary. + ''' + self.contents += string + + def save_to_file(self, out_path='build.ninja'): + ''' + Save to a file all the rules generated for a binary. + ''' + with open(out_path, 'w') as f: + f.write(self.contents) + + def run_command_line_arguments(self, args=None, ninja_file_path='build.ninja', + graph_png_path='graph.png'): + ''' + Function that parses command line arguments to help the user build the + ROM, generate the ninja build file, clean the project, or generate a + dependency graph in PNG format. It will use sys.argv unless the caller + specifies a custom list of arguments. + ''' + import os + import shutil + import subprocess + import sys + + if args is None: + args = sys.argv + + build = '-b' in args or '--build' in args + clean = '-c' in args or '--clean' in args + graph = '-g' in args or '--graph' in args + help_ = '-h' in args or '--help' in args + ninja = '-n' in args or '--ninja' in args + + # Build ROM if the script has been called with no arguments. + if not build and not clean and not graph and not ninja and not help_: + build = True + + # If there is any argument that requires the ninja file, generate it. + if build or graph: + ninja = True + + if help_: + print('ArchitectDS: Build system for NDS that uses ninja-build.') + print('') + print('Options:') + print('') + print(' -b / --build : Generate ninja file and build ROM.') + print(' -c / --clean : Clean build outputs and ninja file.') + print(' -g / --graph : Generate dependency graph as a PNG file.') + print(' -n / --ninja : Generate ninja file.') + print(' -h / --help : Show this message.') + print('') + print('If no option is used, the tool will act the same as if') + print('--build had been used.') + return + + if clean: + print('[*] CLEAN') + if os.path.isfile(ninja_file_path): + subprocess.run(['ninja', '-f', ninja_file_path, '-t', 'clean']) + os.remove(ninja_file_path) + + if os.path.isdir('build'): + shutil.rmtree('build', ignore_errors=True) + + if os.path.isfile(graph_png_path): + os.remove(graph_png_path) + + if ninja: + print('[*] NINJA') + self.save_to_file(out_path=ninja_file_path) + + if build: + print('[*] BUILD') + subprocess.run(['ninja', '-f', ninja_file_path]) + + if graph: + print('[*] GRAPH') + ninja_process = subprocess.Popen( + ['ninja', '-f', ninja_file_path, '-t', 'graph'], + stdout=subprocess.PIPE) + dot_process = subprocess.Popen(['dot', '-Tpng', '-o' + graph_png_path], + stdin=ninja_process.stdout, + stdout=subprocess.PIPE) + ninja_process.stdout.close() # enable write error in ninja if dot dies + out, err = dot_process.communicate() + + def add_dir_target(self, new_dir): + ''' + Add a list of directories to the list of directories that will contain + build results for this binary. + ''' + self.dir_targets.add(new_dir) + + # Add parent dirs as well + parent = get_parent_dir(new_dir) + if parent is not None: + self.add_dir_target(parent) + + def _gen_rules_build_directories(self): + ''' + Generate rules to make all output directories in the right order with + the right dependencies on other directories. + ''' + # Sort the list of directories so that parent directories appear last. + # This will help the clean target delete all directories in the right + # order (subdirectories before the directory they belong to). + dir_list = list(self.dir_targets) + dir_list.sort(reverse=True) + + for dir_target in dir_list: + # Each dir depends on the parent dir + parent = get_parent_dir(dir_target) + if parent is None: + self.print( + f'build {dir_target}: makedir\n' + '\n' + ) + else: + self.print( + f'build {dir_target}: makedir || {parent}\n' + '\n' + ) + +class GenericCpuBinary(GenericBinary): + ''' + This class has functions that can be used for any CPU binary in the NDS. + ''' + + def __init__(self, flag_assets_name): + super().__init__(flag_assets_name) + self.out_assets_path = None + self.assets_c = [] + self.assets_h = [] + + def add_header_dependencies(self, h_files): + self.assets_h.extend(h_files) + + def _gen_rule_assets_barrier(self): + ''' + This generates a common phony target to all the files injected to the + CPU binary as data. This phony target can be used instead of all the + files when building the final CPU binary. + ''' + flag_path = self.flag_assets_name + file_paths_str = ' '.join(self.assets_h) + self.print( + f'build {flag_path}: phony {file_paths_str}\n' + '\n' + ) + + def add_data(self, in_dirs, out_dir='data'): + ''' + This function takes a list of directories and injects them as data in + the CPU binary. It will take any file found in the directories + regardless of the extension. + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + in_out_files = [] + + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '', '')) + + for in_out_file in in_out_files: + out_path_base = '_'.join(in_out_file.out_path.rsplit('.', 1)) + + out_path_dir = get_parent_dir(out_path_base) + self.add_dir_target(out_path_dir) + + in_path = in_out_file.in_path + + out_path_c = out_path_base + '.c' + out_path_h = out_path_base + '.h' + self.assets_c.append(out_path_c) + self.assets_h.append(out_path_h) + + self.print( + f'build {out_path_c} {out_path_h}: bin2c {in_path} || {out_path_dir}\n' + f' outdir = {out_path_dir}\n' + '\n' + ) + + def add_data_file(self, in_path, out_dir): + ''' + This function takes a file and injects it as data in the CPU binary. + ''' + in_file_name = get_file_name(in_path) + out_path_base = os.path.join(out_dir, in_file_name) + out_path_base = '_'.join(out_path_base.rsplit('.', 1)) + + out_path_dir = get_parent_dir(out_path_base) + self.add_dir_target(out_path_dir) + + out_path_c = out_path_base + '.c' + out_path_h = out_path_base + '.h' + self.assets_c.append(out_path_c) + self.assets_h.append(out_path_h) + + self.print( + f'build {out_path_c} {out_path_h}: bin2c {in_path} || {out_path_dir}\n' + f' outdir = {out_path_dir}\n' + '\n' + ) + +class GenericArmBinary(GenericCpuBinary): + ''' + This class has functions that can be used for any ARM binary in the NDS. + ''' + + def __init__(self, flag_assets_name): + super().__init__(flag_assets_name) + + def _gen_rules_source_arm(self, in_dirs, out_dir, asflags, cflags, cxxflags, + assets_c_files, assets_h_flag): + ''' + Generates rules to build all provided source files, and adds additional + headers as dependencies of the source files. + + Mandatory arguments: + + - 'in_dirs': List of paths to directories with source code. + - 'out_dir': Base path to store all build results. + - 'asflags': All flags to be passed to the assembler. + - 'cflags': All flags to be passed to the C compiler. + - 'cxxflags': All flags to be passed to the C++ compiler. + - 'assets_c_files': Additional C files (result of converting assets). + - 'assets_h_files': Additional H files (result of converting assets). + ''' + + in_out_files = [] + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.c', '.cpp', '.s')) + in_out_files.extend(gen_out_file_list(in_files, '', out_dir + '/', '', '.o')) + + in_out_files.extend(gen_out_file_list(assets_c_files, '', out_dir + '/', '', '.o')) + + for in_out_file in in_out_files: + obj_out_path = in_out_file.out_path + dep_out_path = replace_ext(obj_out_path, '.o', '.d') + + in_path = in_out_file.in_path + + out_path_dir = get_parent_dir(obj_out_path) + self.add_dir_target(out_path_dir) + + self.obj_file_paths.append(obj_out_path) + + if in_path.endswith('.cpp'): + self.has_cpp = True + + if in_path.endswith('.arm.cpp'): + self.print( + f'build {obj_out_path}: cxx_arm {in_path} || {out_path_dir} {assets_h_flag}\n' + f' cxxflags = -marm -mlong-calls {cxxflags}\n' + f' dep = {dep_out_path}\n' + '\n' + ) + elif in_path.endswith('.arm.c'): + self.print( + f'build {obj_out_path}: cc_arm {in_path} || {out_path_dir} {assets_h_flag}\n' + f' cflags = -marm -mlong-calls {cflags}\n' + f' dep = {dep_out_path}\n' + '\n' + ) + elif in_path.endswith('.cpp'): + self.print( + f'build {obj_out_path}: cxx_arm {in_path} || {out_path_dir} {assets_h_flag}\n' + f' cxxflags = -mthumb {cxxflags}\n' + f' dep = {dep_out_path}\n' + '\n' + ) + elif in_path.endswith('.c'): + self.print( + f'build {obj_out_path}: cc_arm {in_path} || {out_path_dir} {assets_h_flag}\n' + f' cflags = -mthumb {cflags}\n' + f' dep = {dep_out_path}\n' + '\n' + ) + elif in_path.endswith('.s'): + self.print( + f'build {obj_out_path}: as_arm {in_path} || {out_path_dir} {assets_h_flag}\n' + f' asflags = {asflags}\n' + f' dep = {dep_out_path}\n' + '\n' + ) + + def add_tlf(self, teak, out_dir='teak'): + ''' + Adds a TLF file as data in the ARM9 binary to be used without filesystem + access. + ''' + assert type(teak).__name__ == 'TeakBinary' + + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + self.add_data_file(teak.tlf_path, full_out_dir) + + def generate_elf(self): + ''' + This function generates rules to build an ELF file. + ''' + + self._gen_rule_assets_barrier() + + defines = ' '.join(['-D' + define for define in self.defines]) + + includedirs = self.includedirs + [self.out_assets_path] + + includeflags = ' '.join('-I' + path + '/include' for path in self.libdirs) + \ + ' ' + ' '.join('-I' + path for path in includedirs) + + asflags = ( + f'-x assembler-with-cpp {defines} {includeflags} ' + f'-ffunction-sections -fdata-sections {self.specs} ' + f'{self.arch} {self.asflags}' + ) + + cflags = ( + f'{defines} {includeflags} ' + f'-ffunction-sections -fdata-sections {self.specs} ' + f'{self.arch} {self.cflags}' + ) + + cxxflags = ( + f'{defines} {includeflags} -fno-exceptions -fno-rtti ' + f'-ffunction-sections -fdata-sections {self.specs} ' + f'{self.arch} {self.cxxflags}' + ) + + self._gen_rules_source_arm(self.sourcedirs, self.out_dir, + asflags, cflags, cxxflags, + self.assets_c, self.flag_assets_name) + + if self.has_cpp: + self.libs.extend(['stdc++', 'c']) + ldcmd = 'ld_cxx_arm' + else: + self.libs.extend(['c']) + ldcmd = 'ld_cc_arm' + + libs = ' '.join(['-l' + lib for lib in self.libs]) + libdirsflags = ' '.join(['-L' + libdir + '/lib' for libdir in self.libdirs]) + + ldflags = ( + f'{libdirsflags} -Wl,-Map,{self.map_path} {self.arch} ' + f'-Wl,--start-group {libs} -Wl,--end-group {self.specs}' + ) + + obj_file_paths_str = ' '.join(self.obj_file_paths) + + self.print( + f'build {self.elf_path} | {self.map_path}: {ldcmd} {obj_file_paths_str} || {self.out_dir}\n' + f' ldflags = {ldflags}\n' + '\n' + ) + +class Arm9Binary(GenericArmBinary): + ''' + Class that represents an ARM9 CPU binary. + ''' + + ASSETS_BARRIER_ARM9 = 'assets_arm9_flag' + + def __init__(self, *, sourcedirs, defines=[], includedirs=[], + libs=['nds9', 'mm9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDS}/libs/maxmod'], + asflags='', + cflags='-Wall -O2 -std=gnu11', + cxxflags='-Wall -O2 -std=gnu++14'): + ''' + Constructor of ARM9 binaries. + + Mandatory arguments: + + - 'sourcedirs': List of paths to directories with source code. + + Optional arguments: + + - 'defines': List of defines. Example: ['FEATURE_ON', FEATURE_LEVEL=2'] + - 'includedirs': List of folders to be searched for headers. + - 'libs': List of libraries to be linked to the binary. + - 'libdirs': List of paths to be searched for libraries. The paths must + contain folders called 'include' and 'lib'. + - 'asflags': Optional flags to be passed to the assembler. + - 'cflags': Optional flags to be passed to the C compiler. + - 'cxxflags': Optional flags to be passed to the C++ compiler. + ''' + super().__init__(self.ASSETS_BARRIER_ARM9) + + self.sourcedirs = sourcedirs + self.defines = defines + self.includedirs = includedirs + self.libs = libs + self.libdirs = libdirs + self.asflags = asflags + self.cflags = cflags + self.cxxflags = cxxflags + + self.out_dir = 'build/arm9' + self.add_dir_target(self.out_dir) + + self.out_assets_path = 'build/assets/arm9' + + self.arch = '-mcpu=arm946e-s+nofp' + self.specs = '-specs=${BLOCKSDS}/sys/crts/ds_arm9.specs' + self.map_path = os.path.join(self.out_dir, 'arm9.map') + self.elf_path = os.path.join(self.out_dir, 'arm9.elf') + + self.has_cpp = False + self.obj_file_paths = [] + + def add_grit(self, in_dirs, out_dir='grit'): + ''' + This function gets as input a list of directories. It will look for + files with extension '.png' or '.jpg' and look for another '.grit' file + with the same base name. Then, it will create rules to convert them and + add them as data to the CPU binary. + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + in_out_files = [] + + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.png')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.png', '_png')) + in_files = gen_input_file_list(in_dir, ('.jpg')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.jpg', '_jpg')) + + for in_out_file in in_out_files: + grit_out_path = in_out_file.out_path + + out_path_dir = get_parent_dir(grit_out_path) + self.add_dir_target(out_path_dir) + + in_path_img = in_out_file.in_path + in_path_grit = remove_ext(in_path_img) + '.grit' + + out_path_c = grit_out_path + '.c' + out_path_h = grit_out_path + '.h' + self.assets_c.append(out_path_c) + self.assets_h.append(out_path_h) + + self.print( + f'build {out_path_c} {out_path_h}: grit {in_path_img} {in_path_grit} || {out_path_dir}\n' + f' in_path_img = {in_path_img}\n' + f' grit_out_path = {grit_out_path}\n' + f' options = -ftc -W1\n' + '\n' + ) + + def add_mmutil(self, in_dirs, name='soundbank', out_dir='maxmod'): + ''' + This function gets as input a list of directories. It will look for + files with the extensions '.wav', '.mod', '.s3m', '.it' and '.xm', and + it will build a Maxmod soundbank with the name provided in 'name'. This + soundbank will be added as data to the ARM9 binary so it can be used + without filesystem access. + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + self.add_dir_target(full_out_dir) + + in_audio_files = [] + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.it', '.mod', '.s3m', '.xm', '.wav')) + in_audio_files.extend(in_files) + + out_path_base = os.path.join(full_out_dir, name) + + out_path_bin = out_path_base + '.bin' + out_path_bin_c = out_path_base + '_bin.c' + out_path_bin_h = out_path_base + '_bin.h' + out_path_info_h = out_path_base + '_info.h' + + self.assets_c.extend([out_path_bin_c]) + self.assets_h.extend([out_path_info_h, out_path_bin_h]) + + all_audio_files = ' '.join(in_audio_files) + self.print( + f'build {out_path_bin} {out_path_info_h} : mmutil {all_audio_files} || {full_out_dir}\n' + f' soundbank_bin = {out_path_bin}\n' + f' soundbank_info_h = {out_path_info_h}\n' + '\n' + f'build {out_path_bin_c} {out_path_bin_h}: bin2c {out_path_bin} || {full_out_dir}\n' + f' outdir = {full_out_dir}\n' + '\n' + ) + + def add_nitro_engine_obj(self, in_dirs, out_dir='models'): + ''' + Nitro Engine: This function gets as input a list of directories. It will + look for files with extension '.obj' and look for another '.json' file + with the same base name. Then, it will create rules to convert them and + add them as data to the CPU binary. + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + in_out_files = [] + + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.obj')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.obj', '.dl')) + + for in_out_file in in_out_files: + out_path_dl = in_out_file.out_path + + out_path_dir = get_parent_dir(out_path_dl) + self.add_dir_target(out_path_dir) + + in_path_obj = in_out_file.in_path + in_path_json = remove_ext(in_path_obj) + '.json' + + json_data = load_json(in_path_json) + assert 'texture' in json_data, 'Texture size must be provided' + + args = ( + '--texture ' + str(json_data['texture'][0]) + ' ' + + str(json_data['texture'][1]) + ) + + if 'scale' in json_data: + args += ' --scale ' + str(json_data['scale']) + + if 'use-vertex-color' in json_data: + if json_data['use-vertex-color']: # Only add this if True + args += ' --use-vertex-color ' + + self.print( + f'build {out_path_dl} : obj2dl {in_path_obj} {in_path_json} || {out_path_dir}\n' + f' in_path_obj = {in_path_obj}\n' + f' args = {args}\n' + '\n' + ) + + # The resulting binary file needs to be converted to C and H files + self.add_data_file(out_path_dl, out_path_dir) + + def add_nitro_engine_md5(self, in_dirs, out_dir='models'): + ''' + Nitro Engine: Looks for md5mesh files in the provided directores. Each + file must be acompanied by a json file with some information. For + example: + + { + "texture": [256, 256], + "blender-fix": true, + "export-base-pose": false, + "animations": [ + { + "file": "wave.md5anim", + "skip-frames": 1 + } + ] + } + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + md5mesh_in_out_files =[] + + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.md5mesh')) + md5mesh_in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.md5mesh', '')) + + for in_out_file in md5mesh_in_out_files: + out_path_dir = get_parent_dir(in_out_file.out_path) + self.add_dir_target(out_path_dir) + + in_path_md5mesh = in_out_file.in_path + in_path_json = replace_ext(in_path_md5mesh, '.md5mesh', '.json') + + json_data = load_json(in_path_json) + assert 'texture' in json_data, 'Texture size must be provided' + + args = ( + '--texture ' + str(json_data['texture'][0]) + ' ' + + str(json_data['texture'][1]) + ) + + if 'blender-fix' in json_data: + if json_data['blender-fix']: + args += ' --blender-fix' + + base_name = remove_ext(get_file_name(in_path_md5mesh)) + + args += f' --name {base_name} --output {out_path_dir} --model {in_path_md5mesh}' + + out_path_dsm = in_out_file.out_path + '.dsm' + + args_str = ' '.join(args) + + self.print( + f'build {out_path_dsm} : md5_to_dsma {in_path_md5mesh} {in_path_json} || {out_path_dir}\n' + f' args = {args}\n' + '\n' + ) + + # The resulting binary file needs to be converted to C and H files + self.add_data_file(out_path_dsm, out_path_dir) + + if 'animations' in json_data: + in_path_dir = get_parent_dir(in_out_file.in_path) + + for animation in json_data['animations']: + assert 'file' in animation + in_path_md5anim = os.path.join(in_path_dir, animation['file']) + + args = f' --name {base_name} --output {out_path_dir} --anim {in_path_md5anim}' + + if 'skip-frames' in animation: + args += ' --skip-frames ' + str(animation['skip-frames']) + + if 'blender-fix' in json_data: + if json_data['blender-fix']: + args += ' --blender-fix' + + base_name_anim = remove_ext(get_file_name(in_path_md5anim)) + + out_path_dsa = in_out_file.out_path + '_' + base_name_anim + '.dsa' + + args_str = ' '.join(args) + + self.print( + f'build {out_path_dsa} : md5_to_dsma {in_path_md5anim} {in_path_json} || {out_path_dir}\n' + f' args = {args}\n' + '\n' + ) + + # The resulting binary file needs to be converted to C and H files + self.add_data_file(out_path_dsa, out_path_dir) + + def add_ptexconv_tex4x4(self, in_dirs, out_dir='ptexconv'): + ''' + This function gets as input a list of directories. It will look for + files with extension '.png' and '.jpg'. Then, it will create rules to + convert them and add them to Texel 4x4 format textures and add them to + the CPU binary as data. + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + in_out_files = [] + + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.png')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.png', '_png')) + in_files = gen_input_file_list(in_dir, ('.jpg')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.jpg', '_jpg')) + + for in_out_file in in_out_files: + ptexconv_out_path = in_out_file.out_path + + out_path_dir = get_parent_dir(ptexconv_out_path) + self.add_dir_target(out_path_dir) + + in_path_png = in_out_file.in_path + + out_path_tex = ptexconv_out_path + '_tex.bin' + out_path_idx = ptexconv_out_path + '_idx.bin' + out_path_pal = ptexconv_out_path + '_pal.bin' + + self.print( + f'build {out_path_tex} {out_path_idx} {out_path_pal} : ptexconv {in_path_png} || {out_path_dir}\n' + f' args = -gt -ob -k FF00FF -v -f tex4x4 -o {ptexconv_out_path} {in_path_png}\n' + '\n' + ) + + self.add_data_file(out_path_tex, out_path_dir) + self.add_data_file(out_path_idx, out_path_dir) + self.add_data_file(out_path_pal, out_path_dir) + + +class Arm7BinaryDefault(): + ''' + Class that represents the default ARM7 of BlocksDS. + ''' + + def __init__(self): + self.elf_path = '${BLOCKSDS}/sys/default_arm7/arm7.elf' + self.contents = '' + self.dir_targets = [] + +class Arm7Binary(GenericArmBinary): + ''' + Class that represents an ARM7 CPU binary. + ''' + + ASSETS_BARRIER_ARM7 = 'assets_arm7_flag' + + def __init__(self, *, sourcedirs, defines=[], includedirs=[], + libs=['nds7', 'mm7', 'dswifi7'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDS}/libs/maxmod', + '${BLOCKSDS}/libs/dswifi'], + asflags='', + cflags='-Wall -O2 -std=gnu11', + cxxflags='-Wall -O2 -std=gnu++14'): + ''' + Constructor of ARM7 binaries. + + Mandatory arguments: + + - 'sourcedirs': List of paths to directories with source code. + + Optional arguments: + + - 'defines': List of defines. Example: ['FEATURE_ON', FEATURE_LEVEL=2'] + - 'includedirs': List of folders to be searched for headers. + - 'libs': List of libraries to be linked to the binary. + - 'libdirs': List of paths to be searched for libraries. The paths must + contain folders called 'include' and 'lib'. + - 'asflags': Optional flags to be passed to the assembler. + - 'cflags': Optional flags to be passed to the C compiler. + - 'cxxflags': Optional flags to be passed to the C++ compiler. + ''' + + super().__init__(self.ASSETS_BARRIER_ARM7) + + self.sourcedirs = sourcedirs + self.defines = defines + self.includedirs = includedirs + self.libs = libs + self.libdirs = libdirs + self.asflags = asflags + self.cflags = cflags + self.cxxflags = cxxflags + + self.out_dir = 'build/arm7' + self.add_dir_target(self.out_dir) + + self.out_assets_path = 'build/assets/arm7' + + self.arch = '-mcpu=arm7tdmi' + self.specs = '-specs=${BLOCKSDS}/sys/crts/ds_arm7.specs' + self.map_path = os.path.join(self.out_dir, 'arm7.map') + self.elf_path = os.path.join(self.out_dir, 'arm7.elf') + + self.has_cpp = False + self.obj_file_paths = [] + +class TeakBinary(GenericCpuBinary): + ''' + Class that represents a Teak CPU binary. + ''' + + ASSETS_BARRIER_TEAK = 'assets_teak_flag_' + + def __init__(self, *, name, sourcedirs, defines=[], includedirs=[], + libs=['teak'], + libdirs=['${BLOCKSDS}/libs/libteak'], + asflags='', + cflags='-Wall -O2 -std=gnu11', + cxxflags='-Wall -O2 -std=gnu++14'): + ''' + Constructor of Teak binaries. + + Mandatory arguments: + + - 'sourcedirs': List of paths to directories with source code. + + Optional arguments: + + - 'defines': List of defines. Example: ['FEATURE_ON', FEATURE_LEVEL=2'] + - 'includedirs': List of folders to be searched for headers. + - 'libs': List of libraries to be linked to the binary. + - 'libdirs': List of paths to be searched for libraries. The paths must + contain folders called 'include' and 'lib'. + - 'asflags': Optional flags to be passed to the assembler. + - 'cflags': Optional flags to be passed to the C compiler. + - 'cxxflags': Optional flags to be passed to the C++ compiler. + ''' + super().__init__(self.ASSETS_BARRIER_TEAK + str(name)) + + self.name = name + self.sourcedirs = sourcedirs + self.includedirs = includedirs + self.libs = libs + self.libdirs = libdirs + self.asflags = asflags + self.cflags = cflags + self.cxxflags = cxxflags + + self.defines = ['__NDS__', 'TEAK'] + defines + + self.out_dir = os.path.join('build', name) + self.add_dir_target(self.out_dir) + + self.has_cpp = False + self.obj_file_paths = [] + + def _gen_rules_source_teak(self, in_dirs, out_dir, asflags, cflags, cxxflags, + assets_c_files, assets_h_flag): + ''' + Generates rules to build all provided source files, and adds additional + headers as dependencies of the source files. + + Mandatory arguments: + + - 'in_dirs': List of paths to directories with source code. + - 'out_dir': Base path to store all build results. + - 'asflags': All flags to be passed to the assembler. + - 'cflags': All flags to be passed to the C compiler. + - 'cxxflags': All flags to be passed to the C++ compiler. + - 'assets_c_files': Additional C files (result of converting assets). + - 'assets_h_files': Additional H files (result of converting assets). + ''' + + in_out_files = [] + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.c', '.cpp', '.s')) + in_out_files.extend(gen_out_file_list(in_files, '', out_dir + '/', '', '.o')) + + in_out_files.extend(gen_out_file_list(assets_c_files, '', out_dir + '/', '', '.o')) + + for in_out_file in in_out_files: + obj_out_path = in_out_file.out_path + dep_out_path = replace_ext(obj_out_path, '.o', '.d') + + in_path = in_out_file.in_path + + out_path_dir = get_parent_dir(obj_out_path) + self.add_dir_target(out_path_dir) + + self.obj_file_paths.append(obj_out_path) + + if in_path.endswith('.cpp'): + self.has_cpp = True + + if in_path.endswith('.cpp'): + self.print( + f'build {obj_out_path}: cxx_teak {in_path} || {out_path_dir} {assets_h_flag}\n' + f' cxxflags = {cxxflags}\n' + f' dep = {dep_out_path}\n' + '\n' + ) + elif in_path.endswith('.c'): + self.print( + f'build {obj_out_path}: cc_teak {in_path} || {out_path_dir} {assets_h_flag}\n' + f' cflags = {cflags}\n' + f' dep = {dep_out_path}\n' + '\n' + ) + elif in_path.endswith('.s'): + self.print( + f'build {obj_out_path}: as_teak {in_path} || {out_path_dir} {assets_h_flag}\n' + f' asflags = {asflags}\n' + f' dep = {dep_out_path}\n' + '\n' + ) + + def generate_tlf(self): + ''' + This function generates rules to build a TLF file. + ''' + self._gen_rule_assets_barrier() + + arch = '--target=teak -march=teak' + defines = ' '.join(['-D' + define for define in self.defines]) + + # TODO: Support assets + + includeflags = ' '.join('-I' + path + '/include' for path in self.libdirs) + \ + ' ' + ' '.join('-I' + path for path in self.includedirs) + + asflags = ( + f'-x assembler-with-cpp {defines} {arch} {includeflags} ' + '-integrated-as -nostdlib -ffreestanding -fno-builtin ' + f'{self.asflags}' + ) + + cflags = ( + f'{defines} {arch} {includeflags} ' + '-integrated-as -nostdlib -ffreestanding -fno-builtin ' + f'{self.cflags}' + ) + + cxxflags = ( + f'{defines} {arch} {includeflags} ' + '-integrated-as -nostdlib -ffreestanding -fno-builtin ' + '-fno-rtti -fno-exceptions ' + f'{self.cxxflags}' + ) + + self._gen_rules_source_teak(self.sourcedirs, self.out_dir, + asflags, cflags, cxxflags, + self.assets_c, self.flag_assets_name) + + libs = ' '.join(['-l' + lib for lib in self.libs]) + libdirsflags = ' '.join(['-L' + libdir + '/lib' for libdir in self.libdirs]) + + map_path = os.path.join(self.out_dir, 'teak.map') + + ldflags = ( + f'{libdirsflags} -Map {map_path} -nostdlib ' + '-T${BLOCKSDS}/libs/libteak/teak.ld ' + f'--start-group {libs} --end-group' + ) + + elf_path = os.path.join(self.out_dir, 'teak.elf') + obj_file_paths_str = ' '.join(self.obj_file_paths) + + self.tlf_path = os.path.join(self.out_dir, self.name + '.tlf') + + self.print( + f'build {elf_path} | {map_path}: ld_teak {obj_file_paths_str} || {self.out_dir}\n' + f' ldflags = {ldflags}\n' + '\n' + f'build {self.tlf_path}: teaktool {elf_path} || {self.out_dir}\n' + '\n' + ) + +class GenericFilesystem(GenericBinary): + ''' + Class that defines rules to add files to a generic filesystem (SD or + NitroFS) with a previous conversion step. This can be used for graphics, + music, etc. + ''' + + def __init__(self, flag_assets_name, out_assets_path): + super().__init__(flag_assets_name) + + self.target_files = [] + + self.out_assets_path = out_assets_path + self.add_dir_target(self.out_assets_path) + + def _gen_rule_assets_barrier(self): + ''' + This generates a common phony target to all the files inside the + filesystem. This phony target can be used instead of all the files when + another target depends on the filesystem as a whole, like the NDS ROM. + ''' + flag_path = self.flag_assets_name + file_paths_str = ' '.join(self.target_files) + self.print( + f'build {flag_path}: phony {file_paths_str}\n' + '\n' + ) + + def generate_image(self): + ''' + This generates rules required to complete the filesystem image after all + the files have been added to it. + ''' + self._gen_rule_assets_barrier() + + def add_grit(self, in_dirs, out_dir='grit'): + ''' + This function gets as input a list of directories. It will look for + files with extension '.png' and look for another '.grit' file with the + same base name. Then, it will create rules to convert them and add them + to the filesystem. + + This rule will create GRF files: + + https://www.coranac.com/man/grit/html/grit.htm + + GRF files are used because it's easier to keep track of the outputs of + the rule. If not, this rule would need to parse the '.grit' file to + determine if maps, tilesets or palettes are going to be generated so + that the dependencies can be created correctly. + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + in_out_files = [] + + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.png')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.png', '_png')) + + for in_out_file in in_out_files: + grit_out_path = in_out_file.out_path + + out_path_dir = get_parent_dir(grit_out_path) + self.add_dir_target(out_path_dir) + + in_path_png = in_out_file.in_path + in_path_grit = replace_ext(in_path_png, '.png', '.grit') + + out_path_grf = grit_out_path + '.grf' + + self.target_files.append(out_path_grf) + + self.print( + f'build {out_path_grf} : grit {in_path_png} {in_path_grit} || {out_path_dir}\n' + f' in_path_img = {in_path_png}\n' + f' grit_out_path = {grit_out_path}\n' + f' options = -ftr -fh! -W1\n' + '\n' + ) + + def add_ptexconv_tex4x4(self, in_dirs, out_dir='ptexconv'): + ''' + This function gets as input a list of directories. It will look for + files with extension '.png' and '.jpg'. Then, it will create rules to + convert them and add them to Texel 4x4 format textures and add them to + the filesystem as '.bin' files. + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + in_out_files = [] + + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.png')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.png', '_png')) + in_files = gen_input_file_list(in_dir, ('.jpg')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.jpg', '_jpg')) + + for in_out_file in in_out_files: + ptexconv_out_path = in_out_file.out_path + + out_path_dir = get_parent_dir(ptexconv_out_path) + self.add_dir_target(out_path_dir) + + in_path_png = in_out_file.in_path + + out_path_tex = ptexconv_out_path + '_tex.bin' + out_path_idx = ptexconv_out_path + '_idx.bin' + out_path_pal = ptexconv_out_path + '_pal.bin' + + self.target_files.extend([out_path_tex, out_path_idx, out_path_pal]) + + self.print( + f'build {out_path_tex} {out_path_idx} {out_path_pal} : ptexconv {in_path_png} || {out_path_dir}\n' + f' args = -gt -ob -k FF00FF -v -f tex4x4 -o {ptexconv_out_path} {in_path_png}\n' + '\n' + ) + + def add_mmutil(self, in_dirs, name='soundbank', out_dir_h='build/assets/arm9/nitrofs', out_dir_bin='maxmod'): + ''' + This function gets as input a list of directories. It will look for + files with the extensions '.wav', '.mod', '.s3m', '.it' and '.xm', and + it will build a Maxmod soundbank with the name provided in 'name'. This + soundbank will be added to the filesystem at the path specified in + 'out_dir_bin'. + + Note that this process generates a header file with the definitions + required to use the soundbank. The header is saved to the directory + 'out_dir_h', and it must be passed as an additional header file to the + ARM9 binary. For example: + + nitrofs_soundbank_header = nitrofs.add_mmutil(['nitrofs/audio']) + + [...] + + arm9.add_header_dependencies([nitrofs_soundbank_header]) + ''' + full_out_dir_bin = os.path.join(self.out_assets_path, out_dir_bin) + self.add_dir_target(full_out_dir_bin) + + full_out_dir_h = out_dir_h + self.add_dir_target(full_out_dir_h) + + in_audio_files = [] + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.it', '.mod', '.s3m', '.xm', '.wav')) + in_audio_files.extend(in_files) + + out_path_bin = os.path.join(full_out_dir_bin, name + '.bin') + out_path_info_h = os.path.join(full_out_dir_h, name + '_info.h') + + self.target_files.append(out_path_bin) + + all_audio_files = ' '.join(in_audio_files) + self.print( + f'build {out_path_bin} {out_path_info_h} : mmutil {all_audio_files} || {full_out_dir_bin} {full_out_dir_h}\n' + f' soundbank_bin = {out_path_bin}\n' + f' soundbank_info_h = {out_path_info_h}\n' + '\n' + ) + + return out_path_info_h + + def add_tlf(self, teak, out_dir='teak'): + ''' + Adds a TLF file to the filesystem. + ''' + assert type(teak).__name__ == 'TeakBinary' + + full_out_dir = os.path.join(self.out_assets_path, out_dir) + self.add_dir_target(full_out_dir) + + out_tlf = os.path.join(full_out_dir, get_file_name(teak.tlf_path)) + + self.print( + f'build {out_tlf}: copy {teak.tlf_path} || {full_out_dir}\n' + '\n' + ) + + self.target_files.append(out_tlf) + + def add_files_unchanged(self, in_dirs, out_dir='files'): + ''' + This function takes a list of directories and injects them right away to + the filesystem. + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + in_out_files = [] + + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '', '')) + + for in_out_file in in_out_files: + out_path_base = '_'.join(in_out_file.out_path.rsplit('.', 1)) + + out_path_dir = get_parent_dir(out_path_base) + self.add_dir_target(out_path_dir) + + in_path = in_out_file.in_path + out_path = in_out_file.out_path + + self.print( + f'build {out_path} : copy {in_path} || {out_path_dir}\n' + '\n' + ) + + def _add_nflib_gfx(self, in_dirs, out_dir, xp_map, xp_img, xp_pal, grit_args): + ''' + NFLib: Generic rule to use grit to convert graphics files in png and jpg + format that don't share palettes or tilesets. It is possible to specify + what files to export (map, tileset, palette) by using the 'xp_map', + 'xp_img' and 'xp_pal' parameters. + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + in_out_files = [] + + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.png')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.png', '')) + + in_files = gen_input_file_list(in_dir, ('.jpg')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.jpg', '')) + + for in_out_file in in_out_files: + grit_out_path = in_out_file.out_path + + out_path_dir = get_parent_dir(grit_out_path) + self.add_dir_target(out_path_dir) + + in_path_png = in_out_file.in_path + + out_files = [] + grit_enable_args = [] + + if xp_map: + out_path_map = grit_out_path + '.map' + out_files.append(out_path_map) + else: + grit_enable_args.append('-m!') + + if xp_img: + out_path_img = grit_out_path + '.img' + out_files.append(out_path_img) + else: + grit_enable_args.append('-g!') + + if xp_pal: + out_path_pal = grit_out_path + '.pal' + out_files.append(out_path_pal) + else: + grit_enable_args.append('-p!') + + self.target_files.extend(out_files) + + out_files_str = ' '.join(out_files) + grit_enable_flags_str = ' '.join(grit_enable_args) + + self.print( + f'build {out_files_str} : grit {in_path_png} || {out_path_dir}\n' + f' in_path_img = {in_path_png}\n' + f' grit_out_path = {grit_out_path}\n' + f' options = -W1 -ftB -fh! {grit_enable_flags_str} {grit_args}\n' + '\n' + ) + + def _add_nflib_gfx_shared_pal(self, in_dir, out_dir, xp_map, xp_img, grit_args): + ''' + NFLIb: Generic rule to use grit to convert graphics files in png and jpg + format that share palettes. It is possible to specify what files to + export (map, tileset) by using the 'xp_map' and 'xp_img' parameters. + ''' + # First, run grit to export all maps and tilesets and the single shared + # palette. Later that palette will be copied and renamed so that every + # PNG file ends up with its own palette. + + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + in_out_files = [] + + in_files = gen_input_file_list(in_dir, ('.png')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.png', '')) + + in_files = gen_input_file_list(in_dir, ('.jpg')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.jpg', '')) + + assert len(in_out_files) >= 2, "At least 2 files expected" + + in_paths_png = [] + out_files = [] + for in_out_file in in_out_files: + in_paths_png.append(in_out_file.in_path) + + if xp_map: + out_path_map = in_out_file.out_path + '.map' + out_files.append(out_path_map) + + if xp_img: + out_path_img = in_out_file.out_path + '.img' + out_files.append(out_path_img) + + grit_out_shared_pal_path = in_out_files[0].out_path + out_path_dir = get_parent_dir(grit_out_shared_pal_path) + self.add_dir_target(out_path_dir) + + out_path_pal = grit_out_shared_pal_path + '.pal' + out_files.append(out_path_pal) + + grit_enable_args = [] + + if not xp_map: + grit_enable_args.append('-m!') + + if not xp_img: + grit_enable_args.append('-g!') + + self.target_files.extend(out_files) + + in_files_str = ' '.join(in_paths_png) + out_files_str = ' '.join(out_files) + grit_enable_flags_str = ' '.join(grit_enable_args) + + self.print( + f'build {out_files_str} : grit_nf_shared {in_files_str} || {out_path_dir}\n' + f' in_files_png = {in_files_str}\n' + f' options = -W1 -ftB -fh! {grit_enable_flags_str} {grit_args} -pS -D{out_path_dir} -O{grit_out_shared_pal_path}\n' + '\n' + ) + + # Copy palette and rename it for each BG + for in_out_file in in_out_files[1:]: + out_target_path_pal = in_out_file.out_path + '.pal' + self.target_files.append(out_target_path_pal) + self.print( + f'build {out_target_path_pal} : copy {out_path_pal} || {out_path_dir}\n' + '\n' + ) + + def add_nflib_bg_8bit(self, in_dirs, out_dir='bg'): + ''' + NFLib: Create rules to convert into 8-bit bitmap backgrounds all the png + and jpg files in the specified list of directories. Color 0xFF00FF + (magenta) will be used as transparent color. + ''' + self._add_nflib_gfx(in_dirs, out_dir, True, True, True, '-gTFF00FF -gb -gB8') + + def add_nflib_bg_16bit(self, in_dirs, out_dir='bg'): + ''' + NFLib: Create rules to convert into 16-bit bitmap backgrounds all the + png and jpg files in the specified list of directories. Color 0xFF00FF + (magenta) will be used as transparent color. + ''' + self._add_nflib_gfx(in_dirs, out_dir, False, True, False, '-gTFF00FF -gb -gB16') + + def add_nflib_bg_tiled(self, in_dirs, out_dir='bg'): + ''' + NFLib: Create rules to convert into 8-bit tiled backgrounds all the png + and jpg files in the specified list of directories. Color 0xFF00FF + (magenta) will be used as transparent color. + ''' + self._add_nflib_gfx(in_dirs, out_dir, True, True, True, '-gTFF00FF -gt -gB8 -mR8 -mLs') + + def add_nflib_bg_tiled_tileset(self, in_dirs, out_dir='bg'): + ''' + NFLib: Create rules to convert into 8-bit tiledsets all the png and jpg + files in the specified list of directories. Color 0xFF00FF (magenta) + will be used as transparent color. + ''' + self._add_nflib_gfx(in_dirs, out_dir, False, True, True, '-gTFF00FF -gt -gB8 -mR8 -mLs') + + def add_nflib_bg_affine(self, in_dirs, out_dir='bg'): + ''' + NFLib: Create rules to convert into 8-bit affine backgrounds all the png + and jpg files in the specified list of directories. Color 0xFF00FF + (magenta) will be used as transparent color. + ''' + self._add_nflib_gfx(in_dirs, out_dir, True, True, True, '-gTFF00FF -gt -gB8 -mR8 -mLa') + + def add_nflib_sprite_256(self, in_dirs, out_dir='spr'): + ''' + NFLib: Create rules to convert into 8-bit sprites all the png and jpg + files in the specified list of directories. Color 0xFF00FF (magenta) + will be used as transparent color. + ''' + self._add_nflib_gfx(in_dirs, out_dir, False, True, True, '-gTFF00FF -gt -gB8') + + def add_nflib_sprite_3d(self, in_dirs, out_dir='spr'): + ''' + NFLib: Create rules to convert into 3D sprites all the png and jpg files + in the specified list of directories. Color 0xFF00FF (magenta) will be + used as transparent color. + ''' + self._add_nflib_gfx(in_dirs, out_dir, False, True, True, '-gTFF00FF -gx -gb -gB8') + + def add_nflib_font(self, in_dirs, out_dir='fnt'): + ''' + NFLib: Create rules to convert into fonts all the png and jpg files in + the specified list of directories. Color 0xFF00FF (magenta) will be used + as transparent color. + ''' + self._add_nflib_gfx(in_dirs, out_dir, False, True, True, '-gTFF00FF -gt -gB8') + + def add_nflib_colmap(self, in_dirs, out_dir='fnt'): + ''' + NFLib: Create rules to convert into collision maps all the png and jpg + files in the specified list of directories. Color 0xFF00FF (magenta) + will be used as transparent color. + ''' + self._add_nflib_gfx(in_dirs, out_dir, True, False, False, '-gB8 -mRt -mLf') + + def add_nflib_colbg(self, in_dirs, out_dir='fnt'): + ''' + NFLib: Create rules to convert into collision backgrounds all the png + and jpg files in the specified list of directories. Color 0xFF00FF + (magenta) will be used as transparent color. + ''' + self._add_nflib_gfx(in_dirs, out_dir, True, True, False, '-gt -gB8 -mRtp -mLf') + + def add_nflib_bg_8bit_shared_pal(self, in_dir, out_dir): + ''' + NFLib: Create rules to convert into 8-bit bitmap backgrounds all the png + and jpg files in the specified directory. They will share the palette, + and one palette file will be created for each image (they will all be + the same). Color 0xFF00FF (magenta) will be used as transparent color. + ''' + self._add_nflib_gfx_shared_pal(in_dir, out_dir, True, True, '-gTFF00FF -gb -gB8') + + def add_nflib_bg_affine_shared_pal(self, in_dir, out_dir): + ''' + NFLib: Create rules to convert into 8-bit affine backgrounds all the png + and jpg files in the specified directory. They will share the palette, + and one palette file will be created for each image (they will all be + the same). Color 0xFF00FF (magenta) will be used as transparent color. + ''' + self._add_nflib_gfx_shared_pal(in_dir, out_dir, True, True, '-gTFF00FF -gt -gB8 -mR8 -mLa') + + def add_nitro_engine_obj(self, in_dirs, out_dir='models'): + ''' + Nitro Engine: This function gets as input a list of directories. It will + look for files with extension '.obj' and look for another '.json' file + with the same base name. Then, it will create rules to convert them and + add them to the filesystem. + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + in_out_files = [] + + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.obj')) + in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.obj', '.dl')) + + for in_out_file in in_out_files: + out_path_dl = in_out_file.out_path + + out_path_dir = get_parent_dir(out_path_dl) + self.add_dir_target(out_path_dir) + + in_path_obj = in_out_file.in_path + in_path_json = replace_ext(in_path_obj, '.obj', '.json') + + json_data = load_json(in_path_json) + assert 'texture' in json_data, 'Texture size must be provided' + + args = ( + '--texture ' + str(json_data['texture'][0]) + ' ' + + str(json_data['texture'][1]) + ) + + if 'scale' in json_data: + args += ' --scale ' + str(json_data['scale']) + + if 'use-vertex-color' in json_data: + if json_data['use-vertex-color']: # Only add this if True + args += ' --use-vertex-color ' + + self.target_files.append(out_path_dl) + + self.print( + f'build {out_path_dl} : obj2dl {in_path_obj} {in_path_json} || {out_path_dir}\n' + f' in_path_obj = {in_path_obj}\n' + f' args = {args}\n' + '\n' + ) + + def add_nitro_engine_md5(self, in_dirs, out_dir='models'): + ''' + Nitro Engine: Looks for md5mesh files in the provided directores. Each + file must be acompanied by a json file with some information. For + example: + + { + "texture": [256, 256], + "blender-fix": true, + "export-base-pose": false, + "animations": [ + { + "file": "wave.md5anim", + "skip-frames": 1 + } + ] + } + ''' + full_out_dir = os.path.join(self.out_assets_path, out_dir) + + md5mesh_in_out_files =[] + + for in_dir in in_dirs: + in_files = gen_input_file_list(in_dir, ('.md5mesh')) + md5mesh_in_out_files.extend(gen_out_file_list(in_files, in_dir, full_out_dir, '.md5mesh', '')) + + for in_out_file in md5mesh_in_out_files: + out_path_dir = get_parent_dir(in_out_file.out_path) + self.add_dir_target(out_path_dir) + + in_path_md5mesh = in_out_file.in_path + in_path_json = replace_ext(in_path_md5mesh, '.md5mesh', '.json') + + json_data = load_json(in_path_json) + assert 'texture' in json_data, 'Texture size must be provided' + + args = ( + '--texture ' + str(json_data['texture'][0]) + ' ' + + str(json_data['texture'][1]) + ) + + if 'blender-fix' in json_data: + if json_data['blender-fix']: + args += ' --blender-fix' + + base_name = remove_ext(get_file_name(in_path_md5mesh)) + + args += f' --name {base_name} --output {out_path_dir} --model {in_path_md5mesh}' + + out_path_dsm = in_out_file.out_path + '.dsm' + self.target_files.append(out_path_dsm) + + args_str = ' '.join(args) + + self.print( + f'build {out_path_dsm} : md5_to_dsma {in_path_md5mesh} {in_path_json} || {out_path_dir}\n' + f' args = {args}\n' + '\n' + ) + + if 'animations' in json_data: + in_path_dir = get_parent_dir(in_out_file.in_path) + + for animation in json_data['animations']: + assert 'file' in animation + in_path_md5anim = os.path.join(in_path_dir, animation['file']) + + args = f' --name {base_name} --output {out_path_dir} --anim {in_path_md5anim}' + + if 'skip-frames' in animation: + args += ' --skip-frames ' + str(animation['skip-frames']) + + if 'blender-fix' in json_data: + if json_data['blender-fix']: + args += ' --blender-fix' + + base_name_anim = remove_ext(get_file_name(in_path_md5anim)) + + out_path_dsa = in_out_file.out_path + '_' + base_name_anim + '.dsa' + self.target_files.append(out_path_dsa) + + args_str = ' '.join(args) + + self.print( + f'build {out_path_dsa} : md5_to_dsma {in_path_md5anim} {in_path_json} || {out_path_dir}\n' + f' args = {args}\n' + '\n' + ) + +class NitroFS(GenericFilesystem): + ''' + Class that defines rules to add files to the NitroFS filesystem with a + previous conversion step. This can be used for graphics, music, etc. This + class isn't required for files that aren't modified. For them, use + 'nitrofsdirs' from the 'NdsRom' class instead. + ''' + + ASSETS_BARRIER_NITROFS = 'assets_nitrofs_flag' + + def __init__(self): + super().__init__(self.ASSETS_BARRIER_NITROFS, 'build/nitrofs') + +class FatFS(GenericFilesystem): + ''' + Class that defines rules to add files to the SD filesystem with a previous + conversion step. This can be used for graphics, music, etc. It can also be + used to add generic files to the tree structure. + ''' + + ASSETS_BARRIER_FATFS = 'assets_fatfs_flag' + + def __init__(self, out_dir='sdroot'): + super().__init__(self.ASSETS_BARRIER_FATFS, out_dir) + +class NdsRom(GenericBinary): + ''' + Class that represents a NDS ROM and may be linked to any number of CPU and + filesystem binaries. + ''' + + def __init__(self, *, nitrofsdirs=[], + nds_path=os.path.basename(os.getcwd()) + '.nds', + binaries=[], + game_title='NDS ROM', + game_subtitle='Built with BlocksDS', + game_author='github.com/blocksds/sdk', + game_icon='${BLOCKSDS}/sys/icon.bmp'): + ''' + Constructor of NDS ROM build rules. + + Mandatory arguments: + + - 'binaries': List of binaries added to this NDS ROM. You must provide a + list of CPU binaries with at least an ARM9 binary. If no ARM7 is + provided, the default BlocksDS binary will be used. Teak binaries and + NitroFS filesystem images are also added to this list. + + Optional arguments: + + - 'nitrofsdirs': List of path to directories that will be added to the + root of the NitroFS filesystem. + - 'game_title': First line of the ROM header text. + - 'game_subtitle': Second line of the ROM header text. + - 'game_author': Third line of the ROM header text. + - 'game_icon': Icon to be used in the ROM header. + - 'nds_path': Output path of the generated NDS file. The default value + is generated from the current directory name. + ''' + + super().__init__(None) + + self.nitrofsdirs = nitrofsdirs + self.nds_path = nds_path + + self.game_title = game_title + self.game_subtitle = game_subtitle + self.game_author = game_author + self.game_icon = game_icon + + self.arm9 = None + self.nitrofs = None + + # If no ARM7 is specified later, use the default one + self.arm7 = Arm7BinaryDefault() + + # After everything is setup, load the provided binaries + self.sub_binaries = [] + self._add_binaries(binaries) + + def _add_binaries(self, binaries): + ''' + This links a list of binaries to this NDS ROM instance. + ''' + self.sub_binaries.extend(binaries) + + for binary in binaries: + type_name = type(binary).__name__ + if type_name == 'NitroFS': + self.nitrofs = binary + elif type_name == 'Arm9Binary': + self.arm9 = binary + elif type_name == 'Arm7Binary': + # This will replace the default ARM7 binary + self.arm7 = binary + else: + # Other binaries don't require special handling + pass + + def _gen_rules_tools(self): + ''' + This generates rules for all possible tools used to generate NDS ROMs. + ''' + + self.print( + '# File generated by architectds\n' + '\n' + f'BLOCKSDS = {BLOCKSDS}\n' + f'BLOCKSDSEXT = {BLOCKSDSEXT}\n' + f'WONDERFUL_TOOLCHAIN = {WONDERFUL_TOOLCHAIN}\n' + '\n' + 'ARM_NONE_EABI_PATH = ${WONDERFUL_TOOLCHAIN}/toolchain/gcc-arm-none-eabi/bin/\n' + 'LLVM_TEAK_PATH = ${WONDERFUL_TOOLCHAIN}/toolchain/llvm-teak/bin/\n' + '\n' + 'PREFIX = ${ARM_NONE_EABI_PATH}arm-none-eabi-\n' + 'CC_ARM = ${PREFIX}gcc\n' + 'CXX_ARM = ${PREFIX}g++\n' + '\n' + 'CC_TEAK = ${LLVM_TEAK_PATH}clang\n' + 'CXX_TEAK = ${LLVM_TEAK_PATH}clang++\n' + 'LD_TEAK = ${LLVM_TEAK_PATH}ld.lld\n' + '\n' + 'BIN2C = ${BLOCKSDS}/tools/bin2c/bin2c\n' + 'GRIT = ${BLOCKSDS}/tools/grit/grit\n' + 'MMUTIL = ${BLOCKSDS}/tools/mmutil/mmutil\n' + 'NDSTOOL = ${BLOCKSDS}/tools/ndstool/ndstool\n' + 'TEAKTOOL = ${BLOCKSDS}/tools/teaktool/teaktool\n' + '\n' + 'OBJ2DL = python3 ${BLOCKSDSEXT}/nitro-engine/tools/obj2dl/obj2dl.py\n' + 'MD5_TO_DSMA = python3 ${BLOCKSDSEXT}/nitro-engine/tools/md5_to_dsma/md5_to_dsma.py\n' + 'PTEXCONV = ${BLOCKSDSEXT}/ptexconv/ptexconv\n' + '\n' + 'rule makedir\n' + ' command = mkdir $out\n' + '\n' + 'rule copy\n' + ' command = cp $in $out\n' + '\n' + 'rule bin2c\n' + ' command = ${BIN2C} $in $outdir\n' + '\n' + # mmutil crashes when there are two processes generating soundbanks + # at the same time. + 'pool mmutil_pool\n' + ' depth = 1\n' + '\n' + 'rule mmutil\n' + ' command = ${MMUTIL} $in -d -o${soundbank_bin} -h${soundbank_info_h}\n' + ' pool = mmutil_pool\n' + '\n' + 'rule as_arm\n' + ' command = ${CC_ARM} ${asflags} -MMD -MP -c -o $out $in\n' + ' deps = gcc\n' + ' depfile = ${dep}\n' + '\n' + 'rule cc_arm\n' + ' command = ${CC_ARM} ${cflags} -MMD -MP -c -o $out $in\n' + ' deps = gcc\n' + ' depfile = ${dep}\n' + '\n' + 'rule cxx_arm\n' + ' command = ${CXX_ARM} ${cxxflags} -MMD -MP -c -o $out $in\n' + ' deps = gcc\n' + ' depfile = ${dep}\n' + '\n' + 'rule ld_cc_arm\n' + ' command = BLOCKSDS=${BLOCKSDS} ${CC_ARM} -o $out $in ${ldflags}\n' + '\n' + 'rule ld_cxx_arm\n' + ' command = BLOCKSDS=${BLOCKSDS} ${CXX_ARM} -o $out $in ${ldflags}\n' + '\n' + 'rule as_teak\n' + ' command = ${CC_TEAK} ${asflags} -MMD -MP -c -o $out $in\n' + ' deps = gcc\n' + ' depfile = ${dep}\n' + '\n' + 'rule cc_teak\n' + ' command = ${CC_TEAK} ${cflags} -MMD -MP -c -o $out $in\n' + ' deps = gcc\n' + ' depfile = ${dep}\n' + '\n' + 'rule cxx_teak\n' + ' command = ${CXX_TEAK} ${cxxflags} -MMD -MP -c -o $out $in\n' + ' deps = gcc\n' + ' depfile = ${dep}\n' + '\n' + 'rule ld_teak\n' + ' command = ${LD_TEAK} -o $out $in ${ldflags}\n' + '\n' + 'rule teaktool\n' + ' command = ${TEAKTOOL} -i $in -o $out\n' + '\n' + 'rule ndstool\n' + ' command = ${NDSTOOL} -c $out -7 ${arm7elf} -9 ${arm9elf} -b ${game_icon} ${game_full_title} ${ndstool_nitrofs_flags}\n' + '\n' + 'rule grit\n' + ' command = ${GRIT} ${in_path_img} ${options} -o ${grit_out_path}\n' + '\n' + 'rule grit_nf_shared\n' + ' command = ${GRIT} ${in_files_png} ${options}\n' + '\n' + 'rule obj2dl\n' + ' command = ${OBJ2DL} --input ${in_path_obj} --output $out ${args}\n' + '\n' + 'rule md5_to_dsma\n' + ' command = ${MD5_TO_DSMA} ${args}\n' + '\n' + 'rule ptexconv\n' + ' command = ${PTEXCONV} ${args}\n' + '\n' + ) + + def _gen_rules_nds(self): + ''' + Internal function that generates a rule to call ndstool and generate a + NDS ROM file. This rule depends directly on NitroFS directories if any + has been provided by the user. + ''' + # Combine the title strings + if self.game_subtitle is None: + game_full_title = '"{self.game_title};{self.game_author}"' + else: + game_full_title = f'"{self.game_title};{self.game_subtitle};{self.game_author}"' + + # If a filesystem has been provided, add it to the build and make the + # final ROM depend on the filesystem contents being ready. Note that + # this dependency is a real dependency, not "order only". It is + # important to regenerate the NDS ROM whenever a file changes. + if self.nitrofs is not None: + self.nitrofsdirs.extend(['build/nitrofs']) + flag_dep = f' {self.nitrofs.flag_assets_name}' + else: + flag_dep = '' + + if self.nitrofsdirs is not None and len(self.nitrofsdirs) > 0: + ndstool_nitrofs_flags = '-d ' + ' '.join(self.nitrofsdirs) + else: + ndstool_nitrofs_flags = '' + + nitrodir_paths = ' '.join(self.nitrofsdirs) + + self.print( + f'build {self.nds_path}: ndstool {self.arm7.elf_path} {self.arm9.elf_path} {nitrodir_paths} {flag_dep}\n' + f' arm7elf = {self.arm7.elf_path}\n' + f' arm9elf = {self.arm9.elf_path}\n' + f' game_icon = {self.game_icon}\n' + f' game_full_title = {game_full_title}\n' + f' ndstool_nitrofs_flags = {ndstool_nitrofs_flags}\n' + '\n' + ) + + def generate_nds(self): + ''' + This function generates rules to use build tools, combines the rules to + build all sub binaries, and it generates rules to build the final NDS + file. + + An ARM9 binary must have been provided. If no ARM7 is provided it will + use the default ARM7 provided by BlocksDS. Other binaries, like Teak + binaries or NitroFS, are optional. + ''' + # General rules for all used tools + self._gen_rules_tools() + + # Rules to build each sub-binary + for binary in self.sub_binaries: + self.contents += binary.contents + + # Rules to build NDS ROM + self._gen_rules_nds() + + # Get directories from all internal binaries + for binary in self.sub_binaries: + for dir_target in binary.dir_targets: + self.dir_targets.add(dir_target) + + # Rules to generate all directories + self._gen_rules_build_directories() diff --git a/examples/libnds/all/.gitignore b/examples/libnds/all/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/libnds/all/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/libnds/all/architectds b/examples/libnds/all/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/libnds/all/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/libnds/all/arm7/data/data_string.bin b/examples/libnds/all/arm7/data/data_string.bin new file mode 100644 index 0000000..532df08 --- /dev/null +++ b/examples/libnds/all/arm7/data/data_string.bin @@ -0,0 +1 @@ +Hello from a bin file! diff --git a/examples/libnds/all/arm7/source/main.c b/examples/libnds/all/arm7/source/main.c new file mode 100644 index 0000000..42daaef --- /dev/null +++ b/examples/libnds/all/arm7/source/main.c @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: Zlib +// +// Copyright (C) 2005 Michael Noland (joat) +// Copyright (C) 2005 Jason Rogers (Dovoto) +// Copyright (C) 2005-2015 Dave Murphy (WinterMute) +// Copyright (C) 2023 Antonio Niño Díaz + +// Default ARM7 core + +#include +#include +#include + +volatile bool exit_loop = false; + +void power_button_callback(void) +{ + exit_loop = true; +} + +void vblank_handler(void) +{ + inputGetAndSend(); + Wifi_Update(); +} + +int main(int argc, char *argv[]) +{ + // Initialize sound hardware + enableSound(); + + // Read user information from the firmware (name, birthday, etc) + readUserSettings(); + + // Stop LED blinking + ledBlink(0); + + // Using the calibration values read from the firmware with + // readUserSettings(), calculate some internal values to convert raw + // coordinates into screen coordinates. + touchInit(); + + irqInit(); + irqSet(IRQ_VBLANK, vblank_handler); + + fifoInit(); + + installWifiFIFO(); + installSoundFIFO(); + installSystemFIFO(); // Sleep mode, storage, firmware... + + // Initialize Maxmod. It uses timer 0 internally. + mmInstall(FIFO_MAXMOD); + + // This sets a callback that is called when the power button in a DSi + // console is pressed. It has no effect in a DS. + setPowerButtonCB(power_button_callback); + + // Read current date from the RTC and setup an interrupt to update the time + // regularly. The interrupt simply adds one second every time, it doesn't + // read the date. Reading the RTC is very slow, so it's a bad idea to do it + // frequently. + initClockIRQTimer(3); + + irqEnable(IRQ_VBLANK); + + while (!exit_loop) + { + const uint16_t key_mask = KEY_SELECT | KEY_START | KEY_L | KEY_R; + uint16_t keys_pressed = ~REG_KEYINPUT; + + if ((keys_pressed & key_mask) == key_mask) + exit_loop = true; + + swiWaitForVBlank(); + } + + return 0; +} diff --git a/examples/libnds/all/arm9/audio/music/joint_people.mod b/examples/libnds/all/arm9/audio/music/joint_people.mod new file mode 100644 index 0000000..b585b8f Binary files /dev/null and b/examples/libnds/all/arm9/audio/music/joint_people.mod differ diff --git a/examples/libnds/all/arm9/audio/sfx/fire_explosion.wav b/examples/libnds/all/arm9/audio/sfx/fire_explosion.wav new file mode 100644 index 0000000..75b9ace Binary files /dev/null and b/examples/libnds/all/arm9/audio/sfx/fire_explosion.wav differ diff --git a/examples/libnds/all/arm9/data/data_string.bin b/examples/libnds/all/arm9/data/data_string.bin new file mode 100644 index 0000000..532df08 --- /dev/null +++ b/examples/libnds/all/arm9/data/data_string.bin @@ -0,0 +1 @@ +Hello from a bin file! diff --git a/examples/libnds/all/arm9/graphics/neon.grit b/examples/libnds/all/arm9/graphics/neon.grit new file mode 100644 index 0000000..4a6a869 --- /dev/null +++ b/examples/libnds/all/arm9/graphics/neon.grit @@ -0,0 +1,2 @@ +# bitmap, 16 bit +-gb -gB16 diff --git a/examples/libnds/all/arm9/graphics/neon.png b/examples/libnds/all/arm9/graphics/neon.png new file mode 100644 index 0000000..d60aecb Binary files /dev/null and b/examples/libnds/all/arm9/graphics/neon.png differ diff --git a/examples/libnds/all/arm9/source/main.c b/examples/libnds/all/arm9/source/main.c new file mode 100644 index 0000000..4775246 --- /dev/null +++ b/examples/libnds/all/arm9/source/main.c @@ -0,0 +1,245 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 + +#include +#include + +#include +#include + +#include "common.h" + +// Headers autogenerated when files are find inside AUDIODIRS in the Makefile +#include "maxmod/soundbank_info.h" +#include "maxmod/soundbank_bin.h" + +// Header autogenerated for each PNG file inside GFXDIRS in the Makefile +#include "grit/neon_png.h" + +// Header autogenerated for each BIN file inside BINDIRS in the Makefile +#include "data/data_string_bin.h" + +#include "teak/teak1_tlf.h" + +// Callback called whenver the keyboard is pressed so that a character is +// printed on the screen. +void on_key_pressed(int key) +{ + if (key > 0) + printf("%c", key); +} + +int main(int argc, char **argv) +{ + int textureID; + + videoSetMode(MODE_0_3D); + + glInit(); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_ANTIALIAS); + + // The background must be fully opaque and have a unique polygon ID + // (different from the polygons that are going to be drawn) so that + // antialias works. + glClearColor(0, 0, 0, 31); + glClearPolyID(63); + + glClearDepth(0x7FFF); + + glViewport(0, 0, 255, 191); + + // Setup some VRAM as memory for textures + vramSetBankA(VRAM_A_TEXTURE); + + // Load texture + glGenTextures(1, &textureID); + glBindTexture(0, textureID); + glTexImage2D(0, 0, GL_RGB, TEXTURE_SIZE_128 , TEXTURE_SIZE_128, 0, + TEXGEN_TEXCOORD, (u8*)neon_pngBitmap); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(70, 256.0 / 192.0, 0.1, 40); + + gluLookAt(0.0, 0.0, 2.0, // Position + 0.0, 0.0, 0.0, // Look at + 0.0, 1.0, 0.0); // Up + + // Setup sub screen for the text console + consoleDemoInit(); + + if (isDSiMode()) + { + if (dspExecuteDefaultTLF(teak1_tlf) != DSP_EXEC_OK) + { + printf("Failed to execute TLF"); + while (1) + swiWaitForVBlank(); + } + } + + // Load demo keyboard + Keyboard *kbd = keyboardDemoInit(); + kbd->OnKeyPressed = on_key_pressed; + + // Setup sound bank + mmInitDefaultMem((mm_addr)soundbank_bin); + + // load the module + mmLoad(MOD_JOINT_PEOPLE); + + // load sound effects + mmLoadEffect(SFX_FIRE_EXPLOSION); + + // Start playing module + mmStart(MOD_JOINT_PEOPLE, MM_PLAY_LOOP); + + int angle_x = 0; + int angle_z = 0; + char name[256] = { 0 }; + + uint16_t cmd0 = 0; + int16_t cmd1 = 0; + int16_t cmd2 = 0; + + uint16_t rep0 = 0; + int16_t rep1 = 0; + int16_t rep2 = 0; + + while (1) + { + // Synchronize game loop to the screen refresh + swiWaitForVBlank(); + + // Print some text in the demo console + // ----------------------------------- + + // Clear console + printf("\x1b[2J"); + + // Print current time + char str[100]; + time_t t = time(NULL); + struct tm *tmp = localtime(&t); + if (strftime(str, sizeof(str), "%Y-%m-%dT%H:%M:%S%z", tmp) == 0) + snprintf(str, sizeof(str), "Failed to get time"); + printf("%s\n\n", str); + + // Print contents of the BIN file + for (int i = 0; i < data_string_bin_size; i++) + printf("%c", data_string_bin[i]); + printf("\n"); + + // Print some controls + printf("PAD: Rotate triangle\n"); + printf("SELECT: Keyboard input test\n"); + printf("START: Exit to loader\n"); + printf("A: Play SFX\n"); + printf("\n"); + + // Test code from a different folder + printf("Name: [%s]\n", name); + printf("Name length: %d\n", my_strlen(name)); + + // Handle user input + // ----------------- + + scanKeys(); + + uint16_t keys = keysHeld(); + uint16_t keys_down = keysDown(); + + if (keys & KEY_LEFT) + angle_z += 3; + if (keys & KEY_RIGHT) + angle_z -= 3; + + if (keys & KEY_UP) + angle_x += 3; + if (keys & KEY_DOWN) + angle_x -= 3; + + if (keys_down & KEY_A) + mmEffect(SFX_FIRE_EXPLOSION); + + if (keys & KEY_SELECT) + { + printf("\x1b[12;1HType your name: "); + scanf("%255s", name); + } + + if (keys & KEY_START) + break; + + // DSP communications + + printf("\n"); + + if (isDSiMode()) + { + printf("CMD: %u %d %d\n", cmd0, cmd1, cmd2); + + cmd0++; // Heartbeat + cmd1 = angle_x; + cmd2 = angle_z; + + if (dspSendDataReady(0)) + dspSendData(0, cmd0); + if (dspSendDataReady(1)) + dspSendData(1, cmd1); + if (dspSendDataReady(2)) + dspSendData(2, cmd2); + + if (dspReceiveDataReady(0)) + rep0 = dspReceiveData(0); + if (dspReceiveDataReady(1)) + rep1 = dspReceiveData(1); + if (dspReceiveDataReady(2)) + rep2 = dspReceiveData(2); + + printf("REP: %u %d %d\n", rep0, rep1, rep2); + } + + // Render 3D scene + // --------------- + + glPushMatrix(); + + glRotateZ(angle_z); + glRotateX(angle_x); + + glMatrixMode(GL_MODELVIEW); + + glPolyFmt(POLY_ALPHA(31) | POLY_CULL_NONE); + + glBindTexture(0, textureID); + + glColor3f(1, 1, 1); + + glBegin(GL_QUADS); + + GFX_TEX_COORD = (TEXTURE_PACK(0, inttot16(128))); + glVertex3v16(floattov16(-1), floattov16(-1), 0); + + GFX_TEX_COORD = (TEXTURE_PACK(inttot16(128),inttot16(128))); + glVertex3v16(floattov16(1), floattov16(-1), 0); + + GFX_TEX_COORD = (TEXTURE_PACK(inttot16(128), 0)); + glVertex3v16(floattov16(1), floattov16(1), 0); + + GFX_TEX_COORD = (TEXTURE_PACK(0,0)); + glVertex3v16(floattov16(-1), floattov16(1), 0); + + glEnd(); + + + glPopMatrix(1); + + glFlush(0); + } + + return 0; +} diff --git a/examples/libnds/all/build.py b/examples/libnds/all/build.py new file mode 100644 index 0000000..b81ba92 --- /dev/null +++ b/examples/libnds/all/build.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +teak1 = TeakBinary( + name='teak1', + sourcedirs=['teak/source1'], +) +teak1.generate_tlf() + +teak2 = TeakBinary( + name='teak2', + sourcedirs=['teak/source2'], +) +teak2.generate_tlf() + +nitrofs = NitroFS() +nitrofs.add_tlf(teak2) +nitrofs.add_grit(['nitrofs/graphics']) +# The header of the soundbank in NitroFS must be added as a dependency of the ARM9 +nitrofs_soundbank_header = nitrofs.add_mmutil(['nitrofs/audio']) +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['arm9/source', 'common/source'], + defines=[], + includedirs=['common/include'], + libs=['nds9', 'mm9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDS}/libs/maxmod'] +) +arm9.add_header_dependencies([nitrofs_soundbank_header]) +arm9.add_data(['arm9/data']) +arm9.add_grit(['arm9/graphics']) +arm9.add_mmutil(['arm9/audio']) +arm9.add_tlf(teak1) +arm9.generate_elf() + +arm7 = Arm7Binary( + sourcedirs=['arm7/source', 'common/source'], + defines=[], + includedirs=['common/include'], + libs=['nds7', 'mm7', 'dswifi7'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDS}/libs/maxmod', + '${BLOCKSDS}/libs/dswifi'] +) +arm7.add_data(['arm7/data']) +arm7.generate_elf() + +nds = NdsRom( + nitrofsdirs=['nitrofs/root'], + # Note: If no ARM7 is specified, it uses the default one + binaries=[teak1, teak2, arm9, arm7, nitrofs], + nds_path='rom.nds', + game_title='Python build system', + game_subtitle='Built with BlocksDS', + game_author='github.com/blocksds/sdk', + game_icon='icon.bmp' +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/libnds/all/common/include/common.h b/examples/libnds/all/common/include/common.h new file mode 100644 index 0000000..020fa08 --- /dev/null +++ b/examples/libnds/all/common/include/common.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2023 + +#ifndef COMMON_H__ +#define COMMON_H__ + +int my_strlen(const char *s); + +#endif // COMMON_H__ diff --git a/examples/libnds/all/common/source/common.c b/examples/libnds/all/common/source/common.c new file mode 100644 index 0000000..421f7ec --- /dev/null +++ b/examples/libnds/all/common/source/common.c @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2023 + +#include + +int my_strlen(const char *s) +{ + return strlen(s); +} diff --git a/examples/libnds/all/icon.bmp b/examples/libnds/all/icon.bmp new file mode 100644 index 0000000..c5a571c Binary files /dev/null and b/examples/libnds/all/icon.bmp differ diff --git a/examples/libnds/all/nitrofs/audio/music/joint_people.mod b/examples/libnds/all/nitrofs/audio/music/joint_people.mod new file mode 100644 index 0000000..b585b8f Binary files /dev/null and b/examples/libnds/all/nitrofs/audio/music/joint_people.mod differ diff --git a/examples/libnds/all/nitrofs/audio/music/joint_people.txt b/examples/libnds/all/nitrofs/audio/music/joint_people.txt new file mode 100644 index 0000000..73f5360 --- /dev/null +++ b/examples/libnds/all/nitrofs/audio/music/joint_people.txt @@ -0,0 +1,5 @@ +Name: jointpeople +Author: Anadune & Floppy +License: Mod Archive Distribution license + +https://modarchive.org/index.php?request=view_by_moduleid&query=115447 diff --git a/examples/libnds/all/nitrofs/audio/music/mod-archive-faq.txt b/examples/libnds/all/nitrofs/audio/music/mod-archive-faq.txt new file mode 100644 index 0000000..a8a7197 --- /dev/null +++ b/examples/libnds/all/nitrofs/audio/music/mod-archive-faq.txt @@ -0,0 +1,52 @@ +Original site: https://modarchive.org/index.php?faq-licensing + +=============================================================================== + +Licensing Modules and Copyright + +- Who owns the copyrights to the modules? + +The composers do - unless the Public Domain license attribution has been +specifically attributed in which case you are free to do with the module +whatever you like. + +- Can I use a module of modarchive.org in my game/application/etc...? + +If the module in question has license deeds attributed to it, please refer to +those. + +Otherwise, the only way to be genuinely fair to the artist who's music you want +to use is to contact them and get their permission. We can't grant permissions +on their behalf. Period. + +- Can I redistribute the module in its original unmodified form? + +Yes. All uploads to the site are governed by an upload agreement of which one of +the terms is the right to redistribute the original unmodified module file. This +does not cover inclusion in a packed/bundled application or game. See previous +item. + +- The contact information isn't in the module, what can I do to contact the +artist? + +You can try using the modarchive.org forums, specifically the Wanted: forum. +Search the Internet, do some homework. If you fail to find the necessary +information then you are pretty much out of luck. + +- I can't get in contact with an artist who's music I want to use, what now? + +It's up to you how you proceed. We will not condone illegal use of someone's +works, but if you still wish to continue to use that particular piece of music +in your project, then you take on those risks yourself. + +If your project is small and free (non commercial) then it's wise to give clear +and concise due credit to the artist in your production. If your production is +for commercial purposes then you are technically left with no other choice than +to find a different module where the artist has attributed a compatible license, +or is contactable - or go out on a limb and ask to have someone compose a custom +module for your project. + +- Where can I find the license attribution information on a module? + +Look on a module's information page, there is a section dedicated to the License +Attribution information. diff --git a/examples/libnds/all/nitrofs/audio/music/mod-archive-terms.txt b/examples/libnds/all/nitrofs/audio/music/mod-archive-terms.txt new file mode 100644 index 0000000..5bc140f --- /dev/null +++ b/examples/libnds/all/nitrofs/audio/music/mod-archive-terms.txt @@ -0,0 +1,287 @@ +Original site: https://modarchive.org/index.php?terms + +=============================================================================== + +Terms & Disclaimer + +Revised 2014-04-30 + +Cookies + +By using our website, you agree to the use of cookies and other technologies as +set out in this policy. If you do not agree to such use, please refrain from +using the website. We use cookies to manage your experience on the site, without +these you may suffer from lack of functionality, these are not used to track +you. + +Legalese. + +1.1 LEGAL LIABILITY. By providing a song/file to our server you acknowledge that +you may be held liable if the uploaded material is in any way illegal. You agree +that you will notify The Mod Archive with no unnecessary delays should it at a +later point be revealed that a song/file previously uploaded was illegally +distributed, has illegal contents or is in some other way illegal to distribute. + +1.3 AGREEMENT TERM AND TERMINATION. This Agreement is non-terminable and may not +be cancelled by any party. Modified versions of this document may follow, but +this Agreement shall remain in effect for any songs/files uploaded under this +Agreement. + +1.4 AGREEMENT SCOPE. This Agreement sets forth the entire understanding and +agreement of the parties as to this Agreement's subject matter and supersedes +all prior proposals, discussions or agreements with respect to such subject +matter. All headings in the Agreement are for convenience only and shall have no +legal or contractual effect. Should we choose not to exercise or enforce any +right or provision of this Agreement, this shall not constitute a waiver of such +right or provisions. You agree that you and we are independent contractors under +this Agreement, and nothing in this Agreement shall be used to create a +partnership, or joint venture. + +1.5 LINK TO THIRD PARTIES: The Website may contain links to websites operated by +third parties ("Third Party Websites"). The Mod Archive does not have any +influence or control over any such Third Party Websites and, unless otherwise +stated, is not responsible for and does not endorse any Third Party Websites or +their availability or contents. + +1.6 CONTENT: The Mod Archive does not in any way guarantee the accuracy of the +information contained on the website nor does it guarantee that such information +will be free of objectionable content or free of content which is unsuitable for +minors. + +2.1 We reserve the right to change these Terms of Service without notice. You +are responsible for regularly reviewing these Terms of Service. Continued use of +The Mod Archive after any such changes shall constitute your consent to such +changes. The Mod Archive does not and will not assume any obligation to notify +you of any changes to the Terms of Service. + +3. GENERAL RULES RELATING TO CONDUCT: The Website Service is made available for +your own, personal use. The Website Service must not be used for any commercial +purpose whatsoever or for any illegal or unauthorised purpose. When you use the +Website Service you must comply with all applicable Dutch laws relating to +online conduct (including, without limitation, content which can be posted +online) and with any applicable international laws, including the local laws in +your country of residence (together referred to as "Applicable Laws"). + +4. CONTENT SUBMITTED TO THE WEBSITE: You are responsible for any information, +data, text, music, software, sound, photographs, graphics, video, messages or +other content ("Content") which you post or upload and/or display (in public or +privately) to the Website. The Mod Archive may (but shall not be obliged to) +delete, edit, lock, move or remove any Content without notice and for any reason +and/or to record the IP address from which any Content is posted, uploaded +and/or displayed without notice and for any reason, including, without +limitation, Content which, in our sole discretion, violates these Terms or is or +may be irrelevant, out of date, inappropriate or objectionable in any way +whatsoever, or in respect of which The Mod Archive receives any complaint +(whether justified or not). By posting, uploading and/or displaying any Content +to the Website you warrant that: (a) you own all intellectual property and +proprietary rights in such Content or that you have a licence from the owner of +such rights to post, upload and/or display such Content on the Website; and (b) +the posting, uploading and/or displaying of such Content on the Website and the +grant of the licence to The Mod Archive (on the terms set out below) will not +infringe the intellectual property or proprietary rights of any third party. + +If you upload, post or otherwise transmit any Content to the Website, you +automatically: (a) grant other users of the Website and the Website Service the +right to access the same and use it in accordance with these Terms, and (b) +grant The Mod Archive a non-exclusive, royalty free, sub-licensable, perpetual, +world-wide licence to use, modify, publish, publicly perform, publicly display +and distribute such Content on and through the Website and the Website Service +and in any other form or medium. You continue to own the Content after it is +posted to the Website. + +You acknowledge that The Mod Archive will not screen or otherwise check any +Content (with the exception of module uploads) which is submitted by you or any +other user of the Website Service before it is posted, not monitor yours or any +person’s use of the Website Service. As such, you as the user of the Website +Service are responsible for any Content you submit to the Website and the manner +in which the Website Service is used under your username. If you become aware of +any misuse of the Website Service by any person including (without limitation) +any posting of Content which violates these Terms, please contact us by +following the instructions set out in paragraph 11 of these Terms. + +5. SPECIFIC RULES RELATING TO CONDUCT: You agree that when using the Website +Service you will comply with all Applicable Laws (as defined in paragraph 3), +these Terms and you acknowledge that you are responsible for all acts and +omissions which occur under your user-name. In particular, but without +limitation, you agree not to: + + a. Upload, post or otherwise display Content which is or promotes behaviour + which violates the rights (including, without limitation, the intellectual + property rights) of a third party or which is unlawful, harmful, + threatening, abusive, flaming, hateful, offensive (whether in relation to + sex, race, religion or otherwise) harassing, hateful, defamatory, vulgar, + obscene, invasive of another's privacy, solicits personal information from + anyone under the age of 18 years, or contains any illegal content; or + + b. Upload, post or otherwise display any Content which contains software + viruses or any other files or programs that may interrupt, destroy or limit + the functionality of the Website or the Website Service or any server or + networks connected to the Website or another's computer, or that contains + any chain letters, pyramid-selling schemes, bulk mail, junk mail or similar; + or + + c. Upload, post or otherwise display any Content containing a photograph of + another person unless you have obtained that person’s consent; + + d. Harvest or collect any IP addresses or email addresses or other contact + information of any members of the Website, by electronic means or otherwise; + or + + e. Upload, post or otherwise display any Content for any commercial or + business purpose including (without limitation) any Content which contains + any advertising or promotional materials; or + + f. Restrict or in any way inhibit any other person’s use of the Website or + the Website Service; or + + g. Upload, post or otherwise display any Content which is false, misleading, + un-necessary and/or repetitive including any Content which is inaccurate, + out of date or repeats that previously uploaded, posted or displayed by you + or another visitor, unless absolutely necessary; or + + h. Upload, post or otherwise transmit any Content to a part of the Website + which is irrelevant to the subject matter of the Content; or + + i. Register an account with us under more than one user name and/or user + account number; or + + j. Use the Website or the Website Service in a manner that is inconsistent + with these Terms and/or any Applicable Laws in force from time to time or in + a manner which promotes or encourages illegal activity; or + + k. Breach the terms of any suspension or ban or seek alternative access; or + + l. In the interests of free speech, bring any action for defamation against + The Mod Archive, or any of the companies in the same group; or + + m. Use or solicit any other account holder’s personal data for any purpose + other than establishing non-commercial, lawful contact that such account + holder would reasonably expect to welcome; or + + n. Submit Content owned by a third party without consent from that third + party or submit Content in a manner which expressly or impliedly infers that + such Content is sponsored or endorsed by the Website; or + + o. Use the Website in any unlawful manner or in a manner which promotes or + encourages illegal activity or in a manner which could damage, disable, + overburden or impair the Website or the Website Service; or + + p. Attempt to gain unauthorised access to the Website or any networks, + servers or computer systems connected to the Website; or + + q. Modify, adapt, translate or reverse engineer any part of the Website or + use any robot, spider, site search/retrieval application or other device to + retrieve or index any part of the Website or re-format or frame any portion + of the web pages comprising the Website, unless permitted by law; or + + r. Remove or obstruct from view any advertisements and/or any copyright, + trademark or other proprietary notices contained on or in the Website; or + + s. Contact any other user of the Website if they have expressly asked you + not to; or + + t. Attempt to impersonate any other user or account holder of the Website or + the Website Service; or + + u. Use the username and/or password of any other account holder of the + Website or disclose your password to any other person; or + + v. Upload, post or otherwise display any Content comprising an advertisement + or accept payment or anything of value from any person in exchange for you + uploading, posting or displaying any Content or otherwise performing any + commercial activity on or through the Website or the Website Service on + behalf of such person (including, without limitation, posting + blogs/comments/profiles or bulletins for a commercial purpose and/or sending + messages to other users of the Website with a commercial purpose). + + +You agree to indemnify The Mod Archive in full and on demand from and against +any loss, damage, costs or expenses which they suffer or incur directly or +indirectly as a result of your use of the Website and/or the Website Service, +and any use of the same under your username other than in accordance with these +Terms or Applicable Law. + +6. DISCLAIMER / LIABILITY: USE OF THE WEBSITE AND/OR THE WEBSITE SERVICE IS AT +YOUR OWN RISK. THE WEBSITE AND THE WEBSITE SERVICE IS PROVIDED ON AN “AS IS” +BASIS. TO THE MAXIMUM EXTENT PERMITTED BY LAW: (A) THE MOD ARCHIVE DISCLAIMS ALL +LIABILITY WHATSOEVER, WHETHER ARISING IN CONTRACT, TORT (INCLUDING NEGLIGENCE) +OR OTHERWISE IN RELATION TO THE WEBSITE AND/OR THE WEBSITE SERVICE; AND (B) ALL +IMPLIED WARRANTIES, TERMS AND CONDITIONS RELATING TO THE WEBSITE AND/OR THE +WEBSITE SERVICE (WHETHER IMPLIED BY STATUE, COMMON LAW OR OTHERWISE), INCLUDING +(WITHOUT LIMITATION) ANY WARRANTY, TERM OR CONDITION AS TO ACCURACY, +COMPLETENESS, SATISFACTORY QUALITY, PERFORMANCE, FITNESS FOR PURPOSE OR ANY +SPECIAL PURPOSE, AVAILABILITY, NON INFRINGEMENT, INFORMATION ACCURACY, +INTEROPERABILITY, QUIET ENJOYMENT AND TITLE ARE, AS BETWEEN THE MOD ARCHIVE AND +YOU, HEREBY EXCLUDED. IN PARTICULAR, BUT WITHOUT PREJUDICE TO THE FOREGOING, WE +ACCEPT NO RESPONSIBILITY FOR THE CONDUCT OF ANY USER AND/OR ACCOUNT HOLDER OF +THE WEBSITE AND/OR WEBSITE SERVICE; ANY ERROR, DELAY OR FAILURE IN THE +TRANSMISSION OF ANY COMMUNICATION BETWEEN USERS AND/OR ACCOUNT HOLDERS; ANY +TECHNICAL FAILURE OF THE INTERNET, THE WEBSITE AND/OR THE WEBSITE SERVICE; OR +ANY DAMAGE OR INJURY TO USERS OR THEIR EQUIPMENT AS A RESULT OF OR RELATING TO +THEIR USE OF THE WEBSITE OR THE WEBSITE SERVICE. YOUR STATUTORY RIGHTS ARE NOT +AFFECTED. + +The Mod Archive will not be liable, in contract, tort (including, without +limitation, negligence), under statute or otherwise, as a result of or in +connection with the Website and/or the Website Service, for any: (i) economic +loss (including, without limitation, loss of revenues, profits, contracts, +business or anticipated savings); or (ii) loss of goodwill or reputation; or +(iii) special or indirect or consequential loss. + +Nothing in these Terms shall be construed as excluding or limiting the liability +of The Mod Archive for death or personal injury caused by its negligence or for +any other liability which cannot be excluded by Dutch law. + +7. ACCESS RESTRICTION AND SERVICE SUSPENSION OR TERMINATION: The Mod Archive +reserves the right in its sole discretion to deny you access to the Website +and/or the Website Service, or any part thereof, with or without notice and for +any reason including, without limitation, if you fail to comply with any clause +5 (Member Conduct) or any other provision of these Terms. In particular, The Mod +Archive may deny you access to the Website and/or the Website Services if The +Mod Archive exercises its right to delete, edit, lock or remove any Content +posted, uploaded or displayed by you. The Mod Archive reserves the right to +suspend or cease providing all or any of the Website Service, without notice, +and shall have no liability or responsibility to you in any manner whatsoever if +it chooses to do so. + +8. ADVERTISERS ON THE WEBSITE: We accept no responsibility for adverts posted on +the Website. If you agree to purchase goods and/or services from any third party +who advertises on the Website, you do so at your own risk. The advertiser, not +The Mod Archive, is responsible for such goods and/or services and if you have +any queries or complaints in relation to them, your only recourse is against the +advertiser. + +9. ACCOUNT HOLDER INTERACTION You are responsible for how you interact with +other account holders and users of the Website and the Website Service. We +reserve the right, but have no obligation, to monitor how you interact with +those persons. + +10 GENERAL: These Terms (as amended from time to time) constitute the entire +agreement between you and The Mod Archive concerning your use of the Website and +the Website Service and supersede any previous arrangement, agreement, +undertaking or proposal, written or oral between you and The Mod Archive in +relation to such matters. The Mod Archive reserves the right to update these +Terms from time to time. If it does so, the updated version will be effective as +soon as it is uploaded on to this the Website and your continued use of the +Website Service following any changes constitutes your acceptance of the new +Terms. You are responsible for regularly reviewing these Terms so that you are +aware of any changes to them. No other variation to these Terms shall be +effective unless in writing and signed by an authorised representative on behalf +of The Mod Archive. These Terms shall be governed by and construed in +accordance with Dutch law and you agree to submit to the exclusive jurisdiction +of the Dutch Courts in relation to any dispute arising out of or relating to +these Terms and/or your use of the Website and/or the Website Service. If any +provision(s) of these Terms is held by a court of competent jurisdiction to be +invalid or unenforceable, then such provision(s) shall be construed, as nearly +as possible, to reflect the intentions of the parties (as reflected in the +provision(s)) and all other provisions shall remain in full force and effect. +The Mod Archive's failure to exercise or enforce any right or provision of these +Terms shall not constitute a waiver of such right or provision unless +acknowledged and agreed to by The Mod Archive in writing. Unless otherwise +expressly stated, nothing in the Terms shall create any rights or any other +benefits whether pursuant to the Contracts (Rights of Third Parties) Act 1999 or +otherwise in favour of any person other than you and The Mod Archive. + +11. CONTACT: For support and help, use the appropriate forum within the site +forums. + diff --git a/examples/libnds/all/nitrofs/audio/music/mod-archive.txt b/examples/libnds/all/nitrofs/audio/music/mod-archive.txt new file mode 100644 index 0000000..dfed88e --- /dev/null +++ b/examples/libnds/all/nitrofs/audio/music/mod-archive.txt @@ -0,0 +1,79 @@ +Original site: https://modarchive.org/index.php?terms-upload + +=============================================================================== + +Mod Archive Upload Terms, Conditions and License Agreement + +Version 2.2 as of April 29th, 2009 + +This Agreement describes the legal relationship between you (an individual +providing material by uploading songs or other files to the modarchive.org/com +server) and the modarchive.org/com server operators ("us", "we" in the following +text). Please read this document carefully. As this document is modified, the +new version will apply to any files uploaded later than that date, but will not +be applicable to previously uploaded files (see section 3.3). + +Section 1: Copyright holders + + 1.1, General license. By providing a song/file to us, if you are the + copyright holder of the song/file in question, you agree to grant us a + non-exclusive, royalty-free, non-retractable non-terminable, worldwide + license to: a) Distribute your song/file on the modarchive.org/com web site + or in any other form of distribution that we deem appropriate. b) Publicly + display, publicly perform, broadcast, encode, transmit, reproduce, + manufacture and distribute your song/file in whole or in part, alone or in + compilation with content provided by third parties, through any medium now + known or hereafter devised. c) Apply non-destructive and non-changing + compression systems to decrease the file sizes of the files uploaded to us. + + 1.2, License to redistribute. By providing a song/file to modarchive.org/com + you furthermore agree to give anyone who wishes to redistribute your + song/file a license to download the song/file from modarchive.org/com and do + so, provided it has stayed in its original, unmodified, unbundled form. + + Note: If you are visitor looking for information about using modules in your + productions i.e games/applications, please see the Licensing FAQ in file + mod-archive-faq.txt. + + 1.3, Ownership of Copyrights. You retain ownership of the copyrights and all + other rights in the song/file provided to us, subject only to the + non-exclusive rights granted to us under this Agreement. You are free to + grant similar rights to others. + + +Section 2: Non-copyright holders + + 2.1 License. By providing a song/file to us if you are not the copyright + holder of said song/file, you agree that you have previously secured a + license to redistribute the song, according to the terms of Section 1. + + 2.2 Copyright infringement. Furthermore you agree that you are fully + responsible for your action of providing the song to modarchive.org/com, and + that modarchive.org/com may hold you liable for any copyright infringement + caused by your uploading of the song/file to the modarchive.org/com server, + and thus that modarchive.org/com should not be held liable for any + consequences of your actions. + + +Section 3: General terms and conditions + + See file mod-archive-terms.txt. + +Section 4: Footnotes + + 4.1 Works in the public domain. Materials that have previously been + distributed under public domain license (for example, PD Disk Distributors) + are quite legal to upload to our servers as long as the material has not + been modified from its original state since release. Any works submitted to + The Mod Archive that are not uploaded by their creators or copyright holders + are assumed to be released into the public domain prior to upload and + therefore legally licensed for redistribution as Public Domain material by + The Mod Archive. Materials that have been uploaded but have been modified + since origin are submitted entirely at the uploaders own risk, where all + liabilities remain with the uploader concerning any legal implications that + arise from subsequent litigation should there be any incident where a party + has cause to complain. + + 4.2 Footnote disclaimer. Should any section of the footnoted contradict the + previous paragraphs in sections 1-3 inclusive, the paragraphs in sections + 1-3 inclusive take precedence. diff --git a/examples/libnds/all/nitrofs/audio/sfx/fire_explosion.jfxr b/examples/libnds/all/nitrofs/audio/sfx/fire_explosion.jfxr new file mode 100644 index 0000000..cc99196 --- /dev/null +++ b/examples/libnds/all/nitrofs/audio/sfx/fire_explosion.jfxr @@ -0,0 +1 @@ +{"_version":1,"_name":"fire_explosion","_locked":[],"sampleRate":44100,"attack":0,"sustain":0.027705693940245357,"sustainPunch":0,"decay":0.13257979056125957,"tremoloDepth":0,"tremoloFrequency":2.2776006915244977,"frequency":2095.7030570339975,"frequencySweep":-541.3667290180666,"frequencyDeltaSweep":-2800,"repeatFrequency":0,"frequencyJump1Onset":33,"frequencyJump1Amount":0,"frequencyJump2Onset":66,"frequencyJump2Amount":0,"harmonics":0,"harmonicsFalloff":0.5,"waveform":"whitenoise","interpolateNoise":false,"vibratoDepth":0,"vibratoFrequency":10,"squareDuty":50,"squareDutySweep":0,"flangerOffset":0,"flangerOffsetSweep":0,"bitCrush":16,"bitCrushSweep":0,"lowPassCutoff":22050,"lowPassCutoffSweep":0,"highPassCutoff":0,"highPassCutoffSweep":0,"compression":0.9,"normalization":true,"amplification":50} \ No newline at end of file diff --git a/examples/libnds/all/nitrofs/audio/sfx/fire_explosion.wav b/examples/libnds/all/nitrofs/audio/sfx/fire_explosion.wav new file mode 100644 index 0000000..75b9ace Binary files /dev/null and b/examples/libnds/all/nitrofs/audio/sfx/fire_explosion.wav differ diff --git a/examples/libnds/all/nitrofs/graphics/neon.grit b/examples/libnds/all/nitrofs/graphics/neon.grit new file mode 100644 index 0000000..4a6a869 --- /dev/null +++ b/examples/libnds/all/nitrofs/graphics/neon.grit @@ -0,0 +1,2 @@ +# bitmap, 16 bit +-gb -gB16 diff --git a/examples/libnds/all/nitrofs/graphics/neon.png b/examples/libnds/all/nitrofs/graphics/neon.png new file mode 100644 index 0000000..d60aecb Binary files /dev/null and b/examples/libnds/all/nitrofs/graphics/neon.png differ diff --git a/examples/libnds/all/nitrofs/graphics/neon.txt b/examples/libnds/all/nitrofs/graphics/neon.txt new file mode 100644 index 0000000..61d219a --- /dev/null +++ b/examples/libnds/all/nitrofs/graphics/neon.txt @@ -0,0 +1,2 @@ +Author: Antonio Niño Díaz, 2023 +License: CC0-1.0 diff --git a/examples/libnds/all/nitrofs/root/data_string.bin b/examples/libnds/all/nitrofs/root/data_string.bin new file mode 100644 index 0000000..532df08 --- /dev/null +++ b/examples/libnds/all/nitrofs/root/data_string.bin @@ -0,0 +1 @@ +Hello from a bin file! diff --git a/examples/libnds/all/teak/source1/main.c b/examples/libnds/all/teak/source1/main.c new file mode 100644 index 0000000..94c5276 --- /dev/null +++ b/examples/libnds/all/teak/source1/main.c @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 + +#include + +int main(void) +{ + teakInit(); + + while (1) + { + uint16_t data0 = apbpReceiveData(0); + uint16_t data1 = apbpReceiveData(1); + uint16_t data2 = apbpReceiveData(2); + + apbpSendData(0, data0); + apbpSendData(1, data1 + data2); + apbpSendData(2, data1 - data2); + } + + return 0; +} diff --git a/examples/libnds/all/teak/source2/main.c b/examples/libnds/all/teak/source2/main.c new file mode 100644 index 0000000..94c5276 --- /dev/null +++ b/examples/libnds/all/teak/source2/main.c @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 + +#include + +int main(void) +{ + teakInit(); + + while (1) + { + uint16_t data0 = apbpReceiveData(0); + uint16_t data1 = apbpReceiveData(1); + uint16_t data2 = apbpReceiveData(2); + + apbpSendData(0, data0); + apbpSendData(1, data1 + data2); + apbpSendData(2, data1 - data2); + } + + return 0; +} diff --git a/examples/libnds/arm9/.gitignore b/examples/libnds/arm9/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/libnds/arm9/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/libnds/arm9/architectds b/examples/libnds/arm9/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/libnds/arm9/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/libnds/arm9/build.py b/examples/libnds/arm9/build.py new file mode 100644 index 0000000..8ca48d5 --- /dev/null +++ b/examples/libnds/arm9/build.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +arm9 = Arm9Binary(sourcedirs=['source']) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9], + game_title='ARM9 only', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/libnds/arm9/source/main.c b/examples/libnds/arm9/source/main.c new file mode 100644 index 0000000..fe193bb --- /dev/null +++ b/examples/libnds/arm9/source/main.c @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2023 + +// Information about ANSI escape codes: +// +// https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_(Control_Sequence_Introducer)_sequences +// Check the source code of the console in libnds to check which codes are +// supported and which ones are not: source/arm9/console.c + +#include + +#include + +int main(int argc, char **argv) +{ + consoleDemoInit(); + + // Clear console: [2J + printf("\x1b[2J"); + + // Set cursor coordinates: [y;xH + printf("\x1b[8;10HHello World!"); + + // Move cursor up: [deltayA + printf("\x1b[8ALine 0"); + + // Move cursor left: [deltaxD + printf("\x1b[28DColumn 0"); + + // Move cursor down: [deltayB + printf("\x1b[19BLine 19"); + + // Move cursor right: [deltaxC + printf("\x1b[5CColumn 20"); + + // Print colored text + printf("\x1b[14;4H"); + + // Colors (30 to 37): Black, Red, Green, Yellow, BLue, Magenta, Cyan, White + // Setting intensity to 1 will make them brighter. + char c = 'A'; + for (int intensity = 0; intensity < 2; intensity++) + for (int color = 30; color < 38; color++) + printf("\x1b[%d;%dm%c", color, intensity, c++); + + // Reset color to white + printf("\x1b[39;0m"); + + printf("\x1b[23;0HPress START to exit to loader"); + + while (1) + { + swiWaitForVBlank(); + + scanKeys(); + + if (keysDown() & KEY_START) + break; + } + + return 0; +} diff --git a/examples/libnds/arm9_arm7/.gitignore b/examples/libnds/arm9_arm7/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/libnds/arm9_arm7/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/libnds/arm9_arm7/architectds b/examples/libnds/arm9_arm7/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/libnds/arm9_arm7/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/libnds/arm9_arm7/arm7/source/main.c b/examples/libnds/arm9_arm7/arm7/source/main.c new file mode 100644 index 0000000..42daaef --- /dev/null +++ b/examples/libnds/arm9_arm7/arm7/source/main.c @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: Zlib +// +// Copyright (C) 2005 Michael Noland (joat) +// Copyright (C) 2005 Jason Rogers (Dovoto) +// Copyright (C) 2005-2015 Dave Murphy (WinterMute) +// Copyright (C) 2023 Antonio Niño Díaz + +// Default ARM7 core + +#include +#include +#include + +volatile bool exit_loop = false; + +void power_button_callback(void) +{ + exit_loop = true; +} + +void vblank_handler(void) +{ + inputGetAndSend(); + Wifi_Update(); +} + +int main(int argc, char *argv[]) +{ + // Initialize sound hardware + enableSound(); + + // Read user information from the firmware (name, birthday, etc) + readUserSettings(); + + // Stop LED blinking + ledBlink(0); + + // Using the calibration values read from the firmware with + // readUserSettings(), calculate some internal values to convert raw + // coordinates into screen coordinates. + touchInit(); + + irqInit(); + irqSet(IRQ_VBLANK, vblank_handler); + + fifoInit(); + + installWifiFIFO(); + installSoundFIFO(); + installSystemFIFO(); // Sleep mode, storage, firmware... + + // Initialize Maxmod. It uses timer 0 internally. + mmInstall(FIFO_MAXMOD); + + // This sets a callback that is called when the power button in a DSi + // console is pressed. It has no effect in a DS. + setPowerButtonCB(power_button_callback); + + // Read current date from the RTC and setup an interrupt to update the time + // regularly. The interrupt simply adds one second every time, it doesn't + // read the date. Reading the RTC is very slow, so it's a bad idea to do it + // frequently. + initClockIRQTimer(3); + + irqEnable(IRQ_VBLANK); + + while (!exit_loop) + { + const uint16_t key_mask = KEY_SELECT | KEY_START | KEY_L | KEY_R; + uint16_t keys_pressed = ~REG_KEYINPUT; + + if ((keys_pressed & key_mask) == key_mask) + exit_loop = true; + + swiWaitForVBlank(); + } + + return 0; +} diff --git a/examples/libnds/arm9_arm7/arm9/source/main.c b/examples/libnds/arm9_arm7/arm9/source/main.c new file mode 100644 index 0000000..720f2a5 --- /dev/null +++ b/examples/libnds/arm9_arm7/arm9/source/main.c @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 + +#include +#include + +#include +#include + +#include "common.h" + +int main(int argc, char **argv) +{ + // Setup sub screen for the text console + consoleDemoInit(); + + while (1) + { + swiWaitForVBlank(); + + scanKeys(); + + uint16_t keys = keysHeld(); + + if (keys & KEY_START) + break; + + // Clear console + printf("\x1b[2J"); + + // Print current time + char str[100]; + time_t t = time(NULL); + struct tm *tmp = localtime(&t); + if (strftime(str, sizeof(str), "%Y-%m-%dT%H:%M:%S%z", tmp) == 0) + snprintf(str, sizeof(str), "Failed to get time"); + printf("%s\n\n", str); + + // Print some controls + printf("START: Exit to loader\n"); + printf("\n"); + } + + return 0; +} diff --git a/examples/libnds/arm9_arm7/build.py b/examples/libnds/arm9_arm7/build.py new file mode 100644 index 0000000..619235d --- /dev/null +++ b/examples/libnds/arm9_arm7/build.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +arm9 = Arm9Binary( + sourcedirs=['arm9/source', 'common/source'], + includedirs=['common/include'], + libs=['nds9', 'mm9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDS}/libs/maxmod'] +) +arm9.generate_elf() + +arm7 = Arm7Binary( + sourcedirs=['arm7/source', 'common/source'], + includedirs=['common/include'], + libs=['nds7', 'mm7', 'dswifi7'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDS}/libs/maxmod', + '${BLOCKSDS}/libs/dswifi'] +) +arm7.generate_elf() + +nds = NdsRom( + binaries=[arm9, arm7], + game_title='ARM9 + ARM7', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/libnds/arm9_arm7/common/include/common.h b/examples/libnds/arm9_arm7/common/include/common.h new file mode 100644 index 0000000..020fa08 --- /dev/null +++ b/examples/libnds/arm9_arm7/common/include/common.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2023 + +#ifndef COMMON_H__ +#define COMMON_H__ + +int my_strlen(const char *s); + +#endif // COMMON_H__ diff --git a/examples/libnds/arm9_arm7/common/source/common.c b/examples/libnds/arm9_arm7/common/source/common.c new file mode 100644 index 0000000..421f7ec --- /dev/null +++ b/examples/libnds/arm9_arm7/common/source/common.c @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2023 + +#include + +int my_strlen(const char *s) +{ + return strlen(s); +} diff --git a/examples/libnds/arm9_nitrofs/.gitignore b/examples/libnds/arm9_nitrofs/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/libnds/arm9_nitrofs/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/libnds/arm9_nitrofs/architectds b/examples/libnds/arm9_nitrofs/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/libnds/arm9_nitrofs/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/libnds/arm9_nitrofs/build.py b/examples/libnds/arm9_nitrofs/build.py new file mode 100644 index 0000000..a71a3e9 --- /dev/null +++ b/examples/libnds/arm9_nitrofs/build.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +arm9 = Arm9Binary(sourcedirs=['source']) +arm9.generate_elf() + +nds = NdsRom( + nitrofsdirs=['nitrofs'], + binaries=[arm9], + game_title='ARM9 and NitroFS', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/libnds/arm9_nitrofs/nitrofs/random.bin b/examples/libnds/arm9_nitrofs/nitrofs/random.bin new file mode 100644 index 0000000..31e4f9c Binary files /dev/null and b/examples/libnds/arm9_nitrofs/nitrofs/random.bin differ diff --git a/examples/libnds/arm9_nitrofs/source/main.c b/examples/libnds/arm9_nitrofs/source/main.c new file mode 100644 index 0000000..de68d8a --- /dev/null +++ b/examples/libnds/arm9_nitrofs/source/main.c @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2023 + +// Random file generated with: +// +// dd bs=1024 count=2048 < /dev/urandom > random.bin + +#include + +#include +#include +#include +#include + +#include "md5/md5.h" + +static char input_buffer[1024]; + +PrintConsole topScreen; +PrintConsole bottomScreen; + +int calculate_file_md5(void *arg) +{ + const char *path = arg; + + FILE *f = fopen(path, "r"); + if (f == NULL) + { + consoleSelect(&topScreen); + perror("fopen(random.bin)"); + fflush(stdout); + return -1; + } + + consoleSelect(&topScreen); + printf("Calculating MD5 in a thread\n"); + printf("\n"); + fflush(stdout); + + size_t input_size = 0; + + MD5Context ctx; + md5Init(&ctx); + + uint32_t size = 0; + + while (1) + { + input_size = fread(input_buffer, 1, 1024, f); + if (input_size <= 0) + break; + + md5Update(&ctx, (uint8_t *)input_buffer, input_size); + + size += input_size; + if ((size % (1024 * 64)) == 0) + { + consoleSelect(&topScreen); + printf("."); + fflush(stdout); + } + } + + consoleSelect(&topScreen); + printf("\n"); + printf("\n"); + printf("\n"); + fflush(stdout); + + md5Finalize(&ctx); + + uint8_t digest[16]; + memcpy(digest, ctx.digest, 16); + + consoleSelect(&topScreen); + for (int i = 0; i < 16; i++) + printf("%02X", digest[i]); + printf("\n"); + fflush(stdout); + + fclose(f); + + return 0; +} + +int main(int argc, char **argv) +{ + videoSetMode(MODE_0_2D); + videoSetModeSub(MODE_0_2D); + + vramSetBankA(VRAM_A_MAIN_BG); + vramSetBankC(VRAM_C_SUB_BG); + + consoleInit(&topScreen, 3, BgType_Text4bpp, BgSize_T_256x256, 31, 0, true, true); + consoleInit(&bottomScreen, 3, BgType_Text4bpp, BgSize_T_256x256, 31, 0, false, true); + + consoleSelect(&bottomScreen); + + printf("\x1b[2J"); // Clear console + + printf("DLDI name:\n"); + printf("%s\n", io_dldi_data->friendlyName); + printf("\n"); + printf("DSi mode: %d\n", isDSiMode()); + + if (isDSiMode() == 0) + { + // In DS mode, access to the SD card is done with DLDI. When running on + // emulators DLDI is not be needed, but cartridge reads happen in the + // ARM7 at the moment. DLDI usually runs in the ARM9. + // + // If DLDI runs on the ARM9, it isn't possible to do multithreading + // while accessing the filesystem. That can only work if the ARM7 loads + // data while the ARM9 waits for it and switches to other threads in the + // meantime. + printf("Forcing DLDI in ARM7...\n"); + dldiSetMode(DLDI_MODE_ARM7); + } + + bool init_ok = nitroFSInit(NULL); + if (!init_ok) + { + perror("nitroFSInit()"); + goto wait_loop; + } + + chdir("nitro:/"); + char *cwd = getcwd(NULL, 0); + printf("Current dir: %s\n\n", cwd); + free(cwd); + + printf("\x1b[10;0;HMain thread: "); + fflush(stdout); + + // This thread needs enough stack to do filesystem access. By default it + // isn't enough for it and it will make the ROM crash because of a stack + // overflow. + cothread_t load_thread = cothread_create(calculate_file_md5, + (void *)"random.bin", 4 * 1024, 0); + + int count = 0; + while (1) + { + cothread_yield_irq(IRQ_VBLANK); + + consoleSelect(&bottomScreen); + printf("\x1b[10;14;H%5d", count); + fflush(stdout); + + count++; + + if (cothread_has_joined(load_thread)) + { + cothread_delete(load_thread); + break; + } + } + +wait_loop: + printf("\n"); + printf("\n"); + printf("Press START to exit to loader\n"); + + while (1) + { + cothread_yield_irq(IRQ_VBLANK); + + scanKeys(); + + uint32_t keys_down = keysDown(); + if (keys_down & KEY_START) + break; + } + + return 0; +} diff --git a/examples/libnds/arm9_nitrofs/source/md5/README.md b/examples/libnds/arm9_nitrofs/source/md5/README.md new file mode 100644 index 0000000..4bb0680 --- /dev/null +++ b/examples/libnds/arm9_nitrofs/source/md5/README.md @@ -0,0 +1,291 @@ +# MD5 + +Takes an input string or file and outputs its MD5 hash. + +This repo is gaining a little more traffic than I expected, so I'll put this here as a little disclaimer. I wrote this code as a side project in college in an attempt to better understand the algorithm. I consider this repository to be a reference implementation with a good step by step walkthrough of the algorithm, not necessarily code to be built upon. I did verify the correctness of the output by comparing to other existing standalone programs. However, I did not research edge cases, set up automated testing, or attempt to run the program on any machine other than the laptop I had at the time, so here's the warning: + +This code may be generally correct, but you should consider it untested to be on the safe side. There may be edge cases, vulnerabilities, or optimizations I did not consider when I wrote this. I can only confirm that this code probably worked correctly on a single computer in 2017. + +Knowing that, do feel free to use this code in any way you wish, no credit needed. And if you find a problem, raise an issue. + +### Implementing into Code + +If you want to include the md5 algorithm in your own code, you'll only need `md5.c` and `md5.h`. + +```c +#include "md5.h" + +... + +void foo(){ + uint8_t result[16]; + md5String("Hello, World!", result); // *result = 65a8e27d8879283831b664bd8b7f0ad4 + + FILE bar = fopen("bar.txt", "r"); + md5File(bar, result); // Reads a file from a file pointer + md5File(stdin, result); // Can easily read from stdin + + // Manual use + .. + MD5Context ctx; + md5Init(&ctx); + + ... + md5Update(&ctx, input1, input1_size); + ... + md5Update(&ctx, input2, input2_size); + ... + md5Update(&ctx, input3, input3_size); + ... + + md5Finalize(&ctx); + + ctx.digest; // Result of hashing (as uint8_t* with 16 bytes) +} +``` + +### Command Line + +You can directly use the binary built with this Makefile to process text or files in the command line. + +Any arguments will be interpreted as strings. Each argument will be interpreted as a separate string to hash, and will be given its own output (in the order of input). + +```shell +$ make + +$ ./md5 "Hello, World!" +65a8e27d8879283831b664bd8b7f0ad4 + +$ ./md5 "Multiple" Strings +a0bf169f2539e893e00d7b1296bc4d8e +89be9433646f5939040a78971a5d103a + +$ ./md5 "" +d41d8cd98f00b204e9800998ecf8427e + +$ ./md5 "Can use \" escapes" +7bf94222f6dbcd25d6fa21d5985f5634 +``` +If no arguments are given, input is taken from standard input. +```shell +$ make + +$ echo -n "Hello, World!" | ./md5 +65a8e27d8879283831b664bd8b7f0ad4 + +$ echo "Hello, World!" | ./md5 +bea8252ff4e80f41719ea13cdf007273 + +$ echo "File Input" > testFile | ./md5 +d41d8cd98f00b204e9800998ecf8427e + +$ cat testFile | ./md5 +7dacda86e382b27c25a92f8f2f6a5cd8 + +``` +As seen above, it is important to note that many programs will output a newline character after their output. This newline *will* affect the output of the MD5 algorithm. `echo` has the `-n` flag that prevents the output of said character. + +If entering input by hand, end collection of data by entering an EOF character (`Ctrl+D` in some cases). + +# The Algorithm + +While researching this algorithm, the only relatively complete description I found came from RSA Data Security itself in [this memo][1]. And while the description is adequate, any confusion is very difficult to clear up, especially given the nature of the algorithm's output. So here I will try to describe the algorithm used in these implementations with examples. + +The algorithm considers all words to be little-endian. I will also specify where this may be confusing. + +The algorithm takes in an input of arbitrary length in bits. This can be a string, a file, a number, a struct, etc... It also doesn't need to be byte-aligned, though it almost always is. We'll call this input the message. The output is the digest. + +#### Step 1: Padding + +The provided message is padded by appending bits to the end until its length is congruent to `448 mod 512` bits. In other words, the message is padded so that its length is 64 bits less than the next multiple of 512. If the original message's length already meets this requirement before padding, it is still padded with 512 bits. + +The padding is simply a single "1" bit at the end of the message followed by enough "0" bits to satisfy the length condition above. + +##### Example + +Let's pass the string "Hello, world!" to the algorithm. Those characters converted to hexadecimal numbers look like this: +``` +48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 +``` +(Note: Strings are often null-terminated. This null character is not taken into account, as you will see.) + +Now we have to pad our message bits: +``` +0x 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 80 00 00 +0x 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x 00 00 00 00 00 00 00 00 +``` +Note the `0x80` right after the end of our message. We're writing a stream of bits, not bytes. Setting the bit after our message to "1" and the next 7 bits to "0" means writing the byte `1000 0000` or `0x80`. + +#### Step 2: Appending the Length + +Next, the length of the message modulus 2^64 is appended in little endian to the message to round out the total length to a multiple of 512. This length is the number of *bits* in the original message, modulus 2^64. It's common to split this number into two 32-bit words, so keep careful track of which bytes are put where; the highest order byte should be the last byte in the message. This will round out the length of the whole message to a multiple of 512. + +##### Example 1 + +The length of our message is 104 bits. The 64-bit representation of the number 104 in hexadecimal is `0x00000000 00000068`. So we'll append that number to the end. + +``` +0x 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 80 00 00 +0x 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x 00 00 00 00 00 00 00 00 68 00 00 00 00 00 00 00 +``` + +(We're writing in little-endian, so the lowest order byte is written first.) + +If you're holding the length in two separate 32-bit words, make sure to append the lower order bytes first. + +##### Example 2 + +Because our "Hello, world!" example is so small and doesn't give a length with more than two digits, let's say we have a different, bigger message of `0x12345678 90ABCDEF` bits and this chunk we're looking at is just the tail end that we have to pad out. The appended length would look like this: + +``` +0x 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 80 00 00 +0x 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x 00 00 00 00 00 00 00 00 EF CD AB 90 78 56 34 12 +``` + +#### Step 3: Initializing the Buffer + +The variables that will eventually hold our digest must be initialized to the following: + +``` +A = 0x01234567 +B = 0x89abcdef +C = 0xfedcba98 +D = 0x76543210 +``` + +#### Step 4: Processing + +There are four functions defined in the RSA memo that are used to collapse three 32-bit words into one 32-bit word: + +``` +F(X, Y, Z) = (X & Y) | (~X & Z) +G(X, Y, Z) = (X & Z) | (Y & ~Z) +H(X, Y, Z) = X ^ Y ^ Z +I(X, Y, Z) = Y ^ (X | ~Z) +``` + +These are bitwise operations. + +We also have to do a left rotate on the bits in a word. That is, shift the bits left, and move overflow to the right. Like spinning a bottle and seeing the label loop around. The function is defined as follows: + +``` +rotate_left(x, n) = (x << n) | (x >> (32 - n)) +``` + +The constants in K and S can be found at the bottom of this section. + +The message is split into blocks of 512 bits. Each block is split into 16 32-bit words. For each block, do the following: + +```c +AA = A; +BB = B; +CC = C; +DD = D; + +for(i in 0 to 63){ + if(0 <= i <= 15){ + E = F(BB, CC, DD); + j = i; + } + else if(16 <= i <= 31){ + E = G(BB, CC, DD); + j = ((i * 5) + 1) % 16; + } + else if(32 <= i <= 47){ + E = H(BB, CC, DD); + j = ((i * 3) + 5) % 16; + } + else{ + E = I(BB, CC, DD); + j = (i * 7) % 16; + } + + temp = DD; + DD = CC; + CC = BB; + BB = BB + rotate_left(AA + E + K[i] + input[j], S[i]); + AA = temp; +} + +A += AA; +B += BB; +C += CC; +D += DD; +``` + +The RSA memo explicitly lists each step instead of using control structures. The result is the same. + +An example for this step is not particularly useful, as the data produced by the loop is not very meaningful for observation. + +#### Step 5: Output + +The digest is a 128-bit number written in little endian, and is contained in A, B, C, and D after the algorithm is finished. Just arrange the bytes so that the lowest-order byte of the digest is the lowest-order byte of A, and the highest-order byte of the digest is the highest-order byte of D. + +##### Example + +Here is the output of a few strings to check against: + +"Hello, world!" + +``` +6cd3556deb0da54bca060b4c39479839 +``` + +"" (empty string) + +``` +d41d8cd98f00b204e9800998ecf8427e +``` + +"The quick brown fox jumps over the lazy dog." + +``` +e4d909c290d0fb1ca068ffaddf22cbd0 +``` + +#### Constants and Functions + +```c +A = 0x01234567 +B = 0x89abcdef +C = 0xfedcba98 +D = 0x76543210 + +K[] = {0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391} + +S[] = {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21} + + +F(X, Y, Z) = (X & Y) | (~X & Z) +G(X, Y, Z) = (X & Z) | (Y & ~Z) +H(X, Y, Z) = X ^ Y ^ Z +I(X, Y, Z) = Y ^ (X | ~Z) + +rotate_left(x, n) = (x << n) | (x >> (32 - n)) +``` + +[1]: https://tools.ietf.org/html/rfc1321 diff --git a/examples/libnds/arm9_nitrofs/source/md5/UNLICENSE b/examples/libnds/arm9_nitrofs/source/md5/UNLICENSE new file mode 100644 index 0000000..b3dbff0 --- /dev/null +++ b/examples/libnds/arm9_nitrofs/source/md5/UNLICENSE @@ -0,0 +1,22 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/examples/libnds/arm9_nitrofs/source/md5/md5.c b/examples/libnds/arm9_nitrofs/source/md5/md5.c new file mode 100644 index 0000000..f79a427 --- /dev/null +++ b/examples/libnds/arm9_nitrofs/source/md5/md5.c @@ -0,0 +1,223 @@ +/* + * Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm + * and modified slightly to be functionally identical but condensed into control structures. + */ + +#include "md5.h" + +/* + * Constants defined by the MD5 algorithm + */ +#define A 0x67452301 +#define B 0xefcdab89 +#define C 0x98badcfe +#define D 0x10325476 + +static uint32_t S[] = {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}; + +static uint32_t K[] = {0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391}; + +/* + * Padding used to make the size (in bits) of the input congruent to 448 mod 512 + */ +static uint8_t PADDING[] = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +/* + * Bit-manipulation functions defined by the MD5 algorithm + */ +#define F(X, Y, Z) ((X & Y) | (~X & Z)) +#define G(X, Y, Z) ((X & Z) | (Y & ~Z)) +#define H(X, Y, Z) (X ^ Y ^ Z) +#define I(X, Y, Z) (Y ^ (X | ~Z)) + +/* + * Rotates a 32-bit word left by n bits + */ +uint32_t rotateLeft(uint32_t x, uint32_t n){ + return (x << n) | (x >> (32 - n)); +} + + +/* + * Initialize a context + */ +void md5Init(MD5Context *ctx){ + ctx->size = (uint64_t)0; + + ctx->buffer[0] = (uint32_t)A; + ctx->buffer[1] = (uint32_t)B; + ctx->buffer[2] = (uint32_t)C; + ctx->buffer[3] = (uint32_t)D; +} + +/* + * Add some amount of input to the context + * + * If the input fills out a block of 512 bits, apply the algorithm (md5Step) + * and save the result in the buffer. Also updates the overall size. + */ +void md5Update(MD5Context *ctx, uint8_t *input_buffer, size_t input_len){ + uint32_t input[16]; + unsigned int offset = ctx->size % 64; + ctx->size += (uint64_t)input_len; + + // Copy each byte in input_buffer into the next space in our context input + for(unsigned int i = 0; i < input_len; ++i){ + ctx->input[offset++] = (uint8_t)*(input_buffer + i); + + // If we've filled our context input, copy it into our local array input + // then reset the offset to 0 and fill in a new buffer. + // Every time we fill out a chunk, we run it through the algorithm + // to enable some back and forth between cpu and i/o + if(offset % 64 == 0){ + for(unsigned int j = 0; j < 16; ++j){ + // Convert to little-endian + // The local variable `input` our 512-bit chunk separated into 32-bit words + // we can use in calculations + input[j] = (uint32_t)(ctx->input[(j * 4) + 3]) << 24 | + (uint32_t)(ctx->input[(j * 4) + 2]) << 16 | + (uint32_t)(ctx->input[(j * 4) + 1]) << 8 | + (uint32_t)(ctx->input[(j * 4)]); + } + md5Step(ctx->buffer, input); + offset = 0; + } + } +} + +/* + * Pad the current input to get to 448 bytes, append the size in bits to the very end, + * and save the result of the final iteration into digest. + */ +void md5Finalize(MD5Context *ctx){ + uint32_t input[16]; + unsigned int offset = ctx->size % 64; + unsigned int padding_length = offset < 56 ? 56 - offset : (56 + 64) - offset; + + // Fill in the padding and undo the changes to size that resulted from the update + md5Update(ctx, PADDING, padding_length); + ctx->size -= (uint64_t)padding_length; + + // Do a final update (internal to this function) + // Last two 32-bit words are the two halves of the size (converted from bytes to bits) + for(unsigned int j = 0; j < 14; ++j){ + input[j] = (uint32_t)(ctx->input[(j * 4) + 3]) << 24 | + (uint32_t)(ctx->input[(j * 4) + 2]) << 16 | + (uint32_t)(ctx->input[(j * 4) + 1]) << 8 | + (uint32_t)(ctx->input[(j * 4)]); + } + input[14] = (uint32_t)(ctx->size * 8); + input[15] = (uint32_t)((ctx->size * 8) >> 32); + + md5Step(ctx->buffer, input); + + // Move the result into digest (convert from little-endian) + for(unsigned int i = 0; i < 4; ++i){ + ctx->digest[(i * 4) + 0] = (uint8_t)((ctx->buffer[i] & 0x000000FF)); + ctx->digest[(i * 4) + 1] = (uint8_t)((ctx->buffer[i] & 0x0000FF00) >> 8); + ctx->digest[(i * 4) + 2] = (uint8_t)((ctx->buffer[i] & 0x00FF0000) >> 16); + ctx->digest[(i * 4) + 3] = (uint8_t)((ctx->buffer[i] & 0xFF000000) >> 24); + } +} + +/* + * Step on 512 bits of input with the main MD5 algorithm. + */ +void md5Step(uint32_t *buffer, uint32_t *input){ + uint32_t AA = buffer[0]; + uint32_t BB = buffer[1]; + uint32_t CC = buffer[2]; + uint32_t DD = buffer[3]; + + uint32_t E; + + unsigned int j; + + for(unsigned int i = 0; i < 64; ++i){ + switch(i / 16){ + case 0: + E = F(BB, CC, DD); + j = i; + break; + case 1: + E = G(BB, CC, DD); + j = ((i * 5) + 1) % 16; + break; + case 2: + E = H(BB, CC, DD); + j = ((i * 3) + 5) % 16; + break; + default: + E = I(BB, CC, DD); + j = (i * 7) % 16; + break; + } + + uint32_t temp = DD; + DD = CC; + CC = BB; + BB = BB + rotateLeft(AA + E + K[i] + input[j], S[i]); + AA = temp; + } + + buffer[0] += AA; + buffer[1] += BB; + buffer[2] += CC; + buffer[3] += DD; +} + +/* + * Functions that run the algorithm on the provided input and put the digest into result. + * result should be able to store 16 bytes. + */ +void md5String(char *input, uint8_t *result){ + MD5Context ctx; + md5Init(&ctx); + md5Update(&ctx, (uint8_t *)input, strlen(input)); + md5Finalize(&ctx); + + memcpy(result, ctx.digest, 16); +} + +void md5File(FILE *file, uint8_t *result){ + char *input_buffer = malloc(1024); + size_t input_size = 0; + + MD5Context ctx; + md5Init(&ctx); + + while((input_size = fread(input_buffer, 1, 1024, file)) > 0){ + md5Update(&ctx, (uint8_t *)input_buffer, input_size); + } + + md5Finalize(&ctx); + + free(input_buffer); + + memcpy(result, ctx.digest, 16); +} diff --git a/examples/libnds/arm9_nitrofs/source/md5/md5.h b/examples/libnds/arm9_nitrofs/source/md5/md5.h new file mode 100644 index 0000000..ca172f1 --- /dev/null +++ b/examples/libnds/arm9_nitrofs/source/md5/md5.h @@ -0,0 +1,24 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include + +typedef struct{ + uint64_t size; // Size of input in bytes + uint32_t buffer[4]; // Current accumulation of hash + uint8_t input[64]; // Input to be used in the next step + uint8_t digest[16]; // Result of algorithm +}MD5Context; + +void md5Init(MD5Context *ctx); +void md5Update(MD5Context *ctx, uint8_t *input, size_t input_len); +void md5Finalize(MD5Context *ctx); +void md5Step(uint32_t *buffer, uint32_t *input); + +void md5String(char *input, uint8_t *result); +void md5File(FILE *file, uint8_t *result); + +#endif diff --git a/examples/libnds/arm9_nitrofs/source/md5/url.txt b/examples/libnds/arm9_nitrofs/source/md5/url.txt new file mode 100644 index 0000000..880b115 --- /dev/null +++ b/examples/libnds/arm9_nitrofs/source/md5/url.txt @@ -0,0 +1 @@ +https://github.com/Zunawe/md5-c/tree/f3529b666b7ae8b80b0a9fa88ac2a91b389909c7 diff --git a/examples/libnds/debug_build/.gitignore b/examples/libnds/debug_build/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/libnds/debug_build/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/libnds/debug_build/architectds b/examples/libnds/debug_build/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/libnds/debug_build/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/libnds/debug_build/build.py b/examples/libnds/debug_build/build.py new file mode 100644 index 0000000..4f0fc82 --- /dev/null +++ b/examples/libnds/debug_build/build.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +import sys + +argv = sys.argv + +if '--debug' in argv: + argv.remove('--debug') # Don't pass this to the build system + defines_ = [] + libs_ = ['nds9d'] +else: + defines_ = ['NDEBUG'] + libs_ = ['nds9'] + +arm9 = Arm9Binary( + sourcedirs=['source'], + defines=defines_, + libs=libs_, +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9], + game_title='Debug and release builds', +) +nds.generate_nds() + +nds.run_command_line_arguments(args=argv) diff --git a/examples/libnds/debug_build/readme.rst b/examples/libnds/debug_build/readme.rst new file mode 100644 index 0000000..490d26b --- /dev/null +++ b/examples/libnds/debug_build/readme.rst @@ -0,0 +1,18 @@ +Instructions +============ + +When switching between debug and release builds, the build system will detect +that the libraries and defines have changed and rebuild everything that has been +affected. + +Build release ROM: + +.. code:: python + + python3 build.py + +Build debug ROM: + +.. code:: python + + python3 build.py --debug diff --git a/examples/libnds/debug_build/source/main.c b/examples/libnds/debug_build/source/main.c new file mode 100644 index 0000000..e24cab4 --- /dev/null +++ b/examples/libnds/debug_build/source/main.c @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 + +#include + +#include + +int main(int argc, char **argv) +{ + consoleDemoInit(); + + printf("sassert() test\n\n"); + + // The values passed to this function are out of range, and they should + // cause an assertion to fail. + + glFogColor(54, 30, 12, 70); + + // In a debug build this point will never be reached. + + printf("This is a release build.\n"); + printf("No sassert() will be checked\n\n"); + + printf("Press START to exit to loader"); + + while (1) + { + swiWaitForVBlank(); + + scanKeys(); + + if (keysDown() & KEY_START) + break; + } + + return 0; +} diff --git a/examples/libnds/dsp/.gitignore b/examples/libnds/dsp/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/libnds/dsp/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/libnds/dsp/architectds b/examples/libnds/dsp/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/libnds/dsp/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/libnds/dsp/arm9/source/main.c b/examples/libnds/dsp/arm9/source/main.c new file mode 100644 index 0000000..2b99b5d --- /dev/null +++ b/examples/libnds/dsp/arm9/source/main.c @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 + +#include +#include + +#include "teak/teak1_tlf.h" + +__attribute__((noreturn)) void WaitLoop(void) +{ + printf("Press START to exit"); + while (1) + { + swiWaitForVBlank(); + scanKeys(); + if (keysHeld() & KEY_START) + exit(0); + } +} + +void *load_file(const char *path) +{ + FILE *file = fopen(path, "rb"); + if (file == NULL) + return NULL; + + if (fseek(file, 0, SEEK_END) != 0) + { + fclose(file); + return NULL; + } + + size_t size = ftell(file); + rewind(file); + + void *buffer = malloc(size); + if (buffer == NULL) + { + fclose(file); + return NULL; + } + + if (fread(buffer, 1, size, file) != size) + { + fclose(file); + return NULL; + } + + return buffer; +} + +void load_tlf(const void *ptr) +{ + if (dspExecuteDefaultTLF(ptr) != DSP_EXEC_OK) + { + printf("Failed to execute TLF"); + WaitLoop(); + } +} + +int main(int argc, char **argv) +{ + // Setup sub screen for the text console + consoleDemoInit(); + + if (!isDSiMode()) + { + printf("This demo must run on a DSi"); + WaitLoop(); + } + + if (!nitroFSInit(NULL)) + { + printf("nitroFSInit failed.\n"); + WaitLoop(); + } + + void *tlf_from_nitrofs = load_file("teak/teak2.tlf"); + if (tlf_from_nitrofs == NULL) + { + printf("Failed to load TLF file from NitroFS"); + WaitLoop(); + } + + uint16_t cmd0 = 0; + int16_t cmd1 = 15; + int16_t cmd2 = 5; + + uint16_t rep0 = 0; + int16_t rep1 = 0; + int16_t rep2 = 0; + + // Load the binary from ARM9 data initially + load_tlf(teak1_tlf); + char *tlf_name = "teak1"; + + while (1) + { + // Synchronize game loop to the screen refresh + swiWaitForVBlank(); + + // Clear console + printf("\x1b[2J"); + + // Print some controls + printf("Current TLF: %s\n", tlf_name); + printf("\n"); + printf("\n"); + printf("L: Load TLF1\n"); + printf("R: Load TLF2\n"); + printf("PAD: Change values\n"); + printf("\n"); + printf("\n"); + printf("START: Exit to loader\n"); + printf("\n"); + printf("\n"); + + // Handle user input + // ----------------- + + scanKeys(); + + uint16_t keys = keysHeld(); + uint16_t keys_down = keysDown(); + + if (keys & KEY_LEFT) + cmd1++; + if (keys & KEY_RIGHT) + cmd1--; + + if (keys & KEY_UP) + cmd2++; + if (keys & KEY_DOWN) + cmd2--; + + if (keys_down & KEY_L) + { + // Load the binary from ARM9 data initially + load_tlf(teak1_tlf); + tlf_name = "teak1"; + } + if (keys_down & KEY_R) + { + // Load the binary from NitroFS + load_tlf(tlf_from_nitrofs); + tlf_name = "teak2"; + } + + if (keys & KEY_START) + break; + + // DSP communications + + printf("CMD: %u %d %d\n", cmd0, cmd1, cmd2); + + cmd0++; // Heartbeat + + if (dspSendDataReady(0)) + dspSendData(0, cmd0); + if (dspSendDataReady(1)) + dspSendData(1, cmd1); + if (dspSendDataReady(2)) + dspSendData(2, cmd2); + + if (dspReceiveDataReady(0)) + rep0 = dspReceiveData(0); + if (dspReceiveDataReady(1)) + rep1 = dspReceiveData(1); + if (dspReceiveDataReady(2)) + rep2 = dspReceiveData(2); + + printf("REP: %u %d %d\n", rep0, rep1, rep2); + } + + return 0; +} diff --git a/examples/libnds/dsp/build.py b/examples/libnds/dsp/build.py new file mode 100644 index 0000000..e1f63c3 --- /dev/null +++ b/examples/libnds/dsp/build.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +teak1 = TeakBinary( + name='teak1', + sourcedirs=['teak/source1'], +) +teak1.generate_tlf() + +teak2 = TeakBinary( + name='teak2', + sourcedirs=['teak/source2'], +) +teak2.generate_tlf() + +nitrofs = NitroFS() +nitrofs.add_tlf(teak2) +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['arm9/source'], +) +arm9.add_tlf(teak1) +arm9.generate_elf() + +nds = NdsRom( + binaries=[teak1, teak2, arm9, nitrofs], + game_title='Multiple DSP binaries', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/libnds/dsp/teak/source1/main.c b/examples/libnds/dsp/teak/source1/main.c new file mode 100644 index 0000000..94c5276 --- /dev/null +++ b/examples/libnds/dsp/teak/source1/main.c @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 + +#include + +int main(void) +{ + teakInit(); + + while (1) + { + uint16_t data0 = apbpReceiveData(0); + uint16_t data1 = apbpReceiveData(1); + uint16_t data2 = apbpReceiveData(2); + + apbpSendData(0, data0); + apbpSendData(1, data1 + data2); + apbpSendData(2, data1 - data2); + } + + return 0; +} diff --git a/examples/libnds/dsp/teak/source2/main.c b/examples/libnds/dsp/teak/source2/main.c new file mode 100644 index 0000000..f6e9366 --- /dev/null +++ b/examples/libnds/dsp/teak/source2/main.c @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 + +#include + +int main(void) +{ + teakInit(); + + while (1) + { + uint16_t data0 = apbpReceiveData(0); + uint16_t data1 = apbpReceiveData(1); + uint16_t data2 = apbpReceiveData(2); + + apbpSendData(0, data0); + apbpSendData(1, -data1); + apbpSendData(2, -data2); + } + + return 0; +} diff --git a/examples/libnds/opengl/.gitignore b/examples/libnds/opengl/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/libnds/opengl/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/libnds/opengl/architectds b/examples/libnds/opengl/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/libnds/opengl/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/libnds/opengl/build.py b/examples/libnds/opengl/build.py new file mode 100644 index 0000000..8ccb144 --- /dev/null +++ b/examples/libnds/opengl/build.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +arm9 = Arm9Binary( + sourcedirs=['source'], +) +arm9.add_grit(['graphics']) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9], + game_title='OpenGL example', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/libnds/opengl/graphics/neon.grit b/examples/libnds/opengl/graphics/neon.grit new file mode 100644 index 0000000..4a6a869 --- /dev/null +++ b/examples/libnds/opengl/graphics/neon.grit @@ -0,0 +1,2 @@ +# bitmap, 16 bit +-gb -gB16 diff --git a/examples/libnds/opengl/graphics/neon.png b/examples/libnds/opengl/graphics/neon.png new file mode 100644 index 0000000..d60aecb Binary files /dev/null and b/examples/libnds/opengl/graphics/neon.png differ diff --git a/examples/libnds/opengl/source/main.c b/examples/libnds/opengl/source/main.c new file mode 100644 index 0000000..aed8aa8 --- /dev/null +++ b/examples/libnds/opengl/source/main.c @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 + +#include + +#include + +#include "grit/neon_png.h" + +int main(int argc, char **argv) +{ + int textureID; + + videoSetMode(MODE_0_3D); + + glInit(); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_ANTIALIAS); + + // The background must be fully opaque and have a unique polygon ID + // (different from the polygons that are going to be drawn) so that + // antialias works. + glClearColor(0, 0, 0, 31); + glClearPolyID(63); + + glClearDepth(0x7FFF); + + glViewport(0, 0, 255, 191); + + // Setup some VRAM as memory for textures + vramSetBankA(VRAM_A_TEXTURE); + + // Load texture + glGenTextures(1, &textureID); + glBindTexture(0, textureID); + glTexImage2D(0, 0, GL_RGB, TEXTURE_SIZE_128 , TEXTURE_SIZE_128, 0, + TEXGEN_TEXCOORD, (u8*)neon_pngBitmap); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(70, 256.0 / 192.0, 0.1, 40); + + gluLookAt(0.0, 0.0, 2.0, // Position + 0.0, 0.0, 0.0, // Look at + 0.0, 1.0, 0.0); // Up + + // Setup sub screen for the text console + consoleDemoInit(); + + int angle_x = 0; + int angle_z = 0; + + while (1) + { + // Synchronize game loop to the screen refresh + swiWaitForVBlank(); + + // Print some text in the demo console + // ----------------------------------- + + // Clear console + printf("\x1b[2J"); + + // Print some controls + printf("PAD: Rotate triangle\n"); + printf("START: Exit to loader\n"); + printf("\n"); + + // Handle user input + // ----------------- + + scanKeys(); + + uint16_t keys = keysHeld(); + + if (keys & KEY_LEFT) + angle_z += 3; + if (keys & KEY_RIGHT) + angle_z -= 3; + + if (keys & KEY_UP) + angle_x += 3; + if (keys & KEY_DOWN) + angle_x -= 3; + + if (keys & KEY_START) + break; + + // Render 3D scene + // --------------- + + glPushMatrix(); + + glRotateZ(angle_z); + glRotateX(angle_x); + + glMatrixMode(GL_MODELVIEW); + + glPolyFmt(POLY_ALPHA(31) | POLY_CULL_NONE); + + glBindTexture(0, textureID); + + glColor3f(1, 1, 1); + + glBegin(GL_QUADS); + + GFX_TEX_COORD = (TEXTURE_PACK(0, inttot16(128))); + glVertex3v16(floattov16(-1), floattov16(-1), 0); + + GFX_TEX_COORD = (TEXTURE_PACK(inttot16(128),inttot16(128))); + glVertex3v16(floattov16(1), floattov16(-1), 0); + + GFX_TEX_COORD = (TEXTURE_PACK(inttot16(128), 0)); + glVertex3v16(floattov16(1), floattov16(1), 0); + + GFX_TEX_COORD = (TEXTURE_PACK(0,0)); + glVertex3v16(floattov16(-1), floattov16(1), 0); + + glEnd(); + + + glPopMatrix(1); + + glFlush(0); + } + + return 0; +} diff --git a/examples/libxm7/play_songs/.gitignore b/examples/libxm7/play_songs/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/libxm7/play_songs/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/libxm7/play_songs/architectds b/examples/libxm7/play_songs/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/libxm7/play_songs/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/libxm7/play_songs/arm7/source/main.c b/examples/libxm7/play_songs/arm7/source/main.c new file mode 100644 index 0000000..3ae4e95 --- /dev/null +++ b/examples/libxm7/play_songs/arm7/source/main.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: Zlib +// +// Copyright (C) 2005 Michael Noland (joat) +// Copyright (C) 2005 Jason Rogers (Dovoto) +// Copyright (C) 2005-2015 Dave Murphy (WinterMute) +// Copyright (C) 2023 Antonio Niño Díaz + +#include +#include +#include + +// Assign FIFO_USER_07 channel to libxm7 +#define FIFO_XM7 (FIFO_USER_07) + +volatile bool exit_loop = false; + +void power_button_callback(void) +{ + exit_loop = true; +} + +void vblank_handler(void) +{ + inputGetAndSend(); + Wifi_Update(); +} + +void XM7_Value32Handler(u32 command, void *userdata) +{ + XM7_ModuleManager_Type *module = (XM7_ModuleManager_Type *)command; + + if (module == NULL) + XM7_StopModule(); + else + XM7_PlayModule(module); +} + +int main(int argc, char *argv[]) +{ + // Initialize sound hardware + enableSound(); + + // Read user information from the firmware (name, birthday, etc) + readUserSettings(); + + // Stop LED blinking + ledBlink(0); + + // Using the calibration values read from the firmware with + // readUserSettings(), calculate some internal values to convert raw + // coordinates into screen coordinates. + touchInit(); + + irqInit(); + irqSet(IRQ_VBLANK, vblank_handler); + + fifoInit(); + + installWifiFIFO(); + installSoundFIFO(); + installSystemFIFO(); // Sleep mode, storage, firmware... + + // This sets a callback that is called when the power button in a DSi + // console is pressed. It has no effect in a DS. + setPowerButtonCB(power_button_callback); + + // Read current date from the RTC and setup an interrupt to update the time + // regularly. The interrupt simply adds one second every time, it doesn't + // read the date. Reading the RTC is very slow, so it's a bad idea to do it + // frequently. + initClockIRQTimer(3); + + irqEnable(IRQ_VBLANK); + + // Initialize libxm7. It uses timer 1 internally. + XM7_Initialize(); + // Setup the FIFO handler for libXM7 + fifoSetValue32Handler(FIFO_XM7, XM7_Value32Handler, 0); + + while (!exit_loop) + { + const uint16_t key_mask = KEY_SELECT | KEY_START | KEY_L | KEY_R; + uint16_t keys_pressed = ~REG_KEYINPUT; + + if ((keys_pressed & key_mask) == key_mask) + exit_loop = true; + + swiWaitForVBlank(); + } + + return 0; +} diff --git a/examples/libxm7/play_songs/arm9/source/main.c b/examples/libxm7/play_songs/arm9/source/main.c new file mode 100644 index 0000000..e58a719 --- /dev/null +++ b/examples/libxm7/play_songs/arm9/source/main.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2023 + +#include +#include +#include + +#include + +// XM module by Lasse. Obtained from the original libxm7 example by sverx +#include + +// Parallax Glacier by Raina: +// http://modarchive.org/index.php?request=view_by_moduleid&query=163194 +#include + +// Assign FIFO_USER_07 channel to libxm7 +#define FIFO_XM7 (FIFO_USER_07) + +void song_start(XM7_ModuleManager_Type *module) +{ + fifoSendValue32(FIFO_XM7, (u32)module); +} + +void song_stop(void) +{ + fifoSendValue32(FIFO_XM7, 0); +} + +// You can also allocate this with malloc() +static XM7_ModuleManager_Type module[2]; + +int main(int argc, char **argv) +{ + consoleDemoInit(); + + printf("libXM7 example\n"); + printf("==============\n"); + printf("\n"); + printf("X: haen pyykit by Lasse\n"); + printf("Y: Parallax Glacier by Raina\n"); + printf("\n"); + printf("B: Stop song\n"); + printf("\n"); + printf("START: Return to loader\n"); + + bool songs_loaded = true; + + u16 res; + + res = XM7_LoadXM(&module[0], lasse_haen_pyykit_xm); + if (res != 0) + { + printf("libxm7 error (module 0): 0x%04x\n", res); + songs_loaded = false; + } + + res = XM7_LoadXM(&module[1], parallax_80599_xm); + if (res != 0) + { + printf("libxm7 error (module 1): 0x%04x\n", res); + songs_loaded = false; + } + + // Ensure that the ARM7 can see the libxm7 initialized data + DC_FlushAll(); + + soundEnable(); + + bool playing = false; + + while (1) + { + swiWaitForVBlank(); + + scanKeys(); + + uint16_t keys_down = keysDown(); + + if (songs_loaded) + { + if (keys_down & KEY_B) + { + if (playing) + { + song_stop(); + playing = false; + } + } + + if (keys_down & KEY_X) + { + if (playing) + song_stop(); + + song_start(&module[0]); + playing = true; + } + if (keys_down & KEY_Y) + { + if (playing) + song_stop(); + + song_start(&module[1]); + playing = true; + } + } + + if (keys_down & KEY_START) + break; + } + + XM7_UnloadXM(&module[0]); + XM7_UnloadXM(&module[1]); + + soundDisable(); + + return 0; +} diff --git a/examples/libxm7/play_songs/build.py b/examples/libxm7/play_songs/build.py new file mode 100644 index 0000000..35e8290 --- /dev/null +++ b/examples/libxm7/play_songs/build.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +arm9 = Arm9Binary( + sourcedirs=['arm9/source'], + libs=['nds9', 'xm79'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDS}/libs/libxm7'] +) +arm9.add_data(['music']) +arm9.generate_elf() + +arm7 = Arm7Binary( + sourcedirs=['arm7/source'], + libs=['nds7', 'xm77', 'dswifi7'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDS}/libs/libxm7', + '${BLOCKSDS}/libs/dswifi'] +) +arm7.generate_elf() + +nds = NdsRom( + binaries=[arm9, arm7], + game_title='LIBXM7 example', + game_subtitle='how to use LIBXM7', + game_author='(sverx, 2009-01-07)' +) +nds.generate_nds() + +nds.run_command_line_arguments() + diff --git a/examples/libxm7/play_songs/music/lasse_haen_pyykit.xm b/examples/libxm7/play_songs/music/lasse_haen_pyykit.xm new file mode 100644 index 0000000..33c7025 Binary files /dev/null and b/examples/libxm7/play_songs/music/lasse_haen_pyykit.xm differ diff --git a/examples/libxm7/play_songs/music/parallax_80599.xm b/examples/libxm7/play_songs/music/parallax_80599.xm new file mode 100644 index 0000000..59387ee Binary files /dev/null and b/examples/libxm7/play_songs/music/parallax_80599.xm differ diff --git a/examples/maxmod/audio_as_data/.gitignore b/examples/maxmod/audio_as_data/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/maxmod/audio_as_data/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/maxmod/audio_as_data/architectds b/examples/maxmod/audio_as_data/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/maxmod/audio_as_data/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/maxmod/audio_as_data/audio/music/joint_people.mod b/examples/maxmod/audio_as_data/audio/music/joint_people.mod new file mode 100644 index 0000000..b585b8f Binary files /dev/null and b/examples/maxmod/audio_as_data/audio/music/joint_people.mod differ diff --git a/examples/maxmod/audio_as_data/audio/sfx/fire_explosion.wav b/examples/maxmod/audio_as_data/audio/sfx/fire_explosion.wav new file mode 100644 index 0000000..75b9ace Binary files /dev/null and b/examples/maxmod/audio_as_data/audio/sfx/fire_explosion.wav differ diff --git a/examples/maxmod/audio_as_data/build.py b/examples/maxmod/audio_as_data/build.py new file mode 100644 index 0000000..8bf0a35 --- /dev/null +++ b/examples/maxmod/audio_as_data/build.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'mm9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDS}/libs/maxmod'] +) +arm9.add_mmutil(['audio']) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9], + game_title='maxmod example', + game_subtitle='Audio as data', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/maxmod/audio_as_data/source/main.c b/examples/maxmod/audio_as_data/source/main.c new file mode 100644 index 0000000..f32bef0 --- /dev/null +++ b/examples/maxmod/audio_as_data/source/main.c @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 + +#include + +#include +#include + +// Headers autogenerated when files are find inside AUDIODIRS in the Makefile +#include "maxmod/soundbank_info.h" +#include "maxmod/soundbank_bin.h" + +int main(int argc, char **argv) +{ + // Setup sub screen for the text console + consoleDemoInit(); + + // Setup sound bank + mmInitDefaultMem((mm_addr)soundbank_bin); + + // load the module + mmLoad(MOD_JOINT_PEOPLE); + + // load sound effects + mmLoadEffect(SFX_FIRE_EXPLOSION); + + // Start playing module + mmStart(MOD_JOINT_PEOPLE, MM_PLAY_LOOP); + + // Clear console + printf("\x1b[2J"); + + printf("Maxmod demo\n"); + printf("===========\n"); + printf("\n"); + printf("A: Play SFX\n"); + printf("START: Exit to loader\n"); + printf("\n"); + + while (1) + { + // Synchronize game loop to the screen refresh + swiWaitForVBlank(); + + // Print some text in the demo console + // ----------------------------------- + + // Handle user input + // ----------------- + + scanKeys(); + + uint16_t keys = keysHeld(); + uint16_t keys_down = keysDown(); + + if (keys_down & KEY_A) + mmEffect(SFX_FIRE_EXPLOSION); + + if (keys & KEY_START) + break; + } + + return 0; +} diff --git a/examples/maxmod/audio_in_nitrofs/.gitignore b/examples/maxmod/audio_in_nitrofs/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/maxmod/audio_in_nitrofs/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/maxmod/audio_in_nitrofs/architectds b/examples/maxmod/audio_in_nitrofs/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/maxmod/audio_in_nitrofs/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/maxmod/audio_in_nitrofs/audio/music/joint_people.mod b/examples/maxmod/audio_in_nitrofs/audio/music/joint_people.mod new file mode 100644 index 0000000..b585b8f Binary files /dev/null and b/examples/maxmod/audio_in_nitrofs/audio/music/joint_people.mod differ diff --git a/examples/maxmod/audio_in_nitrofs/audio/music/joint_people.txt b/examples/maxmod/audio_in_nitrofs/audio/music/joint_people.txt new file mode 100644 index 0000000..73f5360 --- /dev/null +++ b/examples/maxmod/audio_in_nitrofs/audio/music/joint_people.txt @@ -0,0 +1,5 @@ +Name: jointpeople +Author: Anadune & Floppy +License: Mod Archive Distribution license + +https://modarchive.org/index.php?request=view_by_moduleid&query=115447 diff --git a/examples/maxmod/audio_in_nitrofs/audio/music/mod-archive-faq.txt b/examples/maxmod/audio_in_nitrofs/audio/music/mod-archive-faq.txt new file mode 100644 index 0000000..a8a7197 --- /dev/null +++ b/examples/maxmod/audio_in_nitrofs/audio/music/mod-archive-faq.txt @@ -0,0 +1,52 @@ +Original site: https://modarchive.org/index.php?faq-licensing + +=============================================================================== + +Licensing Modules and Copyright + +- Who owns the copyrights to the modules? + +The composers do - unless the Public Domain license attribution has been +specifically attributed in which case you are free to do with the module +whatever you like. + +- Can I use a module of modarchive.org in my game/application/etc...? + +If the module in question has license deeds attributed to it, please refer to +those. + +Otherwise, the only way to be genuinely fair to the artist who's music you want +to use is to contact them and get their permission. We can't grant permissions +on their behalf. Period. + +- Can I redistribute the module in its original unmodified form? + +Yes. All uploads to the site are governed by an upload agreement of which one of +the terms is the right to redistribute the original unmodified module file. This +does not cover inclusion in a packed/bundled application or game. See previous +item. + +- The contact information isn't in the module, what can I do to contact the +artist? + +You can try using the modarchive.org forums, specifically the Wanted: forum. +Search the Internet, do some homework. If you fail to find the necessary +information then you are pretty much out of luck. + +- I can't get in contact with an artist who's music I want to use, what now? + +It's up to you how you proceed. We will not condone illegal use of someone's +works, but if you still wish to continue to use that particular piece of music +in your project, then you take on those risks yourself. + +If your project is small and free (non commercial) then it's wise to give clear +and concise due credit to the artist in your production. If your production is +for commercial purposes then you are technically left with no other choice than +to find a different module where the artist has attributed a compatible license, +or is contactable - or go out on a limb and ask to have someone compose a custom +module for your project. + +- Where can I find the license attribution information on a module? + +Look on a module's information page, there is a section dedicated to the License +Attribution information. diff --git a/examples/maxmod/audio_in_nitrofs/audio/music/mod-archive-terms.txt b/examples/maxmod/audio_in_nitrofs/audio/music/mod-archive-terms.txt new file mode 100644 index 0000000..5bc140f --- /dev/null +++ b/examples/maxmod/audio_in_nitrofs/audio/music/mod-archive-terms.txt @@ -0,0 +1,287 @@ +Original site: https://modarchive.org/index.php?terms + +=============================================================================== + +Terms & Disclaimer + +Revised 2014-04-30 + +Cookies + +By using our website, you agree to the use of cookies and other technologies as +set out in this policy. If you do not agree to such use, please refrain from +using the website. We use cookies to manage your experience on the site, without +these you may suffer from lack of functionality, these are not used to track +you. + +Legalese. + +1.1 LEGAL LIABILITY. By providing a song/file to our server you acknowledge that +you may be held liable if the uploaded material is in any way illegal. You agree +that you will notify The Mod Archive with no unnecessary delays should it at a +later point be revealed that a song/file previously uploaded was illegally +distributed, has illegal contents or is in some other way illegal to distribute. + +1.3 AGREEMENT TERM AND TERMINATION. This Agreement is non-terminable and may not +be cancelled by any party. Modified versions of this document may follow, but +this Agreement shall remain in effect for any songs/files uploaded under this +Agreement. + +1.4 AGREEMENT SCOPE. This Agreement sets forth the entire understanding and +agreement of the parties as to this Agreement's subject matter and supersedes +all prior proposals, discussions or agreements with respect to such subject +matter. All headings in the Agreement are for convenience only and shall have no +legal or contractual effect. Should we choose not to exercise or enforce any +right or provision of this Agreement, this shall not constitute a waiver of such +right or provisions. You agree that you and we are independent contractors under +this Agreement, and nothing in this Agreement shall be used to create a +partnership, or joint venture. + +1.5 LINK TO THIRD PARTIES: The Website may contain links to websites operated by +third parties ("Third Party Websites"). The Mod Archive does not have any +influence or control over any such Third Party Websites and, unless otherwise +stated, is not responsible for and does not endorse any Third Party Websites or +their availability or contents. + +1.6 CONTENT: The Mod Archive does not in any way guarantee the accuracy of the +information contained on the website nor does it guarantee that such information +will be free of objectionable content or free of content which is unsuitable for +minors. + +2.1 We reserve the right to change these Terms of Service without notice. You +are responsible for regularly reviewing these Terms of Service. Continued use of +The Mod Archive after any such changes shall constitute your consent to such +changes. The Mod Archive does not and will not assume any obligation to notify +you of any changes to the Terms of Service. + +3. GENERAL RULES RELATING TO CONDUCT: The Website Service is made available for +your own, personal use. The Website Service must not be used for any commercial +purpose whatsoever or for any illegal or unauthorised purpose. When you use the +Website Service you must comply with all applicable Dutch laws relating to +online conduct (including, without limitation, content which can be posted +online) and with any applicable international laws, including the local laws in +your country of residence (together referred to as "Applicable Laws"). + +4. CONTENT SUBMITTED TO THE WEBSITE: You are responsible for any information, +data, text, music, software, sound, photographs, graphics, video, messages or +other content ("Content") which you post or upload and/or display (in public or +privately) to the Website. The Mod Archive may (but shall not be obliged to) +delete, edit, lock, move or remove any Content without notice and for any reason +and/or to record the IP address from which any Content is posted, uploaded +and/or displayed without notice and for any reason, including, without +limitation, Content which, in our sole discretion, violates these Terms or is or +may be irrelevant, out of date, inappropriate or objectionable in any way +whatsoever, or in respect of which The Mod Archive receives any complaint +(whether justified or not). By posting, uploading and/or displaying any Content +to the Website you warrant that: (a) you own all intellectual property and +proprietary rights in such Content or that you have a licence from the owner of +such rights to post, upload and/or display such Content on the Website; and (b) +the posting, uploading and/or displaying of such Content on the Website and the +grant of the licence to The Mod Archive (on the terms set out below) will not +infringe the intellectual property or proprietary rights of any third party. + +If you upload, post or otherwise transmit any Content to the Website, you +automatically: (a) grant other users of the Website and the Website Service the +right to access the same and use it in accordance with these Terms, and (b) +grant The Mod Archive a non-exclusive, royalty free, sub-licensable, perpetual, +world-wide licence to use, modify, publish, publicly perform, publicly display +and distribute such Content on and through the Website and the Website Service +and in any other form or medium. You continue to own the Content after it is +posted to the Website. + +You acknowledge that The Mod Archive will not screen or otherwise check any +Content (with the exception of module uploads) which is submitted by you or any +other user of the Website Service before it is posted, not monitor yours or any +person’s use of the Website Service. As such, you as the user of the Website +Service are responsible for any Content you submit to the Website and the manner +in which the Website Service is used under your username. If you become aware of +any misuse of the Website Service by any person including (without limitation) +any posting of Content which violates these Terms, please contact us by +following the instructions set out in paragraph 11 of these Terms. + +5. SPECIFIC RULES RELATING TO CONDUCT: You agree that when using the Website +Service you will comply with all Applicable Laws (as defined in paragraph 3), +these Terms and you acknowledge that you are responsible for all acts and +omissions which occur under your user-name. In particular, but without +limitation, you agree not to: + + a. Upload, post or otherwise display Content which is or promotes behaviour + which violates the rights (including, without limitation, the intellectual + property rights) of a third party or which is unlawful, harmful, + threatening, abusive, flaming, hateful, offensive (whether in relation to + sex, race, religion or otherwise) harassing, hateful, defamatory, vulgar, + obscene, invasive of another's privacy, solicits personal information from + anyone under the age of 18 years, or contains any illegal content; or + + b. Upload, post or otherwise display any Content which contains software + viruses or any other files or programs that may interrupt, destroy or limit + the functionality of the Website or the Website Service or any server or + networks connected to the Website or another's computer, or that contains + any chain letters, pyramid-selling schemes, bulk mail, junk mail or similar; + or + + c. Upload, post or otherwise display any Content containing a photograph of + another person unless you have obtained that person’s consent; + + d. Harvest or collect any IP addresses or email addresses or other contact + information of any members of the Website, by electronic means or otherwise; + or + + e. Upload, post or otherwise display any Content for any commercial or + business purpose including (without limitation) any Content which contains + any advertising or promotional materials; or + + f. Restrict or in any way inhibit any other person’s use of the Website or + the Website Service; or + + g. Upload, post or otherwise display any Content which is false, misleading, + un-necessary and/or repetitive including any Content which is inaccurate, + out of date or repeats that previously uploaded, posted or displayed by you + or another visitor, unless absolutely necessary; or + + h. Upload, post or otherwise transmit any Content to a part of the Website + which is irrelevant to the subject matter of the Content; or + + i. Register an account with us under more than one user name and/or user + account number; or + + j. Use the Website or the Website Service in a manner that is inconsistent + with these Terms and/or any Applicable Laws in force from time to time or in + a manner which promotes or encourages illegal activity; or + + k. Breach the terms of any suspension or ban or seek alternative access; or + + l. In the interests of free speech, bring any action for defamation against + The Mod Archive, or any of the companies in the same group; or + + m. Use or solicit any other account holder’s personal data for any purpose + other than establishing non-commercial, lawful contact that such account + holder would reasonably expect to welcome; or + + n. Submit Content owned by a third party without consent from that third + party or submit Content in a manner which expressly or impliedly infers that + such Content is sponsored or endorsed by the Website; or + + o. Use the Website in any unlawful manner or in a manner which promotes or + encourages illegal activity or in a manner which could damage, disable, + overburden or impair the Website or the Website Service; or + + p. Attempt to gain unauthorised access to the Website or any networks, + servers or computer systems connected to the Website; or + + q. Modify, adapt, translate or reverse engineer any part of the Website or + use any robot, spider, site search/retrieval application or other device to + retrieve or index any part of the Website or re-format or frame any portion + of the web pages comprising the Website, unless permitted by law; or + + r. Remove or obstruct from view any advertisements and/or any copyright, + trademark or other proprietary notices contained on or in the Website; or + + s. Contact any other user of the Website if they have expressly asked you + not to; or + + t. Attempt to impersonate any other user or account holder of the Website or + the Website Service; or + + u. Use the username and/or password of any other account holder of the + Website or disclose your password to any other person; or + + v. Upload, post or otherwise display any Content comprising an advertisement + or accept payment or anything of value from any person in exchange for you + uploading, posting or displaying any Content or otherwise performing any + commercial activity on or through the Website or the Website Service on + behalf of such person (including, without limitation, posting + blogs/comments/profiles or bulletins for a commercial purpose and/or sending + messages to other users of the Website with a commercial purpose). + + +You agree to indemnify The Mod Archive in full and on demand from and against +any loss, damage, costs or expenses which they suffer or incur directly or +indirectly as a result of your use of the Website and/or the Website Service, +and any use of the same under your username other than in accordance with these +Terms or Applicable Law. + +6. DISCLAIMER / LIABILITY: USE OF THE WEBSITE AND/OR THE WEBSITE SERVICE IS AT +YOUR OWN RISK. THE WEBSITE AND THE WEBSITE SERVICE IS PROVIDED ON AN “AS IS” +BASIS. TO THE MAXIMUM EXTENT PERMITTED BY LAW: (A) THE MOD ARCHIVE DISCLAIMS ALL +LIABILITY WHATSOEVER, WHETHER ARISING IN CONTRACT, TORT (INCLUDING NEGLIGENCE) +OR OTHERWISE IN RELATION TO THE WEBSITE AND/OR THE WEBSITE SERVICE; AND (B) ALL +IMPLIED WARRANTIES, TERMS AND CONDITIONS RELATING TO THE WEBSITE AND/OR THE +WEBSITE SERVICE (WHETHER IMPLIED BY STATUE, COMMON LAW OR OTHERWISE), INCLUDING +(WITHOUT LIMITATION) ANY WARRANTY, TERM OR CONDITION AS TO ACCURACY, +COMPLETENESS, SATISFACTORY QUALITY, PERFORMANCE, FITNESS FOR PURPOSE OR ANY +SPECIAL PURPOSE, AVAILABILITY, NON INFRINGEMENT, INFORMATION ACCURACY, +INTEROPERABILITY, QUIET ENJOYMENT AND TITLE ARE, AS BETWEEN THE MOD ARCHIVE AND +YOU, HEREBY EXCLUDED. IN PARTICULAR, BUT WITHOUT PREJUDICE TO THE FOREGOING, WE +ACCEPT NO RESPONSIBILITY FOR THE CONDUCT OF ANY USER AND/OR ACCOUNT HOLDER OF +THE WEBSITE AND/OR WEBSITE SERVICE; ANY ERROR, DELAY OR FAILURE IN THE +TRANSMISSION OF ANY COMMUNICATION BETWEEN USERS AND/OR ACCOUNT HOLDERS; ANY +TECHNICAL FAILURE OF THE INTERNET, THE WEBSITE AND/OR THE WEBSITE SERVICE; OR +ANY DAMAGE OR INJURY TO USERS OR THEIR EQUIPMENT AS A RESULT OF OR RELATING TO +THEIR USE OF THE WEBSITE OR THE WEBSITE SERVICE. YOUR STATUTORY RIGHTS ARE NOT +AFFECTED. + +The Mod Archive will not be liable, in contract, tort (including, without +limitation, negligence), under statute or otherwise, as a result of or in +connection with the Website and/or the Website Service, for any: (i) economic +loss (including, without limitation, loss of revenues, profits, contracts, +business or anticipated savings); or (ii) loss of goodwill or reputation; or +(iii) special or indirect or consequential loss. + +Nothing in these Terms shall be construed as excluding or limiting the liability +of The Mod Archive for death or personal injury caused by its negligence or for +any other liability which cannot be excluded by Dutch law. + +7. ACCESS RESTRICTION AND SERVICE SUSPENSION OR TERMINATION: The Mod Archive +reserves the right in its sole discretion to deny you access to the Website +and/or the Website Service, or any part thereof, with or without notice and for +any reason including, without limitation, if you fail to comply with any clause +5 (Member Conduct) or any other provision of these Terms. In particular, The Mod +Archive may deny you access to the Website and/or the Website Services if The +Mod Archive exercises its right to delete, edit, lock or remove any Content +posted, uploaded or displayed by you. The Mod Archive reserves the right to +suspend or cease providing all or any of the Website Service, without notice, +and shall have no liability or responsibility to you in any manner whatsoever if +it chooses to do so. + +8. ADVERTISERS ON THE WEBSITE: We accept no responsibility for adverts posted on +the Website. If you agree to purchase goods and/or services from any third party +who advertises on the Website, you do so at your own risk. The advertiser, not +The Mod Archive, is responsible for such goods and/or services and if you have +any queries or complaints in relation to them, your only recourse is against the +advertiser. + +9. ACCOUNT HOLDER INTERACTION You are responsible for how you interact with +other account holders and users of the Website and the Website Service. We +reserve the right, but have no obligation, to monitor how you interact with +those persons. + +10 GENERAL: These Terms (as amended from time to time) constitute the entire +agreement between you and The Mod Archive concerning your use of the Website and +the Website Service and supersede any previous arrangement, agreement, +undertaking or proposal, written or oral between you and The Mod Archive in +relation to such matters. The Mod Archive reserves the right to update these +Terms from time to time. If it does so, the updated version will be effective as +soon as it is uploaded on to this the Website and your continued use of the +Website Service following any changes constitutes your acceptance of the new +Terms. You are responsible for regularly reviewing these Terms so that you are +aware of any changes to them. No other variation to these Terms shall be +effective unless in writing and signed by an authorised representative on behalf +of The Mod Archive. These Terms shall be governed by and construed in +accordance with Dutch law and you agree to submit to the exclusive jurisdiction +of the Dutch Courts in relation to any dispute arising out of or relating to +these Terms and/or your use of the Website and/or the Website Service. If any +provision(s) of these Terms is held by a court of competent jurisdiction to be +invalid or unenforceable, then such provision(s) shall be construed, as nearly +as possible, to reflect the intentions of the parties (as reflected in the +provision(s)) and all other provisions shall remain in full force and effect. +The Mod Archive's failure to exercise or enforce any right or provision of these +Terms shall not constitute a waiver of such right or provision unless +acknowledged and agreed to by The Mod Archive in writing. Unless otherwise +expressly stated, nothing in the Terms shall create any rights or any other +benefits whether pursuant to the Contracts (Rights of Third Parties) Act 1999 or +otherwise in favour of any person other than you and The Mod Archive. + +11. CONTACT: For support and help, use the appropriate forum within the site +forums. + diff --git a/examples/maxmod/audio_in_nitrofs/audio/music/mod-archive.txt b/examples/maxmod/audio_in_nitrofs/audio/music/mod-archive.txt new file mode 100644 index 0000000..dfed88e --- /dev/null +++ b/examples/maxmod/audio_in_nitrofs/audio/music/mod-archive.txt @@ -0,0 +1,79 @@ +Original site: https://modarchive.org/index.php?terms-upload + +=============================================================================== + +Mod Archive Upload Terms, Conditions and License Agreement + +Version 2.2 as of April 29th, 2009 + +This Agreement describes the legal relationship between you (an individual +providing material by uploading songs or other files to the modarchive.org/com +server) and the modarchive.org/com server operators ("us", "we" in the following +text). Please read this document carefully. As this document is modified, the +new version will apply to any files uploaded later than that date, but will not +be applicable to previously uploaded files (see section 3.3). + +Section 1: Copyright holders + + 1.1, General license. By providing a song/file to us, if you are the + copyright holder of the song/file in question, you agree to grant us a + non-exclusive, royalty-free, non-retractable non-terminable, worldwide + license to: a) Distribute your song/file on the modarchive.org/com web site + or in any other form of distribution that we deem appropriate. b) Publicly + display, publicly perform, broadcast, encode, transmit, reproduce, + manufacture and distribute your song/file in whole or in part, alone or in + compilation with content provided by third parties, through any medium now + known or hereafter devised. c) Apply non-destructive and non-changing + compression systems to decrease the file sizes of the files uploaded to us. + + 1.2, License to redistribute. By providing a song/file to modarchive.org/com + you furthermore agree to give anyone who wishes to redistribute your + song/file a license to download the song/file from modarchive.org/com and do + so, provided it has stayed in its original, unmodified, unbundled form. + + Note: If you are visitor looking for information about using modules in your + productions i.e games/applications, please see the Licensing FAQ in file + mod-archive-faq.txt. + + 1.3, Ownership of Copyrights. You retain ownership of the copyrights and all + other rights in the song/file provided to us, subject only to the + non-exclusive rights granted to us under this Agreement. You are free to + grant similar rights to others. + + +Section 2: Non-copyright holders + + 2.1 License. By providing a song/file to us if you are not the copyright + holder of said song/file, you agree that you have previously secured a + license to redistribute the song, according to the terms of Section 1. + + 2.2 Copyright infringement. Furthermore you agree that you are fully + responsible for your action of providing the song to modarchive.org/com, and + that modarchive.org/com may hold you liable for any copyright infringement + caused by your uploading of the song/file to the modarchive.org/com server, + and thus that modarchive.org/com should not be held liable for any + consequences of your actions. + + +Section 3: General terms and conditions + + See file mod-archive-terms.txt. + +Section 4: Footnotes + + 4.1 Works in the public domain. Materials that have previously been + distributed under public domain license (for example, PD Disk Distributors) + are quite legal to upload to our servers as long as the material has not + been modified from its original state since release. Any works submitted to + The Mod Archive that are not uploaded by their creators or copyright holders + are assumed to be released into the public domain prior to upload and + therefore legally licensed for redistribution as Public Domain material by + The Mod Archive. Materials that have been uploaded but have been modified + since origin are submitted entirely at the uploaders own risk, where all + liabilities remain with the uploader concerning any legal implications that + arise from subsequent litigation should there be any incident where a party + has cause to complain. + + 4.2 Footnote disclaimer. Should any section of the footnoted contradict the + previous paragraphs in sections 1-3 inclusive, the paragraphs in sections + 1-3 inclusive take precedence. diff --git a/examples/maxmod/audio_in_nitrofs/audio/sfx/fire_explosion.jfxr b/examples/maxmod/audio_in_nitrofs/audio/sfx/fire_explosion.jfxr new file mode 100644 index 0000000..cc99196 --- /dev/null +++ b/examples/maxmod/audio_in_nitrofs/audio/sfx/fire_explosion.jfxr @@ -0,0 +1 @@ +{"_version":1,"_name":"fire_explosion","_locked":[],"sampleRate":44100,"attack":0,"sustain":0.027705693940245357,"sustainPunch":0,"decay":0.13257979056125957,"tremoloDepth":0,"tremoloFrequency":2.2776006915244977,"frequency":2095.7030570339975,"frequencySweep":-541.3667290180666,"frequencyDeltaSweep":-2800,"repeatFrequency":0,"frequencyJump1Onset":33,"frequencyJump1Amount":0,"frequencyJump2Onset":66,"frequencyJump2Amount":0,"harmonics":0,"harmonicsFalloff":0.5,"waveform":"whitenoise","interpolateNoise":false,"vibratoDepth":0,"vibratoFrequency":10,"squareDuty":50,"squareDutySweep":0,"flangerOffset":0,"flangerOffsetSweep":0,"bitCrush":16,"bitCrushSweep":0,"lowPassCutoff":22050,"lowPassCutoffSweep":0,"highPassCutoff":0,"highPassCutoffSweep":0,"compression":0.9,"normalization":true,"amplification":50} \ No newline at end of file diff --git a/examples/maxmod/audio_in_nitrofs/audio/sfx/fire_explosion.wav b/examples/maxmod/audio_in_nitrofs/audio/sfx/fire_explosion.wav new file mode 100644 index 0000000..75b9ace Binary files /dev/null and b/examples/maxmod/audio_in_nitrofs/audio/sfx/fire_explosion.wav differ diff --git a/examples/maxmod/audio_in_nitrofs/build.py b/examples/maxmod/audio_in_nitrofs/build.py new file mode 100644 index 0000000..7c59f81 --- /dev/null +++ b/examples/maxmod/audio_in_nitrofs/build.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +# The header of the soundbank in NitroFS must be added as a dependency of the ARM9 +nitrofs_soundbank_header = nitrofs.add_mmutil(['audio']) +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'mm9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDS}/libs/maxmod'] +) +arm9.add_header_dependencies([nitrofs_soundbank_header]) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='maxmod example', + game_subtitle='Audio in NitroFS', +) +nds.generate_nds() + +nds.run_command_line_arguments() + diff --git a/examples/maxmod/audio_in_nitrofs/source/main.c b/examples/maxmod/audio_in_nitrofs/source/main.c new file mode 100644 index 0000000..9310f29 --- /dev/null +++ b/examples/maxmod/audio_in_nitrofs/source/main.c @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 + +#include + +#include +#include +#include + +#include "nitrofs/soundbank_info.h" + +__attribute__((noreturn)) void WaitLoop(void) +{ + printf("Press START to exit"); + while (1) + { + swiWaitForVBlank(); + scanKeys(); + if (keysHeld() & KEY_START) + exit(0); + } +} + +int main(int argc, char **argv) +{ + // Setup sub screen for the text console + consoleDemoInit(); + + if (!nitroFSInit(NULL)) + { + printf("nitroFSInit failed.\n"); + WaitLoop(); + } + + // Setup sound bank + mmInitDefault("maxmod/soundbank.bin"); + + // load the module + mmLoad(MOD_JOINT_PEOPLE); + + // load sound effects + mmLoadEffect(SFX_FIRE_EXPLOSION); + + // Start playing module + mmStart(MOD_JOINT_PEOPLE, MM_PLAY_LOOP); + + // Clear console + printf("\x1b[2J"); + + printf("Maxmod demo\n"); + printf("===========\n"); + printf("\n"); + printf("A: Play SFX\n"); + printf("START: Exit to loader\n"); + printf("\n"); + + while (1) + { + // Synchronize game loop to the screen refresh + swiWaitForVBlank(); + + // Print some text in the demo console + // ----------------------------------- + + // Handle user input + // ----------------- + + scanKeys(); + + uint16_t keys = keysHeld(); + uint16_t keys_down = keysDown(); + + if (keys_down & KEY_A) + mmEffect(SFX_FIRE_EXPLOSION); + + if (keys & KEY_START) + break; + } + + return 0; +} diff --git a/examples/nflib/3dsprites/.gitignore b/examples/nflib/3dsprites/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/3dsprites/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/3dsprites/architectds b/examples/nflib/3dsprites/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nflib/3dsprites/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nflib/3dsprites/assets/bgtiled/bg3.png b/examples/nflib/3dsprites/assets/bgtiled/bg3.png new file mode 100644 index 0000000..fd1998a Binary files /dev/null and b/examples/nflib/3dsprites/assets/bgtiled/bg3.png differ diff --git a/examples/nflib/3dsprites/assets/bgtiled/nfl.png b/examples/nflib/3dsprites/assets/bgtiled/nfl.png new file mode 100644 index 0000000..baf2c90 Binary files /dev/null and b/examples/nflib/3dsprites/assets/bgtiled/nfl.png differ diff --git a/examples/nflib/3dsprites/assets/spr3d/blueball.png b/examples/nflib/3dsprites/assets/spr3d/blueball.png new file mode 100644 index 0000000..9570012 Binary files /dev/null and b/examples/nflib/3dsprites/assets/spr3d/blueball.png differ diff --git a/examples/nflib/3dsprites/assets/spr3d/redcar.png b/examples/nflib/3dsprites/assets/spr3d/redcar.png new file mode 100644 index 0000000..4132659 Binary files /dev/null and b/examples/nflib/3dsprites/assets/spr3d/redcar.png differ diff --git a/examples/nflib/3dsprites/build.py b/examples/nflib/3dsprites/build.py new file mode 100644 index 0000000..c65c0aa --- /dev/null +++ b/examples/nflib/3dsprites/build.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_tiled(['assets/bgtiled'], 'bg') +nitrofs.add_nflib_sprite_3d(['assets/spr3d'], 'sprite') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: 3D sprites', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/3dsprites/source/main.c b/examples/nflib/3dsprites/source/main.c new file mode 100644 index 0000000..4ab7f3b --- /dev/null +++ b/examples/nflib/3dsprites/source/main.c @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Basic 3D sprite example. +// http://www.nightfoxandco.com + +#include +#include + +#include +#include + +#include + +#define MAXSPRITES 32 + +int main(int argc, char **argv) +{ + // Set random seed based on the current time + srand(time(NULL)); + + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 3D engine in the top screen in mode 0 + NF_Set3D(0, 0); + + // Initialize 2D engine in the bottom screen in mode 0 + NF_Set2D(1, 0); + + // Initialize tiled backgrounds system + NF_InitTiledBgBuffers(); // Initialize storage buffers + NF_InitTiledBgSys(0); // Top screen + NF_InitTiledBgSys(1); // Bottom screen + + // Initialize 3D sprite system + NF_InitSpriteBuffers(); // Initialize storage buffers + NF_Init3dSpriteSys(); + + // Load background files from NitroFS + NF_LoadTiledBg("bg/nfl", "nfl", 256, 256); + NF_LoadTiledBg("bg/bg3", "bg3", 256, 256); + + // Load sprite files from NitroFS + NF_LoadSpriteGfx("sprite/blueball", 0, 64, 64); + NF_LoadSpritePal("sprite/blueball", 0); + NF_LoadSpriteGfx("sprite/redcar", 1, 128, 64); + NF_LoadSpritePal("sprite/redcar", 1); + + // Transfer the required sprites to VRAM + NF_Vram3dSpriteGfx(0, 0, true); + NF_Vram3dSpritePal(0, 0); + NF_Vram3dSpriteGfx(1, 1, true); + NF_Vram3dSpritePal(1, 1); + + // Create backgrounds in both screens + NF_CreateTiledBg(0, 3, "bg3"); + NF_CreateTiledBg(1, 3, "nfl"); + + // Variables + s16 x[MAXSPRITES]; + s16 y[MAXSPRITES]; + s16 ix[MAXSPRITES]; + s16 iy[MAXSPRITES]; + + // Initialize sprite variables and create the sprites + for (int n = 0; n < MAXSPRITES; n++) + { + int r = n % 2; + + x[n] = rand() % 128; + y[n] = rand() % 112; + if ((rand() % 100) > 50) + ix[n] = 1; + else + ix[n] = -1; + + if ((rand() % 100) > 50) + iy[n] = 1; + else + iy[n] = -1; + + NF_Create3dSprite(n, r, r, x[n], y[n]); + } + + // Sort their priorites based on their IDs (lower IDs have higher priority) + NF_Sort3dSprites(); + + while (1) + { + // Read keys + scanKeys(); + u16 keys = keysDown(); + + // Move sprites + for (int n = 0; n < MAXSPRITES; n++) + { + x[n] += ix[n]; + if ((x[n] < 0) || (x[n] > (255 - NF_3DSPRITE[n].width))) + ix[n] = -ix[n]; + + y[n] += iy[n]; + if ((y[n] < 0) || (y[n] > (191 - NF_3DSPRITE[n].height))) + iy[n] = -iy[n]; + + NF_Move3dSprite(n, x[n], y[n]); + } + + // Show or hide all sprites with even ID + if (keys & KEY_A) + { + for (int n = 0; n < MAXSPRITES; n += 2) + NF_Show3dSprite(n, true); + } + + if (keys & KEY_B) + { + for (int n = 0; n < MAXSPRITES; n += 2) + NF_Show3dSprite(n, false); + } + + // Draw all 3D sprites + NF_Draw3dSprites(); + + // Tell the GPU to draw the scene and wait until it's done + glFlush(0); + + // Wait for the screen refresh + swiWaitForVBlank(); + } + + return 0; +} diff --git a/examples/nflib/collisions/barrels/.gitignore b/examples/nflib/collisions/barrels/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/collisions/barrels/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/collisions/barrels/architectds b/examples/nflib/collisions/barrels/architectds new file mode 120000 index 0000000..001411d --- /dev/null +++ b/examples/nflib/collisions/barrels/architectds @@ -0,0 +1 @@ +../../../../architectds \ No newline at end of file diff --git a/examples/nflib/collisions/barrels/assets/bgtiled/pdemo_bg.png b/examples/nflib/collisions/barrels/assets/bgtiled/pdemo_bg.png new file mode 100644 index 0000000..e62e3e7 Binary files /dev/null and b/examples/nflib/collisions/barrels/assets/bgtiled/pdemo_bg.png differ diff --git a/examples/nflib/collisions/barrels/assets/colbg/pdemo_colmap.png b/examples/nflib/collisions/barrels/assets/colbg/pdemo_colmap.png new file mode 100644 index 0000000..3297504 Binary files /dev/null and b/examples/nflib/collisions/barrels/assets/colbg/pdemo_colmap.png differ diff --git a/examples/nflib/collisions/barrels/assets/sprite/whiteball.png b/examples/nflib/collisions/barrels/assets/sprite/whiteball.png new file mode 100644 index 0000000..a220ce1 Binary files /dev/null and b/examples/nflib/collisions/barrels/assets/sprite/whiteball.png differ diff --git a/examples/nflib/collisions/barrels/build.py b/examples/nflib/collisions/barrels/build.py new file mode 100644 index 0000000..1f4eda4 --- /dev/null +++ b/examples/nflib/collisions/barrels/build.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_tiled(['assets/bgtiled'], 'bg') +nitrofs.add_nflib_colbg(['assets/colbg'], 'maps') +nitrofs.add_nflib_sprite_256(['assets/sprite'], 'sprite') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: Col. barrels', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/collisions/barrels/source/main.c b/examples/nflib/collisions/barrels/source/main.c new file mode 100644 index 0000000..ec2e5a3 --- /dev/null +++ b/examples/nflib/collisions/barrels/source/main.c @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Example of per-pixel collisions. +// http://www.nightfoxandco.com + +#include + +#include +#include + +#include + +int main(int argc, char **argv) +{ + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 2D engine in the top screen and use mode 0 + NF_Set2D(0, 0); + + // Initialize tiled backgrounds system + NF_InitTiledBgBuffers(); // Initialize storage buffers + NF_InitTiledBgSys(0); // Top screen + + // Initialize sprite system + NF_InitSpriteBuffers(); + NF_InitSpriteSys(0); // Top screen + + // Initialize collision map buffers + NF_InitCmapBuffers(); + + // Load background files from NitroFS + NF_LoadTiledBg("bg/pdemo_bg", "bg3", 256, 256); + + // Load sprite files from NitroFS + NF_LoadSpriteGfx("sprite/whiteball", 0, 16, 16); + NF_LoadSpritePal("sprite/whiteball", 0); + + // Load collision map files from NitroFS + NF_LoadCollisionBg("maps/pdemo_colmap", 0, 256, 256); + + // Create top screen background + NF_CreateTiledBg(0, 3, "bg3"); + + // Transfer the required sprites to VRAM + NF_VramSpriteGfx(0, 0, 0, true); + NF_VramSpritePal(0, 0, 0); + + // Create sprites and set their priority layer + for (int b = 0; b < 3; b++) + { + NF_CreateSprite(0, b, 0, 0, -16, -16); + NF_SpriteLayer(0, b, 3); + } + + // Location of the sprites + s16 x[3] = { 32, 228, 10 }; + s16 y[3] = { -16, 32, 100 }; + + // Coordinates of the sprite that have to be used as collision points + s16 py[16] = { + 11, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 15, 15, 14, 13, 11 + }; + + while (1) + { + // Clear text console + consoleClear(); + + bool down = false; + bool left = false; + bool right = false; + + // Handle collisions and fall of all balls + for (int b = 0; b < 3; b++) + { + down = true; // If this remains true, there is no collision + + // Check all pixels of the lower half of the ball to see if there is + // a collision. + for (int n = 0; n < 16; n++) + { + // Blue pixels are index 4 + if (NF_GetPoint(0, (x[b] + n), (y[b] + py[n])) == 4) + down = false; + } + + // Check for collisions left and right of the ball + right = true; + left = true; + + // Falling to the left + if (NF_GetPoint(0, (x[b] - 1), (y[b] + 16)) == 4) + left = false; + + // Falling to the right + if (NF_GetPoint(0, (x[b] + 16), (y[b] + 16)) == 4) + right = false; + + // On free fall, don't move on the X axis + if (left && right) + { + right = false; + left = false; + } + + // Free fall + if (down) + y[b]++; + + // Move right + if (right) + x[b]++; + + // Move left + if (left) + x[b]--; + + // If the ball exits the screen from the bottom move it to the top + if (y[b] > 192) + { + x[b] = 32; + y[b] = -16; + } + + // Set the sprite position + NF_MoveSprite(0, b, x[b], y[b]); + + // Print sprite coordinates + printf("x:%03d y:%03d\n", x[b], y[b]); + + } + + // Update OAM array + NF_SpriteOamSet(0); + + // Wait for the screen refresh + swiWaitForVBlank(); + + // Update OAM + oamUpdate(&oamMain); + } + + return 0; +} diff --git a/examples/nflib/collisions/pixels/.gitignore b/examples/nflib/collisions/pixels/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/collisions/pixels/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/collisions/pixels/architectds b/examples/nflib/collisions/pixels/architectds new file mode 120000 index 0000000..001411d --- /dev/null +++ b/examples/nflib/collisions/pixels/architectds @@ -0,0 +1 @@ +../../../../architectds \ No newline at end of file diff --git a/examples/nflib/collisions/pixels/assets/bgtiled/ppc_bg.png b/examples/nflib/collisions/pixels/assets/bgtiled/ppc_bg.png new file mode 100644 index 0000000..6066ae4 Binary files /dev/null and b/examples/nflib/collisions/pixels/assets/bgtiled/ppc_bg.png differ diff --git a/examples/nflib/collisions/pixels/assets/colbg/ppc_cmap.png b/examples/nflib/collisions/pixels/assets/colbg/ppc_cmap.png new file mode 100644 index 0000000..27c9a0e Binary files /dev/null and b/examples/nflib/collisions/pixels/assets/colbg/ppc_cmap.png differ diff --git a/examples/nflib/collisions/pixels/assets/sprite/pointer.png b/examples/nflib/collisions/pixels/assets/sprite/pointer.png new file mode 100644 index 0000000..d51cddf Binary files /dev/null and b/examples/nflib/collisions/pixels/assets/sprite/pointer.png differ diff --git a/examples/nflib/collisions/pixels/build.py b/examples/nflib/collisions/pixels/build.py new file mode 100644 index 0000000..6c93759 --- /dev/null +++ b/examples/nflib/collisions/pixels/build.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_tiled(['assets/bgtiled'], 'bg') +nitrofs.add_nflib_colbg(['assets/colbg'], 'maps') +nitrofs.add_nflib_sprite_256(['assets/sprite'], 'sprite') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: Col. pixels', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/collisions/pixels/source/main.c b/examples/nflib/collisions/pixels/source/main.c new file mode 100644 index 0000000..7906131 --- /dev/null +++ b/examples/nflib/collisions/pixels/source/main.c @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Collision background example +// http://www.nightfoxandco.com + +#include + +#include +#include + +#include + +int main(int argc, char **argv) +{ + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 2D engine in the top screen and use mode 0 + NF_Set2D(0, 0); + + // Initialize tiled backgrounds system + NF_InitTiledBgBuffers(); // Initialize storage buffers + NF_InitTiledBgSys(0); // Top screen + + // Initialize sprite system + NF_InitSpriteBuffers(); + NF_InitSpriteSys(0); // Top screen + + // Initialize collision map buffers + NF_InitCmapBuffers(); + + // Load background files from NitroFS + NF_LoadTiledBg("bg/ppc_bg", "bg3", 512, 512); + + // Load sprite files from NitroFS + NF_LoadSpriteGfx("sprite/pointer", 0, 8, 8); + NF_LoadSpritePal("sprite/pointer", 0); + + // Load collision map files from NitroFS + NF_LoadCollisionBg("maps/ppc_cmap", 0, 512, 512); + + // Create top screen background + NF_CreateTiledBg(0, 3, "bg3"); + + // Transfer the required sprites to VRAM + NF_VramSpriteGfx(0, 0, 0, true); + NF_VramSpritePal(0, 0, 0); + + // Create pointer sprite in the bottom screen and set its priority layer + NF_CreateSprite(0, 0, 0, 0, 124, 92); + NF_SpriteLayer(0, 0, 3); + + // Movement variables + s16 x = 128; + s16 y = 96; + s16 spr_x = 0; + s16 spr_y = 0; + s16 bg_x = 0; + s16 bg_y = 0; + + while (1) + { + scanKeys(); // Read keypad + u16 keys = keysHeld(); // Keys currently pressed + + if (keys & KEY_UP) + y--; + if (keys & KEY_DOWN) + y++; + if (keys & KEY_LEFT) + x--; + if (keys & KEY_RIGHT) + x++; + + // Movement limits + if (x < 0) + x = 0; + if (x > 511) + x = 511; + + if (y < 0) + y = 0; + if (y > 511) + y = 511; + + // Background position + bg_x = x - 128; + if (bg_x < 0) + bg_x = 0; + if (bg_x > 256) + bg_x = 256; + + bg_y = y - 96; + if (bg_y < 0) + bg_y = 0; + if (bg_y > 320) + bg_y = 320; + + // Sprite position + spr_x = (x - bg_x) - 4; + spr_y = (y - bg_y) - 4; + NF_MoveSprite(0, 0, spr_x, spr_y); + + // Print pointer position + consoleClear(); + printf("x:%03d y:%03d \n\n", x, y); + + // Print pixel color + u8 pixel = NF_GetPoint(0, x, y); + switch (pixel) + { + case 1: + printf("Tile: Negro / Black"); + break; + case 2: + printf("Tile: Rojo / Red"); + break; + case 3: + printf("Tile: Verde / Green"); + break; + case 4: + printf("Tile: Azul / Blue"); + break; + default: + printf("Value: %03d", pixel); + break; + } + + // Update OAM array + NF_SpriteOamSet(0); + + // Wait for the screen refresh + swiWaitForVBlank(); + + // Update OAM + oamUpdate(&oamMain); + + // Update scroll + NF_ScrollBg(0, 3, bg_x, bg_y); + } + + return 0; +} diff --git a/examples/nflib/collisions/tiles/.gitignore b/examples/nflib/collisions/tiles/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/collisions/tiles/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/collisions/tiles/architectds b/examples/nflib/collisions/tiles/architectds new file mode 120000 index 0000000..001411d --- /dev/null +++ b/examples/nflib/collisions/tiles/architectds @@ -0,0 +1 @@ +../../../../architectds \ No newline at end of file diff --git a/examples/nflib/collisions/tiles/assets/bgtiled/colmap.png b/examples/nflib/collisions/tiles/assets/bgtiled/colmap.png new file mode 100644 index 0000000..668dd45 Binary files /dev/null and b/examples/nflib/collisions/tiles/assets/bgtiled/colmap.png differ diff --git a/examples/nflib/collisions/tiles/assets/bgtiled/layer3.png b/examples/nflib/collisions/tiles/assets/bgtiled/layer3.png new file mode 100644 index 0000000..fd1998a Binary files /dev/null and b/examples/nflib/collisions/tiles/assets/bgtiled/layer3.png differ diff --git a/examples/nflib/collisions/tiles/assets/colmap/cmap.png b/examples/nflib/collisions/tiles/assets/colmap/cmap.png new file mode 100644 index 0000000..4b6a6ff Binary files /dev/null and b/examples/nflib/collisions/tiles/assets/colmap/cmap.png differ diff --git a/examples/nflib/collisions/tiles/assets/font/default.png b/examples/nflib/collisions/tiles/assets/font/default.png new file mode 100644 index 0000000..40b1f1f Binary files /dev/null and b/examples/nflib/collisions/tiles/assets/font/default.png differ diff --git a/examples/nflib/collisions/tiles/assets/sprite/pointer.png b/examples/nflib/collisions/tiles/assets/sprite/pointer.png new file mode 100644 index 0000000..d51cddf Binary files /dev/null and b/examples/nflib/collisions/tiles/assets/sprite/pointer.png differ diff --git a/examples/nflib/collisions/tiles/build.py b/examples/nflib/collisions/tiles/build.py new file mode 100644 index 0000000..e39de93 --- /dev/null +++ b/examples/nflib/collisions/tiles/build.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_tiled(['assets/bgtiled'], 'bg') +nitrofs.add_nflib_colmap(['assets/colmap'], 'maps') +nitrofs.add_nflib_font(['assets/font'], 'fnt') +nitrofs.add_nflib_sprite_256(['assets/sprite'], 'sprite') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: Col. tiles', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/collisions/tiles/source/main.c b/examples/nflib/collisions/tiles/source/main.c new file mode 100644 index 0000000..4b8aa4e --- /dev/null +++ b/examples/nflib/collisions/tiles/source/main.c @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Collision map example. +// http://www.nightfoxandco.com + +#include + +#include +#include + +#include + +int main(int argc, char **argv) +{ + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 2D engine in both screens and use mode 0 + NF_Set2D(0, 0); + NF_Set2D(1, 0); + + // Initialize tiled backgrounds system + NF_InitTiledBgBuffers(); // Initialize storage buffers + NF_InitTiledBgSys(0); // Top screen + NF_InitTiledBgSys(1); // Bottom screen + + // Initialize sprite system + NF_InitSpriteBuffers(); + NF_InitSpriteSys(0); // Top screen + NF_InitSpriteSys(1); // Bottom screen + + // Initialize text system + NF_InitTextSys(0); // Top screen + + // Initialize collision map buffers + NF_InitCmapBuffers(); + + // Load background files from NitroFS + NF_LoadTiledBg("bg/layer3", "moon", 256, 256); + NF_LoadTiledBg("bg/colmap", "boxes", 768, 512); + + // Load sprite files from NitroFS + NF_LoadSpriteGfx("sprite/pointer", 0, 8, 8); + NF_LoadSpritePal("sprite/pointer", 0); + + // Load text font files from NitroFS + NF_LoadTextFont("fnt/default", "normal", 256, 256, 0); + + // Load collision map files from NitroFS + NF_LoadCollisionMap("maps/cmap", 0, 768, 512); + + // Create top screen background + NF_CreateTiledBg(0, 3, "moon"); + + // Create bottom screen backgrounds + NF_CreateTiledBg(1, 3, "moon"); + NF_CreateTiledBg(1, 2, "boxes"); + + // Create a text layer + NF_CreateTextLayer(0, 2, 0, "normal"); + + // Transfer the required sprites to VRAM + NF_VramSpriteGfx(1, 0, 0, true); + NF_VramSpritePal(1, 0, 0); + + // Create pointer sprite in the bottom screen and set its priority layer + NF_CreateSprite(1, 0, 0, 0, 124, 92); + NF_SpriteLayer(1, 0, 2); + + // Movement variables + s16 x = 128; + s16 y = 96; + s16 spr_x = 0; + s16 spr_y = 0; + s16 bg_x = 0; + s16 bg_y = 0; + + // Buffer de texto + char mytext[32]; + + while (1) + { + scanKeys(); // Read keypad + u16 keys = keysHeld(); // Keys currently pressed + + if (keys & KEY_UP) + y--; + if (keys & KEY_DOWN) + y++; + if (keys & KEY_LEFT) + x--; + if (keys & KEY_RIGHT) + x++; + + // Limites del movimiento + if (x < 0) + x = 0; + if (x > 767) + x = 767; + + if (y < 0) + y = 0; + if (y > 511) + y = 511; + + // Background position + bg_x = x - 128; + if (bg_x < 0) + bg_x = 0; + if (bg_x > 512) + bg_x = 512; + + bg_y = y - 96; + if (bg_y < 0) + bg_y = 0; + if (bg_y > 320) + bg_y = 320; + + // Sprite position + spr_x = (x - bg_x) - 4; + spr_y = (y - bg_y) - 4; + NF_MoveSprite(1, 0, spr_x, spr_y); + + // Print pointer position + sprintf(mytext,"x:%d y:%d ", x, y); + NF_WriteText(0, 2, 1, 1, mytext); + + // Print tile number + switch (NF_GetTile(0, x, y)) + { + case 0: + sprintf(mytext,"Tile: Vacio / Void "); + break; + case 1: + sprintf(mytext,"Tile: Rojo / Red "); + break; + case 2: + sprintf(mytext,"Tile: Verde / Green "); + break; + case 3: + sprintf(mytext,"Tile: Azul / Blue "); + break; + } + NF_WriteText(0, 2, 1, 3, mytext); + + // Update text layers + NF_UpdateTextLayers(); + + // Update OAM array + NF_SpriteOamSet(1); + + // Wait for the screen refresh + swiWaitForVBlank(); + + // Update OAM + oamUpdate(&oamSub); + + // Update background scroll + NF_ScrollBg(1, 2, bg_x, bg_y); + } + + return 0; +} diff --git a/examples/nflib/graphics/affine/.gitignore b/examples/nflib/graphics/affine/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/graphics/affine/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/graphics/affine/architectds b/examples/nflib/graphics/affine/architectds new file mode 120000 index 0000000..001411d --- /dev/null +++ b/examples/nflib/graphics/affine/architectds @@ -0,0 +1 @@ +../../../../architectds \ No newline at end of file diff --git a/examples/nflib/graphics/affine/assets/bgaffine/flag512.png b/examples/nflib/graphics/affine/assets/bgaffine/flag512.png new file mode 100644 index 0000000..3d07cc8 Binary files /dev/null and b/examples/nflib/graphics/affine/assets/bgaffine/flag512.png differ diff --git a/examples/nflib/graphics/affine/assets/bgaffine_shared_pal_1/navygrid.png b/examples/nflib/graphics/affine/assets/bgaffine_shared_pal_1/navygrid.png new file mode 100644 index 0000000..5d9bce9 Binary files /dev/null and b/examples/nflib/graphics/affine/assets/bgaffine_shared_pal_1/navygrid.png differ diff --git a/examples/nflib/graphics/affine/assets/bgaffine_shared_pal_1/waves512.png b/examples/nflib/graphics/affine/assets/bgaffine_shared_pal_1/waves512.png new file mode 100644 index 0000000..2ba5c3f Binary files /dev/null and b/examples/nflib/graphics/affine/assets/bgaffine_shared_pal_1/waves512.png differ diff --git a/examples/nflib/graphics/affine/build.py b/examples/nflib/graphics/affine/build.py new file mode 100644 index 0000000..8cd8f7a --- /dev/null +++ b/examples/nflib/graphics/affine/build.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_affine(['assets/bgaffine'], 'bg') +nitrofs.add_nflib_bg_affine_shared_pal('assets/bgaffine_shared_pal_1', 'bg') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: Affine BGs', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/graphics/affine/source/main.c b/examples/nflib/graphics/affine/source/main.c new file mode 100644 index 0000000..7db304a --- /dev/null +++ b/examples/nflib/graphics/affine/source/main.c @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Affine backgrounds example +// http://www.nightfoxandco.com/ + +#include + +#include +#include + +#include + +// Function that runs after a scanline is drawn. By modifying the values of the +// fade registers it's possible to add a shading effect. +void hblank_handler(void) +{ + u32 vline = REG_VCOUNT; // Get the current line + + // If the current line is inside the screen + if (vline < 192) + { + // Calculate fade value based on the line + int fade = 0x0F - (((vline + 1) * 16) / 192); + + REG_BLDY = fade / 2; // Top screen + REG_BLDY_SUB = fade; // Bottom screen + } +} + +int main(int argc, char **argv) +{ + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 2D engine in both screens and use mode 2 + NF_Set2D(0, 2); + NF_Set2D(1, 2); + + // Initialize tiled backgrounds system + NF_InitTiledBgBuffers(); // Initialize storage buffers + NF_InitAffineBgSys(0); // Top screen + NF_InitAffineBgSys(1); // Bottom screen + + // Load background files from NitroFS + NF_LoadAffineBg("bg/waves512", "waves", 512, 512); + NF_LoadAffineBg("bg/navygrid", "grid", 256, 256); + NF_LoadAffineBg("bg/flag512", "flag", 512, 512); + + // Create top screen backgrounds + NF_CreateAffineBg(0, 3, "waves", 1); + NF_CreateAffineBg(0, 2, "grid", 0); + + // Create bottom screen backgrounds + NF_CreateAffineBg(1, 3, "flag", 1); + + // Register a function to be called after a screen line has been drawn (when + // the horizontal blanking period starts) + irqSet(IRQ_HBLANK, hblank_handler); + irqEnable(IRQ_HBLANK); + + // Movement variables + s32 x = 0; + s32 y = 0; + s32 angle = 0; + s32 zoom = 256; + + // Setup fading registers. The top screen fades to white and the bottom one + // fades to black. + REG_BLDCNT = BLEND_FADE_WHITE | BLEND_SRC_BG3; + REG_BLDCNT_SUB = BLEND_FADE_BLACK | BLEND_SRC_BG3; + + while (1) + { + scanKeys(); // Read keypad + u16 keys = keysHeld(); // Keys currently pressed + + // Move center of the backgrounds + if (keys & KEY_UP) + { + y -= 2; + if (y < 0) + y = 0; + } + if (keys & KEY_DOWN) + { + y += 2; + if (y > 512) + y = 512; + } + if (keys & KEY_LEFT) + { + x -= 2; + if (x < 0) + x = 0; + } + if (keys & KEY_RIGHT) + { + x += 2; + if (x > 512) + x = 512; + } + + // Change zoom + if (keys & KEY_A) + { + zoom -= 2; + if (zoom < 0) + zoom = 0; + } + if (keys & KEY_B) + { + zoom += 2; + if (zoom > 512) + zoom = 512; + } + + // Change angle + if (keys & KEY_X) + { + angle -= 2; + if (angle < 0) + angle += 2048; + } + if (keys & KEY_Y) + { + angle += 2; + if (angle > 2048) + angle -= 2048; + } + + // Wait for the screen refresh + swiWaitForVBlank(); + + // Update parameters of the affine backgrounds + for (int n = 0; n < 2; n++) + { + NF_AffineBgTransform(n, 3, zoom, zoom, 0, 0); + NF_AffineBgCenter(n, 3, x, y); + NF_AffineBgMove(n, 3, 0, 0, angle); + } + } + + return 0; +} diff --git a/examples/nflib/graphics/animatedbg/.gitignore b/examples/nflib/graphics/animatedbg/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/graphics/animatedbg/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/graphics/animatedbg/architectds b/examples/nflib/graphics/animatedbg/architectds new file mode 120000 index 0000000..001411d --- /dev/null +++ b/examples/nflib/graphics/animatedbg/architectds @@ -0,0 +1 @@ +../../../../architectds \ No newline at end of file diff --git a/examples/nflib/graphics/animatedbg/assets/bgtiled/nfl.png b/examples/nflib/graphics/animatedbg/assets/bgtiled/nfl.png new file mode 100644 index 0000000..baf2c90 Binary files /dev/null and b/examples/nflib/graphics/animatedbg/assets/bgtiled/nfl.png differ diff --git a/examples/nflib/graphics/animatedbg/assets/bgtiled_tileset/important.txt b/examples/nflib/graphics/animatedbg/assets/bgtiled_tileset/important.txt new file mode 100644 index 0000000..0f43be8 --- /dev/null +++ b/examples/nflib/graphics/animatedbg/assets/bgtiled_tileset/important.txt @@ -0,0 +1,4 @@ +The original animation belongs to Navy Wars (C) 2009 NightFox & Co. + +It is licensed under a Creative Commons license, you must credit the game and +the original authors if you use it in your own project. diff --git a/examples/nflib/graphics/animatedbg/assets/bgtiled_tileset/instructions.txt b/examples/nflib/graphics/animatedbg/assets/bgtiled_tileset/instructions.txt new file mode 100644 index 0000000..e8383d7 --- /dev/null +++ b/examples/nflib/graphics/animatedbg/assets/bgtiled_tileset/instructions.txt @@ -0,0 +1,17 @@ +You must place the tiles of each frame of the animation from left to right, and +from up to down, placing them in an image one after the other. + +If the size of each frame is 4x4 tiles in a 32x256 pixel image, for example: + +[01][02][03][04] +[05][05][07][07] +[09][10][11][12] +[13][14][15][16] + +[..][..][..][..] + +In the final image for the animation, of size 256x256 pixels, they would be +placed this way: + +[01][02][03][04][05][05][07][07][09][10][11][12][13][14][15][16][..][..][..][..] + diff --git a/examples/nflib/graphics/animatedbg/assets/bgtiled_tileset/water.png b/examples/nflib/graphics/animatedbg/assets/bgtiled_tileset/water.png new file mode 100644 index 0000000..09943ae Binary files /dev/null and b/examples/nflib/graphics/animatedbg/assets/bgtiled_tileset/water.png differ diff --git a/examples/nflib/graphics/animatedbg/build.py b/examples/nflib/graphics/animatedbg/build.py new file mode 100644 index 0000000..6476b09 --- /dev/null +++ b/examples/nflib/graphics/animatedbg/build.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_tiled(['assets/bgtiled'], 'bg') +nitrofs.add_nflib_bg_tiled_tileset(['assets/bgtiled_tileset'], 'bg') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: Animated BG', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/graphics/animatedbg/source/main.c b/examples/nflib/graphics/animatedbg/source/main.c new file mode 100644 index 0000000..bbe7359 --- /dev/null +++ b/examples/nflib/graphics/animatedbg/source/main.c @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Example of animating tiled backgrounds. +// http://www.nightfoxandco.com + +#include +#include + +#include +#include + +#include + +#define SPEED 2 // Scroll speed +#define MAP_X 16 // Map width (animated blocks are 4x4, 64 / 4 = 16) +#define MAP_Y 16 // Map height (animated blocks are 4x4, 64 / 4 = 16) +#define WATER_FRAMES 50 // Number of frames of the animation +#define WATER_DELAY 10 // Animation speed (number of frames to wait to change) + +// Global variables +u8 WATER_SPEED; +u8 WATER_FRAME[MAP_X][MAP_Y]; // 512 pixels, 64 tiles, every frame is 4x4 tiles + +// Initialize animated background +void InitAnimatedBg(void) +{ + // Initialize water animations + for (int y = 0; y < MAP_Y; y++) + { + for (int x = 0; x < MAP_X; x++) + WATER_FRAME[x][y] = rand() % (WATER_FRAMES + 1); + } + + // Generate map of water background + for (int y = 0; y < MAP_Y; y++) + { + for (int x = 0; x < MAP_X; x++) + { + // Calculate the map 4x4 region to fill + int start_x = x * 4; + int end_x = start_x + 4; + int start_y = y * 4; + int end_y = start_y + 4; + + // Displacement + int n = 0; + + // Fill the 4x4 region + for (int tile_y = start_y; tile_y < end_y; tile_y++) + { + for (int tile_x = start_x; tile_x < end_x; tile_x++) + { + // The animation has 11 frames. Any number over the limit + // will display the "rest" frame. + int frame = WATER_FRAME[x][y]; + if (frame > 10) + frame = 10; + + NF_SetTileOfMap(1, 3, tile_x, tile_y, (frame * 16) + n); + n++; + } + } + } + } + + // Update map in VRAM + NF_UpdateVramMap(1, 3); +} + +// Handle tiled background animation +void AnimateWater(void) +{ + // Check if we need to do an animation step + WATER_SPEED++; + + if (WATER_SPEED < WATER_DELAY) + return; + + WATER_SPEED = 0; + + // Change the required tiles for the animation + for (int y = 0; y < MAP_Y; y++) + { + for (int x = 0; x < MAP_X; x++) + { + // Calculate the map 4x4 region to fill + int start_x = x * 4; + int end_x = start_x + 4; + int start_y = y * 4; + int end_y = start_y + 4; + + // CAlculate the frame to draw + WATER_FRAME[x][y]++; + + if (WATER_FRAME[x][y] > WATER_FRAMES) + WATER_FRAME[x][y] = 0; + + if (WATER_FRAME[x][y] <= 10) + { + // Displacement + int n = 0; + + // Fill the 4x4 region + for (int tile_y = start_y; tile_y < end_y; tile_y++) + { + for (int tile_x = start_x; tile_x < end_x; tile_x++) + { + NF_SetTileOfMap(1, 3, tile_x, tile_y, (WATER_FRAME[x][y] * 16) + n); + n++; + } + } + } + } + } + + // Update map in VRAM + NF_UpdateVramMap(1, 3); +} + +int main(int argc, char **argv) +{ + // Set random seed based on the current time + srand(time(NULL)); + + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 2D engine in both screens and use mode 0 + NF_Set2D(0, 0); + NF_Set2D(1, 0); + + // Initialize tiled backgrounds system + NF_InitTiledBgBuffers(); // Initialize storage buffers + NF_InitTiledBgSys(0); // Top screen + NF_InitTiledBgSys(1); // Bottom screen + + // Load background files from NitroFS + NF_LoadTiledBg("bg/nfl", "nfl", 256, 256); + NF_LoadTilesForBg("bg/water", "water", 512, 512, 0, 175); + + // Create top screen background + NF_CreateTiledBg(0, 3, "nfl"); + // Create bottom screen backgrounds + NF_CreateTiledBg(1, 3, "water"); + + // Initialize background animation + InitAnimatedBg(); + + // Variables + s16 bg_x = 0; + s16 bg_y = 0; + + while (1) + { + scanKeys(); // Read keypad + u16 keys = keysHeld(); + + // Scroll background + if (keys & KEY_LEFT) + { + bg_x -= SPEED; + if (bg_x < 0) + bg_x = 0; + } + + if (keys & KEY_RIGHT) + { + bg_x += SPEED; + if (bg_x > 255) + bg_x = 255; + } + + if (keys & KEY_UP) + { + bg_y -= SPEED; + if (bg_y < 0) + bg_y = 0; + } + + if (keys & KEY_DOWN) + { + bg_y += SPEED; + if (bg_y > 255) + bg_y = 255; + } + + // Animate background + AnimateWater(); + + // Wait for the screen refresh + swiWaitForVBlank(); + + // Scroll background + NF_ScrollBg(1, 3, bg_x, bg_y); + } + + return 0; +} diff --git a/examples/nflib/graphics/backbuffer3/.gitignore b/examples/nflib/graphics/backbuffer3/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/graphics/backbuffer3/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/graphics/backbuffer3/architectds b/examples/nflib/graphics/backbuffer3/architectds new file mode 120000 index 0000000..001411d --- /dev/null +++ b/examples/nflib/graphics/backbuffer3/architectds @@ -0,0 +1 @@ +../../../../architectds \ No newline at end of file diff --git a/examples/nflib/graphics/backbuffer3/assets/bg16bits/bitmap16.png b/examples/nflib/graphics/backbuffer3/assets/bg16bits/bitmap16.png new file mode 100644 index 0000000..7e4c4db Binary files /dev/null and b/examples/nflib/graphics/backbuffer3/assets/bg16bits/bitmap16.png differ diff --git a/examples/nflib/graphics/backbuffer3/assets/bg16bits/img16_a.png b/examples/nflib/graphics/backbuffer3/assets/bg16bits/img16_a.png new file mode 100644 index 0000000..2632b01 Binary files /dev/null and b/examples/nflib/graphics/backbuffer3/assets/bg16bits/img16_a.png differ diff --git a/examples/nflib/graphics/backbuffer3/assets/bg16bits/img16_b.png b/examples/nflib/graphics/backbuffer3/assets/bg16bits/img16_b.png new file mode 100644 index 0000000..cbb47b5 Binary files /dev/null and b/examples/nflib/graphics/backbuffer3/assets/bg16bits/img16_b.png differ diff --git a/examples/nflib/graphics/backbuffer3/build.py b/examples/nflib/graphics/backbuffer3/build.py new file mode 100644 index 0000000..1ceba40 --- /dev/null +++ b/examples/nflib/graphics/backbuffer3/build.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_16bit(['assets/bg16bits'], 'bmp') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: Backbuffer', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/graphics/backbuffer3/source/main.c b/examples/nflib/graphics/backbuffer3/source/main.c new file mode 100644 index 0000000..584e698 --- /dev/null +++ b/examples/nflib/graphics/backbuffer3/source/main.c @@ -0,0 +1,139 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Basic example of using a 16-bit bitmap with a backbuffer and loading images. +// It shows two images with a window effect. +// http://www.nightfoxandco.com + +#include +#include + +#include +#include + +#include + +int main(int argc, char **argv) +{ + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 2D engine in both screens and use mode 5 + NF_Set2D(0, 5); + NF_Set2D(1, 5); + + // Initialize bitmap backgrounds system + NF_InitBitmapBgSys(0, 1); + NF_InitBitmapBgSys(1, 1); + + // Initialize storage buffers + NF_Init16bitsBgBuffers(); + + // Initialize backbuffer + NF_Init16bitsBackBuffer(1); + + // Enable backbuffer + NF_Enable16bitsBackBuffer(1); + + // Load bitmap background files from NitroFS + NF_Load16bitsBg("bmp/bitmap16", 0); + NF_Load16bitsBg("bmp/img16_a", 1); + NF_Load16bitsBg("bmp/img16_b", 2); + + // Tranfer image to VRAM of both screens + NF_Copy16bitsBuffer(0, 0, 0); + NF_Copy16bitsBuffer(1, 1, 2); + + // It's not needed to use it any longer, so remove it from RAM + NF_Unload16bitsBg(0); + + // Variables to control the window + s16 xa = 0; + s16 xb = 0; + s16 ya = 0; + s16 yb = 0; + + while (1) + { + // Copy original image to the backbuffer of the top screen + NF_Copy16bitsBuffer(1, 1, 2); + + // Read keys and touchscreen + scanKeys(); + touchPosition touchscreen; + touchRead(&touchscreen); + u16 keys_held = keysHeld(); + u16 keys_down = keysDown(); + + if (keys_down & KEY_TOUCH) + { + // If this is the first time the user presses the screen, save that + // point as one corner of the window. + xa = touchscreen.px; + ya = touchscreen.py; + } + else if (keys_held & KEY_TOUCH) + { + // Save the other corner of the window + xb = touchscreen.px; + yb = touchscreen.py; + + // If the two points aren't the same + if ((xa != xb) && (ya != yb)) + { + int sqr_xa, sqr_xb, sqr_ya, sqr_yb; + + // Calculate window bounds + if (xa < xb) + { + sqr_xa = xa; + sqr_xb = xb; + } + else + { + sqr_xa = xb; + sqr_xb = xa; + } + + if (ya < yb) + { + sqr_ya = ya; + sqr_yb = yb; + } + else + { + sqr_ya = yb; + sqr_yb = ya; + } + + // Draw the window + for (int y = sqr_ya; y < sqr_yb; y++) + { + u32 offset = (y << 8) + sqr_xa; + + memcpy(NF_16BITS_BACKBUFFER[1] + offset, + NF_BG16B[1].buffer + offset, + (sqr_xb - sqr_xa) * 2); + } + } + } + + // Wait for the screen refresh + swiWaitForVBlank(); + + // Swap backbuffer and visible buffers + NF_Flip16bitsBackBuffer(1); + } + + return 0; +} diff --git a/examples/nflib/graphics/bg/.gitignore b/examples/nflib/graphics/bg/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/graphics/bg/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/graphics/bg/architectds b/examples/nflib/graphics/bg/architectds new file mode 120000 index 0000000..001411d --- /dev/null +++ b/examples/nflib/graphics/bg/architectds @@ -0,0 +1 @@ +../../../../architectds \ No newline at end of file diff --git a/examples/nflib/graphics/bg/assets/bgtiled/bg0.png b/examples/nflib/graphics/bg/assets/bgtiled/bg0.png new file mode 100644 index 0000000..1181652 Binary files /dev/null and b/examples/nflib/graphics/bg/assets/bgtiled/bg0.png differ diff --git a/examples/nflib/graphics/bg/assets/bgtiled/bg1.png b/examples/nflib/graphics/bg/assets/bgtiled/bg1.png new file mode 100644 index 0000000..d3f5124 Binary files /dev/null and b/examples/nflib/graphics/bg/assets/bgtiled/bg1.png differ diff --git a/examples/nflib/graphics/bg/assets/bgtiled/bg2.png b/examples/nflib/graphics/bg/assets/bgtiled/bg2.png new file mode 100644 index 0000000..dccb576 Binary files /dev/null and b/examples/nflib/graphics/bg/assets/bgtiled/bg2.png differ diff --git a/examples/nflib/graphics/bg/assets/bgtiled/bg3.png b/examples/nflib/graphics/bg/assets/bgtiled/bg3.png new file mode 100644 index 0000000..fd1998a Binary files /dev/null and b/examples/nflib/graphics/bg/assets/bgtiled/bg3.png differ diff --git a/examples/nflib/graphics/bg/assets/bgtiled/nfl.png b/examples/nflib/graphics/bg/assets/bgtiled/nfl.png new file mode 100644 index 0000000..baf2c90 Binary files /dev/null and b/examples/nflib/graphics/bg/assets/bgtiled/nfl.png differ diff --git a/examples/nflib/graphics/bg/build.py b/examples/nflib/graphics/bg/build.py new file mode 100644 index 0000000..78cf21f --- /dev/null +++ b/examples/nflib/graphics/bg/build.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_tiled(['assets/bgtiled'], 'bg') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: Backgrounds', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/graphics/bg/source/main.c b/examples/nflib/graphics/bg/source/main.c new file mode 100644 index 0000000..53e504a --- /dev/null +++ b/examples/nflib/graphics/bg/source/main.c @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Background loading example +// http://www.nightfoxandco.com + +#include + +#include +#include + +#include + +#define SPEED 2 // Scroll speed + +int main(int argc, char **argv) +{ + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 2D engine in both screens and use mode 0 + NF_Set2D(0, 0); + NF_Set2D(1, 0); + + // Initialize tiled backgrounds system + NF_InitTiledBgBuffers(); // Initialize storage buffers + NF_InitTiledBgSys(0); // Top screen + NF_InitTiledBgSys(1); // Bottom screen + + // Load background files from NitroFS + NF_LoadTiledBg("bg/nfl", "nfl", 256, 256); + NF_LoadTiledBg("bg/bg3", "layer_3", 256, 256); + NF_LoadTiledBg("bg/bg2", "layer_2", 1024, 256); + NF_LoadTiledBg("bg/bg1", "layer_1", 1536, 256); + NF_LoadTiledBg("bg/bg0", "layer_0", 2048, 256); + + // Create top screen background + NF_CreateTiledBg(0, 3, "nfl"); + + // Create bottom screen backgrounds + NF_CreateTiledBg(1, 3, "layer_3"); + NF_CreateTiledBg(1, 2, "layer_2"); + NF_CreateTiledBg(1, 1, "layer_1"); + NF_CreateTiledBg(1, 0, "layer_0"); + + // Variables + s16 bg_x[4] = { 0, 0, 0, 0 }; + s16 bg_y[4] = { 0, 0, 0, 0 }; + + while (1) + { + scanKeys(); // Read keypad + u16 keys = keysHeld(); // Keys currently pressed + + // If pressing left + if (keys & KEY_LEFT) + { + bg_x[0] -= SPEED; + if (bg_x[0] < 0) + bg_x[0] = 0; + } + + // If pressing right + if (keys & KEY_RIGHT) + { + bg_x[0] += SPEED; + if (bg_x[0] > 1663) + bg_x[0] = 1663; // Max scroll of layer 0 + } + + // Scroll other layers less than layer 0 + bg_x[1] = (int)(bg_x[0] / 1.5); + bg_x[2] = (int)(bg_x[1] / 1.5); + + // Wait for the screen refresh + swiWaitForVBlank(); + + // Update background scroll during vertical blanking to avoid tearing + for (int n = 0; n < 4; n++) + NF_ScrollBg(1, n, bg_x[n], bg_y[n]); + } + + return 0; +} diff --git a/examples/nflib/graphics/bg16bits/.gitignore b/examples/nflib/graphics/bg16bits/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/graphics/bg16bits/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/graphics/bg16bits/architectds b/examples/nflib/graphics/bg16bits/architectds new file mode 120000 index 0000000..001411d --- /dev/null +++ b/examples/nflib/graphics/bg16bits/architectds @@ -0,0 +1 @@ +../../../../architectds \ No newline at end of file diff --git a/examples/nflib/graphics/bg16bits/assets/bg16bits/bitmap16.jpg b/examples/nflib/graphics/bg16bits/assets/bg16bits/bitmap16.jpg new file mode 100644 index 0000000..54b9bd5 Binary files /dev/null and b/examples/nflib/graphics/bg16bits/assets/bg16bits/bitmap16.jpg differ diff --git a/examples/nflib/graphics/bg16bits/build.py b/examples/nflib/graphics/bg16bits/build.py new file mode 100644 index 0000000..c02b670 --- /dev/null +++ b/examples/nflib/graphics/bg16bits/build.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_16bit(['assets/bg16bits'], 'bmp') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: BG 16 bits', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/graphics/bg16bits/source/main.c b/examples/nflib/graphics/bg16bits/source/main.c new file mode 100644 index 0000000..ced96ac --- /dev/null +++ b/examples/nflib/graphics/bg16bits/source/main.c @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Example of loading 16-bit bitmap backgrounds. +// http://www.nightfoxandco.com + +#include + +#include +#include + +#include + +int main(int argc, char **argv) +{ + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 2D engine in both screens and use mode 5 + NF_Set2D(0, 5); + NF_Set2D(1, 5); + + // Initialize bitmap backgrounds system + NF_InitBitmapBgSys(0, 1); + NF_InitBitmapBgSys(1, 1); + + // Initialize storage buffers + NF_Init16bitsBgBuffers(); + + // Load bitmap background files from NitroFS + NF_Load16bitsBg("bmp/bitmap16", 0); + + // Tranfer image to VRAM of both screens + NF_Copy16bitsBuffer(0, 0, 0); + NF_Copy16bitsBuffer(1, 0, 0); + + // It's not needed to use it any longer, so remove it from RAM + NF_Unload16bitsBg(0); + + while (1) + { + // Wait for the screen refresh + swiWaitForVBlank(); + } + + return 0; +} diff --git a/examples/nflib/graphics/bgmixed/.gitignore b/examples/nflib/graphics/bgmixed/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/graphics/bgmixed/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/graphics/bgmixed/architectds b/examples/nflib/graphics/bgmixed/architectds new file mode 120000 index 0000000..001411d --- /dev/null +++ b/examples/nflib/graphics/bgmixed/architectds @@ -0,0 +1 @@ +../../../../architectds \ No newline at end of file diff --git a/examples/nflib/graphics/bgmixed/assets/bg8bit/img8b_1.png b/examples/nflib/graphics/bgmixed/assets/bg8bit/img8b_1.png new file mode 100644 index 0000000..2632b01 Binary files /dev/null and b/examples/nflib/graphics/bgmixed/assets/bg8bit/img8b_1.png differ diff --git a/examples/nflib/graphics/bgmixed/assets/bg8bit/img8b_2.png b/examples/nflib/graphics/bgmixed/assets/bg8bit/img8b_2.png new file mode 100644 index 0000000..cbb47b5 Binary files /dev/null and b/examples/nflib/graphics/bgmixed/assets/bg8bit/img8b_2.png differ diff --git a/examples/nflib/graphics/bgmixed/assets/bgtiled/bg0.png b/examples/nflib/graphics/bgmixed/assets/bgtiled/bg0.png new file mode 100644 index 0000000..dccb576 Binary files /dev/null and b/examples/nflib/graphics/bgmixed/assets/bgtiled/bg0.png differ diff --git a/examples/nflib/graphics/bgmixed/assets/font/font16.png b/examples/nflib/graphics/bgmixed/assets/font/font16.png new file mode 100644 index 0000000..5348182 Binary files /dev/null and b/examples/nflib/graphics/bgmixed/assets/font/font16.png differ diff --git a/examples/nflib/graphics/bgmixed/assets/sprite256/ball.png b/examples/nflib/graphics/bgmixed/assets/sprite256/ball.png new file mode 100644 index 0000000..ae92aeb Binary files /dev/null and b/examples/nflib/graphics/bgmixed/assets/sprite256/ball.png differ diff --git a/examples/nflib/graphics/bgmixed/build.py b/examples/nflib/graphics/bgmixed/build.py new file mode 100644 index 0000000..3eb8164 --- /dev/null +++ b/examples/nflib/graphics/bgmixed/build.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_tiled(['assets/bgtiled'], 'bg') +nitrofs.add_nflib_bg_8bit(['assets/bg8bit'], 'bmp') +nitrofs.add_nflib_sprite_256(['assets/sprite256'], 'sprite') +nitrofs.add_nflib_font(['assets/font'], 'fnt') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: Mixed BG types', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/graphics/bgmixed/source/main.c b/examples/nflib/graphics/bgmixed/source/main.c new file mode 100644 index 0000000..b9c658c --- /dev/null +++ b/examples/nflib/graphics/bgmixed/source/main.c @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Example of mixing bitmap and tiled backgrounds. +// http://www.nightfoxandco.com + +#include +#include + +#include +#include + +#include + +int main(int argc, char **argv) +{ + // Set random seed based on the current time + srand(time(NULL)); + + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 2D engine in both screens and use mode 5. Layers 0 to 2 are + // tiled backgrounds, layer 3 is an 8-bit bitmap background. + NF_Set2D(0, 5); + NF_Set2D(1, 5); + + // Initialize mixed background system + NF_InitMixedBgSys(0); + NF_InitMixedBgSys(1); + + // Initialize tiled backgrounds system + NF_InitTiledBgBuffers(); + + // Initialize text system + NF_InitTextSys(0); // Top screen + + // Initialize storage buffers + NF_Init8bitsBgBuffers(); + + // Initialize sprite system + NF_InitSpriteBuffers(); // Initialize storage buffers + NF_InitSpriteSys(0); // Top screen + NF_InitSpriteSys(1); // Bottom screen + + // Load background files from NitroFS + NF_LoadTiledBg("bg/bg0", "tiled_bg", 1024, 256); + + // Load text font files from NitroFS + NF_LoadTextFont16("fnt/font16", "text_bg0", 256, 256, 0); + NF_LoadTextFont16("fnt/font16", "text_bg1", 256, 256, 0); + + // Load bitmap files from NitroFS + NF_Load8bitsBg("bmp/img8b_1", 0); + NF_Load8bitsBg("bmp/img8b_2", 1); + + // Load sprite files from NitroFS + NF_LoadSpriteGfx("sprite/ball", 0, 32, 32); + NF_LoadSpritePal("sprite/ball", 0); + + // Create bottom screen background + NF_CreateTiledBg(1, 0, "tiled_bg"); + + // Create text layers + NF_CreateTextLayer16(0, 0, 0, "text_bg0"); + NF_CreateTextLayer16(0, 1, 0, "text_bg1"); + + // Write some text in the top screen in white + NF_WriteText16(0, 0, 1, 1, "Text over bitmap"); + NF_WriteText16(0, 0, 1, 3, "Text on layers 0 & 1"); + NF_WriteText16(0, 0, 1, 4, "Bitmap on layer 3"); + + // Write the same text in another layer in black, this will be the shadow + NF_DefineTextColor(0, 1, 1, 0, 0, 0); // Black + NF_SetTextColor(0, 1, 1); + NF_WriteText16(0, 1, 1, 1, "Text over bitmap"); + NF_WriteText16(0, 1, 1, 3, "Text on layers 0 & 1"); + NF_WriteText16(0, 1, 1, 4, "Bitmap on layer 3"); + + // Small scroll for the black background to simulate the shadow + NF_ScrollBg(0, 0, 1, 1); + + // Update text layers + NF_UpdateTextLayers(); + + // Transfer image to layer 3 of the top screen + NF_Copy8bitsBuffer(0, 1, 0); + + // Transfer image to layer 3 of the bottom screen + NF_Copy8bitsBuffer(1, 1, 1); + + // Transfer the required sprites to VRAM + NF_VramSpriteGfx(0, 0, 0, true); // Ball: Keep all frames in VRAM + NF_VramSpritePal(0, 0, 0); + NF_VramSpriteGfx(1, 0, 0, true); // Ball: Keep all frames in VRAM + NF_VramSpritePal(1, 0, 0); + + // Setup and create ball sprites + s16 ball_x[32]; + s16 ball_y[32]; + s8 ball_spx[32]; + s8 ball_spy[32]; + + for (int n = 0; n < 32; n++) + { + ball_x[n] = rand() % 223; + ball_y[n] = rand() % 159; + ball_spx[n] = (rand() % 3) + 1; + ball_spy[n] = (rand() % 3) + 1; + NF_CreateSprite(0, n, 0, 0, ball_x[n], ball_y[n]); + NF_CreateSprite(1, n, 0, 0, ball_x[n], ball_y[n]); + NF_SpriteLayer(0, n, 3); + NF_SpriteLayer(1, n, 3); + } + + while (1) + { + // Move balls + for (int n = 0; n < 32; n++) + { + ball_x[n] += ball_spx[n]; + if ((ball_x[n] < 0) || (ball_x[n] > 223)) + ball_spx[n] *= -1; + + ball_y[n] += ball_spy[n]; + if ((ball_y[n] < 0) || (ball_y[n] > 159)) + ball_spy[n] *= -1; + + NF_MoveSprite(0, n, ball_x[n], ball_y[n]); + NF_MoveSprite(1, n, ball_x[n], ball_y[n]); + } + + // Update OAM array + NF_SpriteOamSet(0); + NF_SpriteOamSet(1); + + // Wait for the screen refresh + swiWaitForVBlank(); + + // Update OAM + oamUpdate(&oamMain); + oamUpdate(&oamSub); + } + + return 0; +} diff --git a/examples/nflib/graphics/bgtiled_spr256/.gitignore b/examples/nflib/graphics/bgtiled_spr256/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/graphics/bgtiled_spr256/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/graphics/bgtiled_spr256/architectds b/examples/nflib/graphics/bgtiled_spr256/architectds new file mode 120000 index 0000000..001411d --- /dev/null +++ b/examples/nflib/graphics/bgtiled_spr256/architectds @@ -0,0 +1 @@ +../../../../architectds \ No newline at end of file diff --git a/examples/nflib/graphics/bgtiled_spr256/assets/bg8bit_shared_pal_1/img8b_1.png b/examples/nflib/graphics/bgtiled_spr256/assets/bg8bit_shared_pal_1/img8b_1.png new file mode 100644 index 0000000..2632b01 Binary files /dev/null and b/examples/nflib/graphics/bgtiled_spr256/assets/bg8bit_shared_pal_1/img8b_1.png differ diff --git a/examples/nflib/graphics/bgtiled_spr256/assets/bg8bit_shared_pal_1/img8b_2.png b/examples/nflib/graphics/bgtiled_spr256/assets/bg8bit_shared_pal_1/img8b_2.png new file mode 100644 index 0000000..cbb47b5 Binary files /dev/null and b/examples/nflib/graphics/bgtiled_spr256/assets/bg8bit_shared_pal_1/img8b_2.png differ diff --git a/examples/nflib/graphics/bgtiled_spr256/assets/bgtiled/nfl.png b/examples/nflib/graphics/bgtiled_spr256/assets/bgtiled/nfl.png new file mode 100644 index 0000000..baf2c90 Binary files /dev/null and b/examples/nflib/graphics/bgtiled_spr256/assets/bgtiled/nfl.png differ diff --git a/examples/nflib/graphics/bgtiled_spr256/assets/convert.sh b/examples/nflib/graphics/bgtiled_spr256/assets/convert.sh new file mode 100644 index 0000000..c009827 --- /dev/null +++ b/examples/nflib/graphics/bgtiled_spr256/assets/convert.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +# The two backgrounds that share the palette have been edited to use 128 colors +# each, so that the final combined palette is 256 colors in size. +/opt/blocksds/core/tools/grit/grit img8b_1.png img8b_2.png -ftB -fh! -gTFF00FF -gb -gB8 -pS -Oimg8b_1.pal + +# This is required or the library will say that the second background doesn't +# have a palette. +cp img8b_1.pal img8b_2.pal + +mkdir -p ../nitrofs/root/bg +mv *.pal *.img ../nitrofs/root/bg diff --git a/examples/nflib/graphics/bgtiled_spr256/assets/spr256/ball.png b/examples/nflib/graphics/bgtiled_spr256/assets/spr256/ball.png new file mode 100644 index 0000000..ae92aeb Binary files /dev/null and b/examples/nflib/graphics/bgtiled_spr256/assets/spr256/ball.png differ diff --git a/examples/nflib/graphics/bgtiled_spr256/build.py b/examples/nflib/graphics/bgtiled_spr256/build.py new file mode 100644 index 0000000..d30ecc7 --- /dev/null +++ b/examples/nflib/graphics/bgtiled_spr256/build.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2023 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_tiled(['assets/bgtiled'], 'bg') +nitrofs.add_nflib_sprite_256(['assets/spr256'], 'spr') +nitrofs.add_nflib_bg_8bit_shared_pal('assets/bg8bit_shared_pal_1', 'bg') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: Tiled BG, sprites', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/graphics/bgtiled_spr256/source/main.c b/examples/nflib/graphics/bgtiled_spr256/source/main.c new file mode 100644 index 0000000..6da9763 --- /dev/null +++ b/examples/nflib/graphics/bgtiled_spr256/source/main.c @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// "Reveal" effect +// http://www.nightfoxandco.com + +#include +#include + +#include +#include + +#include + +int main(int argc, char **argv) +{ + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 2D engine in both screens. Use mode 0 in the top screen, and + // mode 5 in the bottom screen. + NF_Set2D(0, 0); + NF_Set2D(1, 5); + + // Initialize tiled backgrounds system in the top screen + NF_InitTiledBgBuffers(); // Initialize storage buffers + NF_InitTiledBgSys(0); + + // Initialize bitmap backgrounds system in the bottom screen + NF_Init8bitsBgBuffers(); // Initialize storage buffers + NF_InitBitmapBgSys(1, 0); // Initialize 8-bit bitmap backgrounds + NF_Init8bitsBackBuffer(1); // Initialize backbuffer + NF_Enable8bitsBackBuffer(1); // Enable backbuffer + + // Initialize sprite system in the bottom screen + NF_InitSpriteBuffers(); // Initialize storage buffers + NF_InitSpriteSys(1); + + // Load tiled background files from NitroFS + NF_LoadTiledBg("bg/nfl", "nfl", 256, 256); + + // Load bitmap background files from NitroFS + NF_Load8bitsBg("bg/img8b_1", 0); + NF_Load8bitsBg("bg/img8b_2", 1); + + // Load sprite files from NitroFS + NF_LoadSpriteGfx("spr/ball", 0, 32, 32); + NF_LoadSpritePal("spr/ball", 0); + + // Create bottom screen background + NF_CreateTiledBg(0, 3, "nfl"); + + // Transfer image to the backbuffer of the top screen + NF_Copy8bitsBuffer(1, 2, 1); + // Transfer image to layer 3 of the top screen + NF_Copy8bitsBuffer(1, 1, 0); + // Copy backbuffer of the top screen to layer 2 + NF_Flip8bitsBackBuffer(1, 0); + + // Transfer the required sprites to VRAM + NF_VramSpriteGfx(1, 0, 0, true); + NF_VramSpritePal(1, 0, 0); + + // Set random seed based on the current time + srand(time(NULL)); + + // State of the balls + s16 ball_x[32]; + s16 ball_y[32]; + s8 ball_spx[32]; + s8 ball_spy[32]; + + for (int n = 0; n < 32; n++) + { + ball_x[n] = rand() % 223; + ball_y[n] = rand() % 159; + ball_spx[n] = (rand() % 3) + 1; + ball_spy[n] = (rand() % 3) + 1; + NF_CreateSprite(1, n, 0, 0, ball_x[n], ball_y[n]); + NF_SpriteLayer(1, n, 3); + } + + while (1) + { + // Read keys and touchscreen + scanKeys(); + touchPosition touchscreen; + touchRead(&touchscreen); + u16 keys_held = keysHeld(); + u16 keys_down = keysDown(); + + // Check if the touch screen is pressed + if (keys_held & KEY_TOUCH) + { + int x = touchscreen.px - 8; + if (x < 0) + x = 0; + if (x > 239) + x = 239; + + int y = touchscreen.py - 8; + if (y < 0) + y = 0; + if (y > 175) + y = 175; + + // Draw a 16x16 block around the touchscreen coordinates in the + // bottom screen. + for (int dy = 0; dy < 16; dy++) + { + for (int dx = 0; dx < 16; dx++) + { + u16 idx = ((y + dy) << 8) + (x + dx); + NF_8BITS_BACKBUFFER[1].data[idx] = 0; + } + } + } + + // Press X to reload the top screen image + if (keys_down & KEY_B) + NF_Copy8bitsBuffer(1, 2, 1); + + // Copy bottom screen backbuffer to layer 2 + NF_Flip8bitsBackBuffer(1, 0); + + // Move the sprites + for (int n = 0; n < 32; n++) + { + ball_x[n] += ball_spx[n]; + if ((ball_x[n] < 0) || (ball_x[n] > 223)) + ball_spx[n] *= -1; + + ball_y[n] += ball_spy[n]; + if ((ball_y[n] < 0) || (ball_y[n] > 159)) + ball_spy[n] *= -1; + + NF_MoveSprite(1, n, ball_x[n], ball_y[n]); + } + + // Update OAM array + NF_SpriteOamSet(1); + + // Wait for the screen refresh + swiWaitForVBlank(); + + // Update OAM + oamUpdate(&oamSub); + } + + return 0; +} diff --git a/examples/nflib/textdemo/.gitignore b/examples/nflib/textdemo/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nflib/textdemo/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nflib/textdemo/architectds b/examples/nflib/textdemo/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nflib/textdemo/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nflib/textdemo/assets/bgtiled/layer3.png b/examples/nflib/textdemo/assets/bgtiled/layer3.png new file mode 100644 index 0000000..fd1998a Binary files /dev/null and b/examples/nflib/textdemo/assets/bgtiled/layer3.png differ diff --git a/examples/nflib/textdemo/assets/font/default.png b/examples/nflib/textdemo/assets/font/default.png new file mode 100644 index 0000000..40b1f1f Binary files /dev/null and b/examples/nflib/textdemo/assets/font/default.png differ diff --git a/examples/nflib/textdemo/build.py b/examples/nflib/textdemo/build.py new file mode 100644 index 0000000..2cda077 --- /dev/null +++ b/examples/nflib/textdemo/build.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_nflib_bg_tiled(['assets/bgtiled'], 'bg') +nitrofs.add_nflib_font(['assets/font'], 'fnt') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['nds9', 'nflib'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nflib'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NFlib: Text demo', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nflib/textdemo/source/main.c b/examples/nflib/textdemo/source/main.c new file mode 100644 index 0000000..9c1c6fc --- /dev/null +++ b/examples/nflib/textdemo/source/main.c @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Basic text example. +// http://www.nightfoxandco.com + +#include + +#include +#include + +#include + +int main(int argc, char **argv) +{ + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); + + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); + + // Initialize 2D engine in both screens and use mode 0 + NF_Set2D(0, 0); + NF_Set2D(1, 0); + + // Initialize tiled backgrounds system + NF_InitTiledBgBuffers(); // Initialize storage buffers + NF_InitTiledBgSys(0); // Top screen + NF_InitTiledBgSys(1); // Bottom screen + + // Initialize text system + NF_InitTextSys(0); // Top screen + + // Load background files from NitroFS + NF_LoadTiledBg("bg/layer3", "moon", 256, 256); + + // Load text font files from NitroFS + NF_LoadTextFont("fnt/default", "normal", 256, 256, 0); // Load normal text + NF_LoadTextFont("fnt/default", "right", 256, 256, 1); // Load rotated text + NF_LoadTextFont("fnt/default", "left", 256, 256, 2); // Load rotated text + + // Create top screen background + NF_CreateTiledBg(0, 3, "moon"); + + // Create bottom screen background + NF_CreateTiledBg(1, 3, "moon"); + + // Create text layers + NF_CreateTextLayer(0, 0, 0, "normal"); + NF_CreateTextLayer(0, 1, 1, "right"); + NF_CreateTextLayer(0, 2, 2, "left"); + + // Scroll text background to offset the unused space in the background + // that uses text rotated to the left. + NF_ScrollBg(0, 2, 0, 63); + + // Print text in all layers + NF_WriteText(0, 0, 1, 1, "Hola Mundo!\n Hello World!"); + NF_WriteText(0, 1, 1, 1, "Hola Mundo!\n Hello World!"); + NF_WriteText(0, 2, 1, 1, "Hola Mundo!\n Hello World!"); + + // Update text layers + NF_UpdateTextLayers(); + + // Variables + u32 myvar = 0; + + while (1) + { + myvar++; + + char mytext[32]; + snprintf(mytext, sizeof(mytext), "Counter: %lu", myvar); + + NF_WriteText(0, 0, 1, 5, mytext); + NF_WriteText(0, 1, 1, 5, mytext); + NF_WriteText(0, 2, 1, 5, mytext); + + // Update text layers + NF_UpdateTextLayers(); + + // Wait for the screen refresh + swiWaitForVBlank(); + } + + return 0; +} diff --git a/examples/nitro_engine/animated_model/.gitignore b/examples/nitro_engine/animated_model/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nitro_engine/animated_model/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nitro_engine/animated_model/architectds b/examples/nitro_engine/animated_model/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/animated_model/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/animated_model/assets/robot/robot.blend b/examples/nitro_engine/animated_model/assets/robot/robot.blend new file mode 100644 index 0000000..494f3b5 Binary files /dev/null and b/examples/nitro_engine/animated_model/assets/robot/robot.blend differ diff --git a/examples/nitro_engine/animated_model/assets/robot/robot.dsmparam b/examples/nitro_engine/animated_model/assets/robot/robot.dsmparam new file mode 100644 index 0000000..e69de29 diff --git a/examples/nitro_engine/animated_model/assets/robot/robot.grit b/examples/nitro_engine/animated_model/assets/robot/robot.grit new file mode 100644 index 0000000..207c056 --- /dev/null +++ b/examples/nitro_engine/animated_model/assets/robot/robot.grit @@ -0,0 +1,2 @@ +# 16 bit texture bitmap, force alpha bit to 1 +-gx -gb -gB16 -gT! diff --git a/examples/nitro_engine/animated_model/assets/robot/robot.json b/examples/nitro_engine/animated_model/assets/robot/robot.json new file mode 100644 index 0000000..080a5f6 --- /dev/null +++ b/examples/nitro_engine/animated_model/assets/robot/robot.json @@ -0,0 +1,11 @@ +{ + "texture": [256, 256], + "blender-fix": true, + "export-base-pose": false, + "animations": [ + { + "file": "wave.md5anim", + "skip-frames": 1 + } + ] +} diff --git a/examples/nitro_engine/animated_model/assets/robot/robot.md5mesh b/examples/nitro_engine/animated_model/assets/robot/robot.md5mesh new file mode 100644 index 0000000..d00409f --- /dev/null +++ b/examples/nitro_engine/animated_model/assets/robot/robot.md5mesh @@ -0,0 +1,1730 @@ +MD5Version 10 // Parameters used during export: Reorient: False; Scale: 1.0 +commandline "" + +numJoints 16 +numMeshes 1 + +joints { + "Base.Bone" -1 ( 0.0000000000 0.0000000000 0.0000000000 ) ( -0.7071068287 -0.0000000000 -0.0000000000 ) + "Spine.Low" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( -0.7072144747 -0.0000000843 -0.0000000843 ) + "Spine.High" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( -0.7069305778 -0.0000001686 -0.0000001685 ) + "Head" 2 ( -0.0000000000 0.0000000000 5.6328477859 ) ( -0.7071068287 -0.0000000843 -0.0000000843 ) + "Chest.Left" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Arm.Upper.Left" 4 ( 0.0000000000 1.0032964945 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Arm.End.Left" 5 ( 0.0000000000 2.6084918976 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Chest.Right" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Arm.Upper.Right" 7 ( 0.0000000000 -1.0177762508 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Arm.End..Right" 8 ( 0.0000000000 -2.7045760155 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Pelvis.Left" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( 0.0060729762 -0.0000000000 -0.0000000000 ) + "Leg-Upper.Left" 10 ( 0.0000000000 0.4849596322 2.9163727760 ) ( 0.7071067095 -0.0000000843 0.0000000843 ) + "Leg-Lower.Left" 11 ( 0.0000000000 0.4849596322 1.5501549244 ) ( 0.7071067095 0.0000000000 0.0000000000 ) + "Pelvis.Right" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( 0.9999825358 0.0000000028 -0.0000004768 ) + "Leg-Upper.Right" 13 ( -0.0000000000 -0.5500909090 2.9157583714 ) ( 0.7071068287 0.0000003372 -0.0000003372 ) + "Leg-Lower.Right" 14 ( -0.0000000000 -0.5500909090 1.5495405197 ) ( 0.7071068287 0.0000003372 -0.0000003372 ) +} + +mesh { + shader "Material" + numverts 576 + vert 0 ( 0.8750000000 0.2500000000 ) 0 1 + vert 1 ( 0.8750000000 0.2500000000 ) 1 1 + vert 2 ( 0.0113541363 0.4622119665 ) 2 1 + vert 3 ( 0.0189200211 0.4281336665 ) 3 1 + vert 4 ( 0.0214311108 0.4167795181 ) 4 1 + vert 5 ( 0.3423711956 0.6714493930 ) 5 1 + vert 6 ( 0.4428113401 0.7197439075 ) 6 1 + vert 7 ( 0.3196628094 0.4622119665 ) 7 1 + vert 8 ( 0.2384368777 0.7197439075 ) 8 1 + vert 9 ( 0.3423711061 0.5182476044 ) 9 1 + vert 10 ( 0.3095858395 0.4167795181 ) 10 1 + vert 11 ( 0.3120969832 0.4281336665 ) 11 1 + vert 12 ( 0.1541543156 0.4622119665 ) 12 1 + vert 13 ( 0.0113541409 0.7197439075 ) 13 1 + vert 14 ( 0.4851713479 0.6714494228 ) 14 1 + vert 15 ( 0.1440773457 0.4167795181 ) 15 1 + vert 16 ( 0.1465884447 0.4281336665 ) 16 1 + vert 17 ( 0.1768626422 0.4622119665 ) 17 1 + vert 18 ( 0.1844285280 0.4281336665 ) 18 1 + vert 19 ( 0.1869396269 0.4167795181 ) 19 1 + vert 20 ( 0.1901422739 0.7083897591 ) 20 1 + vert 21 ( 0.2157285959 0.7197439075 ) 21 1 + vert 22 ( 0.6686197519 0.3548163772 ) 22 1 + vert 23 ( 0.3423711360 0.1277336478 ) 23 1 + vert 24 ( 0.0255380198 0.5737641454 ) 24 1 + vert 25 ( 0.0455269776 0.5866629481 ) 25 1 + vert 26 ( 0.5996038318 0.3548163772 ) 26 1 + vert 27 ( 0.1199815795 0.5866629481 ) 27 1 + vert 28 ( 0.0908734500 0.4167796969 ) 28 1 + vert 29 ( 0.1006828696 0.4054255486 ) 29 1 + vert 30 ( 0.4089916945 0.1277336478 ) 30 1 + vert 31 ( 0.5078796148 0.3548163772 ) 31 1 + vert 32 ( 0.0437058732 0.4746256471 ) 32 1 + vert 33 ( 0.0255379826 0.4888173342 ) 33 1 + vert 34 ( 0.2024006695 0.5639546812 ) 34 1 + vert 35 ( 0.1910465062 0.5737641454 ) 35 1 + vert 36 ( 0.2110354900 0.5866629481 ) 36 1 + vert 37 ( 0.6913279891 0.6970356703 ) 37 1 + vert 38 ( 0.8749999404 0.2500000000 ) 38 1 + vert 39 ( 0.2092143893 0.4746256471 ) 39 1 + vert 40 ( 0.1910464764 0.4888173342 ) 40 1 + vert 41 ( 0.7716981173 0.6970356703 ) 41 1 + vert 42 ( 0.3054790199 0.4888172746 ) 42 1 + vert 43 ( 0.2873110771 0.4746256471 ) 43 1 + vert 44 ( 0.2827706933 0.4859797955 ) 44 1 + vert 45 ( 0.7716981173 0.6970356703 ) 45 1 + vert 46 ( 0.7603439689 0.6970356703 ) 46 1 + vert 47 ( 0.2854900658 0.5866629481 ) 47 1 + vert 48 ( 0.3054789901 0.5737641156 ) 48 1 + vert 49 ( 0.1673034430 0.4054255486 ) 49 1 + vert 50 ( 0.1758200228 0.4167796969 ) 50 1 + vert 51 ( 0.1218025759 0.4746256471 ) 51 1 + vert 52 ( 0.5768955946 0.3548163772 ) 52 1 + vert 53 ( 0.6686196923 0.5351630747 ) 53 1 + vert 54 ( 0.6799738407 0.5351630747 ) 54 1 + vert 55 ( 0.3423711061 0.2853721380 ) 55 1 + vert 56 ( 0.6686196327 0.5124548674 ) 56 1 + vert 57 ( 0.5996038318 0.5351630747 ) 57 1 + vert 58 ( 0.5996037722 0.5124548674 ) 58 1 + vert 59 ( 0.1006828696 0.2477870584 ) 59 1 + vert 60 ( 0.5882496834 0.5351630747 ) 60 1 + vert 61 ( 0.4965255260 0.5351630747 ) 61 1 + vert 62 ( 0.5078796744 0.5351630747 ) 62 1 + vert 63 ( 0.5078796148 0.5124548674 ) 63 1 + vert 64 ( 0.4089916945 0.2853720784 ) 64 1 + vert 65 ( 0.0113540990 0.2435528636 ) 65 1 + vert 66 ( 0.6799738407 0.5393971503 ) 66 1 + vert 67 ( 0.6913279295 0.5393971801 ) 67 1 + vert 68 ( 0.6913279891 0.5166889131 ) 68 1 + vert 69 ( 0.0779746622 0.2435529232 ) 69 1 + vert 70 ( 0.8520681858 0.5166889131 ) 70 1 + vert 71 ( 0.8750000000 0.2500000000 ) 71 1 + vert 72 ( 0.2566326857 0.2250787616 ) 72 1 + vert 73 ( 0.7716981173 0.5393971503 ) 73 1 + vert 74 ( 0.7830522060 0.5393971801 ) 74 1 + vert 75 ( 0.7830522656 0.5166889131 ) 75 1 + vert 76 ( 0.1900120974 0.2250788212 ) 76 1 + vert 77 ( 0.7603439093 0.5166889131 ) 77 1 + vert 78 ( 0.7603438497 0.5393971801 ) 78 1 + vert 79 ( 0.7716980577 0.5393971503 ) 79 1 + vert 80 ( 0.5882496834 0.5351630747 ) 80 1 + vert 81 ( 0.1673034430 0.2477869987 ) 81 1 + vert 82 ( 0.5768954754 0.5124548674 ) 82 1 + vert 83 ( 0.5768955350 0.5351630747 ) 83 1 + vert 84 ( 0.6686196923 0.6970356405 ) 84 1 + vert 85 ( 0.3423711360 0.4813070297 ) 85 1 + vert 86 ( 0.3423711061 0.4699528813 ) 86 1 + vert 87 ( 0.5996038318 0.6970356405 ) 87 1 + vert 88 ( 0.1006828621 0.0632063746 ) 88 1 + vert 89 ( 0.1006828621 0.0518521667 ) 89 1 + vert 90 ( 0.4089916348 0.4699529409 ) 90 1 + vert 91 ( 0.4089916646 0.4813070297 ) 91 1 + vert 92 ( 0.5078796744 0.6970356405 ) 92 1 + vert 93 ( 0.0113540990 0.4054253697 ) 93 1 + vert 94 ( 0.6913279295 0.3548164368 ) 94 1 + vert 95 ( 0.0113540990 0.4167795777 ) 95 1 + vert 96 ( 0.0779746622 0.4054254293 ) 96 1 + vert 97 ( 0.0779746622 0.4167795181 ) 97 1 + vert 98 ( 0.8520681858 0.3548164368 ) 98 1 + vert 99 ( 0.2566326857 0.0632063150 ) 99 1 + vert 100 ( 0.7830522656 0.3548164368 ) 100 1 + vert 101 ( 0.2566326857 0.0518521667 ) 101 1 + vert 102 ( 0.1900120974 0.0632063746 ) 102 1 + vert 103 ( 0.1900120974 0.0518521667 ) 103 1 + vert 104 ( 0.7603439093 0.3548164368 ) 104 1 + vert 105 ( 0.1673034281 0.0632063150 ) 105 1 + vert 106 ( 0.5768955350 0.6970356405 ) 106 1 + vert 107 ( 0.1673034281 0.0518521667 ) 107 1 + vert 108 ( 0.4655197561 0.9819033202 ) 108 1 + vert 109 ( 0.0113541409 0.9886458702 ) 109 1 + vert 110 ( 0.1541543454 0.6249296069 ) 110 1 + vert 111 ( 0.4690954387 1.0000000000 ) 111 1 + vert 112 ( 0.5037595034 0.9886458423 ) 112 1 + vert 113 ( 0.4655196667 0.7910139561 ) 113 1 + vert 114 ( 0.2151023746 0.7083897591 ) 114 1 + vert 115 ( 0.1804383993 0.6970356405 ) 115 1 + vert 116 ( 0.1768626571 0.6249295175 ) 116 1 + vert 117 ( 0.2157286257 0.9886458702 ) 117 1 + vert 118 ( 0.5700801611 0.9886458432 ) 118 1 + vert 119 ( 0.6047441959 1.0000000000 ) 119 1 + vert 120 ( 0.0113541521 0.6249295175 ) 120 1 + vert 121 ( 0.4428113401 0.9886458702 ) 121 1 + vert 122 ( 0.6083199978 0.9819033183 ) 122 1 + vert 123 ( 0.3196628690 0.6249296069 ) 123 1 + vert 124 ( 0.3160871267 0.6970356405 ) 124 1 + vert 125 ( 0.2814231217 0.7083897591 ) 125 1 + vert 126 ( 0.6083198786 0.7910138816 ) 126 1 + vert 127 ( 0.2384368479 0.9886458702 ) 127 1 + vert 128 ( 0.4973703027 0.9665126987 ) 128 1 + vert 129 ( 0.5113238692 0.9849906061 ) 129 1 + vert 130 ( 0.5200785995 0.9736364484 ) 130 1 + vert 131 ( 0.5529161692 0.0113541484 ) 131 1 + vert 132 ( 0.5764693618 0.8064045161 ) 132 1 + vert 133 ( 0.5625157356 0.7879266143 ) 133 1 + vert 134 ( 0.2679870129 0.0846714377 ) 134 1 + vert 135 ( 0.5651151538 0.8106349111 ) 135 1 + vert 136 ( 0.5078796148 0.0113541484 ) 136 1 + vert 137 ( 0.5625157952 0.9849906052 ) 137 1 + vert 138 ( 0.5764693618 0.9665126987 ) 138 1 + vert 139 ( 0.5651152134 0.9622823149 ) 139 1 + vert 140 ( 0.4973703623 0.8064045161 ) 140 1 + vert 141 ( 0.9148896933 0.0328192115 ) 141 1 + vert 142 ( 0.9262437820 0.0328192711 ) 142 1 + vert 143 ( 0.5113239288 0.7879266143 ) 143 1 + vert 144 ( 0.5764693618 0.9105099961 ) 144 1 + vert 145 ( 0.5537610650 0.8991558626 ) 145 1 + vert 146 ( 0.9712803960 0.0328193307 ) 146 1 + vert 147 ( 0.9826345444 0.0328193307 ) 147 1 + vert 148 ( 0.4973703027 0.9105100036 ) 148 1 + vert 149 ( 0.9262437820 0.0328193307 ) 149 1 + vert 150 ( 0.5200785995 0.9105100036 ) 150 1 + vert 151 ( 0.5200786591 0.8991558552 ) 151 1 + vert 152 ( 0.4973703027 0.8621021807 ) 152 1 + vert 153 ( 0.5200786591 0.8734562993 ) 153 1 + vert 154 ( 0.5200785995 0.8621021509 ) 154 1 + vert 155 ( 0.9829396009 0.3762816191 ) 155 1 + vert 156 ( 0.5764693618 0.8621021509 ) 156 1 + vert 157 ( 0.9265488386 0.3762816191 ) 157 1 + vert 158 ( 0.9379029274 0.3762816787 ) 158 1 + vert 159 ( 0.5537610054 0.8734562993 ) 159 1 + vert 160 ( 0.5078796148 0.1748891473 ) 160 1 + vert 161 ( 0.5078796148 0.1521807909 ) 161 1 + vert 162 ( 0.4965254664 0.1521808505 ) 162 1 + vert 163 ( 0.4721183777 0.3127338290 ) 163 1 + vert 164 ( 0.5415620208 0.1748891473 ) 164 1 + vert 165 ( 0.8747765422 0.5398166478 ) 165 1 + vert 166 ( 0.5529162288 0.1521808505 ) 166 1 + vert 167 ( 0.5415620804 0.1521809101 ) 167 1 + vert 168 ( 0.5642703176 0.1748891473 ) 168 1 + vert 169 ( 0.9262438416 0.1736459732 ) 169 1 + vert 170 ( 0.9148896933 0.1736459732 ) 170 1 + vert 171 ( 0.9148896337 0.1963542700 ) 171 1 + vert 172 ( 0.5979527235 0.1748891473 ) 172 1 + vert 173 ( 0.2793411314 0.2482064962 ) 173 1 + vert 174 ( 0.2793411613 0.2254981399 ) 174 1 + vert 175 ( 0.2679870129 0.2254981995 ) 175 1 + vert 176 ( 0.4317001402 0.3127338886 ) 176 1 + vert 177 ( 0.9826345444 0.1736460328 ) 177 1 + vert 178 ( 0.9712803364 0.1736460924 ) 178 1 + vert 179 ( 0.9712803960 0.1963543892 ) 179 1 + vert 180 ( 0.9151946902 0.5398166776 ) 180 1 + vert 181 ( 0.9375978708 0.1963543892 ) 181 1 + vert 182 ( 0.9375979304 0.1736460924 ) 182 1 + vert 183 ( 0.9262437820 0.1736460328 ) 183 1 + vert 184 ( 0.8747764826 0.1963542700 ) 184 1 + vert 185 ( 0.9829396009 0.5171083212 ) 185 1 + vert 186 ( 0.9715854526 0.5171083510 ) 186 1 + vert 187 ( 0.9715854526 0.5398166478 ) 187 1 + vert 188 ( 0.3194543123 0.2482064366 ) 188 1 + vert 189 ( 0.9379030466 0.5398166478 ) 189 1 + vert 190 ( 0.9379030466 0.5171083212 ) 190 1 + vert 191 ( 0.9265488386 0.5171083212 ) 191 1 + vert 192 ( 0.5078796148 0.3321082592 ) 192 1 + vert 193 ( 0.4965255260 0.3321081996 ) 193 1 + vert 194 ( 0.4992022514 0.7615630478 ) 194 1 + vert 195 ( 0.5415620804 0.3321082592 ) 195 1 + vert 196 ( 0.4655197263 0.7615630627 ) 196 1 + vert 197 ( 0.5529162288 0.3321081996 ) 197 1 + vert 198 ( 0.5642702579 0.3321082592 ) 198 1 + vert 199 ( 0.9148896933 0.3535734415 ) 199 1 + vert 200 ( 0.5642703176 0.3434623480 ) 200 1 + vert 201 ( 0.5979527831 0.3321082592 ) 201 1 + vert 202 ( 0.5979527831 0.3434623480 ) 202 1 + vert 203 ( 0.2793411613 0.4054255486 ) 203 1 + vert 204 ( 0.9826345444 0.3535733819 ) 204 1 + vert 205 ( 0.9712803960 0.3535733819 ) 205 1 + vert 206 ( 0.4992022216 0.7211448550 ) 206 1 + vert 207 ( 0.9262437820 0.3535733819 ) 207 1 + vert 208 ( 0.4655197263 0.7211449146 ) 208 1 + vert 209 ( 0.9375979304 0.3535733819 ) 209 1 + vert 210 ( 0.8747765422 0.3535733819 ) 210 1 + vert 211 ( 0.9715854526 0.6970356703 ) 211 1 + vert 212 ( 0.8747765422 0.3649275303 ) 212 1 + vert 213 ( 0.3194543123 0.4054255486 ) 213 1 + vert 214 ( 0.3194543123 0.4167796969 ) 214 1 + vert 215 ( 0.9379030466 0.6970357001 ) 215 1 + vert 216 ( 0.8717506528 0.9513412639 ) 216 1 + vert 217 ( 0.8831048012 0.9460025094 ) 217 1 + vert 218 ( 0.3724106550 0.5624975562 ) 218 1 + vert 219 ( 0.8170980215 0.2076858282 ) 219 1 + vert 220 ( 0.8717506528 0.9886458628 ) 220 1 + vert 221 ( 0.8420943022 0.2831348181 ) 221 1 + vert 222 ( 0.4551318288 0.5624975562 ) 222 1 + vert 223 ( 0.8831048012 0.9939846145 ) 223 1 + vert 224 ( 0.8170980215 0.1587125063 ) 224 1 + vert 225 ( 0.8284521103 0.1508482695 ) 225 1 + vert 226 ( 0.3897802234 0.6420434117 ) 226 1 + vert 227 ( 0.5960801840 0.7615630627 ) 227 1 + vert 228 ( 0.8420943022 0.3321081400 ) 228 1 + vert 229 ( 0.5960800648 0.7242584825 ) 229 1 + vert 230 ( 0.4377623200 0.6420434117 ) 230 1 + vert 231 ( 0.8534483314 0.3399725556 ) 231 1 + vert 232 ( 0.8164433241 0.8922467679 ) 232 1 + vert 233 ( 0.7993190289 0.2190399170 ) 233 1 + vert 234 ( 0.8217107058 0.9149550349 ) 234 1 + vert 235 ( 0.8330649137 0.9077588320 ) 235 1 + vert 236 ( 0.7669651508 0.8922467604 ) 236 1 + vert 237 ( 0.7503436804 0.9077588320 ) 237 1 + vert 238 ( 0.8243153691 0.2831348777 ) 238 1 + vert 239 ( 0.7730519176 0.9036009014 ) 239 1 + vert 240 ( 0.8330648541 0.9711245559 ) 240 1 + vert 241 ( 0.8217107058 0.9639283530 ) 241 1 + vert 242 ( 0.5783011913 0.7615630776 ) 242 1 + vert 243 ( 0.8164434433 0.9866366293 ) 243 1 + vert 244 ( 0.7503436804 0.9711245559 ) 244 1 + vert 245 ( 0.7669650912 0.9866366293 ) 245 1 + vert 246 ( 0.5783011317 0.7242584825 ) 246 1 + vert 247 ( 0.7616977692 0.9639283493 ) 247 1 + vert 248 ( 0.6196740270 0.9886458712 ) 248 1 + vert 249 ( 0.8181428909 0.8902375251 ) 249 1 + vert 250 ( 0.8312636614 0.9098883271 ) 250 1 + vert 251 ( 0.8426177502 0.8902375326 ) 251 1 + vert 252 ( 0.7407905459 0.8642233163 ) 252 1 + vert 253 ( 0.7294365764 0.8642233014 ) 253 1 + vert 254 ( 0.7521448731 0.9098883271 ) 254 1 + vert 255 ( 0.7652655840 0.8902375326 ) 255 1 + vert 256 ( 0.6093068719 0.3321083784 ) 256 1 + vert 257 ( 0.8312636018 0.9689950645 ) 257 1 + vert 258 ( 0.8181428909 0.9886458609 ) 258 1 + vert 259 ( 0.6206609607 0.3321083188 ) 259 1 + vert 260 ( 0.7111338973 0.3321083188 ) 260 1 + vert 261 ( 0.7521448731 1.0000000000 ) 261 1 + vert 262 ( 0.7652655840 0.9886458609 ) 262 1 + vert 263 ( 0.7521449327 0.9689950645 ) 263 1 + vert 264 ( 0.6196740270 0.8869315833 ) 264 1 + vert 265 ( 0.6310282350 0.8869315758 ) 265 1 + vert 266 ( 0.7521449327 0.7658150196 ) 266 1 + vert 267 ( 0.7407906055 0.7625090182 ) 267 1 + vert 268 ( 0.8312637210 0.7658150196 ) 268 1 + vert 269 ( 0.7294364572 0.7625090480 ) 269 1 + vert 270 ( 0.6093068719 0.2303940654 ) 270 1 + vert 271 ( 0.6206610203 0.2303940654 ) 271 1 + vert 272 ( 0.7521448731 0.8642233759 ) 272 1 + vert 273 ( 0.7111338973 0.2303940058 ) 273 1 + vert 274 ( 0.8312635422 0.8642233759 ) 274 1 + vert 275 ( 0.6997797489 0.2303940654 ) 275 1 + vert 276 ( 0.4541654587 0.7538222075 ) 276 1 + vert 277 ( 0.4541654587 0.7197439075 ) 277 1 + vert 278 ( 0.4428113401 0.7083897591 ) 278 1 + vert 279 ( 0.3524481654 0.6970357299 ) 279 1 + vert 280 ( 0.4172250032 0.7083897591 ) 280 1 + vert 281 ( 0.4428113401 0.7083897591 ) 281 1 + vert 282 ( 0.2270827293 0.7538221925 ) 282 1 + vert 283 ( 0.2640231848 0.7083897591 ) 283 1 + vert 284 ( 0.2384368777 0.7083897591 ) 284 1 + vert 285 ( 0.3524481356 0.4926613569 ) 285 1 + vert 286 ( 0.0000000000 0.7538221925 ) 286 1 + vert 287 ( 0.0369404592 0.7083897591 ) 287 1 + vert 288 ( 0.0113541391 0.7083897591 ) 288 1 + vert 289 ( 0.4750943482 0.6970357299 ) 289 1 + vert 290 ( 0.2270827442 0.7538222075 ) 290 1 + vert 291 ( 0.2270827293 0.7197439075 ) 291 1 + vert 292 ( 0.2157285959 0.7083897591 ) 292 1 + vert 293 ( 0.4750943780 0.4926611781 ) 293 1 + vert 294 ( 0.2157285959 0.7083897591 ) 294 1 + vert 295 ( 0.6799738407 0.3548163772 ) 295 1 + vert 296 ( 0.6799738407 0.3434622288 ) 296 1 + vert 297 ( 0.3325617015 0.1163794994 ) 297 1 + vert 298 ( 0.6713390946 0.3434622288 ) 298 1 + vert 299 ( 0.5968844891 0.3434622288 ) 299 1 + vert 300 ( 0.5882496834 0.3434622288 ) 300 1 + vert 301 ( 0.1399705112 0.5737641156 ) 301 1 + vert 302 ( 0.5882496834 0.3548163772 ) 302 1 + vert 303 ( 0.4965254962 0.3548163772 ) 303 1 + vert 304 ( 0.5033392906 0.3434622288 ) 304 1 + vert 305 ( 0.2024006844 0.5753087997 ) 305 1 + vert 306 ( 0.0113541000 0.0632060766 ) 306 1 + vert 307 ( 0.6799738407 0.6970356703 ) 307 1 + vert 308 ( 0.2019880414 0.5767972767 ) 308 1 + vert 309 ( 0.2137548327 0.5753087997 ) 309 1 + vert 310 ( 0.2024006248 0.4859797955 ) 310 1 + vert 311 ( 0.0893287659 0.0575290918 ) 311 1 + vert 312 ( 0.8634223938 0.7027127445 ) 312 1 + vert 313 ( 0.1991951317 0.4799671173 ) 313 1 + vert 314 ( 0.2941248417 0.4973339438 ) 314 1 + vert 315 ( 0.2566326857 0.4054255486 ) 315 1 + vert 316 ( 0.2973303199 0.4799671173 ) 316 1 + vert 317 ( 0.2941249013 0.5753087997 ) 317 1 + vert 318 ( 0.1900121123 0.4054255486 ) 318 1 + vert 319 ( 0.2941249013 0.5639546812 ) 319 1 + vert 320 ( 0.2945375144 0.5767972767 ) 320 1 + vert 321 ( 0.5882496834 0.3548163772 ) 321 1 + vert 322 ( 0.5882496834 0.3434622288 ) 322 1 + vert 323 ( 0.1399704814 0.4888172746 ) 323 1 + vert 324 ( 0.6686197519 0.5238089561 ) 324 1 + vert 325 ( 0.6799738407 0.5238089561 ) 325 1 + vert 326 ( 0.3423711061 0.3080803156 ) 326 1 + vert 327 ( 0.5996037722 0.5238089561 ) 327 1 + vert 328 ( 0.5882496834 0.5124548376 ) 328 1 + vert 329 ( 0.5882496834 0.5238089561 ) 329 1 + vert 330 ( 0.1006828547 0.2250788212 ) 330 1 + vert 331 ( 0.4965255260 0.5238089561 ) 331 1 + vert 332 ( 0.4089916348 0.3080803752 ) 332 1 + vert 333 ( 0.5078796148 0.5238089561 ) 333 1 + vert 334 ( 0.6799738407 0.5166888833 ) 334 1 + vert 335 ( 0.6799738407 0.5280430317 ) 335 1 + vert 336 ( 0.0113541000 0.2208446264 ) 336 1 + vert 337 ( 0.6913279891 0.5280430317 ) 337 1 + vert 338 ( 0.8634223342 0.5166889131 ) 338 1 + vert 339 ( 0.8634223342 0.5280430317 ) 339 1 + vert 340 ( 0.0893287659 0.2265216708 ) 340 1 + vert 341 ( 0.8634223342 0.5337201059 ) 341 1 + vert 342 ( 0.7716981173 0.5166888833 ) 342 1 + vert 343 ( 0.7716981173 0.5280430317 ) 343 1 + vert 344 ( 0.2566326857 0.2477869987 ) 344 1 + vert 345 ( 0.7830522656 0.5280430317 ) 345 1 + vert 346 ( 0.7716980577 0.5166889131 ) 346 1 + vert 347 ( 0.7603439093 0.5280430317 ) 347 1 + vert 348 ( 0.5882496834 0.5238089561 ) 348 1 + vert 349 ( 0.1673034132 0.2250787616 ) 349 1 + vert 350 ( 0.5768955350 0.5238089561 ) 350 1 + vert 351 ( 0.6686197519 0.7083897591 ) 351 1 + vert 352 ( 0.7766107321 0.2076857090 ) 352 1 + vert 353 ( 0.5882496834 0.6970356405 ) 353 1 + vert 354 ( 0.5996037722 0.7083897591 ) 354 1 + vert 355 ( 0.7766107917 0.1386697888 ) 355 1 + vert 356 ( 0.4965255260 0.6970356405 ) 356 1 + vert 357 ( 0.5078796148 0.7083897591 ) 357 1 + vert 358 ( 0.7099901438 0.2076856494 ) 358 1 + vert 359 ( 0.6799738407 0.3548164964 ) 359 1 + vert 360 ( 0.6913279891 0.3434623480 ) 360 1 + vert 361 ( 0.6872814894 0.2076857090 ) 361 1 + vert 362 ( 0.8634223342 0.3548164368 ) 362 1 + vert 363 ( 0.8520681858 0.3434623480 ) 363 1 + vert 364 ( 0.6206609011 0.2076856494 ) 364 1 + vert 365 ( 0.7716981173 0.3548164964 ) 365 1 + vert 366 ( 0.7830522656 0.3434623480 ) 366 1 + vert 367 ( 0.6206608415 0.1386698484 ) 367 1 + vert 368 ( 0.7716980577 0.3548164368 ) 368 1 + vert 369 ( 0.5882496834 0.6970356405 ) 369 1 + vert 370 ( 0.0180966761 1.0000000000 ) 370 1 + vert 371 ( 0.0000000000 0.9165397808 ) 371 1 + vert 372 ( 0.0000000000 0.9886458581 ) 372 1 + vert 373 ( 0.1505786180 0.6970356405 ) 373 1 + vert 374 ( 0.2089861035 1.0000000000 ) 374 1 + vert 375 ( 0.2157286406 1.0000000000 ) 375 1 + vert 376 ( 0.5037594438 0.7842713892 ) 376 1 + vert 377 ( 0.2270827889 0.9886458693 ) 377 1 + vert 378 ( 0.4428113997 1.0000000000 ) 378 1 + vert 379 ( 0.4541655481 0.9886458693 ) 379 1 + vert 380 ( 0.0149298850 0.6970356405 ) 380 1 + vert 381 ( 0.4360688329 1.0000000000 ) 381 1 + vert 382 ( 0.2270827293 0.9165397808 ) 382 1 + vert 383 ( 0.2270827293 0.9886458581 ) 383 1 + vert 384 ( 0.2384368777 1.0000000000 ) 384 1 + vert 385 ( 0.5700801611 0.7842713892 ) 385 1 + vert 386 ( 0.5063839555 0.9747674149 ) 386 1 + vert 387 ( 0.5087244511 0.9736364484 ) 387 1 + vert 388 ( 0.5415619612 0.0113542080 ) 388 1 + vert 389 ( 0.5087244511 0.9622823149 ) 389 1 + vert 390 ( 0.8747766018 0.3762815595 ) 390 1 + vert 391 ( 0.5715293288 0.7961813509 ) 391 1 + vert 392 ( 0.5537610054 0.7992807627 ) 392 1 + vert 393 ( 0.5979526639 0.0113542080 ) 393 1 + vert 394 ( 0.5651151538 0.7992807627 ) 394 1 + vert 395 ( 0.2793411613 0.0846714973 ) 395 1 + vert 396 ( 0.5537610650 0.9736364484 ) 396 1 + vert 397 ( 0.5715293884 0.9767358638 ) 397 1 + vert 398 ( 0.5651152134 0.9736364484 ) 398 1 + vert 399 ( 0.4721183479 0.1491987705 ) 399 1 + vert 400 ( 0.4965254366 0.0113541484 ) 400 1 + vert 401 ( 0.5087244511 0.8106349111 ) 401 1 + vert 402 ( 0.5087244511 0.7992807627 ) 402 1 + vert 403 ( 0.5642702579 0.0113541484 ) 403 1 + vert 404 ( 0.5200785995 0.7992807627 ) 404 1 + vert 405 ( 0.5063839555 0.7981497943 ) 405 1 + vert 406 ( 0.5651152134 0.9105100036 ) 406 1 + vert 407 ( 0.5537610650 0.9105100036 ) 407 1 + vert 408 ( 0.5651152134 0.9105100036 ) 408 1 + vert 409 ( 0.4317001402 0.1491986513 ) 409 1 + vert 410 ( 0.5651152134 0.9218641371 ) 410 1 + vert 411 ( 0.5087244511 0.9218641371 ) 411 1 + vert 412 ( 0.9151947498 0.3762814999 ) 412 1 + vert 413 ( 0.5087244511 0.9105100036 ) 413 1 + vert 414 ( 0.9375978708 0.0328193307 ) 414 1 + vert 415 ( 0.5087244511 0.8991558626 ) 415 1 + vert 416 ( 0.5087244511 0.8734562993 ) 416 1 + vert 417 ( 0.5087244511 0.8621021509 ) 417 1 + vert 418 ( 0.9715853930 0.3762816787 ) 418 1 + vert 419 ( 0.5087244511 0.8507480174 ) 419 1 + vert 420 ( 0.8747765422 0.0328192711 ) 420 1 + vert 421 ( 0.5651151538 0.8621021509 ) 421 1 + vert 422 ( 0.5651151538 0.8621021509 ) 422 1 + vert 423 ( 0.3194543421 0.0846713781 ) 423 1 + vert 424 ( 0.5651151538 0.8507480323 ) 424 1 + vert 425 ( 0.5078796148 0.1635349989 ) 425 1 + vert 426 ( 0.4965254962 0.1635349989 ) 426 1 + vert 427 ( 0.4721183479 0.2900254726 ) 427 1 + vert 428 ( 0.4965254962 0.1748891473 ) 428 1 + vert 429 ( 0.5529162884 0.1748891473 ) 429 1 + vert 430 ( 0.5529162288 0.1635349989 ) 430 1 + vert 431 ( 0.8747766018 0.5171083212 ) 431 1 + vert 432 ( 0.5415620804 0.1635349989 ) 432 1 + vert 433 ( 0.9262438416 0.1963542700 ) 433 1 + vert 434 ( 0.9262437820 0.1850001216 ) 434 1 + vert 435 ( 0.5642703176 0.1521807909 ) 435 1 + vert 436 ( 0.9148896337 0.1850001812 ) 436 1 + vert 437 ( 0.2679870129 0.2482064962 ) 437 1 + vert 438 ( 0.2793411613 0.2368523479 ) 438 1 + vert 439 ( 0.9826345444 0.1963543296 ) 439 1 + vert 440 ( 0.9826345444 0.1850001812 ) 440 1 + vert 441 ( 0.4317001402 0.2900255322 ) 441 1 + vert 442 ( 0.9712803960 0.1850001812 ) 442 1 + vert 443 ( 0.9262438416 0.1963543296 ) 443 1 + vert 444 ( 0.9375978708 0.1850001812 ) 444 1 + vert 445 ( 0.9829396009 0.5398166180 ) 445 1 + vert 446 ( 0.9829396009 0.5284624696 ) 446 1 + vert 447 ( 0.8747766018 0.1736459732 ) 447 1 + vert 448 ( 0.9715854526 0.5284624696 ) 448 1 + vert 449 ( 0.9265487790 0.5398166180 ) 449 1 + vert 450 ( 0.9379029870 0.5284624696 ) 450 1 + vert 451 ( 0.4992021918 0.7729172111 ) 451 1 + vert 452 ( 0.5105563402 0.7615630627 ) 452 1 + vert 453 ( 0.4721183479 0.4699529409 ) 453 1 + vert 454 ( 0.4655197263 0.7729172111 ) 454 1 + vert 455 ( 0.4541656077 0.7615630925 ) 455 1 + vert 456 ( 0.8747765422 0.6970357299 ) 456 1 + vert 457 ( 0.9262437820 0.3535734415 ) 457 1 + vert 458 ( 0.9148896933 0.3649275303 ) 458 1 + vert 459 ( 0.5219103694 0.7214499116 ) 459 1 + vert 460 ( 0.2679870129 0.4054255486 ) 460 1 + vert 461 ( 0.2793411613 0.4167796969 ) 461 1 + vert 462 ( 0.5555927753 0.7214499414 ) 462 1 + vert 463 ( 0.5105563402 0.7211448550 ) 463 1 + vert 464 ( 0.4317001402 0.4699529409 ) 464 1 + vert 465 ( 0.4992021918 0.7097907066 ) 465 1 + vert 466 ( 0.4541656077 0.7211449146 ) 466 1 + vert 467 ( 0.9151947498 0.6970357001 ) 467 1 + vert 468 ( 0.9829396009 0.6970356703 ) 468 1 + vert 469 ( 0.9715854526 0.7083898187 ) 469 1 + vert 470 ( 0.5219104290 0.7615630627 ) 470 1 + vert 471 ( 0.9265488982 0.6970357299 ) 471 1 + vert 472 ( 0.8170979023 0.2190399766 ) 472 1 + vert 473 ( 0.8284521103 0.2190399766 ) 473 1 + vert 474 ( 0.3897802234 0.5476535261 ) 474 1 + vert 475 ( 0.8284521103 0.2155501842 ) 475 1 + vert 476 ( 0.8420942426 0.2717807293 ) 476 1 + vert 477 ( 0.8534483910 0.2752705812 ) 477 1 + vert 478 ( 0.5960801244 0.7729172111 ) 478 1 + vert 479 ( 0.6074342728 0.7729172111 ) 479 1 + vert 480 ( 0.3724106550 0.6271994710 ) 480 1 + vert 481 ( 0.6074342728 0.7669018358 ) 481 1 + vert 482 ( 0.5960801244 0.7129043341 ) 482 1 + vert 483 ( 0.6074342728 0.7189197242 ) 483 1 + vert 484 ( 0.8103566170 0.9036009014 ) 484 1 + vert 485 ( 0.8539717197 0.9513412639 ) 485 1 + vert 486 ( 0.8217107058 0.9036009014 ) 486 1 + vert 487 ( 0.7993190289 0.2076857686 ) 487 1 + vert 488 ( 0.8243958950 0.9004262984 ) 488 1 + vert 489 ( 0.7582961321 0.8995793015 ) 489 1 + vert 490 ( 0.7616977692 0.9149550349 ) 490 1 + vert 491 ( 0.5669469833 0.7729172111 ) 491 1 + vert 492 ( 0.5669469833 0.7676499188 ) 492 1 + vert 493 ( 0.5669469833 0.7129043341 ) 493 1 + vert 494 ( 0.8312636018 0.8788833991 ) 494 1 + vert 495 ( 0.8016068935 0.3321083188 ) 495 1 + vert 496 ( 0.8225947022 0.9025558010 ) 496 1 + vert 497 ( 0.8370193243 0.8855021596 ) 497 1 + vert 498 ( 0.6310282350 0.9886458647 ) 498 1 + vert 499 ( 0.7455260754 0.8844818100 ) 499 1 + vert 500 ( 0.7224881649 0.3321083188 ) 500 1 + vert 501 ( 0.7521448731 0.8788833916 ) 501 1 + vert 502 ( 0.7407907248 0.8902375251 ) 502 1 + vert 503 ( 0.7565966845 0.8975700662 ) 503 1 + vert 504 ( 0.8370193839 0.9933812311 ) 504 1 + vert 505 ( 0.7294365764 0.9886458647 ) 505 1 + vert 506 ( 0.8426177502 0.9886458628 ) 506 1 + vert 507 ( 0.8225947022 0.9763275962 ) 507 1 + vert 508 ( 0.8312636018 1.0000000000 ) 508 1 + vert 509 ( 0.7407907248 0.9886458591 ) 509 1 + vert 510 ( 0.6310282350 0.8642233014 ) 510 1 + vert 511 ( 0.7455261350 0.9944015788 ) 511 1 + vert 512 ( 0.6997798085 0.3321083188 ) 512 1 + vert 513 ( 0.7565966845 0.9813133236 ) 513 1 + vert 514 ( 0.7521448731 0.7544609010 ) 514 1 + vert 515 ( 0.8016068935 0.2303940654 ) 515 1 + vert 516 ( 0.7407907248 0.7658150494 ) 516 1 + vert 517 ( 0.8312636614 0.7544608861 ) 517 1 + vert 518 ( 0.7224881649 0.2303940654 ) 518 1 + vert 519 ( 0.8426177502 0.7658150494 ) 519 1 + vert 520 ( 0.7407907248 0.8642233759 ) 520 1 + vert 521 ( 0.7294364572 0.8869315907 ) 521 1 + vert 522 ( 0.7521449327 0.8755775094 ) 522 1 + vert 523 ( 0.8426177502 0.8642233759 ) 523 1 + vert 524 ( 0.6310282350 0.7625090182 ) 524 1 + vert 525 ( 0.2270827442 0.7197438776 ) 525 1 + vert 526 ( 0.0000000000 0.7197438776 ) 526 1 + vert 527 ( 0.1901422739 0.7083897591 ) 527 1 + vert 528 ( 0.4851714075 0.5182475150 ) 528 1 + vert 529 ( 0.4965254962 0.3434622288 ) 529 1 + vert 530 ( 0.4175082445 0.1163794994 ) 530 1 + vert 531 ( 0.2941248417 0.4859797955 ) 531 1 + vert 532 ( 0.7830522656 0.6970356703 ) 532 1 + vert 533 ( 0.2827707529 0.5753088295 ) 533 1 + vert 534 ( 0.5814359188 0.3434622288 ) 534 1 + vert 535 ( 0.6799738407 0.5124548376 ) 535 1 + vert 536 ( 0.4965255260 0.5124548376 ) 536 1 + vert 537 ( 0.7716980577 0.5280430317 ) 537 1 + vert 538 ( 0.1900121123 0.2477870584 ) 538 1 + vert 539 ( 0.5882496834 0.5124548376 ) 539 1 + vert 540 ( 0.6799738407 0.6970356405 ) 540 1 + vert 541 ( 0.7603439093 0.3434623480 ) 541 1 + vert 542 ( 0.6872815490 0.1386697888 ) 542 1 + vert 543 ( 0.5768955350 0.7083897591 ) 543 1 + vert 544 ( 0.7099900842 0.1386698484 ) 544 1 + vert 545 ( 0.0113541419 1.0000000000 ) 545 1 + vert 546 ( 0.2270827740 0.9165397361 ) 546 1 + vert 547 ( 0.4541655183 0.9165397361 ) 547 1 + vert 548 ( 0.2451793849 1.0000000000 ) 548 1 + vert 549 ( 0.5537610054 0.8621021509 ) 549 1 + vert 550 ( 0.2679870129 0.2368523479 ) 550 1 + vert 551 ( 0.5979527235 0.1521809101 ) 551 1 + vert 552 ( 0.9262437820 0.1850001812 ) 552 1 + vert 553 ( 0.9151947498 0.5171083510 ) 553 1 + vert 554 ( 0.9265488386 0.5284624696 ) 554 1 + vert 555 ( 0.3194543123 0.2254981995 ) 555 1 + vert 556 ( 0.4655197561 0.7097907662 ) 556 1 + vert 557 ( 0.9379030466 0.7083898485 ) 557 1 + vert 558 ( 0.5555928946 0.7615630627 ) 558 1 + vert 559 ( 0.8534483910 0.2717807293 ) 559 1 + vert 560 ( 0.4377623200 0.5476535559 ) 560 1 + vert 561 ( 0.6074342728 0.7129043341 ) 561 1 + vert 562 ( 0.4551318288 0.6271994412 ) 562 1 + vert 563 ( 0.7616977692 0.9036009014 ) 563 1 + vert 564 ( 0.8539717197 0.9886458637 ) 564 1 + vert 565 ( 0.8243153095 0.2717807293 ) 565 1 + vert 566 ( 0.5783011913 0.7729172111 ) 566 1 + vert 567 ( 0.7993190289 0.1587125063 ) 567 1 + vert 568 ( 0.5669469833 0.7181716263 ) 568 1 + vert 569 ( 0.5783011913 0.7129043341 ) 569 1 + vert 570 ( 0.8243153691 0.3321081400 ) 570 1 + vert 571 ( 0.8312636018 0.8755775094 ) 571 1 + vert 572 ( 0.4541654587 0.7538222075 ) 572 1 + vert 573 ( 0.4172250032 0.7083897591 ) 573 1 + vert 574 ( 0.2270827442 0.7538222075 ) 574 1 + vert 575 ( 0.2024006248 0.4859797955 ) 575 1 + numtris 546 + tri 0 11 43 18 + tri 1 9 218 5 + tri 2 14 562 528 + tri 3 279 226 289 + tri 4 30 64 23 + tri 5 311 340 306 + tri 6 380 25 373 + tri 7 532 74 312 + tri 8 110 301 12 + tri 9 293 560 285 + tri 10 121 127 6 + tri 11 117 109 21 + tri 12 22 56 26 + tri 13 83 106 62 + tri 14 75 100 70 + tri 15 0 1 38 + tri 16 53 84 57 + tri 17 29 59 49 + tri 18 115 36 124 + tri 19 52 82 31 + tri 20 37 67 46 + tri 21 148 108 113 + tri 22 542 361 367 + tri 23 68 94 77 + tri 24 332 90 326 + tri 25 69 96 65 + tri 26 76 102 72 + tri 27 355 352 544 + tri 28 330 88 349 + tri 29 143 376 133 + tri 30 122 138 144 + tri 31 118 112 137 + tri 32 418 186 158 + tri 33 388 167 136 + tri 34 164 195 160 + tri 35 163 453 176 + tri 36 180 467 165 + tri 37 412 553 390 + tri 38 393 551 403 + tri 39 141 170 420 + tri 40 399 427 409 + tri 41 153 159 151 + tri 42 423 555 395 + tri 43 558 470 462 + tri 44 220 564 216 + tri 45 196 208 194 + tri 46 188 213 173 + tri 47 172 201 168 + tri 48 171 199 184 + tri 49 179 205 181 + tri 50 187 211 189 + tri 51 236 255 232 + tri 52 40 35 17 + tri 53 123 48 7 + tri 54 16 51 3 + tri 55 243 258 245 + tri 56 228 570 221 + tri 57 227 242 229 + tri 58 219 487 224 + tri 59 272 266 274 + tri 60 235 250 240 + tri 61 500 518 495 + tri 62 244 263 237 + tri 63 510 524 253 + tri 64 259 271 512 + tri 65 498 265 505 + tri 66 146 178 414 + tri 67 318 538 315 + tri 68 281 280 278 + tri 69 525 284 8 + tri 70 526 288 13 + tri 71 294 527 292 + tri 72 298 296 22 + tri 73 302 300 26 + tri 74 303 529 31 + tri 75 305 309 308 + tri 76 40 313 575 + tri 77 314 531 42 + tri 78 317 320 533 + tri 79 321 52 322 + tri 80 324 56 325 + tri 81 327 329 58 + tri 82 331 536 333 + tri 83 334 68 335 + tri 84 339 70 338 + tri 85 342 75 343 + tri 86 346 537 77 + tri 87 348 350 539 + tri 88 540 351 84 + tri 89 354 353 87 + tri 90 92 357 356 + tri 91 360 94 359 + tri 92 98 363 362 + tri 93 366 100 365 + tri 94 104 541 368 + tri 95 543 106 369 + tri 96 372 371 109 + tri 97 117 546 377 + tri 98 381 121 379 + tri 99 127 548 383 + tri 100 128 389 386 + tri 101 391 394 133 + tri 102 396 398 137 + tri 103 140 405 401 + tri 104 408 407 406 + tri 105 415 413 148 + tri 106 419 417 152 + tri 107 159 549 421 + tri 108 160 428 425 + tri 109 164 432 429 + tri 110 433 171 434 + tri 111 437 550 173 + tri 112 439 179 440 + tri 113 443 552 181 + tri 114 445 187 446 + tri 115 449 554 189 + tri 116 194 452 451 + tri 117 455 196 454 + tri 118 458 199 457 + tri 119 203 461 460 + tri 120 206 465 463 + tri 121 556 208 466 + tri 122 469 211 468 + tri 123 215 557 471 + tri 124 219 475 472 + tri 125 559 477 476 + tri 126 478 227 479 + tri 127 482 561 229 + tri 128 232 488 484 + tri 129 489 563 237 + tri 130 492 242 491 + tri 131 569 246 493 + tri 132 494 497 249 + tri 133 499 503 502 + tri 134 508 258 504 + tri 135 263 513 509 + tri 136 266 516 514 + tri 137 519 268 517 + tri 138 272 522 520 + tri 139 571 274 523 + tri 140 370 109 374 + tri 141 118 119 112 + tri 142 572 547 6 + tri 143 117 21 546 + tri 144 282 8 382 + tri 145 286 13 371 + tri 146 10 11 19 + tri 147 573 6 283 + tri 148 114 115 125 + tri 149 20 21 287 + tri 150 15 16 4 + tri 151 548 127 381 + tri 152 298 22 299 + tri 153 30 23 530 + tri 154 35 40 34 + tri 155 314 42 319 + tri 156 49 50 29 + tri 157 43 44 39 + tri 158 36 309 47 + tri 159 52 31 534 + tri 160 373 27 110 + tri 161 24 25 120 + tri 162 3 32 2 + tri 163 323 51 12 + tri 164 124 47 123 + tri 165 35 36 116 + tri 166 18 39 17 + tri 167 42 43 7 + tri 168 56 53 58 + tri 169 64 332 55 + tri 170 65 336 69 + tri 171 72 344 76 + tri 172 349 81 330 + tri 173 75 70 74 + tri 174 67 68 78 + tri 175 82 83 63 + tri 176 302 26 328 + tri 177 535 56 295 + tri 178 303 31 536 + tri 179 539 82 321 + tri 180 73 74 41 + tri 181 78 79 46 + tri 182 66 67 307 + tri 183 84 351 87 + tri 184 90 91 86 + tri 185 95 93 97 + tri 186 101 99 103 + tri 187 107 105 89 + tri 188 100 366 98 + tri 189 94 360 104 + tri 190 106 543 92 + tri 191 346 77 368 + tri 192 359 94 334 + tri 193 83 80 106 + tri 194 87 353 57 + tri 195 98 362 70 + tri 196 540 84 54 + tri 197 61 62 356 + tri 198 365 100 342 + tri 199 113 376 140 + tri 200 108 128 112 + tri 201 133 385 132 + tri 202 137 129 396 + tri 203 143 133 404 + tri 204 122 118 138 + tri 205 139 410 138 + tri 206 389 128 411 + tri 207 145 407 151 + tri 208 152 140 419 + tri 209 156 424 132 + tri 210 549 159 154 + tri 211 160 161 164 + tri 212 168 435 172 + tri 213 427 163 441 + tri 214 165 431 180 + tri 215 178 179 182 + tri 216 184 447 171 + tri 217 555 188 174 + tri 218 189 190 187 + tri 219 157 158 191 + tri 220 185 186 155 + tri 221 149 414 183 + tri 222 177 178 147 + tri 223 400 136 162 + tri 224 166 167 131 + tri 225 134 395 175 + tri 226 169 170 142 + tri 227 194 451 196 + tri 228 200 198 202 + tri 229 452 194 463 + tri 230 196 455 208 + tri 231 465 206 556 + tri 232 212 210 458 + tri 233 213 214 203 + tri 234 557 215 469 + tri 235 179 439 205 + tri 236 192 193 160 + tri 237 197 195 429 + tri 238 449 189 471 + tri 239 468 211 445 + tri 240 457 199 433 + tri 241 209 207 181 + tri 242 203 460 173 + tri 243 216 217 220 + tri 244 224 225 219 + tri 245 221 477 228 + tri 246 229 483 227 + tri 247 285 474 9 + tri 248 222 560 528 + tri 249 562 14 230 + tri 250 279 5 226 + tri 251 232 484 236 + tri 252 240 241 235 + tri 253 237 490 244 + tri 254 568 246 492 + tri 255 482 229 569 + tri 256 566 242 478 + tri 257 233 487 472 + tri 258 476 221 565 + tri 259 494 249 501 + tri 260 506 257 251 + tri 261 502 254 509 + tri 262 261 262 508 + tri 263 237 254 236 + tri 264 263 244 262 + tri 265 232 249 235 + tri 266 258 243 257 + tri 267 266 514 268 + tri 268 272 520 266 + tri 269 268 519 274 + tri 270 274 571 272 + tri 271 260 512 273 + tri 272 270 271 256 + tri 273 264 265 248 + tri 274 252 253 267 + tri 275 144 145 156 + tri 276 152 153 148 + tri 277 33 24 2 + tri 278 43 39 18 + tri 279 218 480 5 + tri 280 562 222 528 + tri 281 226 230 289 + tri 282 64 55 23 + tri 283 340 336 306 + tri 284 25 27 373 + tri 285 74 341 312 + tri 286 301 323 12 + tri 287 560 474 285 + tri 288 127 8 6 + tri 289 109 13 21 + tri 290 56 58 26 + tri 291 106 92 62 + tri 292 100 98 70 + tri 293 1 71 38 + tri 294 84 87 57 + tri 295 59 81 49 + tri 296 36 47 124 + tri 297 82 63 31 + tri 298 67 78 46 + tri 299 108 148 128 + tri 300 113 152 148 + tri 301 113 140 152 + tri 302 361 364 367 + tri 303 94 104 77 + tri 304 90 86 326 + tri 305 96 93 65 + tri 306 102 99 72 + tri 307 352 358 544 + tri 308 88 105 349 + tri 309 376 385 133 + tri 310 144 126 122 + tri 311 156 132 126 + tri 312 126 144 156 + tri 313 112 129 137 + tri 314 186 190 158 + tri 315 167 161 136 + tri 316 195 192 160 + tri 317 453 464 176 + tri 318 467 456 165 + tri 319 553 431 390 + tri 320 551 435 403 + tri 321 170 447 420 + tri 322 427 441 409 + tri 323 159 145 151 + tri 324 555 174 395 + tri 325 470 459 462 + tri 326 564 485 216 + tri 327 208 206 194 + tri 328 213 203 173 + tri 329 201 198 168 + tri 330 199 210 184 + tri 331 205 209 181 + tri 332 211 215 189 + tri 333 255 249 232 + tri 334 35 116 17 + tri 335 48 42 7 + tri 336 51 32 3 + tri 337 258 262 245 + tri 338 570 238 221 + tri 339 242 246 229 + tri 340 487 567 224 + tri 341 266 268 274 + tri 342 250 257 240 + tri 343 518 515 495 + tri 344 263 254 237 + tri 345 524 269 253 + tri 346 271 275 512 + tri 347 265 521 505 + tri 348 178 182 414 + tri 349 538 344 315 + tri 350 277 276 281 + tri 351 281 278 277 + tri 352 8 282 525 + tri 353 284 283 8 + tri 354 13 286 526 + tri 355 288 287 13 + tri 356 291 290 294 + tri 357 294 292 291 + tri 358 296 295 22 + tri 359 300 299 26 + tri 360 529 304 31 + tri 361 309 36 308 + tri 362 531 316 42 + tri 363 320 47 533 + tri 364 52 534 322 + tri 365 56 535 325 + tri 366 329 328 58 + tri 367 536 63 333 + tri 368 68 337 335 + tri 369 75 345 343 + tri 370 537 347 77 + tri 371 350 82 539 + tri 372 372 370 545 + tri 373 372 109 370 + tri 374 377 374 117 + tri 375 377 375 374 + tri 376 379 378 381 + tri 377 121 547 379 + tri 378 383 382 127 + tri 379 548 384 383 + tri 380 389 387 386 + tri 381 394 392 133 + tri 382 398 397 137 + tri 383 405 402 401 + tri 384 407 145 406 + tri 385 413 411 148 + tri 386 417 416 152 + tri 387 549 422 421 + tri 388 428 426 425 + tri 389 432 430 429 + tri 390 171 436 434 + tri 391 550 438 173 + tri 392 179 442 440 + tri 393 552 444 181 + tri 394 187 448 446 + tri 395 554 450 189 + tri 396 475 473 472 + tri 397 477 221 476 + tri 398 227 481 479 + tri 399 561 483 229 + tri 400 488 486 484 + tri 401 563 490 237 + tri 402 242 566 491 + tri 403 246 568 493 + tri 404 497 496 249 + tri 405 503 254 502 + tri 406 258 507 504 + tri 407 513 511 509 + tri 408 109 117 374 + tri 409 119 111 112 + tri 410 547 121 6 + tri 411 21 574 546 + tri 412 8 127 382 + tri 413 13 109 371 + tri 414 11 18 19 + tri 415 6 8 283 + tri 416 115 124 125 + tri 417 21 13 287 + tri 418 16 3 4 + tri 419 127 121 381 + tri 420 22 26 299 + tri 421 23 297 530 + tri 422 40 575 34 + tri 423 42 48 319 + tri 424 50 28 29 + tri 425 44 310 39 + tri 426 309 533 47 + tri 427 31 304 534 + tri 428 27 301 110 + tri 429 25 380 120 + tri 430 32 33 2 + tri 431 51 16 12 + tri 432 47 48 123 + tri 433 36 115 116 + tri 434 39 40 17 + tri 435 43 11 7 + tri 436 53 57 58 + tri 437 332 326 55 + tri 438 336 340 69 + tri 439 344 538 76 + tri 440 81 59 330 + tri 441 70 341 74 + tri 442 68 77 78 + tri 443 83 62 63 + tri 444 26 58 328 + tri 445 56 22 295 + tri 446 31 63 536 + tri 447 82 52 321 + tri 448 74 532 41 + tri 449 79 45 46 + tri 450 67 37 307 + tri 451 351 354 87 + tri 452 91 85 86 + tri 453 93 96 97 + tri 454 99 102 103 + tri 455 105 88 89 + tri 456 366 363 98 + tri 457 360 541 104 + tri 458 543 357 92 + tri 459 77 104 368 + tri 460 94 68 334 + tri 461 80 369 106 + tri 462 353 60 57 + tri 463 362 338 70 + tri 464 84 53 54 + tri 465 62 92 356 + tri 466 100 75 342 + tri 467 376 143 140 + tri 468 128 129 112 + tri 469 385 126 132 + tri 470 129 130 396 + tri 471 133 392 404 + tri 472 118 137 138 + tri 473 410 144 138 + tri 474 128 148 411 + tri 475 407 150 151 + tri 476 140 401 419 + tri 477 424 135 132 + tri 478 159 153 154 + tri 479 161 167 164 + tri 480 435 551 172 + tri 481 163 176 441 + tri 482 431 553 180 + tri 483 179 181 182 + tri 484 447 170 171 + tri 485 188 173 174 + tri 486 190 186 187 + tri 487 158 190 191 + tri 488 186 418 155 + tri 489 414 182 183 + tri 490 178 146 147 + tri 491 136 161 162 + tri 492 167 388 131 + tri 493 395 174 175 + tri 494 170 141 142 + tri 495 451 454 196 + tri 496 198 201 202 + tri 497 194 206 463 + tri 498 455 466 208 + tri 499 206 208 556 + tri 500 210 199 458 + tri 501 214 461 203 + tri 502 215 211 469 + tri 503 439 204 205 + tri 504 193 428 160 + tri 505 195 164 429 + tri 506 189 215 471 + tri 507 211 187 445 + tri 508 199 171 433 + tri 509 207 443 181 + tri 510 460 437 173 + tri 511 217 223 220 + tri 512 225 475 219 + tri 513 477 231 228 + tri 514 483 481 227 + tri 515 474 218 9 + tri 516 560 293 528 + tri 517 14 289 230 + tri 518 5 480 226 + tri 519 484 239 236 + tri 520 241 234 235 + tri 521 490 247 244 + tri 522 246 242 492 + tri 523 229 246 569 + tri 524 242 227 478 + tri 525 487 219 472 + tri 526 221 238 565 + tri 527 249 255 501 + tri 528 257 250 251 + tri 529 254 263 509 + tri 530 262 258 508 + tri 531 254 255 236 + tri 532 244 245 262 + tri 533 249 250 235 + tri 534 243 240 257 + tri 535 514 517 268 + tri 536 520 516 266 + tri 537 519 523 274 + tri 538 571 522 272 + tri 539 512 275 273 + tri 540 271 259 256 + tri 541 265 498 248 + tri 542 253 269 267 + tri 543 145 159 156 + tri 544 153 151 148 + tri 545 24 120 2 + numweights 576 + weight 0 7 1.0000000000 ( -0.4039240777 0.9994876385 -0.2740307450 ) + weight 1 8 1.0000000000 ( -0.4039240777 1.5706025362 -0.2740307450 ) + weight 2 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 3 2 1.0000000000 ( 0.5622114539 0.7840003967 -1.0001215935 ) + weight 4 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 5 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 6 2 1.0000000000 ( 0.7288469076 0.7839505672 -0.9001214504 ) + weight 7 7 1.0000000000 ( 0.6288465261 0.9994875789 -0.4833616316 ) + weight 8 2 1.0000000000 ( 0.7288460732 0.7830536366 0.8998782635 ) + weight 9 2 1.0000000000 ( 0.6288461685 0.8831658363 0.6745800972 ) + weight 10 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 11 2 1.0000000000 ( 0.5622105002 0.7830038071 0.9998782277 ) + weight 12 4 1.0000000000 ( -0.6288465858 1.0005125999 0.4833615720 ) + weight 13 2 1.0000000000 ( -0.7288460732 0.7839505672 -0.9001221657 ) + weight 14 2 1.0000000000 ( -0.6288461685 0.8838381767 -0.6747243404 ) + weight 15 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 16 2 1.0000000000 ( -0.5622105002 0.7840003967 -1.0001220703 ) + weight 17 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 18 2 1.0000000000 ( -0.5622114539 0.7830038071 0.9998776913 ) + weight 19 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 20 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 21 2 1.0000000000 ( -0.7288469076 0.7830536366 0.8998775482 ) + weight 22 4 1.0000000000 ( 0.3039242327 1.1005123854 -0.5127219558 ) + weight 23 4 1.0000000000 ( 0.4039241970 1.1005123854 -0.4127220213 ) + weight 24 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 25 4 1.0000000000 ( 0.3278744221 1.0005123615 -0.6127218604 ) + weight 26 4 1.0000000000 ( -0.3039239943 1.1005123854 -0.5127220750 ) + weight 27 4 1.0000000000 ( -0.3278741241 1.0005123615 -0.6127219796 ) + weight 28 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 29 4 1.0000000000 ( -0.4039240181 1.1005123854 -0.4127222002 ) + weight 30 4 1.0000000000 ( 0.4039240777 1.1005125046 0.1740308702 ) + weight 31 4 1.0000000000 ( 0.3039240539 1.1005125046 0.2740307450 ) + weight 32 4 1.0000000000 ( 0.3439128101 1.0005125999 0.3740306795 ) + weight 33 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 34 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 35 7 1.0000000000 ( -0.5039241910 0.9994876981 0.4991172850 ) + weight 36 7 1.0000000000 ( -0.3278743625 0.9994876981 0.6127218604 ) + weight 37 7 1.0000000000 ( -0.3039242029 1.0994876623 0.5127219558 ) + weight 38 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 39 7 1.0000000000 ( -0.3439128399 0.9994875789 -0.3740306497 ) + weight 40 7 1.0000000000 ( -0.5039240718 0.9994876385 -0.2490397245 ) + weight 41 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 42 7 1.0000000000 ( 0.5039241910 0.9994876385 -0.2490395755 ) + weight 43 7 1.0000000000 ( 0.3439129591 0.9994875789 -0.3740305305 ) + weight 44 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 45 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 46 7 1.0000000000 ( 0.3039240241 1.0994876623 0.5127220750 ) + weight 47 7 1.0000000000 ( 0.3278741837 0.9994876981 0.6127219796 ) + weight 48 7 1.0000000000 ( 0.5039240718 0.9994876981 0.4991174638 ) + weight 49 4 1.0000000000 ( -0.4039241374 1.1005125046 0.1740306914 ) + weight 50 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 51 4 1.0000000000 ( -0.3439129889 1.0005125999 0.3740305007 ) + weight 52 4 1.0000000000 ( -0.3039241731 1.1005125046 0.2740306258 ) + weight 53 5 1.0000000000 ( 0.3039242327 1.6850823164 -0.5127219558 ) + weight 54 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 55 5 1.0000000000 ( 0.4039241970 1.4850825071 -0.4127220213 ) + weight 56 5 1.0000000000 ( 0.3039242327 1.4850825071 -0.5127219558 ) + weight 57 5 1.0000000000 ( -0.3039239943 1.6850823164 -0.5127220750 ) + weight 58 5 1.0000000000 ( -0.3039239943 1.4850825071 -0.5127220750 ) + weight 59 5 1.0000000000 ( -0.4039240181 1.4850825071 -0.4127222002 ) + weight 60 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 61 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 62 5 1.0000000000 ( 0.3039240539 1.6850824356 0.2740307450 ) + weight 63 5 1.0000000000 ( 0.3039240539 1.4850826263 0.2740307450 ) + weight 64 5 1.0000000000 ( 0.4039240777 1.4850826263 0.1740308702 ) + weight 65 8 1.0000000000 ( -0.4039241672 1.6706025600 0.4127220511 ) + weight 66 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 67 8 1.0000000000 ( -0.3039242029 1.4706027508 0.5127219558 ) + weight 68 8 1.0000000000 ( -0.3039242029 1.6706025600 0.5127219558 ) + weight 69 8 1.0000000000 ( -0.4039240777 1.6706024408 -0.1740308404 ) + weight 70 8 1.0000000000 ( -0.3039240837 1.6706024408 -0.2740307450 ) + weight 71 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 72 8 1.0000000000 ( 0.4039241374 1.6706024408 -0.1740307212 ) + weight 73 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 74 8 1.0000000000 ( 0.3039241433 1.4706026316 -0.2740306258 ) + weight 75 8 1.0000000000 ( 0.3039241433 1.6706024408 -0.2740306258 ) + weight 76 8 1.0000000000 ( 0.4039240479 1.6706025600 0.4127221704 ) + weight 77 8 1.0000000000 ( 0.3039240241 1.6706025600 0.5127220750 ) + weight 78 8 1.0000000000 ( 0.3039240241 1.4706027508 0.5127220750 ) + weight 79 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 80 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 81 5 1.0000000000 ( -0.4039241374 1.4850826263 0.1740306914 ) + weight 82 5 1.0000000000 ( -0.3039241731 1.4850826263 0.2740306258 ) + weight 83 5 1.0000000000 ( -0.3039241731 1.6850824356 0.2740306258 ) + weight 84 6 1.0000000000 ( 0.3039242327 1.5055567026 -0.5127219558 ) + weight 85 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 86 6 1.0000000000 ( 0.4039241970 1.5055567026 -0.4127220213 ) + weight 87 6 1.0000000000 ( -0.3039239943 1.5055567026 -0.5127220750 ) + weight 88 6 1.0000000000 ( -0.4039240181 1.5055567026 -0.4127222002 ) + weight 89 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 90 6 1.0000000000 ( 0.4039240777 1.5055568218 0.1740308702 ) + weight 91 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 92 6 1.0000000000 ( 0.3039240539 1.5055568218 0.2740307450 ) + weight 93 9 1.0000000000 ( -0.4039241672 1.4094725847 0.4127220511 ) + weight 94 9 1.0000000000 ( -0.3039242029 1.4094725847 0.5127219558 ) + weight 95 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 96 9 1.0000000000 ( -0.4039240777 1.4094724655 -0.1740308404 ) + weight 97 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 98 9 1.0000000000 ( -0.3039240837 1.4094724655 -0.2740307450 ) + weight 99 9 1.0000000000 ( 0.4039241374 1.4094724655 -0.1740307212 ) + weight 100 9 1.0000000000 ( 0.3039241433 1.4094724655 -0.2740306258 ) + weight 101 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 102 9 1.0000000000 ( 0.4039240479 1.4094725847 0.4127221704 ) + weight 103 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 104 9 1.0000000000 ( 0.3039240241 1.4094725847 0.5127220750 ) + weight 105 6 1.0000000000 ( -0.4039241374 1.5055568218 0.1740306914 ) + weight 106 6 1.0000000000 ( -0.3039241731 1.5055568218 0.2740306258 ) + weight 107 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 108 1 1.0000000000 ( -0.6288462877 -0.0027038516 -0.8406154513 ) + weight 109 1 1.0000000000 ( -0.7288462520 0.0972779691 -0.9000298381 ) + weight 110 1 1.0000000000 ( -0.6288462281 0.7323116660 -1.0002232790 ) + weight 111 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 112 1 1.0000000000 ( -0.2920551896 -0.0027219369 -0.8999993205 ) + weight 113 1 1.0000000000 ( -0.6288466454 -0.0021918355 0.8406166434 ) + weight 114 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 115 1 1.0000000000 ( -0.5973538756 0.0978566110 0.9999701381 ) + weight 116 1 1.0000000000 ( -0.6288467050 0.7329211831 0.9997767210 ) + weight 117 1 1.0000000000 ( -0.7288467288 0.0978261530 0.8999701142 ) + weight 118 1 1.0000000000 ( 0.2920556366 -0.0027219369 -0.8999991417 ) + weight 119 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 120 1 1.0000000000 ( 0.6288467050 0.7323121428 -1.0002229214 ) + weight 121 1 1.0000000000 ( 0.7288467288 0.0972779691 -0.9000295401 ) + weight 122 1 1.0000000000 ( 0.6288466454 -0.0027038516 -0.8406151533 ) + weight 123 1 1.0000000000 ( 0.6288462281 0.7329207063 0.9997770190 ) + weight 124 1 1.0000000000 ( 0.5973533988 0.0978566110 0.9999704361 ) + weight 125 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 126 1 1.0000000000 ( 0.6288462877 -0.0021918355 0.8406169415 ) + weight 127 1 1.0000000000 ( 0.7288462520 0.0978261530 0.8999704123 ) + weight 128 1 1.0000000000 ( -0.3483265936 -0.0026625698 -0.7050647736 ) + weight 129 1 1.0000000000 ( -0.2254323065 -0.0027121324 -0.8678063154 ) + weight 130 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 131 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 132 1 1.0000000000 ( 0.3483265638 -0.0022331174 0.7050662637 ) + weight 133 1 1.0000000000 ( 0.2254322916 -0.0021835547 0.8678078055 ) + weight 134 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 135 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 136 1 1.0000000000 ( 0.1483269334 -0.1026815847 -0.7677757740 ) + weight 137 1 1.0000000000 ( 0.2254328430 -0.0027121324 -0.8678062558 ) + weight 138 1 1.0000000000 ( 0.3483269215 -0.0026625700 -0.7050646544 ) + weight 139 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 140 1 1.0000000000 ( -0.3483269513 -0.0022331174 0.7050660849 ) + weight 141 1 1.0000000000 ( -0.2483269423 -0.1022443697 0.6678380966 ) + weight 142 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 143 1 1.0000000000 ( -0.2254327387 -0.0021835547 0.8678077459 ) + weight 144 1 1.0000000000 ( 0.3483268023 -0.0025123558 -0.2118284255 ) + weight 145 1 1.0000000000 ( 0.1483267844 -0.0024819009 -0.1118284762 ) + weight 146 1 1.0000000000 ( 0.1483267993 -0.1025122628 -0.2117980272 ) + weight 147 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 148 1 1.0000000000 ( -0.3483267128 -0.0025123558 -0.2118286043 ) + weight 149 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 150 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 151 1 1.0000000000 ( -0.1483267248 -0.0024819009 -0.1118285581 ) + weight 152 1 1.0000000000 ( -0.3483268321 -0.0023825131 0.2145166397 ) + weight 153 1 1.0000000000 ( -0.1483268142 -0.0024129678 0.1145166904 ) + weight 154 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 155 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 156 1 1.0000000000 ( 0.3483266830 -0.0023825131 0.2145168185 ) + weight 157 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 158 1 1.0000000000 ( 0.1483267099 -0.1023824140 0.2145472169 ) + weight 159 1 1.0000000000 ( 0.1483267248 -0.0024129678 0.1145167649 ) + weight 160 11 1.0000000000 ( 0.1483266801 1.5368695259 0.2828474939 ) + weight 161 11 1.0000000000 ( 0.1483266801 1.3368693590 0.2828474939 ) + weight 162 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 163 11 1.0000000000 ( 0.2483267039 1.5368694067 0.1828474402 ) + weight 164 11 1.0000000000 ( -0.1483268291 1.5368695259 0.2828474343 ) + weight 165 11 1.0000000000 ( -0.2483268082 1.5368694067 0.1828473210 ) + weight 166 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 167 11 1.0000000000 ( -0.1483268440 1.3368693590 0.2828474343 ) + weight 168 14 1.0000000000 ( -0.1483269930 1.5362550020 -0.2177159637 ) + weight 169 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 170 14 1.0000000000 ( -0.2483268976 1.3362549543 -0.1177158356 ) + weight 171 14 1.0000000000 ( -0.2483268976 1.5362550020 -0.1177158356 ) + weight 172 14 1.0000000000 ( 0.1483265162 1.5362550020 -0.2177162319 ) + weight 173 14 1.0000000000 ( 0.2483266145 1.5362550020 -0.1177163124 ) + weight 174 14 1.0000000000 ( 0.2483266145 1.3362549543 -0.1177163124 ) + weight 175 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 176 11 1.0000000000 ( 0.2483267933 1.5368694067 -0.1731303036 ) + weight 177 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 178 11 1.0000000000 ( 0.1483268142 1.3368691206 -0.2731303275 ) + weight 179 11 1.0000000000 ( 0.1483268142 1.5368692875 -0.2731303275 ) + weight 180 11 1.0000000000 ( -0.2483267188 1.5368694067 -0.1731304228 ) + weight 181 11 1.0000000000 ( -0.1483266950 1.5368692875 -0.2731304169 ) + weight 182 11 1.0000000000 ( -0.1483266950 1.3368691206 -0.2731304169 ) + weight 183 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 184 14 1.0000000000 ( -0.2483265549 1.5362550020 0.2355751693 ) + weight 185 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 186 14 1.0000000000 ( -0.1483264714 1.3362549543 0.3355750740 ) + weight 187 14 1.0000000000 ( -0.1483264714 1.5362550020 0.3355750740 ) + weight 188 14 1.0000000000 ( 0.2483269721 1.5362550020 0.2355746925 ) + weight 189 14 1.0000000000 ( 0.1483270675 1.5362550020 0.3355747759 ) + weight 190 14 1.0000000000 ( 0.1483270526 1.3362549543 0.3355747759 ) + weight 191 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 192 12 1.0000000000 ( 0.1483267546 1.5553369522 0.2828474641 ) + weight 193 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 194 12 1.0000000000 ( 0.1483267546 1.6553369761 0.1828473806 ) + weight 195 12 1.0000000000 ( -0.1483267546 1.5553369522 0.2828474641 ) + weight 196 12 1.0000000000 ( -0.1483267546 1.6553369761 0.1828473806 ) + weight 197 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 198 15 1.0000000000 ( -0.1483269930 1.5547224283 -0.2177159637 ) + weight 199 15 1.0000000000 ( -0.2483268976 1.5547224283 -0.1177158356 ) + weight 200 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 201 15 1.0000000000 ( 0.1483265162 1.5547224283 -0.2177162319 ) + weight 202 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 203 15 1.0000000000 ( 0.2483266145 1.5547224283 -0.1177163124 ) + weight 204 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 205 12 1.0000000000 ( 0.1483267546 1.5553368330 -0.2731303573 ) + weight 206 12 1.0000000000 ( 0.1483267546 1.6553368568 -0.1731303632 ) + weight 207 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 208 12 1.0000000000 ( -0.1483267546 1.6553368568 -0.1731303632 ) + weight 209 12 1.0000000000 ( -0.1483267546 1.5553368330 -0.2731303871 ) + weight 210 15 1.0000000000 ( -0.2483265549 1.5547224283 0.2355751693 ) + weight 211 15 1.0000000000 ( -0.1483264714 1.5547224283 0.3355750740 ) + weight 212 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 213 15 1.0000000000 ( 0.2483269721 1.5547224283 0.2355746925 ) + weight 214 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 215 15 1.0000000000 ( 0.1483270675 1.5547224283 0.3355747759 ) + weight 216 2 1.0000000000 ( 0.1642774343 0.9833446145 0.3156406283 ) + weight 217 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 218 2 1.0000000000 ( 0.3642774224 0.8833600283 0.2848545611 ) + weight 219 2 1.0000000000 ( 0.2642774880 0.9833944440 0.2156406790 ) + weight 220 2 1.0000000000 ( -0.1642777324 0.9833446145 0.3156404793 ) + weight 221 2 1.0000000000 ( -0.2642776668 0.9833944440 0.2156404257 ) + weight 222 2 1.0000000000 ( -0.3642777205 0.8833600283 0.2848542035 ) + weight 223 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 224 2 1.0000000000 ( 0.2642776668 0.9836093783 -0.2156849951 ) + weight 225 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 226 2 1.0000000000 ( 0.2112980932 0.8837091327 -0.4157347977 ) + weight 227 2 1.0000000000 ( 0.1642777324 0.9836592078 -0.3156850338 ) + weight 228 2 1.0000000000 ( -0.2642774880 0.9836093783 -0.2156852484 ) + weight 229 2 1.0000000000 ( -0.1642774343 0.9836592078 -0.3156851828 ) + weight 230 2 1.0000000000 ( -0.2112977058 0.8837091327 -0.4157350063 ) + weight 231 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 232 3 1.0000000000 ( 0.2178864777 0.2118682861 0.4156629145 ) + weight 233 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 234 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 235 3 1.0000000000 ( 0.3642775118 0.2118682861 0.2790425122 ) + weight 236 3 1.0000000000 ( -0.2178866714 0.2118682861 0.4156627953 ) + weight 237 3 1.0000000000 ( -0.3642776310 0.2118682861 0.2790423334 ) + weight 238 3 1.0000000000 ( -0.2642776370 0.1118683815 0.2156628072 ) + weight 239 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 240 3 1.0000000000 ( 0.3642776310 0.2118682861 -0.2790423334 ) + weight 241 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 242 3 1.0000000000 ( 0.1642776579 0.1118683815 -0.3156628311 ) + weight 243 3 1.0000000000 ( 0.2178866714 0.2118682861 -0.4156627953 ) + weight 244 3 1.0000000000 ( -0.3642775118 0.2118682861 -0.2790425122 ) + weight 245 3 1.0000000000 ( -0.2178864777 0.2118682861 -0.4156629145 ) + weight 246 3 1.0000000000 ( -0.1642775089 0.1118683815 -0.3156628907 ) + weight 247 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 248 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 249 3 1.0000000000 ( 0.2328544855 0.2118682861 0.4333589375 ) + weight 250 3 1.0000000000 ( 0.3484135866 0.2118682861 0.2602873147 ) + weight 251 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 252 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 253 3 1.0000000000 ( -0.4484137595 0.3118681908 0.4333587587 ) + weight 254 3 1.0000000000 ( -0.3484137356 0.2118682861 0.2602871358 ) + weight 255 3 1.0000000000 ( -0.2328547388 0.2118682861 0.4333588183 ) + weight 256 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 257 3 1.0000000000 ( 0.3484137356 0.2118682861 -0.2602871358 ) + weight 258 3 1.0000000000 ( 0.2328547388 0.2118682861 -0.4333588183 ) + weight 259 3 1.0000000000 ( 0.3484137952 0.3118681908 -0.5333588123 ) + weight 260 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 261 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 262 3 1.0000000000 ( -0.2328544855 0.2118682861 -0.4333589375 ) + weight 263 3 1.0000000000 ( -0.3484135866 0.2118682861 -0.2602873147 ) + weight 264 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 265 3 1.0000000000 ( 0.4484135807 1.2077021599 0.4333589971 ) + weight 266 3 1.0000000000 ( 0.3484135866 1.3077020645 0.4333589673 ) + weight 267 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 268 3 1.0000000000 ( -0.3484137654 1.3077020645 0.4333587885 ) + weight 269 3 1.0000000000 ( -0.4484137595 1.2077021599 0.4333587587 ) + weight 270 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 271 3 1.0000000000 ( 0.3484137952 1.2077021599 -0.5333588123 ) + weight 272 3 1.0000000000 ( 0.3484137654 1.3077020645 -0.4333587885 ) + weight 273 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 274 3 1.0000000000 ( -0.3484135866 1.3077020645 -0.4333589673 ) + weight 275 3 1.0000000000 ( -0.3484135568 1.2077021599 -0.5333589315 ) + weight 276 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 277 2 1.0000000000 ( 0.5622114539 0.7840003967 -1.0001215935 ) + weight 278 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 279 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 280 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 281 2 1.0000000000 ( 0.7288469076 0.7839505672 -0.9001214504 ) + weight 282 7 1.0000000000 ( 0.6288465261 0.9994875789 -0.4833616316 ) + weight 283 2 1.0000000000 ( 0.6288461685 0.8831658363 0.6745800972 ) + weight 284 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 285 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 286 4 1.0000000000 ( -0.6288465858 1.0005125999 0.4833615720 ) + weight 287 2 1.0000000000 ( -0.6288461685 0.8838381767 -0.6747243404 ) + weight 288 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 289 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 290 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 291 2 1.0000000000 ( -0.5622114539 0.7830038071 0.9998776913 ) + weight 292 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 293 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 294 2 1.0000000000 ( -0.7288469076 0.7830536366 0.8998775482 ) + weight 295 4 1.0000000000 ( 0.4039241970 1.1005123854 -0.4127220213 ) + weight 296 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 297 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 298 4 1.0000000000 ( 0.3278744221 1.0005123615 -0.6127218604 ) + weight 299 4 1.0000000000 ( -0.3278741241 1.0005123615 -0.6127219796 ) + weight 300 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 301 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 302 4 1.0000000000 ( -0.4039240181 1.1005123854 -0.4127222002 ) + weight 303 4 1.0000000000 ( 0.4039240777 1.1005125046 0.1740308702 ) + weight 304 4 1.0000000000 ( 0.3439128101 1.0005125999 0.3740306795 ) + weight 305 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 306 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 307 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 308 7 1.0000000000 ( -0.5039241910 0.9994876981 0.4991172850 ) + weight 309 7 1.0000000000 ( -0.3039242029 1.0994876623 0.5127219558 ) + weight 310 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 311 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 312 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 313 7 1.0000000000 ( -0.3439128399 0.9994875789 -0.3740306497 ) + weight 314 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 315 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 316 7 1.0000000000 ( 0.3439129591 0.9994875789 -0.3740305305 ) + weight 317 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 318 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 319 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 320 7 1.0000000000 ( 0.5039240718 0.9994876981 0.4991174638 ) + weight 321 4 1.0000000000 ( -0.4039241374 1.1005125046 0.1740306914 ) + weight 322 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 323 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 324 5 1.0000000000 ( 0.3039242327 1.6850823164 -0.5127219558 ) + weight 325 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 326 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 327 5 1.0000000000 ( -0.3039239943 1.6850823164 -0.5127220750 ) + weight 328 5 1.0000000000 ( -0.4039240181 1.4850825071 -0.4127222002 ) + weight 329 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 330 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 331 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 332 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 333 5 1.0000000000 ( 0.3039240539 1.6850824356 0.2740307450 ) + weight 334 8 1.0000000000 ( -0.4039241672 1.6706025600 0.4127220511 ) + weight 335 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 336 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 337 8 1.0000000000 ( -0.3039242029 1.4706027508 0.5127219558 ) + weight 338 8 1.0000000000 ( -0.4039240777 1.6706024408 -0.1740308404 ) + weight 339 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 340 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 341 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 342 8 1.0000000000 ( 0.4039241374 1.6706024408 -0.1740307212 ) + weight 343 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 344 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 345 8 1.0000000000 ( 0.3039241433 1.4706026316 -0.2740306258 ) + weight 346 8 1.0000000000 ( 0.4039240479 1.6706025600 0.4127221704 ) + weight 347 8 1.0000000000 ( 0.3039240241 1.4706027508 0.5127220750 ) + weight 348 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 349 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 350 5 1.0000000000 ( -0.3039241731 1.6850824356 0.2740306258 ) + weight 351 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 352 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 353 6 1.0000000000 ( -0.4039240181 1.5055567026 -0.4127222002 ) + weight 354 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 355 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 356 6 1.0000000000 ( 0.4039240777 1.5055568218 0.1740308702 ) + weight 357 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 358 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 359 9 1.0000000000 ( -0.4039241672 1.4094725847 0.4127220511 ) + weight 360 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 361 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 362 9 1.0000000000 ( -0.4039240777 1.4094724655 -0.1740308404 ) + weight 363 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 364 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 365 9 1.0000000000 ( 0.4039241374 1.4094724655 -0.1740307212 ) + weight 366 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 367 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 368 9 1.0000000000 ( 0.4039240479 1.4094725847 0.4127221704 ) + weight 369 6 1.0000000000 ( -0.4039241374 1.5055568218 0.1740306914 ) + weight 370 1 1.0000000000 ( -0.6288462877 -0.0027038516 -0.8406154513 ) + weight 371 1 1.0000000000 ( -0.6288462281 0.7323116660 -1.0002232790 ) + weight 372 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 373 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 374 1 1.0000000000 ( -0.6288466454 -0.0021918355 0.8406166434 ) + weight 375 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 376 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 377 1 1.0000000000 ( -0.5973538756 0.0978566110 0.9999701381 ) + weight 378 1 1.0000000000 ( 0.2920556366 -0.0027219369 -0.8999991417 ) + weight 379 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 380 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 381 1 1.0000000000 ( 0.6288466454 -0.0027038516 -0.8406151533 ) + weight 382 1 1.0000000000 ( 0.6288462281 0.7329207063 0.9997770190 ) + weight 383 1 1.0000000000 ( 0.5973533988 0.0978566110 0.9999704361 ) + weight 384 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 385 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 386 1 1.0000000000 ( -0.2254323065 -0.0027121324 -0.8678063154 ) + weight 387 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 388 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 389 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 390 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 391 1 1.0000000000 ( 0.3483265638 -0.0022331174 0.7050662637 ) + weight 392 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 393 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 394 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 395 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 396 1 1.0000000000 ( 0.1483269334 -0.1026815847 -0.7677757740 ) + weight 397 1 1.0000000000 ( 0.3483269215 -0.0026625700 -0.7050646544 ) + weight 398 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 399 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 400 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 401 1 1.0000000000 ( -0.2483269423 -0.1022443697 0.6678380966 ) + weight 402 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 403 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 404 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 405 1 1.0000000000 ( -0.2254327387 -0.0021835547 0.8678077459 ) + weight 406 1 1.0000000000 ( 0.3483268023 -0.0025123558 -0.2118284255 ) + weight 407 1 1.0000000000 ( 0.1483267993 -0.1025122628 -0.2117980272 ) + weight 408 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 409 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 410 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 411 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 412 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 413 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 414 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 415 1 1.0000000000 ( -0.1483267248 -0.0024819009 -0.1118285581 ) + weight 416 1 1.0000000000 ( -0.1483268142 -0.0024129678 0.1145166904 ) + weight 417 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 418 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 419 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 420 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 421 1 1.0000000000 ( 0.3483266830 -0.0023825131 0.2145168185 ) + weight 422 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 423 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 424 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 425 11 1.0000000000 ( 0.1483266801 1.3368693590 0.2828474939 ) + weight 426 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 427 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 428 11 1.0000000000 ( 0.2483267039 1.5368694067 0.1828474402 ) + weight 429 11 1.0000000000 ( -0.2483268082 1.5368694067 0.1828473210 ) + weight 430 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 431 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 432 11 1.0000000000 ( -0.1483268440 1.3368693590 0.2828474343 ) + weight 433 14 1.0000000000 ( -0.1483269930 1.5362550020 -0.2177159637 ) + weight 434 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 435 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 436 14 1.0000000000 ( -0.2483268976 1.3362549543 -0.1177158356 ) + weight 437 14 1.0000000000 ( 0.1483265162 1.5362550020 -0.2177162319 ) + weight 438 14 1.0000000000 ( 0.2483266145 1.3362549543 -0.1177163124 ) + weight 439 11 1.0000000000 ( 0.2483267933 1.5368694067 -0.1731303036 ) + weight 440 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 441 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 442 11 1.0000000000 ( 0.1483268142 1.3368691206 -0.2731303275 ) + weight 443 11 1.0000000000 ( -0.2483267188 1.5368694067 -0.1731304228 ) + weight 444 11 1.0000000000 ( -0.1483266950 1.3368691206 -0.2731304169 ) + weight 445 14 1.0000000000 ( -0.2483265549 1.5362550020 0.2355751693 ) + weight 446 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 447 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 448 14 1.0000000000 ( -0.1483264714 1.3362549543 0.3355750740 ) + weight 449 14 1.0000000000 ( 0.2483269721 1.5362550020 0.2355746925 ) + weight 450 14 1.0000000000 ( 0.1483270526 1.3362549543 0.3355747759 ) + weight 451 12 1.0000000000 ( 0.1483267546 1.5553369522 0.2828474641 ) + weight 452 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 453 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 454 12 1.0000000000 ( -0.1483267546 1.5553369522 0.2828474641 ) + weight 455 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 456 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 457 15 1.0000000000 ( -0.1483269930 1.5547224283 -0.2177159637 ) + weight 458 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 459 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 460 15 1.0000000000 ( 0.1483265162 1.5547224283 -0.2177162319 ) + weight 461 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 462 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 463 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 464 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 465 12 1.0000000000 ( 0.1483267546 1.5553368330 -0.2731303573 ) + weight 466 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 467 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 468 15 1.0000000000 ( -0.2483265549 1.5547224283 0.2355751693 ) + weight 469 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 470 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 471 15 1.0000000000 ( 0.2483269721 1.5547224283 0.2355746925 ) + weight 472 2 1.0000000000 ( 0.1642774343 0.9833446145 0.3156406283 ) + weight 473 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 474 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 475 2 1.0000000000 ( 0.3642774224 0.8833600283 0.2848545611 ) + weight 476 2 1.0000000000 ( -0.1642777324 0.9833446145 0.3156404793 ) + weight 477 2 1.0000000000 ( -0.3642777205 0.8833600283 0.2848542035 ) + weight 478 2 1.0000000000 ( 0.2642776668 0.9836093783 -0.2156849951 ) + weight 479 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 480 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 481 2 1.0000000000 ( 0.2112980932 0.8837091327 -0.4157347977 ) + weight 482 2 1.0000000000 ( -0.2642774880 0.9836093783 -0.2156852484 ) + weight 483 2 1.0000000000 ( -0.2112977058 0.8837091327 -0.4157350063 ) + weight 484 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 485 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 486 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 487 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 488 3 1.0000000000 ( 0.3642775118 0.2118682861 0.2790425122 ) + weight 489 3 1.0000000000 ( -0.2178866714 0.2118682861 0.4156627953 ) + weight 490 3 1.0000000000 ( -0.2642776370 0.1118683815 0.2156628072 ) + weight 491 3 1.0000000000 ( 0.3642776310 0.2118682861 -0.2790423334 ) + weight 492 3 1.0000000000 ( 0.2178866714 0.2118682861 -0.4156627953 ) + weight 493 3 1.0000000000 ( -0.3642775118 0.2118682861 -0.2790425122 ) + weight 494 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 495 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 496 3 1.0000000000 ( 0.3484135866 0.2118682861 0.2602873147 ) + weight 497 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 498 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 499 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 500 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 501 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 502 3 1.0000000000 ( -0.4484137595 0.3118681908 0.4333587587 ) + weight 503 3 1.0000000000 ( -0.2328547388 0.2118682861 0.4333588183 ) + weight 504 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 505 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 506 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 507 3 1.0000000000 ( 0.3484137356 0.2118682861 -0.2602871358 ) + weight 508 3 1.0000000000 ( 0.3484137952 0.3118681908 -0.5333588123 ) + weight 509 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 510 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 511 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 512 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 513 3 1.0000000000 ( -0.2328544855 0.2118682861 -0.4333589375 ) + weight 514 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 515 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 516 3 1.0000000000 ( 0.4484135807 1.2077021599 0.4333589971 ) + weight 517 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 518 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 519 3 1.0000000000 ( -0.4484137595 1.2077021599 0.4333587587 ) + weight 520 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 521 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 522 3 1.0000000000 ( 0.3484137952 1.2077021599 -0.5333588123 ) + weight 523 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 524 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 525 2 1.0000000000 ( 0.5622105002 0.7830038071 0.9998782277 ) + weight 526 2 1.0000000000 ( -0.5622105002 0.7840003967 -1.0001220703 ) + weight 527 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 528 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 529 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 530 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 531 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 532 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 533 7 1.0000000000 ( 0.3039240241 1.0994876623 0.5127220750 ) + weight 534 4 1.0000000000 ( -0.3439129889 1.0005125999 0.3740305007 ) + weight 535 5 1.0000000000 ( 0.4039241970 1.4850825071 -0.4127220213 ) + weight 536 5 1.0000000000 ( 0.4039240777 1.4850826263 0.1740308702 ) + weight 537 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 538 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 539 5 1.0000000000 ( -0.4039241374 1.4850826263 0.1740306914 ) + weight 540 6 1.0000000000 ( 0.4039241970 1.5055567026 -0.4127220213 ) + weight 541 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 542 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 543 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 544 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 545 1 1.0000000000 ( -0.2920551896 -0.0027219369 -0.8999993205 ) + weight 546 1 1.0000000000 ( -0.6288467050 0.7329211831 0.9997767210 ) + weight 547 1 1.0000000000 ( 0.6288467050 0.7323121428 -1.0002229214 ) + weight 548 1 1.0000000000 ( 0.6288462877 -0.0021918355 0.8406169415 ) + weight 549 1 1.0000000000 ( 0.1483267099 -0.1023824140 0.2145472169 ) + weight 550 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 551 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 552 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 553 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 554 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 555 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 556 12 1.0000000000 ( -0.1483267546 1.5553368330 -0.2731303871 ) + weight 557 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 558 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 559 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 560 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 561 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 562 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 563 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 564 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 565 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 566 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 567 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 568 3 1.0000000000 ( -0.2178864777 0.2118682861 -0.4156629145 ) + weight 569 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 570 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 571 3 1.0000000000 ( -0.3484135568 1.2077021599 -0.5333589315 ) + weight 572 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 573 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 574 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 575 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) +} + diff --git a/examples/nitro_engine/animated_model/assets/robot/robot.png b/examples/nitro_engine/animated_model/assets/robot/robot.png new file mode 100644 index 0000000..eafd9fa Binary files /dev/null and b/examples/nitro_engine/animated_model/assets/robot/robot.png differ diff --git a/examples/nitro_engine/animated_model/assets/robot/wave.md5anim b/examples/nitro_engine/animated_model/assets/robot/wave.md5anim new file mode 100644 index 0000000..4a1a2f3 --- /dev/null +++ b/examples/nitro_engine/animated_model/assets/robot/wave.md5anim @@ -0,0 +1,469 @@ +MD5Version 10 // Parameters used during export: Reorient: False; Scale: 1.0 +commandline "" + +numFrames 21 +numJoints 16 +frameRate 24 +numAnimatedComponents 96 + +hierarchy { + "Base.Bone" -1 63 0 // + "Spine.Low" 0 63 6 // + "Spine.High" 1 63 12 // + "Head" 2 63 18 // + "Chest.Left" 1 63 24 // + "Arm.Upper.Left" 4 63 30 // + "Arm.End.Left" 5 63 36 // + "Chest.Right" 1 63 42 // + "Arm.Upper.Right" 7 63 48 // + "Arm.End..Right" 8 63 54 // + "Pelvis.Left" 0 63 60 // + "Leg-Upper.Left" 10 63 66 // + "Leg-Lower.Left" 11 63 72 // + "Pelvis.Right" 0 63 78 // + "Leg-Upper.Right" 13 63 84 // + "Leg-Lower.Right" 14 63 90 // +} + +bounds { + ( -0.7288464904 -4.2145261765 -0.1051818728 ) ( 0.7288464904 4.2140474319 6.9405498505 ) + ( -0.7302514911 -4.2225360870 -0.1051818728 ) ( 0.7302514911 4.2145175934 6.9405498505 ) + ( -0.7343894839 -4.2448711395 -0.1051818728 ) ( 0.7343894839 4.2158436775 6.9405498505 ) + ( -0.7411305904 -4.2661142349 -0.1051818728 ) ( 0.7411305904 4.2178220749 6.9405498505 ) + ( -0.7503278852 -4.2707734108 -0.1051818728 ) ( 0.7503278852 4.2201490402 6.9405498505 ) + ( -0.7618184090 -4.2458715439 -0.1051818728 ) ( 0.7618184090 4.2224359512 6.9405498505 ) + ( -0.7754249573 -4.1845750809 -0.1051818728 ) ( 0.7754249573 4.2242231369 6.9405498505 ) + ( -0.7909565568 -4.0881261826 -0.1051818728 ) ( 0.7909565568 4.2249913216 6.9405498505 ) + ( -0.8082096577 -3.9748272896 -0.1051818728 ) ( 0.8082096577 4.2241716385 6.9405498505 ) + ( -0.8316085339 -3.8554317951 -0.1051818728 ) ( 0.8716588616 4.2211618423 6.9405498505 ) + ( -0.9071020484 -3.7363846302 -0.1051818728 ) ( 0.9725581408 4.2153348923 6.9405498505 ) + ( -0.9845415950 -3.6244606972 -0.1051818728 ) ( 1.0805976391 4.2060980797 6.9405498505 ) + ( -1.0607581139 -3.5166521072 -0.1051818728 ) ( 1.1924948692 4.1931948662 6.9405498505 ) + ( -1.1330087185 -3.4139099121 -0.1051818728 ) ( 1.3043855429 4.1768159866 7.0152153969 ) + ( -1.1990523338 -3.3173723221 -0.1051818728 ) ( 1.4124979973 4.1575984955 7.1181468964 ) + ( -1.2571754456 -3.2286412716 -0.1051818728 ) ( 1.5131845474 4.1366162300 7.2063169479 ) + ( -1.3061861992 -3.1498517990 -0.1051818728 ) ( 1.6029434204 4.1153287888 7.2786159515 ) + ( -1.3453353643 -3.0836009979 -0.1051818728 ) ( 1.6784145832 4.0954933167 7.3345251083 ) + ( -1.3741520643 -3.0328018665 -0.1051818728 ) ( 1.7363419533 4.0790367126 7.3741292953 ) + ( -1.3921631575 -3.0004279613 -0.1051818728 ) ( 1.7735110521 4.0679025650 7.3978281021 ) + ( -1.3984949589 -2.9891591072 -0.1051818728 ) ( 1.7866519690 4.0638575554 7.4058084488 ) +} + +baseframe { + ( 0.0000000000 0.0000000000 0.0000000000 ) ( -0.7071068287 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( -0.0001522740 -0.0000001192 -0.0000000000 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( 0.0004014244 -0.0000001192 0.0000000001 ) + ( -0.0000000000 1.0282182693 0.0000000000 ) ( -0.0002491503 0.0000001192 -0.0000000001 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( 0.7072144151 0.0000000000 0.0000001686 ) + ( 0.0000000000 1.0038089752 0.0000000000 ) ( -0.0000000000 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 1.6051955223 0.0000000000 ) ( -0.0000000000 -0.0000000000 -0.0000000000 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( -0.7069991827 0.0000000309 -0.0000001377 ) + ( -0.0000000000 1.0172638893 0.0000000000 ) ( -0.0000000000 -0.0000000000 0.0000000000 ) + ( 0.0000000000 1.6867997646 0.0000000000 ) ( -0.0000000000 -0.0000000000 0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( 0.7113879919 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 0.4849954247 0.0000000428 ) ( 0.7027994990 -0.0000000848 0.0000000838 ) + ( 0.0000000000 1.3662177324 0.0000000284 ) ( -0.0000000005 0.0000001192 -0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( -0.7112751007 0.0000003352 0.0000003392 ) + ( 0.0000000000 0.5501293540 -0.0000000224 ) ( -0.7029137611 0.0000000000 0.0000006704 ) + ( 0.0000000000 1.3662178516 0.0000000000 ) ( 0.0000000000 0.0000000000 0.0000000000 ) +} + +frame 0 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522740 -0.0000001192 -0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 -0.0000000001 -0.0002490849 -0.0229121577 -0.0000057087 + 0.0000000000 1.6823664904 0.0000000000 0.7072144151 0.0000000000 0.0000001686 + 0.0000000000 1.0038089752 -0.0000001216 -0.0000000000 -0.0000000000 -0.0000000000 + 0.0000000000 1.6051954031 -0.0000003162 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000000 1.0172638893 0.0000001437 -0.0010274349 -0.0000000000 -0.0000000002 + 0.0000000000 1.6867997646 0.0000000624 -0.0003698472 -0.0000000000 -0.0000000001 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 1 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522740 0.0007809388 -0.0000001190 + -0.0000000000 1.6823664904 -0.0000000002 0.0004014245 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002491252 -0.0141752968 -0.0000035319 + -0.0000000000 1.6823664904 -0.0000000002 0.7072145343 0.0000000000 0.0000001686 + 0.0000000001 1.0038089752 0.0000000474 0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6051954031 0.0000001233 0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 -0.0000000002 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000000 1.0172638893 0.0000001436 0.0012860030 -0.0000000000 -0.0000000000 + 0.0000000002 1.6867997646 0.0000001346 0.0088065108 -0.0000000000 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 2 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522733 0.0030870433 -0.0000004701 + 0.0000000000 1.6823667288 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000000 -0.0002491387 0.0096553192 0.0000024055 + 0.0000000000 1.6823667288 -0.0000000000 0.7072144151 0.0000000000 0.0000001686 + -0.0000000001 1.0038089752 -0.0000001216 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000019 1.6051951647 -0.0000003162 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823667288 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000008 1.0172638893 0.0000001437 0.0080480594 -0.0000000000 -0.0000000002 + -0.0000000006 1.6867998838 -0.0000002356 0.0338387787 -0.0000000000 -0.0000000004 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 3 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522705 0.0068626930 -0.0000010450 + -0.0000000000 1.6823660135 0.0000000000 0.0004014244 -0.0000001183 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002488978 0.0450159870 0.0000112156 + -0.0000000000 1.6823660135 0.0000000000 0.7072145343 0.0000000000 0.0000001686 + 0.0000000007 1.0038088560 0.0000000474 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000007 1.6051954031 0.0000001233 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823660135 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000003 1.0172638893 0.0000001436 0.0189933572 0.0000000000 0.0000000000 + -0.0000000040 1.6868000031 0.0000002628 0.0709822550 0.0000000000 -0.0000000010 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 4 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522630 0.0120524950 -0.0000018353 + 0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282187462 -0.0000000003 -0.0002481799 0.0881715864 0.0000219679 + 0.0000000000 1.6823664904 -0.0000000000 0.7072145343 0.0000000000 0.0000001686 + -0.0000000019 1.0038090944 0.0000005243 -0.0000000000 0.0000000000 -0.0000000014 + -0.0000000027 1.6051955223 0.0000006002 -0.0000000000 0.0000000000 -0.0000000014 + 0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000001 1.0172638893 0.0000001436 0.0338583253 0.0000000000 -0.0000000003 + -0.0000000112 1.6867996454 -0.0000001846 0.1162938699 0.0000000003 -0.0000000018 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 5 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522477 0.0186010450 -0.0000028325 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002468648 0.1351395398 0.0000336699 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 -0.0000000026 0.0000001712 + -0.0000000006 1.0038089752 0.0000005244 -0.0000000000 0.0000000000 0.0000000009 + -0.0000000014 1.6051952839 0.0000006005 -0.0000000000 0.0000000000 0.0000000009 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000289 -0.0000001383 + -0.0000000044 1.0172638893 0.0000001438 0.0523783863 -0.0000000001 0.0000000020 + 0.0000000097 1.6867998838 -0.0000005558 0.1655525118 -0.0000000004 -0.0000000013 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 6 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522208 0.0264527462 -0.0000040281 + -0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001155 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002449981 0.1818055809 0.0000452968 + -0.0000000000 1.6823664904 -0.0000000000 0.7072145343 0.0000000000 0.0000001686 + -0.0000000029 1.0038089752 0.0000005244 -0.0000000000 -0.0000000000 -0.0000000009 + 0.0000000132 1.6051951647 0.0000006005 -0.0000000000 -0.0000000000 -0.0000000009 + -0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000316 -0.0000001410 + -0.0000000029 1.0172637701 -0.0000003331 0.0742842183 -0.0000000001 -0.0000000011 + 0.0000000008 1.6867996454 -0.0000002992 0.2144013792 -0.0000000002 -0.0000000003 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 7 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001521778 0.0355514809 -0.0000054136 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001136 0.0000000001 + 0.0000000000 1.0282182693 0.0000000001 -0.0002428102 0.2241564095 0.0000558485 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 -0.0000000013 0.0000001725 + -0.0000000067 1.0038089752 0.0000000478 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000111 1.6051954031 0.0000001242 -0.0000000000 -0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000296 -0.0000001416 + -0.0000000067 1.0172638893 0.0000001440 0.0992979035 0.0000000001 -0.0000000059 + -0.0000000166 1.6867995262 -0.0000000312 0.2586210966 0.0000000014 0.0000000046 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 8 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001521140 0.0458404459 -0.0000069803 + -0.0000000000 1.6823667288 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000005 -0.0002406830 0.2584845424 0.0000644014 + -0.0000000000 1.6823667288 0.0000000000 0.7072145343 -0.0000000013 0.0000001725 + 0.0000000028 1.0038089752 -0.0000004288 -0.0000000000 0.0000000000 0.0000000056 + 0.0000000128 1.6051952839 -0.0000003520 -0.0000000000 0.0000000000 0.0000000056 + -0.0000000000 1.6823667288 0.0000000000 -0.7069992423 0.0000000296 -0.0000001416 + -0.0000000121 1.0172637701 0.0000006211 0.1271297634 -0.0000000002 -0.0000000003 + -0.0000000402 1.6867995262 -0.0000000871 0.2943651974 -0.0000000016 0.0000000026 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 9 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001520242 0.0572618246 -0.0000087195 + -0.0000000000 1.6823667288 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000003 -0.0002390801 0.2814303637 0.0000701183 + -0.0000000000 1.6823667288 -0.0000000000 0.7072145343 -0.0000000039 0.0000001699 + -0.0000000038 1.0038089752 0.0000005252 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000214 1.6051952839 0.0000006025 -0.0000000000 -0.0000000000 0.0000000000 + -0.0000000000 1.6823667288 -0.0000000000 -0.7069992423 0.0000000257 -0.0000001403 + 0.0000000037 1.0172638893 -0.0000003323 0.1574763954 -0.0000000000 -0.0000000038 + -0.0000000724 1.6868000031 -0.0000001676 0.3181996644 0.0000000032 -0.0000000026 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 10 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001519031 0.0697563663 -0.0000106221 + -0.0000000000 1.6823662519 -0.0000000001 0.0004014244 -0.0000001229 0.0000000001 + 0.0000000000 1.0282182693 0.0000000003 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823662519 -0.0000000001 0.7072144151 0.0000000000 0.0000001686 + 0.0000000032 1.0038089752 -0.0000001203 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000081 1.6051954031 -0.0000003129 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823662519 -0.0000000001 -0.7069991231 0.0000000309 -0.0000001377 + 0.0000000032 1.0172638893 -0.0000001603 0.1900207698 0.0000000002 0.0000000315 + 0.0000000743 1.6867997646 -0.0000004303 0.3268856704 0.0000000064 0.0000000426 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 11 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001517460 0.0832075551 -0.0000126704 + -0.0000000000 1.6823662519 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823662519 -0.0000000000 0.7072144151 0.0000000000 0.0000001686 + 0.0000000166 1.0038089752 -0.0000001198 -0.0000000000 0.0000000000 0.0000000037 + -0.0000000082 1.6051956415 -0.0000003115 -0.0000000000 0.0000000000 0.0000000037 + -0.0000000000 1.6823662519 -0.0000000000 -0.7069991231 0.0000000309 -0.0000001377 + 0.0000000166 1.0172640085 -0.0000001597 0.2244939208 0.0000000004 0.0000000297 + -0.0000000525 1.6867994070 0.0000000428 0.3209972084 0.0000000034 0.0000000502 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 12 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001515526 0.0972274616 -0.0000148053 + -0.0000000000 1.6823662519 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002384582 0.2898047864 0.0000722048 + -0.0000000000 1.6823662519 0.0000000000 0.7072144747 0.0000000000 0.0000001686 + -0.0000000004 1.0038089752 -0.0000004268 -0.0000000000 0.0000000000 -0.0000000149 + 0.0000000198 1.6051956415 -0.0000003468 -0.0000000000 0.0000000000 -0.0000000149 + -0.0000000000 1.6823662519 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000145 1.0172638893 0.0000006231 0.2600955665 -0.0000000006 0.0000000240 + 0.0000000242 1.6867995262 0.0000001453 0.3049138486 0.0000000036 0.0000000586 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 13 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001513271 0.1113469452 -0.0000169553 + 0.0000000000 1.6823667288 0.0000000000 0.0004014244 -0.0000001155 0.0000000001 + -0.0000000001 1.0282182693 0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + 0.0000000000 1.6823667288 0.0000000000 0.7072144151 0.0000000105 0.0000001791 + -0.0000000027 1.0038089752 -0.0000005951 0.0000000000 -0.0000000000 0.0000000000 + 0.0000000023 1.6051954031 -0.0000007843 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823667288 0.0000000000 -0.7069992423 0.0000000415 -0.0000001482 + -0.0000000027 1.0172638893 0.0000006240 0.2956701815 -0.0000000019 0.0000000218 + -0.0000000373 1.6867995262 0.0000001416 0.2809669077 0.0000000075 0.0000000486 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 14 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001510779 0.1250958145 -0.0000190489 + 0.0000000000 1.6823664904 -0.0000000001 0.0004014244 -0.0000001118 0.0000000001 + 0.0000000000 1.0282182693 -0.0000000000 -0.0002384582 0.2898047566 0.0000722048 + 0.0000000000 1.6823664904 -0.0000000001 0.7072144747 0.0000000053 0.0000001686 + -0.0000000045 1.0038089752 0.0000000516 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000303 1.6051952839 0.0000001343 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 -0.0000000001 -0.7069992423 0.0000000282 -0.0000001403 + -0.0000000343 1.0172638893 0.0000006247 0.3300409615 -0.0000000002 0.0000000325 + -0.0000000204 1.6867997646 -0.0000000522 0.2515513599 -0.0000000046 0.0000000450 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 15 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001508170 0.1380039304 -0.0000210145 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 0.0000000003 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 0.0000000000 0.7072144747 0.0000000000 0.0000001686 + -0.0000000200 1.0038089752 0.0000000527 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000743 1.6051955223 0.0000001369 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000200 1.0172640085 0.0000006258 0.3620411456 0.0000000009 0.0000000207 + 0.0000001122 1.6868000031 -0.0000000373 0.2192079574 -0.0000000036 0.0000000402 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 16 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001505604 0.1496035010 -0.0000227808 + 0.0000000000 1.6823662519 0.0000000001 0.0004014245 -0.0000001490 0.0000000001 + -0.0000000000 1.0282177925 0.0000000002 -0.0002384583 0.2898046970 0.0000722048 + 0.0000000000 1.6823662519 0.0000000001 0.7072145343 -0.0000000158 0.0000001739 + 0.0000000257 1.0038089752 0.0000000534 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000214 1.6051954031 0.0000001389 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823662519 0.0000000001 -0.7069992423 0.0000000257 -0.0000001219 + 0.0000000257 1.0172638893 0.0000001497 0.3905433416 -0.0000000016 0.0000000269 + -0.0000001459 1.6868002415 -0.0000002533 0.1866219640 0.0000000142 0.0000000415 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 17 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001503263 0.1594295800 -0.0000242770 + 0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000003 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 -0.0000000000 0.7072144747 -0.0000000053 0.0000001739 + 0.0000000436 1.0038089752 0.0000000544 -0.0000000000 -0.0000000000 0.0000000075 + -0.0000000206 1.6051952839 0.0000001415 -0.0000000000 -0.0000000000 0.0000000075 + 0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000160 1.0172638893 0.0000001507 0.4144768417 -0.0000000065 0.0000000225 + 0.0000000429 1.6867992878 -0.0000002980 0.1565571874 -0.0000000064 0.0000000583 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 18 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001501351 0.1670198888 -0.0000254328 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001267 0.0000000001 + -0.0000000000 1.0282182693 -0.0000000002 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 0.0000000000 0.7072145343 0.0000000000 0.0000001686 + 0.0000000047 1.0038089752 0.0000000550 -0.0000000000 -0.0000000000 0.0000000075 + -0.0000000202 1.6051952839 0.0000001431 -0.0000000000 0.0000000000 0.0000000075 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000048 1.0172638893 -0.0000003255 0.4328215122 -0.0000000056 0.0000000314 + -0.0000000536 1.6868004799 -0.0000000745 0.1317730397 -0.0000000069 0.0000000533 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 19 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001500070 0.1719134748 -0.0000261780 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 0.0000000000 0.0000001686 + -0.0000000009 1.0038089752 0.0000000554 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000556 1.6051956415 0.0000001441 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000009 1.0172638893 0.0000001517 0.4445825219 -0.0000000033 0.0000000193 + -0.0000000521 1.6868000031 -0.0000003427 0.1149683520 -0.0000000006 0.0000000476 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 20 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001499606 0.1736480743 -0.0000264421 + 0.0000000000 1.6823662519 0.0000000001 0.0004014244 -0.0000001267 0.0000000001 + -0.0000000001 1.0282177925 0.0000000002 -0.0002384583 0.2898046970 0.0000722048 + 0.0000000000 1.6823662519 0.0000000001 0.7072145343 0.0000000000 0.0000001686 + -0.0000000031 1.0038089752 0.0000000557 -0.0000000000 0.0000000000 -0.0000000075 + 0.0000000017 1.6051952839 0.0000001449 -0.0000000000 0.0000000000 -0.0000000075 + 0.0000000000 1.6823662519 0.0000000001 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000267 1.0172640085 0.0000001520 0.4487406611 -0.0000000018 0.0000000778 + -0.0000000491 1.6867994070 -0.0000004619 0.1087833345 -0.0000000035 0.0000000230 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + diff --git a/examples/nitro_engine/animated_model/build.py b/examples/nitro_engine/animated_model/build.py new file mode 100644 index 0000000..66ae165 --- /dev/null +++ b/examples/nitro_engine/animated_model/build.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['NE', 'nds9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nitro-engine'] +) +arm9.add_grit(['assets/robot']) +arm9.add_nitro_engine_md5(['assets/robot']) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9], + game_title='NE: Animated model', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nitro_engine/animated_model/source/main.c b/examples/nitro_engine/animated_model/source/main.c new file mode 100644 index 0000000..53b4d1d --- /dev/null +++ b/examples/nitro_engine/animated_model/source/main.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2008-2011, 2019, 2022 +// +// This file is part of Nitro Engine + +#include + +#include "grit/robot_png.h" +#include "models/robot_dsm.h" +#include "models/robot_wave_dsa.h" + +NE_Camera *Camera; +NE_Model *Model; +NE_Animation *Animation; +NE_Material *Texture; + +void Draw3DScene(void) +{ + NE_PolyFormat(31, 0, NE_LIGHT_0, NE_CULL_BACK, 0); + + NE_CameraUse(Camera); + + NE_ModelDraw(Model); +} + +int main(void) +{ + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + NE_Init3D(); + NE_InitConsole(); + + Camera = NE_CameraCreate(); + Model = NE_ModelCreate(NE_Animated); + Animation = NE_AnimationCreate(); + + NE_AnimationLoad(Animation, robot_wave_dsa); + NE_ModelLoadDSM(Model, robot_dsm); + NE_ModelSetAnimation(Model, Animation); + NE_ModelAnimStart(Model, NE_ANIM_LOOP, floattof32(0.1)); + + NE_CameraSet(Camera, + 6, 3, -4, + 0, 3, 0, + 0, 1, 0); + + Texture = NE_MaterialCreate(); + NE_MaterialTexLoad(Texture, NE_A1RGB5, 256, 256, NE_TEXGEN_TEXCOORD, + (void *)robot_pngBitmap); + + NE_ModelSetMaterial(Model, Texture); + + NE_LightSet(0, NE_White, -0.9, 0, 0); + NE_ClearColorSet(NE_Black, 31, 63); + + while (1) + { + NE_WaitForVBL(NE_UPDATE_ANIMATIONS); + + scanKeys(); + uint32_t keys = keysHeld(); + + if (keys & KEY_RIGHT) + NE_ModelRotate(Model,0,2,0); + if (keys & KEY_LEFT) + NE_ModelRotate(Model,0,-2,0); + if (keys & KEY_UP) + NE_ModelRotate(Model,0,0,2); + if (keys & KEY_DOWN) + NE_ModelRotate(Model,0,0,-2); + + printf("\x1b[0;0H" + "CPU%%: %d \nFrame: %.3f ", + NE_GetCPUPercent(), f32tofloat(NE_ModelAnimGetFrame(Model))); + + NE_Process(Draw3DScene); + } + + return 0; +} diff --git a/examples/nitro_engine/error_handling/.gitignore b/examples/nitro_engine/error_handling/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nitro_engine/error_handling/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nitro_engine/error_handling/architectds b/examples/nitro_engine/error_handling/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/error_handling/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/error_handling/build.py b/examples/nitro_engine/error_handling/build.py new file mode 100644 index 0000000..6129585 --- /dev/null +++ b/examples/nitro_engine/error_handling/build.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +import sys + +argv = sys.argv + +if '--debug' in argv: + argv.remove('--debug') # Don't pass this to the build system + defines_ = ['NE_DEBUG'] + libs_ = ['NE_debug', 'nds9d'] +else: + defines_ = [] + libs_ = ['NE', 'nds9'] + +arm9 = Arm9Binary( + sourcedirs=['source'], + defines=defines_, + libs=libs_, + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nitro-engine'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9], + game_title='NE: Animated model', +) +nds.generate_nds() + +nds.run_command_line_arguments(args=argv) diff --git a/examples/nitro_engine/error_handling/readme.rst b/examples/nitro_engine/error_handling/readme.rst new file mode 100644 index 0000000..490d26b --- /dev/null +++ b/examples/nitro_engine/error_handling/readme.rst @@ -0,0 +1,18 @@ +Instructions +============ + +When switching between debug and release builds, the build system will detect +that the libraries and defines have changed and rebuild everything that has been +affected. + +Build release ROM: + +.. code:: python + + python3 build.py + +Build debug ROM: + +.. code:: python + + python3 build.py --debug diff --git a/examples/nitro_engine/error_handling/source/main.c b/examples/nitro_engine/error_handling/source/main.c new file mode 100644 index 0000000..b311a09 --- /dev/null +++ b/examples/nitro_engine/error_handling/source/main.c @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2008-2011, 2019, 2022 +// +// This file is part of Nitro Engine + +#include + +// Don't forget to compile Nitro Engine with NE_DEBUG defined or this won't work + +void Draw3DScene(void) +{ + // Let's generate some error messages... + NE_LightOff(100); + NE_CameraSetI(NULL, + 1, 1, 1, + 1, 1, 1, + 1, 1, 1); + NE_PolyFormat(100, 120, 0, 0, 0); +} + +void error_handler(const char *text) +{ + // Simple handler. You could write this to a file instead, for example. + printf(text); +} + +int main(void) +{ + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + NE_Init3D(); + // libnds uses VRAM_C for the text console, reserve A and B only + NE_TextureSystemReset(0, 0, NE_VRAM_AB); + // Init console in non-3D screen + consoleDemoInit(); + + printf("Setting up error handler...\n"); + + // Set a custom error handler + NE_DebugSetHandler(error_handler); + + // In order to use the default handler again it is needed to call + // NE_DebugSetHandlerConsole(). After that, all messages will be printed + // to the default console + + while (1) + { + NE_WaitForVBL(0); + + NE_Process(Draw3DScene); + } + + return 0; +} diff --git a/examples/nitro_engine/filesystem_animated_model/.gitignore b/examples/nitro_engine/filesystem_animated_model/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nitro_engine/filesystem_animated_model/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nitro_engine/filesystem_animated_model/architectds b/examples/nitro_engine/filesystem_animated_model/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/filesystem_animated_model/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.blend b/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.blend new file mode 100644 index 0000000..494f3b5 Binary files /dev/null and b/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.blend differ diff --git a/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.dsmparam b/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.dsmparam new file mode 100644 index 0000000..e69de29 diff --git a/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.grit b/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.grit new file mode 100644 index 0000000..207c056 --- /dev/null +++ b/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.grit @@ -0,0 +1,2 @@ +# 16 bit texture bitmap, force alpha bit to 1 +-gx -gb -gB16 -gT! diff --git a/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.json b/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.json new file mode 100644 index 0000000..080a5f6 --- /dev/null +++ b/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.json @@ -0,0 +1,11 @@ +{ + "texture": [256, 256], + "blender-fix": true, + "export-base-pose": false, + "animations": [ + { + "file": "wave.md5anim", + "skip-frames": 1 + } + ] +} diff --git a/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.md5mesh b/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.md5mesh new file mode 100644 index 0000000..d00409f --- /dev/null +++ b/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.md5mesh @@ -0,0 +1,1730 @@ +MD5Version 10 // Parameters used during export: Reorient: False; Scale: 1.0 +commandline "" + +numJoints 16 +numMeshes 1 + +joints { + "Base.Bone" -1 ( 0.0000000000 0.0000000000 0.0000000000 ) ( -0.7071068287 -0.0000000000 -0.0000000000 ) + "Spine.Low" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( -0.7072144747 -0.0000000843 -0.0000000843 ) + "Spine.High" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( -0.7069305778 -0.0000001686 -0.0000001685 ) + "Head" 2 ( -0.0000000000 0.0000000000 5.6328477859 ) ( -0.7071068287 -0.0000000843 -0.0000000843 ) + "Chest.Left" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Arm.Upper.Left" 4 ( 0.0000000000 1.0032964945 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Arm.End.Left" 5 ( 0.0000000000 2.6084918976 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Chest.Right" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Arm.Upper.Right" 7 ( 0.0000000000 -1.0177762508 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Arm.End..Right" 8 ( 0.0000000000 -2.7045760155 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Pelvis.Left" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( 0.0060729762 -0.0000000000 -0.0000000000 ) + "Leg-Upper.Left" 10 ( 0.0000000000 0.4849596322 2.9163727760 ) ( 0.7071067095 -0.0000000843 0.0000000843 ) + "Leg-Lower.Left" 11 ( 0.0000000000 0.4849596322 1.5501549244 ) ( 0.7071067095 0.0000000000 0.0000000000 ) + "Pelvis.Right" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( 0.9999825358 0.0000000028 -0.0000004768 ) + "Leg-Upper.Right" 13 ( -0.0000000000 -0.5500909090 2.9157583714 ) ( 0.7071068287 0.0000003372 -0.0000003372 ) + "Leg-Lower.Right" 14 ( -0.0000000000 -0.5500909090 1.5495405197 ) ( 0.7071068287 0.0000003372 -0.0000003372 ) +} + +mesh { + shader "Material" + numverts 576 + vert 0 ( 0.8750000000 0.2500000000 ) 0 1 + vert 1 ( 0.8750000000 0.2500000000 ) 1 1 + vert 2 ( 0.0113541363 0.4622119665 ) 2 1 + vert 3 ( 0.0189200211 0.4281336665 ) 3 1 + vert 4 ( 0.0214311108 0.4167795181 ) 4 1 + vert 5 ( 0.3423711956 0.6714493930 ) 5 1 + vert 6 ( 0.4428113401 0.7197439075 ) 6 1 + vert 7 ( 0.3196628094 0.4622119665 ) 7 1 + vert 8 ( 0.2384368777 0.7197439075 ) 8 1 + vert 9 ( 0.3423711061 0.5182476044 ) 9 1 + vert 10 ( 0.3095858395 0.4167795181 ) 10 1 + vert 11 ( 0.3120969832 0.4281336665 ) 11 1 + vert 12 ( 0.1541543156 0.4622119665 ) 12 1 + vert 13 ( 0.0113541409 0.7197439075 ) 13 1 + vert 14 ( 0.4851713479 0.6714494228 ) 14 1 + vert 15 ( 0.1440773457 0.4167795181 ) 15 1 + vert 16 ( 0.1465884447 0.4281336665 ) 16 1 + vert 17 ( 0.1768626422 0.4622119665 ) 17 1 + vert 18 ( 0.1844285280 0.4281336665 ) 18 1 + vert 19 ( 0.1869396269 0.4167795181 ) 19 1 + vert 20 ( 0.1901422739 0.7083897591 ) 20 1 + vert 21 ( 0.2157285959 0.7197439075 ) 21 1 + vert 22 ( 0.6686197519 0.3548163772 ) 22 1 + vert 23 ( 0.3423711360 0.1277336478 ) 23 1 + vert 24 ( 0.0255380198 0.5737641454 ) 24 1 + vert 25 ( 0.0455269776 0.5866629481 ) 25 1 + vert 26 ( 0.5996038318 0.3548163772 ) 26 1 + vert 27 ( 0.1199815795 0.5866629481 ) 27 1 + vert 28 ( 0.0908734500 0.4167796969 ) 28 1 + vert 29 ( 0.1006828696 0.4054255486 ) 29 1 + vert 30 ( 0.4089916945 0.1277336478 ) 30 1 + vert 31 ( 0.5078796148 0.3548163772 ) 31 1 + vert 32 ( 0.0437058732 0.4746256471 ) 32 1 + vert 33 ( 0.0255379826 0.4888173342 ) 33 1 + vert 34 ( 0.2024006695 0.5639546812 ) 34 1 + vert 35 ( 0.1910465062 0.5737641454 ) 35 1 + vert 36 ( 0.2110354900 0.5866629481 ) 36 1 + vert 37 ( 0.6913279891 0.6970356703 ) 37 1 + vert 38 ( 0.8749999404 0.2500000000 ) 38 1 + vert 39 ( 0.2092143893 0.4746256471 ) 39 1 + vert 40 ( 0.1910464764 0.4888173342 ) 40 1 + vert 41 ( 0.7716981173 0.6970356703 ) 41 1 + vert 42 ( 0.3054790199 0.4888172746 ) 42 1 + vert 43 ( 0.2873110771 0.4746256471 ) 43 1 + vert 44 ( 0.2827706933 0.4859797955 ) 44 1 + vert 45 ( 0.7716981173 0.6970356703 ) 45 1 + vert 46 ( 0.7603439689 0.6970356703 ) 46 1 + vert 47 ( 0.2854900658 0.5866629481 ) 47 1 + vert 48 ( 0.3054789901 0.5737641156 ) 48 1 + vert 49 ( 0.1673034430 0.4054255486 ) 49 1 + vert 50 ( 0.1758200228 0.4167796969 ) 50 1 + vert 51 ( 0.1218025759 0.4746256471 ) 51 1 + vert 52 ( 0.5768955946 0.3548163772 ) 52 1 + vert 53 ( 0.6686196923 0.5351630747 ) 53 1 + vert 54 ( 0.6799738407 0.5351630747 ) 54 1 + vert 55 ( 0.3423711061 0.2853721380 ) 55 1 + vert 56 ( 0.6686196327 0.5124548674 ) 56 1 + vert 57 ( 0.5996038318 0.5351630747 ) 57 1 + vert 58 ( 0.5996037722 0.5124548674 ) 58 1 + vert 59 ( 0.1006828696 0.2477870584 ) 59 1 + vert 60 ( 0.5882496834 0.5351630747 ) 60 1 + vert 61 ( 0.4965255260 0.5351630747 ) 61 1 + vert 62 ( 0.5078796744 0.5351630747 ) 62 1 + vert 63 ( 0.5078796148 0.5124548674 ) 63 1 + vert 64 ( 0.4089916945 0.2853720784 ) 64 1 + vert 65 ( 0.0113540990 0.2435528636 ) 65 1 + vert 66 ( 0.6799738407 0.5393971503 ) 66 1 + vert 67 ( 0.6913279295 0.5393971801 ) 67 1 + vert 68 ( 0.6913279891 0.5166889131 ) 68 1 + vert 69 ( 0.0779746622 0.2435529232 ) 69 1 + vert 70 ( 0.8520681858 0.5166889131 ) 70 1 + vert 71 ( 0.8750000000 0.2500000000 ) 71 1 + vert 72 ( 0.2566326857 0.2250787616 ) 72 1 + vert 73 ( 0.7716981173 0.5393971503 ) 73 1 + vert 74 ( 0.7830522060 0.5393971801 ) 74 1 + vert 75 ( 0.7830522656 0.5166889131 ) 75 1 + vert 76 ( 0.1900120974 0.2250788212 ) 76 1 + vert 77 ( 0.7603439093 0.5166889131 ) 77 1 + vert 78 ( 0.7603438497 0.5393971801 ) 78 1 + vert 79 ( 0.7716980577 0.5393971503 ) 79 1 + vert 80 ( 0.5882496834 0.5351630747 ) 80 1 + vert 81 ( 0.1673034430 0.2477869987 ) 81 1 + vert 82 ( 0.5768954754 0.5124548674 ) 82 1 + vert 83 ( 0.5768955350 0.5351630747 ) 83 1 + vert 84 ( 0.6686196923 0.6970356405 ) 84 1 + vert 85 ( 0.3423711360 0.4813070297 ) 85 1 + vert 86 ( 0.3423711061 0.4699528813 ) 86 1 + vert 87 ( 0.5996038318 0.6970356405 ) 87 1 + vert 88 ( 0.1006828621 0.0632063746 ) 88 1 + vert 89 ( 0.1006828621 0.0518521667 ) 89 1 + vert 90 ( 0.4089916348 0.4699529409 ) 90 1 + vert 91 ( 0.4089916646 0.4813070297 ) 91 1 + vert 92 ( 0.5078796744 0.6970356405 ) 92 1 + vert 93 ( 0.0113540990 0.4054253697 ) 93 1 + vert 94 ( 0.6913279295 0.3548164368 ) 94 1 + vert 95 ( 0.0113540990 0.4167795777 ) 95 1 + vert 96 ( 0.0779746622 0.4054254293 ) 96 1 + vert 97 ( 0.0779746622 0.4167795181 ) 97 1 + vert 98 ( 0.8520681858 0.3548164368 ) 98 1 + vert 99 ( 0.2566326857 0.0632063150 ) 99 1 + vert 100 ( 0.7830522656 0.3548164368 ) 100 1 + vert 101 ( 0.2566326857 0.0518521667 ) 101 1 + vert 102 ( 0.1900120974 0.0632063746 ) 102 1 + vert 103 ( 0.1900120974 0.0518521667 ) 103 1 + vert 104 ( 0.7603439093 0.3548164368 ) 104 1 + vert 105 ( 0.1673034281 0.0632063150 ) 105 1 + vert 106 ( 0.5768955350 0.6970356405 ) 106 1 + vert 107 ( 0.1673034281 0.0518521667 ) 107 1 + vert 108 ( 0.4655197561 0.9819033202 ) 108 1 + vert 109 ( 0.0113541409 0.9886458702 ) 109 1 + vert 110 ( 0.1541543454 0.6249296069 ) 110 1 + vert 111 ( 0.4690954387 1.0000000000 ) 111 1 + vert 112 ( 0.5037595034 0.9886458423 ) 112 1 + vert 113 ( 0.4655196667 0.7910139561 ) 113 1 + vert 114 ( 0.2151023746 0.7083897591 ) 114 1 + vert 115 ( 0.1804383993 0.6970356405 ) 115 1 + vert 116 ( 0.1768626571 0.6249295175 ) 116 1 + vert 117 ( 0.2157286257 0.9886458702 ) 117 1 + vert 118 ( 0.5700801611 0.9886458432 ) 118 1 + vert 119 ( 0.6047441959 1.0000000000 ) 119 1 + vert 120 ( 0.0113541521 0.6249295175 ) 120 1 + vert 121 ( 0.4428113401 0.9886458702 ) 121 1 + vert 122 ( 0.6083199978 0.9819033183 ) 122 1 + vert 123 ( 0.3196628690 0.6249296069 ) 123 1 + vert 124 ( 0.3160871267 0.6970356405 ) 124 1 + vert 125 ( 0.2814231217 0.7083897591 ) 125 1 + vert 126 ( 0.6083198786 0.7910138816 ) 126 1 + vert 127 ( 0.2384368479 0.9886458702 ) 127 1 + vert 128 ( 0.4973703027 0.9665126987 ) 128 1 + vert 129 ( 0.5113238692 0.9849906061 ) 129 1 + vert 130 ( 0.5200785995 0.9736364484 ) 130 1 + vert 131 ( 0.5529161692 0.0113541484 ) 131 1 + vert 132 ( 0.5764693618 0.8064045161 ) 132 1 + vert 133 ( 0.5625157356 0.7879266143 ) 133 1 + vert 134 ( 0.2679870129 0.0846714377 ) 134 1 + vert 135 ( 0.5651151538 0.8106349111 ) 135 1 + vert 136 ( 0.5078796148 0.0113541484 ) 136 1 + vert 137 ( 0.5625157952 0.9849906052 ) 137 1 + vert 138 ( 0.5764693618 0.9665126987 ) 138 1 + vert 139 ( 0.5651152134 0.9622823149 ) 139 1 + vert 140 ( 0.4973703623 0.8064045161 ) 140 1 + vert 141 ( 0.9148896933 0.0328192115 ) 141 1 + vert 142 ( 0.9262437820 0.0328192711 ) 142 1 + vert 143 ( 0.5113239288 0.7879266143 ) 143 1 + vert 144 ( 0.5764693618 0.9105099961 ) 144 1 + vert 145 ( 0.5537610650 0.8991558626 ) 145 1 + vert 146 ( 0.9712803960 0.0328193307 ) 146 1 + vert 147 ( 0.9826345444 0.0328193307 ) 147 1 + vert 148 ( 0.4973703027 0.9105100036 ) 148 1 + vert 149 ( 0.9262437820 0.0328193307 ) 149 1 + vert 150 ( 0.5200785995 0.9105100036 ) 150 1 + vert 151 ( 0.5200786591 0.8991558552 ) 151 1 + vert 152 ( 0.4973703027 0.8621021807 ) 152 1 + vert 153 ( 0.5200786591 0.8734562993 ) 153 1 + vert 154 ( 0.5200785995 0.8621021509 ) 154 1 + vert 155 ( 0.9829396009 0.3762816191 ) 155 1 + vert 156 ( 0.5764693618 0.8621021509 ) 156 1 + vert 157 ( 0.9265488386 0.3762816191 ) 157 1 + vert 158 ( 0.9379029274 0.3762816787 ) 158 1 + vert 159 ( 0.5537610054 0.8734562993 ) 159 1 + vert 160 ( 0.5078796148 0.1748891473 ) 160 1 + vert 161 ( 0.5078796148 0.1521807909 ) 161 1 + vert 162 ( 0.4965254664 0.1521808505 ) 162 1 + vert 163 ( 0.4721183777 0.3127338290 ) 163 1 + vert 164 ( 0.5415620208 0.1748891473 ) 164 1 + vert 165 ( 0.8747765422 0.5398166478 ) 165 1 + vert 166 ( 0.5529162288 0.1521808505 ) 166 1 + vert 167 ( 0.5415620804 0.1521809101 ) 167 1 + vert 168 ( 0.5642703176 0.1748891473 ) 168 1 + vert 169 ( 0.9262438416 0.1736459732 ) 169 1 + vert 170 ( 0.9148896933 0.1736459732 ) 170 1 + vert 171 ( 0.9148896337 0.1963542700 ) 171 1 + vert 172 ( 0.5979527235 0.1748891473 ) 172 1 + vert 173 ( 0.2793411314 0.2482064962 ) 173 1 + vert 174 ( 0.2793411613 0.2254981399 ) 174 1 + vert 175 ( 0.2679870129 0.2254981995 ) 175 1 + vert 176 ( 0.4317001402 0.3127338886 ) 176 1 + vert 177 ( 0.9826345444 0.1736460328 ) 177 1 + vert 178 ( 0.9712803364 0.1736460924 ) 178 1 + vert 179 ( 0.9712803960 0.1963543892 ) 179 1 + vert 180 ( 0.9151946902 0.5398166776 ) 180 1 + vert 181 ( 0.9375978708 0.1963543892 ) 181 1 + vert 182 ( 0.9375979304 0.1736460924 ) 182 1 + vert 183 ( 0.9262437820 0.1736460328 ) 183 1 + vert 184 ( 0.8747764826 0.1963542700 ) 184 1 + vert 185 ( 0.9829396009 0.5171083212 ) 185 1 + vert 186 ( 0.9715854526 0.5171083510 ) 186 1 + vert 187 ( 0.9715854526 0.5398166478 ) 187 1 + vert 188 ( 0.3194543123 0.2482064366 ) 188 1 + vert 189 ( 0.9379030466 0.5398166478 ) 189 1 + vert 190 ( 0.9379030466 0.5171083212 ) 190 1 + vert 191 ( 0.9265488386 0.5171083212 ) 191 1 + vert 192 ( 0.5078796148 0.3321082592 ) 192 1 + vert 193 ( 0.4965255260 0.3321081996 ) 193 1 + vert 194 ( 0.4992022514 0.7615630478 ) 194 1 + vert 195 ( 0.5415620804 0.3321082592 ) 195 1 + vert 196 ( 0.4655197263 0.7615630627 ) 196 1 + vert 197 ( 0.5529162288 0.3321081996 ) 197 1 + vert 198 ( 0.5642702579 0.3321082592 ) 198 1 + vert 199 ( 0.9148896933 0.3535734415 ) 199 1 + vert 200 ( 0.5642703176 0.3434623480 ) 200 1 + vert 201 ( 0.5979527831 0.3321082592 ) 201 1 + vert 202 ( 0.5979527831 0.3434623480 ) 202 1 + vert 203 ( 0.2793411613 0.4054255486 ) 203 1 + vert 204 ( 0.9826345444 0.3535733819 ) 204 1 + vert 205 ( 0.9712803960 0.3535733819 ) 205 1 + vert 206 ( 0.4992022216 0.7211448550 ) 206 1 + vert 207 ( 0.9262437820 0.3535733819 ) 207 1 + vert 208 ( 0.4655197263 0.7211449146 ) 208 1 + vert 209 ( 0.9375979304 0.3535733819 ) 209 1 + vert 210 ( 0.8747765422 0.3535733819 ) 210 1 + vert 211 ( 0.9715854526 0.6970356703 ) 211 1 + vert 212 ( 0.8747765422 0.3649275303 ) 212 1 + vert 213 ( 0.3194543123 0.4054255486 ) 213 1 + vert 214 ( 0.3194543123 0.4167796969 ) 214 1 + vert 215 ( 0.9379030466 0.6970357001 ) 215 1 + vert 216 ( 0.8717506528 0.9513412639 ) 216 1 + vert 217 ( 0.8831048012 0.9460025094 ) 217 1 + vert 218 ( 0.3724106550 0.5624975562 ) 218 1 + vert 219 ( 0.8170980215 0.2076858282 ) 219 1 + vert 220 ( 0.8717506528 0.9886458628 ) 220 1 + vert 221 ( 0.8420943022 0.2831348181 ) 221 1 + vert 222 ( 0.4551318288 0.5624975562 ) 222 1 + vert 223 ( 0.8831048012 0.9939846145 ) 223 1 + vert 224 ( 0.8170980215 0.1587125063 ) 224 1 + vert 225 ( 0.8284521103 0.1508482695 ) 225 1 + vert 226 ( 0.3897802234 0.6420434117 ) 226 1 + vert 227 ( 0.5960801840 0.7615630627 ) 227 1 + vert 228 ( 0.8420943022 0.3321081400 ) 228 1 + vert 229 ( 0.5960800648 0.7242584825 ) 229 1 + vert 230 ( 0.4377623200 0.6420434117 ) 230 1 + vert 231 ( 0.8534483314 0.3399725556 ) 231 1 + vert 232 ( 0.8164433241 0.8922467679 ) 232 1 + vert 233 ( 0.7993190289 0.2190399170 ) 233 1 + vert 234 ( 0.8217107058 0.9149550349 ) 234 1 + vert 235 ( 0.8330649137 0.9077588320 ) 235 1 + vert 236 ( 0.7669651508 0.8922467604 ) 236 1 + vert 237 ( 0.7503436804 0.9077588320 ) 237 1 + vert 238 ( 0.8243153691 0.2831348777 ) 238 1 + vert 239 ( 0.7730519176 0.9036009014 ) 239 1 + vert 240 ( 0.8330648541 0.9711245559 ) 240 1 + vert 241 ( 0.8217107058 0.9639283530 ) 241 1 + vert 242 ( 0.5783011913 0.7615630776 ) 242 1 + vert 243 ( 0.8164434433 0.9866366293 ) 243 1 + vert 244 ( 0.7503436804 0.9711245559 ) 244 1 + vert 245 ( 0.7669650912 0.9866366293 ) 245 1 + vert 246 ( 0.5783011317 0.7242584825 ) 246 1 + vert 247 ( 0.7616977692 0.9639283493 ) 247 1 + vert 248 ( 0.6196740270 0.9886458712 ) 248 1 + vert 249 ( 0.8181428909 0.8902375251 ) 249 1 + vert 250 ( 0.8312636614 0.9098883271 ) 250 1 + vert 251 ( 0.8426177502 0.8902375326 ) 251 1 + vert 252 ( 0.7407905459 0.8642233163 ) 252 1 + vert 253 ( 0.7294365764 0.8642233014 ) 253 1 + vert 254 ( 0.7521448731 0.9098883271 ) 254 1 + vert 255 ( 0.7652655840 0.8902375326 ) 255 1 + vert 256 ( 0.6093068719 0.3321083784 ) 256 1 + vert 257 ( 0.8312636018 0.9689950645 ) 257 1 + vert 258 ( 0.8181428909 0.9886458609 ) 258 1 + vert 259 ( 0.6206609607 0.3321083188 ) 259 1 + vert 260 ( 0.7111338973 0.3321083188 ) 260 1 + vert 261 ( 0.7521448731 1.0000000000 ) 261 1 + vert 262 ( 0.7652655840 0.9886458609 ) 262 1 + vert 263 ( 0.7521449327 0.9689950645 ) 263 1 + vert 264 ( 0.6196740270 0.8869315833 ) 264 1 + vert 265 ( 0.6310282350 0.8869315758 ) 265 1 + vert 266 ( 0.7521449327 0.7658150196 ) 266 1 + vert 267 ( 0.7407906055 0.7625090182 ) 267 1 + vert 268 ( 0.8312637210 0.7658150196 ) 268 1 + vert 269 ( 0.7294364572 0.7625090480 ) 269 1 + vert 270 ( 0.6093068719 0.2303940654 ) 270 1 + vert 271 ( 0.6206610203 0.2303940654 ) 271 1 + vert 272 ( 0.7521448731 0.8642233759 ) 272 1 + vert 273 ( 0.7111338973 0.2303940058 ) 273 1 + vert 274 ( 0.8312635422 0.8642233759 ) 274 1 + vert 275 ( 0.6997797489 0.2303940654 ) 275 1 + vert 276 ( 0.4541654587 0.7538222075 ) 276 1 + vert 277 ( 0.4541654587 0.7197439075 ) 277 1 + vert 278 ( 0.4428113401 0.7083897591 ) 278 1 + vert 279 ( 0.3524481654 0.6970357299 ) 279 1 + vert 280 ( 0.4172250032 0.7083897591 ) 280 1 + vert 281 ( 0.4428113401 0.7083897591 ) 281 1 + vert 282 ( 0.2270827293 0.7538221925 ) 282 1 + vert 283 ( 0.2640231848 0.7083897591 ) 283 1 + vert 284 ( 0.2384368777 0.7083897591 ) 284 1 + vert 285 ( 0.3524481356 0.4926613569 ) 285 1 + vert 286 ( 0.0000000000 0.7538221925 ) 286 1 + vert 287 ( 0.0369404592 0.7083897591 ) 287 1 + vert 288 ( 0.0113541391 0.7083897591 ) 288 1 + vert 289 ( 0.4750943482 0.6970357299 ) 289 1 + vert 290 ( 0.2270827442 0.7538222075 ) 290 1 + vert 291 ( 0.2270827293 0.7197439075 ) 291 1 + vert 292 ( 0.2157285959 0.7083897591 ) 292 1 + vert 293 ( 0.4750943780 0.4926611781 ) 293 1 + vert 294 ( 0.2157285959 0.7083897591 ) 294 1 + vert 295 ( 0.6799738407 0.3548163772 ) 295 1 + vert 296 ( 0.6799738407 0.3434622288 ) 296 1 + vert 297 ( 0.3325617015 0.1163794994 ) 297 1 + vert 298 ( 0.6713390946 0.3434622288 ) 298 1 + vert 299 ( 0.5968844891 0.3434622288 ) 299 1 + vert 300 ( 0.5882496834 0.3434622288 ) 300 1 + vert 301 ( 0.1399705112 0.5737641156 ) 301 1 + vert 302 ( 0.5882496834 0.3548163772 ) 302 1 + vert 303 ( 0.4965254962 0.3548163772 ) 303 1 + vert 304 ( 0.5033392906 0.3434622288 ) 304 1 + vert 305 ( 0.2024006844 0.5753087997 ) 305 1 + vert 306 ( 0.0113541000 0.0632060766 ) 306 1 + vert 307 ( 0.6799738407 0.6970356703 ) 307 1 + vert 308 ( 0.2019880414 0.5767972767 ) 308 1 + vert 309 ( 0.2137548327 0.5753087997 ) 309 1 + vert 310 ( 0.2024006248 0.4859797955 ) 310 1 + vert 311 ( 0.0893287659 0.0575290918 ) 311 1 + vert 312 ( 0.8634223938 0.7027127445 ) 312 1 + vert 313 ( 0.1991951317 0.4799671173 ) 313 1 + vert 314 ( 0.2941248417 0.4973339438 ) 314 1 + vert 315 ( 0.2566326857 0.4054255486 ) 315 1 + vert 316 ( 0.2973303199 0.4799671173 ) 316 1 + vert 317 ( 0.2941249013 0.5753087997 ) 317 1 + vert 318 ( 0.1900121123 0.4054255486 ) 318 1 + vert 319 ( 0.2941249013 0.5639546812 ) 319 1 + vert 320 ( 0.2945375144 0.5767972767 ) 320 1 + vert 321 ( 0.5882496834 0.3548163772 ) 321 1 + vert 322 ( 0.5882496834 0.3434622288 ) 322 1 + vert 323 ( 0.1399704814 0.4888172746 ) 323 1 + vert 324 ( 0.6686197519 0.5238089561 ) 324 1 + vert 325 ( 0.6799738407 0.5238089561 ) 325 1 + vert 326 ( 0.3423711061 0.3080803156 ) 326 1 + vert 327 ( 0.5996037722 0.5238089561 ) 327 1 + vert 328 ( 0.5882496834 0.5124548376 ) 328 1 + vert 329 ( 0.5882496834 0.5238089561 ) 329 1 + vert 330 ( 0.1006828547 0.2250788212 ) 330 1 + vert 331 ( 0.4965255260 0.5238089561 ) 331 1 + vert 332 ( 0.4089916348 0.3080803752 ) 332 1 + vert 333 ( 0.5078796148 0.5238089561 ) 333 1 + vert 334 ( 0.6799738407 0.5166888833 ) 334 1 + vert 335 ( 0.6799738407 0.5280430317 ) 335 1 + vert 336 ( 0.0113541000 0.2208446264 ) 336 1 + vert 337 ( 0.6913279891 0.5280430317 ) 337 1 + vert 338 ( 0.8634223342 0.5166889131 ) 338 1 + vert 339 ( 0.8634223342 0.5280430317 ) 339 1 + vert 340 ( 0.0893287659 0.2265216708 ) 340 1 + vert 341 ( 0.8634223342 0.5337201059 ) 341 1 + vert 342 ( 0.7716981173 0.5166888833 ) 342 1 + vert 343 ( 0.7716981173 0.5280430317 ) 343 1 + vert 344 ( 0.2566326857 0.2477869987 ) 344 1 + vert 345 ( 0.7830522656 0.5280430317 ) 345 1 + vert 346 ( 0.7716980577 0.5166889131 ) 346 1 + vert 347 ( 0.7603439093 0.5280430317 ) 347 1 + vert 348 ( 0.5882496834 0.5238089561 ) 348 1 + vert 349 ( 0.1673034132 0.2250787616 ) 349 1 + vert 350 ( 0.5768955350 0.5238089561 ) 350 1 + vert 351 ( 0.6686197519 0.7083897591 ) 351 1 + vert 352 ( 0.7766107321 0.2076857090 ) 352 1 + vert 353 ( 0.5882496834 0.6970356405 ) 353 1 + vert 354 ( 0.5996037722 0.7083897591 ) 354 1 + vert 355 ( 0.7766107917 0.1386697888 ) 355 1 + vert 356 ( 0.4965255260 0.6970356405 ) 356 1 + vert 357 ( 0.5078796148 0.7083897591 ) 357 1 + vert 358 ( 0.7099901438 0.2076856494 ) 358 1 + vert 359 ( 0.6799738407 0.3548164964 ) 359 1 + vert 360 ( 0.6913279891 0.3434623480 ) 360 1 + vert 361 ( 0.6872814894 0.2076857090 ) 361 1 + vert 362 ( 0.8634223342 0.3548164368 ) 362 1 + vert 363 ( 0.8520681858 0.3434623480 ) 363 1 + vert 364 ( 0.6206609011 0.2076856494 ) 364 1 + vert 365 ( 0.7716981173 0.3548164964 ) 365 1 + vert 366 ( 0.7830522656 0.3434623480 ) 366 1 + vert 367 ( 0.6206608415 0.1386698484 ) 367 1 + vert 368 ( 0.7716980577 0.3548164368 ) 368 1 + vert 369 ( 0.5882496834 0.6970356405 ) 369 1 + vert 370 ( 0.0180966761 1.0000000000 ) 370 1 + vert 371 ( 0.0000000000 0.9165397808 ) 371 1 + vert 372 ( 0.0000000000 0.9886458581 ) 372 1 + vert 373 ( 0.1505786180 0.6970356405 ) 373 1 + vert 374 ( 0.2089861035 1.0000000000 ) 374 1 + vert 375 ( 0.2157286406 1.0000000000 ) 375 1 + vert 376 ( 0.5037594438 0.7842713892 ) 376 1 + vert 377 ( 0.2270827889 0.9886458693 ) 377 1 + vert 378 ( 0.4428113997 1.0000000000 ) 378 1 + vert 379 ( 0.4541655481 0.9886458693 ) 379 1 + vert 380 ( 0.0149298850 0.6970356405 ) 380 1 + vert 381 ( 0.4360688329 1.0000000000 ) 381 1 + vert 382 ( 0.2270827293 0.9165397808 ) 382 1 + vert 383 ( 0.2270827293 0.9886458581 ) 383 1 + vert 384 ( 0.2384368777 1.0000000000 ) 384 1 + vert 385 ( 0.5700801611 0.7842713892 ) 385 1 + vert 386 ( 0.5063839555 0.9747674149 ) 386 1 + vert 387 ( 0.5087244511 0.9736364484 ) 387 1 + vert 388 ( 0.5415619612 0.0113542080 ) 388 1 + vert 389 ( 0.5087244511 0.9622823149 ) 389 1 + vert 390 ( 0.8747766018 0.3762815595 ) 390 1 + vert 391 ( 0.5715293288 0.7961813509 ) 391 1 + vert 392 ( 0.5537610054 0.7992807627 ) 392 1 + vert 393 ( 0.5979526639 0.0113542080 ) 393 1 + vert 394 ( 0.5651151538 0.7992807627 ) 394 1 + vert 395 ( 0.2793411613 0.0846714973 ) 395 1 + vert 396 ( 0.5537610650 0.9736364484 ) 396 1 + vert 397 ( 0.5715293884 0.9767358638 ) 397 1 + vert 398 ( 0.5651152134 0.9736364484 ) 398 1 + vert 399 ( 0.4721183479 0.1491987705 ) 399 1 + vert 400 ( 0.4965254366 0.0113541484 ) 400 1 + vert 401 ( 0.5087244511 0.8106349111 ) 401 1 + vert 402 ( 0.5087244511 0.7992807627 ) 402 1 + vert 403 ( 0.5642702579 0.0113541484 ) 403 1 + vert 404 ( 0.5200785995 0.7992807627 ) 404 1 + vert 405 ( 0.5063839555 0.7981497943 ) 405 1 + vert 406 ( 0.5651152134 0.9105100036 ) 406 1 + vert 407 ( 0.5537610650 0.9105100036 ) 407 1 + vert 408 ( 0.5651152134 0.9105100036 ) 408 1 + vert 409 ( 0.4317001402 0.1491986513 ) 409 1 + vert 410 ( 0.5651152134 0.9218641371 ) 410 1 + vert 411 ( 0.5087244511 0.9218641371 ) 411 1 + vert 412 ( 0.9151947498 0.3762814999 ) 412 1 + vert 413 ( 0.5087244511 0.9105100036 ) 413 1 + vert 414 ( 0.9375978708 0.0328193307 ) 414 1 + vert 415 ( 0.5087244511 0.8991558626 ) 415 1 + vert 416 ( 0.5087244511 0.8734562993 ) 416 1 + vert 417 ( 0.5087244511 0.8621021509 ) 417 1 + vert 418 ( 0.9715853930 0.3762816787 ) 418 1 + vert 419 ( 0.5087244511 0.8507480174 ) 419 1 + vert 420 ( 0.8747765422 0.0328192711 ) 420 1 + vert 421 ( 0.5651151538 0.8621021509 ) 421 1 + vert 422 ( 0.5651151538 0.8621021509 ) 422 1 + vert 423 ( 0.3194543421 0.0846713781 ) 423 1 + vert 424 ( 0.5651151538 0.8507480323 ) 424 1 + vert 425 ( 0.5078796148 0.1635349989 ) 425 1 + vert 426 ( 0.4965254962 0.1635349989 ) 426 1 + vert 427 ( 0.4721183479 0.2900254726 ) 427 1 + vert 428 ( 0.4965254962 0.1748891473 ) 428 1 + vert 429 ( 0.5529162884 0.1748891473 ) 429 1 + vert 430 ( 0.5529162288 0.1635349989 ) 430 1 + vert 431 ( 0.8747766018 0.5171083212 ) 431 1 + vert 432 ( 0.5415620804 0.1635349989 ) 432 1 + vert 433 ( 0.9262438416 0.1963542700 ) 433 1 + vert 434 ( 0.9262437820 0.1850001216 ) 434 1 + vert 435 ( 0.5642703176 0.1521807909 ) 435 1 + vert 436 ( 0.9148896337 0.1850001812 ) 436 1 + vert 437 ( 0.2679870129 0.2482064962 ) 437 1 + vert 438 ( 0.2793411613 0.2368523479 ) 438 1 + vert 439 ( 0.9826345444 0.1963543296 ) 439 1 + vert 440 ( 0.9826345444 0.1850001812 ) 440 1 + vert 441 ( 0.4317001402 0.2900255322 ) 441 1 + vert 442 ( 0.9712803960 0.1850001812 ) 442 1 + vert 443 ( 0.9262438416 0.1963543296 ) 443 1 + vert 444 ( 0.9375978708 0.1850001812 ) 444 1 + vert 445 ( 0.9829396009 0.5398166180 ) 445 1 + vert 446 ( 0.9829396009 0.5284624696 ) 446 1 + vert 447 ( 0.8747766018 0.1736459732 ) 447 1 + vert 448 ( 0.9715854526 0.5284624696 ) 448 1 + vert 449 ( 0.9265487790 0.5398166180 ) 449 1 + vert 450 ( 0.9379029870 0.5284624696 ) 450 1 + vert 451 ( 0.4992021918 0.7729172111 ) 451 1 + vert 452 ( 0.5105563402 0.7615630627 ) 452 1 + vert 453 ( 0.4721183479 0.4699529409 ) 453 1 + vert 454 ( 0.4655197263 0.7729172111 ) 454 1 + vert 455 ( 0.4541656077 0.7615630925 ) 455 1 + vert 456 ( 0.8747765422 0.6970357299 ) 456 1 + vert 457 ( 0.9262437820 0.3535734415 ) 457 1 + vert 458 ( 0.9148896933 0.3649275303 ) 458 1 + vert 459 ( 0.5219103694 0.7214499116 ) 459 1 + vert 460 ( 0.2679870129 0.4054255486 ) 460 1 + vert 461 ( 0.2793411613 0.4167796969 ) 461 1 + vert 462 ( 0.5555927753 0.7214499414 ) 462 1 + vert 463 ( 0.5105563402 0.7211448550 ) 463 1 + vert 464 ( 0.4317001402 0.4699529409 ) 464 1 + vert 465 ( 0.4992021918 0.7097907066 ) 465 1 + vert 466 ( 0.4541656077 0.7211449146 ) 466 1 + vert 467 ( 0.9151947498 0.6970357001 ) 467 1 + vert 468 ( 0.9829396009 0.6970356703 ) 468 1 + vert 469 ( 0.9715854526 0.7083898187 ) 469 1 + vert 470 ( 0.5219104290 0.7615630627 ) 470 1 + vert 471 ( 0.9265488982 0.6970357299 ) 471 1 + vert 472 ( 0.8170979023 0.2190399766 ) 472 1 + vert 473 ( 0.8284521103 0.2190399766 ) 473 1 + vert 474 ( 0.3897802234 0.5476535261 ) 474 1 + vert 475 ( 0.8284521103 0.2155501842 ) 475 1 + vert 476 ( 0.8420942426 0.2717807293 ) 476 1 + vert 477 ( 0.8534483910 0.2752705812 ) 477 1 + vert 478 ( 0.5960801244 0.7729172111 ) 478 1 + vert 479 ( 0.6074342728 0.7729172111 ) 479 1 + vert 480 ( 0.3724106550 0.6271994710 ) 480 1 + vert 481 ( 0.6074342728 0.7669018358 ) 481 1 + vert 482 ( 0.5960801244 0.7129043341 ) 482 1 + vert 483 ( 0.6074342728 0.7189197242 ) 483 1 + vert 484 ( 0.8103566170 0.9036009014 ) 484 1 + vert 485 ( 0.8539717197 0.9513412639 ) 485 1 + vert 486 ( 0.8217107058 0.9036009014 ) 486 1 + vert 487 ( 0.7993190289 0.2076857686 ) 487 1 + vert 488 ( 0.8243958950 0.9004262984 ) 488 1 + vert 489 ( 0.7582961321 0.8995793015 ) 489 1 + vert 490 ( 0.7616977692 0.9149550349 ) 490 1 + vert 491 ( 0.5669469833 0.7729172111 ) 491 1 + vert 492 ( 0.5669469833 0.7676499188 ) 492 1 + vert 493 ( 0.5669469833 0.7129043341 ) 493 1 + vert 494 ( 0.8312636018 0.8788833991 ) 494 1 + vert 495 ( 0.8016068935 0.3321083188 ) 495 1 + vert 496 ( 0.8225947022 0.9025558010 ) 496 1 + vert 497 ( 0.8370193243 0.8855021596 ) 497 1 + vert 498 ( 0.6310282350 0.9886458647 ) 498 1 + vert 499 ( 0.7455260754 0.8844818100 ) 499 1 + vert 500 ( 0.7224881649 0.3321083188 ) 500 1 + vert 501 ( 0.7521448731 0.8788833916 ) 501 1 + vert 502 ( 0.7407907248 0.8902375251 ) 502 1 + vert 503 ( 0.7565966845 0.8975700662 ) 503 1 + vert 504 ( 0.8370193839 0.9933812311 ) 504 1 + vert 505 ( 0.7294365764 0.9886458647 ) 505 1 + vert 506 ( 0.8426177502 0.9886458628 ) 506 1 + vert 507 ( 0.8225947022 0.9763275962 ) 507 1 + vert 508 ( 0.8312636018 1.0000000000 ) 508 1 + vert 509 ( 0.7407907248 0.9886458591 ) 509 1 + vert 510 ( 0.6310282350 0.8642233014 ) 510 1 + vert 511 ( 0.7455261350 0.9944015788 ) 511 1 + vert 512 ( 0.6997798085 0.3321083188 ) 512 1 + vert 513 ( 0.7565966845 0.9813133236 ) 513 1 + vert 514 ( 0.7521448731 0.7544609010 ) 514 1 + vert 515 ( 0.8016068935 0.2303940654 ) 515 1 + vert 516 ( 0.7407907248 0.7658150494 ) 516 1 + vert 517 ( 0.8312636614 0.7544608861 ) 517 1 + vert 518 ( 0.7224881649 0.2303940654 ) 518 1 + vert 519 ( 0.8426177502 0.7658150494 ) 519 1 + vert 520 ( 0.7407907248 0.8642233759 ) 520 1 + vert 521 ( 0.7294364572 0.8869315907 ) 521 1 + vert 522 ( 0.7521449327 0.8755775094 ) 522 1 + vert 523 ( 0.8426177502 0.8642233759 ) 523 1 + vert 524 ( 0.6310282350 0.7625090182 ) 524 1 + vert 525 ( 0.2270827442 0.7197438776 ) 525 1 + vert 526 ( 0.0000000000 0.7197438776 ) 526 1 + vert 527 ( 0.1901422739 0.7083897591 ) 527 1 + vert 528 ( 0.4851714075 0.5182475150 ) 528 1 + vert 529 ( 0.4965254962 0.3434622288 ) 529 1 + vert 530 ( 0.4175082445 0.1163794994 ) 530 1 + vert 531 ( 0.2941248417 0.4859797955 ) 531 1 + vert 532 ( 0.7830522656 0.6970356703 ) 532 1 + vert 533 ( 0.2827707529 0.5753088295 ) 533 1 + vert 534 ( 0.5814359188 0.3434622288 ) 534 1 + vert 535 ( 0.6799738407 0.5124548376 ) 535 1 + vert 536 ( 0.4965255260 0.5124548376 ) 536 1 + vert 537 ( 0.7716980577 0.5280430317 ) 537 1 + vert 538 ( 0.1900121123 0.2477870584 ) 538 1 + vert 539 ( 0.5882496834 0.5124548376 ) 539 1 + vert 540 ( 0.6799738407 0.6970356405 ) 540 1 + vert 541 ( 0.7603439093 0.3434623480 ) 541 1 + vert 542 ( 0.6872815490 0.1386697888 ) 542 1 + vert 543 ( 0.5768955350 0.7083897591 ) 543 1 + vert 544 ( 0.7099900842 0.1386698484 ) 544 1 + vert 545 ( 0.0113541419 1.0000000000 ) 545 1 + vert 546 ( 0.2270827740 0.9165397361 ) 546 1 + vert 547 ( 0.4541655183 0.9165397361 ) 547 1 + vert 548 ( 0.2451793849 1.0000000000 ) 548 1 + vert 549 ( 0.5537610054 0.8621021509 ) 549 1 + vert 550 ( 0.2679870129 0.2368523479 ) 550 1 + vert 551 ( 0.5979527235 0.1521809101 ) 551 1 + vert 552 ( 0.9262437820 0.1850001812 ) 552 1 + vert 553 ( 0.9151947498 0.5171083510 ) 553 1 + vert 554 ( 0.9265488386 0.5284624696 ) 554 1 + vert 555 ( 0.3194543123 0.2254981995 ) 555 1 + vert 556 ( 0.4655197561 0.7097907662 ) 556 1 + vert 557 ( 0.9379030466 0.7083898485 ) 557 1 + vert 558 ( 0.5555928946 0.7615630627 ) 558 1 + vert 559 ( 0.8534483910 0.2717807293 ) 559 1 + vert 560 ( 0.4377623200 0.5476535559 ) 560 1 + vert 561 ( 0.6074342728 0.7129043341 ) 561 1 + vert 562 ( 0.4551318288 0.6271994412 ) 562 1 + vert 563 ( 0.7616977692 0.9036009014 ) 563 1 + vert 564 ( 0.8539717197 0.9886458637 ) 564 1 + vert 565 ( 0.8243153095 0.2717807293 ) 565 1 + vert 566 ( 0.5783011913 0.7729172111 ) 566 1 + vert 567 ( 0.7993190289 0.1587125063 ) 567 1 + vert 568 ( 0.5669469833 0.7181716263 ) 568 1 + vert 569 ( 0.5783011913 0.7129043341 ) 569 1 + vert 570 ( 0.8243153691 0.3321081400 ) 570 1 + vert 571 ( 0.8312636018 0.8755775094 ) 571 1 + vert 572 ( 0.4541654587 0.7538222075 ) 572 1 + vert 573 ( 0.4172250032 0.7083897591 ) 573 1 + vert 574 ( 0.2270827442 0.7538222075 ) 574 1 + vert 575 ( 0.2024006248 0.4859797955 ) 575 1 + numtris 546 + tri 0 11 43 18 + tri 1 9 218 5 + tri 2 14 562 528 + tri 3 279 226 289 + tri 4 30 64 23 + tri 5 311 340 306 + tri 6 380 25 373 + tri 7 532 74 312 + tri 8 110 301 12 + tri 9 293 560 285 + tri 10 121 127 6 + tri 11 117 109 21 + tri 12 22 56 26 + tri 13 83 106 62 + tri 14 75 100 70 + tri 15 0 1 38 + tri 16 53 84 57 + tri 17 29 59 49 + tri 18 115 36 124 + tri 19 52 82 31 + tri 20 37 67 46 + tri 21 148 108 113 + tri 22 542 361 367 + tri 23 68 94 77 + tri 24 332 90 326 + tri 25 69 96 65 + tri 26 76 102 72 + tri 27 355 352 544 + tri 28 330 88 349 + tri 29 143 376 133 + tri 30 122 138 144 + tri 31 118 112 137 + tri 32 418 186 158 + tri 33 388 167 136 + tri 34 164 195 160 + tri 35 163 453 176 + tri 36 180 467 165 + tri 37 412 553 390 + tri 38 393 551 403 + tri 39 141 170 420 + tri 40 399 427 409 + tri 41 153 159 151 + tri 42 423 555 395 + tri 43 558 470 462 + tri 44 220 564 216 + tri 45 196 208 194 + tri 46 188 213 173 + tri 47 172 201 168 + tri 48 171 199 184 + tri 49 179 205 181 + tri 50 187 211 189 + tri 51 236 255 232 + tri 52 40 35 17 + tri 53 123 48 7 + tri 54 16 51 3 + tri 55 243 258 245 + tri 56 228 570 221 + tri 57 227 242 229 + tri 58 219 487 224 + tri 59 272 266 274 + tri 60 235 250 240 + tri 61 500 518 495 + tri 62 244 263 237 + tri 63 510 524 253 + tri 64 259 271 512 + tri 65 498 265 505 + tri 66 146 178 414 + tri 67 318 538 315 + tri 68 281 280 278 + tri 69 525 284 8 + tri 70 526 288 13 + tri 71 294 527 292 + tri 72 298 296 22 + tri 73 302 300 26 + tri 74 303 529 31 + tri 75 305 309 308 + tri 76 40 313 575 + tri 77 314 531 42 + tri 78 317 320 533 + tri 79 321 52 322 + tri 80 324 56 325 + tri 81 327 329 58 + tri 82 331 536 333 + tri 83 334 68 335 + tri 84 339 70 338 + tri 85 342 75 343 + tri 86 346 537 77 + tri 87 348 350 539 + tri 88 540 351 84 + tri 89 354 353 87 + tri 90 92 357 356 + tri 91 360 94 359 + tri 92 98 363 362 + tri 93 366 100 365 + tri 94 104 541 368 + tri 95 543 106 369 + tri 96 372 371 109 + tri 97 117 546 377 + tri 98 381 121 379 + tri 99 127 548 383 + tri 100 128 389 386 + tri 101 391 394 133 + tri 102 396 398 137 + tri 103 140 405 401 + tri 104 408 407 406 + tri 105 415 413 148 + tri 106 419 417 152 + tri 107 159 549 421 + tri 108 160 428 425 + tri 109 164 432 429 + tri 110 433 171 434 + tri 111 437 550 173 + tri 112 439 179 440 + tri 113 443 552 181 + tri 114 445 187 446 + tri 115 449 554 189 + tri 116 194 452 451 + tri 117 455 196 454 + tri 118 458 199 457 + tri 119 203 461 460 + tri 120 206 465 463 + tri 121 556 208 466 + tri 122 469 211 468 + tri 123 215 557 471 + tri 124 219 475 472 + tri 125 559 477 476 + tri 126 478 227 479 + tri 127 482 561 229 + tri 128 232 488 484 + tri 129 489 563 237 + tri 130 492 242 491 + tri 131 569 246 493 + tri 132 494 497 249 + tri 133 499 503 502 + tri 134 508 258 504 + tri 135 263 513 509 + tri 136 266 516 514 + tri 137 519 268 517 + tri 138 272 522 520 + tri 139 571 274 523 + tri 140 370 109 374 + tri 141 118 119 112 + tri 142 572 547 6 + tri 143 117 21 546 + tri 144 282 8 382 + tri 145 286 13 371 + tri 146 10 11 19 + tri 147 573 6 283 + tri 148 114 115 125 + tri 149 20 21 287 + tri 150 15 16 4 + tri 151 548 127 381 + tri 152 298 22 299 + tri 153 30 23 530 + tri 154 35 40 34 + tri 155 314 42 319 + tri 156 49 50 29 + tri 157 43 44 39 + tri 158 36 309 47 + tri 159 52 31 534 + tri 160 373 27 110 + tri 161 24 25 120 + tri 162 3 32 2 + tri 163 323 51 12 + tri 164 124 47 123 + tri 165 35 36 116 + tri 166 18 39 17 + tri 167 42 43 7 + tri 168 56 53 58 + tri 169 64 332 55 + tri 170 65 336 69 + tri 171 72 344 76 + tri 172 349 81 330 + tri 173 75 70 74 + tri 174 67 68 78 + tri 175 82 83 63 + tri 176 302 26 328 + tri 177 535 56 295 + tri 178 303 31 536 + tri 179 539 82 321 + tri 180 73 74 41 + tri 181 78 79 46 + tri 182 66 67 307 + tri 183 84 351 87 + tri 184 90 91 86 + tri 185 95 93 97 + tri 186 101 99 103 + tri 187 107 105 89 + tri 188 100 366 98 + tri 189 94 360 104 + tri 190 106 543 92 + tri 191 346 77 368 + tri 192 359 94 334 + tri 193 83 80 106 + tri 194 87 353 57 + tri 195 98 362 70 + tri 196 540 84 54 + tri 197 61 62 356 + tri 198 365 100 342 + tri 199 113 376 140 + tri 200 108 128 112 + tri 201 133 385 132 + tri 202 137 129 396 + tri 203 143 133 404 + tri 204 122 118 138 + tri 205 139 410 138 + tri 206 389 128 411 + tri 207 145 407 151 + tri 208 152 140 419 + tri 209 156 424 132 + tri 210 549 159 154 + tri 211 160 161 164 + tri 212 168 435 172 + tri 213 427 163 441 + tri 214 165 431 180 + tri 215 178 179 182 + tri 216 184 447 171 + tri 217 555 188 174 + tri 218 189 190 187 + tri 219 157 158 191 + tri 220 185 186 155 + tri 221 149 414 183 + tri 222 177 178 147 + tri 223 400 136 162 + tri 224 166 167 131 + tri 225 134 395 175 + tri 226 169 170 142 + tri 227 194 451 196 + tri 228 200 198 202 + tri 229 452 194 463 + tri 230 196 455 208 + tri 231 465 206 556 + tri 232 212 210 458 + tri 233 213 214 203 + tri 234 557 215 469 + tri 235 179 439 205 + tri 236 192 193 160 + tri 237 197 195 429 + tri 238 449 189 471 + tri 239 468 211 445 + tri 240 457 199 433 + tri 241 209 207 181 + tri 242 203 460 173 + tri 243 216 217 220 + tri 244 224 225 219 + tri 245 221 477 228 + tri 246 229 483 227 + tri 247 285 474 9 + tri 248 222 560 528 + tri 249 562 14 230 + tri 250 279 5 226 + tri 251 232 484 236 + tri 252 240 241 235 + tri 253 237 490 244 + tri 254 568 246 492 + tri 255 482 229 569 + tri 256 566 242 478 + tri 257 233 487 472 + tri 258 476 221 565 + tri 259 494 249 501 + tri 260 506 257 251 + tri 261 502 254 509 + tri 262 261 262 508 + tri 263 237 254 236 + tri 264 263 244 262 + tri 265 232 249 235 + tri 266 258 243 257 + tri 267 266 514 268 + tri 268 272 520 266 + tri 269 268 519 274 + tri 270 274 571 272 + tri 271 260 512 273 + tri 272 270 271 256 + tri 273 264 265 248 + tri 274 252 253 267 + tri 275 144 145 156 + tri 276 152 153 148 + tri 277 33 24 2 + tri 278 43 39 18 + tri 279 218 480 5 + tri 280 562 222 528 + tri 281 226 230 289 + tri 282 64 55 23 + tri 283 340 336 306 + tri 284 25 27 373 + tri 285 74 341 312 + tri 286 301 323 12 + tri 287 560 474 285 + tri 288 127 8 6 + tri 289 109 13 21 + tri 290 56 58 26 + tri 291 106 92 62 + tri 292 100 98 70 + tri 293 1 71 38 + tri 294 84 87 57 + tri 295 59 81 49 + tri 296 36 47 124 + tri 297 82 63 31 + tri 298 67 78 46 + tri 299 108 148 128 + tri 300 113 152 148 + tri 301 113 140 152 + tri 302 361 364 367 + tri 303 94 104 77 + tri 304 90 86 326 + tri 305 96 93 65 + tri 306 102 99 72 + tri 307 352 358 544 + tri 308 88 105 349 + tri 309 376 385 133 + tri 310 144 126 122 + tri 311 156 132 126 + tri 312 126 144 156 + tri 313 112 129 137 + tri 314 186 190 158 + tri 315 167 161 136 + tri 316 195 192 160 + tri 317 453 464 176 + tri 318 467 456 165 + tri 319 553 431 390 + tri 320 551 435 403 + tri 321 170 447 420 + tri 322 427 441 409 + tri 323 159 145 151 + tri 324 555 174 395 + tri 325 470 459 462 + tri 326 564 485 216 + tri 327 208 206 194 + tri 328 213 203 173 + tri 329 201 198 168 + tri 330 199 210 184 + tri 331 205 209 181 + tri 332 211 215 189 + tri 333 255 249 232 + tri 334 35 116 17 + tri 335 48 42 7 + tri 336 51 32 3 + tri 337 258 262 245 + tri 338 570 238 221 + tri 339 242 246 229 + tri 340 487 567 224 + tri 341 266 268 274 + tri 342 250 257 240 + tri 343 518 515 495 + tri 344 263 254 237 + tri 345 524 269 253 + tri 346 271 275 512 + tri 347 265 521 505 + tri 348 178 182 414 + tri 349 538 344 315 + tri 350 277 276 281 + tri 351 281 278 277 + tri 352 8 282 525 + tri 353 284 283 8 + tri 354 13 286 526 + tri 355 288 287 13 + tri 356 291 290 294 + tri 357 294 292 291 + tri 358 296 295 22 + tri 359 300 299 26 + tri 360 529 304 31 + tri 361 309 36 308 + tri 362 531 316 42 + tri 363 320 47 533 + tri 364 52 534 322 + tri 365 56 535 325 + tri 366 329 328 58 + tri 367 536 63 333 + tri 368 68 337 335 + tri 369 75 345 343 + tri 370 537 347 77 + tri 371 350 82 539 + tri 372 372 370 545 + tri 373 372 109 370 + tri 374 377 374 117 + tri 375 377 375 374 + tri 376 379 378 381 + tri 377 121 547 379 + tri 378 383 382 127 + tri 379 548 384 383 + tri 380 389 387 386 + tri 381 394 392 133 + tri 382 398 397 137 + tri 383 405 402 401 + tri 384 407 145 406 + tri 385 413 411 148 + tri 386 417 416 152 + tri 387 549 422 421 + tri 388 428 426 425 + tri 389 432 430 429 + tri 390 171 436 434 + tri 391 550 438 173 + tri 392 179 442 440 + tri 393 552 444 181 + tri 394 187 448 446 + tri 395 554 450 189 + tri 396 475 473 472 + tri 397 477 221 476 + tri 398 227 481 479 + tri 399 561 483 229 + tri 400 488 486 484 + tri 401 563 490 237 + tri 402 242 566 491 + tri 403 246 568 493 + tri 404 497 496 249 + tri 405 503 254 502 + tri 406 258 507 504 + tri 407 513 511 509 + tri 408 109 117 374 + tri 409 119 111 112 + tri 410 547 121 6 + tri 411 21 574 546 + tri 412 8 127 382 + tri 413 13 109 371 + tri 414 11 18 19 + tri 415 6 8 283 + tri 416 115 124 125 + tri 417 21 13 287 + tri 418 16 3 4 + tri 419 127 121 381 + tri 420 22 26 299 + tri 421 23 297 530 + tri 422 40 575 34 + tri 423 42 48 319 + tri 424 50 28 29 + tri 425 44 310 39 + tri 426 309 533 47 + tri 427 31 304 534 + tri 428 27 301 110 + tri 429 25 380 120 + tri 430 32 33 2 + tri 431 51 16 12 + tri 432 47 48 123 + tri 433 36 115 116 + tri 434 39 40 17 + tri 435 43 11 7 + tri 436 53 57 58 + tri 437 332 326 55 + tri 438 336 340 69 + tri 439 344 538 76 + tri 440 81 59 330 + tri 441 70 341 74 + tri 442 68 77 78 + tri 443 83 62 63 + tri 444 26 58 328 + tri 445 56 22 295 + tri 446 31 63 536 + tri 447 82 52 321 + tri 448 74 532 41 + tri 449 79 45 46 + tri 450 67 37 307 + tri 451 351 354 87 + tri 452 91 85 86 + tri 453 93 96 97 + tri 454 99 102 103 + tri 455 105 88 89 + tri 456 366 363 98 + tri 457 360 541 104 + tri 458 543 357 92 + tri 459 77 104 368 + tri 460 94 68 334 + tri 461 80 369 106 + tri 462 353 60 57 + tri 463 362 338 70 + tri 464 84 53 54 + tri 465 62 92 356 + tri 466 100 75 342 + tri 467 376 143 140 + tri 468 128 129 112 + tri 469 385 126 132 + tri 470 129 130 396 + tri 471 133 392 404 + tri 472 118 137 138 + tri 473 410 144 138 + tri 474 128 148 411 + tri 475 407 150 151 + tri 476 140 401 419 + tri 477 424 135 132 + tri 478 159 153 154 + tri 479 161 167 164 + tri 480 435 551 172 + tri 481 163 176 441 + tri 482 431 553 180 + tri 483 179 181 182 + tri 484 447 170 171 + tri 485 188 173 174 + tri 486 190 186 187 + tri 487 158 190 191 + tri 488 186 418 155 + tri 489 414 182 183 + tri 490 178 146 147 + tri 491 136 161 162 + tri 492 167 388 131 + tri 493 395 174 175 + tri 494 170 141 142 + tri 495 451 454 196 + tri 496 198 201 202 + tri 497 194 206 463 + tri 498 455 466 208 + tri 499 206 208 556 + tri 500 210 199 458 + tri 501 214 461 203 + tri 502 215 211 469 + tri 503 439 204 205 + tri 504 193 428 160 + tri 505 195 164 429 + tri 506 189 215 471 + tri 507 211 187 445 + tri 508 199 171 433 + tri 509 207 443 181 + tri 510 460 437 173 + tri 511 217 223 220 + tri 512 225 475 219 + tri 513 477 231 228 + tri 514 483 481 227 + tri 515 474 218 9 + tri 516 560 293 528 + tri 517 14 289 230 + tri 518 5 480 226 + tri 519 484 239 236 + tri 520 241 234 235 + tri 521 490 247 244 + tri 522 246 242 492 + tri 523 229 246 569 + tri 524 242 227 478 + tri 525 487 219 472 + tri 526 221 238 565 + tri 527 249 255 501 + tri 528 257 250 251 + tri 529 254 263 509 + tri 530 262 258 508 + tri 531 254 255 236 + tri 532 244 245 262 + tri 533 249 250 235 + tri 534 243 240 257 + tri 535 514 517 268 + tri 536 520 516 266 + tri 537 519 523 274 + tri 538 571 522 272 + tri 539 512 275 273 + tri 540 271 259 256 + tri 541 265 498 248 + tri 542 253 269 267 + tri 543 145 159 156 + tri 544 153 151 148 + tri 545 24 120 2 + numweights 576 + weight 0 7 1.0000000000 ( -0.4039240777 0.9994876385 -0.2740307450 ) + weight 1 8 1.0000000000 ( -0.4039240777 1.5706025362 -0.2740307450 ) + weight 2 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 3 2 1.0000000000 ( 0.5622114539 0.7840003967 -1.0001215935 ) + weight 4 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 5 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 6 2 1.0000000000 ( 0.7288469076 0.7839505672 -0.9001214504 ) + weight 7 7 1.0000000000 ( 0.6288465261 0.9994875789 -0.4833616316 ) + weight 8 2 1.0000000000 ( 0.7288460732 0.7830536366 0.8998782635 ) + weight 9 2 1.0000000000 ( 0.6288461685 0.8831658363 0.6745800972 ) + weight 10 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 11 2 1.0000000000 ( 0.5622105002 0.7830038071 0.9998782277 ) + weight 12 4 1.0000000000 ( -0.6288465858 1.0005125999 0.4833615720 ) + weight 13 2 1.0000000000 ( -0.7288460732 0.7839505672 -0.9001221657 ) + weight 14 2 1.0000000000 ( -0.6288461685 0.8838381767 -0.6747243404 ) + weight 15 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 16 2 1.0000000000 ( -0.5622105002 0.7840003967 -1.0001220703 ) + weight 17 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 18 2 1.0000000000 ( -0.5622114539 0.7830038071 0.9998776913 ) + weight 19 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 20 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 21 2 1.0000000000 ( -0.7288469076 0.7830536366 0.8998775482 ) + weight 22 4 1.0000000000 ( 0.3039242327 1.1005123854 -0.5127219558 ) + weight 23 4 1.0000000000 ( 0.4039241970 1.1005123854 -0.4127220213 ) + weight 24 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 25 4 1.0000000000 ( 0.3278744221 1.0005123615 -0.6127218604 ) + weight 26 4 1.0000000000 ( -0.3039239943 1.1005123854 -0.5127220750 ) + weight 27 4 1.0000000000 ( -0.3278741241 1.0005123615 -0.6127219796 ) + weight 28 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 29 4 1.0000000000 ( -0.4039240181 1.1005123854 -0.4127222002 ) + weight 30 4 1.0000000000 ( 0.4039240777 1.1005125046 0.1740308702 ) + weight 31 4 1.0000000000 ( 0.3039240539 1.1005125046 0.2740307450 ) + weight 32 4 1.0000000000 ( 0.3439128101 1.0005125999 0.3740306795 ) + weight 33 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 34 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 35 7 1.0000000000 ( -0.5039241910 0.9994876981 0.4991172850 ) + weight 36 7 1.0000000000 ( -0.3278743625 0.9994876981 0.6127218604 ) + weight 37 7 1.0000000000 ( -0.3039242029 1.0994876623 0.5127219558 ) + weight 38 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 39 7 1.0000000000 ( -0.3439128399 0.9994875789 -0.3740306497 ) + weight 40 7 1.0000000000 ( -0.5039240718 0.9994876385 -0.2490397245 ) + weight 41 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 42 7 1.0000000000 ( 0.5039241910 0.9994876385 -0.2490395755 ) + weight 43 7 1.0000000000 ( 0.3439129591 0.9994875789 -0.3740305305 ) + weight 44 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 45 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 46 7 1.0000000000 ( 0.3039240241 1.0994876623 0.5127220750 ) + weight 47 7 1.0000000000 ( 0.3278741837 0.9994876981 0.6127219796 ) + weight 48 7 1.0000000000 ( 0.5039240718 0.9994876981 0.4991174638 ) + weight 49 4 1.0000000000 ( -0.4039241374 1.1005125046 0.1740306914 ) + weight 50 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 51 4 1.0000000000 ( -0.3439129889 1.0005125999 0.3740305007 ) + weight 52 4 1.0000000000 ( -0.3039241731 1.1005125046 0.2740306258 ) + weight 53 5 1.0000000000 ( 0.3039242327 1.6850823164 -0.5127219558 ) + weight 54 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 55 5 1.0000000000 ( 0.4039241970 1.4850825071 -0.4127220213 ) + weight 56 5 1.0000000000 ( 0.3039242327 1.4850825071 -0.5127219558 ) + weight 57 5 1.0000000000 ( -0.3039239943 1.6850823164 -0.5127220750 ) + weight 58 5 1.0000000000 ( -0.3039239943 1.4850825071 -0.5127220750 ) + weight 59 5 1.0000000000 ( -0.4039240181 1.4850825071 -0.4127222002 ) + weight 60 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 61 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 62 5 1.0000000000 ( 0.3039240539 1.6850824356 0.2740307450 ) + weight 63 5 1.0000000000 ( 0.3039240539 1.4850826263 0.2740307450 ) + weight 64 5 1.0000000000 ( 0.4039240777 1.4850826263 0.1740308702 ) + weight 65 8 1.0000000000 ( -0.4039241672 1.6706025600 0.4127220511 ) + weight 66 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 67 8 1.0000000000 ( -0.3039242029 1.4706027508 0.5127219558 ) + weight 68 8 1.0000000000 ( -0.3039242029 1.6706025600 0.5127219558 ) + weight 69 8 1.0000000000 ( -0.4039240777 1.6706024408 -0.1740308404 ) + weight 70 8 1.0000000000 ( -0.3039240837 1.6706024408 -0.2740307450 ) + weight 71 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 72 8 1.0000000000 ( 0.4039241374 1.6706024408 -0.1740307212 ) + weight 73 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 74 8 1.0000000000 ( 0.3039241433 1.4706026316 -0.2740306258 ) + weight 75 8 1.0000000000 ( 0.3039241433 1.6706024408 -0.2740306258 ) + weight 76 8 1.0000000000 ( 0.4039240479 1.6706025600 0.4127221704 ) + weight 77 8 1.0000000000 ( 0.3039240241 1.6706025600 0.5127220750 ) + weight 78 8 1.0000000000 ( 0.3039240241 1.4706027508 0.5127220750 ) + weight 79 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 80 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 81 5 1.0000000000 ( -0.4039241374 1.4850826263 0.1740306914 ) + weight 82 5 1.0000000000 ( -0.3039241731 1.4850826263 0.2740306258 ) + weight 83 5 1.0000000000 ( -0.3039241731 1.6850824356 0.2740306258 ) + weight 84 6 1.0000000000 ( 0.3039242327 1.5055567026 -0.5127219558 ) + weight 85 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 86 6 1.0000000000 ( 0.4039241970 1.5055567026 -0.4127220213 ) + weight 87 6 1.0000000000 ( -0.3039239943 1.5055567026 -0.5127220750 ) + weight 88 6 1.0000000000 ( -0.4039240181 1.5055567026 -0.4127222002 ) + weight 89 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 90 6 1.0000000000 ( 0.4039240777 1.5055568218 0.1740308702 ) + weight 91 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 92 6 1.0000000000 ( 0.3039240539 1.5055568218 0.2740307450 ) + weight 93 9 1.0000000000 ( -0.4039241672 1.4094725847 0.4127220511 ) + weight 94 9 1.0000000000 ( -0.3039242029 1.4094725847 0.5127219558 ) + weight 95 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 96 9 1.0000000000 ( -0.4039240777 1.4094724655 -0.1740308404 ) + weight 97 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 98 9 1.0000000000 ( -0.3039240837 1.4094724655 -0.2740307450 ) + weight 99 9 1.0000000000 ( 0.4039241374 1.4094724655 -0.1740307212 ) + weight 100 9 1.0000000000 ( 0.3039241433 1.4094724655 -0.2740306258 ) + weight 101 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 102 9 1.0000000000 ( 0.4039240479 1.4094725847 0.4127221704 ) + weight 103 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 104 9 1.0000000000 ( 0.3039240241 1.4094725847 0.5127220750 ) + weight 105 6 1.0000000000 ( -0.4039241374 1.5055568218 0.1740306914 ) + weight 106 6 1.0000000000 ( -0.3039241731 1.5055568218 0.2740306258 ) + weight 107 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 108 1 1.0000000000 ( -0.6288462877 -0.0027038516 -0.8406154513 ) + weight 109 1 1.0000000000 ( -0.7288462520 0.0972779691 -0.9000298381 ) + weight 110 1 1.0000000000 ( -0.6288462281 0.7323116660 -1.0002232790 ) + weight 111 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 112 1 1.0000000000 ( -0.2920551896 -0.0027219369 -0.8999993205 ) + weight 113 1 1.0000000000 ( -0.6288466454 -0.0021918355 0.8406166434 ) + weight 114 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 115 1 1.0000000000 ( -0.5973538756 0.0978566110 0.9999701381 ) + weight 116 1 1.0000000000 ( -0.6288467050 0.7329211831 0.9997767210 ) + weight 117 1 1.0000000000 ( -0.7288467288 0.0978261530 0.8999701142 ) + weight 118 1 1.0000000000 ( 0.2920556366 -0.0027219369 -0.8999991417 ) + weight 119 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 120 1 1.0000000000 ( 0.6288467050 0.7323121428 -1.0002229214 ) + weight 121 1 1.0000000000 ( 0.7288467288 0.0972779691 -0.9000295401 ) + weight 122 1 1.0000000000 ( 0.6288466454 -0.0027038516 -0.8406151533 ) + weight 123 1 1.0000000000 ( 0.6288462281 0.7329207063 0.9997770190 ) + weight 124 1 1.0000000000 ( 0.5973533988 0.0978566110 0.9999704361 ) + weight 125 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 126 1 1.0000000000 ( 0.6288462877 -0.0021918355 0.8406169415 ) + weight 127 1 1.0000000000 ( 0.7288462520 0.0978261530 0.8999704123 ) + weight 128 1 1.0000000000 ( -0.3483265936 -0.0026625698 -0.7050647736 ) + weight 129 1 1.0000000000 ( -0.2254323065 -0.0027121324 -0.8678063154 ) + weight 130 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 131 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 132 1 1.0000000000 ( 0.3483265638 -0.0022331174 0.7050662637 ) + weight 133 1 1.0000000000 ( 0.2254322916 -0.0021835547 0.8678078055 ) + weight 134 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 135 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 136 1 1.0000000000 ( 0.1483269334 -0.1026815847 -0.7677757740 ) + weight 137 1 1.0000000000 ( 0.2254328430 -0.0027121324 -0.8678062558 ) + weight 138 1 1.0000000000 ( 0.3483269215 -0.0026625700 -0.7050646544 ) + weight 139 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 140 1 1.0000000000 ( -0.3483269513 -0.0022331174 0.7050660849 ) + weight 141 1 1.0000000000 ( -0.2483269423 -0.1022443697 0.6678380966 ) + weight 142 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 143 1 1.0000000000 ( -0.2254327387 -0.0021835547 0.8678077459 ) + weight 144 1 1.0000000000 ( 0.3483268023 -0.0025123558 -0.2118284255 ) + weight 145 1 1.0000000000 ( 0.1483267844 -0.0024819009 -0.1118284762 ) + weight 146 1 1.0000000000 ( 0.1483267993 -0.1025122628 -0.2117980272 ) + weight 147 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 148 1 1.0000000000 ( -0.3483267128 -0.0025123558 -0.2118286043 ) + weight 149 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 150 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 151 1 1.0000000000 ( -0.1483267248 -0.0024819009 -0.1118285581 ) + weight 152 1 1.0000000000 ( -0.3483268321 -0.0023825131 0.2145166397 ) + weight 153 1 1.0000000000 ( -0.1483268142 -0.0024129678 0.1145166904 ) + weight 154 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 155 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 156 1 1.0000000000 ( 0.3483266830 -0.0023825131 0.2145168185 ) + weight 157 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 158 1 1.0000000000 ( 0.1483267099 -0.1023824140 0.2145472169 ) + weight 159 1 1.0000000000 ( 0.1483267248 -0.0024129678 0.1145167649 ) + weight 160 11 1.0000000000 ( 0.1483266801 1.5368695259 0.2828474939 ) + weight 161 11 1.0000000000 ( 0.1483266801 1.3368693590 0.2828474939 ) + weight 162 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 163 11 1.0000000000 ( 0.2483267039 1.5368694067 0.1828474402 ) + weight 164 11 1.0000000000 ( -0.1483268291 1.5368695259 0.2828474343 ) + weight 165 11 1.0000000000 ( -0.2483268082 1.5368694067 0.1828473210 ) + weight 166 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 167 11 1.0000000000 ( -0.1483268440 1.3368693590 0.2828474343 ) + weight 168 14 1.0000000000 ( -0.1483269930 1.5362550020 -0.2177159637 ) + weight 169 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 170 14 1.0000000000 ( -0.2483268976 1.3362549543 -0.1177158356 ) + weight 171 14 1.0000000000 ( -0.2483268976 1.5362550020 -0.1177158356 ) + weight 172 14 1.0000000000 ( 0.1483265162 1.5362550020 -0.2177162319 ) + weight 173 14 1.0000000000 ( 0.2483266145 1.5362550020 -0.1177163124 ) + weight 174 14 1.0000000000 ( 0.2483266145 1.3362549543 -0.1177163124 ) + weight 175 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 176 11 1.0000000000 ( 0.2483267933 1.5368694067 -0.1731303036 ) + weight 177 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 178 11 1.0000000000 ( 0.1483268142 1.3368691206 -0.2731303275 ) + weight 179 11 1.0000000000 ( 0.1483268142 1.5368692875 -0.2731303275 ) + weight 180 11 1.0000000000 ( -0.2483267188 1.5368694067 -0.1731304228 ) + weight 181 11 1.0000000000 ( -0.1483266950 1.5368692875 -0.2731304169 ) + weight 182 11 1.0000000000 ( -0.1483266950 1.3368691206 -0.2731304169 ) + weight 183 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 184 14 1.0000000000 ( -0.2483265549 1.5362550020 0.2355751693 ) + weight 185 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 186 14 1.0000000000 ( -0.1483264714 1.3362549543 0.3355750740 ) + weight 187 14 1.0000000000 ( -0.1483264714 1.5362550020 0.3355750740 ) + weight 188 14 1.0000000000 ( 0.2483269721 1.5362550020 0.2355746925 ) + weight 189 14 1.0000000000 ( 0.1483270675 1.5362550020 0.3355747759 ) + weight 190 14 1.0000000000 ( 0.1483270526 1.3362549543 0.3355747759 ) + weight 191 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 192 12 1.0000000000 ( 0.1483267546 1.5553369522 0.2828474641 ) + weight 193 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 194 12 1.0000000000 ( 0.1483267546 1.6553369761 0.1828473806 ) + weight 195 12 1.0000000000 ( -0.1483267546 1.5553369522 0.2828474641 ) + weight 196 12 1.0000000000 ( -0.1483267546 1.6553369761 0.1828473806 ) + weight 197 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 198 15 1.0000000000 ( -0.1483269930 1.5547224283 -0.2177159637 ) + weight 199 15 1.0000000000 ( -0.2483268976 1.5547224283 -0.1177158356 ) + weight 200 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 201 15 1.0000000000 ( 0.1483265162 1.5547224283 -0.2177162319 ) + weight 202 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 203 15 1.0000000000 ( 0.2483266145 1.5547224283 -0.1177163124 ) + weight 204 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 205 12 1.0000000000 ( 0.1483267546 1.5553368330 -0.2731303573 ) + weight 206 12 1.0000000000 ( 0.1483267546 1.6553368568 -0.1731303632 ) + weight 207 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 208 12 1.0000000000 ( -0.1483267546 1.6553368568 -0.1731303632 ) + weight 209 12 1.0000000000 ( -0.1483267546 1.5553368330 -0.2731303871 ) + weight 210 15 1.0000000000 ( -0.2483265549 1.5547224283 0.2355751693 ) + weight 211 15 1.0000000000 ( -0.1483264714 1.5547224283 0.3355750740 ) + weight 212 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 213 15 1.0000000000 ( 0.2483269721 1.5547224283 0.2355746925 ) + weight 214 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 215 15 1.0000000000 ( 0.1483270675 1.5547224283 0.3355747759 ) + weight 216 2 1.0000000000 ( 0.1642774343 0.9833446145 0.3156406283 ) + weight 217 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 218 2 1.0000000000 ( 0.3642774224 0.8833600283 0.2848545611 ) + weight 219 2 1.0000000000 ( 0.2642774880 0.9833944440 0.2156406790 ) + weight 220 2 1.0000000000 ( -0.1642777324 0.9833446145 0.3156404793 ) + weight 221 2 1.0000000000 ( -0.2642776668 0.9833944440 0.2156404257 ) + weight 222 2 1.0000000000 ( -0.3642777205 0.8833600283 0.2848542035 ) + weight 223 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 224 2 1.0000000000 ( 0.2642776668 0.9836093783 -0.2156849951 ) + weight 225 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 226 2 1.0000000000 ( 0.2112980932 0.8837091327 -0.4157347977 ) + weight 227 2 1.0000000000 ( 0.1642777324 0.9836592078 -0.3156850338 ) + weight 228 2 1.0000000000 ( -0.2642774880 0.9836093783 -0.2156852484 ) + weight 229 2 1.0000000000 ( -0.1642774343 0.9836592078 -0.3156851828 ) + weight 230 2 1.0000000000 ( -0.2112977058 0.8837091327 -0.4157350063 ) + weight 231 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 232 3 1.0000000000 ( 0.2178864777 0.2118682861 0.4156629145 ) + weight 233 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 234 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 235 3 1.0000000000 ( 0.3642775118 0.2118682861 0.2790425122 ) + weight 236 3 1.0000000000 ( -0.2178866714 0.2118682861 0.4156627953 ) + weight 237 3 1.0000000000 ( -0.3642776310 0.2118682861 0.2790423334 ) + weight 238 3 1.0000000000 ( -0.2642776370 0.1118683815 0.2156628072 ) + weight 239 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 240 3 1.0000000000 ( 0.3642776310 0.2118682861 -0.2790423334 ) + weight 241 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 242 3 1.0000000000 ( 0.1642776579 0.1118683815 -0.3156628311 ) + weight 243 3 1.0000000000 ( 0.2178866714 0.2118682861 -0.4156627953 ) + weight 244 3 1.0000000000 ( -0.3642775118 0.2118682861 -0.2790425122 ) + weight 245 3 1.0000000000 ( -0.2178864777 0.2118682861 -0.4156629145 ) + weight 246 3 1.0000000000 ( -0.1642775089 0.1118683815 -0.3156628907 ) + weight 247 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 248 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 249 3 1.0000000000 ( 0.2328544855 0.2118682861 0.4333589375 ) + weight 250 3 1.0000000000 ( 0.3484135866 0.2118682861 0.2602873147 ) + weight 251 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 252 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 253 3 1.0000000000 ( -0.4484137595 0.3118681908 0.4333587587 ) + weight 254 3 1.0000000000 ( -0.3484137356 0.2118682861 0.2602871358 ) + weight 255 3 1.0000000000 ( -0.2328547388 0.2118682861 0.4333588183 ) + weight 256 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 257 3 1.0000000000 ( 0.3484137356 0.2118682861 -0.2602871358 ) + weight 258 3 1.0000000000 ( 0.2328547388 0.2118682861 -0.4333588183 ) + weight 259 3 1.0000000000 ( 0.3484137952 0.3118681908 -0.5333588123 ) + weight 260 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 261 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 262 3 1.0000000000 ( -0.2328544855 0.2118682861 -0.4333589375 ) + weight 263 3 1.0000000000 ( -0.3484135866 0.2118682861 -0.2602873147 ) + weight 264 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 265 3 1.0000000000 ( 0.4484135807 1.2077021599 0.4333589971 ) + weight 266 3 1.0000000000 ( 0.3484135866 1.3077020645 0.4333589673 ) + weight 267 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 268 3 1.0000000000 ( -0.3484137654 1.3077020645 0.4333587885 ) + weight 269 3 1.0000000000 ( -0.4484137595 1.2077021599 0.4333587587 ) + weight 270 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 271 3 1.0000000000 ( 0.3484137952 1.2077021599 -0.5333588123 ) + weight 272 3 1.0000000000 ( 0.3484137654 1.3077020645 -0.4333587885 ) + weight 273 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 274 3 1.0000000000 ( -0.3484135866 1.3077020645 -0.4333589673 ) + weight 275 3 1.0000000000 ( -0.3484135568 1.2077021599 -0.5333589315 ) + weight 276 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 277 2 1.0000000000 ( 0.5622114539 0.7840003967 -1.0001215935 ) + weight 278 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 279 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 280 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 281 2 1.0000000000 ( 0.7288469076 0.7839505672 -0.9001214504 ) + weight 282 7 1.0000000000 ( 0.6288465261 0.9994875789 -0.4833616316 ) + weight 283 2 1.0000000000 ( 0.6288461685 0.8831658363 0.6745800972 ) + weight 284 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 285 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 286 4 1.0000000000 ( -0.6288465858 1.0005125999 0.4833615720 ) + weight 287 2 1.0000000000 ( -0.6288461685 0.8838381767 -0.6747243404 ) + weight 288 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 289 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 290 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 291 2 1.0000000000 ( -0.5622114539 0.7830038071 0.9998776913 ) + weight 292 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 293 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 294 2 1.0000000000 ( -0.7288469076 0.7830536366 0.8998775482 ) + weight 295 4 1.0000000000 ( 0.4039241970 1.1005123854 -0.4127220213 ) + weight 296 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 297 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 298 4 1.0000000000 ( 0.3278744221 1.0005123615 -0.6127218604 ) + weight 299 4 1.0000000000 ( -0.3278741241 1.0005123615 -0.6127219796 ) + weight 300 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 301 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 302 4 1.0000000000 ( -0.4039240181 1.1005123854 -0.4127222002 ) + weight 303 4 1.0000000000 ( 0.4039240777 1.1005125046 0.1740308702 ) + weight 304 4 1.0000000000 ( 0.3439128101 1.0005125999 0.3740306795 ) + weight 305 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 306 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 307 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 308 7 1.0000000000 ( -0.5039241910 0.9994876981 0.4991172850 ) + weight 309 7 1.0000000000 ( -0.3039242029 1.0994876623 0.5127219558 ) + weight 310 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 311 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 312 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 313 7 1.0000000000 ( -0.3439128399 0.9994875789 -0.3740306497 ) + weight 314 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 315 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 316 7 1.0000000000 ( 0.3439129591 0.9994875789 -0.3740305305 ) + weight 317 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 318 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 319 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 320 7 1.0000000000 ( 0.5039240718 0.9994876981 0.4991174638 ) + weight 321 4 1.0000000000 ( -0.4039241374 1.1005125046 0.1740306914 ) + weight 322 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 323 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 324 5 1.0000000000 ( 0.3039242327 1.6850823164 -0.5127219558 ) + weight 325 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 326 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 327 5 1.0000000000 ( -0.3039239943 1.6850823164 -0.5127220750 ) + weight 328 5 1.0000000000 ( -0.4039240181 1.4850825071 -0.4127222002 ) + weight 329 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 330 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 331 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 332 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 333 5 1.0000000000 ( 0.3039240539 1.6850824356 0.2740307450 ) + weight 334 8 1.0000000000 ( -0.4039241672 1.6706025600 0.4127220511 ) + weight 335 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 336 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 337 8 1.0000000000 ( -0.3039242029 1.4706027508 0.5127219558 ) + weight 338 8 1.0000000000 ( -0.4039240777 1.6706024408 -0.1740308404 ) + weight 339 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 340 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 341 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 342 8 1.0000000000 ( 0.4039241374 1.6706024408 -0.1740307212 ) + weight 343 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 344 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 345 8 1.0000000000 ( 0.3039241433 1.4706026316 -0.2740306258 ) + weight 346 8 1.0000000000 ( 0.4039240479 1.6706025600 0.4127221704 ) + weight 347 8 1.0000000000 ( 0.3039240241 1.4706027508 0.5127220750 ) + weight 348 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 349 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 350 5 1.0000000000 ( -0.3039241731 1.6850824356 0.2740306258 ) + weight 351 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 352 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 353 6 1.0000000000 ( -0.4039240181 1.5055567026 -0.4127222002 ) + weight 354 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 355 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 356 6 1.0000000000 ( 0.4039240777 1.5055568218 0.1740308702 ) + weight 357 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 358 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 359 9 1.0000000000 ( -0.4039241672 1.4094725847 0.4127220511 ) + weight 360 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 361 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 362 9 1.0000000000 ( -0.4039240777 1.4094724655 -0.1740308404 ) + weight 363 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 364 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 365 9 1.0000000000 ( 0.4039241374 1.4094724655 -0.1740307212 ) + weight 366 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 367 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 368 9 1.0000000000 ( 0.4039240479 1.4094725847 0.4127221704 ) + weight 369 6 1.0000000000 ( -0.4039241374 1.5055568218 0.1740306914 ) + weight 370 1 1.0000000000 ( -0.6288462877 -0.0027038516 -0.8406154513 ) + weight 371 1 1.0000000000 ( -0.6288462281 0.7323116660 -1.0002232790 ) + weight 372 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 373 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 374 1 1.0000000000 ( -0.6288466454 -0.0021918355 0.8406166434 ) + weight 375 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 376 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 377 1 1.0000000000 ( -0.5973538756 0.0978566110 0.9999701381 ) + weight 378 1 1.0000000000 ( 0.2920556366 -0.0027219369 -0.8999991417 ) + weight 379 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 380 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 381 1 1.0000000000 ( 0.6288466454 -0.0027038516 -0.8406151533 ) + weight 382 1 1.0000000000 ( 0.6288462281 0.7329207063 0.9997770190 ) + weight 383 1 1.0000000000 ( 0.5973533988 0.0978566110 0.9999704361 ) + weight 384 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 385 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 386 1 1.0000000000 ( -0.2254323065 -0.0027121324 -0.8678063154 ) + weight 387 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 388 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 389 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 390 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 391 1 1.0000000000 ( 0.3483265638 -0.0022331174 0.7050662637 ) + weight 392 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 393 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 394 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 395 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 396 1 1.0000000000 ( 0.1483269334 -0.1026815847 -0.7677757740 ) + weight 397 1 1.0000000000 ( 0.3483269215 -0.0026625700 -0.7050646544 ) + weight 398 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 399 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 400 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 401 1 1.0000000000 ( -0.2483269423 -0.1022443697 0.6678380966 ) + weight 402 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 403 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 404 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 405 1 1.0000000000 ( -0.2254327387 -0.0021835547 0.8678077459 ) + weight 406 1 1.0000000000 ( 0.3483268023 -0.0025123558 -0.2118284255 ) + weight 407 1 1.0000000000 ( 0.1483267993 -0.1025122628 -0.2117980272 ) + weight 408 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 409 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 410 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 411 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 412 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 413 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 414 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 415 1 1.0000000000 ( -0.1483267248 -0.0024819009 -0.1118285581 ) + weight 416 1 1.0000000000 ( -0.1483268142 -0.0024129678 0.1145166904 ) + weight 417 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 418 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 419 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 420 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 421 1 1.0000000000 ( 0.3483266830 -0.0023825131 0.2145168185 ) + weight 422 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 423 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 424 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 425 11 1.0000000000 ( 0.1483266801 1.3368693590 0.2828474939 ) + weight 426 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 427 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 428 11 1.0000000000 ( 0.2483267039 1.5368694067 0.1828474402 ) + weight 429 11 1.0000000000 ( -0.2483268082 1.5368694067 0.1828473210 ) + weight 430 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 431 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 432 11 1.0000000000 ( -0.1483268440 1.3368693590 0.2828474343 ) + weight 433 14 1.0000000000 ( -0.1483269930 1.5362550020 -0.2177159637 ) + weight 434 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 435 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 436 14 1.0000000000 ( -0.2483268976 1.3362549543 -0.1177158356 ) + weight 437 14 1.0000000000 ( 0.1483265162 1.5362550020 -0.2177162319 ) + weight 438 14 1.0000000000 ( 0.2483266145 1.3362549543 -0.1177163124 ) + weight 439 11 1.0000000000 ( 0.2483267933 1.5368694067 -0.1731303036 ) + weight 440 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 441 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 442 11 1.0000000000 ( 0.1483268142 1.3368691206 -0.2731303275 ) + weight 443 11 1.0000000000 ( -0.2483267188 1.5368694067 -0.1731304228 ) + weight 444 11 1.0000000000 ( -0.1483266950 1.3368691206 -0.2731304169 ) + weight 445 14 1.0000000000 ( -0.2483265549 1.5362550020 0.2355751693 ) + weight 446 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 447 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 448 14 1.0000000000 ( -0.1483264714 1.3362549543 0.3355750740 ) + weight 449 14 1.0000000000 ( 0.2483269721 1.5362550020 0.2355746925 ) + weight 450 14 1.0000000000 ( 0.1483270526 1.3362549543 0.3355747759 ) + weight 451 12 1.0000000000 ( 0.1483267546 1.5553369522 0.2828474641 ) + weight 452 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 453 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 454 12 1.0000000000 ( -0.1483267546 1.5553369522 0.2828474641 ) + weight 455 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 456 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 457 15 1.0000000000 ( -0.1483269930 1.5547224283 -0.2177159637 ) + weight 458 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 459 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 460 15 1.0000000000 ( 0.1483265162 1.5547224283 -0.2177162319 ) + weight 461 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 462 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 463 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 464 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 465 12 1.0000000000 ( 0.1483267546 1.5553368330 -0.2731303573 ) + weight 466 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 467 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 468 15 1.0000000000 ( -0.2483265549 1.5547224283 0.2355751693 ) + weight 469 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 470 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 471 15 1.0000000000 ( 0.2483269721 1.5547224283 0.2355746925 ) + weight 472 2 1.0000000000 ( 0.1642774343 0.9833446145 0.3156406283 ) + weight 473 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 474 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 475 2 1.0000000000 ( 0.3642774224 0.8833600283 0.2848545611 ) + weight 476 2 1.0000000000 ( -0.1642777324 0.9833446145 0.3156404793 ) + weight 477 2 1.0000000000 ( -0.3642777205 0.8833600283 0.2848542035 ) + weight 478 2 1.0000000000 ( 0.2642776668 0.9836093783 -0.2156849951 ) + weight 479 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 480 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 481 2 1.0000000000 ( 0.2112980932 0.8837091327 -0.4157347977 ) + weight 482 2 1.0000000000 ( -0.2642774880 0.9836093783 -0.2156852484 ) + weight 483 2 1.0000000000 ( -0.2112977058 0.8837091327 -0.4157350063 ) + weight 484 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 485 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 486 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 487 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 488 3 1.0000000000 ( 0.3642775118 0.2118682861 0.2790425122 ) + weight 489 3 1.0000000000 ( -0.2178866714 0.2118682861 0.4156627953 ) + weight 490 3 1.0000000000 ( -0.2642776370 0.1118683815 0.2156628072 ) + weight 491 3 1.0000000000 ( 0.3642776310 0.2118682861 -0.2790423334 ) + weight 492 3 1.0000000000 ( 0.2178866714 0.2118682861 -0.4156627953 ) + weight 493 3 1.0000000000 ( -0.3642775118 0.2118682861 -0.2790425122 ) + weight 494 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 495 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 496 3 1.0000000000 ( 0.3484135866 0.2118682861 0.2602873147 ) + weight 497 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 498 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 499 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 500 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 501 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 502 3 1.0000000000 ( -0.4484137595 0.3118681908 0.4333587587 ) + weight 503 3 1.0000000000 ( -0.2328547388 0.2118682861 0.4333588183 ) + weight 504 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 505 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 506 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 507 3 1.0000000000 ( 0.3484137356 0.2118682861 -0.2602871358 ) + weight 508 3 1.0000000000 ( 0.3484137952 0.3118681908 -0.5333588123 ) + weight 509 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 510 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 511 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 512 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 513 3 1.0000000000 ( -0.2328544855 0.2118682861 -0.4333589375 ) + weight 514 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 515 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 516 3 1.0000000000 ( 0.4484135807 1.2077021599 0.4333589971 ) + weight 517 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 518 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 519 3 1.0000000000 ( -0.4484137595 1.2077021599 0.4333587587 ) + weight 520 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 521 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 522 3 1.0000000000 ( 0.3484137952 1.2077021599 -0.5333588123 ) + weight 523 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 524 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 525 2 1.0000000000 ( 0.5622105002 0.7830038071 0.9998782277 ) + weight 526 2 1.0000000000 ( -0.5622105002 0.7840003967 -1.0001220703 ) + weight 527 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 528 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 529 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 530 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 531 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 532 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 533 7 1.0000000000 ( 0.3039240241 1.0994876623 0.5127220750 ) + weight 534 4 1.0000000000 ( -0.3439129889 1.0005125999 0.3740305007 ) + weight 535 5 1.0000000000 ( 0.4039241970 1.4850825071 -0.4127220213 ) + weight 536 5 1.0000000000 ( 0.4039240777 1.4850826263 0.1740308702 ) + weight 537 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 538 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 539 5 1.0000000000 ( -0.4039241374 1.4850826263 0.1740306914 ) + weight 540 6 1.0000000000 ( 0.4039241970 1.5055567026 -0.4127220213 ) + weight 541 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 542 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 543 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 544 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 545 1 1.0000000000 ( -0.2920551896 -0.0027219369 -0.8999993205 ) + weight 546 1 1.0000000000 ( -0.6288467050 0.7329211831 0.9997767210 ) + weight 547 1 1.0000000000 ( 0.6288467050 0.7323121428 -1.0002229214 ) + weight 548 1 1.0000000000 ( 0.6288462877 -0.0021918355 0.8406169415 ) + weight 549 1 1.0000000000 ( 0.1483267099 -0.1023824140 0.2145472169 ) + weight 550 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 551 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 552 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 553 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 554 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 555 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 556 12 1.0000000000 ( -0.1483267546 1.5553368330 -0.2731303871 ) + weight 557 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 558 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 559 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 560 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 561 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 562 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 563 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 564 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 565 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 566 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 567 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 568 3 1.0000000000 ( -0.2178864777 0.2118682861 -0.4156629145 ) + weight 569 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 570 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 571 3 1.0000000000 ( -0.3484135568 1.2077021599 -0.5333589315 ) + weight 572 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 573 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 574 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 575 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) +} + diff --git a/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.png b/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.png new file mode 100644 index 0000000..eafd9fa Binary files /dev/null and b/examples/nitro_engine/filesystem_animated_model/assets/robot/robot.png differ diff --git a/examples/nitro_engine/filesystem_animated_model/assets/robot/wave.md5anim b/examples/nitro_engine/filesystem_animated_model/assets/robot/wave.md5anim new file mode 100644 index 0000000..4a1a2f3 --- /dev/null +++ b/examples/nitro_engine/filesystem_animated_model/assets/robot/wave.md5anim @@ -0,0 +1,469 @@ +MD5Version 10 // Parameters used during export: Reorient: False; Scale: 1.0 +commandline "" + +numFrames 21 +numJoints 16 +frameRate 24 +numAnimatedComponents 96 + +hierarchy { + "Base.Bone" -1 63 0 // + "Spine.Low" 0 63 6 // + "Spine.High" 1 63 12 // + "Head" 2 63 18 // + "Chest.Left" 1 63 24 // + "Arm.Upper.Left" 4 63 30 // + "Arm.End.Left" 5 63 36 // + "Chest.Right" 1 63 42 // + "Arm.Upper.Right" 7 63 48 // + "Arm.End..Right" 8 63 54 // + "Pelvis.Left" 0 63 60 // + "Leg-Upper.Left" 10 63 66 // + "Leg-Lower.Left" 11 63 72 // + "Pelvis.Right" 0 63 78 // + "Leg-Upper.Right" 13 63 84 // + "Leg-Lower.Right" 14 63 90 // +} + +bounds { + ( -0.7288464904 -4.2145261765 -0.1051818728 ) ( 0.7288464904 4.2140474319 6.9405498505 ) + ( -0.7302514911 -4.2225360870 -0.1051818728 ) ( 0.7302514911 4.2145175934 6.9405498505 ) + ( -0.7343894839 -4.2448711395 -0.1051818728 ) ( 0.7343894839 4.2158436775 6.9405498505 ) + ( -0.7411305904 -4.2661142349 -0.1051818728 ) ( 0.7411305904 4.2178220749 6.9405498505 ) + ( -0.7503278852 -4.2707734108 -0.1051818728 ) ( 0.7503278852 4.2201490402 6.9405498505 ) + ( -0.7618184090 -4.2458715439 -0.1051818728 ) ( 0.7618184090 4.2224359512 6.9405498505 ) + ( -0.7754249573 -4.1845750809 -0.1051818728 ) ( 0.7754249573 4.2242231369 6.9405498505 ) + ( -0.7909565568 -4.0881261826 -0.1051818728 ) ( 0.7909565568 4.2249913216 6.9405498505 ) + ( -0.8082096577 -3.9748272896 -0.1051818728 ) ( 0.8082096577 4.2241716385 6.9405498505 ) + ( -0.8316085339 -3.8554317951 -0.1051818728 ) ( 0.8716588616 4.2211618423 6.9405498505 ) + ( -0.9071020484 -3.7363846302 -0.1051818728 ) ( 0.9725581408 4.2153348923 6.9405498505 ) + ( -0.9845415950 -3.6244606972 -0.1051818728 ) ( 1.0805976391 4.2060980797 6.9405498505 ) + ( -1.0607581139 -3.5166521072 -0.1051818728 ) ( 1.1924948692 4.1931948662 6.9405498505 ) + ( -1.1330087185 -3.4139099121 -0.1051818728 ) ( 1.3043855429 4.1768159866 7.0152153969 ) + ( -1.1990523338 -3.3173723221 -0.1051818728 ) ( 1.4124979973 4.1575984955 7.1181468964 ) + ( -1.2571754456 -3.2286412716 -0.1051818728 ) ( 1.5131845474 4.1366162300 7.2063169479 ) + ( -1.3061861992 -3.1498517990 -0.1051818728 ) ( 1.6029434204 4.1153287888 7.2786159515 ) + ( -1.3453353643 -3.0836009979 -0.1051818728 ) ( 1.6784145832 4.0954933167 7.3345251083 ) + ( -1.3741520643 -3.0328018665 -0.1051818728 ) ( 1.7363419533 4.0790367126 7.3741292953 ) + ( -1.3921631575 -3.0004279613 -0.1051818728 ) ( 1.7735110521 4.0679025650 7.3978281021 ) + ( -1.3984949589 -2.9891591072 -0.1051818728 ) ( 1.7866519690 4.0638575554 7.4058084488 ) +} + +baseframe { + ( 0.0000000000 0.0000000000 0.0000000000 ) ( -0.7071068287 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( -0.0001522740 -0.0000001192 -0.0000000000 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( 0.0004014244 -0.0000001192 0.0000000001 ) + ( -0.0000000000 1.0282182693 0.0000000000 ) ( -0.0002491503 0.0000001192 -0.0000000001 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( 0.7072144151 0.0000000000 0.0000001686 ) + ( 0.0000000000 1.0038089752 0.0000000000 ) ( -0.0000000000 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 1.6051955223 0.0000000000 ) ( -0.0000000000 -0.0000000000 -0.0000000000 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( -0.7069991827 0.0000000309 -0.0000001377 ) + ( -0.0000000000 1.0172638893 0.0000000000 ) ( -0.0000000000 -0.0000000000 0.0000000000 ) + ( 0.0000000000 1.6867997646 0.0000000000 ) ( -0.0000000000 -0.0000000000 0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( 0.7113879919 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 0.4849954247 0.0000000428 ) ( 0.7027994990 -0.0000000848 0.0000000838 ) + ( 0.0000000000 1.3662177324 0.0000000284 ) ( -0.0000000005 0.0000001192 -0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( -0.7112751007 0.0000003352 0.0000003392 ) + ( 0.0000000000 0.5501293540 -0.0000000224 ) ( -0.7029137611 0.0000000000 0.0000006704 ) + ( 0.0000000000 1.3662178516 0.0000000000 ) ( 0.0000000000 0.0000000000 0.0000000000 ) +} + +frame 0 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522740 -0.0000001192 -0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 -0.0000000001 -0.0002490849 -0.0229121577 -0.0000057087 + 0.0000000000 1.6823664904 0.0000000000 0.7072144151 0.0000000000 0.0000001686 + 0.0000000000 1.0038089752 -0.0000001216 -0.0000000000 -0.0000000000 -0.0000000000 + 0.0000000000 1.6051954031 -0.0000003162 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000000 1.0172638893 0.0000001437 -0.0010274349 -0.0000000000 -0.0000000002 + 0.0000000000 1.6867997646 0.0000000624 -0.0003698472 -0.0000000000 -0.0000000001 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 1 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522740 0.0007809388 -0.0000001190 + -0.0000000000 1.6823664904 -0.0000000002 0.0004014245 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002491252 -0.0141752968 -0.0000035319 + -0.0000000000 1.6823664904 -0.0000000002 0.7072145343 0.0000000000 0.0000001686 + 0.0000000001 1.0038089752 0.0000000474 0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6051954031 0.0000001233 0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 -0.0000000002 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000000 1.0172638893 0.0000001436 0.0012860030 -0.0000000000 -0.0000000000 + 0.0000000002 1.6867997646 0.0000001346 0.0088065108 -0.0000000000 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 2 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522733 0.0030870433 -0.0000004701 + 0.0000000000 1.6823667288 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000000 -0.0002491387 0.0096553192 0.0000024055 + 0.0000000000 1.6823667288 -0.0000000000 0.7072144151 0.0000000000 0.0000001686 + -0.0000000001 1.0038089752 -0.0000001216 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000019 1.6051951647 -0.0000003162 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823667288 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000008 1.0172638893 0.0000001437 0.0080480594 -0.0000000000 -0.0000000002 + -0.0000000006 1.6867998838 -0.0000002356 0.0338387787 -0.0000000000 -0.0000000004 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 3 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522705 0.0068626930 -0.0000010450 + -0.0000000000 1.6823660135 0.0000000000 0.0004014244 -0.0000001183 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002488978 0.0450159870 0.0000112156 + -0.0000000000 1.6823660135 0.0000000000 0.7072145343 0.0000000000 0.0000001686 + 0.0000000007 1.0038088560 0.0000000474 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000007 1.6051954031 0.0000001233 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823660135 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000003 1.0172638893 0.0000001436 0.0189933572 0.0000000000 0.0000000000 + -0.0000000040 1.6868000031 0.0000002628 0.0709822550 0.0000000000 -0.0000000010 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 4 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522630 0.0120524950 -0.0000018353 + 0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282187462 -0.0000000003 -0.0002481799 0.0881715864 0.0000219679 + 0.0000000000 1.6823664904 -0.0000000000 0.7072145343 0.0000000000 0.0000001686 + -0.0000000019 1.0038090944 0.0000005243 -0.0000000000 0.0000000000 -0.0000000014 + -0.0000000027 1.6051955223 0.0000006002 -0.0000000000 0.0000000000 -0.0000000014 + 0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000001 1.0172638893 0.0000001436 0.0338583253 0.0000000000 -0.0000000003 + -0.0000000112 1.6867996454 -0.0000001846 0.1162938699 0.0000000003 -0.0000000018 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 5 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522477 0.0186010450 -0.0000028325 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002468648 0.1351395398 0.0000336699 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 -0.0000000026 0.0000001712 + -0.0000000006 1.0038089752 0.0000005244 -0.0000000000 0.0000000000 0.0000000009 + -0.0000000014 1.6051952839 0.0000006005 -0.0000000000 0.0000000000 0.0000000009 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000289 -0.0000001383 + -0.0000000044 1.0172638893 0.0000001438 0.0523783863 -0.0000000001 0.0000000020 + 0.0000000097 1.6867998838 -0.0000005558 0.1655525118 -0.0000000004 -0.0000000013 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 6 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522208 0.0264527462 -0.0000040281 + -0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001155 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002449981 0.1818055809 0.0000452968 + -0.0000000000 1.6823664904 -0.0000000000 0.7072145343 0.0000000000 0.0000001686 + -0.0000000029 1.0038089752 0.0000005244 -0.0000000000 -0.0000000000 -0.0000000009 + 0.0000000132 1.6051951647 0.0000006005 -0.0000000000 -0.0000000000 -0.0000000009 + -0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000316 -0.0000001410 + -0.0000000029 1.0172637701 -0.0000003331 0.0742842183 -0.0000000001 -0.0000000011 + 0.0000000008 1.6867996454 -0.0000002992 0.2144013792 -0.0000000002 -0.0000000003 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 7 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001521778 0.0355514809 -0.0000054136 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001136 0.0000000001 + 0.0000000000 1.0282182693 0.0000000001 -0.0002428102 0.2241564095 0.0000558485 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 -0.0000000013 0.0000001725 + -0.0000000067 1.0038089752 0.0000000478 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000111 1.6051954031 0.0000001242 -0.0000000000 -0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000296 -0.0000001416 + -0.0000000067 1.0172638893 0.0000001440 0.0992979035 0.0000000001 -0.0000000059 + -0.0000000166 1.6867995262 -0.0000000312 0.2586210966 0.0000000014 0.0000000046 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 8 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001521140 0.0458404459 -0.0000069803 + -0.0000000000 1.6823667288 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000005 -0.0002406830 0.2584845424 0.0000644014 + -0.0000000000 1.6823667288 0.0000000000 0.7072145343 -0.0000000013 0.0000001725 + 0.0000000028 1.0038089752 -0.0000004288 -0.0000000000 0.0000000000 0.0000000056 + 0.0000000128 1.6051952839 -0.0000003520 -0.0000000000 0.0000000000 0.0000000056 + -0.0000000000 1.6823667288 0.0000000000 -0.7069992423 0.0000000296 -0.0000001416 + -0.0000000121 1.0172637701 0.0000006211 0.1271297634 -0.0000000002 -0.0000000003 + -0.0000000402 1.6867995262 -0.0000000871 0.2943651974 -0.0000000016 0.0000000026 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 9 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001520242 0.0572618246 -0.0000087195 + -0.0000000000 1.6823667288 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000003 -0.0002390801 0.2814303637 0.0000701183 + -0.0000000000 1.6823667288 -0.0000000000 0.7072145343 -0.0000000039 0.0000001699 + -0.0000000038 1.0038089752 0.0000005252 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000214 1.6051952839 0.0000006025 -0.0000000000 -0.0000000000 0.0000000000 + -0.0000000000 1.6823667288 -0.0000000000 -0.7069992423 0.0000000257 -0.0000001403 + 0.0000000037 1.0172638893 -0.0000003323 0.1574763954 -0.0000000000 -0.0000000038 + -0.0000000724 1.6868000031 -0.0000001676 0.3181996644 0.0000000032 -0.0000000026 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 10 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001519031 0.0697563663 -0.0000106221 + -0.0000000000 1.6823662519 -0.0000000001 0.0004014244 -0.0000001229 0.0000000001 + 0.0000000000 1.0282182693 0.0000000003 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823662519 -0.0000000001 0.7072144151 0.0000000000 0.0000001686 + 0.0000000032 1.0038089752 -0.0000001203 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000081 1.6051954031 -0.0000003129 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823662519 -0.0000000001 -0.7069991231 0.0000000309 -0.0000001377 + 0.0000000032 1.0172638893 -0.0000001603 0.1900207698 0.0000000002 0.0000000315 + 0.0000000743 1.6867997646 -0.0000004303 0.3268856704 0.0000000064 0.0000000426 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 11 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001517460 0.0832075551 -0.0000126704 + -0.0000000000 1.6823662519 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823662519 -0.0000000000 0.7072144151 0.0000000000 0.0000001686 + 0.0000000166 1.0038089752 -0.0000001198 -0.0000000000 0.0000000000 0.0000000037 + -0.0000000082 1.6051956415 -0.0000003115 -0.0000000000 0.0000000000 0.0000000037 + -0.0000000000 1.6823662519 -0.0000000000 -0.7069991231 0.0000000309 -0.0000001377 + 0.0000000166 1.0172640085 -0.0000001597 0.2244939208 0.0000000004 0.0000000297 + -0.0000000525 1.6867994070 0.0000000428 0.3209972084 0.0000000034 0.0000000502 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 12 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001515526 0.0972274616 -0.0000148053 + -0.0000000000 1.6823662519 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002384582 0.2898047864 0.0000722048 + -0.0000000000 1.6823662519 0.0000000000 0.7072144747 0.0000000000 0.0000001686 + -0.0000000004 1.0038089752 -0.0000004268 -0.0000000000 0.0000000000 -0.0000000149 + 0.0000000198 1.6051956415 -0.0000003468 -0.0000000000 0.0000000000 -0.0000000149 + -0.0000000000 1.6823662519 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000145 1.0172638893 0.0000006231 0.2600955665 -0.0000000006 0.0000000240 + 0.0000000242 1.6867995262 0.0000001453 0.3049138486 0.0000000036 0.0000000586 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 13 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001513271 0.1113469452 -0.0000169553 + 0.0000000000 1.6823667288 0.0000000000 0.0004014244 -0.0000001155 0.0000000001 + -0.0000000001 1.0282182693 0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + 0.0000000000 1.6823667288 0.0000000000 0.7072144151 0.0000000105 0.0000001791 + -0.0000000027 1.0038089752 -0.0000005951 0.0000000000 -0.0000000000 0.0000000000 + 0.0000000023 1.6051954031 -0.0000007843 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823667288 0.0000000000 -0.7069992423 0.0000000415 -0.0000001482 + -0.0000000027 1.0172638893 0.0000006240 0.2956701815 -0.0000000019 0.0000000218 + -0.0000000373 1.6867995262 0.0000001416 0.2809669077 0.0000000075 0.0000000486 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 14 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001510779 0.1250958145 -0.0000190489 + 0.0000000000 1.6823664904 -0.0000000001 0.0004014244 -0.0000001118 0.0000000001 + 0.0000000000 1.0282182693 -0.0000000000 -0.0002384582 0.2898047566 0.0000722048 + 0.0000000000 1.6823664904 -0.0000000001 0.7072144747 0.0000000053 0.0000001686 + -0.0000000045 1.0038089752 0.0000000516 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000303 1.6051952839 0.0000001343 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 -0.0000000001 -0.7069992423 0.0000000282 -0.0000001403 + -0.0000000343 1.0172638893 0.0000006247 0.3300409615 -0.0000000002 0.0000000325 + -0.0000000204 1.6867997646 -0.0000000522 0.2515513599 -0.0000000046 0.0000000450 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 15 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001508170 0.1380039304 -0.0000210145 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 0.0000000003 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 0.0000000000 0.7072144747 0.0000000000 0.0000001686 + -0.0000000200 1.0038089752 0.0000000527 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000743 1.6051955223 0.0000001369 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000200 1.0172640085 0.0000006258 0.3620411456 0.0000000009 0.0000000207 + 0.0000001122 1.6868000031 -0.0000000373 0.2192079574 -0.0000000036 0.0000000402 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 16 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001505604 0.1496035010 -0.0000227808 + 0.0000000000 1.6823662519 0.0000000001 0.0004014245 -0.0000001490 0.0000000001 + -0.0000000000 1.0282177925 0.0000000002 -0.0002384583 0.2898046970 0.0000722048 + 0.0000000000 1.6823662519 0.0000000001 0.7072145343 -0.0000000158 0.0000001739 + 0.0000000257 1.0038089752 0.0000000534 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000214 1.6051954031 0.0000001389 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823662519 0.0000000001 -0.7069992423 0.0000000257 -0.0000001219 + 0.0000000257 1.0172638893 0.0000001497 0.3905433416 -0.0000000016 0.0000000269 + -0.0000001459 1.6868002415 -0.0000002533 0.1866219640 0.0000000142 0.0000000415 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 17 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001503263 0.1594295800 -0.0000242770 + 0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000003 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 -0.0000000000 0.7072144747 -0.0000000053 0.0000001739 + 0.0000000436 1.0038089752 0.0000000544 -0.0000000000 -0.0000000000 0.0000000075 + -0.0000000206 1.6051952839 0.0000001415 -0.0000000000 -0.0000000000 0.0000000075 + 0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000160 1.0172638893 0.0000001507 0.4144768417 -0.0000000065 0.0000000225 + 0.0000000429 1.6867992878 -0.0000002980 0.1565571874 -0.0000000064 0.0000000583 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 18 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001501351 0.1670198888 -0.0000254328 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001267 0.0000000001 + -0.0000000000 1.0282182693 -0.0000000002 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 0.0000000000 0.7072145343 0.0000000000 0.0000001686 + 0.0000000047 1.0038089752 0.0000000550 -0.0000000000 -0.0000000000 0.0000000075 + -0.0000000202 1.6051952839 0.0000001431 -0.0000000000 0.0000000000 0.0000000075 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000048 1.0172638893 -0.0000003255 0.4328215122 -0.0000000056 0.0000000314 + -0.0000000536 1.6868004799 -0.0000000745 0.1317730397 -0.0000000069 0.0000000533 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 19 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001500070 0.1719134748 -0.0000261780 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 0.0000000000 0.0000001686 + -0.0000000009 1.0038089752 0.0000000554 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000556 1.6051956415 0.0000001441 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000009 1.0172638893 0.0000001517 0.4445825219 -0.0000000033 0.0000000193 + -0.0000000521 1.6868000031 -0.0000003427 0.1149683520 -0.0000000006 0.0000000476 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 20 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001499606 0.1736480743 -0.0000264421 + 0.0000000000 1.6823662519 0.0000000001 0.0004014244 -0.0000001267 0.0000000001 + -0.0000000001 1.0282177925 0.0000000002 -0.0002384583 0.2898046970 0.0000722048 + 0.0000000000 1.6823662519 0.0000000001 0.7072145343 0.0000000000 0.0000001686 + -0.0000000031 1.0038089752 0.0000000557 -0.0000000000 0.0000000000 -0.0000000075 + 0.0000000017 1.6051952839 0.0000001449 -0.0000000000 0.0000000000 -0.0000000075 + 0.0000000000 1.6823662519 0.0000000001 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000267 1.0172640085 0.0000001520 0.4487406611 -0.0000000018 0.0000000778 + -0.0000000491 1.6867994070 -0.0000004619 0.1087833345 -0.0000000035 0.0000000230 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + diff --git a/examples/nitro_engine/filesystem_animated_model/build.py b/examples/nitro_engine/filesystem_animated_model/build.py new file mode 100644 index 0000000..72549a3 --- /dev/null +++ b/examples/nitro_engine/filesystem_animated_model/build.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_grit(['assets/robot']) +nitrofs.add_nitro_engine_md5(['assets/robot']) +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['NE', 'nds9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nitro-engine'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NE: FS: Animated model', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nitro_engine/filesystem_animated_model/source/main.c b/examples/nitro_engine/filesystem_animated_model/source/main.c new file mode 100644 index 0000000..b84232e --- /dev/null +++ b/examples/nitro_engine/filesystem_animated_model/source/main.c @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2008-2011, 2019, 2022 +// +// This file is part of Nitro Engine + +#include +#include +#include + +NE_Camera *Camera; +NE_Model *Model; +NE_Animation *Animation; +NE_Material *Material; + +void Draw3DScene(void) +{ + NE_CameraUse(Camera); + + NE_PolyFormat(31, 0, NE_LIGHT_0, NE_CULL_NONE, 0); + NE_ModelDraw(Model); +} + +__attribute__((noreturn)) void WaitLoop(void) +{ + printf("Press START to exit"); + while (1) + { + swiWaitForVBlank(); + scanKeys(); + if (keysHeld() & KEY_START) + exit(0); + } +} + +int main(void) +{ + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + NE_Init3D(); + // libnds uses VRAM_C for the text console, reserve A and B only + NE_TextureSystemReset(0, 0, NE_VRAM_AB); + // Init console in non-3D screen + consoleDemoInit(); + + if (!nitroFSInit(NULL)) + { + printf("nitroFSInit failed.\n"); + WaitLoop(); + } + + // Allocate space for objects... + Model = NE_ModelCreate(NE_Animated); + Camera = NE_CameraCreate(); + Material = NE_MaterialCreate(); + Animation = NE_AnimationCreate(); + + // Setup camera + NE_CameraSet(Camera, + 6, 3, -4, + 0, 3, 0, + 0, 1, 0); + + if (NE_ModelLoadDSMFAT(Model, "models/robot.dsm") == 0) + { + printf("Couldn't load model..."); + WaitLoop(); + } + + if (NE_AnimationLoadFAT(Animation, "models/robot_wave.dsa") == 0) + { + printf("Couldn't load animation..."); + WaitLoop(); + } + + if (NE_MaterialTexLoadGRF(Material, NULL, NE_TEXGEN_TEXCOORD, + "grit/robot_png.grf") == 0) + { + printf("Failed to load GRF\n"); + WaitLoop(); + } + + // Assign material to the model + NE_ModelSetMaterial(Model, Material); + + NE_ModelSetAnimation(Model, Animation); + NE_ModelAnimStart(Model, NE_ANIM_LOOP, floattof32(0.1)); + + NE_LightSet(0, NE_White, 0, -1, -1); + + NE_ClearColorSet(NE_Black, 31, 63); + + printf("\x1b[0;0HPad: Rotate\nSTART: Exit"); + + while (1) + { + NE_WaitForVBL(NE_UPDATE_ANIMATIONS); + + scanKeys(); + uint32_t keys = keysHeld(); + + if (keys & KEY_START) + break; + + if (keys & KEY_RIGHT) + NE_ModelRotate(Model, 0, 2, 0); + if (keys & KEY_LEFT) + NE_ModelRotate(Model, 0, -2, 0); + if (keys & KEY_UP) + NE_ModelRotate(Model, 0, 0, 2); + if (keys & KEY_DOWN) + NE_ModelRotate(Model, 0, 0, -2); + + // Draw scene... + NE_Process(Draw3DScene); + } + + return 0; +} diff --git a/examples/nitro_engine/filesystem_compressed_texture/.gitignore b/examples/nitro_engine/filesystem_compressed_texture/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nitro_engine/filesystem_compressed_texture/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nitro_engine/filesystem_compressed_texture/architectds b/examples/nitro_engine/filesystem_compressed_texture/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/filesystem_compressed_texture/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/filesystem_compressed_texture/assets/data/grill.png b/examples/nitro_engine/filesystem_compressed_texture/assets/data/grill.png new file mode 100644 index 0000000..23eebba Binary files /dev/null and b/examples/nitro_engine/filesystem_compressed_texture/assets/data/grill.png differ diff --git a/examples/nitro_engine/filesystem_compressed_texture/assets/data/grill.rst b/examples/nitro_engine/filesystem_compressed_texture/assets/data/grill.rst new file mode 100644 index 0000000..ea955d0 --- /dev/null +++ b/examples/nitro_engine/filesystem_compressed_texture/assets/data/grill.rst @@ -0,0 +1,24 @@ +Information about the test photo +================================ + +Unmodified image: T_Grate03_d.tga + +https://opengameart.org/content/free-materials-pack-74 + +License +------- + +Copyright (c) 2023 Yughues (https://opengameart.org/users/yughues) + +CC-BY-4.0 + +Creative Commons Attribution 4.0 International + +https://creativecommons.org/licenses/by/4.0/legalcode + +CC-BY-3.0 + +Creative Commons Attribution 3.0 Unported + +https://creativecommons.org/licenses/by/3.0/legalcode + diff --git a/examples/nitro_engine/filesystem_compressed_texture/assets/filesystem/landscape.jpg b/examples/nitro_engine/filesystem_compressed_texture/assets/filesystem/landscape.jpg new file mode 100755 index 0000000..968629d Binary files /dev/null and b/examples/nitro_engine/filesystem_compressed_texture/assets/filesystem/landscape.jpg differ diff --git a/examples/nitro_engine/filesystem_compressed_texture/assets/filesystem/landscape.rst b/examples/nitro_engine/filesystem_compressed_texture/assets/filesystem/landscape.rst new file mode 100644 index 0000000..2967be5 --- /dev/null +++ b/examples/nitro_engine/filesystem_compressed_texture/assets/filesystem/landscape.rst @@ -0,0 +1,18 @@ +Information about the test photo +================================ + +Location: Rovinj, Croatia + +Date: June 2023 + +License +------- + +Copyright (c) 2023 Antonio Niño Díaz + +CC-BY-NC-SA-4.0 + +Creative Commons Attribution Non Commercial Share Alike 4.0 International + +https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode + diff --git a/examples/nitro_engine/filesystem_compressed_texture/build.py b/examples/nitro_engine/filesystem_compressed_texture/build.py new file mode 100644 index 0000000..478ac32 --- /dev/null +++ b/examples/nitro_engine/filesystem_compressed_texture/build.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_ptexconv_tex4x4(['assets/filesystem']) +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['NE', 'nds9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nitro-engine'] +) +arm9.add_ptexconv_tex4x4(['assets/data']) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NE: FS: Compressed texture', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nitro_engine/filesystem_compressed_texture/source/main.c b/examples/nitro_engine/filesystem_compressed_texture/source/main.c new file mode 100644 index 0000000..0b05ed9 --- /dev/null +++ b/examples/nitro_engine/filesystem_compressed_texture/source/main.c @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 +// +// This file is part of Nitro Engine + +#include +#include +#include + +#include "ptexconv/grill_png_idx_bin.h" +#include "ptexconv/grill_png_pal_bin.h" +#include "ptexconv/grill_png_tex_bin.h" + +NE_Material *Material1, *Material2; +NE_Palette *Palette1, *Palette2; + +void Draw3DScene1(void) +{ + NE_ClearColorSet(RGB15(5, 5, 10), 31, 63); + + NE_2DViewInit(); + + NE_2DDrawTexturedQuad(32, 32, + 32 + 128, 32 + 128, + 0, Material1); +} + +void Draw3DScene2(void) +{ + NE_ClearColorSet(RGB15(10, 5, 0), 31, 63); + + NE_2DViewInit(); + + NE_2DDrawTexturedQuad(64, 0, + 64 + 128, 0 + 128, + 0, Material2); +} + +int main(void) +{ + // Init console in non-3D screen + consoleDemoInit(); + + if (!nitroFSInit(NULL)) + { + printf("nitroFSInit failed.\nPress START to exit"); + while(1) + { + swiWaitForVBlank(); + scanKeys(); + if (keysHeld() & KEY_START) + return 0; + } + } + + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + NE_InitDual3D(); + + // Allocate objects + Material1 = NE_MaterialCreate(); + Material2 = NE_MaterialCreate(); + Palette1 = NE_PaletteCreate(); + Palette2 = NE_PaletteCreate(); + + NE_MaterialTex4x4Load(Material1, 128, 128, NE_TEXGEN_TEXCOORD, + grill_png_tex_bin, grill_png_idx_bin); + NE_PaletteLoad(Palette1, grill_png_pal_bin, grill_png_pal_bin_size / 2, + NE_TEX4X4); + NE_MaterialSetPalette(Material1, Palette1); + + + NE_MaterialTex4x4LoadFAT(Material2, 128, 128, NE_TEXGEN_TEXCOORD, + "ptexconv/landscape_jpg_tex.bin", + "ptexconv/landscape_jpg_idx.bin"); + NE_PaletteLoadFAT(Palette2, "ptexconv/landscape_jpg_pal.bin", NE_TEX4X4); + NE_MaterialSetPalette(Material2, Palette2); + + while (1) + { + NE_WaitForVBL(0); + + NE_ProcessDual(Draw3DScene1, Draw3DScene2); + } + + return 0; +} diff --git a/examples/nitro_engine/filesystem_paletted_texture/.gitignore b/examples/nitro_engine/filesystem_paletted_texture/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nitro_engine/filesystem_paletted_texture/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nitro_engine/filesystem_paletted_texture/architectds b/examples/nitro_engine/filesystem_paletted_texture/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/filesystem_paletted_texture/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/filesystem_paletted_texture/assets/a3pal32.grit b/examples/nitro_engine/filesystem_paletted_texture/assets/a3pal32.grit new file mode 100644 index 0000000..7720785 --- /dev/null +++ b/examples/nitro_engine/filesystem_paletted_texture/assets/a3pal32.grit @@ -0,0 +1,2 @@ +# 3 bits of alpha, 5 bits of color index +-gx -gb -gBa3i5 diff --git a/examples/nitro_engine/filesystem_paletted_texture/assets/a3pal32.png b/examples/nitro_engine/filesystem_paletted_texture/assets/a3pal32.png new file mode 100644 index 0000000..1c77c50 Binary files /dev/null and b/examples/nitro_engine/filesystem_paletted_texture/assets/a3pal32.png differ diff --git a/examples/nitro_engine/filesystem_paletted_texture/assets/a5pal8.grit b/examples/nitro_engine/filesystem_paletted_texture/assets/a5pal8.grit new file mode 100644 index 0000000..89cffd5 --- /dev/null +++ b/examples/nitro_engine/filesystem_paletted_texture/assets/a5pal8.grit @@ -0,0 +1,2 @@ +# 5 bits of alpha, 3 bits of color index +-gx -gb -gBa5i3 diff --git a/examples/nitro_engine/filesystem_paletted_texture/assets/a5pal8.png b/examples/nitro_engine/filesystem_paletted_texture/assets/a5pal8.png new file mode 100644 index 0000000..bd552af Binary files /dev/null and b/examples/nitro_engine/filesystem_paletted_texture/assets/a5pal8.png differ diff --git a/examples/nitro_engine/filesystem_paletted_texture/build.py b/examples/nitro_engine/filesystem_paletted_texture/build.py new file mode 100644 index 0000000..b21feeb --- /dev/null +++ b/examples/nitro_engine/filesystem_paletted_texture/build.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_grit(['assets']) +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['NE', 'nds9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nitro-engine'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NE: FS: Paletted texture', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nitro_engine/filesystem_paletted_texture/source/main.c b/examples/nitro_engine/filesystem_paletted_texture/source/main.c new file mode 100644 index 0000000..fa54d4c --- /dev/null +++ b/examples/nitro_engine/filesystem_paletted_texture/source/main.c @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2024 +// +// This file is part of Nitro Engine + +#include +#include + +NE_Material *Material1, *Material2; +NE_Palette *Palette1, *Palette2; + +void Draw3DScene(void) +{ + NE_2DViewInit(); + + NE_2DDrawTexturedQuad(0, 0, + 256, 192, + 0, Material1); +} + +void Draw3DScene2(void) +{ + NE_2DViewInit(); + + NE_2DDrawTexturedQuad(64, 32, + 64 + 128, 32 + 128, + 0, Material2); +} + +__attribute__((noreturn)) void WaitLoop(void) +{ + printf("Press START to exit"); + while (1) + { + swiWaitForVBlank(); + scanKeys(); + if (keysHeld() & KEY_START) + exit(0); + } +} + +int main(void) +{ + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + // Init 3D mode + NE_InitDual3D(); + NE_InitConsole(); + + if (!nitroFSInit(NULL)) + { + printf("nitroFSInit failed.\n"); + WaitLoop(); + } + + // Allocate objects + Material1 = NE_MaterialCreate(); + Material2 = NE_MaterialCreate(); + Palette1 = NE_PaletteCreate(); + Palette2 = NE_PaletteCreate(); + + int ret; + + ret = NE_MaterialTexLoadGRF(Material1, Palette1, NE_TEXGEN_TEXCOORD, + "grit/a3pal32_png.grf"); + if (ret == 0) + { + printf("Failed to load GRF 1\n"); + WaitLoop(); + } + + ret = NE_MaterialTexLoadGRF(Material2, Palette2, NE_TEXGEN_TEXCOORD, + "grit/a5pal8_png.grf"); + if (ret == 0) + { + printf("Failed to load GRF 2\n"); + WaitLoop(); + } + + while (1) + { + NE_WaitForVBL(0); + + NE_ProcessDual(Draw3DScene, Draw3DScene2); + } + + return 0; +} diff --git a/examples/nitro_engine/filesystem_simple_model/.gitignore b/examples/nitro_engine/filesystem_simple_model/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nitro_engine/filesystem_simple_model/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nitro_engine/filesystem_simple_model/architectds b/examples/nitro_engine/filesystem_simple_model/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/filesystem_simple_model/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/filesystem_simple_model/build.py b/examples/nitro_engine/filesystem_simple_model/build.py new file mode 100644 index 0000000..3ce0442 --- /dev/null +++ b/examples/nitro_engine/filesystem_simple_model/build.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_grit(['nitrofs/graphics']) +nitrofs.add_nitro_engine_obj(['nitrofs/models']) +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['NE', 'nds9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nitro-engine'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NE: FS: Simple model', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nitro_engine/filesystem_simple_model/nitrofs/graphics/teapot.grit b/examples/nitro_engine/filesystem_simple_model/nitrofs/graphics/teapot.grit new file mode 100644 index 0000000..207c056 --- /dev/null +++ b/examples/nitro_engine/filesystem_simple_model/nitrofs/graphics/teapot.grit @@ -0,0 +1,2 @@ +# 16 bit texture bitmap, force alpha bit to 1 +-gx -gb -gB16 -gT! diff --git a/examples/nitro_engine/filesystem_simple_model/nitrofs/graphics/teapot.png b/examples/nitro_engine/filesystem_simple_model/nitrofs/graphics/teapot.png new file mode 100644 index 0000000..eafd9fa Binary files /dev/null and b/examples/nitro_engine/filesystem_simple_model/nitrofs/graphics/teapot.png differ diff --git a/examples/nitro_engine/filesystem_simple_model/nitrofs/models/robot.json b/examples/nitro_engine/filesystem_simple_model/nitrofs/models/robot.json new file mode 100644 index 0000000..0dc688d --- /dev/null +++ b/examples/nitro_engine/filesystem_simple_model/nitrofs/models/robot.json @@ -0,0 +1,3 @@ +{ + "texture": [ 256, 256] +} diff --git a/examples/nitro_engine/filesystem_simple_model/nitrofs/models/robot.obj b/examples/nitro_engine/filesystem_simple_model/nitrofs/models/robot.obj new file mode 100644 index 0000000..925bffc --- /dev/null +++ b/examples/nitro_engine/filesystem_simple_model/nitrofs/models/robot.obj @@ -0,0 +1,1570 @@ +# Blender 3.3.1 +# www.blender.org +mtllib robot.mtl +o Cube +v -0.403924 4.878660 1.000001 +v -0.403924 4.875432 2.588939 +v 0.628846 5.087992 -0.999999 +v 0.562211 5.388132 -0.999999 +v 0.540095 5.488132 -0.899999 +v 0.628846 5.488132 -0.674651 +v 0.728846 5.388132 -0.899999 +v 0.628846 5.087991 1.000001 +v 0.728846 5.388132 0.900001 +v 0.628846 5.488132 0.674653 +v 0.540095 5.488132 0.900001 +v 0.562211 5.388132 1.000001 +v -0.628846 5.087992 -0.999999 +v -0.728846 5.388132 -0.899999 +v -0.628846 5.488132 -0.674651 +v -0.540095 5.488132 -0.899999 +v -0.562211 5.388132 -0.999999 +v -0.628846 5.087991 1.000001 +v -0.562211 5.388132 1.000001 +v -0.540095 5.488132 0.900001 +v -0.628846 5.488132 0.674653 +v -0.728846 5.388132 0.900001 +v 0.303924 4.091908 -1.099999 +v 0.403924 4.191908 -1.099999 +v 0.503924 4.105513 -0.999999 +v 0.327874 3.991908 -0.999999 +v -0.303924 4.091908 -1.099999 +v -0.327874 3.991908 -0.999999 +v -0.503924 4.105513 -0.999999 +v -0.403924 4.191908 -1.099999 +v 0.403924 4.778661 -1.099999 +v 0.303924 4.878661 -1.099999 +v 0.343913 4.978661 -0.999999 +v 0.503924 4.853670 -0.999999 +v -0.403924 4.191907 1.100001 +v -0.503924 4.105512 1.000000 +v -0.327874 3.991908 1.000000 +v -0.303924 4.091908 1.100001 +v -0.403924 4.878660 1.050001 +v -0.343913 4.978660 1.000001 +v -0.503924 4.853669 1.000001 +v 0.403924 4.778660 1.100001 +v 0.503924 4.853669 1.000001 +v 0.343913 4.978660 1.000001 +v 0.303924 4.878660 1.100001 +v 0.403924 4.191907 1.100001 +v 0.303924 4.091908 1.100001 +v 0.327874 3.991908 1.000000 +v 0.503924 4.105512 1.000000 +v -0.403924 4.778661 -1.099999 +v -0.503924 4.853670 -0.999999 +v -0.343913 4.978661 -0.999999 +v -0.303924 4.878661 -1.099999 +v 0.303924 4.091908 -2.688378 +v 0.403924 4.191908 -2.688378 +v 0.403924 4.191908 -2.488379 +v 0.303924 4.091908 -2.488379 +v -0.303924 4.091908 -2.688378 +v -0.303924 4.091908 -2.488379 +v -0.403924 4.191908 -2.488379 +v -0.403924 4.191908 -2.688378 +v 0.403924 4.778661 -2.688378 +v 0.303924 4.878661 -2.688378 +v 0.303924 4.878661 -2.488379 +v 0.403924 4.778661 -2.488379 +v -0.403924 4.188475 2.687528 +v -0.403924 4.188886 2.487528 +v -0.303924 4.088886 2.487323 +v -0.303924 4.088475 2.687322 +v -0.403924 4.775227 2.688734 +v -0.303924 4.875226 2.688939 +v -0.403924 4.875535 2.538940 +v 0.403924 4.775227 2.688734 +v 0.403924 4.775638 2.488734 +v 0.303924 4.875638 2.488940 +v 0.303924 4.875226 2.688939 +v 0.403924 4.188475 2.687528 +v 0.303924 4.088475 2.687322 +v 0.303924 4.088886 2.487323 +v 0.403924 4.188886 2.487528 +v -0.403924 4.778661 -2.688378 +v -0.403924 4.778661 -2.488379 +v -0.303924 4.878661 -2.488379 +v -0.303924 4.878661 -2.688378 +v 0.303924 4.091908 -4.114048 +v 0.303924 4.191908 -4.214047 +v 0.403924 4.191908 -4.114048 +v -0.303924 4.091908 -4.114048 +v -0.403924 4.191908 -4.114048 +v -0.303924 4.191908 -4.214047 +v 0.403924 4.778661 -4.114048 +v 0.303924 4.778661 -4.214047 +v 0.303924 4.878661 -4.114048 +v -0.403924 4.184503 4.112886 +v -0.303924 4.084503 4.112607 +v -0.303924 4.184223 4.212886 +v -0.403924 4.771254 4.114527 +v -0.303924 4.770974 4.214526 +v -0.303924 4.871253 4.114806 +v 0.403924 4.771254 4.114527 +v 0.303924 4.871253 4.114806 +v 0.303924 4.770974 4.214526 +v 0.403924 4.184503 4.112886 +v 0.303924 4.184223 4.212886 +v 0.303924 4.084503 4.112607 +v -0.403924 4.778661 -4.114048 +v -0.303924 4.878661 -4.114048 +v -0.303924 4.778661 -4.214047 +v -0.628846 2.919816 -0.840616 +v -0.728846 3.019816 -0.900000 +v -0.628846 3.654880 -1.000000 +v -0.597354 3.019816 -1.000000 +v -0.292055 2.919816 -0.900000 +v -0.628846 2.919816 0.840616 +v -0.292055 2.919815 0.900000 +v -0.597354 3.019815 1.000000 +v -0.628846 3.654880 1.000000 +v -0.728846 3.019815 0.900000 +v 0.292055 2.919816 -0.900000 +v 0.597354 3.019816 -1.000000 +v 0.628846 3.654880 -1.000000 +v 0.728846 3.019816 -0.900000 +v 0.628846 2.919816 -0.840616 +v 0.628846 3.654879 1.000000 +v 0.597354 3.019815 1.000000 +v 0.292055 2.919815 0.900000 +v 0.628846 2.919816 0.840616 +v 0.728846 3.019815 0.900000 +v -0.348327 2.919816 -0.705065 +v -0.225433 2.919816 -0.867807 +v -0.148327 2.819816 -0.767807 +v -0.248327 2.819816 -0.667807 +v 0.348327 2.919816 0.705066 +v 0.225433 2.919816 0.867807 +v 0.148327 2.819816 0.767807 +v 0.248327 2.819816 0.667807 +v 0.148327 2.819816 -0.767807 +v 0.225433 2.919816 -0.867807 +v 0.348327 2.919816 -0.705065 +v 0.248327 2.819816 -0.667807 +v -0.348327 2.919816 0.705066 +v -0.248327 2.819816 0.667807 +v -0.148327 2.819816 0.767807 +v -0.225433 2.919816 0.867807 +v 0.348327 2.919816 -0.211829 +v 0.148327 2.919816 -0.111829 +v 0.148327 2.819816 -0.211829 +v 0.248327 2.819816 -0.311829 +v -0.348327 2.919816 -0.211829 +v -0.248327 2.819816 -0.311829 +v -0.148327 2.819816 -0.211829 +v -0.148327 2.919816 -0.111829 +v -0.348327 2.919816 0.214516 +v -0.148327 2.919816 0.114516 +v -0.148327 2.819816 0.214516 +v -0.248327 2.819816 0.314516 +v 0.348327 2.919816 0.214516 +v 0.248327 2.819816 0.314516 +v 0.148327 2.819816 0.214516 +v 0.148327 2.919816 0.114516 +v 0.148327 1.379503 -0.767807 +v 0.148327 1.579504 -0.767807 +v 0.248327 1.579504 -0.667807 +v 0.248327 1.379503 -0.667807 +v -0.148327 1.379503 -0.767807 +v -0.248327 1.379503 -0.667807 +v -0.248327 1.579504 -0.667807 +v -0.148327 1.579504 -0.767807 +v -0.148327 1.379503 0.767807 +v -0.148327 1.579503 0.767807 +v -0.248327 1.579503 0.667807 +v -0.248327 1.379503 0.667807 +v 0.148327 1.379503 0.767807 +v 0.248327 1.379503 0.667807 +v 0.248327 1.579503 0.667807 +v 0.148327 1.579503 0.767807 +v 0.248327 1.379503 -0.311829 +v 0.248327 1.579504 -0.311829 +v 0.148327 1.579504 -0.211829 +v 0.148327 1.379503 -0.211829 +v -0.248327 1.379503 -0.311829 +v -0.148327 1.379503 -0.211829 +v -0.148327 1.579504 -0.211829 +v -0.248327 1.579504 -0.311829 +v -0.248327 1.379503 0.314516 +v -0.248327 1.579503 0.314516 +v -0.148327 1.579503 0.214516 +v -0.148327 1.379503 0.214516 +v 0.248327 1.379503 0.314516 +v 0.148327 1.379503 0.214516 +v 0.148327 1.579503 0.214516 +v 0.248327 1.579503 0.314516 +v 0.148327 -0.005182 -0.767807 +v 0.248327 -0.005182 -0.667807 +v 0.148327 -0.105182 -0.667807 +v -0.148327 -0.005182 -0.767807 +v -0.148327 -0.105182 -0.667807 +v -0.248327 -0.005182 -0.667807 +v -0.148327 -0.005182 0.767807 +v -0.248327 -0.005182 0.667807 +v -0.148327 -0.105182 0.667807 +v 0.148327 -0.005182 0.767807 +v 0.148327 -0.105182 0.667807 +v 0.248327 -0.005182 0.667807 +v 0.248327 -0.005182 -0.311829 +v 0.148327 -0.005182 -0.211829 +v 0.148327 -0.105182 -0.311829 +v -0.248327 -0.005182 -0.311829 +v -0.148327 -0.105182 -0.311829 +v -0.148327 -0.005182 -0.211829 +v -0.248327 -0.005182 0.314516 +v -0.148327 -0.005182 0.214516 +v -0.148327 -0.105182 0.314516 +v 0.248327 -0.005182 0.314516 +v 0.148327 -0.105182 0.314516 +v 0.148327 -0.005182 0.214516 +v 0.164278 5.588131 0.315664 +v 0.211298 5.488132 0.415664 +v 0.364278 5.488132 0.284927 +v 0.264278 5.588131 0.215664 +v -0.164278 5.588131 0.315664 +v -0.264278 5.588131 0.215664 +v -0.364278 5.488132 0.284927 +v -0.211298 5.488132 0.415664 +v 0.264278 5.588131 -0.215662 +v 0.364278 5.488132 -0.284926 +v 0.211298 5.488132 -0.415662 +v 0.164278 5.588131 -0.315662 +v -0.264278 5.588131 -0.215662 +v -0.164278 5.588131 -0.315662 +v -0.211298 5.488132 -0.415662 +v -0.364278 5.488132 -0.284926 +v 0.236700 5.844716 0.405245 +v 0.178566 5.744716 0.307806 +v 0.273880 5.744716 0.203330 +v 0.376679 5.844716 0.262062 +v -0.198615 5.844716 0.425209 +v -0.351111 5.844716 0.295439 +v -0.254120 5.744716 0.227544 +v -0.149644 5.744716 0.322858 +v 0.351111 5.844716 -0.295437 +v 0.254120 5.744716 -0.227543 +v 0.149644 5.744716 -0.322857 +v 0.198615 5.844716 -0.425208 +v -0.376679 5.844716 -0.262060 +v -0.236700 5.844716 -0.405244 +v -0.178566 5.744716 -0.307805 +v -0.273880 5.744716 -0.203328 +v 0.372482 5.944716 0.516838 +v 0.252463 5.844716 0.422237 +v 0.359972 5.844716 0.244053 +v 0.467796 5.944716 0.412362 +v -0.323613 5.944716 0.548761 +v -0.428090 5.944716 0.453448 +v -0.336123 5.844716 0.275976 +v -0.212757 5.844716 0.443572 +v 0.428090 5.944716 -0.453446 +v 0.336123 5.844716 -0.275975 +v 0.212757 5.844716 -0.443571 +v 0.323613 5.944716 -0.548760 +v -0.467796 5.944716 -0.412360 +v -0.372482 5.944716 -0.516836 +v -0.252463 5.844716 -0.422235 +v -0.359972 5.844716 -0.244051 +v 0.372482 6.840550 0.516838 +v 0.467796 6.840550 0.412362 +v 0.367901 6.940550 0.416943 +v -0.323613 6.840550 0.548761 +v -0.328195 6.940550 0.448867 +v -0.428090 6.840550 0.453448 +v 0.428090 6.840550 -0.453446 +v 0.323613 6.840550 -0.548760 +v 0.328195 6.940550 -0.448865 +v -0.467796 6.840550 -0.412360 +v -0.367901 6.940550 -0.416941 +v -0.372482 6.840550 -0.516836 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 1.0000 0.0022 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 0.0028 +vn -0.0000 -1.0000 -0.0022 +vn -0.0000 -0.0028 1.0000 +vn -0.0000 -1.0000 -0.0028 +vn -0.0000 -0.0459 0.9989 +vn -0.9981 -0.0612 -0.0000 +vn -0.0000 -0.0459 -0.9989 +vn 0.9981 -0.0612 -0.0000 +vn 0.0001 1.0000 -0.0000 +vn 0.0458 -0.0000 0.9990 +vn -0.0001 1.0000 -0.0000 +vn -0.9990 -0.0000 0.0458 +vn -0.0458 -0.0000 -0.9990 +vn 0.9990 -0.0000 -0.0458 +vn 0.1947 0.9257 -0.3244 +vn 0.3691 0.6967 0.6151 +vn -0.3691 0.6967 -0.6151 +vn -0.1947 0.9257 0.3244 +vn 0.3892 -0.6031 -0.6963 +vn -0.4274 -0.4274 -0.7967 +vn 0.4444 0.4444 -0.7778 +vn -0.4274 -0.4274 0.7967 +vn -0.4720 0.6042 0.6420 +vn 0.4444 0.4444 0.7778 +vn 0.4274 -0.4274 0.7967 +vn -0.4444 0.4444 -0.7778 +vn 0.7071 -0.7071 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn -0.7071 -0.7071 -0.0015 +vn -0.6396 0.6387 0.4277 +vn 0.7071 0.7071 0.0015 +vn 0.7071 -0.7071 -0.0015 +vn -0.7071 0.7071 -0.0000 +vn 0.5774 -0.5773 -0.5774 +vn -0.5774 -0.5773 -0.5774 +vn 0.5774 0.5773 -0.5774 +vn -0.5774 -0.5790 0.5757 +vn -0.5773 0.5757 0.5790 +vn 0.5773 0.5757 0.5790 +vn 0.5774 -0.5790 0.5757 +vn -0.5774 0.5773 -0.5774 +vn -0.2141 -0.9353 -0.2816 +vn -0.2141 -0.9353 0.2816 +vn 0.4117 -0.7331 -0.5413 +vn 0.4117 -0.7331 0.5413 +vn -0.5580 -0.7149 -0.4213 +vn 0.5580 -0.7149 0.4213 +vn 0.4412 -0.7814 -0.4412 +vn -0.5580 -0.7149 0.4213 +vn 0.4082 -0.8165 0.4082 +vn -0.3333 -0.6667 0.6667 +vn -0.4082 -0.8165 -0.4082 +vn 0.3333 -0.6667 -0.6667 +vn 0.7071 -0.0000 -0.7071 +vn -0.7071 -0.0000 -0.7071 +vn -0.7071 -0.0000 0.7071 +vn 0.7071 -0.0000 0.7071 +vn -0.5774 -0.5774 -0.5774 +vn -0.5774 -0.5774 0.5773 +vn 0.5774 -0.5773 0.5774 +vn 0.5774 -0.5774 0.5774 +vn -0.5774 -0.5774 0.5774 +vn 0.5774 -0.5774 -0.5774 +vn 0.4534 0.7674 0.4534 +vn -0.4446 0.7292 0.5202 +vn 0.4534 0.7674 -0.4534 +vn -0.4534 0.7674 -0.4534 +vn 0.4818 -0.7390 0.4710 +vn -0.4366 -0.7390 0.5131 +vn 0.4366 -0.7390 -0.5131 +vn -0.4835 -0.7561 -0.4411 +vn 0.4052 -0.8361 0.3697 +vn -0.3697 -0.8361 0.4052 +vn 0.3697 -0.8361 -0.4052 +vn -0.4171 -0.8733 -0.2517 +vn 0.6032 0.5774 0.5503 +vn -0.5503 0.5774 0.6032 +vn 0.5503 0.5774 -0.6032 +vn -0.6032 0.5774 -0.5503 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 0.7071 0.7071 +vn -0.0000 -0.7071 0.7071 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 1.0000 0.0021 +vn -0.0000 -1.0000 -0.0021 +vn -0.7071 -0.0020 0.7071 +vn 0.7071 -0.0020 0.7071 +vn -0.0000 0.7051 0.7091 +vn -0.0000 -0.7091 0.7051 +vn 0.7071 -0.7071 -0.0020 +vn -0.7071 -0.7071 -0.0020 +vn -0.7071 0.7071 0.0020 +vn 0.7071 0.7071 0.0020 +vn 0.0324 -0.7071 0.7064 +vn 0.7064 -0.7071 -0.0324 +vn -0.7064 -0.7071 0.0324 +vn -0.0324 -0.7071 -0.7064 +vn -0.7068 -0.0290 -0.7068 +vn 0.6737 0.0290 -0.7384 +vn 0.7387 0.0078 0.6740 +vn -0.7071 -0.0078 0.7071 +vn 0.0324 0.7071 0.7064 +vn 0.7064 0.7071 -0.0324 +vn -0.7064 0.7071 0.0324 +vn -0.0324 0.7071 -0.7064 +vn -0.7388 -0.0000 -0.6740 +vn 0.6740 -0.0000 -0.7388 +vn 0.7388 -0.0000 0.6740 +vn -0.6740 -0.0000 0.7388 +vn -0.0001 1.0000 0.0021 +vn 0.0458 0.0459 0.9979 +vn -0.9971 0.0612 0.0457 +vn -0.0458 0.0459 -0.9979 +vn 0.9971 0.0612 -0.0457 +vn 0.5112 0.1135 -0.8519 +vn 0.8076 0.4967 -0.3181 +vn 0.5112 0.1135 0.8519 +vn 0.4604 0.8690 0.1813 +vn -0.5112 0.1135 -0.8519 +vn -0.4604 0.8690 -0.1813 +vn -0.5112 0.1135 0.8519 +vn -0.8076 0.4967 0.3181 +vn 0.4274 -0.4274 -0.7967 +vn -0.3892 -0.6031 -0.6963 +vn 0.4279 0.5478 -0.7189 +vn -0.3892 -0.6031 0.6963 +vn 0.4279 0.5478 0.7189 +vn 0.3892 -0.6031 0.6963 +vn -0.4279 0.5478 -0.7189 +vn -0.1384 -0.6043 -0.7846 +vn -0.6051 -0.0300 -0.7956 +vn -0.1384 -0.6043 0.7846 +vn -0.6051 -0.0300 0.7956 +vn 0.0957 -0.8346 -0.5425 +vn 0.6051 -0.0300 -0.7956 +vn 0.6051 -0.0300 0.7956 +vn 0.0957 -0.8346 0.5425 +vn -0.4412 -0.7814 -0.4412 +vn 0.4412 -0.7814 0.4412 +vn 0.5580 -0.7149 -0.4213 +vn -0.4412 -0.7814 0.4412 +vn 0.3333 -0.6667 0.6667 +vn -0.4082 -0.8165 0.4082 +vn -0.3333 -0.6667 -0.6667 +vn 0.4082 -0.8165 -0.4082 +vn 0.4446 0.7292 0.5202 +vn -0.4534 0.7674 0.4534 +vn 0.4446 0.7292 -0.5202 +vn -0.4446 0.7292 -0.5202 +vn 0.4835 -0.7561 0.4411 +vn -0.4411 -0.7561 0.4835 +vn 0.4411 -0.7561 -0.4835 +vn -0.4818 -0.7390 -0.4710 +vn 0.4171 -0.8733 0.2517 +vn -0.3923 -0.8733 0.2888 +vn 0.3923 -0.8733 -0.2888 +vn -0.4052 -0.8361 -0.3697 +vn -0.4591 0.0645 0.8860 +vn -0.0620 0.4759 0.8773 +vn -0.7387 0.0078 -0.6740 +vn 0.7071 -0.0078 -0.7071 +vn 0.7068 -0.0290 0.7068 +vn -0.6737 0.0290 0.7384 +vt 0.875000 0.750000 +vt 0.875000 0.750000 +vt 0.454165 0.246178 +vt 0.011354 0.537788 +vt 0.454165 0.280256 +vt 0.018920 0.571866 +vt 0.352448 0.302964 +vt 0.442811 0.291610 +vt 0.021431 0.583220 +vt 0.417225 0.291610 +vt 0.342371 0.328551 +vt 0.442811 0.291610 +vt 0.442811 0.280256 +vt 0.227083 0.246178 +vt 0.319663 0.537788 +vt 0.238437 0.280256 +vt 0.264023 0.291610 +vt 0.342371 0.481752 +vt 0.309586 0.583220 +vt 0.352448 0.507339 +vt 0.238437 0.291610 +vt 0.227083 0.280256 +vt 0.312097 0.571866 +vt 0.000000 0.246178 +vt 0.154154 0.537788 +vt 0.011354 0.280256 +vt 0.036940 0.291610 +vt 0.485171 0.328551 +vt 0.144077 0.583220 +vt 0.011354 0.291610 +vt 0.475094 0.302964 +vt 0.000000 0.280256 +vt 0.146588 0.571866 +vt 0.227083 0.246178 +vt 0.176863 0.537788 +vt 0.227083 0.280256 +vt 0.184429 0.571866 +vt 0.215729 0.291610 +vt 0.186940 0.583220 +vt 0.475094 0.507339 +vt 0.190142 0.291610 +vt 0.485171 0.481752 +vt 0.215729 0.291610 +vt 0.215729 0.280256 +vt 0.668620 0.645184 +vt 0.342371 0.872266 +vt 0.679974 0.645184 +vt 0.679974 0.656538 +vt 0.332562 0.883621 +vt 0.025538 0.426236 +vt 0.671339 0.656538 +vt 0.045527 0.413337 +vt 0.599604 0.645184 +vt 0.596884 0.656538 +vt 0.119982 0.413337 +vt 0.588250 0.656538 +vt 0.090873 0.583220 +vt 0.139971 0.426236 +vt 0.588250 0.645184 +vt 0.100683 0.594574 +vt 0.496525 0.645184 +vt 0.408992 0.872266 +vt 0.507880 0.645184 +vt 0.503339 0.656538 +vt 0.043706 0.525374 +vt 0.496525 0.656538 +vt 0.417508 0.883621 +vt 0.025538 0.511183 +vt 0.202401 0.424691 +vt 0.011354 0.936794 +vt 0.202401 0.436045 +vt 0.679974 0.302964 +vt 0.191047 0.426236 +vt 0.201988 0.423203 +vt 0.211035 0.413337 +vt 0.213755 0.424691 +vt 0.691328 0.302964 +vt 0.089329 0.942471 +vt 0.875000 0.750000 +vt 0.863422 0.297287 +vt 0.202401 0.514020 +vt 0.199195 0.520033 +vt 0.209214 0.525374 +vt 0.191046 0.511183 +vt 0.294125 0.502666 +vt 0.256633 0.594574 +vt 0.771698 0.302964 +vt 0.305479 0.511183 +vt 0.297330 0.520033 +vt 0.287311 0.525374 +vt 0.294125 0.514020 +vt 0.282771 0.514020 +vt 0.783052 0.302964 +vt 0.294125 0.424691 +vt 0.190012 0.594574 +vt 0.294125 0.436045 +vt 0.771698 0.302964 +vt 0.282771 0.424691 +vt 0.760344 0.302964 +vt 0.285490 0.413337 +vt 0.294538 0.423203 +vt 0.305479 0.426236 +vt 0.167303 0.594574 +vt 0.588250 0.645184 +vt 0.139970 0.511183 +vt 0.588250 0.656538 +vt 0.175820 0.583220 +vt 0.581436 0.656538 +vt 0.121803 0.525374 +vt 0.576896 0.645184 +vt 0.668620 0.476191 +vt 0.668620 0.464837 +vt 0.679974 0.476191 +vt 0.342371 0.691920 +vt 0.679974 0.464837 +vt 0.342371 0.714628 +vt 0.679974 0.487545 +vt 0.668620 0.487545 +vt 0.599604 0.476191 +vt 0.599604 0.464837 +vt 0.599604 0.487545 +vt 0.100683 0.752213 +vt 0.588250 0.487545 +vt 0.588250 0.476191 +vt 0.100683 0.774921 +vt 0.588250 0.464837 +vt 0.496526 0.476191 +vt 0.496526 0.464837 +vt 0.408992 0.691920 +vt 0.507880 0.476191 +vt 0.507880 0.464837 +vt 0.507880 0.487545 +vt 0.408992 0.714628 +vt 0.496526 0.487545 +vt 0.011354 0.756447 +vt 0.679974 0.483311 +vt 0.679974 0.471957 +vt 0.011354 0.779155 +vt 0.679974 0.460603 +vt 0.691328 0.460603 +vt 0.691328 0.471957 +vt 0.691328 0.483311 +vt 0.077975 0.756447 +vt 0.863422 0.483311 +vt 0.852068 0.483311 +vt 0.863422 0.471957 +vt 0.875000 0.750000 +vt 0.089329 0.773478 +vt 0.863422 0.466280 +vt 0.256633 0.774921 +vt 0.771698 0.483311 +vt 0.771698 0.460603 +vt 0.771698 0.471957 +vt 0.256633 0.752213 +vt 0.783052 0.471957 +vt 0.783052 0.460603 +vt 0.783052 0.483311 +vt 0.771698 0.483311 +vt 0.190012 0.774921 +vt 0.760344 0.483311 +vt 0.760344 0.471957 +vt 0.760344 0.460603 +vt 0.771698 0.471957 +vt 0.190012 0.752213 +vt 0.771698 0.460603 +vt 0.588250 0.476191 +vt 0.167303 0.774921 +vt 0.588250 0.464837 +vt 0.167303 0.752213 +vt 0.588250 0.487545 +vt 0.576895 0.487545 +vt 0.576896 0.476191 +vt 0.576896 0.464837 +vt 0.668620 0.302964 +vt 0.776611 0.792314 +vt 0.668620 0.291610 +vt 0.342371 0.518693 +vt 0.679974 0.302964 +vt 0.342371 0.530047 +vt 0.599604 0.302964 +vt 0.100683 0.936794 +vt 0.588250 0.302964 +vt 0.776611 0.861330 +vt 0.599604 0.291610 +vt 0.100683 0.948148 +vt 0.408992 0.530047 +vt 0.496526 0.302964 +vt 0.709990 0.792314 +vt 0.408992 0.518693 +vt 0.507880 0.291610 +vt 0.507880 0.302964 +vt 0.011354 0.594575 +vt 0.679974 0.645184 +vt 0.691328 0.645184 +vt 0.687281 0.792314 +vt 0.011354 0.583220 +vt 0.691328 0.656538 +vt 0.863422 0.645184 +vt 0.077975 0.594575 +vt 0.620661 0.792314 +vt 0.077975 0.583220 +vt 0.852068 0.656538 +vt 0.852068 0.645184 +vt 0.771698 0.645184 +vt 0.256633 0.936794 +vt 0.783052 0.645184 +vt 0.256633 0.948148 +vt 0.620661 0.861330 +vt 0.783052 0.656538 +vt 0.190012 0.936794 +vt 0.771698 0.645184 +vt 0.687282 0.861330 +vt 0.190012 0.948148 +vt 0.760344 0.656538 +vt 0.760344 0.645184 +vt 0.167303 0.936794 +vt 0.588250 0.302964 +vt 0.576896 0.302964 +vt 0.167303 0.948148 +vt 0.709990 0.861330 +vt 0.576896 0.291610 +vt 0.465520 0.018097 +vt 0.018097 0.000000 +vt 0.011354 0.011354 +vt 0.000000 0.083460 +vt 0.154154 0.375070 +vt 0.150579 0.302964 +vt 0.000000 0.011354 +vt 0.469095 0.000000 +vt 0.011354 0.000000 +vt 0.503760 0.011354 +vt 0.465520 0.208986 +vt 0.208986 0.000000 +vt 0.215102 0.291610 +vt 0.215729 0.000000 +vt 0.503759 0.215729 +vt 0.227083 0.011354 +vt 0.180438 0.302964 +vt 0.227083 0.083460 +vt 0.176863 0.375070 +vt 0.215729 0.011354 +vt 0.442811 0.000000 +vt 0.570080 0.011354 +vt 0.454166 0.011354 +vt 0.604744 0.000000 +vt 0.014930 0.302964 +vt 0.454166 0.083460 +vt 0.011354 0.375070 +vt 0.442811 0.011354 +vt 0.608320 0.018097 +vt 0.436069 0.000000 +vt 0.227083 0.083460 +vt 0.319663 0.375070 +vt 0.227083 0.011354 +vt 0.316087 0.302964 +vt 0.238437 0.000000 +vt 0.281423 0.291610 +vt 0.570080 0.215729 +vt 0.245179 0.000000 +vt 0.608320 0.208986 +vt 0.238437 0.011354 +vt 0.497370 0.033487 +vt 0.506384 0.025233 +vt 0.511324 0.015009 +vt 0.508724 0.026364 +vt 0.520079 0.026364 +vt 0.541562 0.988646 +vt 0.874777 0.623718 +vt 0.508724 0.037718 +vt 0.552916 0.988646 +vt 0.571529 0.203819 +vt 0.576469 0.193595 +vt 0.562516 0.212073 +vt 0.597953 0.988646 +vt 0.267987 0.915329 +vt 0.553761 0.200719 +vt 0.565115 0.200719 +vt 0.565115 0.189365 +vt 0.279341 0.915329 +vt 0.553761 0.026364 +vt 0.507880 0.988646 +vt 0.562516 0.015009 +vt 0.571529 0.023264 +vt 0.576469 0.033487 +vt 0.472118 0.850801 +vt 0.565115 0.037718 +vt 0.496525 0.988646 +vt 0.565115 0.026364 +vt 0.497370 0.193595 +vt 0.508724 0.189365 +vt 0.914890 0.967181 +vt 0.520079 0.200719 +vt 0.564270 0.988646 +vt 0.508724 0.200719 +vt 0.926244 0.967181 +vt 0.506384 0.201850 +vt 0.511324 0.212073 +vt 0.565115 0.089490 +vt 0.576469 0.089490 +vt 0.553761 0.100844 +vt 0.553761 0.089490 +vt 0.971280 0.967181 +vt 0.565115 0.089490 +vt 0.431700 0.850801 +vt 0.565115 0.078136 +vt 0.982635 0.967181 +vt 0.497370 0.089490 +vt 0.915195 0.623719 +vt 0.508724 0.078136 +vt 0.926244 0.967181 +vt 0.937598 0.967181 +vt 0.508724 0.089490 +vt 0.520079 0.089490 +vt 0.508724 0.100844 +vt 0.520079 0.100844 +vt 0.497370 0.137898 +vt 0.508724 0.126544 +vt 0.520079 0.126544 +vt 0.508724 0.137898 +vt 0.520079 0.137898 +vt 0.971585 0.623718 +vt 0.874777 0.967181 +vt 0.508724 0.149252 +vt 0.982940 0.623718 +vt 0.565115 0.137898 +vt 0.576469 0.137898 +vt 0.319454 0.915329 +vt 0.926549 0.623718 +vt 0.565115 0.137898 +vt 0.565115 0.149252 +vt 0.553761 0.137898 +vt 0.937903 0.623718 +vt 0.553761 0.126544 +vt 0.507880 0.825111 +vt 0.507880 0.836465 +vt 0.507880 0.847819 +vt 0.472118 0.709975 +vt 0.496525 0.836465 +vt 0.496525 0.847819 +vt 0.472118 0.687266 +vt 0.496525 0.825111 +vt 0.541562 0.825111 +vt 0.874777 0.460183 +vt 0.552916 0.825111 +vt 0.552916 0.847819 +vt 0.552916 0.836465 +vt 0.874777 0.482892 +vt 0.541562 0.836465 +vt 0.541562 0.847819 +vt 0.564270 0.825111 +vt 0.926244 0.803646 +vt 0.926244 0.826354 +vt 0.926244 0.815000 +vt 0.564270 0.847819 +vt 0.914890 0.815000 +vt 0.914890 0.826354 +vt 0.914890 0.803646 +vt 0.597953 0.825111 +vt 0.267987 0.751794 +vt 0.279341 0.751794 +vt 0.279341 0.763148 +vt 0.279341 0.774502 +vt 0.267987 0.763148 +vt 0.597953 0.847819 +vt 0.267987 0.774502 +vt 0.431700 0.687266 +vt 0.982635 0.803646 +vt 0.982635 0.826354 +vt 0.982635 0.815000 +vt 0.431700 0.709974 +vt 0.971280 0.815000 +vt 0.971280 0.826354 +vt 0.971280 0.803646 +vt 0.915195 0.460183 +vt 0.926244 0.803646 +vt 0.937598 0.803646 +vt 0.937598 0.815000 +vt 0.937598 0.826354 +vt 0.926244 0.815000 +vt 0.915195 0.482892 +vt 0.926244 0.826354 +vt 0.874776 0.803646 +vt 0.982940 0.460183 +vt 0.982940 0.482892 +vt 0.874777 0.826354 +vt 0.982940 0.471538 +vt 0.971585 0.471538 +vt 0.971585 0.482892 +vt 0.971585 0.460183 +vt 0.926549 0.460183 +vt 0.319454 0.751794 +vt 0.937903 0.460183 +vt 0.937903 0.471538 +vt 0.937903 0.482892 +vt 0.926549 0.471538 +vt 0.319454 0.774502 +vt 0.926549 0.482892 +vt 0.507880 0.667892 +vt 0.499202 0.227083 +vt 0.510556 0.238437 +vt 0.472118 0.530047 +vt 0.496526 0.667892 +vt 0.499202 0.238437 +vt 0.465520 0.227083 +vt 0.541562 0.667892 +vt 0.465520 0.238437 +vt 0.552916 0.667892 +vt 0.874777 0.302964 +vt 0.454166 0.238437 +vt 0.926244 0.646427 +vt 0.564270 0.667892 +vt 0.914890 0.646427 +vt 0.564270 0.656538 +vt 0.521910 0.278550 +vt 0.914890 0.635072 +vt 0.597953 0.667892 +vt 0.267987 0.594574 +vt 0.555593 0.278550 +vt 0.597953 0.656538 +vt 0.279341 0.583220 +vt 0.279341 0.594574 +vt 0.431700 0.530047 +vt 0.510556 0.278855 +vt 0.982635 0.646427 +vt 0.499202 0.290209 +vt 0.971280 0.646427 +vt 0.499202 0.278855 +vt 0.915195 0.302964 +vt 0.454166 0.278855 +vt 0.926244 0.646427 +vt 0.465520 0.278855 +vt 0.937598 0.646427 +vt 0.465520 0.290209 +vt 0.982940 0.302964 +vt 0.874777 0.646427 +vt 0.971585 0.302964 +vt 0.874777 0.635072 +vt 0.521910 0.238437 +vt 0.971585 0.291610 +vt 0.319454 0.594574 +vt 0.926549 0.302964 +vt 0.555593 0.238437 +vt 0.937903 0.291610 +vt 0.319454 0.583220 +vt 0.937903 0.302964 +vt 0.871751 0.048659 +vt 0.817098 0.780960 +vt 0.828452 0.780960 +vt 0.883105 0.053997 +vt 0.389780 0.452346 +vt 0.828452 0.784450 +vt 0.372411 0.437502 +vt 0.817098 0.792314 +vt 0.871751 0.011354 +vt 0.842094 0.728219 +vt 0.842094 0.716865 +vt 0.455132 0.437502 +vt 0.853448 0.724729 +vt 0.853448 0.728219 +vt 0.883105 0.006015 +vt 0.437762 0.452346 +vt 0.817098 0.841287 +vt 0.596080 0.227083 +vt 0.607434 0.227083 +vt 0.828452 0.849152 +vt 0.372411 0.372801 +vt 0.607434 0.233098 +vt 0.389780 0.357957 +vt 0.596080 0.238437 +vt 0.842094 0.667892 +vt 0.596080 0.287096 +vt 0.596080 0.275742 +vt 0.607434 0.281080 +vt 0.437762 0.357957 +vt 0.455132 0.372801 +vt 0.607434 0.287096 +vt 0.853448 0.660027 +vt 0.816443 0.107753 +vt 0.853972 0.048659 +vt 0.810357 0.096399 +vt 0.799319 0.780960 +vt 0.799319 0.792314 +vt 0.821711 0.096399 +vt 0.821711 0.085045 +vt 0.824396 0.099574 +vt 0.833065 0.092241 +vt 0.758296 0.100421 +vt 0.766965 0.107753 +vt 0.750344 0.092241 +vt 0.761698 0.085045 +vt 0.824315 0.716865 +vt 0.853972 0.011354 +vt 0.761698 0.096399 +vt 0.773052 0.096399 +vt 0.824315 0.728219 +vt 0.566947 0.227083 +vt 0.833065 0.028875 +vt 0.799319 0.841287 +vt 0.821711 0.036072 +vt 0.578301 0.227083 +vt 0.578301 0.238437 +vt 0.566947 0.232350 +vt 0.816443 0.013363 +vt 0.566947 0.287096 +vt 0.750344 0.028875 +vt 0.566947 0.281828 +vt 0.766965 0.013363 +vt 0.578301 0.275742 +vt 0.824315 0.667892 +vt 0.761698 0.036072 +vt 0.578301 0.287096 +vt 0.831264 0.121117 +vt 0.801607 0.667892 +vt 0.619674 0.011354 +vt 0.818143 0.109762 +vt 0.822595 0.097444 +vt 0.831264 0.090112 +vt 0.837019 0.114498 +vt 0.842618 0.109762 +vt 0.631028 0.011354 +vt 0.722488 0.667892 +vt 0.745526 0.115518 +vt 0.740791 0.135777 +vt 0.752145 0.121117 +vt 0.740791 0.109762 +vt 0.729437 0.135777 +vt 0.752145 0.090112 +vt 0.756597 0.102430 +vt 0.765266 0.109762 +vt 0.842618 0.011354 +vt 0.729437 0.011354 +vt 0.837019 0.006619 +vt 0.609307 0.667892 +vt 0.822595 0.023672 +vt 0.831264 0.031005 +vt 0.818143 0.011354 +vt 0.831264 0.000000 +vt 0.620661 0.667892 +vt 0.631028 0.135777 +vt 0.711134 0.667892 +vt 0.740791 0.011354 +vt 0.752145 0.000000 +vt 0.745526 0.005598 +vt 0.699780 0.667892 +vt 0.756597 0.018687 +vt 0.765266 0.011354 +vt 0.752145 0.031005 +vt 0.619674 0.113068 +vt 0.801607 0.769606 +vt 0.752145 0.245539 +vt 0.740791 0.234185 +vt 0.631028 0.113068 +vt 0.752145 0.234185 +vt 0.722488 0.769606 +vt 0.831264 0.245539 +vt 0.740791 0.237491 +vt 0.831264 0.234185 +vt 0.842618 0.234185 +vt 0.729436 0.237491 +vt 0.609307 0.769606 +vt 0.729436 0.113068 +vt 0.740791 0.135777 +vt 0.752145 0.124422 +vt 0.620661 0.769606 +vt 0.752145 0.135777 +vt 0.631028 0.237491 +vt 0.842618 0.135777 +vt 0.711134 0.769606 +vt 0.831264 0.135777 +vt 0.831264 0.124422 +vt 0.699780 0.769606 +s 0 +usemtl Material +f 19/37/1 44/90/1 12/23/1 +f 10/18/2 226/466/2 219/452/2 +f 21/42/2 232/475/2 15/28/2 +f 5/7/2 231/474/2 227/468/2 +f 31/62/3 56/116/3 65/133/3 +f 35/70/4 72/148/4 39/78/4 +f 112/227/5 26/52/5 120/246/5 +f 45/93/6 72/149/6 75/156/6 +f 13/25/5 29/58/5 111/226/5 +f 20/40/2 218/450/2 224/461/2 +f 122/249/3 9/16/3 128/261/3 +f 22/44/4 110/224/4 118/241/4 +f 27/53/7 57/118/7 23/45/7 +f 63/131/2 107/218/2 84/173/2 +f 71/145/8 101/206/8 76/157/8 +f 72/147/3 1/1/3 39/79/3 +f 58/120/7 85/174/7 54/112/7 +f 50/103/4 60/122/4 30/60/4 +f 125/255/1 37/75/1 116/238/1 +f 32/63/2 83/171/2 53/110/2 +f 47/99/9 68/140/9 38/77/9 +f 153/316/7 114/232/7 129/262/7 +f 102/208/10 96/195/10 104/212/10 +f 78/160/11 95/194/11 69/142/11 +f 55/114/3 91/186/3 62/129/3 +f 66/135/4 97/199/4 70/143/4 +f 77/159/3 100/205/3 103/210/3 +f 108/220/5 86/175/5 90/183/5 +f 61/125/4 106/216/4 89/181/4 +f 134/273/7 115/236/7 144/297/7 +f 157/326/7 139/284/7 123/250/7 +f 138/282/7 113/231/7 119/243/7 +f 159/332/5 187/388/5 155/321/5 +f 137/281/5 168/349/5 131/267/5 +f 161/334/5 196/405/5 165/342/5 +f 177/366/3 194/401/3 164/340/3 +f 166/343/4 208/428/4 181/374/4 +f 132/268/4 184/380/4 150/308/4 +f 143/293/1 176/364/1 135/274/1 +f 156/322/4 171/356/4 142/291/4 +f 148/304/3 163/337/3 140/285/3 +f 152/315/7 160/333/7 154/318/7 +f 136/279/3 192/396/3 158/327/3 +f 203/418/7 213/438/7 215/442/7 +f 217/446/12 240/492/12 221/454/12 +f 195/403/7 209/431/7 197/406/7 +f 174/360/3 214/440/3 189/391/3 +f 169/350/1 202/416/1 173/358/1 +f 172/357/4 211/435/4 200/412/4 +f 182/376/1 206/426/1 180/373/1 +f 190/392/5 212/436/5 188/389/5 +f 233/478/7 256/529/7 237/488/7 +f 18/35/1 36/73/1 41/84/1 +f 8/15/1 49/102/1 124/253/1 +f 4/6/5 52/109/5 17/33/5 +f 246/507/7 259/536/7 244/503/7 +f 222/456/13 248/509/13 229/470/13 +f 230/472/14 243/501/14 228/469/14 +f 225/462/15 235/482/15 220/453/15 +f 275/569/2 267/553/2 273/565/2 +f 236/486/16 258/535/16 251/517/16 +f 249/513/17 268/554/17 253/521/17 +f 245/505/18 255/527/18 264/547/18 +f 254/526/19 274/566/19 261/539/19 +f 262/544/20 272/564/20 260/538/20 +f 257/531/21 266/552/21 252/520/21 +f 151/311/1 179/372/1 147/302/1 +f 46/95/3 74/154/3 80/164/3 +f 4/5/22 6/10/22 7/12/22 +f 9/16/23 11/21/23 12/22/23 +f 14/26/24 16/30/24 17/32/24 +f 19/36/25 21/41/25 22/43/25 +f 23/45/26 25/48/26 26/51/26 +f 27/53/27 29/56/27 30/59/27 +f 32/63/28 34/66/28 31/61/28 +f 36/74/29 38/76/29 35/69/29 +f 39/81/30 40/82/30 41/84/30 +f 43/88/31 45/91/31 42/85/31 +f 47/98/32 49/101/32 46/94/32 +f 51/106/33 53/110/33 50/104/33 +f 55/113/34 57/118/34 54/111/34 +f 59/121/35 61/124/35 58/119/35 +f 63/130/36 65/134/36 62/127/36 +f 67/137/37 69/142/37 66/136/37 +f 70/144/38 71/145/38 72/146/38 +f 73/151/39 75/155/39 76/157/39 +f 78/160/40 80/163/40 77/158/40 +f 82/170/41 84/172/41 81/166/41 +f 85/174/42 86/176/42 87/178/42 +f 88/180/43 89/182/43 90/184/43 +f 91/187/44 92/190/44 93/191/44 +f 94/193/45 95/194/45 96/197/45 +f 97/198/46 98/202/46 99/203/46 +f 100/204/47 101/206/47 102/209/47 +f 103/211/48 104/214/48 105/215/48 +f 106/217/49 107/218/49 108/221/49 +f 110/224/50 112/228/50 113/230/50 +f 115/235/51 116/237/51 118/241/51 +f 120/244/52 122/249/52 123/251/52 +f 125/254/53 127/259/53 128/261/53 +f 130/263/54 132/269/54 129/262/54 +f 134/273/55 136/277/55 133/271/55 +f 138/282/56 140/288/56 137/280/56 +f 142/290/57 144/296/57 141/289/57 +f 145/298/58 147/301/58 148/303/58 +f 149/307/59 151/312/59 152/314/59 +f 153/316/60 155/319/60 156/323/60 +f 157/325/61 159/331/61 160/333/61 +f 162/335/62 164/341/62 161/334/62 +f 166/344/63 168/348/63 165/342/63 +f 169/351/64 171/355/64 172/357/64 +f 174/360/65 176/363/65 173/359/65 +f 178/369/65 180/373/65 177/367/65 +f 182/376/64 184/379/64 181/375/64 +f 185/383/63 187/387/63 188/389/63 +f 189/390/62 191/393/62 192/395/62 +f 193/399/42 194/400/42 195/403/42 +f 196/404/66 197/406/66 198/409/66 +f 199/410/67 200/412/67 201/415/67 +f 202/417/68 203/420/68 204/421/68 +f 205/423/69 206/425/69 207/427/69 +f 208/429/70 209/431/70 210/433/70 +f 211/434/66 212/436/66 213/439/66 +f 214/441/71 215/443/71 216/445/71 +f 217/447/72 219/451/72 220/453/72 +f 221/455/73 223/458/73 224/459/73 +f 226/464/74 228/469/74 225/463/74 +f 230/472/75 232/476/75 229/471/75 +f 234/480/76 236/485/76 233/478/76 +f 238/489/77 240/493/77 237/487/77 +f 241/496/78 243/501/78 244/502/78 +f 245/504/79 247/508/79 248/511/79 +f 250/515/80 252/518/80 249/512/80 +f 254/525/81 256/528/81 253/522/81 +f 257/532/82 259/536/82 260/537/82 +f 261/541/83 263/545/83 264/547/83 +f 265/550/84 266/551/84 267/553/84 +f 268/555/85 269/557/85 270/558/85 +f 271/562/86 272/563/86 273/565/86 +f 274/567/87 275/569/87 276/570/87 +f 114/233/35 110/224/35 109/223/35 +f 113/231/88 120/245/88 119/243/88 +f 7/13/62 121/247/62 3/3/62 +f 117/239/64 22/44/64 118/241/64 +f 124/252/65 9/16/65 8/14/65 +f 111/225/63 14/26/63 13/24/63 +f 20/39/89 12/23/89 11/19/89 +f 10/17/36 7/13/36 6/10/36 +f 126/257/90 116/238/90 115/234/90 +f 15/27/41 22/44/41 21/41/41 +f 5/9/91 17/33/91 16/29/91 +f 123/251/34 128/261/34 127/259/34 +f 28/54/88 23/45/88 26/51/88 +f 34/67/62 24/46/62 31/62/62 +f 35/71/64 41/84/64 36/73/64 +f 46/96/65 43/88/65 42/85/65 +f 30/60/63 51/107/63 50/103/63 +f 40/83/89 45/92/89 44/90/89 +f 48/100/90 38/76/90 37/75/90 +f 52/108/91 32/63/91 53/110/91 +f 111/226/5 28/55/5 112/227/5 +f 121/248/5 26/52/5 25/50/5 +f 3/4/5 33/65/5 4/6/5 +f 13/25/5 52/109/5 51/105/5 +f 124/253/1 48/100/1 125/255/1 +f 117/240/1 37/75/1 36/73/1 +f 18/35/1 40/83/1 19/37/1 +f 8/15/1 44/90/1 43/88/1 +f 59/121/7 54/112/7 57/118/7 +f 56/116/3 62/129/3 65/133/3 +f 70/143/4 67/138/4 66/135/4 +f 77/159/3 74/154/3 73/150/3 +f 61/125/4 82/169/4 81/167/4 +f 75/156/92 71/145/92 76/157/92 +f 79/162/93 69/142/93 68/140/93 +f 64/132/2 84/173/2 83/171/2 +f 60/123/35 27/53/35 30/59/35 +f 56/117/34 23/45/34 57/118/34 +f 65/134/36 32/63/36 31/61/36 +f 82/170/41 53/110/41 83/171/41 +f 42/87/39 75/156/39 74/152/39 +f 47/99/40 80/165/40 79/162/40 +f 67/139/37 38/77/37 68/140/37 +f 88/180/88 86/176/88 85/174/88 +f 87/179/62 92/189/62 91/186/62 +f 96/196/94 97/199/94 94/192/94 +f 104/213/95 100/205/95 102/207/95 +f 90/185/63 106/216/63 108/219/63 +f 99/203/96 102/209/96 101/206/96 +f 105/215/97 96/197/97 95/194/97 +f 93/191/91 108/221/91 107/218/91 +f 103/211/98 78/160/98 77/158/98 +f 94/193/99 69/142/99 95/194/99 +f 107/218/41 81/168/41 84/173/41 +f 58/120/35 89/182/35 88/180/35 +f 99/203/100 70/144/100 97/198/100 +f 55/115/34 85/174/34 87/178/34 +f 91/187/36 63/131/36 62/128/36 +f 73/151/101 101/206/101 100/204/101 +f 141/289/7 115/236/7 114/232/7 +f 113/231/7 129/262/7 109/222/7 +f 133/272/7 126/258/7 134/273/7 +f 137/280/88 130/264/88 138/282/88 +f 135/276/90 144/297/90 143/292/90 +f 139/284/7 119/243/7 123/250/7 +f 139/284/34 148/305/34 140/286/34 +f 150/309/35 129/262/35 132/269/35 +f 152/315/90 147/301/90 146/300/90 +f 156/323/35 141/289/35 153/316/35 +f 133/272/34 158/330/34 157/326/34 +f 155/320/88 160/333/88 159/331/88 +f 165/342/5 162/336/5 161/334/5 +f 173/358/1 170/354/1 169/350/1 +f 178/370/3 164/340/3 163/337/3 +f 181/374/4 167/347/4 166/343/4 +f 183/378/1 180/373/1 179/372/1 +f 185/382/4 171/356/4 186/385/4 +f 175/362/3 189/391/3 192/396/3 +f 188/389/5 191/394/5 190/392/5 +f 192/397/62 159/332/62 158/328/62 +f 156/324/63 187/388/63 186/384/63 +f 150/310/64 183/378/64 151/311/64 +f 148/306/65 179/372/65 178/368/65 +f 163/339/62 137/281/62 140/287/62 +f 132/270/63 168/349/63 167/345/63 +f 176/365/65 136/279/65 135/275/65 +f 143/295/64 171/356/64 170/352/64 +f 197/406/88 193/399/88 195/403/88 +f 203/419/90 199/411/90 201/413/90 +f 205/423/34 195/403/34 194/400/34 +f 209/431/35 198/409/35 197/406/35 +f 210/433/90 207/427/90 206/425/90 +f 201/415/35 211/435/35 213/437/35 +f 204/421/34 215/444/34 214/440/34 +f 213/439/88 216/445/88 215/443/88 +f 206/426/65 177/367/65 180/373/65 +f 161/334/62 194/402/62 193/398/62 +f 166/344/63 196/405/63 198/407/63 +f 214/441/62 190/392/62 189/390/62 +f 185/383/63 212/436/63 211/434/63 +f 169/351/64 200/412/64 199/410/64 +f 182/376/64 208/430/64 210/432/64 +f 174/360/65 202/417/65 204/421/65 +f 221/454/89 218/449/89 217/446/89 +f 220/453/36 226/465/36 225/462/36 +f 229/470/41 223/458/41 222/456/41 +f 228/469/91 231/473/91 230/472/91 +f 10/18/2 218/450/2 11/20/2 +f 21/42/2 224/461/2 223/457/2 +f 231/474/2 15/28/2 232/475/2 +f 227/468/2 6/11/2 5/7/2 +f 237/488/102 234/480/102 233/478/102 +f 236/486/103 242/499/103 241/497/103 +f 245/505/104 239/490/104 238/489/104 +f 244/502/105 247/508/105 246/506/105 +f 229/471/106 247/508/106 230/472/106 +f 242/500/107 228/469/107 243/501/107 +f 234/481/108 220/453/108 235/482/108 +f 221/455/109 239/491/109 222/456/109 +f 253/524/102 250/515/102 249/512/102 +f 252/519/103 258/535/103 257/530/103 +f 261/541/104 255/527/104 254/525/104 +f 260/537/105 263/546/105 262/542/105 +f 237/488/2 255/527/2 238/489/2 +f 263/546/2 245/505/2 264/547/2 +f 236/486/7 250/515/7 233/478/7 +f 258/535/7 244/503/7 259/536/7 +f 269/557/110 265/550/110 267/553/110 +f 267/553/111 271/562/111 273/565/111 +f 275/569/112 270/558/112 269/557/112 +f 273/565/113 276/570/113 275/569/113 +f 274/568/114 262/544/114 261/540/114 +f 257/533/115 272/564/115 271/560/115 +f 249/514/116 266/552/116 265/548/116 +f 268/556/117 254/526/117 253/523/117 +f 157/326/7 146/300/7 145/299/7 +f 149/307/7 154/318/7 153/316/7 +f 3/4/5 25/50/5 34/68/5 +f 19/37/1 40/83/1 44/90/1 +f 10/18/2 6/11/2 226/466/2 +f 21/42/2 223/457/2 232/475/2 +f 5/7/2 16/31/2 231/474/2 +f 31/62/3 24/46/3 56/116/3 +f 35/70/4 67/138/4 72/148/4 +f 112/227/5 28/55/5 26/52/5 +f 45/93/118 39/80/118 72/149/118 +f 13/25/5 51/105/5 29/58/5 +f 20/40/2 11/20/2 218/450/2 +f 122/249/3 7/13/3 9/16/3 +f 22/44/4 14/26/4 110/224/4 +f 27/53/7 59/121/7 57/118/7 +f 63/131/2 93/191/2 107/218/2 +f 71/145/8 99/203/8 101/206/8 +f 72/147/3 2/2/3 1/1/3 +f 58/120/7 88/180/7 85/174/7 +f 50/103/4 82/169/4 60/122/4 +f 125/255/1 48/100/1 37/75/1 +f 32/63/2 64/132/2 83/171/2 +f 47/99/9 79/162/9 68/140/9 +f 129/262/4 149/307/4 153/316/4 +f 153/316/7 141/289/7 114/232/7 +f 114/232/7 109/222/7 129/262/7 +f 102/208/10 98/200/10 96/195/10 +f 78/160/11 105/215/11 95/194/11 +f 55/114/3 87/179/3 91/186/3 +f 66/135/4 94/192/4 97/199/4 +f 77/159/3 73/150/3 100/205/3 +f 108/220/5 92/188/5 86/175/5 +f 61/125/4 81/167/4 106/216/4 +f 134/273/7 126/258/7 115/236/7 +f 123/250/7 127/260/7 133/272/7 +f 157/326/4 145/299/4 139/284/4 +f 123/250/7 133/272/7 157/326/7 +f 138/282/7 130/264/7 113/231/7 +f 159/332/5 191/394/5 187/388/5 +f 137/281/5 162/336/5 168/349/5 +f 161/334/5 193/398/5 196/405/5 +f 177/366/3 205/422/3 194/401/3 +f 166/343/4 198/408/4 208/428/4 +f 132/268/4 167/347/4 184/380/4 +f 143/293/1 170/354/1 176/364/1 +f 156/322/4 186/385/4 171/356/4 +f 148/304/3 178/370/3 163/337/3 +f 152/315/7 146/300/7 160/333/7 +f 136/279/3 175/362/3 192/396/3 +f 203/418/7 201/414/7 213/438/7 +f 217/446/119 234/479/119 240/492/119 +f 195/403/7 207/427/7 209/431/7 +f 174/360/3 204/421/3 214/440/3 +f 169/350/1 199/411/1 202/416/1 +f 172/357/4 185/382/4 211/435/4 +f 182/376/1 210/432/1 206/426/1 +f 190/392/5 216/445/5 212/436/5 +f 233/478/7 250/515/7 256/529/7 +f 18/35/1 117/240/1 36/73/1 +f 8/15/1 43/88/1 49/102/1 +f 4/6/5 33/65/5 52/109/5 +f 246/507/7 263/546/7 259/536/7 +f 222/456/120 239/491/120 248/509/120 +f 230/472/121 247/508/121 243/501/121 +f 225/462/122 242/498/122 235/482/122 +f 275/569/2 269/557/2 267/553/2 +f 236/486/18 241/497/18 258/535/18 +f 249/513/17 265/549/17 268/554/17 +f 245/505/16 238/489/16 255/527/16 +f 254/526/19 270/559/19 274/566/19 +f 262/544/20 276/571/20 272/564/20 +f 257/531/21 271/561/21 266/552/21 +f 151/311/1 183/378/1 179/372/1 +f 46/95/3 42/86/3 74/154/3 +f 7/12/123 3/3/123 4/5/123 +f 4/5/124 5/8/124 6/10/124 +f 12/22/125 8/14/125 9/16/125 +f 9/16/126 10/17/126 11/21/126 +f 17/32/127 13/24/127 14/26/127 +f 14/26/128 15/27/128 16/30/128 +f 22/43/129 18/34/129 19/36/129 +f 19/36/130 20/38/130 21/41/130 +f 23/45/131 24/47/131 25/48/131 +f 27/53/132 28/54/132 29/56/132 +f 32/63/133 33/64/133 34/66/133 +f 36/74/134 37/75/134 38/76/134 +f 43/88/135 44/89/135 45/91/135 +f 47/98/136 48/100/136 49/101/136 +f 51/106/137 52/108/137 53/110/137 +f 55/113/34 56/117/34 57/118/34 +f 59/121/35 60/123/35 61/124/35 +f 63/130/36 64/132/36 65/134/36 +f 67/137/37 68/141/37 69/142/37 +f 73/151/39 74/153/39 75/155/39 +f 78/160/40 79/161/40 80/163/40 +f 82/170/41 83/171/41 84/172/41 +f 113/230/138 109/223/138 110/224/138 +f 110/224/139 111/225/139 112/228/139 +f 118/241/140 114/233/140 115/235/140 +f 116/237/141 117/239/141 118/241/141 +f 123/251/142 119/242/142 120/244/142 +f 120/244/143 121/247/143 122/249/143 +f 128/261/144 124/252/144 125/254/144 +f 125/254/145 126/256/145 127/259/145 +f 130/263/146 131/265/146 132/269/146 +f 134/273/147 135/276/147 136/277/147 +f 138/282/148 139/283/148 140/288/148 +f 142/290/149 143/294/149 144/296/149 +f 145/298/150 146/300/150 147/301/150 +f 149/307/151 150/309/151 151/312/151 +f 153/316/152 154/317/152 155/319/152 +f 157/325/153 158/329/153 159/331/153 +f 162/335/62 163/338/62 164/341/62 +f 166/344/63 167/346/63 168/348/63 +f 169/351/64 170/353/64 171/355/64 +f 174/360/65 175/361/65 176/363/65 +f 178/369/65 179/371/65 180/373/65 +f 182/376/64 183/377/64 184/379/64 +f 185/383/63 186/386/63 187/387/63 +f 189/390/62 190/392/62 191/393/62 +f 217/447/154 218/448/154 219/451/154 +f 221/455/155 222/456/155 223/458/155 +f 226/464/156 227/467/156 228/469/156 +f 230/472/157 231/473/157 232/476/157 +f 234/480/158 235/483/158 236/485/158 +f 238/489/159 239/490/159 240/493/159 +f 241/496/160 242/500/160 243/501/160 +f 245/504/161 246/506/161 247/508/161 +f 250/515/162 251/516/162 252/518/162 +f 254/525/163 255/527/163 256/528/163 +f 257/532/164 258/534/164 259/536/164 +f 261/541/165 262/543/165 263/545/165 +f 114/233/35 118/241/35 110/224/35 +f 113/231/88 112/229/88 120/245/88 +f 7/13/62 122/249/62 121/247/62 +f 117/239/64 18/34/64 22/44/64 +f 124/252/65 128/261/65 9/16/65 +f 111/225/63 110/224/63 14/26/63 +f 20/39/89 19/37/89 12/23/89 +f 10/17/36 9/16/36 7/13/36 +f 126/257/90 125/255/90 116/238/90 +f 15/27/41 14/26/41 22/44/41 +f 5/9/91 4/6/91 17/33/91 +f 123/251/34 122/249/34 128/261/34 +f 28/54/88 27/53/88 23/45/88 +f 34/67/62 25/49/62 24/46/62 +f 35/71/166 39/81/166 41/84/166 +f 46/96/65 49/102/65 43/88/65 +f 30/60/63 29/57/63 51/107/63 +f 40/83/167 39/81/167 45/92/167 +f 48/100/90 47/98/90 38/76/90 +f 52/108/91 33/64/91 32/63/91 +f 111/226/5 29/58/5 28/55/5 +f 121/248/5 120/246/5 26/52/5 +f 3/4/5 34/68/5 33/65/5 +f 13/25/5 17/33/5 52/109/5 +f 124/253/1 49/102/1 48/100/1 +f 117/240/1 116/238/1 37/75/1 +f 18/35/1 41/84/1 40/83/1 +f 8/15/1 12/23/1 44/90/1 +f 59/121/7 58/120/7 54/112/7 +f 56/116/3 55/114/3 62/129/3 +f 70/143/4 72/148/4 67/138/4 +f 77/159/3 80/164/3 74/154/3 +f 61/125/4 60/122/4 82/169/4 +f 75/156/92 72/149/92 71/145/92 +f 79/162/93 78/160/93 69/142/93 +f 64/132/2 63/131/2 84/173/2 +f 60/123/35 59/121/35 27/53/35 +f 56/117/34 24/47/34 23/45/34 +f 65/134/36 64/132/36 32/63/36 +f 82/170/41 50/104/41 53/110/41 +f 42/87/39 45/93/39 75/156/39 +f 47/99/40 46/97/40 80/165/40 +f 67/139/37 35/72/37 38/77/37 +f 88/180/88 90/184/88 86/176/88 +f 87/179/62 86/177/62 92/189/62 +f 96/196/94 98/201/94 97/199/94 +f 104/213/95 103/210/95 100/205/95 +f 90/185/63 89/181/63 106/216/63 +f 99/203/96 98/202/96 102/209/96 +f 105/215/97 104/214/97 96/197/97 +f 93/191/91 92/190/91 108/221/91 +f 103/211/98 105/215/98 78/160/98 +f 94/193/99 66/136/99 69/142/99 +f 107/218/41 106/217/41 81/168/41 +f 58/120/35 61/126/35 89/182/35 +f 99/203/100 71/145/100 70/144/100 +f 55/115/34 54/112/34 85/174/34 +f 91/187/36 93/191/36 63/131/36 +f 73/151/101 76/157/101 101/206/101 +f 141/289/7 144/297/7 115/236/7 +f 113/231/7 130/264/7 129/262/7 +f 133/272/7 127/260/7 126/258/7 +f 137/280/88 131/266/88 130/264/88 +f 135/276/90 134/273/90 144/297/90 +f 139/284/7 138/282/7 119/243/7 +f 139/284/34 145/299/34 148/305/34 +f 150/309/35 149/307/35 129/262/35 +f 152/315/90 151/313/90 147/301/90 +f 156/323/35 142/290/35 141/289/35 +f 133/272/34 136/278/34 158/330/34 +f 155/320/88 154/318/88 160/333/88 +f 165/342/5 168/349/5 162/336/5 +f 173/358/1 176/364/1 170/354/1 +f 178/370/3 177/366/3 164/340/3 +f 181/374/4 184/380/4 167/347/4 +f 183/378/1 182/376/1 180/373/1 +f 185/382/4 172/357/4 171/356/4 +f 175/362/3 174/360/3 189/391/3 +f 188/389/5 187/388/5 191/394/5 +f 192/397/62 191/394/62 159/332/62 +f 156/324/63 155/321/63 187/388/63 +f 150/310/64 184/381/64 183/378/64 +f 148/306/65 147/302/65 179/372/65 +f 163/339/62 162/336/62 137/281/62 +f 132/270/63 131/267/63 168/349/63 +f 176/365/65 175/362/65 136/279/65 +f 143/295/64 142/291/64 171/356/64 +f 197/406/88 196/404/88 193/399/88 +f 203/419/90 202/416/90 199/411/90 +f 205/423/34 207/427/34 195/403/34 +f 209/431/35 208/429/35 198/409/35 +f 210/433/90 209/431/90 207/427/90 +f 201/415/35 200/412/35 211/435/35 +f 204/421/34 203/420/34 215/444/34 +f 213/439/88 212/436/88 216/445/88 +f 206/426/65 205/424/65 177/367/65 +f 161/334/62 164/341/62 194/402/62 +f 166/344/63 165/342/63 196/405/63 +f 214/441/62 216/445/62 190/392/62 +f 185/383/63 188/389/63 212/436/63 +f 169/351/64 172/357/64 200/412/64 +f 182/376/64 181/375/64 208/430/64 +f 174/360/65 173/359/65 202/417/65 +f 221/454/89 224/460/89 218/449/89 +f 220/453/36 219/451/36 226/465/36 +f 229/470/41 232/477/41 223/458/41 +f 228/469/91 227/467/91 231/473/91 +f 10/18/2 219/452/2 218/450/2 +f 21/42/2 20/40/2 224/461/2 +f 231/474/2 16/31/2 15/28/2 +f 227/468/2 226/466/2 6/11/2 +f 237/488/102 240/494/102 234/480/102 +f 236/486/103 235/484/103 242/499/103 +f 245/505/104 248/510/104 239/490/104 +f 244/502/105 243/501/105 247/508/105 +f 229/471/168 248/511/168 247/508/168 +f 242/500/169 225/463/169 228/469/169 +f 234/481/170 217/447/170 220/453/170 +f 221/455/171 240/495/171 239/491/171 +f 253/524/102 256/529/102 250/515/102 +f 252/519/103 251/517/103 258/535/103 +f 261/541/104 264/547/104 255/527/104 +f 260/537/105 259/536/105 263/546/105 +f 237/488/7 256/529/7 255/527/7 +f 263/546/7 246/507/7 245/505/7 +f 236/486/2 251/517/2 250/515/2 +f 258/535/2 241/497/2 244/503/2 +f 269/557/110 268/555/110 265/550/110 +f 267/553/111 266/551/111 271/562/111 +f 275/569/112 274/567/112 270/558/112 +f 273/565/113 272/563/113 276/570/113 +f 274/568/114 276/571/114 262/544/114 +f 257/533/115 260/538/115 272/564/115 +f 249/514/116 252/520/116 266/552/116 +f 268/556/117 270/559/117 254/526/117 +f 157/326/7 160/333/7 146/300/7 +f 149/307/7 152/315/7 154/318/7 +f 3/4/5 121/248/5 25/50/5 diff --git a/examples/nitro_engine/filesystem_simple_model/source/main.c b/examples/nitro_engine/filesystem_simple_model/source/main.c new file mode 100644 index 0000000..1e9ba68 --- /dev/null +++ b/examples/nitro_engine/filesystem_simple_model/source/main.c @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2008-2011, 2019, 2022 +// +// This file is part of Nitro Engine + +#include +#include + +NE_Camera *Camera; +NE_Model *Model; +NE_Material *Material; + +void Draw3DScene(void) +{ + NE_CameraUse(Camera); + NE_ModelDraw(Model); +} + +__attribute__((noreturn)) void WaitLoop(void) +{ + printf("Press START to exit"); + while (1) + { + swiWaitForVBlank(); + scanKeys(); + if (keysHeld() & KEY_START) + exit(0); + } +} + +int main(void) +{ + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + // Init Nitro Engine in normal 3D mode + NE_Init3D(); + + // libnds uses VRAM_C for the text console, reserve A and B only + NE_TextureSystemReset(0, 0, NE_VRAM_AB); + // Init console in non-3D screen + consoleDemoInit(); + + if (!nitroFSInit(NULL)) + { + printf("nitroFSInit failed.\n"); + WaitLoop(); + } + + // Allocate space for the objects we'll use + Model = NE_ModelCreate(NE_Static); + Camera = NE_CameraCreate(); + Material = NE_MaterialCreate(); + + // Set coordinates for the camera + NE_CameraSet(Camera, + -8, 3, 0, // Position + 0, 3, 0, // Look at + 0, 1, 0); // Up direction + + // Load mesh from the filesystem and assign it to the object "Model". + if (NE_ModelLoadStaticMeshFAT(Model, "models/robot.dl") == 0) + { + printf("Failed to load model\n"); + WaitLoop(); + } + + if (NE_MaterialTexLoadGRF(Material, NULL, NE_TEXGEN_TEXCOORD, + "grit/teapot_png.grf") == 0) + { + printf("Failed to load GRF\n"); + WaitLoop(); + } + + // Assign material to the model + NE_ModelSetMaterial(Model, Material); + + // We set up a light and its color + NE_LightSet(0, NE_White, -0.5, -0.5, -0.5); + + while (1) + { + // Wait for next frame + NE_WaitForVBL(0); + + // Get keys information + scanKeys(); + uint32_t keys = keysHeld(); + + printf("\x1b[0;0HPad: Rotate."); + + // Rotate model using the pad + if (keys & KEY_UP) + NE_ModelRotate(Model, 0, 0, -2); + if (keys & KEY_DOWN) + NE_ModelRotate(Model, 0, 0, 2); + if (keys & KEY_RIGHT) + NE_ModelRotate(Model, 0, 2, 0); + if (keys & KEY_LEFT) + NE_ModelRotate(Model, 0, -2, 0); + + // Draw scene + NE_Process(Draw3DScene); + } + + return 0; +} diff --git a/examples/nitro_engine/model_with_vertex_color/.gitignore b/examples/nitro_engine/model_with_vertex_color/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nitro_engine/model_with_vertex_color/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nitro_engine/model_with_vertex_color/architectds b/examples/nitro_engine/model_with_vertex_color/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/model_with_vertex_color/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/model_with_vertex_color/assets/sphere_vertex_colors.json b/examples/nitro_engine/model_with_vertex_color/assets/sphere_vertex_colors.json new file mode 100644 index 0000000..b97ddf8 --- /dev/null +++ b/examples/nitro_engine/model_with_vertex_color/assets/sphere_vertex_colors.json @@ -0,0 +1,4 @@ +{ + "texture": [ 256, 256], + "use-vertex-color": true +} diff --git a/examples/nitro_engine/model_with_vertex_color/assets/sphere_vertex_colors.obj b/examples/nitro_engine/model_with_vertex_color/assets/sphere_vertex_colors.obj new file mode 100644 index 0000000..72c12cd --- /dev/null +++ b/examples/nitro_engine/model_with_vertex_color/assets/sphere_vertex_colors.obj @@ -0,0 +1,211 @@ +# Blender 3.4.1 +# www.blender.org +mtllib sphere_vertex_colors.mtl +o Sphere +v 0.000000 0.500000 0.000000 1.0000 0.0000 0.0000 +v 0.172746 0.404509 -0.237764 1.0000 0.0000 0.0000 +v 0.279509 0.154508 -0.384710 1.0000 0.0000 0.0000 +v 0.279509 -0.154508 -0.384710 1.0000 0.0000 0.0000 +v 0.172746 -0.404509 -0.237764 1.0000 0.0000 0.0000 +v 0.279509 0.404509 -0.090818 1.0000 0.0000 0.0000 +v 0.452254 0.154508 -0.146946 1.0000 0.0000 0.0000 +v 0.452254 -0.154508 -0.146946 1.0000 0.0000 0.0000 +v 0.279509 -0.404509 -0.090818 1.0000 0.0000 0.0000 +v 0.279509 0.404509 0.090818 1.0000 0.0000 0.0000 +v 0.452254 0.154508 0.146946 1.0000 0.0000 0.0000 +v 0.452254 -0.154508 0.146946 1.0000 0.0000 0.0000 +v 0.279509 -0.404509 0.090818 1.0000 0.0000 0.0000 +v 0.172746 0.404509 0.237764 1.0000 0.0000 0.0000 +v 0.279509 0.154508 0.384710 0.0000 1.0000 0.0000 +v 0.279509 -0.154508 0.384710 0.0000 1.0000 0.0000 +v 0.172746 -0.404509 0.237764 0.0000 1.0000 0.0000 +v 0.000000 0.404509 0.293893 0.0000 1.0000 0.0000 +v 0.000000 0.154508 0.475528 0.0000 1.0000 0.0000 +v 0.000000 -0.154508 0.475528 0.0000 1.0000 0.0000 +v 0.000000 -0.404509 0.293893 0.0000 1.0000 0.0000 +v -0.172746 0.404509 0.237764 0.0000 1.0000 0.0000 +v -0.279508 0.154508 0.384710 0.0000 1.0000 0.0000 +v -0.279508 -0.154508 0.384710 0.0000 1.0000 0.0000 +v -0.172746 -0.404509 0.237764 0.0000 1.0000 0.0000 +v -0.279508 0.404509 0.090818 0.0000 1.0000 0.0000 +v -0.452254 0.154508 0.146946 0.0000 1.0000 0.0000 +v -0.452254 -0.154508 0.146946 0.0000 1.0000 0.0000 +v -0.279508 -0.404509 0.090818 0.0000 0.0000 1.0000 +v 0.000000 -0.500000 -0.000000 0.0000 0.0000 1.0000 +v -0.279509 0.404509 -0.090818 0.0000 0.0000 1.0000 +v -0.452254 0.154508 -0.146946 0.0000 0.0000 1.0000 +v -0.452254 -0.154508 -0.146946 0.0000 0.0000 1.0000 +v -0.279509 -0.404509 -0.090818 0.0000 0.0000 1.0000 +v -0.172746 0.404509 -0.237764 0.0000 0.0000 1.0000 +v -0.279509 0.154508 -0.384710 0.0000 0.0000 1.0000 +v -0.279509 -0.154508 -0.384710 0.0000 0.0000 1.0000 +v -0.172746 -0.404509 -0.237764 0.0000 0.0000 1.0000 +v 0.000000 0.404509 -0.293893 0.0000 0.0000 1.0000 +v 0.000000 0.154508 -0.475528 0.0000 0.0000 1.0000 +v 0.000000 -0.154508 -0.475528 0.0000 0.0000 1.0000 +v 0.000000 -0.404509 -0.293893 0.0000 0.0000 1.0000 +vn 0.0999 -0.9463 -0.3075 +vn 0.3090 -0.0000 -0.9511 +vn 0.0999 0.9463 -0.3075 +vn 0.2542 -0.5685 -0.7824 +vn 0.2542 0.5685 -0.7824 +vn 0.2615 -0.9463 -0.1900 +vn 0.8090 -0.0000 -0.5878 +vn 0.2615 0.9463 -0.1900 +vn 0.6656 -0.5685 -0.4836 +vn 0.6656 0.5685 -0.4836 +vn 0.3233 -0.9463 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn 0.3233 0.9463 -0.0000 +vn 0.8227 -0.5685 -0.0000 +vn 0.8227 0.5685 -0.0000 +vn 0.2615 -0.9463 0.1900 +vn 0.8090 -0.0000 0.5878 +vn 0.2615 0.9463 0.1900 +vn 0.6656 -0.5685 0.4836 +vn 0.6656 0.5685 0.4836 +vn 0.0999 -0.9463 0.3075 +vn 0.3090 -0.0000 0.9511 +vn 0.0999 0.9463 0.3075 +vn 0.2542 -0.5685 0.7824 +vn 0.2542 0.5685 0.7824 +vn -0.0999 -0.9463 0.3075 +vn -0.3090 -0.0000 0.9511 +vn -0.0999 0.9463 0.3075 +vn -0.2542 -0.5685 0.7824 +vn -0.2542 0.5685 0.7824 +vn -0.2615 -0.9463 0.1900 +vn -0.8090 -0.0000 0.5878 +vn -0.2615 0.9463 0.1900 +vn -0.6656 -0.5685 0.4836 +vn -0.6656 0.5685 0.4836 +vn -0.3233 -0.9463 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.3233 0.9463 -0.0000 +vn -0.8227 -0.5685 -0.0000 +vn -0.8227 0.5685 -0.0000 +vn -0.2615 -0.9463 -0.1900 +vn -0.8090 -0.0000 -0.5878 +vn -0.2615 0.9463 -0.1900 +vn -0.6656 -0.5685 -0.4836 +vn -0.6656 0.5685 -0.4836 +vn -0.0999 -0.9463 -0.3075 +vn -0.3090 -0.0000 -0.9511 +vn -0.0999 0.9463 -0.3075 +vn -0.2542 -0.5685 -0.7824 +vn -0.2542 0.5685 -0.7824 +vt 0.650000 1.000000 +vt 0.550000 1.000000 +vt 0.450000 1.000000 +vt 0.350000 1.000000 +vt 0.250000 1.000000 +vt 0.150000 1.000000 +vt 0.050000 1.000000 +vt 0.950000 1.000000 +vt 0.850000 1.000000 +vt 0.750000 1.000000 +vt 0.600000 0.800000 +vt 0.600000 0.600000 +vt 0.600000 0.400000 +vt 0.600000 0.200000 +vt 0.500000 0.800000 +vt 0.500000 0.600000 +vt 0.500000 0.400000 +vt 0.500000 0.200000 +vt 0.400000 0.800000 +vt 0.400000 0.600000 +vt 0.400000 0.400000 +vt 0.400000 0.200000 +vt 0.300000 0.800000 +vt 0.300000 0.600000 +vt 0.300000 0.400000 +vt 0.300000 0.200000 +vt 0.200000 0.800000 +vt 0.200000 0.600000 +vt 0.200000 0.400000 +vt 0.200000 0.200000 +vt 0.100000 0.800000 +vt 0.100000 0.600000 +vt 0.100000 0.400000 +vt 0.100000 0.200000 +vt 0.000000 0.800000 +vt 1.000000 0.800000 +vt 0.000000 0.600000 +vt 1.000000 0.600000 +vt 0.000000 0.400000 +vt 1.000000 0.400000 +vt 0.000000 0.200000 +vt 1.000000 0.200000 +vt 0.650000 0.000000 +vt 0.550000 0.000000 +vt 0.450000 0.000000 +vt 0.350000 0.000000 +vt 0.250000 0.000000 +vt 0.150000 0.000000 +vt 0.050000 0.000000 +vt 0.950000 0.000000 +vt 0.850000 0.000000 +vt 0.750000 0.000000 +vt 0.900000 0.800000 +vt 0.900000 0.600000 +vt 0.900000 0.400000 +vt 0.900000 0.200000 +vt 0.800000 0.800000 +vt 0.800000 0.600000 +vt 0.800000 0.400000 +vt 0.800000 0.200000 +vt 0.700000 0.800000 +vt 0.700000 0.600000 +vt 0.700000 0.400000 +vt 0.700000 0.200000 +s 0 +f 30/43/1 42/64/1 5/14/1 +f 41/63/2 40/62/2 3/12/2 4/13/2 +f 39/61/3 1/1/3 2/11/3 +f 42/64/4 41/63/4 4/13/4 5/14/4 +f 40/62/5 39/61/5 2/11/5 3/12/5 +f 30/44/6 5/14/6 9/18/6 +f 4/13/7 3/12/7 7/16/7 8/17/7 +f 2/11/8 1/2/8 6/15/8 +f 5/14/9 4/13/9 8/17/9 9/18/9 +f 3/12/10 2/11/10 6/15/10 7/16/10 +f 30/45/11 9/18/11 13/22/11 +f 8/17/12 7/16/12 11/20/12 12/21/12 +f 6/15/13 1/3/13 10/19/13 +f 9/18/14 8/17/14 12/21/14 13/22/14 +f 7/16/15 6/15/15 10/19/15 11/20/15 +f 30/46/16 13/22/16 17/26/16 +f 12/21/17 11/20/17 15/24/17 16/25/17 +f 10/19/18 1/4/18 14/23/18 +f 13/22/19 12/21/19 16/25/19 17/26/19 +f 11/20/20 10/19/20 14/23/20 15/24/20 +f 30/47/21 17/26/21 21/30/21 +f 16/25/22 15/24/22 19/28/22 20/29/22 +f 14/23/23 1/5/23 18/27/23 +f 17/26/24 16/25/24 20/29/24 21/30/24 +f 15/24/25 14/23/25 18/27/25 19/28/25 +f 30/48/26 21/30/26 25/34/26 +f 20/29/27 19/28/27 23/32/27 24/33/27 +f 18/27/28 1/6/28 22/31/28 +f 21/30/29 20/29/29 24/33/29 25/34/29 +f 19/28/30 18/27/30 22/31/30 23/32/30 +f 30/49/31 25/34/31 29/41/31 +f 24/33/32 23/32/32 27/37/32 28/39/32 +f 22/31/33 1/7/33 26/35/33 +f 25/34/34 24/33/34 28/39/34 29/41/34 +f 23/32/35 22/31/35 26/35/35 27/37/35 +f 30/50/36 29/42/36 34/56/36 +f 28/40/37 27/38/37 32/54/37 33/55/37 +f 26/36/38 1/8/38 31/53/38 +f 29/42/39 28/40/39 33/55/39 34/56/39 +f 27/38/40 26/36/40 31/53/40 32/54/40 +f 30/51/41 34/56/41 38/60/41 +f 33/55/42 32/54/42 36/58/42 37/59/42 +f 31/53/43 1/9/43 35/57/43 +f 34/56/44 33/55/44 37/59/44 38/60/44 +f 32/54/45 31/53/45 35/57/45 36/58/45 +f 30/52/46 38/60/46 42/64/46 +f 37/59/47 36/58/47 40/62/47 41/63/47 +f 35/57/48 1/10/48 39/61/48 +f 38/60/49 37/59/49 41/63/49 42/64/49 +f 36/58/50 35/57/50 39/61/50 40/62/50 diff --git a/examples/nitro_engine/model_with_vertex_color/assets/teapot.grit b/examples/nitro_engine/model_with_vertex_color/assets/teapot.grit new file mode 100644 index 0000000..207c056 --- /dev/null +++ b/examples/nitro_engine/model_with_vertex_color/assets/teapot.grit @@ -0,0 +1,2 @@ +# 16 bit texture bitmap, force alpha bit to 1 +-gx -gb -gB16 -gT! diff --git a/examples/nitro_engine/model_with_vertex_color/assets/teapot.png b/examples/nitro_engine/model_with_vertex_color/assets/teapot.png new file mode 100644 index 0000000..eafd9fa Binary files /dev/null and b/examples/nitro_engine/model_with_vertex_color/assets/teapot.png differ diff --git a/examples/nitro_engine/model_with_vertex_color/build.py b/examples/nitro_engine/model_with_vertex_color/build.py new file mode 100644 index 0000000..3ad4435 --- /dev/null +++ b/examples/nitro_engine/model_with_vertex_color/build.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['NE', 'nds9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nitro-engine'] +) +arm9.add_grit(['assets']) +arm9.add_nitro_engine_obj(['assets']) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9], + game_title='NE: Model with vtx color', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nitro_engine/model_with_vertex_color/source/main.c b/examples/nitro_engine/model_with_vertex_color/source/main.c new file mode 100644 index 0000000..731979a --- /dev/null +++ b/examples/nitro_engine/model_with_vertex_color/source/main.c @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2008-2011, 2019, 2022-2023 +// +// This file is part of Nitro Engine + +#include + +#include "models/sphere_vertex_colors_dl.h" +#include "grit/teapot_png.h" + +NE_Camera *Camera; +NE_Model *Model; +NE_Material *Material; + +void Draw3DScene(void) +{ + NE_CameraUse(Camera); + NE_ModelDraw(Model); +} + +int main(void) +{ + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + // Init Nitro Engine in normal 3D mode + NE_Init3D(); + + // libnds uses VRAM_C for the text console, reserve A and B only + NE_TextureSystemReset(0, 0, NE_VRAM_AB); + // Init console in non-3D screen + consoleDemoInit(); + + // Allocate space for the objects we'll use + Model = NE_ModelCreate(NE_Static); + Camera = NE_CameraCreate(); + Material = NE_MaterialCreate(); + + // Set coordinates for the camera + NE_CameraSet(Camera, + -2, 0, 0, // Position + 0, 0, 0, // Look at + 0, 1, 0); // Up direction + + // Load mesh from RAM and assign it to the object "Model". + NE_ModelLoadStaticMesh(Model, (u32 *)sphere_vertex_colors_dl); + // Load a RGB texture from RAM and assign it to "Material". + NE_MaterialTexLoad(Material, NE_RGB5, 256, 256, NE_TEXGEN_TEXCOORD, + (u8 *)teapot_pngBitmap); + + // Assign texture to model... + NE_ModelSetMaterial(Model, Material); + + // We set up a light and its color. This light will be ignored in this + // example because the model sets up vertex colors manually, and the color + // command overrides the normal commands. + NE_LightSet(0, NE_White, -0.5, -0.5, -0.5); + + while (1) + { + // Wait for next frame + NE_WaitForVBL(0); + + // Get keys information + scanKeys(); + uint32_t keys = keysHeld(); + + printf("\x1b[0;0HPad: Rotate."); + + // Rotate model using the pad + if (keys & KEY_UP) + NE_ModelRotate(Model, 0, 0, -2); + if (keys & KEY_DOWN) + NE_ModelRotate(Model, 0, 0, 2); + if (keys & KEY_RIGHT) + NE_ModelRotate(Model, 0, 2, 0); + if (keys & KEY_LEFT) + NE_ModelRotate(Model, 0, -2, 0); + + // Draw scene + NE_Process(Draw3DScene); + } + + return 0; +} diff --git a/examples/nitro_engine/paletted_texture/.gitignore b/examples/nitro_engine/paletted_texture/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nitro_engine/paletted_texture/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nitro_engine/paletted_texture/architectds b/examples/nitro_engine/paletted_texture/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/paletted_texture/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/paletted_texture/assets/a3pal32.grit b/examples/nitro_engine/paletted_texture/assets/a3pal32.grit new file mode 100644 index 0000000..f453710 --- /dev/null +++ b/examples/nitro_engine/paletted_texture/assets/a3pal32.grit @@ -0,0 +1,2 @@ +# 3 bits of alpha, 5 bits of color index +-gx -gb -gBa3i5 -gT! diff --git a/examples/nitro_engine/paletted_texture/assets/a3pal32.png b/examples/nitro_engine/paletted_texture/assets/a3pal32.png new file mode 100644 index 0000000..1c77c50 Binary files /dev/null and b/examples/nitro_engine/paletted_texture/assets/a3pal32.png differ diff --git a/examples/nitro_engine/paletted_texture/assets/a5pal8.grit b/examples/nitro_engine/paletted_texture/assets/a5pal8.grit new file mode 100644 index 0000000..d1c5098 --- /dev/null +++ b/examples/nitro_engine/paletted_texture/assets/a5pal8.grit @@ -0,0 +1,2 @@ +# 5 bits of alpha, 3 bits of color index +-gx -gb -gBa5i3 -gT! diff --git a/examples/nitro_engine/paletted_texture/assets/a5pal8.png b/examples/nitro_engine/paletted_texture/assets/a5pal8.png new file mode 100644 index 0000000..bd552af Binary files /dev/null and b/examples/nitro_engine/paletted_texture/assets/a5pal8.png differ diff --git a/examples/nitro_engine/paletted_texture/build.py b/examples/nitro_engine/paletted_texture/build.py new file mode 100644 index 0000000..0c2d713 --- /dev/null +++ b/examples/nitro_engine/paletted_texture/build.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['NE', 'nds9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nitro-engine'] +) +arm9.add_grit(['assets']) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9], + game_title='NE: Paletted texture', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nitro_engine/paletted_texture/source/main.c b/examples/nitro_engine/paletted_texture/source/main.c new file mode 100644 index 0000000..fc7986c --- /dev/null +++ b/examples/nitro_engine/paletted_texture/source/main.c @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2008-2011, 2019, 2022 +// +// This file is part of Nitro Engine + +#include + +#include "grit/a5pal8_png.h" +#include "grit/a3pal32_png.h" + +NE_Material *Material1, *Material2; +NE_Palette *Palette1, *Palette2; + +void Draw3DScene(void) +{ + NE_2DViewInit(); + + NE_2DDrawTexturedQuad(0, 0, + 256, 192, + 0, Material1); +} + +void Draw3DScene2(void) +{ + NE_2DViewInit(); + + NE_2DDrawTexturedQuad(64, 32, + 64 + 128, 32 + 128, + 0, Material2); +} + +int main(void) +{ + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + // Init 3D mode + NE_InitDual3D(); + + // Allocate objects + Material1 = NE_MaterialCreate(); + Material2 = NE_MaterialCreate(); + Palette1 = NE_PaletteCreate(); + Palette2 = NE_PaletteCreate(); + + // Load part of the texture ignoring some of its height. You can't do + // this with width because of how textures are laid out in VRAM. + NE_MaterialTexLoad(Material1, NE_A3PAL32, 256, 192, NE_TEXGEN_TEXCOORD, + (u8 *)a3pal32_pngBitmap); + + // Load complete texture + NE_MaterialTexLoad(Material2, NE_A5PAL8, 256, 256, NE_TEXGEN_TEXCOORD, + (u8 *)a5pal8_pngBitmap); + + NE_PaletteLoad(Palette1, (u16 *)a3pal32_pngPal, 32, NE_A3PAL32); + NE_PaletteLoad(Palette2, (u16 *)a5pal8_pngPal, 32, NE_A5PAL8); + + NE_MaterialSetPalette(Material1, Palette1); + NE_MaterialSetPalette(Material2, Palette2); + + while (1) + { + NE_WaitForVBL(0); + + NE_ProcessDual(Draw3DScene, Draw3DScene2); + } + + return 0; +} diff --git a/examples/nitro_engine/sdroot_animated_model/.gitignore b/examples/nitro_engine/sdroot_animated_model/.gitignore new file mode 100644 index 0000000..6f31a18 --- /dev/null +++ b/examples/nitro_engine/sdroot_animated_model/.gitignore @@ -0,0 +1,9 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja +sdroot/ diff --git a/examples/nitro_engine/sdroot_animated_model/architectds b/examples/nitro_engine/sdroot_animated_model/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/sdroot_animated_model/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.blend b/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.blend new file mode 100644 index 0000000..494f3b5 Binary files /dev/null and b/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.blend differ diff --git a/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.dsmparam b/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.dsmparam new file mode 100644 index 0000000..e69de29 diff --git a/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.grit b/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.grit new file mode 100644 index 0000000..207c056 --- /dev/null +++ b/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.grit @@ -0,0 +1,2 @@ +# 16 bit texture bitmap, force alpha bit to 1 +-gx -gb -gB16 -gT! diff --git a/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.json b/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.json new file mode 100644 index 0000000..080a5f6 --- /dev/null +++ b/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.json @@ -0,0 +1,11 @@ +{ + "texture": [256, 256], + "blender-fix": true, + "export-base-pose": false, + "animations": [ + { + "file": "wave.md5anim", + "skip-frames": 1 + } + ] +} diff --git a/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.md5mesh b/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.md5mesh new file mode 100644 index 0000000..d00409f --- /dev/null +++ b/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.md5mesh @@ -0,0 +1,1730 @@ +MD5Version 10 // Parameters used during export: Reorient: False; Scale: 1.0 +commandline "" + +numJoints 16 +numMeshes 1 + +joints { + "Base.Bone" -1 ( 0.0000000000 0.0000000000 0.0000000000 ) ( -0.7071068287 -0.0000000000 -0.0000000000 ) + "Spine.Low" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( -0.7072144747 -0.0000000843 -0.0000000843 ) + "Spine.High" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( -0.7069305778 -0.0000001686 -0.0000001685 ) + "Head" 2 ( -0.0000000000 0.0000000000 5.6328477859 ) ( -0.7071068287 -0.0000000843 -0.0000000843 ) + "Chest.Left" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Arm.Upper.Left" 4 ( 0.0000000000 1.0032964945 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Arm.End.Left" 5 ( 0.0000000000 2.6084918976 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Chest.Right" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Arm.Upper.Right" 7 ( 0.0000000000 -1.0177762508 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Arm.End..Right" 8 ( 0.0000000000 -2.7045760155 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Pelvis.Left" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( 0.0060729762 -0.0000000000 -0.0000000000 ) + "Leg-Upper.Left" 10 ( 0.0000000000 0.4849596322 2.9163727760 ) ( 0.7071067095 -0.0000000843 0.0000000843 ) + "Leg-Lower.Left" 11 ( 0.0000000000 0.4849596322 1.5501549244 ) ( 0.7071067095 0.0000000000 0.0000000000 ) + "Pelvis.Right" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( 0.9999825358 0.0000000028 -0.0000004768 ) + "Leg-Upper.Right" 13 ( -0.0000000000 -0.5500909090 2.9157583714 ) ( 0.7071068287 0.0000003372 -0.0000003372 ) + "Leg-Lower.Right" 14 ( -0.0000000000 -0.5500909090 1.5495405197 ) ( 0.7071068287 0.0000003372 -0.0000003372 ) +} + +mesh { + shader "Material" + numverts 576 + vert 0 ( 0.8750000000 0.2500000000 ) 0 1 + vert 1 ( 0.8750000000 0.2500000000 ) 1 1 + vert 2 ( 0.0113541363 0.4622119665 ) 2 1 + vert 3 ( 0.0189200211 0.4281336665 ) 3 1 + vert 4 ( 0.0214311108 0.4167795181 ) 4 1 + vert 5 ( 0.3423711956 0.6714493930 ) 5 1 + vert 6 ( 0.4428113401 0.7197439075 ) 6 1 + vert 7 ( 0.3196628094 0.4622119665 ) 7 1 + vert 8 ( 0.2384368777 0.7197439075 ) 8 1 + vert 9 ( 0.3423711061 0.5182476044 ) 9 1 + vert 10 ( 0.3095858395 0.4167795181 ) 10 1 + vert 11 ( 0.3120969832 0.4281336665 ) 11 1 + vert 12 ( 0.1541543156 0.4622119665 ) 12 1 + vert 13 ( 0.0113541409 0.7197439075 ) 13 1 + vert 14 ( 0.4851713479 0.6714494228 ) 14 1 + vert 15 ( 0.1440773457 0.4167795181 ) 15 1 + vert 16 ( 0.1465884447 0.4281336665 ) 16 1 + vert 17 ( 0.1768626422 0.4622119665 ) 17 1 + vert 18 ( 0.1844285280 0.4281336665 ) 18 1 + vert 19 ( 0.1869396269 0.4167795181 ) 19 1 + vert 20 ( 0.1901422739 0.7083897591 ) 20 1 + vert 21 ( 0.2157285959 0.7197439075 ) 21 1 + vert 22 ( 0.6686197519 0.3548163772 ) 22 1 + vert 23 ( 0.3423711360 0.1277336478 ) 23 1 + vert 24 ( 0.0255380198 0.5737641454 ) 24 1 + vert 25 ( 0.0455269776 0.5866629481 ) 25 1 + vert 26 ( 0.5996038318 0.3548163772 ) 26 1 + vert 27 ( 0.1199815795 0.5866629481 ) 27 1 + vert 28 ( 0.0908734500 0.4167796969 ) 28 1 + vert 29 ( 0.1006828696 0.4054255486 ) 29 1 + vert 30 ( 0.4089916945 0.1277336478 ) 30 1 + vert 31 ( 0.5078796148 0.3548163772 ) 31 1 + vert 32 ( 0.0437058732 0.4746256471 ) 32 1 + vert 33 ( 0.0255379826 0.4888173342 ) 33 1 + vert 34 ( 0.2024006695 0.5639546812 ) 34 1 + vert 35 ( 0.1910465062 0.5737641454 ) 35 1 + vert 36 ( 0.2110354900 0.5866629481 ) 36 1 + vert 37 ( 0.6913279891 0.6970356703 ) 37 1 + vert 38 ( 0.8749999404 0.2500000000 ) 38 1 + vert 39 ( 0.2092143893 0.4746256471 ) 39 1 + vert 40 ( 0.1910464764 0.4888173342 ) 40 1 + vert 41 ( 0.7716981173 0.6970356703 ) 41 1 + vert 42 ( 0.3054790199 0.4888172746 ) 42 1 + vert 43 ( 0.2873110771 0.4746256471 ) 43 1 + vert 44 ( 0.2827706933 0.4859797955 ) 44 1 + vert 45 ( 0.7716981173 0.6970356703 ) 45 1 + vert 46 ( 0.7603439689 0.6970356703 ) 46 1 + vert 47 ( 0.2854900658 0.5866629481 ) 47 1 + vert 48 ( 0.3054789901 0.5737641156 ) 48 1 + vert 49 ( 0.1673034430 0.4054255486 ) 49 1 + vert 50 ( 0.1758200228 0.4167796969 ) 50 1 + vert 51 ( 0.1218025759 0.4746256471 ) 51 1 + vert 52 ( 0.5768955946 0.3548163772 ) 52 1 + vert 53 ( 0.6686196923 0.5351630747 ) 53 1 + vert 54 ( 0.6799738407 0.5351630747 ) 54 1 + vert 55 ( 0.3423711061 0.2853721380 ) 55 1 + vert 56 ( 0.6686196327 0.5124548674 ) 56 1 + vert 57 ( 0.5996038318 0.5351630747 ) 57 1 + vert 58 ( 0.5996037722 0.5124548674 ) 58 1 + vert 59 ( 0.1006828696 0.2477870584 ) 59 1 + vert 60 ( 0.5882496834 0.5351630747 ) 60 1 + vert 61 ( 0.4965255260 0.5351630747 ) 61 1 + vert 62 ( 0.5078796744 0.5351630747 ) 62 1 + vert 63 ( 0.5078796148 0.5124548674 ) 63 1 + vert 64 ( 0.4089916945 0.2853720784 ) 64 1 + vert 65 ( 0.0113540990 0.2435528636 ) 65 1 + vert 66 ( 0.6799738407 0.5393971503 ) 66 1 + vert 67 ( 0.6913279295 0.5393971801 ) 67 1 + vert 68 ( 0.6913279891 0.5166889131 ) 68 1 + vert 69 ( 0.0779746622 0.2435529232 ) 69 1 + vert 70 ( 0.8520681858 0.5166889131 ) 70 1 + vert 71 ( 0.8750000000 0.2500000000 ) 71 1 + vert 72 ( 0.2566326857 0.2250787616 ) 72 1 + vert 73 ( 0.7716981173 0.5393971503 ) 73 1 + vert 74 ( 0.7830522060 0.5393971801 ) 74 1 + vert 75 ( 0.7830522656 0.5166889131 ) 75 1 + vert 76 ( 0.1900120974 0.2250788212 ) 76 1 + vert 77 ( 0.7603439093 0.5166889131 ) 77 1 + vert 78 ( 0.7603438497 0.5393971801 ) 78 1 + vert 79 ( 0.7716980577 0.5393971503 ) 79 1 + vert 80 ( 0.5882496834 0.5351630747 ) 80 1 + vert 81 ( 0.1673034430 0.2477869987 ) 81 1 + vert 82 ( 0.5768954754 0.5124548674 ) 82 1 + vert 83 ( 0.5768955350 0.5351630747 ) 83 1 + vert 84 ( 0.6686196923 0.6970356405 ) 84 1 + vert 85 ( 0.3423711360 0.4813070297 ) 85 1 + vert 86 ( 0.3423711061 0.4699528813 ) 86 1 + vert 87 ( 0.5996038318 0.6970356405 ) 87 1 + vert 88 ( 0.1006828621 0.0632063746 ) 88 1 + vert 89 ( 0.1006828621 0.0518521667 ) 89 1 + vert 90 ( 0.4089916348 0.4699529409 ) 90 1 + vert 91 ( 0.4089916646 0.4813070297 ) 91 1 + vert 92 ( 0.5078796744 0.6970356405 ) 92 1 + vert 93 ( 0.0113540990 0.4054253697 ) 93 1 + vert 94 ( 0.6913279295 0.3548164368 ) 94 1 + vert 95 ( 0.0113540990 0.4167795777 ) 95 1 + vert 96 ( 0.0779746622 0.4054254293 ) 96 1 + vert 97 ( 0.0779746622 0.4167795181 ) 97 1 + vert 98 ( 0.8520681858 0.3548164368 ) 98 1 + vert 99 ( 0.2566326857 0.0632063150 ) 99 1 + vert 100 ( 0.7830522656 0.3548164368 ) 100 1 + vert 101 ( 0.2566326857 0.0518521667 ) 101 1 + vert 102 ( 0.1900120974 0.0632063746 ) 102 1 + vert 103 ( 0.1900120974 0.0518521667 ) 103 1 + vert 104 ( 0.7603439093 0.3548164368 ) 104 1 + vert 105 ( 0.1673034281 0.0632063150 ) 105 1 + vert 106 ( 0.5768955350 0.6970356405 ) 106 1 + vert 107 ( 0.1673034281 0.0518521667 ) 107 1 + vert 108 ( 0.4655197561 0.9819033202 ) 108 1 + vert 109 ( 0.0113541409 0.9886458702 ) 109 1 + vert 110 ( 0.1541543454 0.6249296069 ) 110 1 + vert 111 ( 0.4690954387 1.0000000000 ) 111 1 + vert 112 ( 0.5037595034 0.9886458423 ) 112 1 + vert 113 ( 0.4655196667 0.7910139561 ) 113 1 + vert 114 ( 0.2151023746 0.7083897591 ) 114 1 + vert 115 ( 0.1804383993 0.6970356405 ) 115 1 + vert 116 ( 0.1768626571 0.6249295175 ) 116 1 + vert 117 ( 0.2157286257 0.9886458702 ) 117 1 + vert 118 ( 0.5700801611 0.9886458432 ) 118 1 + vert 119 ( 0.6047441959 1.0000000000 ) 119 1 + vert 120 ( 0.0113541521 0.6249295175 ) 120 1 + vert 121 ( 0.4428113401 0.9886458702 ) 121 1 + vert 122 ( 0.6083199978 0.9819033183 ) 122 1 + vert 123 ( 0.3196628690 0.6249296069 ) 123 1 + vert 124 ( 0.3160871267 0.6970356405 ) 124 1 + vert 125 ( 0.2814231217 0.7083897591 ) 125 1 + vert 126 ( 0.6083198786 0.7910138816 ) 126 1 + vert 127 ( 0.2384368479 0.9886458702 ) 127 1 + vert 128 ( 0.4973703027 0.9665126987 ) 128 1 + vert 129 ( 0.5113238692 0.9849906061 ) 129 1 + vert 130 ( 0.5200785995 0.9736364484 ) 130 1 + vert 131 ( 0.5529161692 0.0113541484 ) 131 1 + vert 132 ( 0.5764693618 0.8064045161 ) 132 1 + vert 133 ( 0.5625157356 0.7879266143 ) 133 1 + vert 134 ( 0.2679870129 0.0846714377 ) 134 1 + vert 135 ( 0.5651151538 0.8106349111 ) 135 1 + vert 136 ( 0.5078796148 0.0113541484 ) 136 1 + vert 137 ( 0.5625157952 0.9849906052 ) 137 1 + vert 138 ( 0.5764693618 0.9665126987 ) 138 1 + vert 139 ( 0.5651152134 0.9622823149 ) 139 1 + vert 140 ( 0.4973703623 0.8064045161 ) 140 1 + vert 141 ( 0.9148896933 0.0328192115 ) 141 1 + vert 142 ( 0.9262437820 0.0328192711 ) 142 1 + vert 143 ( 0.5113239288 0.7879266143 ) 143 1 + vert 144 ( 0.5764693618 0.9105099961 ) 144 1 + vert 145 ( 0.5537610650 0.8991558626 ) 145 1 + vert 146 ( 0.9712803960 0.0328193307 ) 146 1 + vert 147 ( 0.9826345444 0.0328193307 ) 147 1 + vert 148 ( 0.4973703027 0.9105100036 ) 148 1 + vert 149 ( 0.9262437820 0.0328193307 ) 149 1 + vert 150 ( 0.5200785995 0.9105100036 ) 150 1 + vert 151 ( 0.5200786591 0.8991558552 ) 151 1 + vert 152 ( 0.4973703027 0.8621021807 ) 152 1 + vert 153 ( 0.5200786591 0.8734562993 ) 153 1 + vert 154 ( 0.5200785995 0.8621021509 ) 154 1 + vert 155 ( 0.9829396009 0.3762816191 ) 155 1 + vert 156 ( 0.5764693618 0.8621021509 ) 156 1 + vert 157 ( 0.9265488386 0.3762816191 ) 157 1 + vert 158 ( 0.9379029274 0.3762816787 ) 158 1 + vert 159 ( 0.5537610054 0.8734562993 ) 159 1 + vert 160 ( 0.5078796148 0.1748891473 ) 160 1 + vert 161 ( 0.5078796148 0.1521807909 ) 161 1 + vert 162 ( 0.4965254664 0.1521808505 ) 162 1 + vert 163 ( 0.4721183777 0.3127338290 ) 163 1 + vert 164 ( 0.5415620208 0.1748891473 ) 164 1 + vert 165 ( 0.8747765422 0.5398166478 ) 165 1 + vert 166 ( 0.5529162288 0.1521808505 ) 166 1 + vert 167 ( 0.5415620804 0.1521809101 ) 167 1 + vert 168 ( 0.5642703176 0.1748891473 ) 168 1 + vert 169 ( 0.9262438416 0.1736459732 ) 169 1 + vert 170 ( 0.9148896933 0.1736459732 ) 170 1 + vert 171 ( 0.9148896337 0.1963542700 ) 171 1 + vert 172 ( 0.5979527235 0.1748891473 ) 172 1 + vert 173 ( 0.2793411314 0.2482064962 ) 173 1 + vert 174 ( 0.2793411613 0.2254981399 ) 174 1 + vert 175 ( 0.2679870129 0.2254981995 ) 175 1 + vert 176 ( 0.4317001402 0.3127338886 ) 176 1 + vert 177 ( 0.9826345444 0.1736460328 ) 177 1 + vert 178 ( 0.9712803364 0.1736460924 ) 178 1 + vert 179 ( 0.9712803960 0.1963543892 ) 179 1 + vert 180 ( 0.9151946902 0.5398166776 ) 180 1 + vert 181 ( 0.9375978708 0.1963543892 ) 181 1 + vert 182 ( 0.9375979304 0.1736460924 ) 182 1 + vert 183 ( 0.9262437820 0.1736460328 ) 183 1 + vert 184 ( 0.8747764826 0.1963542700 ) 184 1 + vert 185 ( 0.9829396009 0.5171083212 ) 185 1 + vert 186 ( 0.9715854526 0.5171083510 ) 186 1 + vert 187 ( 0.9715854526 0.5398166478 ) 187 1 + vert 188 ( 0.3194543123 0.2482064366 ) 188 1 + vert 189 ( 0.9379030466 0.5398166478 ) 189 1 + vert 190 ( 0.9379030466 0.5171083212 ) 190 1 + vert 191 ( 0.9265488386 0.5171083212 ) 191 1 + vert 192 ( 0.5078796148 0.3321082592 ) 192 1 + vert 193 ( 0.4965255260 0.3321081996 ) 193 1 + vert 194 ( 0.4992022514 0.7615630478 ) 194 1 + vert 195 ( 0.5415620804 0.3321082592 ) 195 1 + vert 196 ( 0.4655197263 0.7615630627 ) 196 1 + vert 197 ( 0.5529162288 0.3321081996 ) 197 1 + vert 198 ( 0.5642702579 0.3321082592 ) 198 1 + vert 199 ( 0.9148896933 0.3535734415 ) 199 1 + vert 200 ( 0.5642703176 0.3434623480 ) 200 1 + vert 201 ( 0.5979527831 0.3321082592 ) 201 1 + vert 202 ( 0.5979527831 0.3434623480 ) 202 1 + vert 203 ( 0.2793411613 0.4054255486 ) 203 1 + vert 204 ( 0.9826345444 0.3535733819 ) 204 1 + vert 205 ( 0.9712803960 0.3535733819 ) 205 1 + vert 206 ( 0.4992022216 0.7211448550 ) 206 1 + vert 207 ( 0.9262437820 0.3535733819 ) 207 1 + vert 208 ( 0.4655197263 0.7211449146 ) 208 1 + vert 209 ( 0.9375979304 0.3535733819 ) 209 1 + vert 210 ( 0.8747765422 0.3535733819 ) 210 1 + vert 211 ( 0.9715854526 0.6970356703 ) 211 1 + vert 212 ( 0.8747765422 0.3649275303 ) 212 1 + vert 213 ( 0.3194543123 0.4054255486 ) 213 1 + vert 214 ( 0.3194543123 0.4167796969 ) 214 1 + vert 215 ( 0.9379030466 0.6970357001 ) 215 1 + vert 216 ( 0.8717506528 0.9513412639 ) 216 1 + vert 217 ( 0.8831048012 0.9460025094 ) 217 1 + vert 218 ( 0.3724106550 0.5624975562 ) 218 1 + vert 219 ( 0.8170980215 0.2076858282 ) 219 1 + vert 220 ( 0.8717506528 0.9886458628 ) 220 1 + vert 221 ( 0.8420943022 0.2831348181 ) 221 1 + vert 222 ( 0.4551318288 0.5624975562 ) 222 1 + vert 223 ( 0.8831048012 0.9939846145 ) 223 1 + vert 224 ( 0.8170980215 0.1587125063 ) 224 1 + vert 225 ( 0.8284521103 0.1508482695 ) 225 1 + vert 226 ( 0.3897802234 0.6420434117 ) 226 1 + vert 227 ( 0.5960801840 0.7615630627 ) 227 1 + vert 228 ( 0.8420943022 0.3321081400 ) 228 1 + vert 229 ( 0.5960800648 0.7242584825 ) 229 1 + vert 230 ( 0.4377623200 0.6420434117 ) 230 1 + vert 231 ( 0.8534483314 0.3399725556 ) 231 1 + vert 232 ( 0.8164433241 0.8922467679 ) 232 1 + vert 233 ( 0.7993190289 0.2190399170 ) 233 1 + vert 234 ( 0.8217107058 0.9149550349 ) 234 1 + vert 235 ( 0.8330649137 0.9077588320 ) 235 1 + vert 236 ( 0.7669651508 0.8922467604 ) 236 1 + vert 237 ( 0.7503436804 0.9077588320 ) 237 1 + vert 238 ( 0.8243153691 0.2831348777 ) 238 1 + vert 239 ( 0.7730519176 0.9036009014 ) 239 1 + vert 240 ( 0.8330648541 0.9711245559 ) 240 1 + vert 241 ( 0.8217107058 0.9639283530 ) 241 1 + vert 242 ( 0.5783011913 0.7615630776 ) 242 1 + vert 243 ( 0.8164434433 0.9866366293 ) 243 1 + vert 244 ( 0.7503436804 0.9711245559 ) 244 1 + vert 245 ( 0.7669650912 0.9866366293 ) 245 1 + vert 246 ( 0.5783011317 0.7242584825 ) 246 1 + vert 247 ( 0.7616977692 0.9639283493 ) 247 1 + vert 248 ( 0.6196740270 0.9886458712 ) 248 1 + vert 249 ( 0.8181428909 0.8902375251 ) 249 1 + vert 250 ( 0.8312636614 0.9098883271 ) 250 1 + vert 251 ( 0.8426177502 0.8902375326 ) 251 1 + vert 252 ( 0.7407905459 0.8642233163 ) 252 1 + vert 253 ( 0.7294365764 0.8642233014 ) 253 1 + vert 254 ( 0.7521448731 0.9098883271 ) 254 1 + vert 255 ( 0.7652655840 0.8902375326 ) 255 1 + vert 256 ( 0.6093068719 0.3321083784 ) 256 1 + vert 257 ( 0.8312636018 0.9689950645 ) 257 1 + vert 258 ( 0.8181428909 0.9886458609 ) 258 1 + vert 259 ( 0.6206609607 0.3321083188 ) 259 1 + vert 260 ( 0.7111338973 0.3321083188 ) 260 1 + vert 261 ( 0.7521448731 1.0000000000 ) 261 1 + vert 262 ( 0.7652655840 0.9886458609 ) 262 1 + vert 263 ( 0.7521449327 0.9689950645 ) 263 1 + vert 264 ( 0.6196740270 0.8869315833 ) 264 1 + vert 265 ( 0.6310282350 0.8869315758 ) 265 1 + vert 266 ( 0.7521449327 0.7658150196 ) 266 1 + vert 267 ( 0.7407906055 0.7625090182 ) 267 1 + vert 268 ( 0.8312637210 0.7658150196 ) 268 1 + vert 269 ( 0.7294364572 0.7625090480 ) 269 1 + vert 270 ( 0.6093068719 0.2303940654 ) 270 1 + vert 271 ( 0.6206610203 0.2303940654 ) 271 1 + vert 272 ( 0.7521448731 0.8642233759 ) 272 1 + vert 273 ( 0.7111338973 0.2303940058 ) 273 1 + vert 274 ( 0.8312635422 0.8642233759 ) 274 1 + vert 275 ( 0.6997797489 0.2303940654 ) 275 1 + vert 276 ( 0.4541654587 0.7538222075 ) 276 1 + vert 277 ( 0.4541654587 0.7197439075 ) 277 1 + vert 278 ( 0.4428113401 0.7083897591 ) 278 1 + vert 279 ( 0.3524481654 0.6970357299 ) 279 1 + vert 280 ( 0.4172250032 0.7083897591 ) 280 1 + vert 281 ( 0.4428113401 0.7083897591 ) 281 1 + vert 282 ( 0.2270827293 0.7538221925 ) 282 1 + vert 283 ( 0.2640231848 0.7083897591 ) 283 1 + vert 284 ( 0.2384368777 0.7083897591 ) 284 1 + vert 285 ( 0.3524481356 0.4926613569 ) 285 1 + vert 286 ( 0.0000000000 0.7538221925 ) 286 1 + vert 287 ( 0.0369404592 0.7083897591 ) 287 1 + vert 288 ( 0.0113541391 0.7083897591 ) 288 1 + vert 289 ( 0.4750943482 0.6970357299 ) 289 1 + vert 290 ( 0.2270827442 0.7538222075 ) 290 1 + vert 291 ( 0.2270827293 0.7197439075 ) 291 1 + vert 292 ( 0.2157285959 0.7083897591 ) 292 1 + vert 293 ( 0.4750943780 0.4926611781 ) 293 1 + vert 294 ( 0.2157285959 0.7083897591 ) 294 1 + vert 295 ( 0.6799738407 0.3548163772 ) 295 1 + vert 296 ( 0.6799738407 0.3434622288 ) 296 1 + vert 297 ( 0.3325617015 0.1163794994 ) 297 1 + vert 298 ( 0.6713390946 0.3434622288 ) 298 1 + vert 299 ( 0.5968844891 0.3434622288 ) 299 1 + vert 300 ( 0.5882496834 0.3434622288 ) 300 1 + vert 301 ( 0.1399705112 0.5737641156 ) 301 1 + vert 302 ( 0.5882496834 0.3548163772 ) 302 1 + vert 303 ( 0.4965254962 0.3548163772 ) 303 1 + vert 304 ( 0.5033392906 0.3434622288 ) 304 1 + vert 305 ( 0.2024006844 0.5753087997 ) 305 1 + vert 306 ( 0.0113541000 0.0632060766 ) 306 1 + vert 307 ( 0.6799738407 0.6970356703 ) 307 1 + vert 308 ( 0.2019880414 0.5767972767 ) 308 1 + vert 309 ( 0.2137548327 0.5753087997 ) 309 1 + vert 310 ( 0.2024006248 0.4859797955 ) 310 1 + vert 311 ( 0.0893287659 0.0575290918 ) 311 1 + vert 312 ( 0.8634223938 0.7027127445 ) 312 1 + vert 313 ( 0.1991951317 0.4799671173 ) 313 1 + vert 314 ( 0.2941248417 0.4973339438 ) 314 1 + vert 315 ( 0.2566326857 0.4054255486 ) 315 1 + vert 316 ( 0.2973303199 0.4799671173 ) 316 1 + vert 317 ( 0.2941249013 0.5753087997 ) 317 1 + vert 318 ( 0.1900121123 0.4054255486 ) 318 1 + vert 319 ( 0.2941249013 0.5639546812 ) 319 1 + vert 320 ( 0.2945375144 0.5767972767 ) 320 1 + vert 321 ( 0.5882496834 0.3548163772 ) 321 1 + vert 322 ( 0.5882496834 0.3434622288 ) 322 1 + vert 323 ( 0.1399704814 0.4888172746 ) 323 1 + vert 324 ( 0.6686197519 0.5238089561 ) 324 1 + vert 325 ( 0.6799738407 0.5238089561 ) 325 1 + vert 326 ( 0.3423711061 0.3080803156 ) 326 1 + vert 327 ( 0.5996037722 0.5238089561 ) 327 1 + vert 328 ( 0.5882496834 0.5124548376 ) 328 1 + vert 329 ( 0.5882496834 0.5238089561 ) 329 1 + vert 330 ( 0.1006828547 0.2250788212 ) 330 1 + vert 331 ( 0.4965255260 0.5238089561 ) 331 1 + vert 332 ( 0.4089916348 0.3080803752 ) 332 1 + vert 333 ( 0.5078796148 0.5238089561 ) 333 1 + vert 334 ( 0.6799738407 0.5166888833 ) 334 1 + vert 335 ( 0.6799738407 0.5280430317 ) 335 1 + vert 336 ( 0.0113541000 0.2208446264 ) 336 1 + vert 337 ( 0.6913279891 0.5280430317 ) 337 1 + vert 338 ( 0.8634223342 0.5166889131 ) 338 1 + vert 339 ( 0.8634223342 0.5280430317 ) 339 1 + vert 340 ( 0.0893287659 0.2265216708 ) 340 1 + vert 341 ( 0.8634223342 0.5337201059 ) 341 1 + vert 342 ( 0.7716981173 0.5166888833 ) 342 1 + vert 343 ( 0.7716981173 0.5280430317 ) 343 1 + vert 344 ( 0.2566326857 0.2477869987 ) 344 1 + vert 345 ( 0.7830522656 0.5280430317 ) 345 1 + vert 346 ( 0.7716980577 0.5166889131 ) 346 1 + vert 347 ( 0.7603439093 0.5280430317 ) 347 1 + vert 348 ( 0.5882496834 0.5238089561 ) 348 1 + vert 349 ( 0.1673034132 0.2250787616 ) 349 1 + vert 350 ( 0.5768955350 0.5238089561 ) 350 1 + vert 351 ( 0.6686197519 0.7083897591 ) 351 1 + vert 352 ( 0.7766107321 0.2076857090 ) 352 1 + vert 353 ( 0.5882496834 0.6970356405 ) 353 1 + vert 354 ( 0.5996037722 0.7083897591 ) 354 1 + vert 355 ( 0.7766107917 0.1386697888 ) 355 1 + vert 356 ( 0.4965255260 0.6970356405 ) 356 1 + vert 357 ( 0.5078796148 0.7083897591 ) 357 1 + vert 358 ( 0.7099901438 0.2076856494 ) 358 1 + vert 359 ( 0.6799738407 0.3548164964 ) 359 1 + vert 360 ( 0.6913279891 0.3434623480 ) 360 1 + vert 361 ( 0.6872814894 0.2076857090 ) 361 1 + vert 362 ( 0.8634223342 0.3548164368 ) 362 1 + vert 363 ( 0.8520681858 0.3434623480 ) 363 1 + vert 364 ( 0.6206609011 0.2076856494 ) 364 1 + vert 365 ( 0.7716981173 0.3548164964 ) 365 1 + vert 366 ( 0.7830522656 0.3434623480 ) 366 1 + vert 367 ( 0.6206608415 0.1386698484 ) 367 1 + vert 368 ( 0.7716980577 0.3548164368 ) 368 1 + vert 369 ( 0.5882496834 0.6970356405 ) 369 1 + vert 370 ( 0.0180966761 1.0000000000 ) 370 1 + vert 371 ( 0.0000000000 0.9165397808 ) 371 1 + vert 372 ( 0.0000000000 0.9886458581 ) 372 1 + vert 373 ( 0.1505786180 0.6970356405 ) 373 1 + vert 374 ( 0.2089861035 1.0000000000 ) 374 1 + vert 375 ( 0.2157286406 1.0000000000 ) 375 1 + vert 376 ( 0.5037594438 0.7842713892 ) 376 1 + vert 377 ( 0.2270827889 0.9886458693 ) 377 1 + vert 378 ( 0.4428113997 1.0000000000 ) 378 1 + vert 379 ( 0.4541655481 0.9886458693 ) 379 1 + vert 380 ( 0.0149298850 0.6970356405 ) 380 1 + vert 381 ( 0.4360688329 1.0000000000 ) 381 1 + vert 382 ( 0.2270827293 0.9165397808 ) 382 1 + vert 383 ( 0.2270827293 0.9886458581 ) 383 1 + vert 384 ( 0.2384368777 1.0000000000 ) 384 1 + vert 385 ( 0.5700801611 0.7842713892 ) 385 1 + vert 386 ( 0.5063839555 0.9747674149 ) 386 1 + vert 387 ( 0.5087244511 0.9736364484 ) 387 1 + vert 388 ( 0.5415619612 0.0113542080 ) 388 1 + vert 389 ( 0.5087244511 0.9622823149 ) 389 1 + vert 390 ( 0.8747766018 0.3762815595 ) 390 1 + vert 391 ( 0.5715293288 0.7961813509 ) 391 1 + vert 392 ( 0.5537610054 0.7992807627 ) 392 1 + vert 393 ( 0.5979526639 0.0113542080 ) 393 1 + vert 394 ( 0.5651151538 0.7992807627 ) 394 1 + vert 395 ( 0.2793411613 0.0846714973 ) 395 1 + vert 396 ( 0.5537610650 0.9736364484 ) 396 1 + vert 397 ( 0.5715293884 0.9767358638 ) 397 1 + vert 398 ( 0.5651152134 0.9736364484 ) 398 1 + vert 399 ( 0.4721183479 0.1491987705 ) 399 1 + vert 400 ( 0.4965254366 0.0113541484 ) 400 1 + vert 401 ( 0.5087244511 0.8106349111 ) 401 1 + vert 402 ( 0.5087244511 0.7992807627 ) 402 1 + vert 403 ( 0.5642702579 0.0113541484 ) 403 1 + vert 404 ( 0.5200785995 0.7992807627 ) 404 1 + vert 405 ( 0.5063839555 0.7981497943 ) 405 1 + vert 406 ( 0.5651152134 0.9105100036 ) 406 1 + vert 407 ( 0.5537610650 0.9105100036 ) 407 1 + vert 408 ( 0.5651152134 0.9105100036 ) 408 1 + vert 409 ( 0.4317001402 0.1491986513 ) 409 1 + vert 410 ( 0.5651152134 0.9218641371 ) 410 1 + vert 411 ( 0.5087244511 0.9218641371 ) 411 1 + vert 412 ( 0.9151947498 0.3762814999 ) 412 1 + vert 413 ( 0.5087244511 0.9105100036 ) 413 1 + vert 414 ( 0.9375978708 0.0328193307 ) 414 1 + vert 415 ( 0.5087244511 0.8991558626 ) 415 1 + vert 416 ( 0.5087244511 0.8734562993 ) 416 1 + vert 417 ( 0.5087244511 0.8621021509 ) 417 1 + vert 418 ( 0.9715853930 0.3762816787 ) 418 1 + vert 419 ( 0.5087244511 0.8507480174 ) 419 1 + vert 420 ( 0.8747765422 0.0328192711 ) 420 1 + vert 421 ( 0.5651151538 0.8621021509 ) 421 1 + vert 422 ( 0.5651151538 0.8621021509 ) 422 1 + vert 423 ( 0.3194543421 0.0846713781 ) 423 1 + vert 424 ( 0.5651151538 0.8507480323 ) 424 1 + vert 425 ( 0.5078796148 0.1635349989 ) 425 1 + vert 426 ( 0.4965254962 0.1635349989 ) 426 1 + vert 427 ( 0.4721183479 0.2900254726 ) 427 1 + vert 428 ( 0.4965254962 0.1748891473 ) 428 1 + vert 429 ( 0.5529162884 0.1748891473 ) 429 1 + vert 430 ( 0.5529162288 0.1635349989 ) 430 1 + vert 431 ( 0.8747766018 0.5171083212 ) 431 1 + vert 432 ( 0.5415620804 0.1635349989 ) 432 1 + vert 433 ( 0.9262438416 0.1963542700 ) 433 1 + vert 434 ( 0.9262437820 0.1850001216 ) 434 1 + vert 435 ( 0.5642703176 0.1521807909 ) 435 1 + vert 436 ( 0.9148896337 0.1850001812 ) 436 1 + vert 437 ( 0.2679870129 0.2482064962 ) 437 1 + vert 438 ( 0.2793411613 0.2368523479 ) 438 1 + vert 439 ( 0.9826345444 0.1963543296 ) 439 1 + vert 440 ( 0.9826345444 0.1850001812 ) 440 1 + vert 441 ( 0.4317001402 0.2900255322 ) 441 1 + vert 442 ( 0.9712803960 0.1850001812 ) 442 1 + vert 443 ( 0.9262438416 0.1963543296 ) 443 1 + vert 444 ( 0.9375978708 0.1850001812 ) 444 1 + vert 445 ( 0.9829396009 0.5398166180 ) 445 1 + vert 446 ( 0.9829396009 0.5284624696 ) 446 1 + vert 447 ( 0.8747766018 0.1736459732 ) 447 1 + vert 448 ( 0.9715854526 0.5284624696 ) 448 1 + vert 449 ( 0.9265487790 0.5398166180 ) 449 1 + vert 450 ( 0.9379029870 0.5284624696 ) 450 1 + vert 451 ( 0.4992021918 0.7729172111 ) 451 1 + vert 452 ( 0.5105563402 0.7615630627 ) 452 1 + vert 453 ( 0.4721183479 0.4699529409 ) 453 1 + vert 454 ( 0.4655197263 0.7729172111 ) 454 1 + vert 455 ( 0.4541656077 0.7615630925 ) 455 1 + vert 456 ( 0.8747765422 0.6970357299 ) 456 1 + vert 457 ( 0.9262437820 0.3535734415 ) 457 1 + vert 458 ( 0.9148896933 0.3649275303 ) 458 1 + vert 459 ( 0.5219103694 0.7214499116 ) 459 1 + vert 460 ( 0.2679870129 0.4054255486 ) 460 1 + vert 461 ( 0.2793411613 0.4167796969 ) 461 1 + vert 462 ( 0.5555927753 0.7214499414 ) 462 1 + vert 463 ( 0.5105563402 0.7211448550 ) 463 1 + vert 464 ( 0.4317001402 0.4699529409 ) 464 1 + vert 465 ( 0.4992021918 0.7097907066 ) 465 1 + vert 466 ( 0.4541656077 0.7211449146 ) 466 1 + vert 467 ( 0.9151947498 0.6970357001 ) 467 1 + vert 468 ( 0.9829396009 0.6970356703 ) 468 1 + vert 469 ( 0.9715854526 0.7083898187 ) 469 1 + vert 470 ( 0.5219104290 0.7615630627 ) 470 1 + vert 471 ( 0.9265488982 0.6970357299 ) 471 1 + vert 472 ( 0.8170979023 0.2190399766 ) 472 1 + vert 473 ( 0.8284521103 0.2190399766 ) 473 1 + vert 474 ( 0.3897802234 0.5476535261 ) 474 1 + vert 475 ( 0.8284521103 0.2155501842 ) 475 1 + vert 476 ( 0.8420942426 0.2717807293 ) 476 1 + vert 477 ( 0.8534483910 0.2752705812 ) 477 1 + vert 478 ( 0.5960801244 0.7729172111 ) 478 1 + vert 479 ( 0.6074342728 0.7729172111 ) 479 1 + vert 480 ( 0.3724106550 0.6271994710 ) 480 1 + vert 481 ( 0.6074342728 0.7669018358 ) 481 1 + vert 482 ( 0.5960801244 0.7129043341 ) 482 1 + vert 483 ( 0.6074342728 0.7189197242 ) 483 1 + vert 484 ( 0.8103566170 0.9036009014 ) 484 1 + vert 485 ( 0.8539717197 0.9513412639 ) 485 1 + vert 486 ( 0.8217107058 0.9036009014 ) 486 1 + vert 487 ( 0.7993190289 0.2076857686 ) 487 1 + vert 488 ( 0.8243958950 0.9004262984 ) 488 1 + vert 489 ( 0.7582961321 0.8995793015 ) 489 1 + vert 490 ( 0.7616977692 0.9149550349 ) 490 1 + vert 491 ( 0.5669469833 0.7729172111 ) 491 1 + vert 492 ( 0.5669469833 0.7676499188 ) 492 1 + vert 493 ( 0.5669469833 0.7129043341 ) 493 1 + vert 494 ( 0.8312636018 0.8788833991 ) 494 1 + vert 495 ( 0.8016068935 0.3321083188 ) 495 1 + vert 496 ( 0.8225947022 0.9025558010 ) 496 1 + vert 497 ( 0.8370193243 0.8855021596 ) 497 1 + vert 498 ( 0.6310282350 0.9886458647 ) 498 1 + vert 499 ( 0.7455260754 0.8844818100 ) 499 1 + vert 500 ( 0.7224881649 0.3321083188 ) 500 1 + vert 501 ( 0.7521448731 0.8788833916 ) 501 1 + vert 502 ( 0.7407907248 0.8902375251 ) 502 1 + vert 503 ( 0.7565966845 0.8975700662 ) 503 1 + vert 504 ( 0.8370193839 0.9933812311 ) 504 1 + vert 505 ( 0.7294365764 0.9886458647 ) 505 1 + vert 506 ( 0.8426177502 0.9886458628 ) 506 1 + vert 507 ( 0.8225947022 0.9763275962 ) 507 1 + vert 508 ( 0.8312636018 1.0000000000 ) 508 1 + vert 509 ( 0.7407907248 0.9886458591 ) 509 1 + vert 510 ( 0.6310282350 0.8642233014 ) 510 1 + vert 511 ( 0.7455261350 0.9944015788 ) 511 1 + vert 512 ( 0.6997798085 0.3321083188 ) 512 1 + vert 513 ( 0.7565966845 0.9813133236 ) 513 1 + vert 514 ( 0.7521448731 0.7544609010 ) 514 1 + vert 515 ( 0.8016068935 0.2303940654 ) 515 1 + vert 516 ( 0.7407907248 0.7658150494 ) 516 1 + vert 517 ( 0.8312636614 0.7544608861 ) 517 1 + vert 518 ( 0.7224881649 0.2303940654 ) 518 1 + vert 519 ( 0.8426177502 0.7658150494 ) 519 1 + vert 520 ( 0.7407907248 0.8642233759 ) 520 1 + vert 521 ( 0.7294364572 0.8869315907 ) 521 1 + vert 522 ( 0.7521449327 0.8755775094 ) 522 1 + vert 523 ( 0.8426177502 0.8642233759 ) 523 1 + vert 524 ( 0.6310282350 0.7625090182 ) 524 1 + vert 525 ( 0.2270827442 0.7197438776 ) 525 1 + vert 526 ( 0.0000000000 0.7197438776 ) 526 1 + vert 527 ( 0.1901422739 0.7083897591 ) 527 1 + vert 528 ( 0.4851714075 0.5182475150 ) 528 1 + vert 529 ( 0.4965254962 0.3434622288 ) 529 1 + vert 530 ( 0.4175082445 0.1163794994 ) 530 1 + vert 531 ( 0.2941248417 0.4859797955 ) 531 1 + vert 532 ( 0.7830522656 0.6970356703 ) 532 1 + vert 533 ( 0.2827707529 0.5753088295 ) 533 1 + vert 534 ( 0.5814359188 0.3434622288 ) 534 1 + vert 535 ( 0.6799738407 0.5124548376 ) 535 1 + vert 536 ( 0.4965255260 0.5124548376 ) 536 1 + vert 537 ( 0.7716980577 0.5280430317 ) 537 1 + vert 538 ( 0.1900121123 0.2477870584 ) 538 1 + vert 539 ( 0.5882496834 0.5124548376 ) 539 1 + vert 540 ( 0.6799738407 0.6970356405 ) 540 1 + vert 541 ( 0.7603439093 0.3434623480 ) 541 1 + vert 542 ( 0.6872815490 0.1386697888 ) 542 1 + vert 543 ( 0.5768955350 0.7083897591 ) 543 1 + vert 544 ( 0.7099900842 0.1386698484 ) 544 1 + vert 545 ( 0.0113541419 1.0000000000 ) 545 1 + vert 546 ( 0.2270827740 0.9165397361 ) 546 1 + vert 547 ( 0.4541655183 0.9165397361 ) 547 1 + vert 548 ( 0.2451793849 1.0000000000 ) 548 1 + vert 549 ( 0.5537610054 0.8621021509 ) 549 1 + vert 550 ( 0.2679870129 0.2368523479 ) 550 1 + vert 551 ( 0.5979527235 0.1521809101 ) 551 1 + vert 552 ( 0.9262437820 0.1850001812 ) 552 1 + vert 553 ( 0.9151947498 0.5171083510 ) 553 1 + vert 554 ( 0.9265488386 0.5284624696 ) 554 1 + vert 555 ( 0.3194543123 0.2254981995 ) 555 1 + vert 556 ( 0.4655197561 0.7097907662 ) 556 1 + vert 557 ( 0.9379030466 0.7083898485 ) 557 1 + vert 558 ( 0.5555928946 0.7615630627 ) 558 1 + vert 559 ( 0.8534483910 0.2717807293 ) 559 1 + vert 560 ( 0.4377623200 0.5476535559 ) 560 1 + vert 561 ( 0.6074342728 0.7129043341 ) 561 1 + vert 562 ( 0.4551318288 0.6271994412 ) 562 1 + vert 563 ( 0.7616977692 0.9036009014 ) 563 1 + vert 564 ( 0.8539717197 0.9886458637 ) 564 1 + vert 565 ( 0.8243153095 0.2717807293 ) 565 1 + vert 566 ( 0.5783011913 0.7729172111 ) 566 1 + vert 567 ( 0.7993190289 0.1587125063 ) 567 1 + vert 568 ( 0.5669469833 0.7181716263 ) 568 1 + vert 569 ( 0.5783011913 0.7129043341 ) 569 1 + vert 570 ( 0.8243153691 0.3321081400 ) 570 1 + vert 571 ( 0.8312636018 0.8755775094 ) 571 1 + vert 572 ( 0.4541654587 0.7538222075 ) 572 1 + vert 573 ( 0.4172250032 0.7083897591 ) 573 1 + vert 574 ( 0.2270827442 0.7538222075 ) 574 1 + vert 575 ( 0.2024006248 0.4859797955 ) 575 1 + numtris 546 + tri 0 11 43 18 + tri 1 9 218 5 + tri 2 14 562 528 + tri 3 279 226 289 + tri 4 30 64 23 + tri 5 311 340 306 + tri 6 380 25 373 + tri 7 532 74 312 + tri 8 110 301 12 + tri 9 293 560 285 + tri 10 121 127 6 + tri 11 117 109 21 + tri 12 22 56 26 + tri 13 83 106 62 + tri 14 75 100 70 + tri 15 0 1 38 + tri 16 53 84 57 + tri 17 29 59 49 + tri 18 115 36 124 + tri 19 52 82 31 + tri 20 37 67 46 + tri 21 148 108 113 + tri 22 542 361 367 + tri 23 68 94 77 + tri 24 332 90 326 + tri 25 69 96 65 + tri 26 76 102 72 + tri 27 355 352 544 + tri 28 330 88 349 + tri 29 143 376 133 + tri 30 122 138 144 + tri 31 118 112 137 + tri 32 418 186 158 + tri 33 388 167 136 + tri 34 164 195 160 + tri 35 163 453 176 + tri 36 180 467 165 + tri 37 412 553 390 + tri 38 393 551 403 + tri 39 141 170 420 + tri 40 399 427 409 + tri 41 153 159 151 + tri 42 423 555 395 + tri 43 558 470 462 + tri 44 220 564 216 + tri 45 196 208 194 + tri 46 188 213 173 + tri 47 172 201 168 + tri 48 171 199 184 + tri 49 179 205 181 + tri 50 187 211 189 + tri 51 236 255 232 + tri 52 40 35 17 + tri 53 123 48 7 + tri 54 16 51 3 + tri 55 243 258 245 + tri 56 228 570 221 + tri 57 227 242 229 + tri 58 219 487 224 + tri 59 272 266 274 + tri 60 235 250 240 + tri 61 500 518 495 + tri 62 244 263 237 + tri 63 510 524 253 + tri 64 259 271 512 + tri 65 498 265 505 + tri 66 146 178 414 + tri 67 318 538 315 + tri 68 281 280 278 + tri 69 525 284 8 + tri 70 526 288 13 + tri 71 294 527 292 + tri 72 298 296 22 + tri 73 302 300 26 + tri 74 303 529 31 + tri 75 305 309 308 + tri 76 40 313 575 + tri 77 314 531 42 + tri 78 317 320 533 + tri 79 321 52 322 + tri 80 324 56 325 + tri 81 327 329 58 + tri 82 331 536 333 + tri 83 334 68 335 + tri 84 339 70 338 + tri 85 342 75 343 + tri 86 346 537 77 + tri 87 348 350 539 + tri 88 540 351 84 + tri 89 354 353 87 + tri 90 92 357 356 + tri 91 360 94 359 + tri 92 98 363 362 + tri 93 366 100 365 + tri 94 104 541 368 + tri 95 543 106 369 + tri 96 372 371 109 + tri 97 117 546 377 + tri 98 381 121 379 + tri 99 127 548 383 + tri 100 128 389 386 + tri 101 391 394 133 + tri 102 396 398 137 + tri 103 140 405 401 + tri 104 408 407 406 + tri 105 415 413 148 + tri 106 419 417 152 + tri 107 159 549 421 + tri 108 160 428 425 + tri 109 164 432 429 + tri 110 433 171 434 + tri 111 437 550 173 + tri 112 439 179 440 + tri 113 443 552 181 + tri 114 445 187 446 + tri 115 449 554 189 + tri 116 194 452 451 + tri 117 455 196 454 + tri 118 458 199 457 + tri 119 203 461 460 + tri 120 206 465 463 + tri 121 556 208 466 + tri 122 469 211 468 + tri 123 215 557 471 + tri 124 219 475 472 + tri 125 559 477 476 + tri 126 478 227 479 + tri 127 482 561 229 + tri 128 232 488 484 + tri 129 489 563 237 + tri 130 492 242 491 + tri 131 569 246 493 + tri 132 494 497 249 + tri 133 499 503 502 + tri 134 508 258 504 + tri 135 263 513 509 + tri 136 266 516 514 + tri 137 519 268 517 + tri 138 272 522 520 + tri 139 571 274 523 + tri 140 370 109 374 + tri 141 118 119 112 + tri 142 572 547 6 + tri 143 117 21 546 + tri 144 282 8 382 + tri 145 286 13 371 + tri 146 10 11 19 + tri 147 573 6 283 + tri 148 114 115 125 + tri 149 20 21 287 + tri 150 15 16 4 + tri 151 548 127 381 + tri 152 298 22 299 + tri 153 30 23 530 + tri 154 35 40 34 + tri 155 314 42 319 + tri 156 49 50 29 + tri 157 43 44 39 + tri 158 36 309 47 + tri 159 52 31 534 + tri 160 373 27 110 + tri 161 24 25 120 + tri 162 3 32 2 + tri 163 323 51 12 + tri 164 124 47 123 + tri 165 35 36 116 + tri 166 18 39 17 + tri 167 42 43 7 + tri 168 56 53 58 + tri 169 64 332 55 + tri 170 65 336 69 + tri 171 72 344 76 + tri 172 349 81 330 + tri 173 75 70 74 + tri 174 67 68 78 + tri 175 82 83 63 + tri 176 302 26 328 + tri 177 535 56 295 + tri 178 303 31 536 + tri 179 539 82 321 + tri 180 73 74 41 + tri 181 78 79 46 + tri 182 66 67 307 + tri 183 84 351 87 + tri 184 90 91 86 + tri 185 95 93 97 + tri 186 101 99 103 + tri 187 107 105 89 + tri 188 100 366 98 + tri 189 94 360 104 + tri 190 106 543 92 + tri 191 346 77 368 + tri 192 359 94 334 + tri 193 83 80 106 + tri 194 87 353 57 + tri 195 98 362 70 + tri 196 540 84 54 + tri 197 61 62 356 + tri 198 365 100 342 + tri 199 113 376 140 + tri 200 108 128 112 + tri 201 133 385 132 + tri 202 137 129 396 + tri 203 143 133 404 + tri 204 122 118 138 + tri 205 139 410 138 + tri 206 389 128 411 + tri 207 145 407 151 + tri 208 152 140 419 + tri 209 156 424 132 + tri 210 549 159 154 + tri 211 160 161 164 + tri 212 168 435 172 + tri 213 427 163 441 + tri 214 165 431 180 + tri 215 178 179 182 + tri 216 184 447 171 + tri 217 555 188 174 + tri 218 189 190 187 + tri 219 157 158 191 + tri 220 185 186 155 + tri 221 149 414 183 + tri 222 177 178 147 + tri 223 400 136 162 + tri 224 166 167 131 + tri 225 134 395 175 + tri 226 169 170 142 + tri 227 194 451 196 + tri 228 200 198 202 + tri 229 452 194 463 + tri 230 196 455 208 + tri 231 465 206 556 + tri 232 212 210 458 + tri 233 213 214 203 + tri 234 557 215 469 + tri 235 179 439 205 + tri 236 192 193 160 + tri 237 197 195 429 + tri 238 449 189 471 + tri 239 468 211 445 + tri 240 457 199 433 + tri 241 209 207 181 + tri 242 203 460 173 + tri 243 216 217 220 + tri 244 224 225 219 + tri 245 221 477 228 + tri 246 229 483 227 + tri 247 285 474 9 + tri 248 222 560 528 + tri 249 562 14 230 + tri 250 279 5 226 + tri 251 232 484 236 + tri 252 240 241 235 + tri 253 237 490 244 + tri 254 568 246 492 + tri 255 482 229 569 + tri 256 566 242 478 + tri 257 233 487 472 + tri 258 476 221 565 + tri 259 494 249 501 + tri 260 506 257 251 + tri 261 502 254 509 + tri 262 261 262 508 + tri 263 237 254 236 + tri 264 263 244 262 + tri 265 232 249 235 + tri 266 258 243 257 + tri 267 266 514 268 + tri 268 272 520 266 + tri 269 268 519 274 + tri 270 274 571 272 + tri 271 260 512 273 + tri 272 270 271 256 + tri 273 264 265 248 + tri 274 252 253 267 + tri 275 144 145 156 + tri 276 152 153 148 + tri 277 33 24 2 + tri 278 43 39 18 + tri 279 218 480 5 + tri 280 562 222 528 + tri 281 226 230 289 + tri 282 64 55 23 + tri 283 340 336 306 + tri 284 25 27 373 + tri 285 74 341 312 + tri 286 301 323 12 + tri 287 560 474 285 + tri 288 127 8 6 + tri 289 109 13 21 + tri 290 56 58 26 + tri 291 106 92 62 + tri 292 100 98 70 + tri 293 1 71 38 + tri 294 84 87 57 + tri 295 59 81 49 + tri 296 36 47 124 + tri 297 82 63 31 + tri 298 67 78 46 + tri 299 108 148 128 + tri 300 113 152 148 + tri 301 113 140 152 + tri 302 361 364 367 + tri 303 94 104 77 + tri 304 90 86 326 + tri 305 96 93 65 + tri 306 102 99 72 + tri 307 352 358 544 + tri 308 88 105 349 + tri 309 376 385 133 + tri 310 144 126 122 + tri 311 156 132 126 + tri 312 126 144 156 + tri 313 112 129 137 + tri 314 186 190 158 + tri 315 167 161 136 + tri 316 195 192 160 + tri 317 453 464 176 + tri 318 467 456 165 + tri 319 553 431 390 + tri 320 551 435 403 + tri 321 170 447 420 + tri 322 427 441 409 + tri 323 159 145 151 + tri 324 555 174 395 + tri 325 470 459 462 + tri 326 564 485 216 + tri 327 208 206 194 + tri 328 213 203 173 + tri 329 201 198 168 + tri 330 199 210 184 + tri 331 205 209 181 + tri 332 211 215 189 + tri 333 255 249 232 + tri 334 35 116 17 + tri 335 48 42 7 + tri 336 51 32 3 + tri 337 258 262 245 + tri 338 570 238 221 + tri 339 242 246 229 + tri 340 487 567 224 + tri 341 266 268 274 + tri 342 250 257 240 + tri 343 518 515 495 + tri 344 263 254 237 + tri 345 524 269 253 + tri 346 271 275 512 + tri 347 265 521 505 + tri 348 178 182 414 + tri 349 538 344 315 + tri 350 277 276 281 + tri 351 281 278 277 + tri 352 8 282 525 + tri 353 284 283 8 + tri 354 13 286 526 + tri 355 288 287 13 + tri 356 291 290 294 + tri 357 294 292 291 + tri 358 296 295 22 + tri 359 300 299 26 + tri 360 529 304 31 + tri 361 309 36 308 + tri 362 531 316 42 + tri 363 320 47 533 + tri 364 52 534 322 + tri 365 56 535 325 + tri 366 329 328 58 + tri 367 536 63 333 + tri 368 68 337 335 + tri 369 75 345 343 + tri 370 537 347 77 + tri 371 350 82 539 + tri 372 372 370 545 + tri 373 372 109 370 + tri 374 377 374 117 + tri 375 377 375 374 + tri 376 379 378 381 + tri 377 121 547 379 + tri 378 383 382 127 + tri 379 548 384 383 + tri 380 389 387 386 + tri 381 394 392 133 + tri 382 398 397 137 + tri 383 405 402 401 + tri 384 407 145 406 + tri 385 413 411 148 + tri 386 417 416 152 + tri 387 549 422 421 + tri 388 428 426 425 + tri 389 432 430 429 + tri 390 171 436 434 + tri 391 550 438 173 + tri 392 179 442 440 + tri 393 552 444 181 + tri 394 187 448 446 + tri 395 554 450 189 + tri 396 475 473 472 + tri 397 477 221 476 + tri 398 227 481 479 + tri 399 561 483 229 + tri 400 488 486 484 + tri 401 563 490 237 + tri 402 242 566 491 + tri 403 246 568 493 + tri 404 497 496 249 + tri 405 503 254 502 + tri 406 258 507 504 + tri 407 513 511 509 + tri 408 109 117 374 + tri 409 119 111 112 + tri 410 547 121 6 + tri 411 21 574 546 + tri 412 8 127 382 + tri 413 13 109 371 + tri 414 11 18 19 + tri 415 6 8 283 + tri 416 115 124 125 + tri 417 21 13 287 + tri 418 16 3 4 + tri 419 127 121 381 + tri 420 22 26 299 + tri 421 23 297 530 + tri 422 40 575 34 + tri 423 42 48 319 + tri 424 50 28 29 + tri 425 44 310 39 + tri 426 309 533 47 + tri 427 31 304 534 + tri 428 27 301 110 + tri 429 25 380 120 + tri 430 32 33 2 + tri 431 51 16 12 + tri 432 47 48 123 + tri 433 36 115 116 + tri 434 39 40 17 + tri 435 43 11 7 + tri 436 53 57 58 + tri 437 332 326 55 + tri 438 336 340 69 + tri 439 344 538 76 + tri 440 81 59 330 + tri 441 70 341 74 + tri 442 68 77 78 + tri 443 83 62 63 + tri 444 26 58 328 + tri 445 56 22 295 + tri 446 31 63 536 + tri 447 82 52 321 + tri 448 74 532 41 + tri 449 79 45 46 + tri 450 67 37 307 + tri 451 351 354 87 + tri 452 91 85 86 + tri 453 93 96 97 + tri 454 99 102 103 + tri 455 105 88 89 + tri 456 366 363 98 + tri 457 360 541 104 + tri 458 543 357 92 + tri 459 77 104 368 + tri 460 94 68 334 + tri 461 80 369 106 + tri 462 353 60 57 + tri 463 362 338 70 + tri 464 84 53 54 + tri 465 62 92 356 + tri 466 100 75 342 + tri 467 376 143 140 + tri 468 128 129 112 + tri 469 385 126 132 + tri 470 129 130 396 + tri 471 133 392 404 + tri 472 118 137 138 + tri 473 410 144 138 + tri 474 128 148 411 + tri 475 407 150 151 + tri 476 140 401 419 + tri 477 424 135 132 + tri 478 159 153 154 + tri 479 161 167 164 + tri 480 435 551 172 + tri 481 163 176 441 + tri 482 431 553 180 + tri 483 179 181 182 + tri 484 447 170 171 + tri 485 188 173 174 + tri 486 190 186 187 + tri 487 158 190 191 + tri 488 186 418 155 + tri 489 414 182 183 + tri 490 178 146 147 + tri 491 136 161 162 + tri 492 167 388 131 + tri 493 395 174 175 + tri 494 170 141 142 + tri 495 451 454 196 + tri 496 198 201 202 + tri 497 194 206 463 + tri 498 455 466 208 + tri 499 206 208 556 + tri 500 210 199 458 + tri 501 214 461 203 + tri 502 215 211 469 + tri 503 439 204 205 + tri 504 193 428 160 + tri 505 195 164 429 + tri 506 189 215 471 + tri 507 211 187 445 + tri 508 199 171 433 + tri 509 207 443 181 + tri 510 460 437 173 + tri 511 217 223 220 + tri 512 225 475 219 + tri 513 477 231 228 + tri 514 483 481 227 + tri 515 474 218 9 + tri 516 560 293 528 + tri 517 14 289 230 + tri 518 5 480 226 + tri 519 484 239 236 + tri 520 241 234 235 + tri 521 490 247 244 + tri 522 246 242 492 + tri 523 229 246 569 + tri 524 242 227 478 + tri 525 487 219 472 + tri 526 221 238 565 + tri 527 249 255 501 + tri 528 257 250 251 + tri 529 254 263 509 + tri 530 262 258 508 + tri 531 254 255 236 + tri 532 244 245 262 + tri 533 249 250 235 + tri 534 243 240 257 + tri 535 514 517 268 + tri 536 520 516 266 + tri 537 519 523 274 + tri 538 571 522 272 + tri 539 512 275 273 + tri 540 271 259 256 + tri 541 265 498 248 + tri 542 253 269 267 + tri 543 145 159 156 + tri 544 153 151 148 + tri 545 24 120 2 + numweights 576 + weight 0 7 1.0000000000 ( -0.4039240777 0.9994876385 -0.2740307450 ) + weight 1 8 1.0000000000 ( -0.4039240777 1.5706025362 -0.2740307450 ) + weight 2 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 3 2 1.0000000000 ( 0.5622114539 0.7840003967 -1.0001215935 ) + weight 4 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 5 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 6 2 1.0000000000 ( 0.7288469076 0.7839505672 -0.9001214504 ) + weight 7 7 1.0000000000 ( 0.6288465261 0.9994875789 -0.4833616316 ) + weight 8 2 1.0000000000 ( 0.7288460732 0.7830536366 0.8998782635 ) + weight 9 2 1.0000000000 ( 0.6288461685 0.8831658363 0.6745800972 ) + weight 10 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 11 2 1.0000000000 ( 0.5622105002 0.7830038071 0.9998782277 ) + weight 12 4 1.0000000000 ( -0.6288465858 1.0005125999 0.4833615720 ) + weight 13 2 1.0000000000 ( -0.7288460732 0.7839505672 -0.9001221657 ) + weight 14 2 1.0000000000 ( -0.6288461685 0.8838381767 -0.6747243404 ) + weight 15 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 16 2 1.0000000000 ( -0.5622105002 0.7840003967 -1.0001220703 ) + weight 17 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 18 2 1.0000000000 ( -0.5622114539 0.7830038071 0.9998776913 ) + weight 19 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 20 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 21 2 1.0000000000 ( -0.7288469076 0.7830536366 0.8998775482 ) + weight 22 4 1.0000000000 ( 0.3039242327 1.1005123854 -0.5127219558 ) + weight 23 4 1.0000000000 ( 0.4039241970 1.1005123854 -0.4127220213 ) + weight 24 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 25 4 1.0000000000 ( 0.3278744221 1.0005123615 -0.6127218604 ) + weight 26 4 1.0000000000 ( -0.3039239943 1.1005123854 -0.5127220750 ) + weight 27 4 1.0000000000 ( -0.3278741241 1.0005123615 -0.6127219796 ) + weight 28 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 29 4 1.0000000000 ( -0.4039240181 1.1005123854 -0.4127222002 ) + weight 30 4 1.0000000000 ( 0.4039240777 1.1005125046 0.1740308702 ) + weight 31 4 1.0000000000 ( 0.3039240539 1.1005125046 0.2740307450 ) + weight 32 4 1.0000000000 ( 0.3439128101 1.0005125999 0.3740306795 ) + weight 33 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 34 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 35 7 1.0000000000 ( -0.5039241910 0.9994876981 0.4991172850 ) + weight 36 7 1.0000000000 ( -0.3278743625 0.9994876981 0.6127218604 ) + weight 37 7 1.0000000000 ( -0.3039242029 1.0994876623 0.5127219558 ) + weight 38 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 39 7 1.0000000000 ( -0.3439128399 0.9994875789 -0.3740306497 ) + weight 40 7 1.0000000000 ( -0.5039240718 0.9994876385 -0.2490397245 ) + weight 41 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 42 7 1.0000000000 ( 0.5039241910 0.9994876385 -0.2490395755 ) + weight 43 7 1.0000000000 ( 0.3439129591 0.9994875789 -0.3740305305 ) + weight 44 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 45 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 46 7 1.0000000000 ( 0.3039240241 1.0994876623 0.5127220750 ) + weight 47 7 1.0000000000 ( 0.3278741837 0.9994876981 0.6127219796 ) + weight 48 7 1.0000000000 ( 0.5039240718 0.9994876981 0.4991174638 ) + weight 49 4 1.0000000000 ( -0.4039241374 1.1005125046 0.1740306914 ) + weight 50 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 51 4 1.0000000000 ( -0.3439129889 1.0005125999 0.3740305007 ) + weight 52 4 1.0000000000 ( -0.3039241731 1.1005125046 0.2740306258 ) + weight 53 5 1.0000000000 ( 0.3039242327 1.6850823164 -0.5127219558 ) + weight 54 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 55 5 1.0000000000 ( 0.4039241970 1.4850825071 -0.4127220213 ) + weight 56 5 1.0000000000 ( 0.3039242327 1.4850825071 -0.5127219558 ) + weight 57 5 1.0000000000 ( -0.3039239943 1.6850823164 -0.5127220750 ) + weight 58 5 1.0000000000 ( -0.3039239943 1.4850825071 -0.5127220750 ) + weight 59 5 1.0000000000 ( -0.4039240181 1.4850825071 -0.4127222002 ) + weight 60 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 61 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 62 5 1.0000000000 ( 0.3039240539 1.6850824356 0.2740307450 ) + weight 63 5 1.0000000000 ( 0.3039240539 1.4850826263 0.2740307450 ) + weight 64 5 1.0000000000 ( 0.4039240777 1.4850826263 0.1740308702 ) + weight 65 8 1.0000000000 ( -0.4039241672 1.6706025600 0.4127220511 ) + weight 66 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 67 8 1.0000000000 ( -0.3039242029 1.4706027508 0.5127219558 ) + weight 68 8 1.0000000000 ( -0.3039242029 1.6706025600 0.5127219558 ) + weight 69 8 1.0000000000 ( -0.4039240777 1.6706024408 -0.1740308404 ) + weight 70 8 1.0000000000 ( -0.3039240837 1.6706024408 -0.2740307450 ) + weight 71 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 72 8 1.0000000000 ( 0.4039241374 1.6706024408 -0.1740307212 ) + weight 73 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 74 8 1.0000000000 ( 0.3039241433 1.4706026316 -0.2740306258 ) + weight 75 8 1.0000000000 ( 0.3039241433 1.6706024408 -0.2740306258 ) + weight 76 8 1.0000000000 ( 0.4039240479 1.6706025600 0.4127221704 ) + weight 77 8 1.0000000000 ( 0.3039240241 1.6706025600 0.5127220750 ) + weight 78 8 1.0000000000 ( 0.3039240241 1.4706027508 0.5127220750 ) + weight 79 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 80 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 81 5 1.0000000000 ( -0.4039241374 1.4850826263 0.1740306914 ) + weight 82 5 1.0000000000 ( -0.3039241731 1.4850826263 0.2740306258 ) + weight 83 5 1.0000000000 ( -0.3039241731 1.6850824356 0.2740306258 ) + weight 84 6 1.0000000000 ( 0.3039242327 1.5055567026 -0.5127219558 ) + weight 85 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 86 6 1.0000000000 ( 0.4039241970 1.5055567026 -0.4127220213 ) + weight 87 6 1.0000000000 ( -0.3039239943 1.5055567026 -0.5127220750 ) + weight 88 6 1.0000000000 ( -0.4039240181 1.5055567026 -0.4127222002 ) + weight 89 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 90 6 1.0000000000 ( 0.4039240777 1.5055568218 0.1740308702 ) + weight 91 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 92 6 1.0000000000 ( 0.3039240539 1.5055568218 0.2740307450 ) + weight 93 9 1.0000000000 ( -0.4039241672 1.4094725847 0.4127220511 ) + weight 94 9 1.0000000000 ( -0.3039242029 1.4094725847 0.5127219558 ) + weight 95 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 96 9 1.0000000000 ( -0.4039240777 1.4094724655 -0.1740308404 ) + weight 97 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 98 9 1.0000000000 ( -0.3039240837 1.4094724655 -0.2740307450 ) + weight 99 9 1.0000000000 ( 0.4039241374 1.4094724655 -0.1740307212 ) + weight 100 9 1.0000000000 ( 0.3039241433 1.4094724655 -0.2740306258 ) + weight 101 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 102 9 1.0000000000 ( 0.4039240479 1.4094725847 0.4127221704 ) + weight 103 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 104 9 1.0000000000 ( 0.3039240241 1.4094725847 0.5127220750 ) + weight 105 6 1.0000000000 ( -0.4039241374 1.5055568218 0.1740306914 ) + weight 106 6 1.0000000000 ( -0.3039241731 1.5055568218 0.2740306258 ) + weight 107 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 108 1 1.0000000000 ( -0.6288462877 -0.0027038516 -0.8406154513 ) + weight 109 1 1.0000000000 ( -0.7288462520 0.0972779691 -0.9000298381 ) + weight 110 1 1.0000000000 ( -0.6288462281 0.7323116660 -1.0002232790 ) + weight 111 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 112 1 1.0000000000 ( -0.2920551896 -0.0027219369 -0.8999993205 ) + weight 113 1 1.0000000000 ( -0.6288466454 -0.0021918355 0.8406166434 ) + weight 114 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 115 1 1.0000000000 ( -0.5973538756 0.0978566110 0.9999701381 ) + weight 116 1 1.0000000000 ( -0.6288467050 0.7329211831 0.9997767210 ) + weight 117 1 1.0000000000 ( -0.7288467288 0.0978261530 0.8999701142 ) + weight 118 1 1.0000000000 ( 0.2920556366 -0.0027219369 -0.8999991417 ) + weight 119 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 120 1 1.0000000000 ( 0.6288467050 0.7323121428 -1.0002229214 ) + weight 121 1 1.0000000000 ( 0.7288467288 0.0972779691 -0.9000295401 ) + weight 122 1 1.0000000000 ( 0.6288466454 -0.0027038516 -0.8406151533 ) + weight 123 1 1.0000000000 ( 0.6288462281 0.7329207063 0.9997770190 ) + weight 124 1 1.0000000000 ( 0.5973533988 0.0978566110 0.9999704361 ) + weight 125 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 126 1 1.0000000000 ( 0.6288462877 -0.0021918355 0.8406169415 ) + weight 127 1 1.0000000000 ( 0.7288462520 0.0978261530 0.8999704123 ) + weight 128 1 1.0000000000 ( -0.3483265936 -0.0026625698 -0.7050647736 ) + weight 129 1 1.0000000000 ( -0.2254323065 -0.0027121324 -0.8678063154 ) + weight 130 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 131 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 132 1 1.0000000000 ( 0.3483265638 -0.0022331174 0.7050662637 ) + weight 133 1 1.0000000000 ( 0.2254322916 -0.0021835547 0.8678078055 ) + weight 134 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 135 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 136 1 1.0000000000 ( 0.1483269334 -0.1026815847 -0.7677757740 ) + weight 137 1 1.0000000000 ( 0.2254328430 -0.0027121324 -0.8678062558 ) + weight 138 1 1.0000000000 ( 0.3483269215 -0.0026625700 -0.7050646544 ) + weight 139 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 140 1 1.0000000000 ( -0.3483269513 -0.0022331174 0.7050660849 ) + weight 141 1 1.0000000000 ( -0.2483269423 -0.1022443697 0.6678380966 ) + weight 142 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 143 1 1.0000000000 ( -0.2254327387 -0.0021835547 0.8678077459 ) + weight 144 1 1.0000000000 ( 0.3483268023 -0.0025123558 -0.2118284255 ) + weight 145 1 1.0000000000 ( 0.1483267844 -0.0024819009 -0.1118284762 ) + weight 146 1 1.0000000000 ( 0.1483267993 -0.1025122628 -0.2117980272 ) + weight 147 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 148 1 1.0000000000 ( -0.3483267128 -0.0025123558 -0.2118286043 ) + weight 149 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 150 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 151 1 1.0000000000 ( -0.1483267248 -0.0024819009 -0.1118285581 ) + weight 152 1 1.0000000000 ( -0.3483268321 -0.0023825131 0.2145166397 ) + weight 153 1 1.0000000000 ( -0.1483268142 -0.0024129678 0.1145166904 ) + weight 154 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 155 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 156 1 1.0000000000 ( 0.3483266830 -0.0023825131 0.2145168185 ) + weight 157 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 158 1 1.0000000000 ( 0.1483267099 -0.1023824140 0.2145472169 ) + weight 159 1 1.0000000000 ( 0.1483267248 -0.0024129678 0.1145167649 ) + weight 160 11 1.0000000000 ( 0.1483266801 1.5368695259 0.2828474939 ) + weight 161 11 1.0000000000 ( 0.1483266801 1.3368693590 0.2828474939 ) + weight 162 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 163 11 1.0000000000 ( 0.2483267039 1.5368694067 0.1828474402 ) + weight 164 11 1.0000000000 ( -0.1483268291 1.5368695259 0.2828474343 ) + weight 165 11 1.0000000000 ( -0.2483268082 1.5368694067 0.1828473210 ) + weight 166 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 167 11 1.0000000000 ( -0.1483268440 1.3368693590 0.2828474343 ) + weight 168 14 1.0000000000 ( -0.1483269930 1.5362550020 -0.2177159637 ) + weight 169 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 170 14 1.0000000000 ( -0.2483268976 1.3362549543 -0.1177158356 ) + weight 171 14 1.0000000000 ( -0.2483268976 1.5362550020 -0.1177158356 ) + weight 172 14 1.0000000000 ( 0.1483265162 1.5362550020 -0.2177162319 ) + weight 173 14 1.0000000000 ( 0.2483266145 1.5362550020 -0.1177163124 ) + weight 174 14 1.0000000000 ( 0.2483266145 1.3362549543 -0.1177163124 ) + weight 175 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 176 11 1.0000000000 ( 0.2483267933 1.5368694067 -0.1731303036 ) + weight 177 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 178 11 1.0000000000 ( 0.1483268142 1.3368691206 -0.2731303275 ) + weight 179 11 1.0000000000 ( 0.1483268142 1.5368692875 -0.2731303275 ) + weight 180 11 1.0000000000 ( -0.2483267188 1.5368694067 -0.1731304228 ) + weight 181 11 1.0000000000 ( -0.1483266950 1.5368692875 -0.2731304169 ) + weight 182 11 1.0000000000 ( -0.1483266950 1.3368691206 -0.2731304169 ) + weight 183 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 184 14 1.0000000000 ( -0.2483265549 1.5362550020 0.2355751693 ) + weight 185 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 186 14 1.0000000000 ( -0.1483264714 1.3362549543 0.3355750740 ) + weight 187 14 1.0000000000 ( -0.1483264714 1.5362550020 0.3355750740 ) + weight 188 14 1.0000000000 ( 0.2483269721 1.5362550020 0.2355746925 ) + weight 189 14 1.0000000000 ( 0.1483270675 1.5362550020 0.3355747759 ) + weight 190 14 1.0000000000 ( 0.1483270526 1.3362549543 0.3355747759 ) + weight 191 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 192 12 1.0000000000 ( 0.1483267546 1.5553369522 0.2828474641 ) + weight 193 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 194 12 1.0000000000 ( 0.1483267546 1.6553369761 0.1828473806 ) + weight 195 12 1.0000000000 ( -0.1483267546 1.5553369522 0.2828474641 ) + weight 196 12 1.0000000000 ( -0.1483267546 1.6553369761 0.1828473806 ) + weight 197 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 198 15 1.0000000000 ( -0.1483269930 1.5547224283 -0.2177159637 ) + weight 199 15 1.0000000000 ( -0.2483268976 1.5547224283 -0.1177158356 ) + weight 200 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 201 15 1.0000000000 ( 0.1483265162 1.5547224283 -0.2177162319 ) + weight 202 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 203 15 1.0000000000 ( 0.2483266145 1.5547224283 -0.1177163124 ) + weight 204 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 205 12 1.0000000000 ( 0.1483267546 1.5553368330 -0.2731303573 ) + weight 206 12 1.0000000000 ( 0.1483267546 1.6553368568 -0.1731303632 ) + weight 207 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 208 12 1.0000000000 ( -0.1483267546 1.6553368568 -0.1731303632 ) + weight 209 12 1.0000000000 ( -0.1483267546 1.5553368330 -0.2731303871 ) + weight 210 15 1.0000000000 ( -0.2483265549 1.5547224283 0.2355751693 ) + weight 211 15 1.0000000000 ( -0.1483264714 1.5547224283 0.3355750740 ) + weight 212 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 213 15 1.0000000000 ( 0.2483269721 1.5547224283 0.2355746925 ) + weight 214 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 215 15 1.0000000000 ( 0.1483270675 1.5547224283 0.3355747759 ) + weight 216 2 1.0000000000 ( 0.1642774343 0.9833446145 0.3156406283 ) + weight 217 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 218 2 1.0000000000 ( 0.3642774224 0.8833600283 0.2848545611 ) + weight 219 2 1.0000000000 ( 0.2642774880 0.9833944440 0.2156406790 ) + weight 220 2 1.0000000000 ( -0.1642777324 0.9833446145 0.3156404793 ) + weight 221 2 1.0000000000 ( -0.2642776668 0.9833944440 0.2156404257 ) + weight 222 2 1.0000000000 ( -0.3642777205 0.8833600283 0.2848542035 ) + weight 223 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 224 2 1.0000000000 ( 0.2642776668 0.9836093783 -0.2156849951 ) + weight 225 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 226 2 1.0000000000 ( 0.2112980932 0.8837091327 -0.4157347977 ) + weight 227 2 1.0000000000 ( 0.1642777324 0.9836592078 -0.3156850338 ) + weight 228 2 1.0000000000 ( -0.2642774880 0.9836093783 -0.2156852484 ) + weight 229 2 1.0000000000 ( -0.1642774343 0.9836592078 -0.3156851828 ) + weight 230 2 1.0000000000 ( -0.2112977058 0.8837091327 -0.4157350063 ) + weight 231 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 232 3 1.0000000000 ( 0.2178864777 0.2118682861 0.4156629145 ) + weight 233 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 234 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 235 3 1.0000000000 ( 0.3642775118 0.2118682861 0.2790425122 ) + weight 236 3 1.0000000000 ( -0.2178866714 0.2118682861 0.4156627953 ) + weight 237 3 1.0000000000 ( -0.3642776310 0.2118682861 0.2790423334 ) + weight 238 3 1.0000000000 ( -0.2642776370 0.1118683815 0.2156628072 ) + weight 239 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 240 3 1.0000000000 ( 0.3642776310 0.2118682861 -0.2790423334 ) + weight 241 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 242 3 1.0000000000 ( 0.1642776579 0.1118683815 -0.3156628311 ) + weight 243 3 1.0000000000 ( 0.2178866714 0.2118682861 -0.4156627953 ) + weight 244 3 1.0000000000 ( -0.3642775118 0.2118682861 -0.2790425122 ) + weight 245 3 1.0000000000 ( -0.2178864777 0.2118682861 -0.4156629145 ) + weight 246 3 1.0000000000 ( -0.1642775089 0.1118683815 -0.3156628907 ) + weight 247 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 248 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 249 3 1.0000000000 ( 0.2328544855 0.2118682861 0.4333589375 ) + weight 250 3 1.0000000000 ( 0.3484135866 0.2118682861 0.2602873147 ) + weight 251 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 252 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 253 3 1.0000000000 ( -0.4484137595 0.3118681908 0.4333587587 ) + weight 254 3 1.0000000000 ( -0.3484137356 0.2118682861 0.2602871358 ) + weight 255 3 1.0000000000 ( -0.2328547388 0.2118682861 0.4333588183 ) + weight 256 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 257 3 1.0000000000 ( 0.3484137356 0.2118682861 -0.2602871358 ) + weight 258 3 1.0000000000 ( 0.2328547388 0.2118682861 -0.4333588183 ) + weight 259 3 1.0000000000 ( 0.3484137952 0.3118681908 -0.5333588123 ) + weight 260 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 261 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 262 3 1.0000000000 ( -0.2328544855 0.2118682861 -0.4333589375 ) + weight 263 3 1.0000000000 ( -0.3484135866 0.2118682861 -0.2602873147 ) + weight 264 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 265 3 1.0000000000 ( 0.4484135807 1.2077021599 0.4333589971 ) + weight 266 3 1.0000000000 ( 0.3484135866 1.3077020645 0.4333589673 ) + weight 267 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 268 3 1.0000000000 ( -0.3484137654 1.3077020645 0.4333587885 ) + weight 269 3 1.0000000000 ( -0.4484137595 1.2077021599 0.4333587587 ) + weight 270 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 271 3 1.0000000000 ( 0.3484137952 1.2077021599 -0.5333588123 ) + weight 272 3 1.0000000000 ( 0.3484137654 1.3077020645 -0.4333587885 ) + weight 273 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 274 3 1.0000000000 ( -0.3484135866 1.3077020645 -0.4333589673 ) + weight 275 3 1.0000000000 ( -0.3484135568 1.2077021599 -0.5333589315 ) + weight 276 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 277 2 1.0000000000 ( 0.5622114539 0.7840003967 -1.0001215935 ) + weight 278 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 279 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 280 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 281 2 1.0000000000 ( 0.7288469076 0.7839505672 -0.9001214504 ) + weight 282 7 1.0000000000 ( 0.6288465261 0.9994875789 -0.4833616316 ) + weight 283 2 1.0000000000 ( 0.6288461685 0.8831658363 0.6745800972 ) + weight 284 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 285 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 286 4 1.0000000000 ( -0.6288465858 1.0005125999 0.4833615720 ) + weight 287 2 1.0000000000 ( -0.6288461685 0.8838381767 -0.6747243404 ) + weight 288 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 289 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 290 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 291 2 1.0000000000 ( -0.5622114539 0.7830038071 0.9998776913 ) + weight 292 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 293 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 294 2 1.0000000000 ( -0.7288469076 0.7830536366 0.8998775482 ) + weight 295 4 1.0000000000 ( 0.4039241970 1.1005123854 -0.4127220213 ) + weight 296 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 297 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 298 4 1.0000000000 ( 0.3278744221 1.0005123615 -0.6127218604 ) + weight 299 4 1.0000000000 ( -0.3278741241 1.0005123615 -0.6127219796 ) + weight 300 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 301 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 302 4 1.0000000000 ( -0.4039240181 1.1005123854 -0.4127222002 ) + weight 303 4 1.0000000000 ( 0.4039240777 1.1005125046 0.1740308702 ) + weight 304 4 1.0000000000 ( 0.3439128101 1.0005125999 0.3740306795 ) + weight 305 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 306 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 307 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 308 7 1.0000000000 ( -0.5039241910 0.9994876981 0.4991172850 ) + weight 309 7 1.0000000000 ( -0.3039242029 1.0994876623 0.5127219558 ) + weight 310 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 311 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 312 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 313 7 1.0000000000 ( -0.3439128399 0.9994875789 -0.3740306497 ) + weight 314 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 315 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 316 7 1.0000000000 ( 0.3439129591 0.9994875789 -0.3740305305 ) + weight 317 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 318 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 319 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 320 7 1.0000000000 ( 0.5039240718 0.9994876981 0.4991174638 ) + weight 321 4 1.0000000000 ( -0.4039241374 1.1005125046 0.1740306914 ) + weight 322 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 323 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 324 5 1.0000000000 ( 0.3039242327 1.6850823164 -0.5127219558 ) + weight 325 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 326 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 327 5 1.0000000000 ( -0.3039239943 1.6850823164 -0.5127220750 ) + weight 328 5 1.0000000000 ( -0.4039240181 1.4850825071 -0.4127222002 ) + weight 329 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 330 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 331 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 332 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 333 5 1.0000000000 ( 0.3039240539 1.6850824356 0.2740307450 ) + weight 334 8 1.0000000000 ( -0.4039241672 1.6706025600 0.4127220511 ) + weight 335 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 336 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 337 8 1.0000000000 ( -0.3039242029 1.4706027508 0.5127219558 ) + weight 338 8 1.0000000000 ( -0.4039240777 1.6706024408 -0.1740308404 ) + weight 339 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 340 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 341 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 342 8 1.0000000000 ( 0.4039241374 1.6706024408 -0.1740307212 ) + weight 343 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 344 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 345 8 1.0000000000 ( 0.3039241433 1.4706026316 -0.2740306258 ) + weight 346 8 1.0000000000 ( 0.4039240479 1.6706025600 0.4127221704 ) + weight 347 8 1.0000000000 ( 0.3039240241 1.4706027508 0.5127220750 ) + weight 348 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 349 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 350 5 1.0000000000 ( -0.3039241731 1.6850824356 0.2740306258 ) + weight 351 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 352 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 353 6 1.0000000000 ( -0.4039240181 1.5055567026 -0.4127222002 ) + weight 354 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 355 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 356 6 1.0000000000 ( 0.4039240777 1.5055568218 0.1740308702 ) + weight 357 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 358 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 359 9 1.0000000000 ( -0.4039241672 1.4094725847 0.4127220511 ) + weight 360 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 361 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 362 9 1.0000000000 ( -0.4039240777 1.4094724655 -0.1740308404 ) + weight 363 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 364 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 365 9 1.0000000000 ( 0.4039241374 1.4094724655 -0.1740307212 ) + weight 366 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 367 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 368 9 1.0000000000 ( 0.4039240479 1.4094725847 0.4127221704 ) + weight 369 6 1.0000000000 ( -0.4039241374 1.5055568218 0.1740306914 ) + weight 370 1 1.0000000000 ( -0.6288462877 -0.0027038516 -0.8406154513 ) + weight 371 1 1.0000000000 ( -0.6288462281 0.7323116660 -1.0002232790 ) + weight 372 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 373 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 374 1 1.0000000000 ( -0.6288466454 -0.0021918355 0.8406166434 ) + weight 375 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 376 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 377 1 1.0000000000 ( -0.5973538756 0.0978566110 0.9999701381 ) + weight 378 1 1.0000000000 ( 0.2920556366 -0.0027219369 -0.8999991417 ) + weight 379 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 380 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 381 1 1.0000000000 ( 0.6288466454 -0.0027038516 -0.8406151533 ) + weight 382 1 1.0000000000 ( 0.6288462281 0.7329207063 0.9997770190 ) + weight 383 1 1.0000000000 ( 0.5973533988 0.0978566110 0.9999704361 ) + weight 384 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 385 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 386 1 1.0000000000 ( -0.2254323065 -0.0027121324 -0.8678063154 ) + weight 387 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 388 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 389 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 390 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 391 1 1.0000000000 ( 0.3483265638 -0.0022331174 0.7050662637 ) + weight 392 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 393 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 394 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 395 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 396 1 1.0000000000 ( 0.1483269334 -0.1026815847 -0.7677757740 ) + weight 397 1 1.0000000000 ( 0.3483269215 -0.0026625700 -0.7050646544 ) + weight 398 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 399 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 400 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 401 1 1.0000000000 ( -0.2483269423 -0.1022443697 0.6678380966 ) + weight 402 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 403 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 404 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 405 1 1.0000000000 ( -0.2254327387 -0.0021835547 0.8678077459 ) + weight 406 1 1.0000000000 ( 0.3483268023 -0.0025123558 -0.2118284255 ) + weight 407 1 1.0000000000 ( 0.1483267993 -0.1025122628 -0.2117980272 ) + weight 408 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 409 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 410 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 411 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 412 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 413 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 414 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 415 1 1.0000000000 ( -0.1483267248 -0.0024819009 -0.1118285581 ) + weight 416 1 1.0000000000 ( -0.1483268142 -0.0024129678 0.1145166904 ) + weight 417 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 418 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 419 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 420 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 421 1 1.0000000000 ( 0.3483266830 -0.0023825131 0.2145168185 ) + weight 422 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 423 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 424 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 425 11 1.0000000000 ( 0.1483266801 1.3368693590 0.2828474939 ) + weight 426 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 427 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 428 11 1.0000000000 ( 0.2483267039 1.5368694067 0.1828474402 ) + weight 429 11 1.0000000000 ( -0.2483268082 1.5368694067 0.1828473210 ) + weight 430 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 431 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 432 11 1.0000000000 ( -0.1483268440 1.3368693590 0.2828474343 ) + weight 433 14 1.0000000000 ( -0.1483269930 1.5362550020 -0.2177159637 ) + weight 434 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 435 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 436 14 1.0000000000 ( -0.2483268976 1.3362549543 -0.1177158356 ) + weight 437 14 1.0000000000 ( 0.1483265162 1.5362550020 -0.2177162319 ) + weight 438 14 1.0000000000 ( 0.2483266145 1.3362549543 -0.1177163124 ) + weight 439 11 1.0000000000 ( 0.2483267933 1.5368694067 -0.1731303036 ) + weight 440 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 441 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 442 11 1.0000000000 ( 0.1483268142 1.3368691206 -0.2731303275 ) + weight 443 11 1.0000000000 ( -0.2483267188 1.5368694067 -0.1731304228 ) + weight 444 11 1.0000000000 ( -0.1483266950 1.3368691206 -0.2731304169 ) + weight 445 14 1.0000000000 ( -0.2483265549 1.5362550020 0.2355751693 ) + weight 446 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 447 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 448 14 1.0000000000 ( -0.1483264714 1.3362549543 0.3355750740 ) + weight 449 14 1.0000000000 ( 0.2483269721 1.5362550020 0.2355746925 ) + weight 450 14 1.0000000000 ( 0.1483270526 1.3362549543 0.3355747759 ) + weight 451 12 1.0000000000 ( 0.1483267546 1.5553369522 0.2828474641 ) + weight 452 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 453 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 454 12 1.0000000000 ( -0.1483267546 1.5553369522 0.2828474641 ) + weight 455 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 456 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 457 15 1.0000000000 ( -0.1483269930 1.5547224283 -0.2177159637 ) + weight 458 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 459 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 460 15 1.0000000000 ( 0.1483265162 1.5547224283 -0.2177162319 ) + weight 461 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 462 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 463 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 464 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 465 12 1.0000000000 ( 0.1483267546 1.5553368330 -0.2731303573 ) + weight 466 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 467 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 468 15 1.0000000000 ( -0.2483265549 1.5547224283 0.2355751693 ) + weight 469 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 470 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 471 15 1.0000000000 ( 0.2483269721 1.5547224283 0.2355746925 ) + weight 472 2 1.0000000000 ( 0.1642774343 0.9833446145 0.3156406283 ) + weight 473 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 474 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 475 2 1.0000000000 ( 0.3642774224 0.8833600283 0.2848545611 ) + weight 476 2 1.0000000000 ( -0.1642777324 0.9833446145 0.3156404793 ) + weight 477 2 1.0000000000 ( -0.3642777205 0.8833600283 0.2848542035 ) + weight 478 2 1.0000000000 ( 0.2642776668 0.9836093783 -0.2156849951 ) + weight 479 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 480 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 481 2 1.0000000000 ( 0.2112980932 0.8837091327 -0.4157347977 ) + weight 482 2 1.0000000000 ( -0.2642774880 0.9836093783 -0.2156852484 ) + weight 483 2 1.0000000000 ( -0.2112977058 0.8837091327 -0.4157350063 ) + weight 484 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 485 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 486 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 487 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 488 3 1.0000000000 ( 0.3642775118 0.2118682861 0.2790425122 ) + weight 489 3 1.0000000000 ( -0.2178866714 0.2118682861 0.4156627953 ) + weight 490 3 1.0000000000 ( -0.2642776370 0.1118683815 0.2156628072 ) + weight 491 3 1.0000000000 ( 0.3642776310 0.2118682861 -0.2790423334 ) + weight 492 3 1.0000000000 ( 0.2178866714 0.2118682861 -0.4156627953 ) + weight 493 3 1.0000000000 ( -0.3642775118 0.2118682861 -0.2790425122 ) + weight 494 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 495 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 496 3 1.0000000000 ( 0.3484135866 0.2118682861 0.2602873147 ) + weight 497 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 498 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 499 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 500 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 501 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 502 3 1.0000000000 ( -0.4484137595 0.3118681908 0.4333587587 ) + weight 503 3 1.0000000000 ( -0.2328547388 0.2118682861 0.4333588183 ) + weight 504 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 505 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 506 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 507 3 1.0000000000 ( 0.3484137356 0.2118682861 -0.2602871358 ) + weight 508 3 1.0000000000 ( 0.3484137952 0.3118681908 -0.5333588123 ) + weight 509 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 510 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 511 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 512 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 513 3 1.0000000000 ( -0.2328544855 0.2118682861 -0.4333589375 ) + weight 514 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 515 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 516 3 1.0000000000 ( 0.4484135807 1.2077021599 0.4333589971 ) + weight 517 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 518 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 519 3 1.0000000000 ( -0.4484137595 1.2077021599 0.4333587587 ) + weight 520 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 521 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 522 3 1.0000000000 ( 0.3484137952 1.2077021599 -0.5333588123 ) + weight 523 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 524 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 525 2 1.0000000000 ( 0.5622105002 0.7830038071 0.9998782277 ) + weight 526 2 1.0000000000 ( -0.5622105002 0.7840003967 -1.0001220703 ) + weight 527 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 528 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 529 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 530 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 531 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 532 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 533 7 1.0000000000 ( 0.3039240241 1.0994876623 0.5127220750 ) + weight 534 4 1.0000000000 ( -0.3439129889 1.0005125999 0.3740305007 ) + weight 535 5 1.0000000000 ( 0.4039241970 1.4850825071 -0.4127220213 ) + weight 536 5 1.0000000000 ( 0.4039240777 1.4850826263 0.1740308702 ) + weight 537 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 538 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 539 5 1.0000000000 ( -0.4039241374 1.4850826263 0.1740306914 ) + weight 540 6 1.0000000000 ( 0.4039241970 1.5055567026 -0.4127220213 ) + weight 541 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 542 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 543 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 544 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 545 1 1.0000000000 ( -0.2920551896 -0.0027219369 -0.8999993205 ) + weight 546 1 1.0000000000 ( -0.6288467050 0.7329211831 0.9997767210 ) + weight 547 1 1.0000000000 ( 0.6288467050 0.7323121428 -1.0002229214 ) + weight 548 1 1.0000000000 ( 0.6288462877 -0.0021918355 0.8406169415 ) + weight 549 1 1.0000000000 ( 0.1483267099 -0.1023824140 0.2145472169 ) + weight 550 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 551 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 552 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 553 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 554 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 555 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 556 12 1.0000000000 ( -0.1483267546 1.5553368330 -0.2731303871 ) + weight 557 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 558 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 559 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 560 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 561 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 562 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 563 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 564 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 565 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 566 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 567 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 568 3 1.0000000000 ( -0.2178864777 0.2118682861 -0.4156629145 ) + weight 569 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 570 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 571 3 1.0000000000 ( -0.3484135568 1.2077021599 -0.5333589315 ) + weight 572 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 573 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 574 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 575 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) +} + diff --git a/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.png b/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.png new file mode 100644 index 0000000..eafd9fa Binary files /dev/null and b/examples/nitro_engine/sdroot_animated_model/assets/robot/robot.png differ diff --git a/examples/nitro_engine/sdroot_animated_model/assets/robot/wave.md5anim b/examples/nitro_engine/sdroot_animated_model/assets/robot/wave.md5anim new file mode 100644 index 0000000..4a1a2f3 --- /dev/null +++ b/examples/nitro_engine/sdroot_animated_model/assets/robot/wave.md5anim @@ -0,0 +1,469 @@ +MD5Version 10 // Parameters used during export: Reorient: False; Scale: 1.0 +commandline "" + +numFrames 21 +numJoints 16 +frameRate 24 +numAnimatedComponents 96 + +hierarchy { + "Base.Bone" -1 63 0 // + "Spine.Low" 0 63 6 // + "Spine.High" 1 63 12 // + "Head" 2 63 18 // + "Chest.Left" 1 63 24 // + "Arm.Upper.Left" 4 63 30 // + "Arm.End.Left" 5 63 36 // + "Chest.Right" 1 63 42 // + "Arm.Upper.Right" 7 63 48 // + "Arm.End..Right" 8 63 54 // + "Pelvis.Left" 0 63 60 // + "Leg-Upper.Left" 10 63 66 // + "Leg-Lower.Left" 11 63 72 // + "Pelvis.Right" 0 63 78 // + "Leg-Upper.Right" 13 63 84 // + "Leg-Lower.Right" 14 63 90 // +} + +bounds { + ( -0.7288464904 -4.2145261765 -0.1051818728 ) ( 0.7288464904 4.2140474319 6.9405498505 ) + ( -0.7302514911 -4.2225360870 -0.1051818728 ) ( 0.7302514911 4.2145175934 6.9405498505 ) + ( -0.7343894839 -4.2448711395 -0.1051818728 ) ( 0.7343894839 4.2158436775 6.9405498505 ) + ( -0.7411305904 -4.2661142349 -0.1051818728 ) ( 0.7411305904 4.2178220749 6.9405498505 ) + ( -0.7503278852 -4.2707734108 -0.1051818728 ) ( 0.7503278852 4.2201490402 6.9405498505 ) + ( -0.7618184090 -4.2458715439 -0.1051818728 ) ( 0.7618184090 4.2224359512 6.9405498505 ) + ( -0.7754249573 -4.1845750809 -0.1051818728 ) ( 0.7754249573 4.2242231369 6.9405498505 ) + ( -0.7909565568 -4.0881261826 -0.1051818728 ) ( 0.7909565568 4.2249913216 6.9405498505 ) + ( -0.8082096577 -3.9748272896 -0.1051818728 ) ( 0.8082096577 4.2241716385 6.9405498505 ) + ( -0.8316085339 -3.8554317951 -0.1051818728 ) ( 0.8716588616 4.2211618423 6.9405498505 ) + ( -0.9071020484 -3.7363846302 -0.1051818728 ) ( 0.9725581408 4.2153348923 6.9405498505 ) + ( -0.9845415950 -3.6244606972 -0.1051818728 ) ( 1.0805976391 4.2060980797 6.9405498505 ) + ( -1.0607581139 -3.5166521072 -0.1051818728 ) ( 1.1924948692 4.1931948662 6.9405498505 ) + ( -1.1330087185 -3.4139099121 -0.1051818728 ) ( 1.3043855429 4.1768159866 7.0152153969 ) + ( -1.1990523338 -3.3173723221 -0.1051818728 ) ( 1.4124979973 4.1575984955 7.1181468964 ) + ( -1.2571754456 -3.2286412716 -0.1051818728 ) ( 1.5131845474 4.1366162300 7.2063169479 ) + ( -1.3061861992 -3.1498517990 -0.1051818728 ) ( 1.6029434204 4.1153287888 7.2786159515 ) + ( -1.3453353643 -3.0836009979 -0.1051818728 ) ( 1.6784145832 4.0954933167 7.3345251083 ) + ( -1.3741520643 -3.0328018665 -0.1051818728 ) ( 1.7363419533 4.0790367126 7.3741292953 ) + ( -1.3921631575 -3.0004279613 -0.1051818728 ) ( 1.7735110521 4.0679025650 7.3978281021 ) + ( -1.3984949589 -2.9891591072 -0.1051818728 ) ( 1.7866519690 4.0638575554 7.4058084488 ) +} + +baseframe { + ( 0.0000000000 0.0000000000 0.0000000000 ) ( -0.7071068287 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( -0.0001522740 -0.0000001192 -0.0000000000 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( 0.0004014244 -0.0000001192 0.0000000001 ) + ( -0.0000000000 1.0282182693 0.0000000000 ) ( -0.0002491503 0.0000001192 -0.0000000001 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( 0.7072144151 0.0000000000 0.0000001686 ) + ( 0.0000000000 1.0038089752 0.0000000000 ) ( -0.0000000000 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 1.6051955223 0.0000000000 ) ( -0.0000000000 -0.0000000000 -0.0000000000 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( -0.7069991827 0.0000000309 -0.0000001377 ) + ( -0.0000000000 1.0172638893 0.0000000000 ) ( -0.0000000000 -0.0000000000 0.0000000000 ) + ( 0.0000000000 1.6867997646 0.0000000000 ) ( -0.0000000000 -0.0000000000 0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( 0.7113879919 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 0.4849954247 0.0000000428 ) ( 0.7027994990 -0.0000000848 0.0000000838 ) + ( 0.0000000000 1.3662177324 0.0000000284 ) ( -0.0000000005 0.0000001192 -0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( -0.7112751007 0.0000003352 0.0000003392 ) + ( 0.0000000000 0.5501293540 -0.0000000224 ) ( -0.7029137611 0.0000000000 0.0000006704 ) + ( 0.0000000000 1.3662178516 0.0000000000 ) ( 0.0000000000 0.0000000000 0.0000000000 ) +} + +frame 0 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522740 -0.0000001192 -0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 -0.0000000001 -0.0002490849 -0.0229121577 -0.0000057087 + 0.0000000000 1.6823664904 0.0000000000 0.7072144151 0.0000000000 0.0000001686 + 0.0000000000 1.0038089752 -0.0000001216 -0.0000000000 -0.0000000000 -0.0000000000 + 0.0000000000 1.6051954031 -0.0000003162 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000000 1.0172638893 0.0000001437 -0.0010274349 -0.0000000000 -0.0000000002 + 0.0000000000 1.6867997646 0.0000000624 -0.0003698472 -0.0000000000 -0.0000000001 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 1 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522740 0.0007809388 -0.0000001190 + -0.0000000000 1.6823664904 -0.0000000002 0.0004014245 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002491252 -0.0141752968 -0.0000035319 + -0.0000000000 1.6823664904 -0.0000000002 0.7072145343 0.0000000000 0.0000001686 + 0.0000000001 1.0038089752 0.0000000474 0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6051954031 0.0000001233 0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 -0.0000000002 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000000 1.0172638893 0.0000001436 0.0012860030 -0.0000000000 -0.0000000000 + 0.0000000002 1.6867997646 0.0000001346 0.0088065108 -0.0000000000 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 2 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522733 0.0030870433 -0.0000004701 + 0.0000000000 1.6823667288 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000000 -0.0002491387 0.0096553192 0.0000024055 + 0.0000000000 1.6823667288 -0.0000000000 0.7072144151 0.0000000000 0.0000001686 + -0.0000000001 1.0038089752 -0.0000001216 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000019 1.6051951647 -0.0000003162 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823667288 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000008 1.0172638893 0.0000001437 0.0080480594 -0.0000000000 -0.0000000002 + -0.0000000006 1.6867998838 -0.0000002356 0.0338387787 -0.0000000000 -0.0000000004 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 3 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522705 0.0068626930 -0.0000010450 + -0.0000000000 1.6823660135 0.0000000000 0.0004014244 -0.0000001183 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002488978 0.0450159870 0.0000112156 + -0.0000000000 1.6823660135 0.0000000000 0.7072145343 0.0000000000 0.0000001686 + 0.0000000007 1.0038088560 0.0000000474 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000007 1.6051954031 0.0000001233 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823660135 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000003 1.0172638893 0.0000001436 0.0189933572 0.0000000000 0.0000000000 + -0.0000000040 1.6868000031 0.0000002628 0.0709822550 0.0000000000 -0.0000000010 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 4 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522630 0.0120524950 -0.0000018353 + 0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282187462 -0.0000000003 -0.0002481799 0.0881715864 0.0000219679 + 0.0000000000 1.6823664904 -0.0000000000 0.7072145343 0.0000000000 0.0000001686 + -0.0000000019 1.0038090944 0.0000005243 -0.0000000000 0.0000000000 -0.0000000014 + -0.0000000027 1.6051955223 0.0000006002 -0.0000000000 0.0000000000 -0.0000000014 + 0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000001 1.0172638893 0.0000001436 0.0338583253 0.0000000000 -0.0000000003 + -0.0000000112 1.6867996454 -0.0000001846 0.1162938699 0.0000000003 -0.0000000018 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 5 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522477 0.0186010450 -0.0000028325 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002468648 0.1351395398 0.0000336699 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 -0.0000000026 0.0000001712 + -0.0000000006 1.0038089752 0.0000005244 -0.0000000000 0.0000000000 0.0000000009 + -0.0000000014 1.6051952839 0.0000006005 -0.0000000000 0.0000000000 0.0000000009 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000289 -0.0000001383 + -0.0000000044 1.0172638893 0.0000001438 0.0523783863 -0.0000000001 0.0000000020 + 0.0000000097 1.6867998838 -0.0000005558 0.1655525118 -0.0000000004 -0.0000000013 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 6 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522208 0.0264527462 -0.0000040281 + -0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001155 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002449981 0.1818055809 0.0000452968 + -0.0000000000 1.6823664904 -0.0000000000 0.7072145343 0.0000000000 0.0000001686 + -0.0000000029 1.0038089752 0.0000005244 -0.0000000000 -0.0000000000 -0.0000000009 + 0.0000000132 1.6051951647 0.0000006005 -0.0000000000 -0.0000000000 -0.0000000009 + -0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000316 -0.0000001410 + -0.0000000029 1.0172637701 -0.0000003331 0.0742842183 -0.0000000001 -0.0000000011 + 0.0000000008 1.6867996454 -0.0000002992 0.2144013792 -0.0000000002 -0.0000000003 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 7 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001521778 0.0355514809 -0.0000054136 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001136 0.0000000001 + 0.0000000000 1.0282182693 0.0000000001 -0.0002428102 0.2241564095 0.0000558485 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 -0.0000000013 0.0000001725 + -0.0000000067 1.0038089752 0.0000000478 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000111 1.6051954031 0.0000001242 -0.0000000000 -0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000296 -0.0000001416 + -0.0000000067 1.0172638893 0.0000001440 0.0992979035 0.0000000001 -0.0000000059 + -0.0000000166 1.6867995262 -0.0000000312 0.2586210966 0.0000000014 0.0000000046 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 8 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001521140 0.0458404459 -0.0000069803 + -0.0000000000 1.6823667288 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000005 -0.0002406830 0.2584845424 0.0000644014 + -0.0000000000 1.6823667288 0.0000000000 0.7072145343 -0.0000000013 0.0000001725 + 0.0000000028 1.0038089752 -0.0000004288 -0.0000000000 0.0000000000 0.0000000056 + 0.0000000128 1.6051952839 -0.0000003520 -0.0000000000 0.0000000000 0.0000000056 + -0.0000000000 1.6823667288 0.0000000000 -0.7069992423 0.0000000296 -0.0000001416 + -0.0000000121 1.0172637701 0.0000006211 0.1271297634 -0.0000000002 -0.0000000003 + -0.0000000402 1.6867995262 -0.0000000871 0.2943651974 -0.0000000016 0.0000000026 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 9 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001520242 0.0572618246 -0.0000087195 + -0.0000000000 1.6823667288 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000003 -0.0002390801 0.2814303637 0.0000701183 + -0.0000000000 1.6823667288 -0.0000000000 0.7072145343 -0.0000000039 0.0000001699 + -0.0000000038 1.0038089752 0.0000005252 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000214 1.6051952839 0.0000006025 -0.0000000000 -0.0000000000 0.0000000000 + -0.0000000000 1.6823667288 -0.0000000000 -0.7069992423 0.0000000257 -0.0000001403 + 0.0000000037 1.0172638893 -0.0000003323 0.1574763954 -0.0000000000 -0.0000000038 + -0.0000000724 1.6868000031 -0.0000001676 0.3181996644 0.0000000032 -0.0000000026 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 10 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001519031 0.0697563663 -0.0000106221 + -0.0000000000 1.6823662519 -0.0000000001 0.0004014244 -0.0000001229 0.0000000001 + 0.0000000000 1.0282182693 0.0000000003 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823662519 -0.0000000001 0.7072144151 0.0000000000 0.0000001686 + 0.0000000032 1.0038089752 -0.0000001203 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000081 1.6051954031 -0.0000003129 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823662519 -0.0000000001 -0.7069991231 0.0000000309 -0.0000001377 + 0.0000000032 1.0172638893 -0.0000001603 0.1900207698 0.0000000002 0.0000000315 + 0.0000000743 1.6867997646 -0.0000004303 0.3268856704 0.0000000064 0.0000000426 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 11 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001517460 0.0832075551 -0.0000126704 + -0.0000000000 1.6823662519 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823662519 -0.0000000000 0.7072144151 0.0000000000 0.0000001686 + 0.0000000166 1.0038089752 -0.0000001198 -0.0000000000 0.0000000000 0.0000000037 + -0.0000000082 1.6051956415 -0.0000003115 -0.0000000000 0.0000000000 0.0000000037 + -0.0000000000 1.6823662519 -0.0000000000 -0.7069991231 0.0000000309 -0.0000001377 + 0.0000000166 1.0172640085 -0.0000001597 0.2244939208 0.0000000004 0.0000000297 + -0.0000000525 1.6867994070 0.0000000428 0.3209972084 0.0000000034 0.0000000502 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 12 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001515526 0.0972274616 -0.0000148053 + -0.0000000000 1.6823662519 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002384582 0.2898047864 0.0000722048 + -0.0000000000 1.6823662519 0.0000000000 0.7072144747 0.0000000000 0.0000001686 + -0.0000000004 1.0038089752 -0.0000004268 -0.0000000000 0.0000000000 -0.0000000149 + 0.0000000198 1.6051956415 -0.0000003468 -0.0000000000 0.0000000000 -0.0000000149 + -0.0000000000 1.6823662519 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000145 1.0172638893 0.0000006231 0.2600955665 -0.0000000006 0.0000000240 + 0.0000000242 1.6867995262 0.0000001453 0.3049138486 0.0000000036 0.0000000586 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 13 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001513271 0.1113469452 -0.0000169553 + 0.0000000000 1.6823667288 0.0000000000 0.0004014244 -0.0000001155 0.0000000001 + -0.0000000001 1.0282182693 0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + 0.0000000000 1.6823667288 0.0000000000 0.7072144151 0.0000000105 0.0000001791 + -0.0000000027 1.0038089752 -0.0000005951 0.0000000000 -0.0000000000 0.0000000000 + 0.0000000023 1.6051954031 -0.0000007843 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823667288 0.0000000000 -0.7069992423 0.0000000415 -0.0000001482 + -0.0000000027 1.0172638893 0.0000006240 0.2956701815 -0.0000000019 0.0000000218 + -0.0000000373 1.6867995262 0.0000001416 0.2809669077 0.0000000075 0.0000000486 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 14 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001510779 0.1250958145 -0.0000190489 + 0.0000000000 1.6823664904 -0.0000000001 0.0004014244 -0.0000001118 0.0000000001 + 0.0000000000 1.0282182693 -0.0000000000 -0.0002384582 0.2898047566 0.0000722048 + 0.0000000000 1.6823664904 -0.0000000001 0.7072144747 0.0000000053 0.0000001686 + -0.0000000045 1.0038089752 0.0000000516 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000303 1.6051952839 0.0000001343 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 -0.0000000001 -0.7069992423 0.0000000282 -0.0000001403 + -0.0000000343 1.0172638893 0.0000006247 0.3300409615 -0.0000000002 0.0000000325 + -0.0000000204 1.6867997646 -0.0000000522 0.2515513599 -0.0000000046 0.0000000450 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 15 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001508170 0.1380039304 -0.0000210145 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 0.0000000003 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 0.0000000000 0.7072144747 0.0000000000 0.0000001686 + -0.0000000200 1.0038089752 0.0000000527 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000743 1.6051955223 0.0000001369 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000200 1.0172640085 0.0000006258 0.3620411456 0.0000000009 0.0000000207 + 0.0000001122 1.6868000031 -0.0000000373 0.2192079574 -0.0000000036 0.0000000402 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 16 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001505604 0.1496035010 -0.0000227808 + 0.0000000000 1.6823662519 0.0000000001 0.0004014245 -0.0000001490 0.0000000001 + -0.0000000000 1.0282177925 0.0000000002 -0.0002384583 0.2898046970 0.0000722048 + 0.0000000000 1.6823662519 0.0000000001 0.7072145343 -0.0000000158 0.0000001739 + 0.0000000257 1.0038089752 0.0000000534 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000214 1.6051954031 0.0000001389 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823662519 0.0000000001 -0.7069992423 0.0000000257 -0.0000001219 + 0.0000000257 1.0172638893 0.0000001497 0.3905433416 -0.0000000016 0.0000000269 + -0.0000001459 1.6868002415 -0.0000002533 0.1866219640 0.0000000142 0.0000000415 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 17 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001503263 0.1594295800 -0.0000242770 + 0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000003 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 -0.0000000000 0.7072144747 -0.0000000053 0.0000001739 + 0.0000000436 1.0038089752 0.0000000544 -0.0000000000 -0.0000000000 0.0000000075 + -0.0000000206 1.6051952839 0.0000001415 -0.0000000000 -0.0000000000 0.0000000075 + 0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000160 1.0172638893 0.0000001507 0.4144768417 -0.0000000065 0.0000000225 + 0.0000000429 1.6867992878 -0.0000002980 0.1565571874 -0.0000000064 0.0000000583 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 18 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001501351 0.1670198888 -0.0000254328 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001267 0.0000000001 + -0.0000000000 1.0282182693 -0.0000000002 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 0.0000000000 0.7072145343 0.0000000000 0.0000001686 + 0.0000000047 1.0038089752 0.0000000550 -0.0000000000 -0.0000000000 0.0000000075 + -0.0000000202 1.6051952839 0.0000001431 -0.0000000000 0.0000000000 0.0000000075 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000048 1.0172638893 -0.0000003255 0.4328215122 -0.0000000056 0.0000000314 + -0.0000000536 1.6868004799 -0.0000000745 0.1317730397 -0.0000000069 0.0000000533 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 19 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001500070 0.1719134748 -0.0000261780 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 0.0000000000 0.0000001686 + -0.0000000009 1.0038089752 0.0000000554 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000556 1.6051956415 0.0000001441 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000009 1.0172638893 0.0000001517 0.4445825219 -0.0000000033 0.0000000193 + -0.0000000521 1.6868000031 -0.0000003427 0.1149683520 -0.0000000006 0.0000000476 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 20 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001499606 0.1736480743 -0.0000264421 + 0.0000000000 1.6823662519 0.0000000001 0.0004014244 -0.0000001267 0.0000000001 + -0.0000000001 1.0282177925 0.0000000002 -0.0002384583 0.2898046970 0.0000722048 + 0.0000000000 1.6823662519 0.0000000001 0.7072145343 0.0000000000 0.0000001686 + -0.0000000031 1.0038089752 0.0000000557 -0.0000000000 0.0000000000 -0.0000000075 + 0.0000000017 1.6051952839 0.0000001449 -0.0000000000 0.0000000000 -0.0000000075 + 0.0000000000 1.6823662519 0.0000000001 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000267 1.0172640085 0.0000001520 0.4487406611 -0.0000000018 0.0000000778 + -0.0000000491 1.6867994070 -0.0000004619 0.1087833345 -0.0000000035 0.0000000230 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + diff --git a/examples/nitro_engine/sdroot_animated_model/build.py b/examples/nitro_engine/sdroot_animated_model/build.py new file mode 100644 index 0000000..41fcaaa --- /dev/null +++ b/examples/nitro_engine/sdroot_animated_model/build.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +fatfs = FatFS() +fatfs.add_grit(['assets/robot'], 'architectds') +fatfs.add_nitro_engine_md5(['assets/robot'], 'architectds') +fatfs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['NE', 'nds9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nitro-engine'] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, fatfs], + game_title='NE: FAT: Animated model', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nitro_engine/sdroot_animated_model/readme.rst b/examples/nitro_engine/sdroot_animated_model/readme.rst new file mode 100644 index 0000000..4172859 --- /dev/null +++ b/examples/nitro_engine/sdroot_animated_model/readme.rst @@ -0,0 +1,3 @@ +After building this example, copy the files inside the generated folder +``sdroot`` to your SD card. The ``architectds`` folder must be in the root of +your SD card. diff --git a/examples/nitro_engine/sdroot_animated_model/source/main.c b/examples/nitro_engine/sdroot_animated_model/source/main.c new file mode 100644 index 0000000..29f7002 --- /dev/null +++ b/examples/nitro_engine/sdroot_animated_model/source/main.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2008-2011, 2019, 2022, 2024 +// +// This file is part of Nitro Engine + +#include +#include + +NE_Camera *Camera; +NE_Model *Model; +NE_Animation *Animation; +NE_Material *Material; + +void Draw3DScene(void) +{ + NE_CameraUse(Camera); + + NE_PolyFormat(31, 0, NE_LIGHT_0, NE_CULL_NONE, 0); + NE_ModelDraw(Model); +} + +__attribute__((noreturn)) void WaitLoop(void) +{ + printf("Press START to exit"); + while (1) + { + swiWaitForVBlank(); + scanKeys(); + if (keysHeld() & KEY_START) + exit(0); + } +} + +int main(void) +{ + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + NE_Init3D(); + // libnds uses VRAM_C for the text console, reserve A and B only + NE_TextureSystemReset(0, 0, NE_VRAM_AB); + // Init console in non-3D screen + consoleDemoInit(); + + if (!fatInitDefault()) + { + printf("fatInitDefault() failed.\n"); + WaitLoop(); + } + + // Allocate space for objects... + Model = NE_ModelCreate(NE_Animated); + Camera = NE_CameraCreate(); + Material = NE_MaterialCreate(); + Animation = NE_AnimationCreate(); + + // Setup camera + NE_CameraSet(Camera, + 6, 3, -4, + 0, 3, 0, + 0, 1, 0); + + if (NE_ModelLoadDSMFAT(Model, "architectds/robot.dsm") == 0) + { + printf("Couldn't load model..."); + WaitLoop(); + } + + if (NE_AnimationLoadFAT(Animation, "architectds/robot_wave.dsa") == 0) + { + printf("Couldn't load animation..."); + WaitLoop(); + } + + if (NE_MaterialTexLoadGRF(Material, NULL, NE_TEXGEN_TEXCOORD, + "architectds/robot_png.grf") == 0) + { + printf("Failed to load GRF\n"); + WaitLoop(); + } + + // Assign material to the model + NE_ModelSetMaterial(Model, Material); + + NE_ModelSetAnimation(Model, Animation); + NE_ModelAnimStart(Model, NE_ANIM_LOOP, floattof32(0.1)); + + NE_LightSet(0, NE_White, 0, -1, -1); + + NE_ClearColorSet(NE_Black, 31, 63); + + printf("\x1b[0;0HPad: Rotate\nSTART: Exit"); + + while (1) + { + NE_WaitForVBL(NE_UPDATE_ANIMATIONS); + + scanKeys(); + uint32_t keys = keysHeld(); + + if (keys & KEY_START) + break; + + if (keys & KEY_RIGHT) + NE_ModelRotate(Model, 0, 2, 0); + if (keys & KEY_LEFT) + NE_ModelRotate(Model, 0, -2, 0); + if (keys & KEY_UP) + NE_ModelRotate(Model, 0, 0, 2); + if (keys & KEY_DOWN) + NE_ModelRotate(Model, 0, 0, -2); + + // Draw scene... + NE_Process(Draw3DScene); + } + + return 0; +} diff --git a/examples/nitro_engine/simple_model/.gitignore b/examples/nitro_engine/simple_model/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nitro_engine/simple_model/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nitro_engine/simple_model/architectds b/examples/nitro_engine/simple_model/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/simple_model/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/simple_model/assets/robot.json b/examples/nitro_engine/simple_model/assets/robot.json new file mode 100644 index 0000000..0dc688d --- /dev/null +++ b/examples/nitro_engine/simple_model/assets/robot.json @@ -0,0 +1,3 @@ +{ + "texture": [ 256, 256] +} diff --git a/examples/nitro_engine/simple_model/assets/robot.obj b/examples/nitro_engine/simple_model/assets/robot.obj new file mode 100644 index 0000000..925bffc --- /dev/null +++ b/examples/nitro_engine/simple_model/assets/robot.obj @@ -0,0 +1,1570 @@ +# Blender 3.3.1 +# www.blender.org +mtllib robot.mtl +o Cube +v -0.403924 4.878660 1.000001 +v -0.403924 4.875432 2.588939 +v 0.628846 5.087992 -0.999999 +v 0.562211 5.388132 -0.999999 +v 0.540095 5.488132 -0.899999 +v 0.628846 5.488132 -0.674651 +v 0.728846 5.388132 -0.899999 +v 0.628846 5.087991 1.000001 +v 0.728846 5.388132 0.900001 +v 0.628846 5.488132 0.674653 +v 0.540095 5.488132 0.900001 +v 0.562211 5.388132 1.000001 +v -0.628846 5.087992 -0.999999 +v -0.728846 5.388132 -0.899999 +v -0.628846 5.488132 -0.674651 +v -0.540095 5.488132 -0.899999 +v -0.562211 5.388132 -0.999999 +v -0.628846 5.087991 1.000001 +v -0.562211 5.388132 1.000001 +v -0.540095 5.488132 0.900001 +v -0.628846 5.488132 0.674653 +v -0.728846 5.388132 0.900001 +v 0.303924 4.091908 -1.099999 +v 0.403924 4.191908 -1.099999 +v 0.503924 4.105513 -0.999999 +v 0.327874 3.991908 -0.999999 +v -0.303924 4.091908 -1.099999 +v -0.327874 3.991908 -0.999999 +v -0.503924 4.105513 -0.999999 +v -0.403924 4.191908 -1.099999 +v 0.403924 4.778661 -1.099999 +v 0.303924 4.878661 -1.099999 +v 0.343913 4.978661 -0.999999 +v 0.503924 4.853670 -0.999999 +v -0.403924 4.191907 1.100001 +v -0.503924 4.105512 1.000000 +v -0.327874 3.991908 1.000000 +v -0.303924 4.091908 1.100001 +v -0.403924 4.878660 1.050001 +v -0.343913 4.978660 1.000001 +v -0.503924 4.853669 1.000001 +v 0.403924 4.778660 1.100001 +v 0.503924 4.853669 1.000001 +v 0.343913 4.978660 1.000001 +v 0.303924 4.878660 1.100001 +v 0.403924 4.191907 1.100001 +v 0.303924 4.091908 1.100001 +v 0.327874 3.991908 1.000000 +v 0.503924 4.105512 1.000000 +v -0.403924 4.778661 -1.099999 +v -0.503924 4.853670 -0.999999 +v -0.343913 4.978661 -0.999999 +v -0.303924 4.878661 -1.099999 +v 0.303924 4.091908 -2.688378 +v 0.403924 4.191908 -2.688378 +v 0.403924 4.191908 -2.488379 +v 0.303924 4.091908 -2.488379 +v -0.303924 4.091908 -2.688378 +v -0.303924 4.091908 -2.488379 +v -0.403924 4.191908 -2.488379 +v -0.403924 4.191908 -2.688378 +v 0.403924 4.778661 -2.688378 +v 0.303924 4.878661 -2.688378 +v 0.303924 4.878661 -2.488379 +v 0.403924 4.778661 -2.488379 +v -0.403924 4.188475 2.687528 +v -0.403924 4.188886 2.487528 +v -0.303924 4.088886 2.487323 +v -0.303924 4.088475 2.687322 +v -0.403924 4.775227 2.688734 +v -0.303924 4.875226 2.688939 +v -0.403924 4.875535 2.538940 +v 0.403924 4.775227 2.688734 +v 0.403924 4.775638 2.488734 +v 0.303924 4.875638 2.488940 +v 0.303924 4.875226 2.688939 +v 0.403924 4.188475 2.687528 +v 0.303924 4.088475 2.687322 +v 0.303924 4.088886 2.487323 +v 0.403924 4.188886 2.487528 +v -0.403924 4.778661 -2.688378 +v -0.403924 4.778661 -2.488379 +v -0.303924 4.878661 -2.488379 +v -0.303924 4.878661 -2.688378 +v 0.303924 4.091908 -4.114048 +v 0.303924 4.191908 -4.214047 +v 0.403924 4.191908 -4.114048 +v -0.303924 4.091908 -4.114048 +v -0.403924 4.191908 -4.114048 +v -0.303924 4.191908 -4.214047 +v 0.403924 4.778661 -4.114048 +v 0.303924 4.778661 -4.214047 +v 0.303924 4.878661 -4.114048 +v -0.403924 4.184503 4.112886 +v -0.303924 4.084503 4.112607 +v -0.303924 4.184223 4.212886 +v -0.403924 4.771254 4.114527 +v -0.303924 4.770974 4.214526 +v -0.303924 4.871253 4.114806 +v 0.403924 4.771254 4.114527 +v 0.303924 4.871253 4.114806 +v 0.303924 4.770974 4.214526 +v 0.403924 4.184503 4.112886 +v 0.303924 4.184223 4.212886 +v 0.303924 4.084503 4.112607 +v -0.403924 4.778661 -4.114048 +v -0.303924 4.878661 -4.114048 +v -0.303924 4.778661 -4.214047 +v -0.628846 2.919816 -0.840616 +v -0.728846 3.019816 -0.900000 +v -0.628846 3.654880 -1.000000 +v -0.597354 3.019816 -1.000000 +v -0.292055 2.919816 -0.900000 +v -0.628846 2.919816 0.840616 +v -0.292055 2.919815 0.900000 +v -0.597354 3.019815 1.000000 +v -0.628846 3.654880 1.000000 +v -0.728846 3.019815 0.900000 +v 0.292055 2.919816 -0.900000 +v 0.597354 3.019816 -1.000000 +v 0.628846 3.654880 -1.000000 +v 0.728846 3.019816 -0.900000 +v 0.628846 2.919816 -0.840616 +v 0.628846 3.654879 1.000000 +v 0.597354 3.019815 1.000000 +v 0.292055 2.919815 0.900000 +v 0.628846 2.919816 0.840616 +v 0.728846 3.019815 0.900000 +v -0.348327 2.919816 -0.705065 +v -0.225433 2.919816 -0.867807 +v -0.148327 2.819816 -0.767807 +v -0.248327 2.819816 -0.667807 +v 0.348327 2.919816 0.705066 +v 0.225433 2.919816 0.867807 +v 0.148327 2.819816 0.767807 +v 0.248327 2.819816 0.667807 +v 0.148327 2.819816 -0.767807 +v 0.225433 2.919816 -0.867807 +v 0.348327 2.919816 -0.705065 +v 0.248327 2.819816 -0.667807 +v -0.348327 2.919816 0.705066 +v -0.248327 2.819816 0.667807 +v -0.148327 2.819816 0.767807 +v -0.225433 2.919816 0.867807 +v 0.348327 2.919816 -0.211829 +v 0.148327 2.919816 -0.111829 +v 0.148327 2.819816 -0.211829 +v 0.248327 2.819816 -0.311829 +v -0.348327 2.919816 -0.211829 +v -0.248327 2.819816 -0.311829 +v -0.148327 2.819816 -0.211829 +v -0.148327 2.919816 -0.111829 +v -0.348327 2.919816 0.214516 +v -0.148327 2.919816 0.114516 +v -0.148327 2.819816 0.214516 +v -0.248327 2.819816 0.314516 +v 0.348327 2.919816 0.214516 +v 0.248327 2.819816 0.314516 +v 0.148327 2.819816 0.214516 +v 0.148327 2.919816 0.114516 +v 0.148327 1.379503 -0.767807 +v 0.148327 1.579504 -0.767807 +v 0.248327 1.579504 -0.667807 +v 0.248327 1.379503 -0.667807 +v -0.148327 1.379503 -0.767807 +v -0.248327 1.379503 -0.667807 +v -0.248327 1.579504 -0.667807 +v -0.148327 1.579504 -0.767807 +v -0.148327 1.379503 0.767807 +v -0.148327 1.579503 0.767807 +v -0.248327 1.579503 0.667807 +v -0.248327 1.379503 0.667807 +v 0.148327 1.379503 0.767807 +v 0.248327 1.379503 0.667807 +v 0.248327 1.579503 0.667807 +v 0.148327 1.579503 0.767807 +v 0.248327 1.379503 -0.311829 +v 0.248327 1.579504 -0.311829 +v 0.148327 1.579504 -0.211829 +v 0.148327 1.379503 -0.211829 +v -0.248327 1.379503 -0.311829 +v -0.148327 1.379503 -0.211829 +v -0.148327 1.579504 -0.211829 +v -0.248327 1.579504 -0.311829 +v -0.248327 1.379503 0.314516 +v -0.248327 1.579503 0.314516 +v -0.148327 1.579503 0.214516 +v -0.148327 1.379503 0.214516 +v 0.248327 1.379503 0.314516 +v 0.148327 1.379503 0.214516 +v 0.148327 1.579503 0.214516 +v 0.248327 1.579503 0.314516 +v 0.148327 -0.005182 -0.767807 +v 0.248327 -0.005182 -0.667807 +v 0.148327 -0.105182 -0.667807 +v -0.148327 -0.005182 -0.767807 +v -0.148327 -0.105182 -0.667807 +v -0.248327 -0.005182 -0.667807 +v -0.148327 -0.005182 0.767807 +v -0.248327 -0.005182 0.667807 +v -0.148327 -0.105182 0.667807 +v 0.148327 -0.005182 0.767807 +v 0.148327 -0.105182 0.667807 +v 0.248327 -0.005182 0.667807 +v 0.248327 -0.005182 -0.311829 +v 0.148327 -0.005182 -0.211829 +v 0.148327 -0.105182 -0.311829 +v -0.248327 -0.005182 -0.311829 +v -0.148327 -0.105182 -0.311829 +v -0.148327 -0.005182 -0.211829 +v -0.248327 -0.005182 0.314516 +v -0.148327 -0.005182 0.214516 +v -0.148327 -0.105182 0.314516 +v 0.248327 -0.005182 0.314516 +v 0.148327 -0.105182 0.314516 +v 0.148327 -0.005182 0.214516 +v 0.164278 5.588131 0.315664 +v 0.211298 5.488132 0.415664 +v 0.364278 5.488132 0.284927 +v 0.264278 5.588131 0.215664 +v -0.164278 5.588131 0.315664 +v -0.264278 5.588131 0.215664 +v -0.364278 5.488132 0.284927 +v -0.211298 5.488132 0.415664 +v 0.264278 5.588131 -0.215662 +v 0.364278 5.488132 -0.284926 +v 0.211298 5.488132 -0.415662 +v 0.164278 5.588131 -0.315662 +v -0.264278 5.588131 -0.215662 +v -0.164278 5.588131 -0.315662 +v -0.211298 5.488132 -0.415662 +v -0.364278 5.488132 -0.284926 +v 0.236700 5.844716 0.405245 +v 0.178566 5.744716 0.307806 +v 0.273880 5.744716 0.203330 +v 0.376679 5.844716 0.262062 +v -0.198615 5.844716 0.425209 +v -0.351111 5.844716 0.295439 +v -0.254120 5.744716 0.227544 +v -0.149644 5.744716 0.322858 +v 0.351111 5.844716 -0.295437 +v 0.254120 5.744716 -0.227543 +v 0.149644 5.744716 -0.322857 +v 0.198615 5.844716 -0.425208 +v -0.376679 5.844716 -0.262060 +v -0.236700 5.844716 -0.405244 +v -0.178566 5.744716 -0.307805 +v -0.273880 5.744716 -0.203328 +v 0.372482 5.944716 0.516838 +v 0.252463 5.844716 0.422237 +v 0.359972 5.844716 0.244053 +v 0.467796 5.944716 0.412362 +v -0.323613 5.944716 0.548761 +v -0.428090 5.944716 0.453448 +v -0.336123 5.844716 0.275976 +v -0.212757 5.844716 0.443572 +v 0.428090 5.944716 -0.453446 +v 0.336123 5.844716 -0.275975 +v 0.212757 5.844716 -0.443571 +v 0.323613 5.944716 -0.548760 +v -0.467796 5.944716 -0.412360 +v -0.372482 5.944716 -0.516836 +v -0.252463 5.844716 -0.422235 +v -0.359972 5.844716 -0.244051 +v 0.372482 6.840550 0.516838 +v 0.467796 6.840550 0.412362 +v 0.367901 6.940550 0.416943 +v -0.323613 6.840550 0.548761 +v -0.328195 6.940550 0.448867 +v -0.428090 6.840550 0.453448 +v 0.428090 6.840550 -0.453446 +v 0.323613 6.840550 -0.548760 +v 0.328195 6.940550 -0.448865 +v -0.467796 6.840550 -0.412360 +v -0.367901 6.940550 -0.416941 +v -0.372482 6.840550 -0.516836 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 1.0000 0.0022 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 0.0028 +vn -0.0000 -1.0000 -0.0022 +vn -0.0000 -0.0028 1.0000 +vn -0.0000 -1.0000 -0.0028 +vn -0.0000 -0.0459 0.9989 +vn -0.9981 -0.0612 -0.0000 +vn -0.0000 -0.0459 -0.9989 +vn 0.9981 -0.0612 -0.0000 +vn 0.0001 1.0000 -0.0000 +vn 0.0458 -0.0000 0.9990 +vn -0.0001 1.0000 -0.0000 +vn -0.9990 -0.0000 0.0458 +vn -0.0458 -0.0000 -0.9990 +vn 0.9990 -0.0000 -0.0458 +vn 0.1947 0.9257 -0.3244 +vn 0.3691 0.6967 0.6151 +vn -0.3691 0.6967 -0.6151 +vn -0.1947 0.9257 0.3244 +vn 0.3892 -0.6031 -0.6963 +vn -0.4274 -0.4274 -0.7967 +vn 0.4444 0.4444 -0.7778 +vn -0.4274 -0.4274 0.7967 +vn -0.4720 0.6042 0.6420 +vn 0.4444 0.4444 0.7778 +vn 0.4274 -0.4274 0.7967 +vn -0.4444 0.4444 -0.7778 +vn 0.7071 -0.7071 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn -0.7071 -0.7071 -0.0015 +vn -0.6396 0.6387 0.4277 +vn 0.7071 0.7071 0.0015 +vn 0.7071 -0.7071 -0.0015 +vn -0.7071 0.7071 -0.0000 +vn 0.5774 -0.5773 -0.5774 +vn -0.5774 -0.5773 -0.5774 +vn 0.5774 0.5773 -0.5774 +vn -0.5774 -0.5790 0.5757 +vn -0.5773 0.5757 0.5790 +vn 0.5773 0.5757 0.5790 +vn 0.5774 -0.5790 0.5757 +vn -0.5774 0.5773 -0.5774 +vn -0.2141 -0.9353 -0.2816 +vn -0.2141 -0.9353 0.2816 +vn 0.4117 -0.7331 -0.5413 +vn 0.4117 -0.7331 0.5413 +vn -0.5580 -0.7149 -0.4213 +vn 0.5580 -0.7149 0.4213 +vn 0.4412 -0.7814 -0.4412 +vn -0.5580 -0.7149 0.4213 +vn 0.4082 -0.8165 0.4082 +vn -0.3333 -0.6667 0.6667 +vn -0.4082 -0.8165 -0.4082 +vn 0.3333 -0.6667 -0.6667 +vn 0.7071 -0.0000 -0.7071 +vn -0.7071 -0.0000 -0.7071 +vn -0.7071 -0.0000 0.7071 +vn 0.7071 -0.0000 0.7071 +vn -0.5774 -0.5774 -0.5774 +vn -0.5774 -0.5774 0.5773 +vn 0.5774 -0.5773 0.5774 +vn 0.5774 -0.5774 0.5774 +vn -0.5774 -0.5774 0.5774 +vn 0.5774 -0.5774 -0.5774 +vn 0.4534 0.7674 0.4534 +vn -0.4446 0.7292 0.5202 +vn 0.4534 0.7674 -0.4534 +vn -0.4534 0.7674 -0.4534 +vn 0.4818 -0.7390 0.4710 +vn -0.4366 -0.7390 0.5131 +vn 0.4366 -0.7390 -0.5131 +vn -0.4835 -0.7561 -0.4411 +vn 0.4052 -0.8361 0.3697 +vn -0.3697 -0.8361 0.4052 +vn 0.3697 -0.8361 -0.4052 +vn -0.4171 -0.8733 -0.2517 +vn 0.6032 0.5774 0.5503 +vn -0.5503 0.5774 0.6032 +vn 0.5503 0.5774 -0.6032 +vn -0.6032 0.5774 -0.5503 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 0.7071 0.7071 +vn -0.0000 -0.7071 0.7071 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 1.0000 0.0021 +vn -0.0000 -1.0000 -0.0021 +vn -0.7071 -0.0020 0.7071 +vn 0.7071 -0.0020 0.7071 +vn -0.0000 0.7051 0.7091 +vn -0.0000 -0.7091 0.7051 +vn 0.7071 -0.7071 -0.0020 +vn -0.7071 -0.7071 -0.0020 +vn -0.7071 0.7071 0.0020 +vn 0.7071 0.7071 0.0020 +vn 0.0324 -0.7071 0.7064 +vn 0.7064 -0.7071 -0.0324 +vn -0.7064 -0.7071 0.0324 +vn -0.0324 -0.7071 -0.7064 +vn -0.7068 -0.0290 -0.7068 +vn 0.6737 0.0290 -0.7384 +vn 0.7387 0.0078 0.6740 +vn -0.7071 -0.0078 0.7071 +vn 0.0324 0.7071 0.7064 +vn 0.7064 0.7071 -0.0324 +vn -0.7064 0.7071 0.0324 +vn -0.0324 0.7071 -0.7064 +vn -0.7388 -0.0000 -0.6740 +vn 0.6740 -0.0000 -0.7388 +vn 0.7388 -0.0000 0.6740 +vn -0.6740 -0.0000 0.7388 +vn -0.0001 1.0000 0.0021 +vn 0.0458 0.0459 0.9979 +vn -0.9971 0.0612 0.0457 +vn -0.0458 0.0459 -0.9979 +vn 0.9971 0.0612 -0.0457 +vn 0.5112 0.1135 -0.8519 +vn 0.8076 0.4967 -0.3181 +vn 0.5112 0.1135 0.8519 +vn 0.4604 0.8690 0.1813 +vn -0.5112 0.1135 -0.8519 +vn -0.4604 0.8690 -0.1813 +vn -0.5112 0.1135 0.8519 +vn -0.8076 0.4967 0.3181 +vn 0.4274 -0.4274 -0.7967 +vn -0.3892 -0.6031 -0.6963 +vn 0.4279 0.5478 -0.7189 +vn -0.3892 -0.6031 0.6963 +vn 0.4279 0.5478 0.7189 +vn 0.3892 -0.6031 0.6963 +vn -0.4279 0.5478 -0.7189 +vn -0.1384 -0.6043 -0.7846 +vn -0.6051 -0.0300 -0.7956 +vn -0.1384 -0.6043 0.7846 +vn -0.6051 -0.0300 0.7956 +vn 0.0957 -0.8346 -0.5425 +vn 0.6051 -0.0300 -0.7956 +vn 0.6051 -0.0300 0.7956 +vn 0.0957 -0.8346 0.5425 +vn -0.4412 -0.7814 -0.4412 +vn 0.4412 -0.7814 0.4412 +vn 0.5580 -0.7149 -0.4213 +vn -0.4412 -0.7814 0.4412 +vn 0.3333 -0.6667 0.6667 +vn -0.4082 -0.8165 0.4082 +vn -0.3333 -0.6667 -0.6667 +vn 0.4082 -0.8165 -0.4082 +vn 0.4446 0.7292 0.5202 +vn -0.4534 0.7674 0.4534 +vn 0.4446 0.7292 -0.5202 +vn -0.4446 0.7292 -0.5202 +vn 0.4835 -0.7561 0.4411 +vn -0.4411 -0.7561 0.4835 +vn 0.4411 -0.7561 -0.4835 +vn -0.4818 -0.7390 -0.4710 +vn 0.4171 -0.8733 0.2517 +vn -0.3923 -0.8733 0.2888 +vn 0.3923 -0.8733 -0.2888 +vn -0.4052 -0.8361 -0.3697 +vn -0.4591 0.0645 0.8860 +vn -0.0620 0.4759 0.8773 +vn -0.7387 0.0078 -0.6740 +vn 0.7071 -0.0078 -0.7071 +vn 0.7068 -0.0290 0.7068 +vn -0.6737 0.0290 0.7384 +vt 0.875000 0.750000 +vt 0.875000 0.750000 +vt 0.454165 0.246178 +vt 0.011354 0.537788 +vt 0.454165 0.280256 +vt 0.018920 0.571866 +vt 0.352448 0.302964 +vt 0.442811 0.291610 +vt 0.021431 0.583220 +vt 0.417225 0.291610 +vt 0.342371 0.328551 +vt 0.442811 0.291610 +vt 0.442811 0.280256 +vt 0.227083 0.246178 +vt 0.319663 0.537788 +vt 0.238437 0.280256 +vt 0.264023 0.291610 +vt 0.342371 0.481752 +vt 0.309586 0.583220 +vt 0.352448 0.507339 +vt 0.238437 0.291610 +vt 0.227083 0.280256 +vt 0.312097 0.571866 +vt 0.000000 0.246178 +vt 0.154154 0.537788 +vt 0.011354 0.280256 +vt 0.036940 0.291610 +vt 0.485171 0.328551 +vt 0.144077 0.583220 +vt 0.011354 0.291610 +vt 0.475094 0.302964 +vt 0.000000 0.280256 +vt 0.146588 0.571866 +vt 0.227083 0.246178 +vt 0.176863 0.537788 +vt 0.227083 0.280256 +vt 0.184429 0.571866 +vt 0.215729 0.291610 +vt 0.186940 0.583220 +vt 0.475094 0.507339 +vt 0.190142 0.291610 +vt 0.485171 0.481752 +vt 0.215729 0.291610 +vt 0.215729 0.280256 +vt 0.668620 0.645184 +vt 0.342371 0.872266 +vt 0.679974 0.645184 +vt 0.679974 0.656538 +vt 0.332562 0.883621 +vt 0.025538 0.426236 +vt 0.671339 0.656538 +vt 0.045527 0.413337 +vt 0.599604 0.645184 +vt 0.596884 0.656538 +vt 0.119982 0.413337 +vt 0.588250 0.656538 +vt 0.090873 0.583220 +vt 0.139971 0.426236 +vt 0.588250 0.645184 +vt 0.100683 0.594574 +vt 0.496525 0.645184 +vt 0.408992 0.872266 +vt 0.507880 0.645184 +vt 0.503339 0.656538 +vt 0.043706 0.525374 +vt 0.496525 0.656538 +vt 0.417508 0.883621 +vt 0.025538 0.511183 +vt 0.202401 0.424691 +vt 0.011354 0.936794 +vt 0.202401 0.436045 +vt 0.679974 0.302964 +vt 0.191047 0.426236 +vt 0.201988 0.423203 +vt 0.211035 0.413337 +vt 0.213755 0.424691 +vt 0.691328 0.302964 +vt 0.089329 0.942471 +vt 0.875000 0.750000 +vt 0.863422 0.297287 +vt 0.202401 0.514020 +vt 0.199195 0.520033 +vt 0.209214 0.525374 +vt 0.191046 0.511183 +vt 0.294125 0.502666 +vt 0.256633 0.594574 +vt 0.771698 0.302964 +vt 0.305479 0.511183 +vt 0.297330 0.520033 +vt 0.287311 0.525374 +vt 0.294125 0.514020 +vt 0.282771 0.514020 +vt 0.783052 0.302964 +vt 0.294125 0.424691 +vt 0.190012 0.594574 +vt 0.294125 0.436045 +vt 0.771698 0.302964 +vt 0.282771 0.424691 +vt 0.760344 0.302964 +vt 0.285490 0.413337 +vt 0.294538 0.423203 +vt 0.305479 0.426236 +vt 0.167303 0.594574 +vt 0.588250 0.645184 +vt 0.139970 0.511183 +vt 0.588250 0.656538 +vt 0.175820 0.583220 +vt 0.581436 0.656538 +vt 0.121803 0.525374 +vt 0.576896 0.645184 +vt 0.668620 0.476191 +vt 0.668620 0.464837 +vt 0.679974 0.476191 +vt 0.342371 0.691920 +vt 0.679974 0.464837 +vt 0.342371 0.714628 +vt 0.679974 0.487545 +vt 0.668620 0.487545 +vt 0.599604 0.476191 +vt 0.599604 0.464837 +vt 0.599604 0.487545 +vt 0.100683 0.752213 +vt 0.588250 0.487545 +vt 0.588250 0.476191 +vt 0.100683 0.774921 +vt 0.588250 0.464837 +vt 0.496526 0.476191 +vt 0.496526 0.464837 +vt 0.408992 0.691920 +vt 0.507880 0.476191 +vt 0.507880 0.464837 +vt 0.507880 0.487545 +vt 0.408992 0.714628 +vt 0.496526 0.487545 +vt 0.011354 0.756447 +vt 0.679974 0.483311 +vt 0.679974 0.471957 +vt 0.011354 0.779155 +vt 0.679974 0.460603 +vt 0.691328 0.460603 +vt 0.691328 0.471957 +vt 0.691328 0.483311 +vt 0.077975 0.756447 +vt 0.863422 0.483311 +vt 0.852068 0.483311 +vt 0.863422 0.471957 +vt 0.875000 0.750000 +vt 0.089329 0.773478 +vt 0.863422 0.466280 +vt 0.256633 0.774921 +vt 0.771698 0.483311 +vt 0.771698 0.460603 +vt 0.771698 0.471957 +vt 0.256633 0.752213 +vt 0.783052 0.471957 +vt 0.783052 0.460603 +vt 0.783052 0.483311 +vt 0.771698 0.483311 +vt 0.190012 0.774921 +vt 0.760344 0.483311 +vt 0.760344 0.471957 +vt 0.760344 0.460603 +vt 0.771698 0.471957 +vt 0.190012 0.752213 +vt 0.771698 0.460603 +vt 0.588250 0.476191 +vt 0.167303 0.774921 +vt 0.588250 0.464837 +vt 0.167303 0.752213 +vt 0.588250 0.487545 +vt 0.576895 0.487545 +vt 0.576896 0.476191 +vt 0.576896 0.464837 +vt 0.668620 0.302964 +vt 0.776611 0.792314 +vt 0.668620 0.291610 +vt 0.342371 0.518693 +vt 0.679974 0.302964 +vt 0.342371 0.530047 +vt 0.599604 0.302964 +vt 0.100683 0.936794 +vt 0.588250 0.302964 +vt 0.776611 0.861330 +vt 0.599604 0.291610 +vt 0.100683 0.948148 +vt 0.408992 0.530047 +vt 0.496526 0.302964 +vt 0.709990 0.792314 +vt 0.408992 0.518693 +vt 0.507880 0.291610 +vt 0.507880 0.302964 +vt 0.011354 0.594575 +vt 0.679974 0.645184 +vt 0.691328 0.645184 +vt 0.687281 0.792314 +vt 0.011354 0.583220 +vt 0.691328 0.656538 +vt 0.863422 0.645184 +vt 0.077975 0.594575 +vt 0.620661 0.792314 +vt 0.077975 0.583220 +vt 0.852068 0.656538 +vt 0.852068 0.645184 +vt 0.771698 0.645184 +vt 0.256633 0.936794 +vt 0.783052 0.645184 +vt 0.256633 0.948148 +vt 0.620661 0.861330 +vt 0.783052 0.656538 +vt 0.190012 0.936794 +vt 0.771698 0.645184 +vt 0.687282 0.861330 +vt 0.190012 0.948148 +vt 0.760344 0.656538 +vt 0.760344 0.645184 +vt 0.167303 0.936794 +vt 0.588250 0.302964 +vt 0.576896 0.302964 +vt 0.167303 0.948148 +vt 0.709990 0.861330 +vt 0.576896 0.291610 +vt 0.465520 0.018097 +vt 0.018097 0.000000 +vt 0.011354 0.011354 +vt 0.000000 0.083460 +vt 0.154154 0.375070 +vt 0.150579 0.302964 +vt 0.000000 0.011354 +vt 0.469095 0.000000 +vt 0.011354 0.000000 +vt 0.503760 0.011354 +vt 0.465520 0.208986 +vt 0.208986 0.000000 +vt 0.215102 0.291610 +vt 0.215729 0.000000 +vt 0.503759 0.215729 +vt 0.227083 0.011354 +vt 0.180438 0.302964 +vt 0.227083 0.083460 +vt 0.176863 0.375070 +vt 0.215729 0.011354 +vt 0.442811 0.000000 +vt 0.570080 0.011354 +vt 0.454166 0.011354 +vt 0.604744 0.000000 +vt 0.014930 0.302964 +vt 0.454166 0.083460 +vt 0.011354 0.375070 +vt 0.442811 0.011354 +vt 0.608320 0.018097 +vt 0.436069 0.000000 +vt 0.227083 0.083460 +vt 0.319663 0.375070 +vt 0.227083 0.011354 +vt 0.316087 0.302964 +vt 0.238437 0.000000 +vt 0.281423 0.291610 +vt 0.570080 0.215729 +vt 0.245179 0.000000 +vt 0.608320 0.208986 +vt 0.238437 0.011354 +vt 0.497370 0.033487 +vt 0.506384 0.025233 +vt 0.511324 0.015009 +vt 0.508724 0.026364 +vt 0.520079 0.026364 +vt 0.541562 0.988646 +vt 0.874777 0.623718 +vt 0.508724 0.037718 +vt 0.552916 0.988646 +vt 0.571529 0.203819 +vt 0.576469 0.193595 +vt 0.562516 0.212073 +vt 0.597953 0.988646 +vt 0.267987 0.915329 +vt 0.553761 0.200719 +vt 0.565115 0.200719 +vt 0.565115 0.189365 +vt 0.279341 0.915329 +vt 0.553761 0.026364 +vt 0.507880 0.988646 +vt 0.562516 0.015009 +vt 0.571529 0.023264 +vt 0.576469 0.033487 +vt 0.472118 0.850801 +vt 0.565115 0.037718 +vt 0.496525 0.988646 +vt 0.565115 0.026364 +vt 0.497370 0.193595 +vt 0.508724 0.189365 +vt 0.914890 0.967181 +vt 0.520079 0.200719 +vt 0.564270 0.988646 +vt 0.508724 0.200719 +vt 0.926244 0.967181 +vt 0.506384 0.201850 +vt 0.511324 0.212073 +vt 0.565115 0.089490 +vt 0.576469 0.089490 +vt 0.553761 0.100844 +vt 0.553761 0.089490 +vt 0.971280 0.967181 +vt 0.565115 0.089490 +vt 0.431700 0.850801 +vt 0.565115 0.078136 +vt 0.982635 0.967181 +vt 0.497370 0.089490 +vt 0.915195 0.623719 +vt 0.508724 0.078136 +vt 0.926244 0.967181 +vt 0.937598 0.967181 +vt 0.508724 0.089490 +vt 0.520079 0.089490 +vt 0.508724 0.100844 +vt 0.520079 0.100844 +vt 0.497370 0.137898 +vt 0.508724 0.126544 +vt 0.520079 0.126544 +vt 0.508724 0.137898 +vt 0.520079 0.137898 +vt 0.971585 0.623718 +vt 0.874777 0.967181 +vt 0.508724 0.149252 +vt 0.982940 0.623718 +vt 0.565115 0.137898 +vt 0.576469 0.137898 +vt 0.319454 0.915329 +vt 0.926549 0.623718 +vt 0.565115 0.137898 +vt 0.565115 0.149252 +vt 0.553761 0.137898 +vt 0.937903 0.623718 +vt 0.553761 0.126544 +vt 0.507880 0.825111 +vt 0.507880 0.836465 +vt 0.507880 0.847819 +vt 0.472118 0.709975 +vt 0.496525 0.836465 +vt 0.496525 0.847819 +vt 0.472118 0.687266 +vt 0.496525 0.825111 +vt 0.541562 0.825111 +vt 0.874777 0.460183 +vt 0.552916 0.825111 +vt 0.552916 0.847819 +vt 0.552916 0.836465 +vt 0.874777 0.482892 +vt 0.541562 0.836465 +vt 0.541562 0.847819 +vt 0.564270 0.825111 +vt 0.926244 0.803646 +vt 0.926244 0.826354 +vt 0.926244 0.815000 +vt 0.564270 0.847819 +vt 0.914890 0.815000 +vt 0.914890 0.826354 +vt 0.914890 0.803646 +vt 0.597953 0.825111 +vt 0.267987 0.751794 +vt 0.279341 0.751794 +vt 0.279341 0.763148 +vt 0.279341 0.774502 +vt 0.267987 0.763148 +vt 0.597953 0.847819 +vt 0.267987 0.774502 +vt 0.431700 0.687266 +vt 0.982635 0.803646 +vt 0.982635 0.826354 +vt 0.982635 0.815000 +vt 0.431700 0.709974 +vt 0.971280 0.815000 +vt 0.971280 0.826354 +vt 0.971280 0.803646 +vt 0.915195 0.460183 +vt 0.926244 0.803646 +vt 0.937598 0.803646 +vt 0.937598 0.815000 +vt 0.937598 0.826354 +vt 0.926244 0.815000 +vt 0.915195 0.482892 +vt 0.926244 0.826354 +vt 0.874776 0.803646 +vt 0.982940 0.460183 +vt 0.982940 0.482892 +vt 0.874777 0.826354 +vt 0.982940 0.471538 +vt 0.971585 0.471538 +vt 0.971585 0.482892 +vt 0.971585 0.460183 +vt 0.926549 0.460183 +vt 0.319454 0.751794 +vt 0.937903 0.460183 +vt 0.937903 0.471538 +vt 0.937903 0.482892 +vt 0.926549 0.471538 +vt 0.319454 0.774502 +vt 0.926549 0.482892 +vt 0.507880 0.667892 +vt 0.499202 0.227083 +vt 0.510556 0.238437 +vt 0.472118 0.530047 +vt 0.496526 0.667892 +vt 0.499202 0.238437 +vt 0.465520 0.227083 +vt 0.541562 0.667892 +vt 0.465520 0.238437 +vt 0.552916 0.667892 +vt 0.874777 0.302964 +vt 0.454166 0.238437 +vt 0.926244 0.646427 +vt 0.564270 0.667892 +vt 0.914890 0.646427 +vt 0.564270 0.656538 +vt 0.521910 0.278550 +vt 0.914890 0.635072 +vt 0.597953 0.667892 +vt 0.267987 0.594574 +vt 0.555593 0.278550 +vt 0.597953 0.656538 +vt 0.279341 0.583220 +vt 0.279341 0.594574 +vt 0.431700 0.530047 +vt 0.510556 0.278855 +vt 0.982635 0.646427 +vt 0.499202 0.290209 +vt 0.971280 0.646427 +vt 0.499202 0.278855 +vt 0.915195 0.302964 +vt 0.454166 0.278855 +vt 0.926244 0.646427 +vt 0.465520 0.278855 +vt 0.937598 0.646427 +vt 0.465520 0.290209 +vt 0.982940 0.302964 +vt 0.874777 0.646427 +vt 0.971585 0.302964 +vt 0.874777 0.635072 +vt 0.521910 0.238437 +vt 0.971585 0.291610 +vt 0.319454 0.594574 +vt 0.926549 0.302964 +vt 0.555593 0.238437 +vt 0.937903 0.291610 +vt 0.319454 0.583220 +vt 0.937903 0.302964 +vt 0.871751 0.048659 +vt 0.817098 0.780960 +vt 0.828452 0.780960 +vt 0.883105 0.053997 +vt 0.389780 0.452346 +vt 0.828452 0.784450 +vt 0.372411 0.437502 +vt 0.817098 0.792314 +vt 0.871751 0.011354 +vt 0.842094 0.728219 +vt 0.842094 0.716865 +vt 0.455132 0.437502 +vt 0.853448 0.724729 +vt 0.853448 0.728219 +vt 0.883105 0.006015 +vt 0.437762 0.452346 +vt 0.817098 0.841287 +vt 0.596080 0.227083 +vt 0.607434 0.227083 +vt 0.828452 0.849152 +vt 0.372411 0.372801 +vt 0.607434 0.233098 +vt 0.389780 0.357957 +vt 0.596080 0.238437 +vt 0.842094 0.667892 +vt 0.596080 0.287096 +vt 0.596080 0.275742 +vt 0.607434 0.281080 +vt 0.437762 0.357957 +vt 0.455132 0.372801 +vt 0.607434 0.287096 +vt 0.853448 0.660027 +vt 0.816443 0.107753 +vt 0.853972 0.048659 +vt 0.810357 0.096399 +vt 0.799319 0.780960 +vt 0.799319 0.792314 +vt 0.821711 0.096399 +vt 0.821711 0.085045 +vt 0.824396 0.099574 +vt 0.833065 0.092241 +vt 0.758296 0.100421 +vt 0.766965 0.107753 +vt 0.750344 0.092241 +vt 0.761698 0.085045 +vt 0.824315 0.716865 +vt 0.853972 0.011354 +vt 0.761698 0.096399 +vt 0.773052 0.096399 +vt 0.824315 0.728219 +vt 0.566947 0.227083 +vt 0.833065 0.028875 +vt 0.799319 0.841287 +vt 0.821711 0.036072 +vt 0.578301 0.227083 +vt 0.578301 0.238437 +vt 0.566947 0.232350 +vt 0.816443 0.013363 +vt 0.566947 0.287096 +vt 0.750344 0.028875 +vt 0.566947 0.281828 +vt 0.766965 0.013363 +vt 0.578301 0.275742 +vt 0.824315 0.667892 +vt 0.761698 0.036072 +vt 0.578301 0.287096 +vt 0.831264 0.121117 +vt 0.801607 0.667892 +vt 0.619674 0.011354 +vt 0.818143 0.109762 +vt 0.822595 0.097444 +vt 0.831264 0.090112 +vt 0.837019 0.114498 +vt 0.842618 0.109762 +vt 0.631028 0.011354 +vt 0.722488 0.667892 +vt 0.745526 0.115518 +vt 0.740791 0.135777 +vt 0.752145 0.121117 +vt 0.740791 0.109762 +vt 0.729437 0.135777 +vt 0.752145 0.090112 +vt 0.756597 0.102430 +vt 0.765266 0.109762 +vt 0.842618 0.011354 +vt 0.729437 0.011354 +vt 0.837019 0.006619 +vt 0.609307 0.667892 +vt 0.822595 0.023672 +vt 0.831264 0.031005 +vt 0.818143 0.011354 +vt 0.831264 0.000000 +vt 0.620661 0.667892 +vt 0.631028 0.135777 +vt 0.711134 0.667892 +vt 0.740791 0.011354 +vt 0.752145 0.000000 +vt 0.745526 0.005598 +vt 0.699780 0.667892 +vt 0.756597 0.018687 +vt 0.765266 0.011354 +vt 0.752145 0.031005 +vt 0.619674 0.113068 +vt 0.801607 0.769606 +vt 0.752145 0.245539 +vt 0.740791 0.234185 +vt 0.631028 0.113068 +vt 0.752145 0.234185 +vt 0.722488 0.769606 +vt 0.831264 0.245539 +vt 0.740791 0.237491 +vt 0.831264 0.234185 +vt 0.842618 0.234185 +vt 0.729436 0.237491 +vt 0.609307 0.769606 +vt 0.729436 0.113068 +vt 0.740791 0.135777 +vt 0.752145 0.124422 +vt 0.620661 0.769606 +vt 0.752145 0.135777 +vt 0.631028 0.237491 +vt 0.842618 0.135777 +vt 0.711134 0.769606 +vt 0.831264 0.135777 +vt 0.831264 0.124422 +vt 0.699780 0.769606 +s 0 +usemtl Material +f 19/37/1 44/90/1 12/23/1 +f 10/18/2 226/466/2 219/452/2 +f 21/42/2 232/475/2 15/28/2 +f 5/7/2 231/474/2 227/468/2 +f 31/62/3 56/116/3 65/133/3 +f 35/70/4 72/148/4 39/78/4 +f 112/227/5 26/52/5 120/246/5 +f 45/93/6 72/149/6 75/156/6 +f 13/25/5 29/58/5 111/226/5 +f 20/40/2 218/450/2 224/461/2 +f 122/249/3 9/16/3 128/261/3 +f 22/44/4 110/224/4 118/241/4 +f 27/53/7 57/118/7 23/45/7 +f 63/131/2 107/218/2 84/173/2 +f 71/145/8 101/206/8 76/157/8 +f 72/147/3 1/1/3 39/79/3 +f 58/120/7 85/174/7 54/112/7 +f 50/103/4 60/122/4 30/60/4 +f 125/255/1 37/75/1 116/238/1 +f 32/63/2 83/171/2 53/110/2 +f 47/99/9 68/140/9 38/77/9 +f 153/316/7 114/232/7 129/262/7 +f 102/208/10 96/195/10 104/212/10 +f 78/160/11 95/194/11 69/142/11 +f 55/114/3 91/186/3 62/129/3 +f 66/135/4 97/199/4 70/143/4 +f 77/159/3 100/205/3 103/210/3 +f 108/220/5 86/175/5 90/183/5 +f 61/125/4 106/216/4 89/181/4 +f 134/273/7 115/236/7 144/297/7 +f 157/326/7 139/284/7 123/250/7 +f 138/282/7 113/231/7 119/243/7 +f 159/332/5 187/388/5 155/321/5 +f 137/281/5 168/349/5 131/267/5 +f 161/334/5 196/405/5 165/342/5 +f 177/366/3 194/401/3 164/340/3 +f 166/343/4 208/428/4 181/374/4 +f 132/268/4 184/380/4 150/308/4 +f 143/293/1 176/364/1 135/274/1 +f 156/322/4 171/356/4 142/291/4 +f 148/304/3 163/337/3 140/285/3 +f 152/315/7 160/333/7 154/318/7 +f 136/279/3 192/396/3 158/327/3 +f 203/418/7 213/438/7 215/442/7 +f 217/446/12 240/492/12 221/454/12 +f 195/403/7 209/431/7 197/406/7 +f 174/360/3 214/440/3 189/391/3 +f 169/350/1 202/416/1 173/358/1 +f 172/357/4 211/435/4 200/412/4 +f 182/376/1 206/426/1 180/373/1 +f 190/392/5 212/436/5 188/389/5 +f 233/478/7 256/529/7 237/488/7 +f 18/35/1 36/73/1 41/84/1 +f 8/15/1 49/102/1 124/253/1 +f 4/6/5 52/109/5 17/33/5 +f 246/507/7 259/536/7 244/503/7 +f 222/456/13 248/509/13 229/470/13 +f 230/472/14 243/501/14 228/469/14 +f 225/462/15 235/482/15 220/453/15 +f 275/569/2 267/553/2 273/565/2 +f 236/486/16 258/535/16 251/517/16 +f 249/513/17 268/554/17 253/521/17 +f 245/505/18 255/527/18 264/547/18 +f 254/526/19 274/566/19 261/539/19 +f 262/544/20 272/564/20 260/538/20 +f 257/531/21 266/552/21 252/520/21 +f 151/311/1 179/372/1 147/302/1 +f 46/95/3 74/154/3 80/164/3 +f 4/5/22 6/10/22 7/12/22 +f 9/16/23 11/21/23 12/22/23 +f 14/26/24 16/30/24 17/32/24 +f 19/36/25 21/41/25 22/43/25 +f 23/45/26 25/48/26 26/51/26 +f 27/53/27 29/56/27 30/59/27 +f 32/63/28 34/66/28 31/61/28 +f 36/74/29 38/76/29 35/69/29 +f 39/81/30 40/82/30 41/84/30 +f 43/88/31 45/91/31 42/85/31 +f 47/98/32 49/101/32 46/94/32 +f 51/106/33 53/110/33 50/104/33 +f 55/113/34 57/118/34 54/111/34 +f 59/121/35 61/124/35 58/119/35 +f 63/130/36 65/134/36 62/127/36 +f 67/137/37 69/142/37 66/136/37 +f 70/144/38 71/145/38 72/146/38 +f 73/151/39 75/155/39 76/157/39 +f 78/160/40 80/163/40 77/158/40 +f 82/170/41 84/172/41 81/166/41 +f 85/174/42 86/176/42 87/178/42 +f 88/180/43 89/182/43 90/184/43 +f 91/187/44 92/190/44 93/191/44 +f 94/193/45 95/194/45 96/197/45 +f 97/198/46 98/202/46 99/203/46 +f 100/204/47 101/206/47 102/209/47 +f 103/211/48 104/214/48 105/215/48 +f 106/217/49 107/218/49 108/221/49 +f 110/224/50 112/228/50 113/230/50 +f 115/235/51 116/237/51 118/241/51 +f 120/244/52 122/249/52 123/251/52 +f 125/254/53 127/259/53 128/261/53 +f 130/263/54 132/269/54 129/262/54 +f 134/273/55 136/277/55 133/271/55 +f 138/282/56 140/288/56 137/280/56 +f 142/290/57 144/296/57 141/289/57 +f 145/298/58 147/301/58 148/303/58 +f 149/307/59 151/312/59 152/314/59 +f 153/316/60 155/319/60 156/323/60 +f 157/325/61 159/331/61 160/333/61 +f 162/335/62 164/341/62 161/334/62 +f 166/344/63 168/348/63 165/342/63 +f 169/351/64 171/355/64 172/357/64 +f 174/360/65 176/363/65 173/359/65 +f 178/369/65 180/373/65 177/367/65 +f 182/376/64 184/379/64 181/375/64 +f 185/383/63 187/387/63 188/389/63 +f 189/390/62 191/393/62 192/395/62 +f 193/399/42 194/400/42 195/403/42 +f 196/404/66 197/406/66 198/409/66 +f 199/410/67 200/412/67 201/415/67 +f 202/417/68 203/420/68 204/421/68 +f 205/423/69 206/425/69 207/427/69 +f 208/429/70 209/431/70 210/433/70 +f 211/434/66 212/436/66 213/439/66 +f 214/441/71 215/443/71 216/445/71 +f 217/447/72 219/451/72 220/453/72 +f 221/455/73 223/458/73 224/459/73 +f 226/464/74 228/469/74 225/463/74 +f 230/472/75 232/476/75 229/471/75 +f 234/480/76 236/485/76 233/478/76 +f 238/489/77 240/493/77 237/487/77 +f 241/496/78 243/501/78 244/502/78 +f 245/504/79 247/508/79 248/511/79 +f 250/515/80 252/518/80 249/512/80 +f 254/525/81 256/528/81 253/522/81 +f 257/532/82 259/536/82 260/537/82 +f 261/541/83 263/545/83 264/547/83 +f 265/550/84 266/551/84 267/553/84 +f 268/555/85 269/557/85 270/558/85 +f 271/562/86 272/563/86 273/565/86 +f 274/567/87 275/569/87 276/570/87 +f 114/233/35 110/224/35 109/223/35 +f 113/231/88 120/245/88 119/243/88 +f 7/13/62 121/247/62 3/3/62 +f 117/239/64 22/44/64 118/241/64 +f 124/252/65 9/16/65 8/14/65 +f 111/225/63 14/26/63 13/24/63 +f 20/39/89 12/23/89 11/19/89 +f 10/17/36 7/13/36 6/10/36 +f 126/257/90 116/238/90 115/234/90 +f 15/27/41 22/44/41 21/41/41 +f 5/9/91 17/33/91 16/29/91 +f 123/251/34 128/261/34 127/259/34 +f 28/54/88 23/45/88 26/51/88 +f 34/67/62 24/46/62 31/62/62 +f 35/71/64 41/84/64 36/73/64 +f 46/96/65 43/88/65 42/85/65 +f 30/60/63 51/107/63 50/103/63 +f 40/83/89 45/92/89 44/90/89 +f 48/100/90 38/76/90 37/75/90 +f 52/108/91 32/63/91 53/110/91 +f 111/226/5 28/55/5 112/227/5 +f 121/248/5 26/52/5 25/50/5 +f 3/4/5 33/65/5 4/6/5 +f 13/25/5 52/109/5 51/105/5 +f 124/253/1 48/100/1 125/255/1 +f 117/240/1 37/75/1 36/73/1 +f 18/35/1 40/83/1 19/37/1 +f 8/15/1 44/90/1 43/88/1 +f 59/121/7 54/112/7 57/118/7 +f 56/116/3 62/129/3 65/133/3 +f 70/143/4 67/138/4 66/135/4 +f 77/159/3 74/154/3 73/150/3 +f 61/125/4 82/169/4 81/167/4 +f 75/156/92 71/145/92 76/157/92 +f 79/162/93 69/142/93 68/140/93 +f 64/132/2 84/173/2 83/171/2 +f 60/123/35 27/53/35 30/59/35 +f 56/117/34 23/45/34 57/118/34 +f 65/134/36 32/63/36 31/61/36 +f 82/170/41 53/110/41 83/171/41 +f 42/87/39 75/156/39 74/152/39 +f 47/99/40 80/165/40 79/162/40 +f 67/139/37 38/77/37 68/140/37 +f 88/180/88 86/176/88 85/174/88 +f 87/179/62 92/189/62 91/186/62 +f 96/196/94 97/199/94 94/192/94 +f 104/213/95 100/205/95 102/207/95 +f 90/185/63 106/216/63 108/219/63 +f 99/203/96 102/209/96 101/206/96 +f 105/215/97 96/197/97 95/194/97 +f 93/191/91 108/221/91 107/218/91 +f 103/211/98 78/160/98 77/158/98 +f 94/193/99 69/142/99 95/194/99 +f 107/218/41 81/168/41 84/173/41 +f 58/120/35 89/182/35 88/180/35 +f 99/203/100 70/144/100 97/198/100 +f 55/115/34 85/174/34 87/178/34 +f 91/187/36 63/131/36 62/128/36 +f 73/151/101 101/206/101 100/204/101 +f 141/289/7 115/236/7 114/232/7 +f 113/231/7 129/262/7 109/222/7 +f 133/272/7 126/258/7 134/273/7 +f 137/280/88 130/264/88 138/282/88 +f 135/276/90 144/297/90 143/292/90 +f 139/284/7 119/243/7 123/250/7 +f 139/284/34 148/305/34 140/286/34 +f 150/309/35 129/262/35 132/269/35 +f 152/315/90 147/301/90 146/300/90 +f 156/323/35 141/289/35 153/316/35 +f 133/272/34 158/330/34 157/326/34 +f 155/320/88 160/333/88 159/331/88 +f 165/342/5 162/336/5 161/334/5 +f 173/358/1 170/354/1 169/350/1 +f 178/370/3 164/340/3 163/337/3 +f 181/374/4 167/347/4 166/343/4 +f 183/378/1 180/373/1 179/372/1 +f 185/382/4 171/356/4 186/385/4 +f 175/362/3 189/391/3 192/396/3 +f 188/389/5 191/394/5 190/392/5 +f 192/397/62 159/332/62 158/328/62 +f 156/324/63 187/388/63 186/384/63 +f 150/310/64 183/378/64 151/311/64 +f 148/306/65 179/372/65 178/368/65 +f 163/339/62 137/281/62 140/287/62 +f 132/270/63 168/349/63 167/345/63 +f 176/365/65 136/279/65 135/275/65 +f 143/295/64 171/356/64 170/352/64 +f 197/406/88 193/399/88 195/403/88 +f 203/419/90 199/411/90 201/413/90 +f 205/423/34 195/403/34 194/400/34 +f 209/431/35 198/409/35 197/406/35 +f 210/433/90 207/427/90 206/425/90 +f 201/415/35 211/435/35 213/437/35 +f 204/421/34 215/444/34 214/440/34 +f 213/439/88 216/445/88 215/443/88 +f 206/426/65 177/367/65 180/373/65 +f 161/334/62 194/402/62 193/398/62 +f 166/344/63 196/405/63 198/407/63 +f 214/441/62 190/392/62 189/390/62 +f 185/383/63 212/436/63 211/434/63 +f 169/351/64 200/412/64 199/410/64 +f 182/376/64 208/430/64 210/432/64 +f 174/360/65 202/417/65 204/421/65 +f 221/454/89 218/449/89 217/446/89 +f 220/453/36 226/465/36 225/462/36 +f 229/470/41 223/458/41 222/456/41 +f 228/469/91 231/473/91 230/472/91 +f 10/18/2 218/450/2 11/20/2 +f 21/42/2 224/461/2 223/457/2 +f 231/474/2 15/28/2 232/475/2 +f 227/468/2 6/11/2 5/7/2 +f 237/488/102 234/480/102 233/478/102 +f 236/486/103 242/499/103 241/497/103 +f 245/505/104 239/490/104 238/489/104 +f 244/502/105 247/508/105 246/506/105 +f 229/471/106 247/508/106 230/472/106 +f 242/500/107 228/469/107 243/501/107 +f 234/481/108 220/453/108 235/482/108 +f 221/455/109 239/491/109 222/456/109 +f 253/524/102 250/515/102 249/512/102 +f 252/519/103 258/535/103 257/530/103 +f 261/541/104 255/527/104 254/525/104 +f 260/537/105 263/546/105 262/542/105 +f 237/488/2 255/527/2 238/489/2 +f 263/546/2 245/505/2 264/547/2 +f 236/486/7 250/515/7 233/478/7 +f 258/535/7 244/503/7 259/536/7 +f 269/557/110 265/550/110 267/553/110 +f 267/553/111 271/562/111 273/565/111 +f 275/569/112 270/558/112 269/557/112 +f 273/565/113 276/570/113 275/569/113 +f 274/568/114 262/544/114 261/540/114 +f 257/533/115 272/564/115 271/560/115 +f 249/514/116 266/552/116 265/548/116 +f 268/556/117 254/526/117 253/523/117 +f 157/326/7 146/300/7 145/299/7 +f 149/307/7 154/318/7 153/316/7 +f 3/4/5 25/50/5 34/68/5 +f 19/37/1 40/83/1 44/90/1 +f 10/18/2 6/11/2 226/466/2 +f 21/42/2 223/457/2 232/475/2 +f 5/7/2 16/31/2 231/474/2 +f 31/62/3 24/46/3 56/116/3 +f 35/70/4 67/138/4 72/148/4 +f 112/227/5 28/55/5 26/52/5 +f 45/93/118 39/80/118 72/149/118 +f 13/25/5 51/105/5 29/58/5 +f 20/40/2 11/20/2 218/450/2 +f 122/249/3 7/13/3 9/16/3 +f 22/44/4 14/26/4 110/224/4 +f 27/53/7 59/121/7 57/118/7 +f 63/131/2 93/191/2 107/218/2 +f 71/145/8 99/203/8 101/206/8 +f 72/147/3 2/2/3 1/1/3 +f 58/120/7 88/180/7 85/174/7 +f 50/103/4 82/169/4 60/122/4 +f 125/255/1 48/100/1 37/75/1 +f 32/63/2 64/132/2 83/171/2 +f 47/99/9 79/162/9 68/140/9 +f 129/262/4 149/307/4 153/316/4 +f 153/316/7 141/289/7 114/232/7 +f 114/232/7 109/222/7 129/262/7 +f 102/208/10 98/200/10 96/195/10 +f 78/160/11 105/215/11 95/194/11 +f 55/114/3 87/179/3 91/186/3 +f 66/135/4 94/192/4 97/199/4 +f 77/159/3 73/150/3 100/205/3 +f 108/220/5 92/188/5 86/175/5 +f 61/125/4 81/167/4 106/216/4 +f 134/273/7 126/258/7 115/236/7 +f 123/250/7 127/260/7 133/272/7 +f 157/326/4 145/299/4 139/284/4 +f 123/250/7 133/272/7 157/326/7 +f 138/282/7 130/264/7 113/231/7 +f 159/332/5 191/394/5 187/388/5 +f 137/281/5 162/336/5 168/349/5 +f 161/334/5 193/398/5 196/405/5 +f 177/366/3 205/422/3 194/401/3 +f 166/343/4 198/408/4 208/428/4 +f 132/268/4 167/347/4 184/380/4 +f 143/293/1 170/354/1 176/364/1 +f 156/322/4 186/385/4 171/356/4 +f 148/304/3 178/370/3 163/337/3 +f 152/315/7 146/300/7 160/333/7 +f 136/279/3 175/362/3 192/396/3 +f 203/418/7 201/414/7 213/438/7 +f 217/446/119 234/479/119 240/492/119 +f 195/403/7 207/427/7 209/431/7 +f 174/360/3 204/421/3 214/440/3 +f 169/350/1 199/411/1 202/416/1 +f 172/357/4 185/382/4 211/435/4 +f 182/376/1 210/432/1 206/426/1 +f 190/392/5 216/445/5 212/436/5 +f 233/478/7 250/515/7 256/529/7 +f 18/35/1 117/240/1 36/73/1 +f 8/15/1 43/88/1 49/102/1 +f 4/6/5 33/65/5 52/109/5 +f 246/507/7 263/546/7 259/536/7 +f 222/456/120 239/491/120 248/509/120 +f 230/472/121 247/508/121 243/501/121 +f 225/462/122 242/498/122 235/482/122 +f 275/569/2 269/557/2 267/553/2 +f 236/486/18 241/497/18 258/535/18 +f 249/513/17 265/549/17 268/554/17 +f 245/505/16 238/489/16 255/527/16 +f 254/526/19 270/559/19 274/566/19 +f 262/544/20 276/571/20 272/564/20 +f 257/531/21 271/561/21 266/552/21 +f 151/311/1 183/378/1 179/372/1 +f 46/95/3 42/86/3 74/154/3 +f 7/12/123 3/3/123 4/5/123 +f 4/5/124 5/8/124 6/10/124 +f 12/22/125 8/14/125 9/16/125 +f 9/16/126 10/17/126 11/21/126 +f 17/32/127 13/24/127 14/26/127 +f 14/26/128 15/27/128 16/30/128 +f 22/43/129 18/34/129 19/36/129 +f 19/36/130 20/38/130 21/41/130 +f 23/45/131 24/47/131 25/48/131 +f 27/53/132 28/54/132 29/56/132 +f 32/63/133 33/64/133 34/66/133 +f 36/74/134 37/75/134 38/76/134 +f 43/88/135 44/89/135 45/91/135 +f 47/98/136 48/100/136 49/101/136 +f 51/106/137 52/108/137 53/110/137 +f 55/113/34 56/117/34 57/118/34 +f 59/121/35 60/123/35 61/124/35 +f 63/130/36 64/132/36 65/134/36 +f 67/137/37 68/141/37 69/142/37 +f 73/151/39 74/153/39 75/155/39 +f 78/160/40 79/161/40 80/163/40 +f 82/170/41 83/171/41 84/172/41 +f 113/230/138 109/223/138 110/224/138 +f 110/224/139 111/225/139 112/228/139 +f 118/241/140 114/233/140 115/235/140 +f 116/237/141 117/239/141 118/241/141 +f 123/251/142 119/242/142 120/244/142 +f 120/244/143 121/247/143 122/249/143 +f 128/261/144 124/252/144 125/254/144 +f 125/254/145 126/256/145 127/259/145 +f 130/263/146 131/265/146 132/269/146 +f 134/273/147 135/276/147 136/277/147 +f 138/282/148 139/283/148 140/288/148 +f 142/290/149 143/294/149 144/296/149 +f 145/298/150 146/300/150 147/301/150 +f 149/307/151 150/309/151 151/312/151 +f 153/316/152 154/317/152 155/319/152 +f 157/325/153 158/329/153 159/331/153 +f 162/335/62 163/338/62 164/341/62 +f 166/344/63 167/346/63 168/348/63 +f 169/351/64 170/353/64 171/355/64 +f 174/360/65 175/361/65 176/363/65 +f 178/369/65 179/371/65 180/373/65 +f 182/376/64 183/377/64 184/379/64 +f 185/383/63 186/386/63 187/387/63 +f 189/390/62 190/392/62 191/393/62 +f 217/447/154 218/448/154 219/451/154 +f 221/455/155 222/456/155 223/458/155 +f 226/464/156 227/467/156 228/469/156 +f 230/472/157 231/473/157 232/476/157 +f 234/480/158 235/483/158 236/485/158 +f 238/489/159 239/490/159 240/493/159 +f 241/496/160 242/500/160 243/501/160 +f 245/504/161 246/506/161 247/508/161 +f 250/515/162 251/516/162 252/518/162 +f 254/525/163 255/527/163 256/528/163 +f 257/532/164 258/534/164 259/536/164 +f 261/541/165 262/543/165 263/545/165 +f 114/233/35 118/241/35 110/224/35 +f 113/231/88 112/229/88 120/245/88 +f 7/13/62 122/249/62 121/247/62 +f 117/239/64 18/34/64 22/44/64 +f 124/252/65 128/261/65 9/16/65 +f 111/225/63 110/224/63 14/26/63 +f 20/39/89 19/37/89 12/23/89 +f 10/17/36 9/16/36 7/13/36 +f 126/257/90 125/255/90 116/238/90 +f 15/27/41 14/26/41 22/44/41 +f 5/9/91 4/6/91 17/33/91 +f 123/251/34 122/249/34 128/261/34 +f 28/54/88 27/53/88 23/45/88 +f 34/67/62 25/49/62 24/46/62 +f 35/71/166 39/81/166 41/84/166 +f 46/96/65 49/102/65 43/88/65 +f 30/60/63 29/57/63 51/107/63 +f 40/83/167 39/81/167 45/92/167 +f 48/100/90 47/98/90 38/76/90 +f 52/108/91 33/64/91 32/63/91 +f 111/226/5 29/58/5 28/55/5 +f 121/248/5 120/246/5 26/52/5 +f 3/4/5 34/68/5 33/65/5 +f 13/25/5 17/33/5 52/109/5 +f 124/253/1 49/102/1 48/100/1 +f 117/240/1 116/238/1 37/75/1 +f 18/35/1 41/84/1 40/83/1 +f 8/15/1 12/23/1 44/90/1 +f 59/121/7 58/120/7 54/112/7 +f 56/116/3 55/114/3 62/129/3 +f 70/143/4 72/148/4 67/138/4 +f 77/159/3 80/164/3 74/154/3 +f 61/125/4 60/122/4 82/169/4 +f 75/156/92 72/149/92 71/145/92 +f 79/162/93 78/160/93 69/142/93 +f 64/132/2 63/131/2 84/173/2 +f 60/123/35 59/121/35 27/53/35 +f 56/117/34 24/47/34 23/45/34 +f 65/134/36 64/132/36 32/63/36 +f 82/170/41 50/104/41 53/110/41 +f 42/87/39 45/93/39 75/156/39 +f 47/99/40 46/97/40 80/165/40 +f 67/139/37 35/72/37 38/77/37 +f 88/180/88 90/184/88 86/176/88 +f 87/179/62 86/177/62 92/189/62 +f 96/196/94 98/201/94 97/199/94 +f 104/213/95 103/210/95 100/205/95 +f 90/185/63 89/181/63 106/216/63 +f 99/203/96 98/202/96 102/209/96 +f 105/215/97 104/214/97 96/197/97 +f 93/191/91 92/190/91 108/221/91 +f 103/211/98 105/215/98 78/160/98 +f 94/193/99 66/136/99 69/142/99 +f 107/218/41 106/217/41 81/168/41 +f 58/120/35 61/126/35 89/182/35 +f 99/203/100 71/145/100 70/144/100 +f 55/115/34 54/112/34 85/174/34 +f 91/187/36 93/191/36 63/131/36 +f 73/151/101 76/157/101 101/206/101 +f 141/289/7 144/297/7 115/236/7 +f 113/231/7 130/264/7 129/262/7 +f 133/272/7 127/260/7 126/258/7 +f 137/280/88 131/266/88 130/264/88 +f 135/276/90 134/273/90 144/297/90 +f 139/284/7 138/282/7 119/243/7 +f 139/284/34 145/299/34 148/305/34 +f 150/309/35 149/307/35 129/262/35 +f 152/315/90 151/313/90 147/301/90 +f 156/323/35 142/290/35 141/289/35 +f 133/272/34 136/278/34 158/330/34 +f 155/320/88 154/318/88 160/333/88 +f 165/342/5 168/349/5 162/336/5 +f 173/358/1 176/364/1 170/354/1 +f 178/370/3 177/366/3 164/340/3 +f 181/374/4 184/380/4 167/347/4 +f 183/378/1 182/376/1 180/373/1 +f 185/382/4 172/357/4 171/356/4 +f 175/362/3 174/360/3 189/391/3 +f 188/389/5 187/388/5 191/394/5 +f 192/397/62 191/394/62 159/332/62 +f 156/324/63 155/321/63 187/388/63 +f 150/310/64 184/381/64 183/378/64 +f 148/306/65 147/302/65 179/372/65 +f 163/339/62 162/336/62 137/281/62 +f 132/270/63 131/267/63 168/349/63 +f 176/365/65 175/362/65 136/279/65 +f 143/295/64 142/291/64 171/356/64 +f 197/406/88 196/404/88 193/399/88 +f 203/419/90 202/416/90 199/411/90 +f 205/423/34 207/427/34 195/403/34 +f 209/431/35 208/429/35 198/409/35 +f 210/433/90 209/431/90 207/427/90 +f 201/415/35 200/412/35 211/435/35 +f 204/421/34 203/420/34 215/444/34 +f 213/439/88 212/436/88 216/445/88 +f 206/426/65 205/424/65 177/367/65 +f 161/334/62 164/341/62 194/402/62 +f 166/344/63 165/342/63 196/405/63 +f 214/441/62 216/445/62 190/392/62 +f 185/383/63 188/389/63 212/436/63 +f 169/351/64 172/357/64 200/412/64 +f 182/376/64 181/375/64 208/430/64 +f 174/360/65 173/359/65 202/417/65 +f 221/454/89 224/460/89 218/449/89 +f 220/453/36 219/451/36 226/465/36 +f 229/470/41 232/477/41 223/458/41 +f 228/469/91 227/467/91 231/473/91 +f 10/18/2 219/452/2 218/450/2 +f 21/42/2 20/40/2 224/461/2 +f 231/474/2 16/31/2 15/28/2 +f 227/468/2 226/466/2 6/11/2 +f 237/488/102 240/494/102 234/480/102 +f 236/486/103 235/484/103 242/499/103 +f 245/505/104 248/510/104 239/490/104 +f 244/502/105 243/501/105 247/508/105 +f 229/471/168 248/511/168 247/508/168 +f 242/500/169 225/463/169 228/469/169 +f 234/481/170 217/447/170 220/453/170 +f 221/455/171 240/495/171 239/491/171 +f 253/524/102 256/529/102 250/515/102 +f 252/519/103 251/517/103 258/535/103 +f 261/541/104 264/547/104 255/527/104 +f 260/537/105 259/536/105 263/546/105 +f 237/488/7 256/529/7 255/527/7 +f 263/546/7 246/507/7 245/505/7 +f 236/486/2 251/517/2 250/515/2 +f 258/535/2 241/497/2 244/503/2 +f 269/557/110 268/555/110 265/550/110 +f 267/553/111 266/551/111 271/562/111 +f 275/569/112 274/567/112 270/558/112 +f 273/565/113 272/563/113 276/570/113 +f 274/568/114 276/571/114 262/544/114 +f 257/533/115 260/538/115 272/564/115 +f 249/514/116 252/520/116 266/552/116 +f 268/556/117 270/559/117 254/526/117 +f 157/326/7 160/333/7 146/300/7 +f 149/307/7 152/315/7 154/318/7 +f 3/4/5 121/248/5 25/50/5 diff --git a/examples/nitro_engine/simple_model/assets/teapot.grit b/examples/nitro_engine/simple_model/assets/teapot.grit new file mode 100644 index 0000000..207c056 --- /dev/null +++ b/examples/nitro_engine/simple_model/assets/teapot.grit @@ -0,0 +1,2 @@ +# 16 bit texture bitmap, force alpha bit to 1 +-gx -gb -gB16 -gT! diff --git a/examples/nitro_engine/simple_model/assets/teapot.png b/examples/nitro_engine/simple_model/assets/teapot.png new file mode 100644 index 0000000..eafd9fa Binary files /dev/null and b/examples/nitro_engine/simple_model/assets/teapot.png differ diff --git a/examples/nitro_engine/simple_model/build.py b/examples/nitro_engine/simple_model/build.py new file mode 100644 index 0000000..3c269af --- /dev/null +++ b/examples/nitro_engine/simple_model/build.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['NE', 'nds9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nitro-engine'] +) +arm9.add_grit(['assets']) +arm9.add_nitro_engine_obj(['assets']) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9], + game_title='NE: Simple model', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nitro_engine/simple_model/source/main.c b/examples/nitro_engine/simple_model/source/main.c new file mode 100644 index 0000000..ef2fdcc --- /dev/null +++ b/examples/nitro_engine/simple_model/source/main.c @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2008-2011, 2019, 2022 +// +// This file is part of Nitro Engine + +#include + +#include "models/robot_dl.h" +#include "grit/teapot_png.h" + +NE_Camera *Camera; +NE_Model *Model; +NE_Material *Material; + +void Draw3DScene(void) +{ + NE_CameraUse(Camera); + NE_ModelDraw(Model); +} + +int main(void) +{ + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + // Init Nitro Engine in normal 3D mode + NE_Init3D(); + + // libnds uses VRAM_C for the text console, reserve A and B only + NE_TextureSystemReset(0, 0, NE_VRAM_AB); + // Init console in non-3D screen + consoleDemoInit(); + + // Allocate space for the objects we'll use + Model = NE_ModelCreate(NE_Static); + Camera = NE_CameraCreate(); + Material = NE_MaterialCreate(); + + // Set coordinates for the camera + NE_CameraSet(Camera, + -8, 3, 0, // Position + 0, 3, 0, // Look at + 0, 1, 0); // Up direction + + // Load mesh from RAM and assign it to the object "Model". + NE_ModelLoadStaticMesh(Model, (u32 *)robot_dl); + // Load a RGB texture from RAM and assign it to "Material". + NE_MaterialTexLoad(Material, NE_RGB5, 256, 256, NE_TEXGEN_TEXCOORD, + (u8 *)teapot_pngBitmap); + + // Assign texture to model... + NE_ModelSetMaterial(Model, Material); + + // We set up a light and its color + NE_LightSet(0, NE_White, -0.5, -0.5, -0.5); + + while (1) + { + // Wait for next frame + NE_WaitForVBL(0); + + // Get keys information + scanKeys(); + uint32_t keys = keysHeld(); + + printf("\x1b[0;0HPad: Rotate."); + + // Rotate model using the pad + if (keys & KEY_UP) + NE_ModelRotate(Model, 0, 0, -2); + if (keys & KEY_DOWN) + NE_ModelRotate(Model, 0, 0, 2); + if (keys & KEY_RIGHT) + NE_ModelRotate(Model, 0, 2, 0); + if (keys & KEY_LEFT) + NE_ModelRotate(Model, 0, -2, 0); + + // Draw scene + NE_Process(Draw3DScene); + } + + return 0; +} diff --git a/examples/nitro_engine/specular_material/.gitignore b/examples/nitro_engine/specular_material/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nitro_engine/specular_material/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nitro_engine/specular_material/architectds b/examples/nitro_engine/specular_material/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/specular_material/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/specular_material/assets/teapot.grit b/examples/nitro_engine/specular_material/assets/teapot.grit new file mode 100644 index 0000000..207c056 --- /dev/null +++ b/examples/nitro_engine/specular_material/assets/teapot.grit @@ -0,0 +1,2 @@ +# 16 bit texture bitmap, force alpha bit to 1 +-gx -gb -gB16 -gT! diff --git a/examples/nitro_engine/specular_material/assets/teapot.json b/examples/nitro_engine/specular_material/assets/teapot.json new file mode 100644 index 0000000..7c9b08d --- /dev/null +++ b/examples/nitro_engine/specular_material/assets/teapot.json @@ -0,0 +1,4 @@ +{ + "texture": [ 256, 256], + "scale": 0.1 +} diff --git a/examples/nitro_engine/specular_material/assets/teapot.obj b/examples/nitro_engine/specular_material/assets/teapot.obj new file mode 100644 index 0000000..b6c6810 --- /dev/null +++ b/examples/nitro_engine/specular_material/assets/teapot.obj @@ -0,0 +1,2866 @@ +# Max2Obj Version 4.0 Mar 10th, 2001 +# +# object Teapot01 to come ... +# +v 5.929688 4.125000 0.000000 +v 5.832031 4.494141 0.000000 +v 5.945313 4.617188 0.000000 +v 6.175781 4.494141 0.000000 +v 6.429688 4.125000 0.000000 +v 5.387188 4.125000 2.747500 +v 5.297100 4.494141 2.709170 +v 5.401602 4.617188 2.753633 +v 5.614209 4.494141 2.844092 +v 5.848437 4.125000 2.943750 +v 3.899688 4.125000 4.970000 +v 3.830352 4.494141 4.900664 +v 3.910782 4.617188 4.981094 +v 4.074414 4.494141 5.144727 +v 4.254687 4.125000 5.325000 +v 1.677188 4.125000 6.457500 +v 1.638858 4.494141 6.367412 +v 1.683320 4.617188 6.471914 +v 1.773780 4.494141 6.684522 +v 1.873438 4.125000 6.918750 +v -1.070312 4.125000 7.000000 +v -1.070312 4.494141 6.902344 +v -1.070312 4.617188 7.015625 +v -1.070312 4.494141 7.246094 +v -1.070312 4.125000 7.500000 +v -4.007656 4.125000 6.457500 +v -3.859572 4.494141 6.367412 +v -3.847676 4.617188 6.471914 +v -3.917371 4.494141 6.684522 +v -4.014062 4.125000 6.918750 +v -6.209063 4.125000 4.970000 +v -6.042168 4.494141 4.900664 +v -6.072500 4.617188 4.981094 +v -6.217675 4.494141 5.144727 +v -6.395312 4.125000 5.325000 +v -7.591093 4.125000 2.747500 +v -7.464421 4.494141 2.709170 +v -7.550137 4.617188 2.753633 +v -7.755822 4.494141 2.844092 +v -7.989062 4.125000 2.943750 +v -8.070313 4.125000 0.000000 +v -7.972656 4.494141 0.000000 +v -8.085938 4.617188 0.000000 +v -8.316406 4.494141 0.000000 +v -8.570313 4.125000 0.000000 +v -7.527812 4.125000 -2.747500 +v -7.437724 4.494141 -2.709170 +v -7.542227 4.617188 -2.753633 +v -7.754834 4.494141 -2.844092 +v -7.989062 4.125000 -2.943750 +v -6.040312 4.125000 -4.970000 +v -5.970977 4.494141 -4.900664 +v -6.051406 4.617188 -4.981094 +v -6.215039 4.494141 -5.144727 +v -6.395312 4.125000 -5.325000 +v -3.817812 4.125000 -6.457500 +v -3.779482 4.494141 -6.367412 +v -3.823945 4.617188 -6.471914 +v -3.914404 4.494141 -6.684522 +v -4.014062 4.125000 -6.918750 +v -1.070312 4.125000 -7.000000 +v -1.070312 4.494141 -6.902344 +v -1.070312 4.617188 -7.015625 +v -1.070312 4.494141 -7.246094 +v -1.070312 4.125000 -7.500000 +v 1.677188 4.125000 -6.457500 +v 1.638858 4.494141 -6.367412 +v 1.683320 4.617188 -6.471914 +v 1.773780 4.494141 -6.684522 +v 1.873438 4.125000 -6.918750 +v 3.899688 4.125000 -4.970000 +v 3.830352 4.494141 -4.900664 +v 3.910782 4.617188 -4.981094 +v 4.074414 4.494141 -5.144727 +v 4.254687 4.125000 -5.325000 +v 5.387188 4.125000 -2.747500 +v 5.297100 4.494141 -2.709170 +v 5.401602 4.617188 -2.753633 +v 5.614209 4.494141 -2.844092 +v 5.848437 4.125000 -2.943750 +v 7.347656 2.162109 0.000000 +v 8.148438 0.234375 0.000000 +v 8.714844 -1.623047 0.000000 +v 8.929688 -3.375000 0.000000 +v 6.695264 2.162109 3.304053 +v 7.433985 0.234375 3.618360 +v 7.956494 -1.623047 3.840674 +v 8.154688 -3.375000 3.925000 +v 4.906446 2.162109 5.976758 +v 5.475000 0.234375 6.545312 +v 5.877149 -1.623047 6.947461 +v 6.029688 -3.375000 7.100000 +v 2.233740 2.162109 7.765576 +v 2.548047 0.234375 8.504297 +v 2.770362 -1.623047 9.026807 +v 2.854688 -3.375000 9.225000 +v -1.070312 2.162109 8.417969 +v -1.070312 0.234375 9.218750 +v -1.070312 -1.623047 9.785156 +v -1.070312 -3.375000 10.000000 +v -4.374365 2.162109 7.765576 +v -4.688672 0.234375 8.504297 +v -4.910986 -1.623047 9.026807 +v -4.995313 -3.375000 9.225000 +v -7.047071 2.162109 5.976758 +v -7.615624 0.234375 6.545312 +v -8.017773 -1.623047 6.947461 +v -8.170312 -3.375000 7.100000 +v -8.835889 2.162109 3.304053 +v -9.574610 0.234375 3.618360 +v -10.097119 -1.623047 3.840674 +v -10.295313 -3.375000 3.925000 +v -9.488281 2.162109 0.000000 +v -10.289063 0.234375 0.000000 +v -10.855469 -1.623047 0.000000 +v -11.070313 -3.375000 0.000000 +v -8.835889 2.162109 -3.304053 +v -9.574610 0.234375 -3.618360 +v -10.097119 -1.623047 -3.840674 +v -10.295313 -3.375000 -3.925000 +v -7.047071 2.162109 -5.976758 +v -7.615624 0.234375 -6.545312 +v -8.017773 -1.623047 -6.947461 +v -8.170312 -3.375000 -7.100000 +v -4.374365 2.162109 -7.765576 +v -4.688672 0.234375 -8.504297 +v -4.910986 -1.623047 -9.026807 +v -4.995313 -3.375000 -9.225000 +v -1.070312 2.162109 -8.417969 +v -1.070312 0.234375 -9.218750 +v -1.070312 -1.623047 -9.785156 +v -1.070312 -3.375000 -10.000000 +v 2.233740 2.162109 -7.765576 +v 2.548047 0.234375 -8.504297 +v 2.770362 -1.623047 -9.026807 +v 2.854688 -3.375000 -9.225000 +v 4.906446 2.162109 -5.976758 +v 5.475000 0.234375 -6.545312 +v 5.877149 -1.623047 -6.947461 +v 6.029688 -3.375000 -7.100000 +v 6.695264 2.162109 -3.304053 +v 7.433985 0.234375 -3.618360 +v 7.956494 -1.623047 -3.840674 +v 8.154688 -3.375000 -3.925000 +v 8.539063 -4.857422 0.000000 +v 7.679688 -5.953125 0.000000 +v 6.820313 -6.697266 0.000000 +v 6.429688 -7.125000 0.000000 +v 7.794336 -4.857422 3.771680 +v 7.001562 -5.953125 3.434375 +v 6.208789 -6.697266 3.097070 +v 5.848437 -7.125000 2.943750 +v 5.752343 -4.857422 6.822656 +v 5.142187 -5.953125 6.212500 +v 4.532031 -6.697266 5.602344 +v 4.254687 -7.125000 5.325000 +v 2.701367 -4.857422 8.864649 +v 2.364063 -5.953125 8.071875 +v 2.026758 -6.697266 7.279101 +v 1.873438 -7.125000 6.918750 +v -1.070312 -4.857422 9.609375 +v -1.070312 -5.953125 8.750000 +v -1.070312 -6.697266 7.890625 +v -1.070312 -7.125000 7.500000 +v -4.841992 -4.857422 8.864649 +v -4.504687 -5.953125 8.071875 +v -4.167383 -6.697266 7.279101 +v -4.014062 -7.125000 6.918750 +v -7.892968 -4.857422 6.822656 +v -7.282812 -5.953125 6.212500 +v -6.672656 -6.697266 5.602344 +v -6.395312 -7.125000 5.325000 +v -9.934961 -4.857422 3.771680 +v -9.142187 -5.953125 3.434375 +v -8.349414 -6.697266 3.097070 +v -7.989062 -7.125000 2.943750 +v -10.679688 -4.857422 0.000000 +v -9.820313 -5.953125 0.000000 +v -8.960938 -6.697266 0.000000 +v -8.570313 -7.125000 0.000000 +v -9.934961 -4.857422 -3.771680 +v -9.142187 -5.953125 -3.434375 +v -8.349414 -6.697266 -3.097070 +v -7.989062 -7.125000 -2.943750 +v -7.892968 -4.857422 -6.822656 +v -7.282812 -5.953125 -6.212500 +v -6.672656 -6.697266 -5.602344 +v -6.395312 -7.125000 -5.325000 +v -4.841992 -4.857422 -8.864649 +v -4.504687 -5.953125 -8.071875 +v -4.167383 -6.697266 -7.279101 +v -4.014062 -7.125000 -6.918750 +v -1.070312 -4.857422 -9.609375 +v -1.070312 -5.953125 -8.750000 +v -1.070312 -6.697266 -7.890625 +v -1.070312 -7.125000 -7.500000 +v 2.701367 -4.857422 -8.864649 +v 2.364063 -5.953125 -8.071875 +v 2.026758 -6.697266 -7.279101 +v 1.873438 -7.125000 -6.918750 +v 5.752343 -4.857422 -6.822656 +v 5.142187 -5.953125 -6.212500 +v 4.532031 -6.697266 -5.602344 +v 4.254687 -7.125000 -5.325000 +v 7.794336 -4.857422 -3.771680 +v 7.001562 -5.953125 -3.434375 +v 6.208789 -6.697266 -3.097070 +v 5.848437 -7.125000 -2.943750 +v 6.259766 -7.400391 0.000000 +v 5.351563 -7.640625 0.000000 +v 3.107422 -7.810547 0.000000 +v -1.070312 -7.875000 0.000000 +v 5.691685 -7.400391 2.877056 +v 4.853868 -7.640625 2.520586 +v 2.783648 -7.810547 1.639761 +v 4.134043 -7.400391 5.204355 +v 3.489219 -7.640625 4.559531 +v 1.895879 -7.810547 2.966191 +v 1.806743 -7.400391 6.761997 +v 1.450274 -7.640625 5.924180 +v 0.569448 -7.810547 3.853960 +v -1.070312 -7.400391 7.330078 +v -1.070312 -7.640625 6.421875 +v -1.070312 -7.810547 4.177734 +v -3.947368 -7.400391 6.761997 +v -3.590898 -7.640625 5.924180 +v -2.710073 -7.810547 3.853960 +v -6.274668 -7.400391 5.204355 +v -5.629844 -7.640625 4.559531 +v -4.036504 -7.810547 2.966191 +v -7.832309 -7.400391 2.877056 +v -6.994492 -7.640625 2.520586 +v -4.924272 -7.810547 1.639761 +v -8.400391 -7.400391 0.000000 +v -7.492188 -7.640625 0.000000 +v -5.248047 -7.810547 0.000000 +v -7.832309 -7.400391 -2.877056 +v -6.994492 -7.640625 -2.520586 +v -4.924272 -7.810547 -1.639761 +v -6.274668 -7.400391 -5.204355 +v -5.629844 -7.640625 -4.559531 +v -4.036504 -7.810547 -2.966191 +v -3.947368 -7.400391 -6.761997 +v -3.590898 -7.640625 -5.924180 +v -2.710073 -7.810547 -3.853960 +v -1.070312 -7.400391 -7.330078 +v -1.070312 -7.640625 -6.421875 +v -1.070312 -7.810547 -4.177734 +v 1.806743 -7.400391 -6.761997 +v 1.450274 -7.640625 -5.924180 +v 0.569448 -7.810547 -3.853960 +v 4.134043 -7.400391 -5.204355 +v 3.489219 -7.640625 -4.559531 +v 1.895879 -7.810547 -2.966191 +v 5.691685 -7.400391 -2.877056 +v 4.853868 -7.640625 -2.520586 +v 2.783648 -7.810547 -1.639761 +v -9.070313 2.250000 0.000000 +v -11.406250 2.232422 0.000000 +v -13.132813 2.109375 0.000000 +v -14.203125 1.775391 0.000000 +v -14.570313 1.125000 0.000000 +v -8.992188 2.425781 0.843750 +v -11.475830 2.405457 0.843750 +v -13.298828 2.263184 0.843750 +v -14.421631 1.877014 0.843750 +v -14.804688 1.125000 0.843750 +v -8.820313 2.812500 1.125000 +v -11.628906 2.786134 1.125000 +v -13.664063 2.601563 1.125000 +v -14.902344 2.100586 1.125000 +v -15.320313 1.125000 1.125000 +v -8.648438 3.199219 0.843750 +v -11.781982 3.166809 0.843750 +v -14.029297 2.939941 0.843750 +v -15.383057 2.324158 0.843750 +v -15.835938 1.125000 0.843750 +v -8.570313 3.375000 0.000000 +v -11.851563 3.339844 0.000000 +v -14.195313 3.093750 0.000000 +v -15.601563 2.425781 0.000000 +v -16.070313 1.125000 0.000000 +v -8.648438 3.199219 -0.843750 +v -11.781982 3.166809 -0.843750 +v -14.029297 2.939941 -0.843750 +v -15.383057 2.324158 -0.843750 +v -15.835938 1.125000 -0.843750 +v -8.820313 2.812500 -1.125000 +v -11.628906 2.786134 -1.125000 +v -13.664063 2.601563 -1.125000 +v -14.902344 2.100586 -1.125000 +v -15.320313 1.125000 -1.125000 +v -8.992188 2.425781 -0.843750 +v -11.475830 2.405457 -0.843750 +v -13.298828 2.263184 -0.843750 +v -14.421631 1.877014 -0.843750 +v -14.804688 1.125000 -0.843750 +v -14.375000 0.105469 0.000000 +v -13.757813 -1.125000 0.000000 +v -12.671875 -2.355469 0.000000 +v -11.070313 -3.375000 0.000000 +v -14.588013 0.007050 0.843750 +v -13.909180 -1.275146 0.843750 +v -12.724976 -2.540863 0.843750 +v -10.992188 -3.609375 0.843750 +v -15.056641 -0.209473 1.125000 +v -14.242188 -1.605469 1.125000 +v -12.841797 -2.948730 1.125000 +v -10.820313 -4.125000 1.125000 +v -15.525269 -0.425995 0.843750 +v -14.575195 -1.935791 0.843750 +v -12.958618 -3.356598 0.843750 +v -10.648438 -4.640625 0.843750 +v -15.738281 -0.524414 0.000000 +v -14.726563 -2.085938 0.000000 +v -13.011719 -3.541992 0.000000 +v -10.570313 -4.875000 0.000000 +v -15.525269 -0.425995 -0.843750 +v -14.575195 -1.935791 -0.843750 +v -12.958618 -3.356598 -0.843750 +v -10.648438 -4.640625 -0.843750 +v -15.056641 -0.209473 -1.125000 +v -14.242188 -1.605469 -1.125000 +v -12.841797 -2.948730 -1.125000 +v -10.820313 -4.125000 -1.125000 +v -14.588013 0.007050 -0.843750 +v -13.909180 -1.275146 -0.843750 +v -12.724976 -2.540863 -0.843750 +v -10.992188 -3.609375 -0.843750 +v 7.429688 -0.750000 0.000000 +v 9.828125 -0.199219 0.000000 +v 10.867188 1.125000 0.000000 +v 11.437500 2.730469 0.000000 +v 12.429688 4.125000 0.000000 +v 7.429688 -1.394531 1.856250 +v 10.011230 -0.677124 1.676074 +v 11.101563 0.846680 1.279688 +v 11.723145 2.629761 0.883301 +v 12.898438 4.125000 0.703125 +v 7.429688 -2.812500 2.475000 +v 10.414063 -1.728516 2.234766 +v 11.617188 0.234375 1.706250 +v 12.351563 2.408203 1.177734 +v 13.929688 4.125000 0.937500 +v 7.429688 -4.230469 1.856250 +v 10.816895 -2.779907 1.676074 +v 12.132813 -0.377930 1.279688 +v 12.979980 2.186646 0.883301 +v 14.960938 4.125000 0.703125 +v 7.429688 -4.875000 0.000000 +v 11.000000 -3.257813 0.000000 +v 12.367188 -0.656250 0.000000 +v 13.265625 2.085938 0.000000 +v 15.429688 4.125000 0.000000 +v 7.429688 -4.230469 -1.856250 +v 10.816895 -2.779907 -1.676074 +v 12.132813 -0.377930 -1.279688 +v 12.979980 2.186646 -0.883301 +v 14.960938 4.125000 -0.703125 +v 7.429688 -2.812500 -2.475000 +v 10.414063 -1.728516 -2.234766 +v 11.617188 0.234375 -1.706250 +v 12.351563 2.408203 -1.177734 +v 13.929688 4.125000 -0.937500 +v 7.429688 -1.394531 -1.856250 +v 10.011230 -0.677124 -1.676074 +v 11.101563 0.846680 -1.279688 +v 11.723145 2.629761 -0.883301 +v 12.898438 4.125000 -0.703125 +v 12.789063 4.335938 0.000000 +v 13.054688 4.406250 0.000000 +v 13.132813 4.335938 0.000000 +v 12.929688 4.125000 0.000000 +v 13.291077 4.346237 0.659180 +v 13.525879 4.422729 0.562500 +v 13.532898 4.350357 0.465820 +v 13.242188 4.125000 0.421875 +v 14.395508 4.368896 0.878906 +v 14.562500 4.458984 0.750000 +v 14.413086 4.382080 0.621094 +v 13.929688 4.125000 0.562500 +v 15.499939 4.391556 0.659180 +v 15.599121 4.495239 0.562500 +v 15.293274 4.413804 0.465820 +v 14.617188 4.125000 0.421875 +v 16.001953 4.401855 0.000000 +v 16.070313 4.511719 0.000000 +v 15.693359 4.428224 0.000000 +v 14.929688 4.125000 0.000000 +v 15.499939 4.391556 -0.659180 +v 15.599121 4.495239 -0.562500 +v 15.293274 4.413804 -0.465820 +v 14.617188 4.125000 -0.421875 +v 14.395508 4.368896 -0.878906 +v 14.562500 4.458984 -0.750000 +v 14.413086 4.382080 -0.621094 +v 13.929688 4.125000 -0.562500 +v 13.291077 4.346237 -0.659180 +v 13.525879 4.422729 -0.562500 +v 13.532898 4.350357 -0.465820 +v 13.242188 4.125000 -0.421875 +v -1.070312 7.875000 0.000000 +v 0.632813 7.628906 0.000000 +v 0.554688 7.031250 0.000000 +v -0.085937 6.292969 0.000000 +v -0.070312 5.625000 0.000000 +v 0.501414 7.628906 0.670256 +v 0.429278 7.031250 0.639395 +v -0.162029 6.292969 0.386960 +v -0.147812 5.625000 0.392500 +v 0.140489 7.628906 1.210801 +v 0.084844 7.031250 1.155156 +v -0.370879 6.292969 0.699434 +v -0.360312 5.625000 0.710000 +v -0.400056 7.628906 1.571726 +v -0.430918 7.031250 1.499590 +v -0.683352 6.292969 0.908284 +v -0.677812 5.625000 0.922500 +v -1.070312 7.628906 1.703125 +v -1.070312 7.031250 1.625000 +v -1.070312 6.292969 0.984375 +v -1.070312 5.625000 1.000000 +v -1.740569 7.628906 1.571726 +v -1.709707 7.031250 1.499590 +v -1.457273 6.292969 0.908284 +v -1.462812 5.625000 0.922500 +v -2.281113 7.628906 1.210801 +v -2.225469 7.031250 1.155156 +v -1.769746 6.292969 0.699434 +v -1.780312 5.625000 0.710000 +v -2.642038 7.628906 0.670256 +v -2.569902 7.031250 0.639395 +v -1.978596 6.292969 0.386960 +v -1.992812 5.625000 0.392500 +v -2.773438 7.628906 0.000000 +v -2.695313 7.031250 0.000000 +v -2.054687 6.292969 0.000000 +v -2.070312 5.625000 0.000000 +v -2.642038 7.628906 -0.670256 +v -2.569902 7.031250 -0.639395 +v -1.978596 6.292969 -0.386960 +v -1.992812 5.625000 -0.392500 +v -2.281113 7.628906 -1.210801 +v -2.225469 7.031250 -1.155156 +v -1.769746 6.292969 -0.699434 +v -1.780312 5.625000 -0.710000 +v -1.740569 7.628906 -1.571726 +v -1.709707 7.031250 -1.499590 +v -1.457273 6.292969 -0.908284 +v -1.462812 5.625000 -0.922500 +v -1.070312 7.628906 -1.703125 +v -1.070312 7.031250 -1.625000 +v -1.070312 6.292969 -0.984375 +v -1.070312 5.625000 -1.000000 +v -0.400056 7.628906 -1.571726 +v -0.430918 7.031250 -1.499590 +v -0.683352 6.292969 -0.908284 +v -0.677812 5.625000 -0.922500 +v 0.140489 7.628906 -1.210801 +v 0.084844 7.031250 -1.155156 +v -0.370879 6.292969 -0.699434 +v -0.360312 5.625000 -0.710000 +v 0.501414 7.628906 -0.670256 +v 0.429278 7.031250 -0.639395 +v -0.162029 6.292969 -0.386960 +v -0.147812 5.625000 -0.392500 +v 1.210938 5.179688 0.000000 +v 3.054688 4.875000 0.000000 +v 4.710938 4.570313 0.000000 +v 5.429688 4.125000 0.000000 +v 1.034141 5.179688 0.895391 +v 2.735000 4.875000 1.619062 +v 4.262891 4.570313 2.269140 +v 4.925938 4.125000 2.551250 +v 0.549375 5.179688 1.619688 +v 1.858438 4.875000 2.928750 +v 3.034375 4.570313 4.104687 +v 3.544688 4.125000 4.615000 +v -0.174922 5.179688 2.104453 +v 0.548750 4.875000 3.805313 +v 1.198828 4.570313 5.333203 +v 1.480938 4.125000 5.996250 +v -1.070312 5.179688 2.281250 +v -1.070312 4.875000 4.125000 +v -1.070312 4.570313 5.781250 +v -1.070312 4.125000 6.500000 +v -1.965703 5.179688 2.104453 +v -2.689375 4.875000 3.805313 +v -3.339453 4.570313 5.333203 +v -3.621562 4.125000 5.996250 +v -2.690000 5.179688 1.619688 +v -3.999062 4.875000 2.928750 +v -5.174999 4.570313 4.104687 +v -5.685312 4.125000 4.615000 +v -3.174765 5.179688 0.895391 +v -4.875625 4.875000 1.619062 +v -6.403516 4.570313 2.269140 +v -7.066563 4.125000 2.551250 +v -3.351562 5.179688 0.000000 +v -5.195313 4.875000 0.000000 +v -6.851563 4.570313 0.000000 +v -7.570313 4.125000 0.000000 +v -3.174765 5.179688 -0.895391 +v -4.875625 4.875000 -1.619062 +v -6.403516 4.570313 -2.269140 +v -7.066563 4.125000 -2.551250 +v -2.690000 5.179688 -1.619688 +v -3.999062 4.875000 -2.928750 +v -5.174999 4.570313 -4.104687 +v -5.685312 4.125000 -4.615000 +v -1.965703 5.179688 -2.104453 +v -2.689375 4.875000 -3.805313 +v -3.339453 4.570313 -5.333203 +v -3.621562 4.125000 -5.996250 +v -1.070312 5.179688 -2.281250 +v -1.070312 4.875000 -4.125000 +v -1.070312 4.570313 -5.781250 +v -1.070312 4.125000 -6.500000 +v -0.174922 5.179688 -2.104453 +v 0.548750 4.875000 -3.805313 +v 1.198828 4.570313 -5.333203 +v 1.480938 4.125000 -5.996250 +v 0.549375 5.179688 -1.619688 +v 1.858438 4.875000 -2.928750 +v 3.034375 4.570313 -4.104687 +v 3.544688 4.125000 -4.615000 +v 1.034141 5.179688 -0.895391 +v 2.735000 4.875000 -1.619062 +v 4.262891 4.570313 -2.269140 +v 4.925938 4.125000 -2.551250 +# 530 vertices + +vt 2.000000 2.000000 0.000000 +vt 2.000000 1.975000 0.000000 +vt 2.000000 1.950000 0.000000 +vt 2.000000 1.925000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 1.750000 2.000000 0.000000 +vt 1.750000 1.975000 0.000000 +vt 1.750000 1.950000 0.000000 +vt 1.750000 1.925000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.500000 2.000000 0.000000 +vt 1.500000 1.975000 0.000000 +vt 1.500000 1.950000 0.000000 +vt 1.500000 1.925000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.250000 2.000000 0.000000 +vt 1.250000 1.975000 0.000000 +vt 1.250000 1.950000 0.000000 +vt 1.250000 1.925000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 0.750000 2.000000 0.000000 +vt 0.750000 1.975000 0.000000 +vt 0.750000 1.950000 0.000000 +vt 0.750000 1.925000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.500000 2.000000 0.000000 +vt 0.500000 1.975000 0.000000 +vt 0.500000 1.950000 0.000000 +vt 0.500000 1.925000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.250000 2.000000 0.000000 +vt 0.250000 1.975000 0.000000 +vt 0.250000 1.950000 0.000000 +vt 0.250000 1.925000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.000000 2.000000 0.000000 +vt 0.000000 1.975000 0.000000 +vt 0.000000 1.950000 0.000000 +vt 0.000000 1.925000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 2.000000 2.000000 0.000000 +vt 2.000000 1.975000 0.000000 +vt 2.000000 1.950000 0.000000 +vt 2.000000 1.925000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 1.750000 2.000000 0.000000 +vt 1.750000 1.975000 0.000000 +vt 1.750000 1.950000 0.000000 +vt 1.750000 1.925000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.500000 2.000000 0.000000 +vt 1.500000 1.975000 0.000000 +vt 1.500000 1.950000 0.000000 +vt 1.500000 1.925000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.250000 2.000000 0.000000 +vt 1.250000 1.975000 0.000000 +vt 1.250000 1.950000 0.000000 +vt 1.250000 1.925000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 0.750000 2.000000 0.000000 +vt 0.750000 1.975000 0.000000 +vt 0.750000 1.950000 0.000000 +vt 0.750000 1.925000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.500000 2.000000 0.000000 +vt 0.500000 1.975000 0.000000 +vt 0.500000 1.950000 0.000000 +vt 0.500000 1.925000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.250000 2.000000 0.000000 +vt 0.250000 1.975000 0.000000 +vt 0.250000 1.950000 0.000000 +vt 0.250000 1.925000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.000000 2.000000 0.000000 +vt 0.000000 1.975000 0.000000 +vt 0.000000 1.950000 0.000000 +vt 0.000000 1.925000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 2.000000 1.675000 0.000000 +vt 2.000000 1.450000 0.000000 +vt 2.000000 1.225000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.750000 1.675000 0.000000 +vt 1.750000 1.450000 0.000000 +vt 1.750000 1.225000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.500000 1.675000 0.000000 +vt 1.500000 1.450000 0.000000 +vt 1.500000 1.225000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.250000 1.675000 0.000000 +vt 1.250000 1.450000 0.000000 +vt 1.250000 1.225000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.750000 1.675000 0.000000 +vt 0.750000 1.450000 0.000000 +vt 0.750000 1.225000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.500000 1.675000 0.000000 +vt 0.500000 1.450000 0.000000 +vt 0.500000 1.225000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.250000 1.675000 0.000000 +vt 0.250000 1.450000 0.000000 +vt 0.250000 1.225000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 0.000000 1.675000 0.000000 +vt 0.000000 1.450000 0.000000 +vt 0.000000 1.225000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 2.000000 1.675000 0.000000 +vt 2.000000 1.450000 0.000000 +vt 2.000000 1.225000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.750000 1.675000 0.000000 +vt 1.750000 1.450000 0.000000 +vt 1.750000 1.225000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.500000 1.675000 0.000000 +vt 1.500000 1.450000 0.000000 +vt 1.500000 1.225000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.250000 1.675000 0.000000 +vt 1.250000 1.450000 0.000000 +vt 1.250000 1.225000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.750000 1.675000 0.000000 +vt 0.750000 1.450000 0.000000 +vt 0.750000 1.225000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.500000 1.675000 0.000000 +vt 0.500000 1.450000 0.000000 +vt 0.500000 1.225000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.250000 1.675000 0.000000 +vt 0.250000 1.450000 0.000000 +vt 0.250000 1.225000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 0.000000 1.675000 0.000000 +vt 0.000000 1.450000 0.000000 +vt 0.000000 1.225000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 2.000000 0.850000 0.000000 +vt 2.000000 0.700000 0.000000 +vt 2.000000 0.550000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.750000 0.850000 0.000000 +vt 1.750000 0.700000 0.000000 +vt 1.750000 0.550000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.500000 0.850000 0.000000 +vt 1.500000 0.700000 0.000000 +vt 1.500000 0.550000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.250000 0.850000 0.000000 +vt 1.250000 0.700000 0.000000 +vt 1.250000 0.550000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.850000 0.000000 +vt 0.750000 0.700000 0.000000 +vt 0.750000 0.550000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.850000 0.000000 +vt 0.500000 0.700000 0.000000 +vt 0.500000 0.550000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.850000 0.000000 +vt 0.250000 0.700000 0.000000 +vt 0.250000 0.550000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.850000 0.000000 +vt 0.000000 0.700000 0.000000 +vt 0.000000 0.550000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 2.000000 0.850000 0.000000 +vt 2.000000 0.700000 0.000000 +vt 2.000000 0.550000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.750000 0.850000 0.000000 +vt 1.750000 0.700000 0.000000 +vt 1.750000 0.550000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.500000 0.850000 0.000000 +vt 1.500000 0.700000 0.000000 +vt 1.500000 0.550000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.250000 0.850000 0.000000 +vt 1.250000 0.700000 0.000000 +vt 1.250000 0.550000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.850000 0.000000 +vt 0.750000 0.700000 0.000000 +vt 0.750000 0.550000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.850000 0.000000 +vt 0.500000 0.700000 0.000000 +vt 0.500000 0.550000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.850000 0.000000 +vt 0.250000 0.700000 0.000000 +vt 0.250000 0.550000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.850000 0.000000 +vt 0.000000 0.700000 0.000000 +vt 0.000000 0.550000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 2.000000 0.300000 0.000000 +vt 2.000000 0.200000 0.000000 +vt 2.000000 0.100000 0.000000 +vt 2.000000 0.000000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.750000 0.300000 0.000000 +vt 1.750000 0.200000 0.000000 +vt 1.750000 0.100000 0.000000 +vt 1.750000 0.000000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.500000 0.300000 0.000000 +vt 1.500000 0.200000 0.000000 +vt 1.500000 0.100000 0.000000 +vt 1.500000 0.000000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.250000 0.300000 0.000000 +vt 1.250000 0.200000 0.000000 +vt 1.250000 0.100000 0.000000 +vt 1.250000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.750000 0.300000 0.000000 +vt 0.750000 0.200000 0.000000 +vt 0.750000 0.100000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.500000 0.300000 0.000000 +vt 0.500000 0.200000 0.000000 +vt 0.500000 0.100000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.250000 0.300000 0.000000 +vt 0.250000 0.200000 0.000000 +vt 0.250000 0.100000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 0.000000 0.300000 0.000000 +vt 0.000000 0.200000 0.000000 +vt 0.000000 0.100000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 2.000000 0.300000 0.000000 +vt 2.000000 0.200000 0.000000 +vt 2.000000 0.100000 0.000000 +vt 2.000000 0.000000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.750000 0.300000 0.000000 +vt 1.750000 0.200000 0.000000 +vt 1.750000 0.100000 0.000000 +vt 1.750000 0.000000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.500000 0.300000 0.000000 +vt 1.500000 0.200000 0.000000 +vt 1.500000 0.100000 0.000000 +vt 1.500000 0.000000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.250000 0.300000 0.000000 +vt 1.250000 0.200000 0.000000 +vt 1.250000 0.100000 0.000000 +vt 1.250000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.750000 0.300000 0.000000 +vt 0.750000 0.200000 0.000000 +vt 0.750000 0.100000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.500000 0.300000 0.000000 +vt 0.500000 0.200000 0.000000 +vt 0.500000 0.100000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.250000 0.300000 0.000000 +vt 0.250000 0.200000 0.000000 +vt 0.250000 0.100000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 0.000000 0.300000 0.000000 +vt 0.000000 0.200000 0.000000 +vt 0.000000 0.100000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.875000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.625000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.875000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.625000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.875000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.625000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.875000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.625000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.875000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.625000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.875000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.625000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.875000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.625000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.875000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.625000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.875000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.625000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.875000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.625000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.375000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.125000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.375000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.125000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.375000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.125000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.375000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.125000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.375000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.125000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.375000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.125000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.375000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.125000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.375000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.125000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.375000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.125000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.375000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.125000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 0.225000 0.000000 +vt 0.500000 0.450000 0.000000 +vt 0.500000 0.675000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.625000 0.225000 0.000000 +vt 0.625000 0.450000 0.000000 +vt 0.625000 0.675000 0.000000 +vt 0.625000 0.900000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.750000 0.225000 0.000000 +vt 0.750000 0.450000 0.000000 +vt 0.750000 0.675000 0.000000 +vt 0.750000 0.900000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.875000 0.225000 0.000000 +vt 0.875000 0.450000 0.000000 +vt 0.875000 0.675000 0.000000 +vt 0.875000 0.900000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 0.225000 0.000000 +vt 1.000000 0.450000 0.000000 +vt 1.000000 0.675000 0.000000 +vt 1.000000 0.900000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 0.000000 0.225000 0.000000 +vt 0.000000 0.450000 0.000000 +vt 0.000000 0.675000 0.000000 +vt 0.000000 0.900000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.125000 0.225000 0.000000 +vt 0.125000 0.450000 0.000000 +vt 0.125000 0.675000 0.000000 +vt 0.125000 0.900000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.250000 0.225000 0.000000 +vt 0.250000 0.450000 0.000000 +vt 0.250000 0.675000 0.000000 +vt 0.250000 0.900000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.375000 0.225000 0.000000 +vt 0.375000 0.450000 0.000000 +vt 0.375000 0.675000 0.000000 +vt 0.375000 0.900000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 0.225000 0.000000 +vt 0.500000 0.450000 0.000000 +vt 0.500000 0.675000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.500000 0.925000 0.000000 +vt 0.500000 0.950000 0.000000 +vt 0.500000 0.975000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.625000 0.900000 0.000000 +vt 0.625000 0.925000 0.000000 +vt 0.625000 0.950000 0.000000 +vt 0.625000 0.975000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.750000 0.900000 0.000000 +vt 0.750000 0.925000 0.000000 +vt 0.750000 0.950000 0.000000 +vt 0.750000 0.975000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.875000 0.900000 0.000000 +vt 0.875000 0.925000 0.000000 +vt 0.875000 0.950000 0.000000 +vt 0.875000 0.975000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 1.000000 0.900000 0.000000 +vt 1.000000 0.925000 0.000000 +vt 1.000000 0.950000 0.000000 +vt 1.000000 0.975000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.000000 0.900000 0.000000 +vt 0.000000 0.925000 0.000000 +vt 0.000000 0.950000 0.000000 +vt 0.000000 0.975000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.125000 0.900000 0.000000 +vt 0.125000 0.925000 0.000000 +vt 0.125000 0.950000 0.000000 +vt 0.125000 0.975000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.250000 0.900000 0.000000 +vt 0.250000 0.925000 0.000000 +vt 0.250000 0.950000 0.000000 +vt 0.250000 0.975000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.375000 0.900000 0.000000 +vt 0.375000 0.925000 0.000000 +vt 0.375000 0.950000 0.000000 +vt 0.375000 0.975000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.500000 0.925000 0.000000 +vt 0.500000 0.950000 0.000000 +vt 0.500000 0.975000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +# 800 texture vertices + +vn -0.966742 -0.255752 0.000000 +vn -0.966824 0.255443 0.000000 +vn -0.092052 0.995754 0.000000 +vn 0.682050 0.731305 0.000000 +vn 0.870301 0.492521 0.000000 +vn -0.893014 -0.256345 -0.369882 +vn -0.893437 0.255996 -0.369102 +vn -0.083877 0.995843 -0.035507 +vn 0.629724 0.731860 0.260439 +vn 0.803725 0.493370 0.332584 +vn -0.683407 -0.256728 -0.683407 +vn -0.683531 0.256068 -0.683531 +vn -0.064925 0.995776 -0.064925 +vn 0.481399 0.732469 0.481399 +vn 0.614804 0.493997 0.614804 +vn -0.369882 -0.256345 -0.893014 +vn -0.369102 0.255996 -0.893437 +vn -0.035507 0.995843 -0.083877 +vn 0.260439 0.731860 0.629724 +vn 0.332584 0.493369 0.803725 +vn -0.002848 -0.257863 -0.966177 +vn -0.001923 0.254736 -0.967009 +vn -0.000266 0.995734 -0.092270 +vn 0.000024 0.731295 0.682061 +vn -0.000000 0.492521 0.870301 +vn 0.379058 -0.359300 -0.852771 +vn 0.377110 0.149085 -0.914091 +vn 0.027502 0.992081 -0.122552 +vn -0.261010 0.726762 0.635367 +vn -0.332485 0.492546 0.804271 +vn 0.663548 -0.410790 -0.625264 +vn 0.712664 0.073722 -0.697621 +vn 0.099726 0.987509 -0.121983 +vn -0.487320 0.723754 0.488569 +vn -0.615242 0.492602 0.615484 +vn 0.880028 -0.332906 -0.338709 +vn 0.917276 0.167113 -0.361493 +vn 0.113584 0.992365 -0.048070 +vn -0.634150 0.727508 0.261889 +vn -0.804126 0.492634 0.332705 +vn 0.966690 -0.255738 0.010454 +vn 0.967442 0.252962 0.008103 +vn 0.093436 0.995624 0.001281 +vn -0.682167 0.731196 -0.000343 +vn -0.870322 0.492483 -0.000054 +vn 0.893014 -0.256345 0.369882 +vn 0.893437 0.255996 0.369102 +vn 0.083877 0.995843 0.035507 +vn -0.629724 0.731860 -0.260439 +vn -0.803725 0.493370 -0.332584 +vn 0.683407 -0.256728 0.683407 +vn 0.683531 0.256068 0.683531 +vn 0.064925 0.995776 0.064925 +vn -0.481399 0.732469 -0.481399 +vn -0.614804 0.493997 -0.614804 +vn 0.369882 -0.256345 0.893014 +vn 0.369102 0.255996 0.893437 +vn 0.035507 0.995843 0.083877 +vn -0.260439 0.731860 -0.629724 +vn -0.332584 0.493369 -0.803725 +vn 0.000000 -0.255752 0.966742 +vn 0.000000 0.255443 0.966824 +vn 0.000000 0.995754 0.092052 +vn 0.000000 0.731305 -0.682050 +vn 0.000000 0.492521 -0.870301 +vn -0.369882 -0.256345 0.893014 +vn -0.369102 0.255996 0.893437 +vn -0.035507 0.995843 0.083877 +vn 0.260439 0.731860 -0.629724 +vn 0.332584 0.493370 -0.803725 +vn -0.683407 -0.256728 0.683407 +vn -0.683531 0.256068 0.683531 +vn -0.064925 0.995776 0.064925 +vn 0.481399 0.732469 -0.481399 +vn 0.614804 0.493997 -0.614804 +vn -0.893014 -0.256345 0.369882 +vn -0.893437 0.255996 0.369102 +vn -0.083877 0.995843 0.035507 +vn 0.629724 0.731860 -0.260439 +vn 0.803725 0.493369 -0.332584 +vn 0.915321 0.402725 -0.000000 +vn 0.941808 0.336151 0.000000 +vn 0.978690 0.205342 0.000000 +vn 0.997804 -0.066240 -0.000000 +vn 0.845438 0.403546 0.349835 +vn 0.869996 0.336859 0.360047 +vn 0.904193 0.205791 0.374280 +vn 0.921879 -0.066370 0.381752 +vn 0.646802 0.404096 0.646802 +vn 0.665655 0.337351 0.665655 +vn 0.691923 0.206120 0.691923 +vn 0.705543 -0.066480 0.705542 +vn 0.349835 0.403546 0.845438 +vn 0.360047 0.336859 0.869996 +vn 0.374280 0.205791 0.904193 +vn 0.381752 -0.066369 0.921879 +vn 0.000000 0.402725 0.915321 +vn -0.000000 0.336151 0.941808 +vn 0.000000 0.205342 0.978690 +vn 0.000000 -0.066240 0.997804 +vn -0.349835 0.403546 0.845438 +vn -0.360047 0.336859 0.869996 +vn -0.374280 0.205791 0.904193 +vn -0.381752 -0.066370 0.921879 +vn -0.646802 0.404096 0.646802 +vn -0.665655 0.337351 0.665655 +vn -0.691923 0.206120 0.691923 +vn -0.705542 -0.066480 0.705543 +vn -0.845438 0.403546 0.349835 +vn -0.869996 0.336859 0.360047 +vn -0.904193 0.205791 0.374280 +vn -0.921879 -0.066369 0.381752 +vn -0.915321 0.402725 0.000000 +vn -0.941808 0.336151 -0.000000 +vn -0.978690 0.205342 0.000000 +vn -0.997804 -0.066240 0.000000 +vn -0.845438 0.403546 -0.349835 +vn -0.869996 0.336859 -0.360047 +vn -0.904193 0.205791 -0.374280 +vn -0.921879 -0.066370 -0.381752 +vn -0.646802 0.404096 -0.646802 +vn -0.665655 0.337351 -0.665655 +vn -0.691923 0.206120 -0.691923 +vn -0.705543 -0.066480 -0.705542 +vn -0.349835 0.403546 -0.845438 +vn -0.360047 0.336859 -0.869996 +vn -0.374280 0.205791 -0.904193 +vn -0.381752 -0.066369 -0.921879 +vn -0.000000 0.402725 -0.915321 +vn 0.000000 0.336151 -0.941808 +vn -0.000000 0.205342 -0.978690 +vn -0.000000 -0.066240 -0.997804 +vn 0.349835 0.403546 -0.845438 +vn 0.360047 0.336859 -0.869996 +vn 0.374280 0.205791 -0.904193 +vn 0.381752 -0.066370 -0.921879 +vn 0.646802 0.404096 -0.646802 +vn 0.665655 0.337351 -0.665655 +vn 0.691923 0.206120 -0.691923 +vn 0.705542 -0.066480 -0.705543 +vn 0.845438 0.403546 -0.349835 +vn 0.869996 0.336859 -0.360047 +vn 0.904193 0.205791 -0.374280 +vn 0.921879 -0.066369 -0.381752 +vn 0.900182 -0.435513 0.000000 +vn 0.729611 -0.683863 0.000000 +vn 0.693951 -0.720022 -0.000000 +vn 0.793950 -0.607983 0.000000 +vn 0.831437 -0.436180 0.344179 +vn 0.673512 -0.684666 0.278594 +vn 0.640399 -0.720924 0.264874 +vn 0.732949 -0.608995 0.303167 +vn 0.636092 -0.436778 0.636092 +vn 0.514965 -0.685290 0.514965 +vn 0.489651 -0.721446 0.489651 +vn 0.560555 -0.609554 0.560555 +vn 0.344179 -0.436180 0.831437 +vn 0.278595 -0.684666 0.673512 +vn 0.264874 -0.720924 0.640399 +vn 0.303167 -0.608995 0.732949 +vn -0.000000 -0.435513 0.900182 +vn -0.000000 -0.683863 0.729611 +vn 0.000000 -0.720022 0.693951 +vn -0.000000 -0.607983 0.793950 +vn -0.344179 -0.436180 0.831437 +vn -0.278594 -0.684666 0.673512 +vn -0.264874 -0.720924 0.640399 +vn -0.303167 -0.608995 0.732949 +vn -0.636092 -0.436778 0.636092 +vn -0.514965 -0.685290 0.514965 +vn -0.489651 -0.721446 0.489651 +vn -0.560555 -0.609554 0.560555 +vn -0.831437 -0.436180 0.344179 +vn -0.673512 -0.684666 0.278595 +vn -0.640399 -0.720924 0.264874 +vn -0.732949 -0.608995 0.303167 +vn -0.900182 -0.435513 -0.000000 +vn -0.729611 -0.683863 -0.000000 +vn -0.693951 -0.720022 0.000000 +vn -0.793950 -0.607983 -0.000000 +vn -0.831437 -0.436180 -0.344179 +vn -0.673512 -0.684666 -0.278594 +vn -0.640399 -0.720924 -0.264874 +vn -0.732949 -0.608995 -0.303167 +vn -0.636092 -0.436778 -0.636092 +vn -0.514965 -0.685290 -0.514965 +vn -0.489651 -0.721446 -0.489651 +vn -0.560555 -0.609554 -0.560555 +vn -0.344179 -0.436180 -0.831437 +vn -0.278595 -0.684666 -0.673512 +vn -0.264874 -0.720924 -0.640399 +vn -0.303167 -0.608995 -0.732949 +vn 0.000000 -0.435513 -0.900182 +vn 0.000000 -0.683863 -0.729611 +vn -0.000000 -0.720022 -0.693951 +vn 0.000000 -0.607983 -0.793950 +vn 0.344179 -0.436180 -0.831437 +vn 0.278594 -0.684666 -0.673512 +vn 0.264874 -0.720924 -0.640399 +vn 0.303167 -0.608995 -0.732949 +vn 0.636092 -0.436778 -0.636092 +vn 0.514965 -0.685290 -0.514965 +vn 0.489651 -0.721446 -0.489651 +vn 0.560555 -0.609554 -0.560555 +vn 0.831437 -0.436180 -0.344179 +vn 0.673512 -0.684666 -0.278595 +vn 0.640399 -0.720924 -0.264874 +vn 0.732949 -0.608995 -0.303167 +vn 0.623860 -0.781536 0.000000 +vn 0.177291 -0.984159 -0.000000 +vn 0.049207 -0.998789 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.576230 -0.781801 0.238217 +vn 0.163628 -0.984208 0.067527 +vn 0.045422 -0.998792 0.018736 +vn 0.440416 -0.782348 0.440416 +vn 0.124903 -0.984276 0.124903 +vn 0.034662 -0.998798 0.034662 +vn 0.238217 -0.781801 0.576230 +vn 0.067527 -0.984208 0.163628 +vn 0.018736 -0.998792 0.045422 +vn -0.000000 -0.781536 0.623860 +vn 0.000000 -0.984159 0.177291 +vn -0.000000 -0.998789 0.049207 +vn -0.238217 -0.781801 0.576230 +vn -0.067527 -0.984208 0.163628 +vn -0.018736 -0.998792 0.045422 +vn -0.440416 -0.782348 0.440416 +vn -0.124903 -0.984276 0.124903 +vn -0.034662 -0.998798 0.034662 +vn -0.576230 -0.781801 0.238217 +vn -0.163628 -0.984208 0.067527 +vn -0.045422 -0.998792 0.018736 +vn -0.623860 -0.781536 -0.000000 +vn -0.177291 -0.984159 0.000000 +vn -0.049207 -0.998789 -0.000000 +vn -0.576230 -0.781801 -0.238217 +vn -0.163628 -0.984208 -0.067527 +vn -0.045422 -0.998792 -0.018736 +vn -0.440416 -0.782348 -0.440416 +vn -0.124903 -0.984276 -0.124903 +vn -0.034662 -0.998798 -0.034662 +vn -0.238217 -0.781801 -0.576230 +vn -0.067527 -0.984208 -0.163628 +vn -0.018736 -0.998792 -0.045422 +vn 0.000000 -0.781536 -0.623860 +vn -0.000000 -0.984159 -0.177291 +vn 0.000000 -0.998789 -0.049207 +vn 0.238217 -0.781801 -0.576230 +vn 0.067527 -0.984208 -0.163628 +vn 0.018736 -0.998792 -0.045422 +vn 0.440416 -0.782348 -0.440416 +vn 0.124903 -0.984276 -0.124903 +vn 0.034662 -0.998798 -0.034662 +vn 0.576230 -0.781801 -0.238217 +vn 0.163628 -0.984208 -0.067527 +vn 0.045422 -0.998792 -0.018736 +vn 0.007786 -0.999970 -0.000216 +vn 0.039138 -0.999233 -0.000989 +vn 0.179512 -0.983746 -0.004369 +vn 0.612299 -0.790557 -0.010460 +vn 0.986152 -0.165708 -0.006670 +vn 0.007039 -0.812495 0.582926 +vn 0.036127 -0.837257 0.545614 +vn 0.161846 -0.810421 0.563048 +vn 0.482365 -0.595148 0.642746 +vn 0.738720 -0.114594 0.664199 +vn -0.001909 0.162121 0.986769 +vn 0.002762 0.017107 0.999850 +vn 0.010533 0.073398 0.997247 +vn -0.066041 0.130070 0.989303 +vn -0.094427 0.016594 0.995393 +vn -0.009203 0.871509 0.490293 +vn -0.048606 0.840609 0.539457 +vn -0.223298 0.802880 0.552739 +vn -0.596365 0.559971 0.575135 +vn -0.803337 0.068236 0.591603 +vn -0.010561 0.999944 0.000103 +vn -0.058798 0.998270 0.000710 +vn -0.280710 0.959787 0.003269 +vn -0.749723 0.661738 0.004268 +vn -0.997351 0.072714 0.002059 +vn -0.008792 0.871493 -0.490330 +vn -0.046494 0.841178 -0.538756 +vn -0.217909 0.806807 -0.549161 +vn -0.597291 0.560026 -0.574121 +vn -0.804000 0.062913 -0.591292 +vn -0.001806 0.161691 -0.986840 +vn 0.002031 0.014555 -0.999892 +vn 0.009215 0.060069 -0.998152 +vn -0.059334 0.113865 -0.991723 +vn -0.086899 0.012290 -0.996141 +vn 0.006418 -0.812379 -0.583095 +vn 0.033783 -0.837512 -0.545373 +vn 0.157113 -0.811947 -0.562190 +vn 0.484406 -0.589366 -0.646528 +vn 0.738870 -0.101320 -0.666187 +vn 0.946512 0.322650 -0.003357 +vn 0.825830 0.563870 -0.007452 +vn 0.650011 0.759893 -0.006937 +vn 0.532429 0.846459 -0.005245 +vn 0.725608 0.259351 0.637361 +vn 0.645945 0.461988 0.607719 +vn 0.531615 0.636660 0.558614 +vn 0.424964 0.681717 0.595540 +vn -0.049562 -0.019755 0.998576 +vn -0.037816 -0.035624 0.998650 +vn -0.037914 -0.036512 0.998614 +vn -0.168854 -0.297945 0.939530 +vn -0.742342 -0.299166 0.599523 +vn -0.619602 -0.529406 0.579502 +vn -0.483708 -0.685760 0.543837 +vn -0.445293 -0.794355 0.413177 +vn -0.926513 -0.376258 0.001996 +vn -0.753920 -0.656952 0.004317 +vn -0.566224 -0.824244 0.003461 +vn -0.481804 -0.876277 0.001850 +vn -0.744675 -0.294425 -0.598977 +vn -0.621949 -0.528114 -0.578165 +vn -0.481171 -0.688340 -0.542828 +vn -0.438055 -0.797035 -0.415744 +vn -0.044337 -0.017056 -0.998871 +vn -0.026176 -0.028166 -0.999260 +vn -0.025294 -0.028332 -0.999278 +vn -0.157482 -0.289392 -0.944167 +vn 0.728244 0.252410 -0.637142 +vn 0.647055 0.459725 -0.608254 +vn 0.522994 0.640657 -0.562170 +vn 0.409978 0.682857 -0.604669 +vn -0.230787 0.972982 -0.006523 +vn -0.548936 0.835863 -0.001511 +vn -0.875671 0.482806 0.009893 +vn -0.877554 0.479097 0.019092 +vn -0.696190 0.717439 0.024497 +vn -0.152877 0.687211 0.710190 +vn -0.316721 0.637750 0.702113 +vn -0.601067 0.471452 0.645330 +vn -0.635889 0.446090 0.629801 +vn -0.435746 0.601008 0.670011 +vn 0.111113 -0.085070 0.990160 +vn 0.223310 0.006540 0.974726 +vn 0.190097 0.154964 0.969458 +vn 0.005271 0.189482 0.981870 +vn -0.011752 0.246688 0.969024 +vn 0.343906 -0.722796 0.599412 +vn 0.572489 -0.567656 0.591627 +vn 0.787436 -0.256459 0.560512 +vn 0.647097 -0.306374 0.698141 +vn 0.427528 -0.499343 0.753576 +vn 0.410926 -0.911668 0.001284 +vn 0.671520 -0.740986 -0.000899 +vn 0.922026 -0.387060 -0.007253 +vn 0.846910 -0.531556 -0.013854 +vn 0.535924 -0.844201 -0.010505 +vn 0.341188 -0.722823 -0.600931 +vn 0.578664 -0.561139 -0.591838 +vn 0.784869 -0.251020 -0.566542 +vn 0.642681 -0.302257 -0.703990 +vn 0.418589 -0.500042 -0.758117 +vn 0.115806 -0.079139 -0.990114 +vn 0.232811 0.012565 -0.972441 +vn 0.206662 0.153601 -0.966280 +vn 0.024500 0.161443 -0.986578 +vn 0.003382 0.211115 -0.977455 +vn -0.134912 0.687491 -0.713551 +vn -0.319540 0.633073 -0.705063 +vn -0.603902 0.461442 -0.649903 +vn -0.631815 0.437169 -0.640072 +vn -0.424306 0.612706 -0.666750 +vn -0.425801 0.904753 0.010805 +vn 0.022046 0.999756 0.001623 +vn 0.999598 0.025875 0.011556 +vn 0.709587 -0.704552 0.009672 +vn -0.259858 0.791937 0.552548 +vn 0.009539 0.999720 -0.021674 +vn 0.410157 0.332912 -0.849082 +vn 0.541523 -0.548619 -0.637001 +vn 0.046311 0.455223 0.889172 +vn -0.010688 0.988794 0.148900 +vn -0.044376 0.682946 -0.729120 +vn 0.122824 0.009233 -0.992385 +vn 0.481839 -0.180440 0.857480 +vn 0.455272 0.736752 0.499925 +vn -0.220542 0.907193 -0.358277 +vn -0.235919 0.657250 -0.715797 +vn 0.728094 -0.685300 -0.015585 +vn 0.888738 0.458112 -0.016679 +vn -0.260098 0.965582 0.000800 +vn -0.371611 0.928378 -0.004418 +vn 0.480165 -0.178362 -0.858853 +vn 0.488102 0.716802 -0.497947 +vn -0.222004 0.905399 0.361892 +vn -0.235405 0.663180 0.710477 +vn 0.058720 0.437702 -0.897200 +vn 0.001326 0.986459 -0.164002 +vn -0.044190 0.681675 0.730319 +vn 0.138801 -0.034188 0.989730 +vn -0.258890 0.797206 -0.545380 +vn 0.012270 0.999739 0.019287 +vn 0.398632 0.354890 0.845663 +vn 0.537564 -0.581398 0.610738 +vn 0.000000 1.000000 0.000000 +vn 0.824540 0.565804 0.000017 +vn 0.917701 -0.397272 0.000034 +vn 0.935269 -0.353939 0.000113 +vn 0.780712 0.624890 0.000075 +vn 0.762640 0.565035 0.314825 +vn 0.847982 -0.397998 0.350034 +vn 0.864141 -0.355261 0.356441 +vn 0.720992 0.625625 0.297933 +vn 0.583357 0.565165 0.583338 +vn 0.648485 -0.398726 0.648448 +vn 0.660872 -0.355894 0.660748 +vn 0.551862 0.625290 0.551780 +vn 0.314824 0.565051 0.762629 +vn 0.350045 -0.397976 0.847988 +vn 0.356474 -0.355199 0.864153 +vn 0.297983 0.625515 0.721067 +vn -0.000017 0.565804 0.824540 +vn -0.000034 -0.397272 0.917701 +vn -0.000113 -0.353939 0.935269 +vn -0.000075 0.624890 0.780712 +vn -0.314825 0.565035 0.762640 +vn -0.350034 -0.397998 0.847982 +vn -0.356441 -0.355261 0.864141 +vn -0.297933 0.625625 0.720992 +vn -0.583338 0.565165 0.583357 +vn -0.648448 -0.398726 0.648485 +vn -0.660748 -0.355894 0.660872 +vn -0.551780 0.625290 0.551862 +vn -0.762629 0.565051 0.314824 +vn -0.847988 -0.397976 0.350045 +vn -0.864153 -0.355199 0.356474 +vn -0.721067 0.625515 0.297983 +vn -0.824540 0.565804 -0.000017 +vn -0.917701 -0.397272 -0.000034 +vn -0.935269 -0.353939 -0.000113 +vn -0.780712 0.624890 -0.000075 +vn -0.762640 0.565035 -0.314825 +vn -0.847982 -0.397998 -0.350034 +vn -0.864141 -0.355261 -0.356441 +vn -0.720992 0.625625 -0.297933 +vn -0.583357 0.565165 -0.583338 +vn -0.648485 -0.398726 -0.648448 +vn -0.660872 -0.355894 -0.660748 +vn -0.551862 0.625290 -0.551780 +vn -0.314824 0.565051 -0.762629 +vn -0.350045 -0.397976 -0.847988 +vn -0.356474 -0.355199 -0.864153 +vn -0.297983 0.625515 -0.721067 +vn 0.000017 0.565804 -0.824540 +vn 0.000034 -0.397272 -0.917701 +vn 0.000113 -0.353939 -0.935269 +vn 0.000075 0.624890 -0.780712 +vn 0.314825 0.565035 -0.762640 +vn 0.350034 -0.397998 -0.847982 +vn 0.356441 -0.355261 -0.864141 +vn 0.297933 0.625625 -0.720992 +vn 0.583338 0.565165 -0.583357 +vn 0.648448 -0.398726 -0.648485 +vn 0.660748 -0.355894 -0.660872 +vn 0.551780 0.625290 -0.551862 +vn 0.762629 0.565051 -0.314824 +vn 0.847988 -0.397976 -0.350045 +vn 0.864153 -0.355199 -0.356474 +vn 0.721067 0.625515 -0.297983 +vn 0.236583 0.971611 -0.000000 +vn 0.173084 0.984907 -0.000000 +vn 0.379703 0.925108 -0.000000 +vn 0.526673 0.850068 0.000000 +vn 0.217978 0.971775 0.090216 +vn 0.159589 0.984977 0.065961 +vn 0.350498 0.925311 0.144740 +vn 0.485590 0.850653 0.201474 +vn 0.166631 0.971838 0.166631 +vn 0.121908 0.985026 0.121908 +vn 0.267668 0.925585 0.267668 +vn 0.371315 0.851029 0.371315 +vn 0.090216 0.971775 0.217978 +vn 0.065961 0.984977 0.159589 +vn 0.144740 0.925311 0.350498 +vn 0.201475 0.850653 0.485590 +vn 0.000000 0.971611 0.236583 +vn 0.000000 0.984907 0.173084 +vn 0.000000 0.925108 0.379703 +vn -0.000000 0.850068 0.526673 +vn -0.090216 0.971775 0.217978 +vn -0.065961 0.984977 0.159589 +vn -0.144740 0.925311 0.350498 +vn -0.201474 0.850653 0.485590 +vn -0.166631 0.971838 0.166631 +vn -0.121908 0.985026 0.121908 +vn -0.267668 0.925585 0.267668 +vn -0.371315 0.851029 0.371315 +vn -0.217978 0.971775 0.090216 +vn -0.159589 0.984977 0.065961 +vn -0.350498 0.925311 0.144740 +vn -0.485590 0.850653 0.201475 +vn -0.236583 0.971611 0.000000 +vn -0.173084 0.984907 0.000000 +vn -0.379703 0.925108 0.000000 +vn -0.526673 0.850068 -0.000000 +vn -0.217978 0.971775 -0.090216 +vn -0.159589 0.984977 -0.065961 +vn -0.350498 0.925311 -0.144740 +vn -0.485590 0.850653 -0.201474 +vn -0.166631 0.971838 -0.166631 +vn -0.121908 0.985026 -0.121908 +vn -0.267668 0.925585 -0.267668 +vn -0.371315 0.851029 -0.371315 +vn -0.090216 0.971775 -0.217978 +vn -0.065961 0.984977 -0.159589 +vn -0.144740 0.925311 -0.350498 +vn -0.201475 0.850653 -0.485590 +vn -0.000000 0.971611 -0.236583 +vn -0.000000 0.984907 -0.173084 +vn -0.000000 0.925108 -0.379703 +vn 0.000000 0.850068 -0.526673 +vn 0.090216 0.971775 -0.217978 +vn 0.065961 0.984977 -0.159589 +vn 0.144740 0.925311 -0.350498 +vn 0.201474 0.850653 -0.485590 +vn 0.166631 0.971838 -0.166631 +vn 0.121908 0.985026 -0.121908 +vn 0.267668 0.925585 -0.267668 +vn 0.371315 0.851029 -0.371315 +vn 0.217978 0.971775 -0.090216 +vn 0.159589 0.984977 -0.065961 +vn 0.350498 0.925311 -0.144740 +vn 0.485590 0.850653 -0.201475 +# 530 vertex normals + +g Teapot01 +f 1/1/1 6/6/6 7/7/7 +f 7/7/7 2/2/2 1/1/1 +f 2/2/2 7/7/7 8/8/8 +f 8/8/8 3/3/3 2/2/2 +f 3/3/3 8/8/8 9/9/9 +f 9/9/9 4/4/4 3/3/3 +f 4/4/4 9/9/9 10/10/10 +f 10/10/10 5/5/5 4/4/4 +f 6/6/6 11/11/11 12/12/12 +f 12/12/12 7/7/7 6/6/6 +f 7/7/7 12/12/12 13/13/13 +f 13/13/13 8/8/8 7/7/7 +f 8/8/8 13/13/13 14/14/14 +f 14/14/14 9/9/9 8/8/8 +f 9/9/9 14/14/14 15/15/15 +f 15/15/15 10/10/10 9/9/9 +f 11/11/11 16/16/16 17/17/17 +f 17/17/17 12/12/12 11/11/11 +f 12/12/12 17/17/17 18/18/18 +f 18/18/18 13/13/13 12/12/12 +f 13/13/13 18/18/18 19/19/19 +f 19/19/19 14/14/14 13/13/13 +f 14/14/14 19/19/19 20/20/20 +f 20/20/20 15/15/15 14/14/14 +f 16/16/16 21/21/21 22/22/22 +f 22/22/22 17/17/17 16/16/16 +f 17/17/17 22/22/22 23/23/23 +f 23/23/23 18/18/18 17/17/17 +f 18/18/18 23/23/23 24/24/24 +f 24/24/24 19/19/19 18/18/18 +f 19/19/19 24/24/24 25/25/25 +f 25/25/25 20/20/20 19/19/19 +f 21/26/21 26/31/26 27/32/27 +f 27/32/27 22/27/22 21/26/21 +f 22/27/22 27/32/27 28/33/28 +f 28/33/28 23/28/23 22/27/22 +f 23/28/23 28/33/28 29/34/29 +f 29/34/29 24/29/24 23/28/23 +f 24/29/24 29/34/29 30/35/30 +f 30/35/30 25/30/25 24/29/24 +f 26/31/26 31/36/31 32/37/32 +f 32/37/32 27/32/27 26/31/26 +f 27/32/27 32/37/32 33/38/33 +f 33/38/33 28/33/28 27/32/27 +f 28/33/28 33/38/33 34/39/34 +f 34/39/34 29/34/29 28/33/28 +f 29/34/29 34/39/34 35/40/35 +f 35/40/35 30/35/30 29/34/29 +f 31/36/31 36/41/36 37/42/37 +f 37/42/37 32/37/32 31/36/31 +f 32/37/32 37/42/37 38/43/38 +f 38/43/38 33/38/33 32/37/32 +f 33/38/33 38/43/38 39/44/39 +f 39/44/39 34/39/34 33/38/33 +f 34/39/34 39/44/39 40/45/40 +f 40/45/40 35/40/35 34/39/34 +f 36/41/36 41/46/41 42/47/42 +f 42/47/42 37/42/37 36/41/36 +f 37/42/37 42/47/42 43/48/43 +f 43/48/43 38/43/38 37/42/37 +f 38/43/38 43/48/43 44/49/44 +f 44/49/44 39/44/39 38/43/38 +f 39/44/39 44/49/44 45/50/45 +f 45/50/45 40/45/40 39/44/39 +f 41/51/41 46/56/46 47/57/47 +f 47/57/47 42/52/42 41/51/41 +f 42/52/42 47/57/47 48/58/48 +f 48/58/48 43/53/43 42/52/42 +f 43/53/43 48/58/48 49/59/49 +f 49/59/49 44/54/44 43/53/43 +f 44/54/44 49/59/49 50/60/50 +f 50/60/50 45/55/45 44/54/44 +f 46/56/46 51/61/51 52/62/52 +f 52/62/52 47/57/47 46/56/46 +f 47/57/47 52/62/52 53/63/53 +f 53/63/53 48/58/48 47/57/47 +f 48/58/48 53/63/53 54/64/54 +f 54/64/54 49/59/49 48/58/48 +f 49/59/49 54/64/54 55/65/55 +f 55/65/55 50/60/50 49/59/49 +f 51/61/51 56/66/56 57/67/57 +f 57/67/57 52/62/52 51/61/51 +f 52/62/52 57/67/57 58/68/58 +f 58/68/58 53/63/53 52/62/52 +f 53/63/53 58/68/58 59/69/59 +f 59/69/59 54/64/54 53/63/53 +f 54/64/54 59/69/59 60/70/60 +f 60/70/60 55/65/55 54/64/54 +f 56/66/56 61/71/61 62/72/62 +f 62/72/62 57/67/57 56/66/56 +f 57/67/57 62/72/62 63/73/63 +f 63/73/63 58/68/58 57/67/57 +f 58/68/58 63/73/63 64/74/64 +f 64/74/64 59/69/59 58/68/58 +f 59/69/59 64/74/64 65/75/65 +f 65/75/65 60/70/60 59/69/59 +f 61/76/61 66/81/66 67/82/67 +f 67/82/67 62/77/62 61/76/61 +f 62/77/62 67/82/67 68/83/68 +f 68/83/68 63/78/63 62/77/62 +f 63/78/63 68/83/68 69/84/69 +f 69/84/69 64/79/64 63/78/63 +f 64/79/64 69/84/69 70/85/70 +f 70/85/70 65/80/65 64/79/64 +f 66/81/66 71/86/71 72/87/72 +f 72/87/72 67/82/67 66/81/66 +f 67/82/67 72/87/72 73/88/73 +f 73/88/73 68/83/68 67/82/67 +f 68/83/68 73/88/73 74/89/74 +f 74/89/74 69/84/69 68/83/68 +f 69/84/69 74/89/74 75/90/75 +f 75/90/75 70/85/70 69/84/69 +f 71/86/71 76/91/76 77/92/77 +f 77/92/77 72/87/72 71/86/71 +f 72/87/72 77/92/77 78/93/78 +f 78/93/78 73/88/73 72/87/72 +f 73/88/73 78/93/78 79/94/79 +f 79/94/79 74/89/74 73/88/73 +f 74/89/74 79/94/79 80/95/80 +f 80/95/80 75/90/75 74/89/74 +f 76/91/76 1/96/1 2/97/2 +f 2/97/2 77/92/77 76/91/76 +f 77/92/77 2/97/2 3/98/3 +f 3/98/3 78/93/78 77/92/77 +f 78/93/78 3/98/3 4/99/4 +f 4/99/4 79/94/79 78/93/78 +f 79/94/79 4/99/4 5/100/5 +f 5/100/5 80/95/80 79/94/79 +f 5/101/5 10/106/10 85/107/85 +f 85/107/85 81/102/81 5/101/5 +f 81/102/81 85/107/85 86/108/86 +f 86/108/86 82/103/82 81/102/81 +f 82/103/82 86/108/86 87/109/87 +f 87/109/87 83/104/83 82/103/82 +f 83/104/83 87/109/87 88/110/88 +f 88/110/88 84/105/84 83/104/83 +f 10/106/10 15/111/15 89/112/89 +f 89/112/89 85/107/85 10/106/10 +f 85/107/85 89/112/89 90/113/90 +f 90/113/90 86/108/86 85/107/85 +f 86/108/86 90/113/90 91/114/91 +f 91/114/91 87/109/87 86/108/86 +f 87/109/87 91/114/91 92/115/92 +f 92/115/92 88/110/88 87/109/87 +f 15/111/15 20/116/20 93/117/93 +f 93/117/93 89/112/89 15/111/15 +f 89/112/89 93/117/93 94/118/94 +f 94/118/94 90/113/90 89/112/89 +f 90/113/90 94/118/94 95/119/95 +f 95/119/95 91/114/91 90/113/90 +f 91/114/91 95/119/95 96/120/96 +f 96/120/96 92/115/92 91/114/91 +f 20/116/20 25/121/25 97/122/97 +f 97/122/97 93/117/93 20/116/20 +f 93/117/93 97/122/97 98/123/98 +f 98/123/98 94/118/94 93/117/93 +f 94/118/94 98/123/98 99/124/99 +f 99/124/99 95/119/95 94/118/94 +f 95/119/95 99/124/99 100/125/100 +f 100/125/100 96/120/96 95/119/95 +f 25/126/25 30/131/30 101/132/101 +f 101/132/101 97/127/97 25/126/25 +f 97/127/97 101/132/101 102/133/102 +f 102/133/102 98/128/98 97/127/97 +f 98/128/98 102/133/102 103/134/103 +f 103/134/103 99/129/99 98/128/98 +f 99/129/99 103/134/103 104/135/104 +f 104/135/104 100/130/100 99/129/99 +f 30/131/30 35/136/35 105/137/105 +f 105/137/105 101/132/101 30/131/30 +f 101/132/101 105/137/105 106/138/106 +f 106/138/106 102/133/102 101/132/101 +f 102/133/102 106/138/106 107/139/107 +f 107/139/107 103/134/103 102/133/102 +f 103/134/103 107/139/107 108/140/108 +f 108/140/108 104/135/104 103/134/103 +f 35/136/35 40/141/40 109/142/109 +f 109/142/109 105/137/105 35/136/35 +f 105/137/105 109/142/109 110/143/110 +f 110/143/110 106/138/106 105/137/105 +f 106/138/106 110/143/110 111/144/111 +f 111/144/111 107/139/107 106/138/106 +f 107/139/107 111/144/111 112/145/112 +f 112/145/112 108/140/108 107/139/107 +f 40/141/40 45/146/45 113/147/113 +f 113/147/113 109/142/109 40/141/40 +f 109/142/109 113/147/113 114/148/114 +f 114/148/114 110/143/110 109/142/109 +f 110/143/110 114/148/114 115/149/115 +f 115/149/115 111/144/111 110/143/110 +f 111/144/111 115/149/115 116/150/116 +f 116/150/116 112/145/112 111/144/111 +f 45/151/45 50/156/50 117/157/117 +f 117/157/117 113/152/113 45/151/45 +f 113/152/113 117/157/117 118/158/118 +f 118/158/118 114/153/114 113/152/113 +f 114/153/114 118/158/118 119/159/119 +f 119/159/119 115/154/115 114/153/114 +f 115/154/115 119/159/119 120/160/120 +f 120/160/120 116/155/116 115/154/115 +f 50/156/50 55/161/55 121/162/121 +f 121/162/121 117/157/117 50/156/50 +f 117/157/117 121/162/121 122/163/122 +f 122/163/122 118/158/118 117/157/117 +f 118/158/118 122/163/122 123/164/123 +f 123/164/123 119/159/119 118/158/118 +f 119/159/119 123/164/123 124/165/124 +f 124/165/124 120/160/120 119/159/119 +f 55/161/55 60/166/60 125/167/125 +f 125/167/125 121/162/121 55/161/55 +f 121/162/121 125/167/125 126/168/126 +f 126/168/126 122/163/122 121/162/121 +f 122/163/122 126/168/126 127/169/127 +f 127/169/127 123/164/123 122/163/122 +f 123/164/123 127/169/127 128/170/128 +f 128/170/128 124/165/124 123/164/123 +f 60/166/60 65/171/65 129/172/129 +f 129/172/129 125/167/125 60/166/60 +f 125/167/125 129/172/129 130/173/130 +f 130/173/130 126/168/126 125/167/125 +f 126/168/126 130/173/130 131/174/131 +f 131/174/131 127/169/127 126/168/126 +f 127/169/127 131/174/131 132/175/132 +f 132/175/132 128/170/128 127/169/127 +f 65/176/65 70/181/70 133/182/133 +f 133/182/133 129/177/129 65/176/65 +f 129/177/129 133/182/133 134/183/134 +f 134/183/134 130/178/130 129/177/129 +f 130/178/130 134/183/134 135/184/135 +f 135/184/135 131/179/131 130/178/130 +f 131/179/131 135/184/135 136/185/136 +f 136/185/136 132/180/132 131/179/131 +f 70/181/70 75/186/75 137/187/137 +f 137/187/137 133/182/133 70/181/70 +f 133/182/133 137/187/137 138/188/138 +f 138/188/138 134/183/134 133/182/133 +f 134/183/134 138/188/138 139/189/139 +f 139/189/139 135/184/135 134/183/134 +f 135/184/135 139/189/139 140/190/140 +f 140/190/140 136/185/136 135/184/135 +f 75/186/75 80/191/80 141/192/141 +f 141/192/141 137/187/137 75/186/75 +f 137/187/137 141/192/141 142/193/142 +f 142/193/142 138/188/138 137/187/137 +f 138/188/138 142/193/142 143/194/143 +f 143/194/143 139/189/139 138/188/138 +f 139/189/139 143/194/143 144/195/144 +f 144/195/144 140/190/140 139/189/139 +f 80/191/80 5/196/5 81/197/81 +f 81/197/81 141/192/141 80/191/80 +f 141/192/141 81/197/81 82/198/82 +f 82/198/82 142/193/142 141/192/141 +f 142/193/142 82/198/82 83/199/83 +f 83/199/83 143/194/143 142/193/142 +f 143/194/143 83/199/83 84/200/84 +f 84/200/84 144/195/144 143/194/143 +f 84/201/84 88/206/88 149/207/149 +f 149/207/149 145/202/145 84/201/84 +f 145/202/145 149/207/149 150/208/150 +f 150/208/150 146/203/146 145/202/145 +f 146/203/146 150/208/150 151/209/151 +f 151/209/151 147/204/147 146/203/146 +f 147/204/147 151/209/151 152/210/152 +f 152/210/152 148/205/148 147/204/147 +f 88/206/88 92/211/92 153/212/153 +f 153/212/153 149/207/149 88/206/88 +f 149/207/149 153/212/153 154/213/154 +f 154/213/154 150/208/150 149/207/149 +f 150/208/150 154/213/154 155/214/155 +f 155/214/155 151/209/151 150/208/150 +f 151/209/151 155/214/155 156/215/156 +f 156/215/156 152/210/152 151/209/151 +f 92/211/92 96/216/96 157/217/157 +f 157/217/157 153/212/153 92/211/92 +f 153/212/153 157/217/157 158/218/158 +f 158/218/158 154/213/154 153/212/153 +f 154/213/154 158/218/158 159/219/159 +f 159/219/159 155/214/155 154/213/154 +f 155/214/155 159/219/159 160/220/160 +f 160/220/160 156/215/156 155/214/155 +f 96/216/96 100/221/100 161/222/161 +f 161/222/161 157/217/157 96/216/96 +f 157/217/157 161/222/161 162/223/162 +f 162/223/162 158/218/158 157/217/157 +f 158/218/158 162/223/162 163/224/163 +f 163/224/163 159/219/159 158/218/158 +f 159/219/159 163/224/163 164/225/164 +f 164/225/164 160/220/160 159/219/159 +f 100/226/100 104/231/104 165/232/165 +f 165/232/165 161/227/161 100/226/100 +f 161/227/161 165/232/165 166/233/166 +f 166/233/166 162/228/162 161/227/161 +f 162/228/162 166/233/166 167/234/167 +f 167/234/167 163/229/163 162/228/162 +f 163/229/163 167/234/167 168/235/168 +f 168/235/168 164/230/164 163/229/163 +f 104/231/104 108/236/108 169/237/169 +f 169/237/169 165/232/165 104/231/104 +f 165/232/165 169/237/169 170/238/170 +f 170/238/170 166/233/166 165/232/165 +f 166/233/166 170/238/170 171/239/171 +f 171/239/171 167/234/167 166/233/166 +f 167/234/167 171/239/171 172/240/172 +f 172/240/172 168/235/168 167/234/167 +f 108/236/108 112/241/112 173/242/173 +f 173/242/173 169/237/169 108/236/108 +f 169/237/169 173/242/173 174/243/174 +f 174/243/174 170/238/170 169/237/169 +f 170/238/170 174/243/174 175/244/175 +f 175/244/175 171/239/171 170/238/170 +f 171/239/171 175/244/175 176/245/176 +f 176/245/176 172/240/172 171/239/171 +f 112/241/112 116/246/116 177/247/177 +f 177/247/177 173/242/173 112/241/112 +f 173/242/173 177/247/177 178/248/178 +f 178/248/178 174/243/174 173/242/173 +f 174/243/174 178/248/178 179/249/179 +f 179/249/179 175/244/175 174/243/174 +f 175/244/175 179/249/179 180/250/180 +f 180/250/180 176/245/176 175/244/175 +f 116/251/116 120/256/120 181/257/181 +f 181/257/181 177/252/177 116/251/116 +f 177/252/177 181/257/181 182/258/182 +f 182/258/182 178/253/178 177/252/177 +f 178/253/178 182/258/182 183/259/183 +f 183/259/183 179/254/179 178/253/178 +f 179/254/179 183/259/183 184/260/184 +f 184/260/184 180/255/180 179/254/179 +f 120/256/120 124/261/124 185/262/185 +f 185/262/185 181/257/181 120/256/120 +f 181/257/181 185/262/185 186/263/186 +f 186/263/186 182/258/182 181/257/181 +f 182/258/182 186/263/186 187/264/187 +f 187/264/187 183/259/183 182/258/182 +f 183/259/183 187/264/187 188/265/188 +f 188/265/188 184/260/184 183/259/183 +f 124/261/124 128/266/128 189/267/189 +f 189/267/189 185/262/185 124/261/124 +f 185/262/185 189/267/189 190/268/190 +f 190/268/190 186/263/186 185/262/185 +f 186/263/186 190/268/190 191/269/191 +f 191/269/191 187/264/187 186/263/186 +f 187/264/187 191/269/191 192/270/192 +f 192/270/192 188/265/188 187/264/187 +f 128/266/128 132/271/132 193/272/193 +f 193/272/193 189/267/189 128/266/128 +f 189/267/189 193/272/193 194/273/194 +f 194/273/194 190/268/190 189/267/189 +f 190/268/190 194/273/194 195/274/195 +f 195/274/195 191/269/191 190/268/190 +f 191/269/191 195/274/195 196/275/196 +f 196/275/196 192/270/192 191/269/191 +f 132/276/132 136/281/136 197/282/197 +f 197/282/197 193/277/193 132/276/132 +f 193/277/193 197/282/197 198/283/198 +f 198/283/198 194/278/194 193/277/193 +f 194/278/194 198/283/198 199/284/199 +f 199/284/199 195/279/195 194/278/194 +f 195/279/195 199/284/199 200/285/200 +f 200/285/200 196/280/196 195/279/195 +f 136/281/136 140/286/140 201/287/201 +f 201/287/201 197/282/197 136/281/136 +f 197/282/197 201/287/201 202/288/202 +f 202/288/202 198/283/198 197/282/197 +f 198/283/198 202/288/202 203/289/203 +f 203/289/203 199/284/199 198/283/198 +f 199/284/199 203/289/203 204/290/204 +f 204/290/204 200/285/200 199/284/199 +f 140/286/140 144/291/144 205/292/205 +f 205/292/205 201/287/201 140/286/140 +f 201/287/201 205/292/205 206/293/206 +f 206/293/206 202/288/202 201/287/201 +f 202/288/202 206/293/206 207/294/207 +f 207/294/207 203/289/203 202/288/202 +f 203/289/203 207/294/207 208/295/208 +f 208/295/208 204/290/204 203/289/203 +f 144/291/144 84/296/84 145/297/145 +f 145/297/145 205/292/205 144/291/144 +f 205/292/205 145/297/145 146/298/146 +f 146/298/146 206/293/206 205/292/205 +f 206/293/206 146/298/146 147/299/147 +f 147/299/147 207/294/207 206/293/206 +f 207/294/207 147/299/147 148/300/148 +f 148/300/148 208/295/208 207/294/207 +f 148/301/148 152/306/152 213/307/213 +f 213/307/213 209/302/209 148/301/148 +f 209/302/209 213/307/213 214/308/214 +f 214/308/214 210/303/210 209/302/209 +f 210/303/210 214/308/214 215/309/215 +f 215/309/215 211/304/211 210/303/210 +f 211/304/211 215/309/215 212/310/212 +f 152/306/152 156/311/156 216/312/216 +f 216/312/216 213/307/213 152/306/152 +f 213/307/213 216/312/216 217/313/217 +f 217/313/217 214/308/214 213/307/213 +f 214/308/214 217/313/217 218/314/218 +f 218/314/218 215/309/215 214/308/214 +f 215/309/215 218/314/218 212/315/212 +f 156/311/156 160/316/160 219/317/219 +f 219/317/219 216/312/216 156/311/156 +f 216/312/216 219/317/219 220/318/220 +f 220/318/220 217/313/217 216/312/216 +f 217/313/217 220/318/220 221/319/221 +f 221/319/221 218/314/218 217/313/217 +f 218/314/218 221/319/221 212/320/212 +f 160/316/160 164/321/164 222/322/222 +f 222/322/222 219/317/219 160/316/160 +f 219/317/219 222/322/222 223/323/223 +f 223/323/223 220/318/220 219/317/219 +f 220/318/220 223/323/223 224/324/224 +f 224/324/224 221/319/221 220/318/220 +f 221/319/221 224/324/224 212/325/212 +f 164/326/164 168/331/168 225/332/225 +f 225/332/225 222/327/222 164/326/164 +f 222/327/222 225/332/225 226/333/226 +f 226/333/226 223/328/223 222/327/222 +f 223/328/223 226/333/226 227/334/227 +f 227/334/227 224/329/224 223/328/223 +f 224/329/224 227/334/227 212/335/212 +f 168/331/168 172/336/172 228/337/228 +f 228/337/228 225/332/225 168/331/168 +f 225/332/225 228/337/228 229/338/229 +f 229/338/229 226/333/226 225/332/225 +f 226/333/226 229/338/229 230/339/230 +f 230/339/230 227/334/227 226/333/226 +f 227/334/227 230/339/230 212/340/212 +f 172/336/172 176/341/176 231/342/231 +f 231/342/231 228/337/228 172/336/172 +f 228/337/228 231/342/231 232/343/232 +f 232/343/232 229/338/229 228/337/228 +f 229/338/229 232/343/232 233/344/233 +f 233/344/233 230/339/230 229/338/229 +f 230/339/230 233/344/233 212/345/212 +f 176/341/176 180/346/180 234/347/234 +f 234/347/234 231/342/231 176/341/176 +f 231/342/231 234/347/234 235/348/235 +f 235/348/235 232/343/232 231/342/231 +f 232/343/232 235/348/235 236/349/236 +f 236/349/236 233/344/233 232/343/232 +f 233/344/233 236/349/236 212/350/212 +f 180/351/180 184/356/184 237/357/237 +f 237/357/237 234/352/234 180/351/180 +f 234/352/234 237/357/237 238/358/238 +f 238/358/238 235/353/235 234/352/234 +f 235/353/235 238/358/238 239/359/239 +f 239/359/239 236/354/236 235/353/235 +f 236/354/236 239/359/239 212/360/212 +f 184/356/184 188/361/188 240/362/240 +f 240/362/240 237/357/237 184/356/184 +f 237/357/237 240/362/240 241/363/241 +f 241/363/241 238/358/238 237/357/237 +f 238/358/238 241/363/241 242/364/242 +f 242/364/242 239/359/239 238/358/238 +f 239/359/239 242/364/242 212/365/212 +f 188/361/188 192/366/192 243/367/243 +f 243/367/243 240/362/240 188/361/188 +f 240/362/240 243/367/243 244/368/244 +f 244/368/244 241/363/241 240/362/240 +f 241/363/241 244/368/244 245/369/245 +f 245/369/245 242/364/242 241/363/241 +f 242/364/242 245/369/245 212/370/212 +f 192/366/192 196/371/196 246/372/246 +f 246/372/246 243/367/243 192/366/192 +f 243/367/243 246/372/246 247/373/247 +f 247/373/247 244/368/244 243/367/243 +f 244/368/244 247/373/247 248/374/248 +f 248/374/248 245/369/245 244/368/244 +f 245/369/245 248/374/248 212/375/212 +f 196/376/196 200/381/200 249/382/249 +f 249/382/249 246/377/246 196/376/196 +f 246/377/246 249/382/249 250/383/250 +f 250/383/250 247/378/247 246/377/246 +f 247/378/247 250/383/250 251/384/251 +f 251/384/251 248/379/248 247/378/247 +f 248/379/248 251/384/251 212/385/212 +f 200/381/200 204/386/204 252/387/252 +f 252/387/252 249/382/249 200/381/200 +f 249/382/249 252/387/252 253/388/253 +f 253/388/253 250/383/250 249/382/249 +f 250/383/250 253/388/253 254/389/254 +f 254/389/254 251/384/251 250/383/250 +f 251/384/251 254/389/254 212/390/212 +f 204/386/204 208/391/208 255/392/255 +f 255/392/255 252/387/252 204/386/204 +f 252/387/252 255/392/255 256/393/256 +f 256/393/256 253/388/253 252/387/252 +f 253/388/253 256/393/256 257/394/257 +f 257/394/257 254/389/254 253/388/253 +f 254/389/254 257/394/257 212/395/212 +f 208/391/208 148/396/148 209/397/209 +f 209/397/209 255/392/255 208/391/208 +f 255/392/255 209/397/209 210/398/210 +f 210/398/210 256/393/256 255/392/255 +f 256/393/256 210/398/210 211/399/211 +f 211/399/211 257/394/257 256/393/256 +f 257/394/257 211/399/211 212/400/212 +f 258/401/258 263/406/263 264/407/264 +f 264/407/264 259/402/259 258/401/258 +f 259/402/259 264/407/264 265/408/265 +f 265/408/265 260/403/260 259/402/259 +f 260/403/260 265/408/265 266/409/266 +f 266/409/266 261/404/261 260/403/260 +f 261/404/261 266/409/266 267/410/267 +f 267/410/267 262/405/262 261/404/261 +f 263/406/263 268/411/268 269/412/269 +f 269/412/269 264/407/264 263/406/263 +f 264/407/264 269/412/269 270/413/270 +f 270/413/270 265/408/265 264/407/264 +f 265/408/265 270/413/270 271/414/271 +f 271/414/271 266/409/266 265/408/265 +f 266/409/266 271/414/271 272/415/272 +f 272/415/272 267/410/267 266/409/266 +f 268/411/268 273/416/273 274/417/274 +f 274/417/274 269/412/269 268/411/268 +f 269/412/269 274/417/274 275/418/275 +f 275/418/275 270/413/270 269/412/269 +f 270/413/270 275/418/275 276/419/276 +f 276/419/276 271/414/271 270/413/270 +f 271/414/271 276/419/276 277/420/277 +f 277/420/277 272/415/272 271/414/271 +f 273/416/273 278/421/278 279/422/279 +f 279/422/279 274/417/274 273/416/273 +f 274/417/274 279/422/279 280/423/280 +f 280/423/280 275/418/275 274/417/274 +f 275/418/275 280/423/280 281/424/281 +f 281/424/281 276/419/276 275/418/275 +f 276/419/276 281/424/281 282/425/282 +f 282/425/282 277/420/277 276/419/276 +f 278/426/278 283/431/283 284/432/284 +f 284/432/284 279/427/279 278/426/278 +f 279/427/279 284/432/284 285/433/285 +f 285/433/285 280/428/280 279/427/279 +f 280/428/280 285/433/285 286/434/286 +f 286/434/286 281/429/281 280/428/280 +f 281/429/281 286/434/286 287/435/287 +f 287/435/287 282/430/282 281/429/281 +f 283/431/283 288/436/288 289/437/289 +f 289/437/289 284/432/284 283/431/283 +f 284/432/284 289/437/289 290/438/290 +f 290/438/290 285/433/285 284/432/284 +f 285/433/285 290/438/290 291/439/291 +f 291/439/291 286/434/286 285/433/285 +f 286/434/286 291/439/291 292/440/292 +f 292/440/292 287/435/287 286/434/286 +f 288/436/288 293/441/293 294/442/294 +f 294/442/294 289/437/289 288/436/288 +f 289/437/289 294/442/294 295/443/295 +f 295/443/295 290/438/290 289/437/289 +f 290/438/290 295/443/295 296/444/296 +f 296/444/296 291/439/291 290/438/290 +f 291/439/291 296/444/296 297/445/297 +f 297/445/297 292/440/292 291/439/291 +f 293/441/293 258/446/258 259/447/259 +f 259/447/259 294/442/294 293/441/293 +f 294/442/294 259/447/259 260/448/260 +f 260/448/260 295/443/295 294/442/294 +f 295/443/295 260/448/260 261/449/261 +f 261/449/261 296/444/296 295/443/295 +f 296/444/296 261/449/261 262/450/262 +f 262/450/262 297/445/297 296/444/296 +f 262/451/262 267/456/267 302/457/302 +f 302/457/302 298/452/298 262/451/262 +f 298/452/298 302/457/302 303/458/303 +f 303/458/303 299/453/299 298/452/298 +f 299/453/299 303/458/303 304/459/304 +f 304/459/304 300/454/300 299/453/299 +f 300/454/300 304/459/304 305/460/305 +f 305/460/305 301/455/301 300/454/300 +f 267/456/267 272/461/272 306/462/306 +f 306/462/306 302/457/302 267/456/267 +f 302/457/302 306/462/306 307/463/307 +f 307/463/307 303/458/303 302/457/302 +f 303/458/303 307/463/307 308/464/308 +f 308/464/308 304/459/304 303/458/303 +f 304/459/304 308/464/308 309/465/309 +f 309/465/309 305/460/305 304/459/304 +f 272/461/272 277/466/277 310/467/310 +f 310/467/310 306/462/306 272/461/272 +f 306/462/306 310/467/310 311/468/311 +f 311/468/311 307/463/307 306/462/306 +f 307/463/307 311/468/311 312/469/312 +f 312/469/312 308/464/308 307/463/307 +f 308/464/308 312/469/312 313/470/313 +f 313/470/313 309/465/309 308/464/308 +f 277/466/277 282/471/282 314/472/314 +f 314/472/314 310/467/310 277/466/277 +f 310/467/310 314/472/314 315/473/315 +f 315/473/315 311/468/311 310/467/310 +f 311/468/311 315/473/315 316/474/316 +f 316/474/316 312/469/312 311/468/311 +f 312/469/312 316/474/316 317/475/317 +f 317/475/317 313/470/313 312/469/312 +f 282/476/282 287/481/287 318/482/318 +f 318/482/318 314/477/314 282/476/282 +f 314/477/314 318/482/318 319/483/319 +f 319/483/319 315/478/315 314/477/314 +f 315/478/315 319/483/319 320/484/320 +f 320/484/320 316/479/316 315/478/315 +f 316/479/316 320/484/320 321/485/321 +f 321/485/321 317/480/317 316/479/316 +f 287/481/287 292/486/292 322/487/322 +f 322/487/322 318/482/318 287/481/287 +f 318/482/318 322/487/322 323/488/323 +f 323/488/323 319/483/319 318/482/318 +f 319/483/319 323/488/323 324/489/324 +f 324/489/324 320/484/320 319/483/319 +f 320/484/320 324/489/324 325/490/325 +f 325/490/325 321/485/321 320/484/320 +f 292/486/292 297/491/297 326/492/326 +f 326/492/326 322/487/322 292/486/292 +f 322/487/322 326/492/326 327/493/327 +f 327/493/327 323/488/323 322/487/322 +f 323/488/323 327/493/327 328/494/328 +f 328/494/328 324/489/324 323/488/323 +f 324/489/324 328/494/328 329/495/329 +f 329/495/329 325/490/325 324/489/324 +f 297/491/297 262/496/262 298/497/298 +f 298/497/298 326/492/326 297/491/297 +f 326/492/326 298/497/298 299/498/299 +f 299/498/299 327/493/327 326/492/326 +f 327/493/327 299/498/299 300/499/300 +f 300/499/300 328/494/328 327/493/327 +f 328/494/328 300/499/300 301/500/301 +f 301/500/301 329/495/329 328/494/328 +f 330/501/330 335/506/335 336/507/336 +f 336/507/336 331/502/331 330/501/330 +f 331/502/331 336/507/336 337/508/337 +f 337/508/337 332/503/332 331/502/331 +f 332/503/332 337/508/337 338/509/338 +f 338/509/338 333/504/333 332/503/332 +f 333/504/333 338/509/338 339/510/339 +f 339/510/339 334/505/334 333/504/333 +f 335/506/335 340/511/340 341/512/341 +f 341/512/341 336/507/336 335/506/335 +f 336/507/336 341/512/341 342/513/342 +f 342/513/342 337/508/337 336/507/336 +f 337/508/337 342/513/342 343/514/343 +f 343/514/343 338/509/338 337/508/337 +f 338/509/338 343/514/343 344/515/344 +f 344/515/344 339/510/339 338/509/338 +f 340/511/340 345/516/345 346/517/346 +f 346/517/346 341/512/341 340/511/340 +f 341/512/341 346/517/346 347/518/347 +f 347/518/347 342/513/342 341/512/341 +f 342/513/342 347/518/347 348/519/348 +f 348/519/348 343/514/343 342/513/342 +f 343/514/343 348/519/348 349/520/349 +f 349/520/349 344/515/344 343/514/343 +f 345/516/345 350/521/350 351/522/351 +f 351/522/351 346/517/346 345/516/345 +f 346/517/346 351/522/351 352/523/352 +f 352/523/352 347/518/347 346/517/346 +f 347/518/347 352/523/352 353/524/353 +f 353/524/353 348/519/348 347/518/347 +f 348/519/348 353/524/353 354/525/354 +f 354/525/354 349/520/349 348/519/348 +f 350/526/350 355/531/355 356/532/356 +f 356/532/356 351/527/351 350/526/350 +f 351/527/351 356/532/356 357/533/357 +f 357/533/357 352/528/352 351/527/351 +f 352/528/352 357/533/357 358/534/358 +f 358/534/358 353/529/353 352/528/352 +f 353/529/353 358/534/358 359/535/359 +f 359/535/359 354/530/354 353/529/353 +f 355/531/355 360/536/360 361/537/361 +f 361/537/361 356/532/356 355/531/355 +f 356/532/356 361/537/361 362/538/362 +f 362/538/362 357/533/357 356/532/356 +f 357/533/357 362/538/362 363/539/363 +f 363/539/363 358/534/358 357/533/357 +f 358/534/358 363/539/363 364/540/364 +f 364/540/364 359/535/359 358/534/358 +f 360/536/360 365/541/365 366/542/366 +f 366/542/366 361/537/361 360/536/360 +f 361/537/361 366/542/366 367/543/367 +f 367/543/367 362/538/362 361/537/361 +f 362/538/362 367/543/367 368/544/368 +f 368/544/368 363/539/363 362/538/362 +f 363/539/363 368/544/368 369/545/369 +f 369/545/369 364/540/364 363/539/363 +f 365/541/365 330/546/330 331/547/331 +f 331/547/331 366/542/366 365/541/365 +f 366/542/366 331/547/331 332/548/332 +f 332/548/332 367/543/367 366/542/366 +f 367/543/367 332/548/332 333/549/333 +f 333/549/333 368/544/368 367/543/367 +f 368/544/368 333/549/333 334/550/334 +f 334/550/334 369/545/369 368/544/368 +f 334/551/334 339/556/339 374/557/374 +f 374/557/374 370/552/370 334/551/334 +f 370/552/370 374/557/374 375/558/375 +f 375/558/375 371/553/371 370/552/370 +f 371/553/371 375/558/375 376/559/376 +f 376/559/376 372/554/372 371/553/371 +f 372/554/372 376/559/376 377/560/377 +f 377/560/377 373/555/373 372/554/372 +f 339/556/339 344/561/344 378/562/378 +f 378/562/378 374/557/374 339/556/339 +f 374/557/374 378/562/378 379/563/379 +f 379/563/379 375/558/375 374/557/374 +f 375/558/375 379/563/379 380/564/380 +f 380/564/380 376/559/376 375/558/375 +f 376/559/376 380/564/380 381/565/381 +f 381/565/381 377/560/377 376/559/376 +f 344/561/344 349/566/349 382/567/382 +f 382/567/382 378/562/378 344/561/344 +f 378/562/378 382/567/382 383/568/383 +f 383/568/383 379/563/379 378/562/378 +f 379/563/379 383/568/383 384/569/384 +f 384/569/384 380/564/380 379/563/379 +f 380/564/380 384/569/384 385/570/385 +f 385/570/385 381/565/381 380/564/380 +f 349/566/349 354/571/354 386/572/386 +f 386/572/386 382/567/382 349/566/349 +f 382/567/382 386/572/386 387/573/387 +f 387/573/387 383/568/383 382/567/382 +f 383/568/383 387/573/387 388/574/388 +f 388/574/388 384/569/384 383/568/383 +f 384/569/384 388/574/388 389/575/389 +f 389/575/389 385/570/385 384/569/384 +f 354/576/354 359/581/359 390/582/390 +f 390/582/390 386/577/386 354/576/354 +f 386/577/386 390/582/390 391/583/391 +f 391/583/391 387/578/387 386/577/386 +f 387/578/387 391/583/391 392/584/392 +f 392/584/392 388/579/388 387/578/387 +f 388/579/388 392/584/392 393/585/393 +f 393/585/393 389/580/389 388/579/388 +f 359/581/359 364/586/364 394/587/394 +f 394/587/394 390/582/390 359/581/359 +f 390/582/390 394/587/394 395/588/395 +f 395/588/395 391/583/391 390/582/390 +f 391/583/391 395/588/395 396/589/396 +f 396/589/396 392/584/392 391/583/391 +f 392/584/392 396/589/396 397/590/397 +f 397/590/397 393/585/393 392/584/392 +f 364/586/364 369/591/369 398/592/398 +f 398/592/398 394/587/394 364/586/364 +f 394/587/394 398/592/398 399/593/399 +f 399/593/399 395/588/395 394/587/394 +f 395/588/395 399/593/399 400/594/400 +f 400/594/400 396/589/396 395/588/395 +f 396/589/396 400/594/400 401/595/401 +f 401/595/401 397/590/397 396/589/396 +f 369/591/369 334/596/334 370/597/370 +f 370/597/370 398/592/398 369/591/369 +f 398/592/398 370/597/370 371/598/371 +f 371/598/371 399/593/399 398/592/398 +f 399/593/399 371/598/371 372/599/372 +f 372/599/372 400/594/400 399/593/399 +f 400/594/400 372/599/372 373/600/373 +f 373/600/373 401/595/401 400/594/400 +f 407/607/407 403/602/403 402/601/402 +f 403/602/403 407/607/407 408/608/408 +f 408/608/408 404/603/404 403/602/403 +f 404/603/404 408/608/408 409/609/409 +f 409/609/409 405/604/405 404/603/404 +f 405/604/405 409/609/409 410/610/410 +f 410/610/410 406/605/406 405/604/405 +f 411/612/411 407/607/407 402/606/402 +f 407/607/407 411/612/411 412/613/412 +f 412/613/412 408/608/408 407/607/407 +f 408/608/408 412/613/412 413/614/413 +f 413/614/413 409/609/409 408/608/408 +f 409/609/409 413/614/413 414/615/414 +f 414/615/414 410/610/410 409/609/409 +f 415/617/415 411/612/411 402/611/402 +f 411/612/411 415/617/415 416/618/416 +f 416/618/416 412/613/412 411/612/411 +f 412/613/412 416/618/416 417/619/417 +f 417/619/417 413/614/413 412/613/412 +f 413/614/413 417/619/417 418/620/418 +f 418/620/418 414/615/414 413/614/413 +f 419/622/419 415/617/415 402/616/402 +f 415/617/415 419/622/419 420/623/420 +f 420/623/420 416/618/416 415/617/415 +f 416/618/416 420/623/420 421/624/421 +f 421/624/421 417/619/417 416/618/416 +f 417/619/417 421/624/421 422/625/422 +f 422/625/422 418/620/418 417/619/417 +f 423/632/423 419/627/419 402/626/402 +f 419/627/419 423/632/423 424/633/424 +f 424/633/424 420/628/420 419/627/419 +f 420/628/420 424/633/424 425/634/425 +f 425/634/425 421/629/421 420/628/420 +f 421/629/421 425/634/425 426/635/426 +f 426/635/426 422/630/422 421/629/421 +f 427/637/427 423/632/423 402/631/402 +f 423/632/423 427/637/427 428/638/428 +f 428/638/428 424/633/424 423/632/423 +f 424/633/424 428/638/428 429/639/429 +f 429/639/429 425/634/425 424/633/424 +f 425/634/425 429/639/429 430/640/430 +f 430/640/430 426/635/426 425/634/425 +f 431/642/431 427/637/427 402/636/402 +f 427/637/427 431/642/431 432/643/432 +f 432/643/432 428/638/428 427/637/427 +f 428/638/428 432/643/432 433/644/433 +f 433/644/433 429/639/429 428/638/428 +f 429/639/429 433/644/433 434/645/434 +f 434/645/434 430/640/430 429/639/429 +f 435/647/435 431/642/431 402/641/402 +f 431/642/431 435/647/435 436/648/436 +f 436/648/436 432/643/432 431/642/431 +f 432/643/432 436/648/436 437/649/437 +f 437/649/437 433/644/433 432/643/432 +f 433/644/433 437/649/437 438/650/438 +f 438/650/438 434/645/434 433/644/433 +f 439/657/439 435/652/435 402/651/402 +f 435/652/435 439/657/439 440/658/440 +f 440/658/440 436/653/436 435/652/435 +f 436/653/436 440/658/440 441/659/441 +f 441/659/441 437/654/437 436/653/436 +f 437/654/437 441/659/441 442/660/442 +f 442/660/442 438/655/438 437/654/437 +f 443/662/443 439/657/439 402/656/402 +f 439/657/439 443/662/443 444/663/444 +f 444/663/444 440/658/440 439/657/439 +f 440/658/440 444/663/444 445/664/445 +f 445/664/445 441/659/441 440/658/440 +f 441/659/441 445/664/445 446/665/446 +f 446/665/446 442/660/442 441/659/441 +f 447/667/447 443/662/443 402/661/402 +f 443/662/443 447/667/447 448/668/448 +f 448/668/448 444/663/444 443/662/443 +f 444/663/444 448/668/448 449/669/449 +f 449/669/449 445/664/445 444/663/444 +f 445/664/445 449/669/449 450/670/450 +f 450/670/450 446/665/446 445/664/445 +f 451/672/451 447/667/447 402/666/402 +f 447/667/447 451/672/451 452/673/452 +f 452/673/452 448/668/448 447/667/447 +f 448/668/448 452/673/452 453/674/453 +f 453/674/453 449/669/449 448/668/448 +f 449/669/449 453/674/453 454/675/454 +f 454/675/454 450/670/450 449/669/449 +f 455/682/455 451/677/451 402/676/402 +f 451/677/451 455/682/455 456/683/456 +f 456/683/456 452/678/452 451/677/451 +f 452/678/452 456/683/456 457/684/457 +f 457/684/457 453/679/453 452/678/452 +f 453/679/453 457/684/457 458/685/458 +f 458/685/458 454/680/454 453/679/453 +f 459/687/459 455/682/455 402/681/402 +f 455/682/455 459/687/459 460/688/460 +f 460/688/460 456/683/456 455/682/455 +f 456/683/456 460/688/460 461/689/461 +f 461/689/461 457/684/457 456/683/456 +f 457/684/457 461/689/461 462/690/462 +f 462/690/462 458/685/458 457/684/457 +f 463/692/463 459/687/459 402/686/402 +f 459/687/459 463/692/463 464/693/464 +f 464/693/464 460/688/460 459/687/459 +f 460/688/460 464/693/464 465/694/465 +f 465/694/465 461/689/461 460/688/460 +f 461/689/461 465/694/465 466/695/466 +f 466/695/466 462/690/462 461/689/461 +f 403/697/403 463/692/463 402/691/402 +f 463/692/463 403/697/403 404/698/404 +f 404/698/404 464/693/464 463/692/463 +f 464/693/464 404/698/404 405/699/405 +f 405/699/405 465/694/465 464/693/464 +f 465/694/465 405/699/405 406/700/406 +f 406/700/406 466/695/466 465/694/465 +f 406/701/406 410/706/410 471/707/471 +f 471/707/471 467/702/467 406/701/406 +f 467/702/467 471/707/471 472/708/472 +f 472/708/472 468/703/468 467/702/467 +f 468/703/468 472/708/472 473/709/473 +f 473/709/473 469/704/469 468/703/468 +f 469/704/469 473/709/473 474/710/474 +f 474/710/474 470/705/470 469/704/469 +f 410/706/410 414/711/414 475/712/475 +f 475/712/475 471/707/471 410/706/410 +f 471/707/471 475/712/475 476/713/476 +f 476/713/476 472/708/472 471/707/471 +f 472/708/472 476/713/476 477/714/477 +f 477/714/477 473/709/473 472/708/472 +f 473/709/473 477/714/477 478/715/478 +f 478/715/478 474/710/474 473/709/473 +f 414/711/414 418/716/418 479/717/479 +f 479/717/479 475/712/475 414/711/414 +f 475/712/475 479/717/479 480/718/480 +f 480/718/480 476/713/476 475/712/475 +f 476/713/476 480/718/480 481/719/481 +f 481/719/481 477/714/477 476/713/476 +f 477/714/477 481/719/481 482/720/482 +f 482/720/482 478/715/478 477/714/477 +f 418/716/418 422/721/422 483/722/483 +f 483/722/483 479/717/479 418/716/418 +f 479/717/479 483/722/483 484/723/484 +f 484/723/484 480/718/480 479/717/479 +f 480/718/480 484/723/484 485/724/485 +f 485/724/485 481/719/481 480/718/480 +f 481/719/481 485/724/485 486/725/486 +f 486/725/486 482/720/482 481/719/481 +f 422/726/422 426/731/426 487/732/487 +f 487/732/487 483/727/483 422/726/422 +f 483/727/483 487/732/487 488/733/488 +f 488/733/488 484/728/484 483/727/483 +f 484/728/484 488/733/488 489/734/489 +f 489/734/489 485/729/485 484/728/484 +f 485/729/485 489/734/489 490/735/490 +f 490/735/490 486/730/486 485/729/485 +f 426/731/426 430/736/430 491/737/491 +f 491/737/491 487/732/487 426/731/426 +f 487/732/487 491/737/491 492/738/492 +f 492/738/492 488/733/488 487/732/487 +f 488/733/488 492/738/492 493/739/493 +f 493/739/493 489/734/489 488/733/488 +f 489/734/489 493/739/493 494/740/494 +f 494/740/494 490/735/490 489/734/489 +f 430/736/430 434/741/434 495/742/495 +f 495/742/495 491/737/491 430/736/430 +f 491/737/491 495/742/495 496/743/496 +f 496/743/496 492/738/492 491/737/491 +f 492/738/492 496/743/496 497/744/497 +f 497/744/497 493/739/493 492/738/492 +f 493/739/493 497/744/497 498/745/498 +f 498/745/498 494/740/494 493/739/493 +f 434/741/434 438/746/438 499/747/499 +f 499/747/499 495/742/495 434/741/434 +f 495/742/495 499/747/499 500/748/500 +f 500/748/500 496/743/496 495/742/495 +f 496/743/496 500/748/500 501/749/501 +f 501/749/501 497/744/497 496/743/496 +f 497/744/497 501/749/501 502/750/502 +f 502/750/502 498/745/498 497/744/497 +f 438/751/438 442/756/442 503/757/503 +f 503/757/503 499/752/499 438/751/438 +f 499/752/499 503/757/503 504/758/504 +f 504/758/504 500/753/500 499/752/499 +f 500/753/500 504/758/504 505/759/505 +f 505/759/505 501/754/501 500/753/500 +f 501/754/501 505/759/505 506/760/506 +f 506/760/506 502/755/502 501/754/501 +f 442/756/442 446/761/446 507/762/507 +f 507/762/507 503/757/503 442/756/442 +f 503/757/503 507/762/507 508/763/508 +f 508/763/508 504/758/504 503/757/503 +f 504/758/504 508/763/508 509/764/509 +f 509/764/509 505/759/505 504/758/504 +f 505/759/505 509/764/509 510/765/510 +f 510/765/510 506/760/506 505/759/505 +f 446/761/446 450/766/450 511/767/511 +f 511/767/511 507/762/507 446/761/446 +f 507/762/507 511/767/511 512/768/512 +f 512/768/512 508/763/508 507/762/507 +f 508/763/508 512/768/512 513/769/513 +f 513/769/513 509/764/509 508/763/508 +f 509/764/509 513/769/513 514/770/514 +f 514/770/514 510/765/510 509/764/509 +f 450/766/450 454/771/454 515/772/515 +f 515/772/515 511/767/511 450/766/450 +f 511/767/511 515/772/515 516/773/516 +f 516/773/516 512/768/512 511/767/511 +f 512/768/512 516/773/516 517/774/517 +f 517/774/517 513/769/513 512/768/512 +f 513/769/513 517/774/517 518/775/518 +f 518/775/518 514/770/514 513/769/513 +f 454/776/454 458/781/458 519/782/519 +f 519/782/519 515/777/515 454/776/454 +f 515/777/515 519/782/519 520/783/520 +f 520/783/520 516/778/516 515/777/515 +f 516/778/516 520/783/520 521/784/521 +f 521/784/521 517/779/517 516/778/516 +f 517/779/517 521/784/521 522/785/522 +f 522/785/522 518/780/518 517/779/517 +f 458/781/458 462/786/462 523/787/523 +f 523/787/523 519/782/519 458/781/458 +f 519/782/519 523/787/523 524/788/524 +f 524/788/524 520/783/520 519/782/519 +f 520/783/520 524/788/524 525/789/525 +f 525/789/525 521/784/521 520/783/520 +f 521/784/521 525/789/525 526/790/526 +f 526/790/526 522/785/522 521/784/521 +f 462/786/462 466/791/466 527/792/527 +f 527/792/527 523/787/523 462/786/462 +f 523/787/523 527/792/527 528/793/528 +f 528/793/528 524/788/524 523/787/523 +f 524/788/524 528/793/528 529/794/529 +f 529/794/529 525/789/525 524/788/524 +f 525/789/525 529/794/529 530/795/530 +f 530/795/530 526/790/526 525/789/525 +f 466/791/466 406/796/406 467/797/467 +f 467/797/467 527/792/527 466/791/466 +f 527/792/527 467/797/467 468/798/468 +f 468/798/468 528/793/528 527/792/527 +f 528/793/528 468/798/468 469/799/469 +f 469/799/469 529/794/529 528/793/528 +f 529/794/529 469/799/469 470/800/470 +f 470/800/470 530/795/530 529/794/529 +# 992 faces + +g diff --git a/examples/nitro_engine/specular_material/assets/teapot.png b/examples/nitro_engine/specular_material/assets/teapot.png new file mode 100644 index 0000000..eafd9fa Binary files /dev/null and b/examples/nitro_engine/specular_material/assets/teapot.png differ diff --git a/examples/nitro_engine/specular_material/build.py b/examples/nitro_engine/specular_material/build.py new file mode 100644 index 0000000..1e72fbe --- /dev/null +++ b/examples/nitro_engine/specular_material/build.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['NE', 'nds9'], + libdirs=['${BLOCKSDS}/libs/libnds', '${BLOCKSDSEXT}/nitro-engine'] +) +arm9.add_grit(['assets']) +arm9.add_nitro_engine_obj(['assets']) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9], + game_title='NE: Specular material', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nitro_engine/specular_material/source/main.c b/examples/nitro_engine/specular_material/source/main.c new file mode 100644 index 0000000..f89a85b --- /dev/null +++ b/examples/nitro_engine/specular_material/source/main.c @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2008-2011, 2019, 2022 +// +// This file is part of Nitro Engine + +#include + +// Files autogenerated from bin files inside of the folder data +#include "grit/teapot_png.h" +#include "models/teapot_dl.h" + +NE_Camera *Camera; +NE_Model *ModelSpecular, *ModelDiffuse; +NE_Material *MaterialSpecular, *MaterialDiffuse; + +bool wireframe; + +void Draw3DScene1(void) +{ + NE_CameraUse(Camera); + + NE_PolyFormat(wireframe ? 0 : 31, 0, NE_LIGHT_ALL, NE_CULL_BACK, 0); + + NE_ModelDraw(ModelSpecular); + + printf("\x1b[22;0H" + "Polygon count: %d \n" + "Vertex count: %d ", + NE_GetPolygonCount(), + NE_GetVertexCount()); +} + +void Draw3DScene2(void) +{ + NE_CameraUse(Camera); + + NE_PolyFormat(wireframe ? 0 : 31, 0, NE_LIGHT_ALL, NE_CULL_BACK, 0); + + NE_ModelDraw(ModelDiffuse); +} + +int main(void) +{ + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + NE_InitDual3D(); + NE_InitConsole(); + + // Allocate objects + Camera = NE_CameraCreate(); + ModelSpecular = NE_ModelCreate(NE_Static); + ModelDiffuse = NE_ModelCreate(NE_Static); + MaterialSpecular = NE_MaterialCreate(); + MaterialDiffuse = NE_MaterialCreate(); + + // Setup camera + NE_CameraSet(Camera, + 0, 0, 3, + 0, 0, 0, + 0, 1, 0); + + // Load model + NE_ModelLoadStaticMesh(ModelSpecular, (u32*)teapot_dl); + NE_ModelClone(ModelDiffuse, ModelSpecular); + + // Load texture and clone it. The texture coordinates of the model are + // outside of [0.0, 1.0], so it is needed to enable wrapping. + NE_MaterialTexLoad(MaterialSpecular, NE_A1RGB5, 256, 256, + NE_TEXGEN_TEXCOORD | NE_TEXTURE_WRAP_S | NE_TEXTURE_WRAP_T, + (u8 *)teapot_pngBitmap); + NE_MaterialClone(MaterialSpecular, MaterialDiffuse); + + NE_ModelSetMaterial(ModelSpecular, MaterialSpecular); + NE_ModelSetMaterial(ModelDiffuse, MaterialDiffuse); + + // Set some propierties to the materials + + NE_MaterialSetPropierties(MaterialSpecular, + RGB15(0, 0, 0), // Diffuse + RGB15(0, 0, 0), // Ambient + RGB15(31, 31, 31), // Specular + RGB15(0, 0, 0), // Emission + false, true); // Vtx color, use shininess table + + NE_MaterialSetPropierties(MaterialDiffuse, + RGB15(31, 31, 31), // Diffuse + RGB15(0, 0, 0), // Ambient + RGB15(0, 0, 0), // Specular + RGB15(0, 0, 0), // Emission + false, false); // Vtx color, use shininess table + + // Set light color and direction + NE_LightSet(0, NE_White, 0, 1, 0); + NE_LightSet(1, NE_Blue, 0, -1, 0); + NE_LightSet(2, NE_Red, 1, 0, 0); + NE_LightSet(3, NE_Green, -1, 0, 0); + + NE_ShininessFunction shininess = NE_SHININESS_CUBIC; + + while (1) + { + NE_WaitForVBL(0); + + // Get keys information + scanKeys(); + uint32_t keys = keysHeld(); + uint32_t keys_down = keysDown(); + + printf("\x1b[0;0H" + "PAD: Rotate\n" + "A: Set wireframe mode\n" + "L/R: Change shininess\n"); + + if (keys & KEY_A) + wireframe = true; + else + wireframe = false; + + // Rotate model + if (keys & KEY_UP) + { + NE_ModelRotate(ModelSpecular, -2, 0, 0); + NE_ModelRotate(ModelDiffuse, -2, 0, 0); + } + if (keys & KEY_DOWN) + { + NE_ModelRotate(ModelSpecular, 2, 0, 0); + NE_ModelRotate(ModelDiffuse, 2, 0, 0); + } + if (keys & KEY_RIGHT) + { + NE_ModelRotate(ModelSpecular, 0, 2, 0); + NE_ModelRotate(ModelDiffuse, 0, 2, 0); + } + if (keys & KEY_LEFT) + { + NE_ModelRotate(ModelSpecular, 0, -2, 0); + NE_ModelRotate(ModelDiffuse, 0, -2, 0); + } + + // Shininess table + // --------------- + + const char *names[] = { + [NE_SHININESS_NONE] = "None ", + [NE_SHININESS_LINEAR] = "Linear ", + [NE_SHININESS_QUADRATIC] = "Quadratic", + [NE_SHININESS_CUBIC] = "Cubic ", + [NE_SHININESS_QUARTIC] = "Quartic " + }; + printf("\nShininess: %s", names[shininess]); + + if (keys_down & KEY_L) + { + if (shininess > NE_SHININESS_LINEAR) + shininess--; + } + if (keys_down & KEY_R) + { + if (shininess < NE_SHININESS_QUARTIC) + shininess++; + } + + NE_ShininessTableGenerate(shininess); + + NE_ProcessDual(Draw3DScene1, Draw3DScene2); + } + + return 0; +} diff --git a/examples/nitro_engine/using_nflib/.gitignore b/examples/nitro_engine/using_nflib/.gitignore new file mode 100644 index 0000000..eede31b --- /dev/null +++ b/examples/nitro_engine/using_nflib/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +graph.png +*.nds +*.sav +build +.ninja_deps +.ninja_log +*.ninja diff --git a/examples/nitro_engine/using_nflib/architectds b/examples/nitro_engine/using_nflib/architectds new file mode 120000 index 0000000..e7d5e9e --- /dev/null +++ b/examples/nitro_engine/using_nflib/architectds @@ -0,0 +1 @@ +../../../architectds \ No newline at end of file diff --git a/examples/nitro_engine/using_nflib/assets/bg/bg0.png b/examples/nitro_engine/using_nflib/assets/bg/bg0.png new file mode 100644 index 0000000..1181652 Binary files /dev/null and b/examples/nitro_engine/using_nflib/assets/bg/bg0.png differ diff --git a/examples/nitro_engine/using_nflib/assets/bg/bg1.png b/examples/nitro_engine/using_nflib/assets/bg/bg1.png new file mode 100644 index 0000000..d3f5124 Binary files /dev/null and b/examples/nitro_engine/using_nflib/assets/bg/bg1.png differ diff --git a/examples/nitro_engine/using_nflib/assets/bg/bg2.png b/examples/nitro_engine/using_nflib/assets/bg/bg2.png new file mode 100644 index 0000000..dccb576 Binary files /dev/null and b/examples/nitro_engine/using_nflib/assets/bg/bg2.png differ diff --git a/examples/nitro_engine/using_nflib/assets/bg/bg3.png b/examples/nitro_engine/using_nflib/assets/bg/bg3.png new file mode 100644 index 0000000..fd1998a Binary files /dev/null and b/examples/nitro_engine/using_nflib/assets/bg/bg3.png differ diff --git a/examples/nitro_engine/using_nflib/assets/fnt/default.png b/examples/nitro_engine/using_nflib/assets/fnt/default.png new file mode 100644 index 0000000..40b1f1f Binary files /dev/null and b/examples/nitro_engine/using_nflib/assets/fnt/default.png differ diff --git a/examples/nitro_engine/using_nflib/assets/robot/robot.blend b/examples/nitro_engine/using_nflib/assets/robot/robot.blend new file mode 100644 index 0000000..494f3b5 Binary files /dev/null and b/examples/nitro_engine/using_nflib/assets/robot/robot.blend differ diff --git a/examples/nitro_engine/using_nflib/assets/robot/robot.dsmparam b/examples/nitro_engine/using_nflib/assets/robot/robot.dsmparam new file mode 100644 index 0000000..e69de29 diff --git a/examples/nitro_engine/using_nflib/assets/robot/robot.grit b/examples/nitro_engine/using_nflib/assets/robot/robot.grit new file mode 100644 index 0000000..207c056 --- /dev/null +++ b/examples/nitro_engine/using_nflib/assets/robot/robot.grit @@ -0,0 +1,2 @@ +# 16 bit texture bitmap, force alpha bit to 1 +-gx -gb -gB16 -gT! diff --git a/examples/nitro_engine/using_nflib/assets/robot/robot.json b/examples/nitro_engine/using_nflib/assets/robot/robot.json new file mode 100644 index 0000000..080a5f6 --- /dev/null +++ b/examples/nitro_engine/using_nflib/assets/robot/robot.json @@ -0,0 +1,11 @@ +{ + "texture": [256, 256], + "blender-fix": true, + "export-base-pose": false, + "animations": [ + { + "file": "wave.md5anim", + "skip-frames": 1 + } + ] +} diff --git a/examples/nitro_engine/using_nflib/assets/robot/robot.md5mesh b/examples/nitro_engine/using_nflib/assets/robot/robot.md5mesh new file mode 100644 index 0000000..d00409f --- /dev/null +++ b/examples/nitro_engine/using_nflib/assets/robot/robot.md5mesh @@ -0,0 +1,1730 @@ +MD5Version 10 // Parameters used during export: Reorient: False; Scale: 1.0 +commandline "" + +numJoints 16 +numMeshes 1 + +joints { + "Base.Bone" -1 ( 0.0000000000 0.0000000000 0.0000000000 ) ( -0.7071068287 -0.0000000000 -0.0000000000 ) + "Spine.Low" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( -0.7072144747 -0.0000000843 -0.0000000843 ) + "Spine.High" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( -0.7069305778 -0.0000001686 -0.0000001685 ) + "Head" 2 ( -0.0000000000 0.0000000000 5.6328477859 ) ( -0.7071068287 -0.0000000843 -0.0000000843 ) + "Chest.Left" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Arm.Upper.Left" 4 ( 0.0000000000 1.0032964945 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Arm.End.Left" 5 ( 0.0000000000 2.6084918976 4.6046299934 ) ( -0.0000000517 -0.0000001192 -0.0000000000 ) + "Chest.Right" 1 ( 0.0000000000 -0.0005123615 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Arm.Upper.Right" 7 ( 0.0000000000 -1.0177762508 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Arm.End..Right" 8 ( 0.0000000000 -2.7045760155 4.6046299934 ) ( 1.0000000000 -0.0000000000 0.0000000755 ) + "Pelvis.Left" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( 0.0060729762 -0.0000000000 -0.0000000000 ) + "Leg-Upper.Left" 10 ( 0.0000000000 0.4849596322 2.9163727760 ) ( 0.7071067095 -0.0000000843 0.0000000843 ) + "Leg-Lower.Left" 11 ( 0.0000000000 0.4849596322 1.5501549244 ) ( 0.7071067095 0.0000000000 0.0000000000 ) + "Pelvis.Right" 0 ( 0.0000000000 0.0000000000 2.9222633839 ) ( 0.9999825358 0.0000000028 -0.0000004768 ) + "Leg-Upper.Right" 13 ( -0.0000000000 -0.5500909090 2.9157583714 ) ( 0.7071068287 0.0000003372 -0.0000003372 ) + "Leg-Lower.Right" 14 ( -0.0000000000 -0.5500909090 1.5495405197 ) ( 0.7071068287 0.0000003372 -0.0000003372 ) +} + +mesh { + shader "Material" + numverts 576 + vert 0 ( 0.8750000000 0.2500000000 ) 0 1 + vert 1 ( 0.8750000000 0.2500000000 ) 1 1 + vert 2 ( 0.0113541363 0.4622119665 ) 2 1 + vert 3 ( 0.0189200211 0.4281336665 ) 3 1 + vert 4 ( 0.0214311108 0.4167795181 ) 4 1 + vert 5 ( 0.3423711956 0.6714493930 ) 5 1 + vert 6 ( 0.4428113401 0.7197439075 ) 6 1 + vert 7 ( 0.3196628094 0.4622119665 ) 7 1 + vert 8 ( 0.2384368777 0.7197439075 ) 8 1 + vert 9 ( 0.3423711061 0.5182476044 ) 9 1 + vert 10 ( 0.3095858395 0.4167795181 ) 10 1 + vert 11 ( 0.3120969832 0.4281336665 ) 11 1 + vert 12 ( 0.1541543156 0.4622119665 ) 12 1 + vert 13 ( 0.0113541409 0.7197439075 ) 13 1 + vert 14 ( 0.4851713479 0.6714494228 ) 14 1 + vert 15 ( 0.1440773457 0.4167795181 ) 15 1 + vert 16 ( 0.1465884447 0.4281336665 ) 16 1 + vert 17 ( 0.1768626422 0.4622119665 ) 17 1 + vert 18 ( 0.1844285280 0.4281336665 ) 18 1 + vert 19 ( 0.1869396269 0.4167795181 ) 19 1 + vert 20 ( 0.1901422739 0.7083897591 ) 20 1 + vert 21 ( 0.2157285959 0.7197439075 ) 21 1 + vert 22 ( 0.6686197519 0.3548163772 ) 22 1 + vert 23 ( 0.3423711360 0.1277336478 ) 23 1 + vert 24 ( 0.0255380198 0.5737641454 ) 24 1 + vert 25 ( 0.0455269776 0.5866629481 ) 25 1 + vert 26 ( 0.5996038318 0.3548163772 ) 26 1 + vert 27 ( 0.1199815795 0.5866629481 ) 27 1 + vert 28 ( 0.0908734500 0.4167796969 ) 28 1 + vert 29 ( 0.1006828696 0.4054255486 ) 29 1 + vert 30 ( 0.4089916945 0.1277336478 ) 30 1 + vert 31 ( 0.5078796148 0.3548163772 ) 31 1 + vert 32 ( 0.0437058732 0.4746256471 ) 32 1 + vert 33 ( 0.0255379826 0.4888173342 ) 33 1 + vert 34 ( 0.2024006695 0.5639546812 ) 34 1 + vert 35 ( 0.1910465062 0.5737641454 ) 35 1 + vert 36 ( 0.2110354900 0.5866629481 ) 36 1 + vert 37 ( 0.6913279891 0.6970356703 ) 37 1 + vert 38 ( 0.8749999404 0.2500000000 ) 38 1 + vert 39 ( 0.2092143893 0.4746256471 ) 39 1 + vert 40 ( 0.1910464764 0.4888173342 ) 40 1 + vert 41 ( 0.7716981173 0.6970356703 ) 41 1 + vert 42 ( 0.3054790199 0.4888172746 ) 42 1 + vert 43 ( 0.2873110771 0.4746256471 ) 43 1 + vert 44 ( 0.2827706933 0.4859797955 ) 44 1 + vert 45 ( 0.7716981173 0.6970356703 ) 45 1 + vert 46 ( 0.7603439689 0.6970356703 ) 46 1 + vert 47 ( 0.2854900658 0.5866629481 ) 47 1 + vert 48 ( 0.3054789901 0.5737641156 ) 48 1 + vert 49 ( 0.1673034430 0.4054255486 ) 49 1 + vert 50 ( 0.1758200228 0.4167796969 ) 50 1 + vert 51 ( 0.1218025759 0.4746256471 ) 51 1 + vert 52 ( 0.5768955946 0.3548163772 ) 52 1 + vert 53 ( 0.6686196923 0.5351630747 ) 53 1 + vert 54 ( 0.6799738407 0.5351630747 ) 54 1 + vert 55 ( 0.3423711061 0.2853721380 ) 55 1 + vert 56 ( 0.6686196327 0.5124548674 ) 56 1 + vert 57 ( 0.5996038318 0.5351630747 ) 57 1 + vert 58 ( 0.5996037722 0.5124548674 ) 58 1 + vert 59 ( 0.1006828696 0.2477870584 ) 59 1 + vert 60 ( 0.5882496834 0.5351630747 ) 60 1 + vert 61 ( 0.4965255260 0.5351630747 ) 61 1 + vert 62 ( 0.5078796744 0.5351630747 ) 62 1 + vert 63 ( 0.5078796148 0.5124548674 ) 63 1 + vert 64 ( 0.4089916945 0.2853720784 ) 64 1 + vert 65 ( 0.0113540990 0.2435528636 ) 65 1 + vert 66 ( 0.6799738407 0.5393971503 ) 66 1 + vert 67 ( 0.6913279295 0.5393971801 ) 67 1 + vert 68 ( 0.6913279891 0.5166889131 ) 68 1 + vert 69 ( 0.0779746622 0.2435529232 ) 69 1 + vert 70 ( 0.8520681858 0.5166889131 ) 70 1 + vert 71 ( 0.8750000000 0.2500000000 ) 71 1 + vert 72 ( 0.2566326857 0.2250787616 ) 72 1 + vert 73 ( 0.7716981173 0.5393971503 ) 73 1 + vert 74 ( 0.7830522060 0.5393971801 ) 74 1 + vert 75 ( 0.7830522656 0.5166889131 ) 75 1 + vert 76 ( 0.1900120974 0.2250788212 ) 76 1 + vert 77 ( 0.7603439093 0.5166889131 ) 77 1 + vert 78 ( 0.7603438497 0.5393971801 ) 78 1 + vert 79 ( 0.7716980577 0.5393971503 ) 79 1 + vert 80 ( 0.5882496834 0.5351630747 ) 80 1 + vert 81 ( 0.1673034430 0.2477869987 ) 81 1 + vert 82 ( 0.5768954754 0.5124548674 ) 82 1 + vert 83 ( 0.5768955350 0.5351630747 ) 83 1 + vert 84 ( 0.6686196923 0.6970356405 ) 84 1 + vert 85 ( 0.3423711360 0.4813070297 ) 85 1 + vert 86 ( 0.3423711061 0.4699528813 ) 86 1 + vert 87 ( 0.5996038318 0.6970356405 ) 87 1 + vert 88 ( 0.1006828621 0.0632063746 ) 88 1 + vert 89 ( 0.1006828621 0.0518521667 ) 89 1 + vert 90 ( 0.4089916348 0.4699529409 ) 90 1 + vert 91 ( 0.4089916646 0.4813070297 ) 91 1 + vert 92 ( 0.5078796744 0.6970356405 ) 92 1 + vert 93 ( 0.0113540990 0.4054253697 ) 93 1 + vert 94 ( 0.6913279295 0.3548164368 ) 94 1 + vert 95 ( 0.0113540990 0.4167795777 ) 95 1 + vert 96 ( 0.0779746622 0.4054254293 ) 96 1 + vert 97 ( 0.0779746622 0.4167795181 ) 97 1 + vert 98 ( 0.8520681858 0.3548164368 ) 98 1 + vert 99 ( 0.2566326857 0.0632063150 ) 99 1 + vert 100 ( 0.7830522656 0.3548164368 ) 100 1 + vert 101 ( 0.2566326857 0.0518521667 ) 101 1 + vert 102 ( 0.1900120974 0.0632063746 ) 102 1 + vert 103 ( 0.1900120974 0.0518521667 ) 103 1 + vert 104 ( 0.7603439093 0.3548164368 ) 104 1 + vert 105 ( 0.1673034281 0.0632063150 ) 105 1 + vert 106 ( 0.5768955350 0.6970356405 ) 106 1 + vert 107 ( 0.1673034281 0.0518521667 ) 107 1 + vert 108 ( 0.4655197561 0.9819033202 ) 108 1 + vert 109 ( 0.0113541409 0.9886458702 ) 109 1 + vert 110 ( 0.1541543454 0.6249296069 ) 110 1 + vert 111 ( 0.4690954387 1.0000000000 ) 111 1 + vert 112 ( 0.5037595034 0.9886458423 ) 112 1 + vert 113 ( 0.4655196667 0.7910139561 ) 113 1 + vert 114 ( 0.2151023746 0.7083897591 ) 114 1 + vert 115 ( 0.1804383993 0.6970356405 ) 115 1 + vert 116 ( 0.1768626571 0.6249295175 ) 116 1 + vert 117 ( 0.2157286257 0.9886458702 ) 117 1 + vert 118 ( 0.5700801611 0.9886458432 ) 118 1 + vert 119 ( 0.6047441959 1.0000000000 ) 119 1 + vert 120 ( 0.0113541521 0.6249295175 ) 120 1 + vert 121 ( 0.4428113401 0.9886458702 ) 121 1 + vert 122 ( 0.6083199978 0.9819033183 ) 122 1 + vert 123 ( 0.3196628690 0.6249296069 ) 123 1 + vert 124 ( 0.3160871267 0.6970356405 ) 124 1 + vert 125 ( 0.2814231217 0.7083897591 ) 125 1 + vert 126 ( 0.6083198786 0.7910138816 ) 126 1 + vert 127 ( 0.2384368479 0.9886458702 ) 127 1 + vert 128 ( 0.4973703027 0.9665126987 ) 128 1 + vert 129 ( 0.5113238692 0.9849906061 ) 129 1 + vert 130 ( 0.5200785995 0.9736364484 ) 130 1 + vert 131 ( 0.5529161692 0.0113541484 ) 131 1 + vert 132 ( 0.5764693618 0.8064045161 ) 132 1 + vert 133 ( 0.5625157356 0.7879266143 ) 133 1 + vert 134 ( 0.2679870129 0.0846714377 ) 134 1 + vert 135 ( 0.5651151538 0.8106349111 ) 135 1 + vert 136 ( 0.5078796148 0.0113541484 ) 136 1 + vert 137 ( 0.5625157952 0.9849906052 ) 137 1 + vert 138 ( 0.5764693618 0.9665126987 ) 138 1 + vert 139 ( 0.5651152134 0.9622823149 ) 139 1 + vert 140 ( 0.4973703623 0.8064045161 ) 140 1 + vert 141 ( 0.9148896933 0.0328192115 ) 141 1 + vert 142 ( 0.9262437820 0.0328192711 ) 142 1 + vert 143 ( 0.5113239288 0.7879266143 ) 143 1 + vert 144 ( 0.5764693618 0.9105099961 ) 144 1 + vert 145 ( 0.5537610650 0.8991558626 ) 145 1 + vert 146 ( 0.9712803960 0.0328193307 ) 146 1 + vert 147 ( 0.9826345444 0.0328193307 ) 147 1 + vert 148 ( 0.4973703027 0.9105100036 ) 148 1 + vert 149 ( 0.9262437820 0.0328193307 ) 149 1 + vert 150 ( 0.5200785995 0.9105100036 ) 150 1 + vert 151 ( 0.5200786591 0.8991558552 ) 151 1 + vert 152 ( 0.4973703027 0.8621021807 ) 152 1 + vert 153 ( 0.5200786591 0.8734562993 ) 153 1 + vert 154 ( 0.5200785995 0.8621021509 ) 154 1 + vert 155 ( 0.9829396009 0.3762816191 ) 155 1 + vert 156 ( 0.5764693618 0.8621021509 ) 156 1 + vert 157 ( 0.9265488386 0.3762816191 ) 157 1 + vert 158 ( 0.9379029274 0.3762816787 ) 158 1 + vert 159 ( 0.5537610054 0.8734562993 ) 159 1 + vert 160 ( 0.5078796148 0.1748891473 ) 160 1 + vert 161 ( 0.5078796148 0.1521807909 ) 161 1 + vert 162 ( 0.4965254664 0.1521808505 ) 162 1 + vert 163 ( 0.4721183777 0.3127338290 ) 163 1 + vert 164 ( 0.5415620208 0.1748891473 ) 164 1 + vert 165 ( 0.8747765422 0.5398166478 ) 165 1 + vert 166 ( 0.5529162288 0.1521808505 ) 166 1 + vert 167 ( 0.5415620804 0.1521809101 ) 167 1 + vert 168 ( 0.5642703176 0.1748891473 ) 168 1 + vert 169 ( 0.9262438416 0.1736459732 ) 169 1 + vert 170 ( 0.9148896933 0.1736459732 ) 170 1 + vert 171 ( 0.9148896337 0.1963542700 ) 171 1 + vert 172 ( 0.5979527235 0.1748891473 ) 172 1 + vert 173 ( 0.2793411314 0.2482064962 ) 173 1 + vert 174 ( 0.2793411613 0.2254981399 ) 174 1 + vert 175 ( 0.2679870129 0.2254981995 ) 175 1 + vert 176 ( 0.4317001402 0.3127338886 ) 176 1 + vert 177 ( 0.9826345444 0.1736460328 ) 177 1 + vert 178 ( 0.9712803364 0.1736460924 ) 178 1 + vert 179 ( 0.9712803960 0.1963543892 ) 179 1 + vert 180 ( 0.9151946902 0.5398166776 ) 180 1 + vert 181 ( 0.9375978708 0.1963543892 ) 181 1 + vert 182 ( 0.9375979304 0.1736460924 ) 182 1 + vert 183 ( 0.9262437820 0.1736460328 ) 183 1 + vert 184 ( 0.8747764826 0.1963542700 ) 184 1 + vert 185 ( 0.9829396009 0.5171083212 ) 185 1 + vert 186 ( 0.9715854526 0.5171083510 ) 186 1 + vert 187 ( 0.9715854526 0.5398166478 ) 187 1 + vert 188 ( 0.3194543123 0.2482064366 ) 188 1 + vert 189 ( 0.9379030466 0.5398166478 ) 189 1 + vert 190 ( 0.9379030466 0.5171083212 ) 190 1 + vert 191 ( 0.9265488386 0.5171083212 ) 191 1 + vert 192 ( 0.5078796148 0.3321082592 ) 192 1 + vert 193 ( 0.4965255260 0.3321081996 ) 193 1 + vert 194 ( 0.4992022514 0.7615630478 ) 194 1 + vert 195 ( 0.5415620804 0.3321082592 ) 195 1 + vert 196 ( 0.4655197263 0.7615630627 ) 196 1 + vert 197 ( 0.5529162288 0.3321081996 ) 197 1 + vert 198 ( 0.5642702579 0.3321082592 ) 198 1 + vert 199 ( 0.9148896933 0.3535734415 ) 199 1 + vert 200 ( 0.5642703176 0.3434623480 ) 200 1 + vert 201 ( 0.5979527831 0.3321082592 ) 201 1 + vert 202 ( 0.5979527831 0.3434623480 ) 202 1 + vert 203 ( 0.2793411613 0.4054255486 ) 203 1 + vert 204 ( 0.9826345444 0.3535733819 ) 204 1 + vert 205 ( 0.9712803960 0.3535733819 ) 205 1 + vert 206 ( 0.4992022216 0.7211448550 ) 206 1 + vert 207 ( 0.9262437820 0.3535733819 ) 207 1 + vert 208 ( 0.4655197263 0.7211449146 ) 208 1 + vert 209 ( 0.9375979304 0.3535733819 ) 209 1 + vert 210 ( 0.8747765422 0.3535733819 ) 210 1 + vert 211 ( 0.9715854526 0.6970356703 ) 211 1 + vert 212 ( 0.8747765422 0.3649275303 ) 212 1 + vert 213 ( 0.3194543123 0.4054255486 ) 213 1 + vert 214 ( 0.3194543123 0.4167796969 ) 214 1 + vert 215 ( 0.9379030466 0.6970357001 ) 215 1 + vert 216 ( 0.8717506528 0.9513412639 ) 216 1 + vert 217 ( 0.8831048012 0.9460025094 ) 217 1 + vert 218 ( 0.3724106550 0.5624975562 ) 218 1 + vert 219 ( 0.8170980215 0.2076858282 ) 219 1 + vert 220 ( 0.8717506528 0.9886458628 ) 220 1 + vert 221 ( 0.8420943022 0.2831348181 ) 221 1 + vert 222 ( 0.4551318288 0.5624975562 ) 222 1 + vert 223 ( 0.8831048012 0.9939846145 ) 223 1 + vert 224 ( 0.8170980215 0.1587125063 ) 224 1 + vert 225 ( 0.8284521103 0.1508482695 ) 225 1 + vert 226 ( 0.3897802234 0.6420434117 ) 226 1 + vert 227 ( 0.5960801840 0.7615630627 ) 227 1 + vert 228 ( 0.8420943022 0.3321081400 ) 228 1 + vert 229 ( 0.5960800648 0.7242584825 ) 229 1 + vert 230 ( 0.4377623200 0.6420434117 ) 230 1 + vert 231 ( 0.8534483314 0.3399725556 ) 231 1 + vert 232 ( 0.8164433241 0.8922467679 ) 232 1 + vert 233 ( 0.7993190289 0.2190399170 ) 233 1 + vert 234 ( 0.8217107058 0.9149550349 ) 234 1 + vert 235 ( 0.8330649137 0.9077588320 ) 235 1 + vert 236 ( 0.7669651508 0.8922467604 ) 236 1 + vert 237 ( 0.7503436804 0.9077588320 ) 237 1 + vert 238 ( 0.8243153691 0.2831348777 ) 238 1 + vert 239 ( 0.7730519176 0.9036009014 ) 239 1 + vert 240 ( 0.8330648541 0.9711245559 ) 240 1 + vert 241 ( 0.8217107058 0.9639283530 ) 241 1 + vert 242 ( 0.5783011913 0.7615630776 ) 242 1 + vert 243 ( 0.8164434433 0.9866366293 ) 243 1 + vert 244 ( 0.7503436804 0.9711245559 ) 244 1 + vert 245 ( 0.7669650912 0.9866366293 ) 245 1 + vert 246 ( 0.5783011317 0.7242584825 ) 246 1 + vert 247 ( 0.7616977692 0.9639283493 ) 247 1 + vert 248 ( 0.6196740270 0.9886458712 ) 248 1 + vert 249 ( 0.8181428909 0.8902375251 ) 249 1 + vert 250 ( 0.8312636614 0.9098883271 ) 250 1 + vert 251 ( 0.8426177502 0.8902375326 ) 251 1 + vert 252 ( 0.7407905459 0.8642233163 ) 252 1 + vert 253 ( 0.7294365764 0.8642233014 ) 253 1 + vert 254 ( 0.7521448731 0.9098883271 ) 254 1 + vert 255 ( 0.7652655840 0.8902375326 ) 255 1 + vert 256 ( 0.6093068719 0.3321083784 ) 256 1 + vert 257 ( 0.8312636018 0.9689950645 ) 257 1 + vert 258 ( 0.8181428909 0.9886458609 ) 258 1 + vert 259 ( 0.6206609607 0.3321083188 ) 259 1 + vert 260 ( 0.7111338973 0.3321083188 ) 260 1 + vert 261 ( 0.7521448731 1.0000000000 ) 261 1 + vert 262 ( 0.7652655840 0.9886458609 ) 262 1 + vert 263 ( 0.7521449327 0.9689950645 ) 263 1 + vert 264 ( 0.6196740270 0.8869315833 ) 264 1 + vert 265 ( 0.6310282350 0.8869315758 ) 265 1 + vert 266 ( 0.7521449327 0.7658150196 ) 266 1 + vert 267 ( 0.7407906055 0.7625090182 ) 267 1 + vert 268 ( 0.8312637210 0.7658150196 ) 268 1 + vert 269 ( 0.7294364572 0.7625090480 ) 269 1 + vert 270 ( 0.6093068719 0.2303940654 ) 270 1 + vert 271 ( 0.6206610203 0.2303940654 ) 271 1 + vert 272 ( 0.7521448731 0.8642233759 ) 272 1 + vert 273 ( 0.7111338973 0.2303940058 ) 273 1 + vert 274 ( 0.8312635422 0.8642233759 ) 274 1 + vert 275 ( 0.6997797489 0.2303940654 ) 275 1 + vert 276 ( 0.4541654587 0.7538222075 ) 276 1 + vert 277 ( 0.4541654587 0.7197439075 ) 277 1 + vert 278 ( 0.4428113401 0.7083897591 ) 278 1 + vert 279 ( 0.3524481654 0.6970357299 ) 279 1 + vert 280 ( 0.4172250032 0.7083897591 ) 280 1 + vert 281 ( 0.4428113401 0.7083897591 ) 281 1 + vert 282 ( 0.2270827293 0.7538221925 ) 282 1 + vert 283 ( 0.2640231848 0.7083897591 ) 283 1 + vert 284 ( 0.2384368777 0.7083897591 ) 284 1 + vert 285 ( 0.3524481356 0.4926613569 ) 285 1 + vert 286 ( 0.0000000000 0.7538221925 ) 286 1 + vert 287 ( 0.0369404592 0.7083897591 ) 287 1 + vert 288 ( 0.0113541391 0.7083897591 ) 288 1 + vert 289 ( 0.4750943482 0.6970357299 ) 289 1 + vert 290 ( 0.2270827442 0.7538222075 ) 290 1 + vert 291 ( 0.2270827293 0.7197439075 ) 291 1 + vert 292 ( 0.2157285959 0.7083897591 ) 292 1 + vert 293 ( 0.4750943780 0.4926611781 ) 293 1 + vert 294 ( 0.2157285959 0.7083897591 ) 294 1 + vert 295 ( 0.6799738407 0.3548163772 ) 295 1 + vert 296 ( 0.6799738407 0.3434622288 ) 296 1 + vert 297 ( 0.3325617015 0.1163794994 ) 297 1 + vert 298 ( 0.6713390946 0.3434622288 ) 298 1 + vert 299 ( 0.5968844891 0.3434622288 ) 299 1 + vert 300 ( 0.5882496834 0.3434622288 ) 300 1 + vert 301 ( 0.1399705112 0.5737641156 ) 301 1 + vert 302 ( 0.5882496834 0.3548163772 ) 302 1 + vert 303 ( 0.4965254962 0.3548163772 ) 303 1 + vert 304 ( 0.5033392906 0.3434622288 ) 304 1 + vert 305 ( 0.2024006844 0.5753087997 ) 305 1 + vert 306 ( 0.0113541000 0.0632060766 ) 306 1 + vert 307 ( 0.6799738407 0.6970356703 ) 307 1 + vert 308 ( 0.2019880414 0.5767972767 ) 308 1 + vert 309 ( 0.2137548327 0.5753087997 ) 309 1 + vert 310 ( 0.2024006248 0.4859797955 ) 310 1 + vert 311 ( 0.0893287659 0.0575290918 ) 311 1 + vert 312 ( 0.8634223938 0.7027127445 ) 312 1 + vert 313 ( 0.1991951317 0.4799671173 ) 313 1 + vert 314 ( 0.2941248417 0.4973339438 ) 314 1 + vert 315 ( 0.2566326857 0.4054255486 ) 315 1 + vert 316 ( 0.2973303199 0.4799671173 ) 316 1 + vert 317 ( 0.2941249013 0.5753087997 ) 317 1 + vert 318 ( 0.1900121123 0.4054255486 ) 318 1 + vert 319 ( 0.2941249013 0.5639546812 ) 319 1 + vert 320 ( 0.2945375144 0.5767972767 ) 320 1 + vert 321 ( 0.5882496834 0.3548163772 ) 321 1 + vert 322 ( 0.5882496834 0.3434622288 ) 322 1 + vert 323 ( 0.1399704814 0.4888172746 ) 323 1 + vert 324 ( 0.6686197519 0.5238089561 ) 324 1 + vert 325 ( 0.6799738407 0.5238089561 ) 325 1 + vert 326 ( 0.3423711061 0.3080803156 ) 326 1 + vert 327 ( 0.5996037722 0.5238089561 ) 327 1 + vert 328 ( 0.5882496834 0.5124548376 ) 328 1 + vert 329 ( 0.5882496834 0.5238089561 ) 329 1 + vert 330 ( 0.1006828547 0.2250788212 ) 330 1 + vert 331 ( 0.4965255260 0.5238089561 ) 331 1 + vert 332 ( 0.4089916348 0.3080803752 ) 332 1 + vert 333 ( 0.5078796148 0.5238089561 ) 333 1 + vert 334 ( 0.6799738407 0.5166888833 ) 334 1 + vert 335 ( 0.6799738407 0.5280430317 ) 335 1 + vert 336 ( 0.0113541000 0.2208446264 ) 336 1 + vert 337 ( 0.6913279891 0.5280430317 ) 337 1 + vert 338 ( 0.8634223342 0.5166889131 ) 338 1 + vert 339 ( 0.8634223342 0.5280430317 ) 339 1 + vert 340 ( 0.0893287659 0.2265216708 ) 340 1 + vert 341 ( 0.8634223342 0.5337201059 ) 341 1 + vert 342 ( 0.7716981173 0.5166888833 ) 342 1 + vert 343 ( 0.7716981173 0.5280430317 ) 343 1 + vert 344 ( 0.2566326857 0.2477869987 ) 344 1 + vert 345 ( 0.7830522656 0.5280430317 ) 345 1 + vert 346 ( 0.7716980577 0.5166889131 ) 346 1 + vert 347 ( 0.7603439093 0.5280430317 ) 347 1 + vert 348 ( 0.5882496834 0.5238089561 ) 348 1 + vert 349 ( 0.1673034132 0.2250787616 ) 349 1 + vert 350 ( 0.5768955350 0.5238089561 ) 350 1 + vert 351 ( 0.6686197519 0.7083897591 ) 351 1 + vert 352 ( 0.7766107321 0.2076857090 ) 352 1 + vert 353 ( 0.5882496834 0.6970356405 ) 353 1 + vert 354 ( 0.5996037722 0.7083897591 ) 354 1 + vert 355 ( 0.7766107917 0.1386697888 ) 355 1 + vert 356 ( 0.4965255260 0.6970356405 ) 356 1 + vert 357 ( 0.5078796148 0.7083897591 ) 357 1 + vert 358 ( 0.7099901438 0.2076856494 ) 358 1 + vert 359 ( 0.6799738407 0.3548164964 ) 359 1 + vert 360 ( 0.6913279891 0.3434623480 ) 360 1 + vert 361 ( 0.6872814894 0.2076857090 ) 361 1 + vert 362 ( 0.8634223342 0.3548164368 ) 362 1 + vert 363 ( 0.8520681858 0.3434623480 ) 363 1 + vert 364 ( 0.6206609011 0.2076856494 ) 364 1 + vert 365 ( 0.7716981173 0.3548164964 ) 365 1 + vert 366 ( 0.7830522656 0.3434623480 ) 366 1 + vert 367 ( 0.6206608415 0.1386698484 ) 367 1 + vert 368 ( 0.7716980577 0.3548164368 ) 368 1 + vert 369 ( 0.5882496834 0.6970356405 ) 369 1 + vert 370 ( 0.0180966761 1.0000000000 ) 370 1 + vert 371 ( 0.0000000000 0.9165397808 ) 371 1 + vert 372 ( 0.0000000000 0.9886458581 ) 372 1 + vert 373 ( 0.1505786180 0.6970356405 ) 373 1 + vert 374 ( 0.2089861035 1.0000000000 ) 374 1 + vert 375 ( 0.2157286406 1.0000000000 ) 375 1 + vert 376 ( 0.5037594438 0.7842713892 ) 376 1 + vert 377 ( 0.2270827889 0.9886458693 ) 377 1 + vert 378 ( 0.4428113997 1.0000000000 ) 378 1 + vert 379 ( 0.4541655481 0.9886458693 ) 379 1 + vert 380 ( 0.0149298850 0.6970356405 ) 380 1 + vert 381 ( 0.4360688329 1.0000000000 ) 381 1 + vert 382 ( 0.2270827293 0.9165397808 ) 382 1 + vert 383 ( 0.2270827293 0.9886458581 ) 383 1 + vert 384 ( 0.2384368777 1.0000000000 ) 384 1 + vert 385 ( 0.5700801611 0.7842713892 ) 385 1 + vert 386 ( 0.5063839555 0.9747674149 ) 386 1 + vert 387 ( 0.5087244511 0.9736364484 ) 387 1 + vert 388 ( 0.5415619612 0.0113542080 ) 388 1 + vert 389 ( 0.5087244511 0.9622823149 ) 389 1 + vert 390 ( 0.8747766018 0.3762815595 ) 390 1 + vert 391 ( 0.5715293288 0.7961813509 ) 391 1 + vert 392 ( 0.5537610054 0.7992807627 ) 392 1 + vert 393 ( 0.5979526639 0.0113542080 ) 393 1 + vert 394 ( 0.5651151538 0.7992807627 ) 394 1 + vert 395 ( 0.2793411613 0.0846714973 ) 395 1 + vert 396 ( 0.5537610650 0.9736364484 ) 396 1 + vert 397 ( 0.5715293884 0.9767358638 ) 397 1 + vert 398 ( 0.5651152134 0.9736364484 ) 398 1 + vert 399 ( 0.4721183479 0.1491987705 ) 399 1 + vert 400 ( 0.4965254366 0.0113541484 ) 400 1 + vert 401 ( 0.5087244511 0.8106349111 ) 401 1 + vert 402 ( 0.5087244511 0.7992807627 ) 402 1 + vert 403 ( 0.5642702579 0.0113541484 ) 403 1 + vert 404 ( 0.5200785995 0.7992807627 ) 404 1 + vert 405 ( 0.5063839555 0.7981497943 ) 405 1 + vert 406 ( 0.5651152134 0.9105100036 ) 406 1 + vert 407 ( 0.5537610650 0.9105100036 ) 407 1 + vert 408 ( 0.5651152134 0.9105100036 ) 408 1 + vert 409 ( 0.4317001402 0.1491986513 ) 409 1 + vert 410 ( 0.5651152134 0.9218641371 ) 410 1 + vert 411 ( 0.5087244511 0.9218641371 ) 411 1 + vert 412 ( 0.9151947498 0.3762814999 ) 412 1 + vert 413 ( 0.5087244511 0.9105100036 ) 413 1 + vert 414 ( 0.9375978708 0.0328193307 ) 414 1 + vert 415 ( 0.5087244511 0.8991558626 ) 415 1 + vert 416 ( 0.5087244511 0.8734562993 ) 416 1 + vert 417 ( 0.5087244511 0.8621021509 ) 417 1 + vert 418 ( 0.9715853930 0.3762816787 ) 418 1 + vert 419 ( 0.5087244511 0.8507480174 ) 419 1 + vert 420 ( 0.8747765422 0.0328192711 ) 420 1 + vert 421 ( 0.5651151538 0.8621021509 ) 421 1 + vert 422 ( 0.5651151538 0.8621021509 ) 422 1 + vert 423 ( 0.3194543421 0.0846713781 ) 423 1 + vert 424 ( 0.5651151538 0.8507480323 ) 424 1 + vert 425 ( 0.5078796148 0.1635349989 ) 425 1 + vert 426 ( 0.4965254962 0.1635349989 ) 426 1 + vert 427 ( 0.4721183479 0.2900254726 ) 427 1 + vert 428 ( 0.4965254962 0.1748891473 ) 428 1 + vert 429 ( 0.5529162884 0.1748891473 ) 429 1 + vert 430 ( 0.5529162288 0.1635349989 ) 430 1 + vert 431 ( 0.8747766018 0.5171083212 ) 431 1 + vert 432 ( 0.5415620804 0.1635349989 ) 432 1 + vert 433 ( 0.9262438416 0.1963542700 ) 433 1 + vert 434 ( 0.9262437820 0.1850001216 ) 434 1 + vert 435 ( 0.5642703176 0.1521807909 ) 435 1 + vert 436 ( 0.9148896337 0.1850001812 ) 436 1 + vert 437 ( 0.2679870129 0.2482064962 ) 437 1 + vert 438 ( 0.2793411613 0.2368523479 ) 438 1 + vert 439 ( 0.9826345444 0.1963543296 ) 439 1 + vert 440 ( 0.9826345444 0.1850001812 ) 440 1 + vert 441 ( 0.4317001402 0.2900255322 ) 441 1 + vert 442 ( 0.9712803960 0.1850001812 ) 442 1 + vert 443 ( 0.9262438416 0.1963543296 ) 443 1 + vert 444 ( 0.9375978708 0.1850001812 ) 444 1 + vert 445 ( 0.9829396009 0.5398166180 ) 445 1 + vert 446 ( 0.9829396009 0.5284624696 ) 446 1 + vert 447 ( 0.8747766018 0.1736459732 ) 447 1 + vert 448 ( 0.9715854526 0.5284624696 ) 448 1 + vert 449 ( 0.9265487790 0.5398166180 ) 449 1 + vert 450 ( 0.9379029870 0.5284624696 ) 450 1 + vert 451 ( 0.4992021918 0.7729172111 ) 451 1 + vert 452 ( 0.5105563402 0.7615630627 ) 452 1 + vert 453 ( 0.4721183479 0.4699529409 ) 453 1 + vert 454 ( 0.4655197263 0.7729172111 ) 454 1 + vert 455 ( 0.4541656077 0.7615630925 ) 455 1 + vert 456 ( 0.8747765422 0.6970357299 ) 456 1 + vert 457 ( 0.9262437820 0.3535734415 ) 457 1 + vert 458 ( 0.9148896933 0.3649275303 ) 458 1 + vert 459 ( 0.5219103694 0.7214499116 ) 459 1 + vert 460 ( 0.2679870129 0.4054255486 ) 460 1 + vert 461 ( 0.2793411613 0.4167796969 ) 461 1 + vert 462 ( 0.5555927753 0.7214499414 ) 462 1 + vert 463 ( 0.5105563402 0.7211448550 ) 463 1 + vert 464 ( 0.4317001402 0.4699529409 ) 464 1 + vert 465 ( 0.4992021918 0.7097907066 ) 465 1 + vert 466 ( 0.4541656077 0.7211449146 ) 466 1 + vert 467 ( 0.9151947498 0.6970357001 ) 467 1 + vert 468 ( 0.9829396009 0.6970356703 ) 468 1 + vert 469 ( 0.9715854526 0.7083898187 ) 469 1 + vert 470 ( 0.5219104290 0.7615630627 ) 470 1 + vert 471 ( 0.9265488982 0.6970357299 ) 471 1 + vert 472 ( 0.8170979023 0.2190399766 ) 472 1 + vert 473 ( 0.8284521103 0.2190399766 ) 473 1 + vert 474 ( 0.3897802234 0.5476535261 ) 474 1 + vert 475 ( 0.8284521103 0.2155501842 ) 475 1 + vert 476 ( 0.8420942426 0.2717807293 ) 476 1 + vert 477 ( 0.8534483910 0.2752705812 ) 477 1 + vert 478 ( 0.5960801244 0.7729172111 ) 478 1 + vert 479 ( 0.6074342728 0.7729172111 ) 479 1 + vert 480 ( 0.3724106550 0.6271994710 ) 480 1 + vert 481 ( 0.6074342728 0.7669018358 ) 481 1 + vert 482 ( 0.5960801244 0.7129043341 ) 482 1 + vert 483 ( 0.6074342728 0.7189197242 ) 483 1 + vert 484 ( 0.8103566170 0.9036009014 ) 484 1 + vert 485 ( 0.8539717197 0.9513412639 ) 485 1 + vert 486 ( 0.8217107058 0.9036009014 ) 486 1 + vert 487 ( 0.7993190289 0.2076857686 ) 487 1 + vert 488 ( 0.8243958950 0.9004262984 ) 488 1 + vert 489 ( 0.7582961321 0.8995793015 ) 489 1 + vert 490 ( 0.7616977692 0.9149550349 ) 490 1 + vert 491 ( 0.5669469833 0.7729172111 ) 491 1 + vert 492 ( 0.5669469833 0.7676499188 ) 492 1 + vert 493 ( 0.5669469833 0.7129043341 ) 493 1 + vert 494 ( 0.8312636018 0.8788833991 ) 494 1 + vert 495 ( 0.8016068935 0.3321083188 ) 495 1 + vert 496 ( 0.8225947022 0.9025558010 ) 496 1 + vert 497 ( 0.8370193243 0.8855021596 ) 497 1 + vert 498 ( 0.6310282350 0.9886458647 ) 498 1 + vert 499 ( 0.7455260754 0.8844818100 ) 499 1 + vert 500 ( 0.7224881649 0.3321083188 ) 500 1 + vert 501 ( 0.7521448731 0.8788833916 ) 501 1 + vert 502 ( 0.7407907248 0.8902375251 ) 502 1 + vert 503 ( 0.7565966845 0.8975700662 ) 503 1 + vert 504 ( 0.8370193839 0.9933812311 ) 504 1 + vert 505 ( 0.7294365764 0.9886458647 ) 505 1 + vert 506 ( 0.8426177502 0.9886458628 ) 506 1 + vert 507 ( 0.8225947022 0.9763275962 ) 507 1 + vert 508 ( 0.8312636018 1.0000000000 ) 508 1 + vert 509 ( 0.7407907248 0.9886458591 ) 509 1 + vert 510 ( 0.6310282350 0.8642233014 ) 510 1 + vert 511 ( 0.7455261350 0.9944015788 ) 511 1 + vert 512 ( 0.6997798085 0.3321083188 ) 512 1 + vert 513 ( 0.7565966845 0.9813133236 ) 513 1 + vert 514 ( 0.7521448731 0.7544609010 ) 514 1 + vert 515 ( 0.8016068935 0.2303940654 ) 515 1 + vert 516 ( 0.7407907248 0.7658150494 ) 516 1 + vert 517 ( 0.8312636614 0.7544608861 ) 517 1 + vert 518 ( 0.7224881649 0.2303940654 ) 518 1 + vert 519 ( 0.8426177502 0.7658150494 ) 519 1 + vert 520 ( 0.7407907248 0.8642233759 ) 520 1 + vert 521 ( 0.7294364572 0.8869315907 ) 521 1 + vert 522 ( 0.7521449327 0.8755775094 ) 522 1 + vert 523 ( 0.8426177502 0.8642233759 ) 523 1 + vert 524 ( 0.6310282350 0.7625090182 ) 524 1 + vert 525 ( 0.2270827442 0.7197438776 ) 525 1 + vert 526 ( 0.0000000000 0.7197438776 ) 526 1 + vert 527 ( 0.1901422739 0.7083897591 ) 527 1 + vert 528 ( 0.4851714075 0.5182475150 ) 528 1 + vert 529 ( 0.4965254962 0.3434622288 ) 529 1 + vert 530 ( 0.4175082445 0.1163794994 ) 530 1 + vert 531 ( 0.2941248417 0.4859797955 ) 531 1 + vert 532 ( 0.7830522656 0.6970356703 ) 532 1 + vert 533 ( 0.2827707529 0.5753088295 ) 533 1 + vert 534 ( 0.5814359188 0.3434622288 ) 534 1 + vert 535 ( 0.6799738407 0.5124548376 ) 535 1 + vert 536 ( 0.4965255260 0.5124548376 ) 536 1 + vert 537 ( 0.7716980577 0.5280430317 ) 537 1 + vert 538 ( 0.1900121123 0.2477870584 ) 538 1 + vert 539 ( 0.5882496834 0.5124548376 ) 539 1 + vert 540 ( 0.6799738407 0.6970356405 ) 540 1 + vert 541 ( 0.7603439093 0.3434623480 ) 541 1 + vert 542 ( 0.6872815490 0.1386697888 ) 542 1 + vert 543 ( 0.5768955350 0.7083897591 ) 543 1 + vert 544 ( 0.7099900842 0.1386698484 ) 544 1 + vert 545 ( 0.0113541419 1.0000000000 ) 545 1 + vert 546 ( 0.2270827740 0.9165397361 ) 546 1 + vert 547 ( 0.4541655183 0.9165397361 ) 547 1 + vert 548 ( 0.2451793849 1.0000000000 ) 548 1 + vert 549 ( 0.5537610054 0.8621021509 ) 549 1 + vert 550 ( 0.2679870129 0.2368523479 ) 550 1 + vert 551 ( 0.5979527235 0.1521809101 ) 551 1 + vert 552 ( 0.9262437820 0.1850001812 ) 552 1 + vert 553 ( 0.9151947498 0.5171083510 ) 553 1 + vert 554 ( 0.9265488386 0.5284624696 ) 554 1 + vert 555 ( 0.3194543123 0.2254981995 ) 555 1 + vert 556 ( 0.4655197561 0.7097907662 ) 556 1 + vert 557 ( 0.9379030466 0.7083898485 ) 557 1 + vert 558 ( 0.5555928946 0.7615630627 ) 558 1 + vert 559 ( 0.8534483910 0.2717807293 ) 559 1 + vert 560 ( 0.4377623200 0.5476535559 ) 560 1 + vert 561 ( 0.6074342728 0.7129043341 ) 561 1 + vert 562 ( 0.4551318288 0.6271994412 ) 562 1 + vert 563 ( 0.7616977692 0.9036009014 ) 563 1 + vert 564 ( 0.8539717197 0.9886458637 ) 564 1 + vert 565 ( 0.8243153095 0.2717807293 ) 565 1 + vert 566 ( 0.5783011913 0.7729172111 ) 566 1 + vert 567 ( 0.7993190289 0.1587125063 ) 567 1 + vert 568 ( 0.5669469833 0.7181716263 ) 568 1 + vert 569 ( 0.5783011913 0.7129043341 ) 569 1 + vert 570 ( 0.8243153691 0.3321081400 ) 570 1 + vert 571 ( 0.8312636018 0.8755775094 ) 571 1 + vert 572 ( 0.4541654587 0.7538222075 ) 572 1 + vert 573 ( 0.4172250032 0.7083897591 ) 573 1 + vert 574 ( 0.2270827442 0.7538222075 ) 574 1 + vert 575 ( 0.2024006248 0.4859797955 ) 575 1 + numtris 546 + tri 0 11 43 18 + tri 1 9 218 5 + tri 2 14 562 528 + tri 3 279 226 289 + tri 4 30 64 23 + tri 5 311 340 306 + tri 6 380 25 373 + tri 7 532 74 312 + tri 8 110 301 12 + tri 9 293 560 285 + tri 10 121 127 6 + tri 11 117 109 21 + tri 12 22 56 26 + tri 13 83 106 62 + tri 14 75 100 70 + tri 15 0 1 38 + tri 16 53 84 57 + tri 17 29 59 49 + tri 18 115 36 124 + tri 19 52 82 31 + tri 20 37 67 46 + tri 21 148 108 113 + tri 22 542 361 367 + tri 23 68 94 77 + tri 24 332 90 326 + tri 25 69 96 65 + tri 26 76 102 72 + tri 27 355 352 544 + tri 28 330 88 349 + tri 29 143 376 133 + tri 30 122 138 144 + tri 31 118 112 137 + tri 32 418 186 158 + tri 33 388 167 136 + tri 34 164 195 160 + tri 35 163 453 176 + tri 36 180 467 165 + tri 37 412 553 390 + tri 38 393 551 403 + tri 39 141 170 420 + tri 40 399 427 409 + tri 41 153 159 151 + tri 42 423 555 395 + tri 43 558 470 462 + tri 44 220 564 216 + tri 45 196 208 194 + tri 46 188 213 173 + tri 47 172 201 168 + tri 48 171 199 184 + tri 49 179 205 181 + tri 50 187 211 189 + tri 51 236 255 232 + tri 52 40 35 17 + tri 53 123 48 7 + tri 54 16 51 3 + tri 55 243 258 245 + tri 56 228 570 221 + tri 57 227 242 229 + tri 58 219 487 224 + tri 59 272 266 274 + tri 60 235 250 240 + tri 61 500 518 495 + tri 62 244 263 237 + tri 63 510 524 253 + tri 64 259 271 512 + tri 65 498 265 505 + tri 66 146 178 414 + tri 67 318 538 315 + tri 68 281 280 278 + tri 69 525 284 8 + tri 70 526 288 13 + tri 71 294 527 292 + tri 72 298 296 22 + tri 73 302 300 26 + tri 74 303 529 31 + tri 75 305 309 308 + tri 76 40 313 575 + tri 77 314 531 42 + tri 78 317 320 533 + tri 79 321 52 322 + tri 80 324 56 325 + tri 81 327 329 58 + tri 82 331 536 333 + tri 83 334 68 335 + tri 84 339 70 338 + tri 85 342 75 343 + tri 86 346 537 77 + tri 87 348 350 539 + tri 88 540 351 84 + tri 89 354 353 87 + tri 90 92 357 356 + tri 91 360 94 359 + tri 92 98 363 362 + tri 93 366 100 365 + tri 94 104 541 368 + tri 95 543 106 369 + tri 96 372 371 109 + tri 97 117 546 377 + tri 98 381 121 379 + tri 99 127 548 383 + tri 100 128 389 386 + tri 101 391 394 133 + tri 102 396 398 137 + tri 103 140 405 401 + tri 104 408 407 406 + tri 105 415 413 148 + tri 106 419 417 152 + tri 107 159 549 421 + tri 108 160 428 425 + tri 109 164 432 429 + tri 110 433 171 434 + tri 111 437 550 173 + tri 112 439 179 440 + tri 113 443 552 181 + tri 114 445 187 446 + tri 115 449 554 189 + tri 116 194 452 451 + tri 117 455 196 454 + tri 118 458 199 457 + tri 119 203 461 460 + tri 120 206 465 463 + tri 121 556 208 466 + tri 122 469 211 468 + tri 123 215 557 471 + tri 124 219 475 472 + tri 125 559 477 476 + tri 126 478 227 479 + tri 127 482 561 229 + tri 128 232 488 484 + tri 129 489 563 237 + tri 130 492 242 491 + tri 131 569 246 493 + tri 132 494 497 249 + tri 133 499 503 502 + tri 134 508 258 504 + tri 135 263 513 509 + tri 136 266 516 514 + tri 137 519 268 517 + tri 138 272 522 520 + tri 139 571 274 523 + tri 140 370 109 374 + tri 141 118 119 112 + tri 142 572 547 6 + tri 143 117 21 546 + tri 144 282 8 382 + tri 145 286 13 371 + tri 146 10 11 19 + tri 147 573 6 283 + tri 148 114 115 125 + tri 149 20 21 287 + tri 150 15 16 4 + tri 151 548 127 381 + tri 152 298 22 299 + tri 153 30 23 530 + tri 154 35 40 34 + tri 155 314 42 319 + tri 156 49 50 29 + tri 157 43 44 39 + tri 158 36 309 47 + tri 159 52 31 534 + tri 160 373 27 110 + tri 161 24 25 120 + tri 162 3 32 2 + tri 163 323 51 12 + tri 164 124 47 123 + tri 165 35 36 116 + tri 166 18 39 17 + tri 167 42 43 7 + tri 168 56 53 58 + tri 169 64 332 55 + tri 170 65 336 69 + tri 171 72 344 76 + tri 172 349 81 330 + tri 173 75 70 74 + tri 174 67 68 78 + tri 175 82 83 63 + tri 176 302 26 328 + tri 177 535 56 295 + tri 178 303 31 536 + tri 179 539 82 321 + tri 180 73 74 41 + tri 181 78 79 46 + tri 182 66 67 307 + tri 183 84 351 87 + tri 184 90 91 86 + tri 185 95 93 97 + tri 186 101 99 103 + tri 187 107 105 89 + tri 188 100 366 98 + tri 189 94 360 104 + tri 190 106 543 92 + tri 191 346 77 368 + tri 192 359 94 334 + tri 193 83 80 106 + tri 194 87 353 57 + tri 195 98 362 70 + tri 196 540 84 54 + tri 197 61 62 356 + tri 198 365 100 342 + tri 199 113 376 140 + tri 200 108 128 112 + tri 201 133 385 132 + tri 202 137 129 396 + tri 203 143 133 404 + tri 204 122 118 138 + tri 205 139 410 138 + tri 206 389 128 411 + tri 207 145 407 151 + tri 208 152 140 419 + tri 209 156 424 132 + tri 210 549 159 154 + tri 211 160 161 164 + tri 212 168 435 172 + tri 213 427 163 441 + tri 214 165 431 180 + tri 215 178 179 182 + tri 216 184 447 171 + tri 217 555 188 174 + tri 218 189 190 187 + tri 219 157 158 191 + tri 220 185 186 155 + tri 221 149 414 183 + tri 222 177 178 147 + tri 223 400 136 162 + tri 224 166 167 131 + tri 225 134 395 175 + tri 226 169 170 142 + tri 227 194 451 196 + tri 228 200 198 202 + tri 229 452 194 463 + tri 230 196 455 208 + tri 231 465 206 556 + tri 232 212 210 458 + tri 233 213 214 203 + tri 234 557 215 469 + tri 235 179 439 205 + tri 236 192 193 160 + tri 237 197 195 429 + tri 238 449 189 471 + tri 239 468 211 445 + tri 240 457 199 433 + tri 241 209 207 181 + tri 242 203 460 173 + tri 243 216 217 220 + tri 244 224 225 219 + tri 245 221 477 228 + tri 246 229 483 227 + tri 247 285 474 9 + tri 248 222 560 528 + tri 249 562 14 230 + tri 250 279 5 226 + tri 251 232 484 236 + tri 252 240 241 235 + tri 253 237 490 244 + tri 254 568 246 492 + tri 255 482 229 569 + tri 256 566 242 478 + tri 257 233 487 472 + tri 258 476 221 565 + tri 259 494 249 501 + tri 260 506 257 251 + tri 261 502 254 509 + tri 262 261 262 508 + tri 263 237 254 236 + tri 264 263 244 262 + tri 265 232 249 235 + tri 266 258 243 257 + tri 267 266 514 268 + tri 268 272 520 266 + tri 269 268 519 274 + tri 270 274 571 272 + tri 271 260 512 273 + tri 272 270 271 256 + tri 273 264 265 248 + tri 274 252 253 267 + tri 275 144 145 156 + tri 276 152 153 148 + tri 277 33 24 2 + tri 278 43 39 18 + tri 279 218 480 5 + tri 280 562 222 528 + tri 281 226 230 289 + tri 282 64 55 23 + tri 283 340 336 306 + tri 284 25 27 373 + tri 285 74 341 312 + tri 286 301 323 12 + tri 287 560 474 285 + tri 288 127 8 6 + tri 289 109 13 21 + tri 290 56 58 26 + tri 291 106 92 62 + tri 292 100 98 70 + tri 293 1 71 38 + tri 294 84 87 57 + tri 295 59 81 49 + tri 296 36 47 124 + tri 297 82 63 31 + tri 298 67 78 46 + tri 299 108 148 128 + tri 300 113 152 148 + tri 301 113 140 152 + tri 302 361 364 367 + tri 303 94 104 77 + tri 304 90 86 326 + tri 305 96 93 65 + tri 306 102 99 72 + tri 307 352 358 544 + tri 308 88 105 349 + tri 309 376 385 133 + tri 310 144 126 122 + tri 311 156 132 126 + tri 312 126 144 156 + tri 313 112 129 137 + tri 314 186 190 158 + tri 315 167 161 136 + tri 316 195 192 160 + tri 317 453 464 176 + tri 318 467 456 165 + tri 319 553 431 390 + tri 320 551 435 403 + tri 321 170 447 420 + tri 322 427 441 409 + tri 323 159 145 151 + tri 324 555 174 395 + tri 325 470 459 462 + tri 326 564 485 216 + tri 327 208 206 194 + tri 328 213 203 173 + tri 329 201 198 168 + tri 330 199 210 184 + tri 331 205 209 181 + tri 332 211 215 189 + tri 333 255 249 232 + tri 334 35 116 17 + tri 335 48 42 7 + tri 336 51 32 3 + tri 337 258 262 245 + tri 338 570 238 221 + tri 339 242 246 229 + tri 340 487 567 224 + tri 341 266 268 274 + tri 342 250 257 240 + tri 343 518 515 495 + tri 344 263 254 237 + tri 345 524 269 253 + tri 346 271 275 512 + tri 347 265 521 505 + tri 348 178 182 414 + tri 349 538 344 315 + tri 350 277 276 281 + tri 351 281 278 277 + tri 352 8 282 525 + tri 353 284 283 8 + tri 354 13 286 526 + tri 355 288 287 13 + tri 356 291 290 294 + tri 357 294 292 291 + tri 358 296 295 22 + tri 359 300 299 26 + tri 360 529 304 31 + tri 361 309 36 308 + tri 362 531 316 42 + tri 363 320 47 533 + tri 364 52 534 322 + tri 365 56 535 325 + tri 366 329 328 58 + tri 367 536 63 333 + tri 368 68 337 335 + tri 369 75 345 343 + tri 370 537 347 77 + tri 371 350 82 539 + tri 372 372 370 545 + tri 373 372 109 370 + tri 374 377 374 117 + tri 375 377 375 374 + tri 376 379 378 381 + tri 377 121 547 379 + tri 378 383 382 127 + tri 379 548 384 383 + tri 380 389 387 386 + tri 381 394 392 133 + tri 382 398 397 137 + tri 383 405 402 401 + tri 384 407 145 406 + tri 385 413 411 148 + tri 386 417 416 152 + tri 387 549 422 421 + tri 388 428 426 425 + tri 389 432 430 429 + tri 390 171 436 434 + tri 391 550 438 173 + tri 392 179 442 440 + tri 393 552 444 181 + tri 394 187 448 446 + tri 395 554 450 189 + tri 396 475 473 472 + tri 397 477 221 476 + tri 398 227 481 479 + tri 399 561 483 229 + tri 400 488 486 484 + tri 401 563 490 237 + tri 402 242 566 491 + tri 403 246 568 493 + tri 404 497 496 249 + tri 405 503 254 502 + tri 406 258 507 504 + tri 407 513 511 509 + tri 408 109 117 374 + tri 409 119 111 112 + tri 410 547 121 6 + tri 411 21 574 546 + tri 412 8 127 382 + tri 413 13 109 371 + tri 414 11 18 19 + tri 415 6 8 283 + tri 416 115 124 125 + tri 417 21 13 287 + tri 418 16 3 4 + tri 419 127 121 381 + tri 420 22 26 299 + tri 421 23 297 530 + tri 422 40 575 34 + tri 423 42 48 319 + tri 424 50 28 29 + tri 425 44 310 39 + tri 426 309 533 47 + tri 427 31 304 534 + tri 428 27 301 110 + tri 429 25 380 120 + tri 430 32 33 2 + tri 431 51 16 12 + tri 432 47 48 123 + tri 433 36 115 116 + tri 434 39 40 17 + tri 435 43 11 7 + tri 436 53 57 58 + tri 437 332 326 55 + tri 438 336 340 69 + tri 439 344 538 76 + tri 440 81 59 330 + tri 441 70 341 74 + tri 442 68 77 78 + tri 443 83 62 63 + tri 444 26 58 328 + tri 445 56 22 295 + tri 446 31 63 536 + tri 447 82 52 321 + tri 448 74 532 41 + tri 449 79 45 46 + tri 450 67 37 307 + tri 451 351 354 87 + tri 452 91 85 86 + tri 453 93 96 97 + tri 454 99 102 103 + tri 455 105 88 89 + tri 456 366 363 98 + tri 457 360 541 104 + tri 458 543 357 92 + tri 459 77 104 368 + tri 460 94 68 334 + tri 461 80 369 106 + tri 462 353 60 57 + tri 463 362 338 70 + tri 464 84 53 54 + tri 465 62 92 356 + tri 466 100 75 342 + tri 467 376 143 140 + tri 468 128 129 112 + tri 469 385 126 132 + tri 470 129 130 396 + tri 471 133 392 404 + tri 472 118 137 138 + tri 473 410 144 138 + tri 474 128 148 411 + tri 475 407 150 151 + tri 476 140 401 419 + tri 477 424 135 132 + tri 478 159 153 154 + tri 479 161 167 164 + tri 480 435 551 172 + tri 481 163 176 441 + tri 482 431 553 180 + tri 483 179 181 182 + tri 484 447 170 171 + tri 485 188 173 174 + tri 486 190 186 187 + tri 487 158 190 191 + tri 488 186 418 155 + tri 489 414 182 183 + tri 490 178 146 147 + tri 491 136 161 162 + tri 492 167 388 131 + tri 493 395 174 175 + tri 494 170 141 142 + tri 495 451 454 196 + tri 496 198 201 202 + tri 497 194 206 463 + tri 498 455 466 208 + tri 499 206 208 556 + tri 500 210 199 458 + tri 501 214 461 203 + tri 502 215 211 469 + tri 503 439 204 205 + tri 504 193 428 160 + tri 505 195 164 429 + tri 506 189 215 471 + tri 507 211 187 445 + tri 508 199 171 433 + tri 509 207 443 181 + tri 510 460 437 173 + tri 511 217 223 220 + tri 512 225 475 219 + tri 513 477 231 228 + tri 514 483 481 227 + tri 515 474 218 9 + tri 516 560 293 528 + tri 517 14 289 230 + tri 518 5 480 226 + tri 519 484 239 236 + tri 520 241 234 235 + tri 521 490 247 244 + tri 522 246 242 492 + tri 523 229 246 569 + tri 524 242 227 478 + tri 525 487 219 472 + tri 526 221 238 565 + tri 527 249 255 501 + tri 528 257 250 251 + tri 529 254 263 509 + tri 530 262 258 508 + tri 531 254 255 236 + tri 532 244 245 262 + tri 533 249 250 235 + tri 534 243 240 257 + tri 535 514 517 268 + tri 536 520 516 266 + tri 537 519 523 274 + tri 538 571 522 272 + tri 539 512 275 273 + tri 540 271 259 256 + tri 541 265 498 248 + tri 542 253 269 267 + tri 543 145 159 156 + tri 544 153 151 148 + tri 545 24 120 2 + numweights 576 + weight 0 7 1.0000000000 ( -0.4039240777 0.9994876385 -0.2740307450 ) + weight 1 8 1.0000000000 ( -0.4039240777 1.5706025362 -0.2740307450 ) + weight 2 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 3 2 1.0000000000 ( 0.5622114539 0.7840003967 -1.0001215935 ) + weight 4 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 5 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 6 2 1.0000000000 ( 0.7288469076 0.7839505672 -0.9001214504 ) + weight 7 7 1.0000000000 ( 0.6288465261 0.9994875789 -0.4833616316 ) + weight 8 2 1.0000000000 ( 0.7288460732 0.7830536366 0.8998782635 ) + weight 9 2 1.0000000000 ( 0.6288461685 0.8831658363 0.6745800972 ) + weight 10 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 11 2 1.0000000000 ( 0.5622105002 0.7830038071 0.9998782277 ) + weight 12 4 1.0000000000 ( -0.6288465858 1.0005125999 0.4833615720 ) + weight 13 2 1.0000000000 ( -0.7288460732 0.7839505672 -0.9001221657 ) + weight 14 2 1.0000000000 ( -0.6288461685 0.8838381767 -0.6747243404 ) + weight 15 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 16 2 1.0000000000 ( -0.5622105002 0.7840003967 -1.0001220703 ) + weight 17 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 18 2 1.0000000000 ( -0.5622114539 0.7830038071 0.9998776913 ) + weight 19 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 20 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 21 2 1.0000000000 ( -0.7288469076 0.7830536366 0.8998775482 ) + weight 22 4 1.0000000000 ( 0.3039242327 1.1005123854 -0.5127219558 ) + weight 23 4 1.0000000000 ( 0.4039241970 1.1005123854 -0.4127220213 ) + weight 24 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 25 4 1.0000000000 ( 0.3278744221 1.0005123615 -0.6127218604 ) + weight 26 4 1.0000000000 ( -0.3039239943 1.1005123854 -0.5127220750 ) + weight 27 4 1.0000000000 ( -0.3278741241 1.0005123615 -0.6127219796 ) + weight 28 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 29 4 1.0000000000 ( -0.4039240181 1.1005123854 -0.4127222002 ) + weight 30 4 1.0000000000 ( 0.4039240777 1.1005125046 0.1740308702 ) + weight 31 4 1.0000000000 ( 0.3039240539 1.1005125046 0.2740307450 ) + weight 32 4 1.0000000000 ( 0.3439128101 1.0005125999 0.3740306795 ) + weight 33 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 34 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 35 7 1.0000000000 ( -0.5039241910 0.9994876981 0.4991172850 ) + weight 36 7 1.0000000000 ( -0.3278743625 0.9994876981 0.6127218604 ) + weight 37 7 1.0000000000 ( -0.3039242029 1.0994876623 0.5127219558 ) + weight 38 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 39 7 1.0000000000 ( -0.3439128399 0.9994875789 -0.3740306497 ) + weight 40 7 1.0000000000 ( -0.5039240718 0.9994876385 -0.2490397245 ) + weight 41 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 42 7 1.0000000000 ( 0.5039241910 0.9994876385 -0.2490395755 ) + weight 43 7 1.0000000000 ( 0.3439129591 0.9994875789 -0.3740305305 ) + weight 44 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 45 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 46 7 1.0000000000 ( 0.3039240241 1.0994876623 0.5127220750 ) + weight 47 7 1.0000000000 ( 0.3278741837 0.9994876981 0.6127219796 ) + weight 48 7 1.0000000000 ( 0.5039240718 0.9994876981 0.4991174638 ) + weight 49 4 1.0000000000 ( -0.4039241374 1.1005125046 0.1740306914 ) + weight 50 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 51 4 1.0000000000 ( -0.3439129889 1.0005125999 0.3740305007 ) + weight 52 4 1.0000000000 ( -0.3039241731 1.1005125046 0.2740306258 ) + weight 53 5 1.0000000000 ( 0.3039242327 1.6850823164 -0.5127219558 ) + weight 54 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 55 5 1.0000000000 ( 0.4039241970 1.4850825071 -0.4127220213 ) + weight 56 5 1.0000000000 ( 0.3039242327 1.4850825071 -0.5127219558 ) + weight 57 5 1.0000000000 ( -0.3039239943 1.6850823164 -0.5127220750 ) + weight 58 5 1.0000000000 ( -0.3039239943 1.4850825071 -0.5127220750 ) + weight 59 5 1.0000000000 ( -0.4039240181 1.4850825071 -0.4127222002 ) + weight 60 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 61 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 62 5 1.0000000000 ( 0.3039240539 1.6850824356 0.2740307450 ) + weight 63 5 1.0000000000 ( 0.3039240539 1.4850826263 0.2740307450 ) + weight 64 5 1.0000000000 ( 0.4039240777 1.4850826263 0.1740308702 ) + weight 65 8 1.0000000000 ( -0.4039241672 1.6706025600 0.4127220511 ) + weight 66 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 67 8 1.0000000000 ( -0.3039242029 1.4706027508 0.5127219558 ) + weight 68 8 1.0000000000 ( -0.3039242029 1.6706025600 0.5127219558 ) + weight 69 8 1.0000000000 ( -0.4039240777 1.6706024408 -0.1740308404 ) + weight 70 8 1.0000000000 ( -0.3039240837 1.6706024408 -0.2740307450 ) + weight 71 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 72 8 1.0000000000 ( 0.4039241374 1.6706024408 -0.1740307212 ) + weight 73 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 74 8 1.0000000000 ( 0.3039241433 1.4706026316 -0.2740306258 ) + weight 75 8 1.0000000000 ( 0.3039241433 1.6706024408 -0.2740306258 ) + weight 76 8 1.0000000000 ( 0.4039240479 1.6706025600 0.4127221704 ) + weight 77 8 1.0000000000 ( 0.3039240241 1.6706025600 0.5127220750 ) + weight 78 8 1.0000000000 ( 0.3039240241 1.4706027508 0.5127220750 ) + weight 79 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 80 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 81 5 1.0000000000 ( -0.4039241374 1.4850826263 0.1740306914 ) + weight 82 5 1.0000000000 ( -0.3039241731 1.4850826263 0.2740306258 ) + weight 83 5 1.0000000000 ( -0.3039241731 1.6850824356 0.2740306258 ) + weight 84 6 1.0000000000 ( 0.3039242327 1.5055567026 -0.5127219558 ) + weight 85 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 86 6 1.0000000000 ( 0.4039241970 1.5055567026 -0.4127220213 ) + weight 87 6 1.0000000000 ( -0.3039239943 1.5055567026 -0.5127220750 ) + weight 88 6 1.0000000000 ( -0.4039240181 1.5055567026 -0.4127222002 ) + weight 89 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 90 6 1.0000000000 ( 0.4039240777 1.5055568218 0.1740308702 ) + weight 91 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 92 6 1.0000000000 ( 0.3039240539 1.5055568218 0.2740307450 ) + weight 93 9 1.0000000000 ( -0.4039241672 1.4094725847 0.4127220511 ) + weight 94 9 1.0000000000 ( -0.3039242029 1.4094725847 0.5127219558 ) + weight 95 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 96 9 1.0000000000 ( -0.4039240777 1.4094724655 -0.1740308404 ) + weight 97 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 98 9 1.0000000000 ( -0.3039240837 1.4094724655 -0.2740307450 ) + weight 99 9 1.0000000000 ( 0.4039241374 1.4094724655 -0.1740307212 ) + weight 100 9 1.0000000000 ( 0.3039241433 1.4094724655 -0.2740306258 ) + weight 101 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 102 9 1.0000000000 ( 0.4039240479 1.4094725847 0.4127221704 ) + weight 103 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 104 9 1.0000000000 ( 0.3039240241 1.4094725847 0.5127220750 ) + weight 105 6 1.0000000000 ( -0.4039241374 1.5055568218 0.1740306914 ) + weight 106 6 1.0000000000 ( -0.3039241731 1.5055568218 0.2740306258 ) + weight 107 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 108 1 1.0000000000 ( -0.6288462877 -0.0027038516 -0.8406154513 ) + weight 109 1 1.0000000000 ( -0.7288462520 0.0972779691 -0.9000298381 ) + weight 110 1 1.0000000000 ( -0.6288462281 0.7323116660 -1.0002232790 ) + weight 111 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 112 1 1.0000000000 ( -0.2920551896 -0.0027219369 -0.8999993205 ) + weight 113 1 1.0000000000 ( -0.6288466454 -0.0021918355 0.8406166434 ) + weight 114 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 115 1 1.0000000000 ( -0.5973538756 0.0978566110 0.9999701381 ) + weight 116 1 1.0000000000 ( -0.6288467050 0.7329211831 0.9997767210 ) + weight 117 1 1.0000000000 ( -0.7288467288 0.0978261530 0.8999701142 ) + weight 118 1 1.0000000000 ( 0.2920556366 -0.0027219369 -0.8999991417 ) + weight 119 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 120 1 1.0000000000 ( 0.6288467050 0.7323121428 -1.0002229214 ) + weight 121 1 1.0000000000 ( 0.7288467288 0.0972779691 -0.9000295401 ) + weight 122 1 1.0000000000 ( 0.6288466454 -0.0027038516 -0.8406151533 ) + weight 123 1 1.0000000000 ( 0.6288462281 0.7329207063 0.9997770190 ) + weight 124 1 1.0000000000 ( 0.5973533988 0.0978566110 0.9999704361 ) + weight 125 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 126 1 1.0000000000 ( 0.6288462877 -0.0021918355 0.8406169415 ) + weight 127 1 1.0000000000 ( 0.7288462520 0.0978261530 0.8999704123 ) + weight 128 1 1.0000000000 ( -0.3483265936 -0.0026625698 -0.7050647736 ) + weight 129 1 1.0000000000 ( -0.2254323065 -0.0027121324 -0.8678063154 ) + weight 130 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 131 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 132 1 1.0000000000 ( 0.3483265638 -0.0022331174 0.7050662637 ) + weight 133 1 1.0000000000 ( 0.2254322916 -0.0021835547 0.8678078055 ) + weight 134 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 135 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 136 1 1.0000000000 ( 0.1483269334 -0.1026815847 -0.7677757740 ) + weight 137 1 1.0000000000 ( 0.2254328430 -0.0027121324 -0.8678062558 ) + weight 138 1 1.0000000000 ( 0.3483269215 -0.0026625700 -0.7050646544 ) + weight 139 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 140 1 1.0000000000 ( -0.3483269513 -0.0022331174 0.7050660849 ) + weight 141 1 1.0000000000 ( -0.2483269423 -0.1022443697 0.6678380966 ) + weight 142 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 143 1 1.0000000000 ( -0.2254327387 -0.0021835547 0.8678077459 ) + weight 144 1 1.0000000000 ( 0.3483268023 -0.0025123558 -0.2118284255 ) + weight 145 1 1.0000000000 ( 0.1483267844 -0.0024819009 -0.1118284762 ) + weight 146 1 1.0000000000 ( 0.1483267993 -0.1025122628 -0.2117980272 ) + weight 147 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 148 1 1.0000000000 ( -0.3483267128 -0.0025123558 -0.2118286043 ) + weight 149 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 150 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 151 1 1.0000000000 ( -0.1483267248 -0.0024819009 -0.1118285581 ) + weight 152 1 1.0000000000 ( -0.3483268321 -0.0023825131 0.2145166397 ) + weight 153 1 1.0000000000 ( -0.1483268142 -0.0024129678 0.1145166904 ) + weight 154 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 155 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 156 1 1.0000000000 ( 0.3483266830 -0.0023825131 0.2145168185 ) + weight 157 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 158 1 1.0000000000 ( 0.1483267099 -0.1023824140 0.2145472169 ) + weight 159 1 1.0000000000 ( 0.1483267248 -0.0024129678 0.1145167649 ) + weight 160 11 1.0000000000 ( 0.1483266801 1.5368695259 0.2828474939 ) + weight 161 11 1.0000000000 ( 0.1483266801 1.3368693590 0.2828474939 ) + weight 162 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 163 11 1.0000000000 ( 0.2483267039 1.5368694067 0.1828474402 ) + weight 164 11 1.0000000000 ( -0.1483268291 1.5368695259 0.2828474343 ) + weight 165 11 1.0000000000 ( -0.2483268082 1.5368694067 0.1828473210 ) + weight 166 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 167 11 1.0000000000 ( -0.1483268440 1.3368693590 0.2828474343 ) + weight 168 14 1.0000000000 ( -0.1483269930 1.5362550020 -0.2177159637 ) + weight 169 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 170 14 1.0000000000 ( -0.2483268976 1.3362549543 -0.1177158356 ) + weight 171 14 1.0000000000 ( -0.2483268976 1.5362550020 -0.1177158356 ) + weight 172 14 1.0000000000 ( 0.1483265162 1.5362550020 -0.2177162319 ) + weight 173 14 1.0000000000 ( 0.2483266145 1.5362550020 -0.1177163124 ) + weight 174 14 1.0000000000 ( 0.2483266145 1.3362549543 -0.1177163124 ) + weight 175 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 176 11 1.0000000000 ( 0.2483267933 1.5368694067 -0.1731303036 ) + weight 177 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 178 11 1.0000000000 ( 0.1483268142 1.3368691206 -0.2731303275 ) + weight 179 11 1.0000000000 ( 0.1483268142 1.5368692875 -0.2731303275 ) + weight 180 11 1.0000000000 ( -0.2483267188 1.5368694067 -0.1731304228 ) + weight 181 11 1.0000000000 ( -0.1483266950 1.5368692875 -0.2731304169 ) + weight 182 11 1.0000000000 ( -0.1483266950 1.3368691206 -0.2731304169 ) + weight 183 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 184 14 1.0000000000 ( -0.2483265549 1.5362550020 0.2355751693 ) + weight 185 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 186 14 1.0000000000 ( -0.1483264714 1.3362549543 0.3355750740 ) + weight 187 14 1.0000000000 ( -0.1483264714 1.5362550020 0.3355750740 ) + weight 188 14 1.0000000000 ( 0.2483269721 1.5362550020 0.2355746925 ) + weight 189 14 1.0000000000 ( 0.1483270675 1.5362550020 0.3355747759 ) + weight 190 14 1.0000000000 ( 0.1483270526 1.3362549543 0.3355747759 ) + weight 191 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 192 12 1.0000000000 ( 0.1483267546 1.5553369522 0.2828474641 ) + weight 193 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 194 12 1.0000000000 ( 0.1483267546 1.6553369761 0.1828473806 ) + weight 195 12 1.0000000000 ( -0.1483267546 1.5553369522 0.2828474641 ) + weight 196 12 1.0000000000 ( -0.1483267546 1.6553369761 0.1828473806 ) + weight 197 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 198 15 1.0000000000 ( -0.1483269930 1.5547224283 -0.2177159637 ) + weight 199 15 1.0000000000 ( -0.2483268976 1.5547224283 -0.1177158356 ) + weight 200 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 201 15 1.0000000000 ( 0.1483265162 1.5547224283 -0.2177162319 ) + weight 202 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 203 15 1.0000000000 ( 0.2483266145 1.5547224283 -0.1177163124 ) + weight 204 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 205 12 1.0000000000 ( 0.1483267546 1.5553368330 -0.2731303573 ) + weight 206 12 1.0000000000 ( 0.1483267546 1.6553368568 -0.1731303632 ) + weight 207 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 208 12 1.0000000000 ( -0.1483267546 1.6553368568 -0.1731303632 ) + weight 209 12 1.0000000000 ( -0.1483267546 1.5553368330 -0.2731303871 ) + weight 210 15 1.0000000000 ( -0.2483265549 1.5547224283 0.2355751693 ) + weight 211 15 1.0000000000 ( -0.1483264714 1.5547224283 0.3355750740 ) + weight 212 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 213 15 1.0000000000 ( 0.2483269721 1.5547224283 0.2355746925 ) + weight 214 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 215 15 1.0000000000 ( 0.1483270675 1.5547224283 0.3355747759 ) + weight 216 2 1.0000000000 ( 0.1642774343 0.9833446145 0.3156406283 ) + weight 217 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 218 2 1.0000000000 ( 0.3642774224 0.8833600283 0.2848545611 ) + weight 219 2 1.0000000000 ( 0.2642774880 0.9833944440 0.2156406790 ) + weight 220 2 1.0000000000 ( -0.1642777324 0.9833446145 0.3156404793 ) + weight 221 2 1.0000000000 ( -0.2642776668 0.9833944440 0.2156404257 ) + weight 222 2 1.0000000000 ( -0.3642777205 0.8833600283 0.2848542035 ) + weight 223 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 224 2 1.0000000000 ( 0.2642776668 0.9836093783 -0.2156849951 ) + weight 225 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 226 2 1.0000000000 ( 0.2112980932 0.8837091327 -0.4157347977 ) + weight 227 2 1.0000000000 ( 0.1642777324 0.9836592078 -0.3156850338 ) + weight 228 2 1.0000000000 ( -0.2642774880 0.9836093783 -0.2156852484 ) + weight 229 2 1.0000000000 ( -0.1642774343 0.9836592078 -0.3156851828 ) + weight 230 2 1.0000000000 ( -0.2112977058 0.8837091327 -0.4157350063 ) + weight 231 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 232 3 1.0000000000 ( 0.2178864777 0.2118682861 0.4156629145 ) + weight 233 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 234 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 235 3 1.0000000000 ( 0.3642775118 0.2118682861 0.2790425122 ) + weight 236 3 1.0000000000 ( -0.2178866714 0.2118682861 0.4156627953 ) + weight 237 3 1.0000000000 ( -0.3642776310 0.2118682861 0.2790423334 ) + weight 238 3 1.0000000000 ( -0.2642776370 0.1118683815 0.2156628072 ) + weight 239 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 240 3 1.0000000000 ( 0.3642776310 0.2118682861 -0.2790423334 ) + weight 241 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 242 3 1.0000000000 ( 0.1642776579 0.1118683815 -0.3156628311 ) + weight 243 3 1.0000000000 ( 0.2178866714 0.2118682861 -0.4156627953 ) + weight 244 3 1.0000000000 ( -0.3642775118 0.2118682861 -0.2790425122 ) + weight 245 3 1.0000000000 ( -0.2178864777 0.2118682861 -0.4156629145 ) + weight 246 3 1.0000000000 ( -0.1642775089 0.1118683815 -0.3156628907 ) + weight 247 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 248 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 249 3 1.0000000000 ( 0.2328544855 0.2118682861 0.4333589375 ) + weight 250 3 1.0000000000 ( 0.3484135866 0.2118682861 0.2602873147 ) + weight 251 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 252 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 253 3 1.0000000000 ( -0.4484137595 0.3118681908 0.4333587587 ) + weight 254 3 1.0000000000 ( -0.3484137356 0.2118682861 0.2602871358 ) + weight 255 3 1.0000000000 ( -0.2328547388 0.2118682861 0.4333588183 ) + weight 256 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 257 3 1.0000000000 ( 0.3484137356 0.2118682861 -0.2602871358 ) + weight 258 3 1.0000000000 ( 0.2328547388 0.2118682861 -0.4333588183 ) + weight 259 3 1.0000000000 ( 0.3484137952 0.3118681908 -0.5333588123 ) + weight 260 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 261 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 262 3 1.0000000000 ( -0.2328544855 0.2118682861 -0.4333589375 ) + weight 263 3 1.0000000000 ( -0.3484135866 0.2118682861 -0.2602873147 ) + weight 264 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 265 3 1.0000000000 ( 0.4484135807 1.2077021599 0.4333589971 ) + weight 266 3 1.0000000000 ( 0.3484135866 1.3077020645 0.4333589673 ) + weight 267 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 268 3 1.0000000000 ( -0.3484137654 1.3077020645 0.4333587885 ) + weight 269 3 1.0000000000 ( -0.4484137595 1.2077021599 0.4333587587 ) + weight 270 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 271 3 1.0000000000 ( 0.3484137952 1.2077021599 -0.5333588123 ) + weight 272 3 1.0000000000 ( 0.3484137654 1.3077020645 -0.4333587885 ) + weight 273 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 274 3 1.0000000000 ( -0.3484135866 1.3077020645 -0.4333589673 ) + weight 275 3 1.0000000000 ( -0.3484135568 1.2077021599 -0.5333589315 ) + weight 276 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 277 2 1.0000000000 ( 0.5622114539 0.7840003967 -1.0001215935 ) + weight 278 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 279 2 1.0000000000 ( 0.5400952697 0.8839504719 -0.9000717402 ) + weight 280 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 281 2 1.0000000000 ( 0.7288469076 0.7839505672 -0.9001214504 ) + weight 282 7 1.0000000000 ( 0.6288465261 0.9994875789 -0.4833616316 ) + weight 283 2 1.0000000000 ( 0.6288461685 0.8831658363 0.6745800972 ) + weight 284 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 285 2 1.0000000000 ( 0.5400944948 0.8830535412 0.8999279737 ) + weight 286 4 1.0000000000 ( -0.6288465858 1.0005125999 0.4833615720 ) + weight 287 2 1.0000000000 ( -0.6288461685 0.8838381767 -0.6747243404 ) + weight 288 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 289 2 1.0000000000 ( -0.5400944948 0.8839504719 -0.9000722170 ) + weight 290 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 291 2 1.0000000000 ( -0.5622114539 0.7830038071 0.9998776913 ) + weight 292 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 293 2 1.0000000000 ( -0.5400952697 0.8830535412 0.8999274969 ) + weight 294 2 1.0000000000 ( -0.7288469076 0.7830536366 0.8998775482 ) + weight 295 4 1.0000000000 ( 0.4039241970 1.1005123854 -0.4127220213 ) + weight 296 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 297 4 1.0000000000 ( 0.5039242506 1.0005123615 -0.4991172552 ) + weight 298 4 1.0000000000 ( 0.3278744221 1.0005123615 -0.6127218604 ) + weight 299 4 1.0000000000 ( -0.3278741241 1.0005123615 -0.6127219796 ) + weight 300 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 301 4 1.0000000000 ( -0.5039240122 1.0005123615 -0.4991174936 ) + weight 302 4 1.0000000000 ( -0.4039240181 1.1005123854 -0.4127222002 ) + weight 303 4 1.0000000000 ( 0.4039240777 1.1005125046 0.1740308702 ) + weight 304 4 1.0000000000 ( 0.3439128101 1.0005125999 0.3740306795 ) + weight 305 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 306 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 307 7 1.0000000000 ( -0.4039241672 1.0994876623 0.4127220511 ) + weight 308 7 1.0000000000 ( -0.5039241910 0.9994876981 0.4991172850 ) + weight 309 7 1.0000000000 ( -0.3039242029 1.0994876623 0.5127219558 ) + weight 310 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 311 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 312 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) + weight 313 7 1.0000000000 ( -0.3439128399 0.9994875789 -0.3740306497 ) + weight 314 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 315 7 1.0000000000 ( 0.4039241374 1.0994876623 -0.1740307212 ) + weight 316 7 1.0000000000 ( 0.3439129591 0.9994875789 -0.3740305305 ) + weight 317 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 318 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 319 7 1.0000000000 ( 0.4039240479 1.0994876623 0.4127221704 ) + weight 320 7 1.0000000000 ( 0.5039240718 0.9994876981 0.4991174638 ) + weight 321 4 1.0000000000 ( -0.4039241374 1.1005125046 0.1740306914 ) + weight 322 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 323 4 1.0000000000 ( -0.5039241910 1.0005124807 0.2490395308 ) + weight 324 5 1.0000000000 ( 0.3039242327 1.6850823164 -0.5127219558 ) + weight 325 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 326 5 1.0000000000 ( 0.4039241970 1.6850823164 -0.4127220213 ) + weight 327 5 1.0000000000 ( -0.3039239943 1.6850823164 -0.5127220750 ) + weight 328 5 1.0000000000 ( -0.4039240181 1.4850825071 -0.4127222002 ) + weight 329 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 330 5 1.0000000000 ( -0.4039240181 1.6850823164 -0.4127222002 ) + weight 331 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 332 5 1.0000000000 ( 0.4039240777 1.6850824356 0.1740308702 ) + weight 333 5 1.0000000000 ( 0.3039240539 1.6850824356 0.2740307450 ) + weight 334 8 1.0000000000 ( -0.4039241672 1.6706025600 0.4127220511 ) + weight 335 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 336 8 1.0000000000 ( -0.4039241672 1.4706027508 0.4127220511 ) + weight 337 8 1.0000000000 ( -0.3039242029 1.4706027508 0.5127219558 ) + weight 338 8 1.0000000000 ( -0.4039240777 1.6706024408 -0.1740308404 ) + weight 339 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 340 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 341 8 1.0000000000 ( -0.4039240777 1.5206025839 -0.2740307450 ) + weight 342 8 1.0000000000 ( 0.4039241374 1.6706024408 -0.1740307212 ) + weight 343 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 344 8 1.0000000000 ( 0.4039241374 1.4706026316 -0.1740307212 ) + weight 345 8 1.0000000000 ( 0.3039241433 1.4706026316 -0.2740306258 ) + weight 346 8 1.0000000000 ( 0.4039240479 1.6706025600 0.4127221704 ) + weight 347 8 1.0000000000 ( 0.3039240241 1.4706027508 0.5127220750 ) + weight 348 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 349 5 1.0000000000 ( -0.4039241374 1.6850824356 0.1740306914 ) + weight 350 5 1.0000000000 ( -0.3039241731 1.6850824356 0.2740306258 ) + weight 351 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 352 6 1.0000000000 ( 0.3039242029 1.6055566072 -0.4127220511 ) + weight 353 6 1.0000000000 ( -0.4039240181 1.5055567026 -0.4127222002 ) + weight 354 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 355 6 1.0000000000 ( -0.3039240241 1.6055566072 -0.4127221704 ) + weight 356 6 1.0000000000 ( 0.4039240777 1.5055568218 0.1740308702 ) + weight 357 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 358 6 1.0000000000 ( 0.3039240837 1.6055567265 0.1740308553 ) + weight 359 9 1.0000000000 ( -0.4039241672 1.4094725847 0.4127220511 ) + weight 360 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 361 9 1.0000000000 ( -0.3039241731 1.5094724894 0.4127220511 ) + weight 362 9 1.0000000000 ( -0.4039240777 1.4094724655 -0.1740308404 ) + weight 363 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 364 9 1.0000000000 ( -0.3039240837 1.5094723701 -0.1740308255 ) + weight 365 9 1.0000000000 ( 0.4039241374 1.4094724655 -0.1740307212 ) + weight 366 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 367 9 1.0000000000 ( 0.3039241433 1.5094723701 -0.1740307361 ) + weight 368 9 1.0000000000 ( 0.4039240479 1.4094725847 0.4127221704 ) + weight 369 6 1.0000000000 ( -0.4039241374 1.5055568218 0.1740306914 ) + weight 370 1 1.0000000000 ( -0.6288462877 -0.0027038516 -0.8406154513 ) + weight 371 1 1.0000000000 ( -0.6288462281 0.7323116660 -1.0002232790 ) + weight 372 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 373 1 1.0000000000 ( -0.5973533988 0.0972475111 -1.0000298023 ) + weight 374 1 1.0000000000 ( -0.6288466454 -0.0021918355 0.8406166434 ) + weight 375 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 376 1 1.0000000000 ( -0.2920556366 -0.0021737502 0.9000006318 ) + weight 377 1 1.0000000000 ( -0.5973538756 0.0978566110 0.9999701381 ) + weight 378 1 1.0000000000 ( 0.2920556366 -0.0027219369 -0.8999991417 ) + weight 379 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 380 1 1.0000000000 ( 0.5973538756 0.0972475111 -1.0000295639 ) + weight 381 1 1.0000000000 ( 0.6288466454 -0.0027038516 -0.8406151533 ) + weight 382 1 1.0000000000 ( 0.6288462281 0.7329207063 0.9997770190 ) + weight 383 1 1.0000000000 ( 0.5973533988 0.0978566110 0.9999704361 ) + weight 384 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 385 1 1.0000000000 ( 0.2920552492 -0.0021737502 0.9000008106 ) + weight 386 1 1.0000000000 ( -0.2254323065 -0.0027121324 -0.8678063154 ) + weight 387 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 388 1 1.0000000000 ( -0.1483265758 -0.1026815847 -0.7677758336 ) + weight 389 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 390 1 1.0000000000 ( -0.2483265996 -0.1026511267 -0.6677758694 ) + weight 391 1 1.0000000000 ( 0.3483265638 -0.0022331174 0.7050662637 ) + weight 392 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 393 1 1.0000000000 ( 0.1483265460 -0.1022139117 0.7678382397 ) + weight 394 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 395 1 1.0000000000 ( 0.2483265698 -0.1022443697 0.6678382158 ) + weight 396 1 1.0000000000 ( 0.1483269334 -0.1026815847 -0.7677757740 ) + weight 397 1 1.0000000000 ( 0.3483269215 -0.0026625700 -0.7050646544 ) + weight 398 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 399 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 400 1 1.0000000000 ( 0.2483269125 -0.1026511267 -0.6677757502 ) + weight 401 1 1.0000000000 ( -0.2483269423 -0.1022443697 0.6678380966 ) + weight 402 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 403 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 404 1 1.0000000000 ( -0.1483269632 -0.1022139117 0.7678381801 ) + weight 405 1 1.0000000000 ( -0.2254327387 -0.0021835547 0.8678077459 ) + weight 406 1 1.0000000000 ( 0.3483268023 -0.0025123558 -0.2118284255 ) + weight 407 1 1.0000000000 ( 0.1483267993 -0.1025122628 -0.2117980272 ) + weight 408 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 409 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 410 1 1.0000000000 ( 0.2483268231 -0.1025427133 -0.3117980063 ) + weight 411 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 412 1 1.0000000000 ( -0.2483266890 -0.1025427133 -0.3117981255 ) + weight 413 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 414 1 1.0000000000 ( -0.1483267248 -0.1025122628 -0.2117981017 ) + weight 415 1 1.0000000000 ( -0.1483267248 -0.0024819009 -0.1118285581 ) + weight 416 1 1.0000000000 ( -0.1483268142 -0.0024129678 0.1145166904 ) + weight 417 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 418 1 1.0000000000 ( -0.1483268291 -0.1023824140 0.2145471424 ) + weight 419 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 420 1 1.0000000000 ( -0.2483268529 -0.1023519635 0.3145471215 ) + weight 421 1 1.0000000000 ( 0.3483266830 -0.0023825131 0.2145168185 ) + weight 422 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 423 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 424 1 1.0000000000 ( 0.2483266741 -0.1023519635 0.3145472407 ) + weight 425 11 1.0000000000 ( 0.1483266801 1.3368693590 0.2828474939 ) + weight 426 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 427 11 1.0000000000 ( 0.2483267039 1.3368692398 0.1828474402 ) + weight 428 11 1.0000000000 ( 0.2483267039 1.5368694067 0.1828474402 ) + weight 429 11 1.0000000000 ( -0.2483268082 1.5368694067 0.1828473210 ) + weight 430 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 431 11 1.0000000000 ( -0.2483268082 1.3368692398 0.1828473210 ) + weight 432 11 1.0000000000 ( -0.1483268440 1.3368693590 0.2828474343 ) + weight 433 14 1.0000000000 ( -0.1483269930 1.5362550020 -0.2177159637 ) + weight 434 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 435 14 1.0000000000 ( -0.1483269930 1.3362549543 -0.2177159637 ) + weight 436 14 1.0000000000 ( -0.2483268976 1.3362549543 -0.1177158356 ) + weight 437 14 1.0000000000 ( 0.1483265162 1.5362550020 -0.2177162319 ) + weight 438 14 1.0000000000 ( 0.2483266145 1.3362549543 -0.1177163124 ) + weight 439 11 1.0000000000 ( 0.2483267933 1.5368694067 -0.1731303036 ) + weight 440 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 441 11 1.0000000000 ( 0.2483267933 1.3368692398 -0.1731303036 ) + weight 442 11 1.0000000000 ( 0.1483268142 1.3368691206 -0.2731303275 ) + weight 443 11 1.0000000000 ( -0.2483267188 1.5368694067 -0.1731304228 ) + weight 444 11 1.0000000000 ( -0.1483266950 1.3368691206 -0.2731304169 ) + weight 445 14 1.0000000000 ( -0.2483265549 1.5362550020 0.2355751693 ) + weight 446 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 447 14 1.0000000000 ( -0.2483265549 1.3362549543 0.2355751693 ) + weight 448 14 1.0000000000 ( -0.1483264714 1.3362549543 0.3355750740 ) + weight 449 14 1.0000000000 ( 0.2483269721 1.5362550020 0.2355746925 ) + weight 450 14 1.0000000000 ( 0.1483270526 1.3362549543 0.3355747759 ) + weight 451 12 1.0000000000 ( 0.1483267546 1.5553369522 0.2828474641 ) + weight 452 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 453 12 1.0000000000 ( 0.2483267486 1.5553369522 0.1828473806 ) + weight 454 12 1.0000000000 ( -0.1483267546 1.5553369522 0.2828474641 ) + weight 455 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 456 12 1.0000000000 ( -0.2483267635 1.5553369522 0.1828473806 ) + weight 457 15 1.0000000000 ( -0.1483269930 1.5547224283 -0.2177159637 ) + weight 458 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 459 15 1.0000000000 ( -0.1483269036 1.6547223330 -0.1177159324 ) + weight 460 15 1.0000000000 ( 0.1483265162 1.5547224283 -0.2177162319 ) + weight 461 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 462 15 1.0000000000 ( 0.1483266056 1.6547223330 -0.1177162156 ) + weight 463 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 464 12 1.0000000000 ( 0.2483267486 1.5553368330 -0.1731303632 ) + weight 465 12 1.0000000000 ( 0.1483267546 1.5553368330 -0.2731303573 ) + weight 466 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 467 12 1.0000000000 ( -0.2483267635 1.5553368330 -0.1731303632 ) + weight 468 15 1.0000000000 ( -0.2483265549 1.5547224283 0.2355751693 ) + weight 469 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 470 15 1.0000000000 ( -0.1483265609 1.6547223330 0.2355750650 ) + weight 471 15 1.0000000000 ( 0.2483269721 1.5547224283 0.2355746925 ) + weight 472 2 1.0000000000 ( 0.1642774343 0.9833446145 0.3156406283 ) + weight 473 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 474 2 1.0000000000 ( 0.2112977058 0.8832948804 0.4155907929 ) + weight 475 2 1.0000000000 ( 0.3642774224 0.8833600283 0.2848545611 ) + weight 476 2 1.0000000000 ( -0.1642777324 0.9833446145 0.3156404793 ) + weight 477 2 1.0000000000 ( -0.3642777205 0.8833600283 0.2848542035 ) + weight 478 2 1.0000000000 ( 0.2642776668 0.9836093783 -0.2156849951 ) + weight 479 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 480 2 1.0000000000 ( 0.3642777205 0.8836439848 -0.2849984467 ) + weight 481 2 1.0000000000 ( 0.2112980932 0.8837091327 -0.4157347977 ) + weight 482 2 1.0000000000 ( -0.2642774880 0.9836093783 -0.2156852484 ) + weight 483 2 1.0000000000 ( -0.2112977058 0.8837091327 -0.4157350063 ) + weight 484 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 485 3 1.0000000000 ( 0.1642775089 0.1118683815 0.3156628907 ) + weight 486 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 487 3 1.0000000000 ( 0.2642775178 0.1118683815 0.2156629264 ) + weight 488 3 1.0000000000 ( 0.3642775118 0.2118682861 0.2790425122 ) + weight 489 3 1.0000000000 ( -0.2178866714 0.2118682861 0.4156627953 ) + weight 490 3 1.0000000000 ( -0.2642776370 0.1118683815 0.2156628072 ) + weight 491 3 1.0000000000 ( 0.3642776310 0.2118682861 -0.2790423334 ) + weight 492 3 1.0000000000 ( 0.2178866714 0.2118682861 -0.4156627953 ) + weight 493 3 1.0000000000 ( -0.3642775118 0.2118682861 -0.2790425122 ) + weight 494 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 495 3 1.0000000000 ( 0.3484135568 0.3118681908 0.5333589315 ) + weight 496 3 1.0000000000 ( 0.3484135866 0.2118682861 0.2602873147 ) + weight 497 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 498 3 1.0000000000 ( 0.4484135807 0.3118681908 0.4333589971 ) + weight 499 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 500 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 501 3 1.0000000000 ( -0.3484137952 0.3118681908 0.5333588123 ) + weight 502 3 1.0000000000 ( -0.4484137595 0.3118681908 0.4333587587 ) + weight 503 3 1.0000000000 ( -0.2328547388 0.2118682861 0.4333588183 ) + weight 504 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 505 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 506 3 1.0000000000 ( 0.4484137595 0.3118681908 -0.4333587587 ) + weight 507 3 1.0000000000 ( 0.3484137356 0.2118682861 -0.2602871358 ) + weight 508 3 1.0000000000 ( 0.3484137952 0.3118681908 -0.5333588123 ) + weight 509 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 510 3 1.0000000000 ( -0.4484135807 0.3118681908 -0.4333589971 ) + weight 511 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 512 3 1.0000000000 ( -0.3484135568 0.3118681908 -0.5333589315 ) + weight 513 3 1.0000000000 ( -0.2328544855 0.2118682861 -0.4333589375 ) + weight 514 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 515 3 1.0000000000 ( 0.3484135568 1.2077021599 0.5333589315 ) + weight 516 3 1.0000000000 ( 0.4484135807 1.2077021599 0.4333589971 ) + weight 517 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 518 3 1.0000000000 ( -0.3484137952 1.2077021599 0.5333588123 ) + weight 519 3 1.0000000000 ( -0.4484137595 1.2077021599 0.4333587587 ) + weight 520 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 521 3 1.0000000000 ( 0.4484137595 1.2077021599 -0.4333587587 ) + weight 522 3 1.0000000000 ( 0.3484137952 1.2077021599 -0.5333588123 ) + weight 523 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 524 3 1.0000000000 ( -0.4484135807 1.2077021599 -0.4333589971 ) + weight 525 2 1.0000000000 ( 0.5622105002 0.7830038071 0.9998782277 ) + weight 526 2 1.0000000000 ( -0.5622105002 0.7840003967 -1.0001220703 ) + weight 527 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 528 2 1.0000000000 ( -0.6288467646 0.8831658363 0.6745795012 ) + weight 529 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 530 4 1.0000000000 ( 0.5039240718 1.0005124807 0.2490397692 ) + weight 531 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 532 7 1.0000000000 ( 0.3039241433 1.0994876623 -0.2740306258 ) + weight 533 7 1.0000000000 ( 0.3039240241 1.0994876623 0.5127220750 ) + weight 534 4 1.0000000000 ( -0.3439129889 1.0005125999 0.3740305007 ) + weight 535 5 1.0000000000 ( 0.4039241970 1.4850825071 -0.4127220213 ) + weight 536 5 1.0000000000 ( 0.4039240777 1.4850826263 0.1740308702 ) + weight 537 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 538 8 1.0000000000 ( 0.4039240479 1.4706027508 0.4127221704 ) + weight 539 5 1.0000000000 ( -0.4039241374 1.4850826263 0.1740306914 ) + weight 540 6 1.0000000000 ( 0.4039241970 1.5055567026 -0.4127220213 ) + weight 541 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 542 9 1.0000000000 ( 0.3039240539 1.5094724894 0.4127221704 ) + weight 543 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 544 6 1.0000000000 ( -0.3039241433 1.6055567265 0.1740307063 ) + weight 545 1 1.0000000000 ( -0.2920551896 -0.0027219369 -0.8999993205 ) + weight 546 1 1.0000000000 ( -0.6288467050 0.7329211831 0.9997767210 ) + weight 547 1 1.0000000000 ( 0.6288467050 0.7323121428 -1.0002229214 ) + weight 548 1 1.0000000000 ( 0.6288462877 -0.0021918355 0.8406169415 ) + weight 549 1 1.0000000000 ( 0.1483267099 -0.1023824140 0.2145472169 ) + weight 550 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 551 14 1.0000000000 ( 0.1483265311 1.3362549543 -0.2177162319 ) + weight 552 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 553 11 1.0000000000 ( -0.2483267188 1.3368692398 -0.1731304228 ) + weight 554 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 555 14 1.0000000000 ( 0.2483269721 1.3362549543 0.2355746925 ) + weight 556 12 1.0000000000 ( -0.1483267546 1.5553368330 -0.2731303871 ) + weight 557 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 558 15 1.0000000000 ( 0.1483269781 1.6547223330 0.2355747968 ) + weight 559 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 560 2 1.0000000000 ( -0.2112980932 0.8832948804 0.4155905843 ) + weight 561 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 562 2 1.0000000000 ( -0.3642774224 0.8836439848 -0.2849988043 ) + weight 563 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 564 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 565 3 1.0000000000 ( -0.1642776579 0.1118683815 0.3156628311 ) + weight 566 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 567 3 1.0000000000 ( 0.2642776370 0.1118683815 -0.2156628072 ) + weight 568 3 1.0000000000 ( -0.2178864777 0.2118682861 -0.4156629145 ) + weight 569 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 570 3 1.0000000000 ( -0.2642775178 0.1118683815 -0.2156629264 ) + weight 571 3 1.0000000000 ( -0.3484135568 1.2077021599 -0.5333589315 ) + weight 572 4 1.0000000000 ( 0.6288463473 1.0005125999 0.4833618701 ) + weight 573 2 1.0000000000 ( 0.6288467646 0.8838381767 -0.6747237444 ) + weight 574 7 1.0000000000 ( -0.6288464069 0.9994875789 -0.4833618104 ) + weight 575 7 1.0000000000 ( -0.4039240777 1.0494875908 -0.2740307450 ) +} + diff --git a/examples/nitro_engine/using_nflib/assets/robot/robot.png b/examples/nitro_engine/using_nflib/assets/robot/robot.png new file mode 100644 index 0000000..eafd9fa Binary files /dev/null and b/examples/nitro_engine/using_nflib/assets/robot/robot.png differ diff --git a/examples/nitro_engine/using_nflib/assets/robot/wave.md5anim b/examples/nitro_engine/using_nflib/assets/robot/wave.md5anim new file mode 100644 index 0000000..4a1a2f3 --- /dev/null +++ b/examples/nitro_engine/using_nflib/assets/robot/wave.md5anim @@ -0,0 +1,469 @@ +MD5Version 10 // Parameters used during export: Reorient: False; Scale: 1.0 +commandline "" + +numFrames 21 +numJoints 16 +frameRate 24 +numAnimatedComponents 96 + +hierarchy { + "Base.Bone" -1 63 0 // + "Spine.Low" 0 63 6 // + "Spine.High" 1 63 12 // + "Head" 2 63 18 // + "Chest.Left" 1 63 24 // + "Arm.Upper.Left" 4 63 30 // + "Arm.End.Left" 5 63 36 // + "Chest.Right" 1 63 42 // + "Arm.Upper.Right" 7 63 48 // + "Arm.End..Right" 8 63 54 // + "Pelvis.Left" 0 63 60 // + "Leg-Upper.Left" 10 63 66 // + "Leg-Lower.Left" 11 63 72 // + "Pelvis.Right" 0 63 78 // + "Leg-Upper.Right" 13 63 84 // + "Leg-Lower.Right" 14 63 90 // +} + +bounds { + ( -0.7288464904 -4.2145261765 -0.1051818728 ) ( 0.7288464904 4.2140474319 6.9405498505 ) + ( -0.7302514911 -4.2225360870 -0.1051818728 ) ( 0.7302514911 4.2145175934 6.9405498505 ) + ( -0.7343894839 -4.2448711395 -0.1051818728 ) ( 0.7343894839 4.2158436775 6.9405498505 ) + ( -0.7411305904 -4.2661142349 -0.1051818728 ) ( 0.7411305904 4.2178220749 6.9405498505 ) + ( -0.7503278852 -4.2707734108 -0.1051818728 ) ( 0.7503278852 4.2201490402 6.9405498505 ) + ( -0.7618184090 -4.2458715439 -0.1051818728 ) ( 0.7618184090 4.2224359512 6.9405498505 ) + ( -0.7754249573 -4.1845750809 -0.1051818728 ) ( 0.7754249573 4.2242231369 6.9405498505 ) + ( -0.7909565568 -4.0881261826 -0.1051818728 ) ( 0.7909565568 4.2249913216 6.9405498505 ) + ( -0.8082096577 -3.9748272896 -0.1051818728 ) ( 0.8082096577 4.2241716385 6.9405498505 ) + ( -0.8316085339 -3.8554317951 -0.1051818728 ) ( 0.8716588616 4.2211618423 6.9405498505 ) + ( -0.9071020484 -3.7363846302 -0.1051818728 ) ( 0.9725581408 4.2153348923 6.9405498505 ) + ( -0.9845415950 -3.6244606972 -0.1051818728 ) ( 1.0805976391 4.2060980797 6.9405498505 ) + ( -1.0607581139 -3.5166521072 -0.1051818728 ) ( 1.1924948692 4.1931948662 6.9405498505 ) + ( -1.1330087185 -3.4139099121 -0.1051818728 ) ( 1.3043855429 4.1768159866 7.0152153969 ) + ( -1.1990523338 -3.3173723221 -0.1051818728 ) ( 1.4124979973 4.1575984955 7.1181468964 ) + ( -1.2571754456 -3.2286412716 -0.1051818728 ) ( 1.5131845474 4.1366162300 7.2063169479 ) + ( -1.3061861992 -3.1498517990 -0.1051818728 ) ( 1.6029434204 4.1153287888 7.2786159515 ) + ( -1.3453353643 -3.0836009979 -0.1051818728 ) ( 1.6784145832 4.0954933167 7.3345251083 ) + ( -1.3741520643 -3.0328018665 -0.1051818728 ) ( 1.7363419533 4.0790367126 7.3741292953 ) + ( -1.3921631575 -3.0004279613 -0.1051818728 ) ( 1.7735110521 4.0679025650 7.3978281021 ) + ( -1.3984949589 -2.9891591072 -0.1051818728 ) ( 1.7866519690 4.0638575554 7.4058084488 ) +} + +baseframe { + ( 0.0000000000 0.0000000000 0.0000000000 ) ( -0.7071068287 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( -0.0001522740 -0.0000001192 -0.0000000000 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( 0.0004014244 -0.0000001192 0.0000000001 ) + ( -0.0000000000 1.0282182693 0.0000000000 ) ( -0.0002491503 0.0000001192 -0.0000000001 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( 0.7072144151 0.0000000000 0.0000001686 ) + ( 0.0000000000 1.0038089752 0.0000000000 ) ( -0.0000000000 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 1.6051955223 0.0000000000 ) ( -0.0000000000 -0.0000000000 -0.0000000000 ) + ( -0.0000000000 1.6823664904 0.0000000001 ) ( -0.7069991827 0.0000000309 -0.0000001377 ) + ( -0.0000000000 1.0172638893 0.0000000000 ) ( -0.0000000000 -0.0000000000 0.0000000000 ) + ( 0.0000000000 1.6867997646 0.0000000000 ) ( -0.0000000000 -0.0000000000 0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( 0.7113879919 -0.0000000000 -0.0000000000 ) + ( 0.0000000000 0.4849954247 0.0000000428 ) ( 0.7027994990 -0.0000000848 0.0000000838 ) + ( 0.0000000000 1.3662177324 0.0000000284 ) ( -0.0000000005 0.0000001192 -0.0000000000 ) + ( 0.0000000000 2.9222633839 0.0000000000 ) ( -0.7112751007 0.0000003352 0.0000003392 ) + ( 0.0000000000 0.5501293540 -0.0000000224 ) ( -0.7029137611 0.0000000000 0.0000006704 ) + ( 0.0000000000 1.3662178516 0.0000000000 ) ( 0.0000000000 0.0000000000 0.0000000000 ) +} + +frame 0 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522740 -0.0000001192 -0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 -0.0000000001 -0.0002490849 -0.0229121577 -0.0000057087 + 0.0000000000 1.6823664904 0.0000000000 0.7072144151 0.0000000000 0.0000001686 + 0.0000000000 1.0038089752 -0.0000001216 -0.0000000000 -0.0000000000 -0.0000000000 + 0.0000000000 1.6051954031 -0.0000003162 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000000 1.0172638893 0.0000001437 -0.0010274349 -0.0000000000 -0.0000000002 + 0.0000000000 1.6867997646 0.0000000624 -0.0003698472 -0.0000000000 -0.0000000001 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 1 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522740 0.0007809388 -0.0000001190 + -0.0000000000 1.6823664904 -0.0000000002 0.0004014245 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002491252 -0.0141752968 -0.0000035319 + -0.0000000000 1.6823664904 -0.0000000002 0.7072145343 0.0000000000 0.0000001686 + 0.0000000001 1.0038089752 0.0000000474 0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6051954031 0.0000001233 0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 -0.0000000002 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000000 1.0172638893 0.0000001436 0.0012860030 -0.0000000000 -0.0000000000 + 0.0000000002 1.6867997646 0.0000001346 0.0088065108 -0.0000000000 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 2 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522733 0.0030870433 -0.0000004701 + 0.0000000000 1.6823667288 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000000 -0.0002491387 0.0096553192 0.0000024055 + 0.0000000000 1.6823667288 -0.0000000000 0.7072144151 0.0000000000 0.0000001686 + -0.0000000001 1.0038089752 -0.0000001216 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000019 1.6051951647 -0.0000003162 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823667288 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000008 1.0172638893 0.0000001437 0.0080480594 -0.0000000000 -0.0000000002 + -0.0000000006 1.6867998838 -0.0000002356 0.0338387787 -0.0000000000 -0.0000000004 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 3 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522705 0.0068626930 -0.0000010450 + -0.0000000000 1.6823660135 0.0000000000 0.0004014244 -0.0000001183 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002488978 0.0450159870 0.0000112156 + -0.0000000000 1.6823660135 0.0000000000 0.7072145343 0.0000000000 0.0000001686 + 0.0000000007 1.0038088560 0.0000000474 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000007 1.6051954031 0.0000001233 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823660135 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000003 1.0172638893 0.0000001436 0.0189933572 0.0000000000 0.0000000000 + -0.0000000040 1.6868000031 0.0000002628 0.0709822550 0.0000000000 -0.0000000010 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 4 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522630 0.0120524950 -0.0000018353 + 0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282187462 -0.0000000003 -0.0002481799 0.0881715864 0.0000219679 + 0.0000000000 1.6823664904 -0.0000000000 0.7072145343 0.0000000000 0.0000001686 + -0.0000000019 1.0038090944 0.0000005243 -0.0000000000 0.0000000000 -0.0000000014 + -0.0000000027 1.6051955223 0.0000006002 -0.0000000000 0.0000000000 -0.0000000014 + 0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000001 1.0172638893 0.0000001436 0.0338583253 0.0000000000 -0.0000000003 + -0.0000000112 1.6867996454 -0.0000001846 0.1162938699 0.0000000003 -0.0000000018 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 5 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522477 0.0186010450 -0.0000028325 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002468648 0.1351395398 0.0000336699 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 -0.0000000026 0.0000001712 + -0.0000000006 1.0038089752 0.0000005244 -0.0000000000 0.0000000000 0.0000000009 + -0.0000000014 1.6051952839 0.0000006005 -0.0000000000 0.0000000000 0.0000000009 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000289 -0.0000001383 + -0.0000000044 1.0172638893 0.0000001438 0.0523783863 -0.0000000001 0.0000000020 + 0.0000000097 1.6867998838 -0.0000005558 0.1655525118 -0.0000000004 -0.0000000013 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 6 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001522208 0.0264527462 -0.0000040281 + -0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001155 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002449981 0.1818055809 0.0000452968 + -0.0000000000 1.6823664904 -0.0000000000 0.7072145343 0.0000000000 0.0000001686 + -0.0000000029 1.0038089752 0.0000005244 -0.0000000000 -0.0000000000 -0.0000000009 + 0.0000000132 1.6051951647 0.0000006005 -0.0000000000 -0.0000000000 -0.0000000009 + -0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000316 -0.0000001410 + -0.0000000029 1.0172637701 -0.0000003331 0.0742842183 -0.0000000001 -0.0000000011 + 0.0000000008 1.6867996454 -0.0000002992 0.2144013792 -0.0000000002 -0.0000000003 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 7 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001521778 0.0355514809 -0.0000054136 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001136 0.0000000001 + 0.0000000000 1.0282182693 0.0000000001 -0.0002428102 0.2241564095 0.0000558485 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 -0.0000000013 0.0000001725 + -0.0000000067 1.0038089752 0.0000000478 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000111 1.6051954031 0.0000001242 -0.0000000000 -0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000296 -0.0000001416 + -0.0000000067 1.0172638893 0.0000001440 0.0992979035 0.0000000001 -0.0000000059 + -0.0000000166 1.6867995262 -0.0000000312 0.2586210966 0.0000000014 0.0000000046 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 8 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001521140 0.0458404459 -0.0000069803 + -0.0000000000 1.6823667288 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000005 -0.0002406830 0.2584845424 0.0000644014 + -0.0000000000 1.6823667288 0.0000000000 0.7072145343 -0.0000000013 0.0000001725 + 0.0000000028 1.0038089752 -0.0000004288 -0.0000000000 0.0000000000 0.0000000056 + 0.0000000128 1.6051952839 -0.0000003520 -0.0000000000 0.0000000000 0.0000000056 + -0.0000000000 1.6823667288 0.0000000000 -0.7069992423 0.0000000296 -0.0000001416 + -0.0000000121 1.0172637701 0.0000006211 0.1271297634 -0.0000000002 -0.0000000003 + -0.0000000402 1.6867995262 -0.0000000871 0.2943651974 -0.0000000016 0.0000000026 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 9 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001520242 0.0572618246 -0.0000087195 + -0.0000000000 1.6823667288 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000003 -0.0002390801 0.2814303637 0.0000701183 + -0.0000000000 1.6823667288 -0.0000000000 0.7072145343 -0.0000000039 0.0000001699 + -0.0000000038 1.0038089752 0.0000005252 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000214 1.6051952839 0.0000006025 -0.0000000000 -0.0000000000 0.0000000000 + -0.0000000000 1.6823667288 -0.0000000000 -0.7069992423 0.0000000257 -0.0000001403 + 0.0000000037 1.0172638893 -0.0000003323 0.1574763954 -0.0000000000 -0.0000000038 + -0.0000000724 1.6868000031 -0.0000001676 0.3181996644 0.0000000032 -0.0000000026 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 10 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001519031 0.0697563663 -0.0000106221 + -0.0000000000 1.6823662519 -0.0000000001 0.0004014244 -0.0000001229 0.0000000001 + 0.0000000000 1.0282182693 0.0000000003 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823662519 -0.0000000001 0.7072144151 0.0000000000 0.0000001686 + 0.0000000032 1.0038089752 -0.0000001203 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000081 1.6051954031 -0.0000003129 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823662519 -0.0000000001 -0.7069991231 0.0000000309 -0.0000001377 + 0.0000000032 1.0172638893 -0.0000001603 0.1900207698 0.0000000002 0.0000000315 + 0.0000000743 1.6867997646 -0.0000004303 0.3268856704 0.0000000064 0.0000000426 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 11 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001517460 0.0832075551 -0.0000126704 + -0.0000000000 1.6823662519 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823662519 -0.0000000000 0.7072144151 0.0000000000 0.0000001686 + 0.0000000166 1.0038089752 -0.0000001198 -0.0000000000 0.0000000000 0.0000000037 + -0.0000000082 1.6051956415 -0.0000003115 -0.0000000000 0.0000000000 0.0000000037 + -0.0000000000 1.6823662519 -0.0000000000 -0.7069991231 0.0000000309 -0.0000001377 + 0.0000000166 1.0172640085 -0.0000001597 0.2244939208 0.0000000004 0.0000000297 + -0.0000000525 1.6867994070 0.0000000428 0.3209972084 0.0000000034 0.0000000502 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 12 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001515526 0.0972274616 -0.0000148053 + -0.0000000000 1.6823662519 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000002 -0.0002384582 0.2898047864 0.0000722048 + -0.0000000000 1.6823662519 0.0000000000 0.7072144747 0.0000000000 0.0000001686 + -0.0000000004 1.0038089752 -0.0000004268 -0.0000000000 0.0000000000 -0.0000000149 + 0.0000000198 1.6051956415 -0.0000003468 -0.0000000000 0.0000000000 -0.0000000149 + -0.0000000000 1.6823662519 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000145 1.0172638893 0.0000006231 0.2600955665 -0.0000000006 0.0000000240 + 0.0000000242 1.6867995262 0.0000001453 0.3049138486 0.0000000036 0.0000000586 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 13 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001513271 0.1113469452 -0.0000169553 + 0.0000000000 1.6823667288 0.0000000000 0.0004014244 -0.0000001155 0.0000000001 + -0.0000000001 1.0282182693 0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + 0.0000000000 1.6823667288 0.0000000000 0.7072144151 0.0000000105 0.0000001791 + -0.0000000027 1.0038089752 -0.0000005951 0.0000000000 -0.0000000000 0.0000000000 + 0.0000000023 1.6051954031 -0.0000007843 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823667288 0.0000000000 -0.7069992423 0.0000000415 -0.0000001482 + -0.0000000027 1.0172638893 0.0000006240 0.2956701815 -0.0000000019 0.0000000218 + -0.0000000373 1.6867995262 0.0000001416 0.2809669077 0.0000000075 0.0000000486 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 14 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001510779 0.1250958145 -0.0000190489 + 0.0000000000 1.6823664904 -0.0000000001 0.0004014244 -0.0000001118 0.0000000001 + 0.0000000000 1.0282182693 -0.0000000000 -0.0002384582 0.2898047566 0.0000722048 + 0.0000000000 1.6823664904 -0.0000000001 0.7072144747 0.0000000053 0.0000001686 + -0.0000000045 1.0038089752 0.0000000516 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000303 1.6051952839 0.0000001343 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 -0.0000000001 -0.7069992423 0.0000000282 -0.0000001403 + -0.0000000343 1.0172638893 0.0000006247 0.3300409615 -0.0000000002 0.0000000325 + -0.0000000204 1.6867997646 -0.0000000522 0.2515513599 -0.0000000046 0.0000000450 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 15 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001508170 0.1380039304 -0.0000210145 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 0.0000000003 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 0.0000000000 0.7072144747 0.0000000000 0.0000001686 + -0.0000000200 1.0038089752 0.0000000527 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000743 1.6051955223 0.0000001369 -0.0000000000 0.0000000000 0.0000000000 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000200 1.0172640085 0.0000006258 0.3620411456 0.0000000009 0.0000000207 + 0.0000001122 1.6868000031 -0.0000000373 0.2192079574 -0.0000000036 0.0000000402 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 16 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001505604 0.1496035010 -0.0000227808 + 0.0000000000 1.6823662519 0.0000000001 0.0004014245 -0.0000001490 0.0000000001 + -0.0000000000 1.0282177925 0.0000000002 -0.0002384583 0.2898046970 0.0000722048 + 0.0000000000 1.6823662519 0.0000000001 0.7072145343 -0.0000000158 0.0000001739 + 0.0000000257 1.0038089752 0.0000000534 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000214 1.6051954031 0.0000001389 -0.0000000000 -0.0000000000 0.0000000000 + 0.0000000000 1.6823662519 0.0000000001 -0.7069992423 0.0000000257 -0.0000001219 + 0.0000000257 1.0172638893 0.0000001497 0.3905433416 -0.0000000016 0.0000000269 + -0.0000001459 1.6868002415 -0.0000002533 0.1866219640 0.0000000142 0.0000000415 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 17 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001503263 0.1594295800 -0.0000242770 + 0.0000000000 1.6823664904 -0.0000000000 0.0004014244 -0.0000001192 0.0000000001 + -0.0000000000 1.0282182693 0.0000000003 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 -0.0000000000 0.7072144747 -0.0000000053 0.0000001739 + 0.0000000436 1.0038089752 0.0000000544 -0.0000000000 -0.0000000000 0.0000000075 + -0.0000000206 1.6051952839 0.0000001415 -0.0000000000 -0.0000000000 0.0000000075 + 0.0000000000 1.6823664904 -0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000160 1.0172638893 0.0000001507 0.4144768417 -0.0000000065 0.0000000225 + 0.0000000429 1.6867992878 -0.0000002980 0.1565571874 -0.0000000064 0.0000000583 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 18 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001501351 0.1670198888 -0.0000254328 + 0.0000000000 1.6823664904 0.0000000000 0.0004014244 -0.0000001267 0.0000000001 + -0.0000000000 1.0282182693 -0.0000000002 -0.0002384582 0.2898047268 0.0000722048 + 0.0000000000 1.6823664904 0.0000000000 0.7072145343 0.0000000000 0.0000001686 + 0.0000000047 1.0038089752 0.0000000550 -0.0000000000 -0.0000000000 0.0000000075 + -0.0000000202 1.6051952839 0.0000001431 -0.0000000000 0.0000000000 0.0000000075 + 0.0000000000 1.6823664904 0.0000000000 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000048 1.0172638893 -0.0000003255 0.4328215122 -0.0000000056 0.0000000314 + -0.0000000536 1.6868004799 -0.0000000745 0.1317730397 -0.0000000069 0.0000000533 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 19 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001500070 0.1719134748 -0.0000261780 + -0.0000000000 1.6823664904 0.0000000002 0.0004014244 -0.0000001192 0.0000000001 + 0.0000000000 1.0282177925 -0.0000000001 -0.0002384582 0.2898046970 0.0000722048 + -0.0000000000 1.6823664904 0.0000000002 0.7072145343 0.0000000000 0.0000001686 + -0.0000000009 1.0038089752 0.0000000554 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000556 1.6051956415 0.0000001441 -0.0000000000 0.0000000000 0.0000000000 + -0.0000000000 1.6823664904 0.0000000002 -0.7069992423 0.0000000309 -0.0000001377 + -0.0000000009 1.0172638893 0.0000001517 0.4445825219 -0.0000000033 0.0000000193 + -0.0000000521 1.6868000031 -0.0000003427 0.1149683520 -0.0000000006 0.0000000476 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + +frame 20 { + 0.0000000000 0.0000000000 0.0000000000 -0.7071068287 -0.0000000000 -0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.0001499606 0.1736480743 -0.0000264421 + 0.0000000000 1.6823662519 0.0000000001 0.0004014244 -0.0000001267 0.0000000001 + -0.0000000001 1.0282177925 0.0000000002 -0.0002384583 0.2898046970 0.0000722048 + 0.0000000000 1.6823662519 0.0000000001 0.7072145343 0.0000000000 0.0000001686 + -0.0000000031 1.0038089752 0.0000000557 -0.0000000000 0.0000000000 -0.0000000075 + 0.0000000017 1.6051952839 0.0000001449 -0.0000000000 0.0000000000 -0.0000000075 + 0.0000000000 1.6823662519 0.0000000001 -0.7069992423 0.0000000309 -0.0000001377 + 0.0000000267 1.0172640085 0.0000001520 0.4487406611 -0.0000000018 0.0000000778 + -0.0000000491 1.6867994070 -0.0000004619 0.1087833345 -0.0000000035 0.0000000230 + 0.0000000000 2.9222633839 0.0000000000 0.7113879919 -0.0000000000 -0.0000000000 + 0.0000000000 0.4849954247 -0.0000000168 0.7027995586 -0.0000000848 0.0000000838 + 0.0000000000 1.3662177324 0.0000000481 -0.0000000005 0.0000001192 0.0000000000 + 0.0000000000 2.9222633839 0.0000000000 -0.7112751007 0.0000003352 0.0000003392 + -0.0000000000 0.5501294136 -0.0000001211 -0.7029137611 0.0000000000 0.0000006704 + -0.0000000000 1.3662177324 0.0000000257 0.0000000000 0.0000000000 -0.0000000000 +} + diff --git a/examples/nitro_engine/using_nflib/assets/sprite/character.png b/examples/nitro_engine/using_nflib/assets/sprite/character.png new file mode 100644 index 0000000..303f27c Binary files /dev/null and b/examples/nitro_engine/using_nflib/assets/sprite/character.png differ diff --git a/examples/nitro_engine/using_nflib/build.py b/examples/nitro_engine/using_nflib/build.py new file mode 100644 index 0000000..9997d48 --- /dev/null +++ b/examples/nitro_engine/using_nflib/build.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2024 + +from architectds import * + +nitrofs = NitroFS() +nitrofs.add_grit(['assets/robot']) +nitrofs.add_nitro_engine_md5(['assets/robot']) +nitrofs.add_nflib_bg_tiled(['assets/bg'], 'bg') +nitrofs.add_nflib_sprite_256(['assets/sprite'], 'sprite') +nitrofs.add_nflib_font(['assets/fnt'], 'fnt') +nitrofs.generate_image() + +arm9 = Arm9Binary( + sourcedirs=['source'], + libs=['NE', 'nflib', 'nds9'], + libdirs=[ + '${BLOCKSDS}/libs/libnds', + '${BLOCKSDSEXT}/nitro-engine', + '${BLOCKSDSEXT}/nflib' + ] +) +arm9.generate_elf() + +nds = NdsRom( + binaries=[arm9, nitrofs], + game_title='NE: NFlib: Template', +) +nds.generate_nds() + +nds.run_command_line_arguments() diff --git a/examples/nitro_engine/using_nflib/source/main.c b/examples/nitro_engine/using_nflib/source/main.c new file mode 100644 index 0000000..b3e90f8 --- /dev/null +++ b/examples/nitro_engine/using_nflib/source/main.c @@ -0,0 +1,298 @@ +// SPDX-License-Identifier: CC0-1.0 +// +// SPDX-FileContributor: Antonio Niño Díaz, 2008-2011, 2019, 2022-2023 +// SPDX-FileContributor: NightFox, 2009-2011 +// +// This file is part of Nitro Engine + +// NightFox’s Lib (NFlib) is a library that can supports the 2D hardware of the +// NDS. It's ideal to complement Nitro Engine, as it only supports the 3D +// hardware. The latest version can be found at the following link: +// +// https://github.com/knightfox75/nds_nflib +// +// A few notes: +// +// - Remember to avoid using 3D features of NFlib. +// +// - Don't use the dual 3D mode in Nitro Engine. +// +// - You are free to use any features of NFlib in the secondary screen, but you +// need to assign VRAM C and D to NFlib to get space for sprites and +// backgrounds. +// +// - You could load 2D background and sprites in the same screen as the 3D +// rendering, but you will have to give up VRAM banks A and B. If you also use +// banks C and D for the secondary screen, it will leave you without any VRAM +// for textures. + +#include +#include +#include + +#include +#include +#include +#include + +NE_Camera *Camera; +NE_Model *Model; +NE_Animation *Animation; +NE_Material *Material; + +void Draw3DScene(void) +{ + NE_CameraUse(Camera); + + NE_PolyFormat(31, 0, NE_LIGHT_0, NE_CULL_NONE, 0); + NE_ModelDraw(Model); +} + +void WaitLoop(void) +{ + while(1) + swiWaitForVBlank(); +} + +void LoadAndSetupGraphics3D(void) +{ + // When using nflib for the 2D sub screen engine, banks C and H are used for + // backgrounds and banks D and I are used for sprites. Nitro Engine only + // uses bank E for palettes, so the only thing we need to do is to tell + // Nitro Engine to only use banks A and B and leave C and D unused. + + NE_Init3D(); + NE_TextureSystemReset(0, 0, NE_VRAM_AB); + + // Create objects + + Model = NE_ModelCreate(NE_Animated); + Camera = NE_CameraCreate(); + Material = NE_MaterialCreate(); + Animation = NE_AnimationCreate(); + + // Load assets from the filesystem + + if (NE_ModelLoadDSMFAT(Model, "models/robot.dsm") == 0) + { + consoleDemoInit(); + printf("Couldn't load model..."); + WaitLoop(); + } + + if (NE_AnimationLoadFAT(Animation, "models/robot_wave.dsa") == 0) + { + consoleDemoInit(); + printf("Couldn't load animation..."); + WaitLoop(); + } +/* + if (NE_MaterialTexLoadFAT(Material, NE_A1RGB5, 256, 256, NE_TEXGEN_TEXCOORD, + "texture_tex.bin") == 0) + { + consoleDemoInit(); + printf("Couldn't load texture..."); + WaitLoop(); + } +*/ + if (NE_MaterialTexLoadGRF(Material, NULL, NE_TEXGEN_TEXCOORD, + "grit/robot_png.grf") == 0) + { + consoleDemoInit(); + printf("Failed to load GRF 2\n"); + WaitLoop(); + } + + // Assign material to the model + NE_ModelSetMaterial(Model, Material); + + // Assign animation to the model and start it + NE_ModelSetAnimation(Model, Animation); + NE_ModelAnimStart(Model, NE_ANIM_LOOP, floattof32(0.1)); + + // Setup light + NE_LightSet(0, NE_White, 0, -1, -1); + + // Setup background color + NE_ClearColorSet(NE_Black, 31, 63); + + // Setup camera + NE_CameraSet(Camera, + 6, 3, -4, + 0, 3, 0, + 0, 1, 0); +} + +void LoadAndSetupGraphics2D(void) +{ + // Initialize sub 2D engine + NF_Set2D(1, 0); + + // Initialize sprites for sub screen (it uses VRAM D and I) + NF_InitSpriteBuffers(); + NF_InitSpriteSys(1); + + // Load assets from filesystem to RAM + NF_LoadSpriteGfx("sprite/character", 1, 64, 64); + NF_LoadSpritePal("sprite/character", 1); + + // Copy all frames to VRAM + NF_VramSpriteGfx(1, 1, 0, false); + NF_VramSpritePal(1, 1, 0); + + // Display sprite on the screen + NF_CreateSprite(1, 0, 0, 0, 0, 0); + + // Initialize tiled backgrounds and text systems for the 2D sub engine (it + // uses VRAM C and H) + NF_InitTiledBgBuffers(); + NF_InitTiledBgSys(1); + NF_InitTextSys(1); + + // Load assets from filesystem to RAM + NF_LoadTiledBg("bg/bg3", "capa_3", 256, 256); + NF_LoadTiledBg("bg/bg1", "capa_1", 1536, 256); + NF_LoadTiledBg("bg/bg0", "capa_0", 2048, 256); + NF_LoadTextFont("fnt/default", "normal", 256, 256, 0); + + // Create tiled backgrounds + NF_CreateTiledBg(1, 3, "capa_3"); + NF_CreateTiledBg(1, 2, "capa_1"); + NF_CreateTiledBg(1, 1, "capa_0"); + + // Create text layer + NF_CreateTextLayer(1, 0, 0, "normal"); +} + +int main(void) +{ + // Initialize nitroFS before doing anything else + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("Starting nitroFS...\n"); + if (!nitroFSInit(NULL)) + { + printf("Failed to start nitroFS\n"); + printf("Press START to exit\n"); + + while (1) + { + swiWaitForVBlank(); + scanKeys(); + if (keysHeld() & KEY_START) + return -1; + } + } + + swiWaitForVBlank(); + + // Set the root folder to the nitroFS filesystem + NF_SetRootFolder("NITROFS"); + + // Setup interrupt handlers + irqEnable(IRQ_HBLANK); + irqSet(IRQ_VBLANK, NE_VBLFunc); + irqSet(IRQ_HBLANK, NE_HBLFunc); + + // Load and setup graphics + LoadAndSetupGraphics3D(); + LoadAndSetupGraphics2D(); + + // Initialize variables to control the sprite + int pj_x = 0; + int pj_y = 127; + unsigned int pj_frame = 0; + unsigned int pj_anim_ticks = 0; + int pj_speed = 1; + + // Initialize variables to control the backgrounds + int bg_x[4] = {0, 0, 0}; + + // Print instructions for the user + NF_WriteText(1, 0, 1, 1, "PAD: Rotate model"); + NF_WriteText(1, 0, 1, 2, "L/R: Scroll background"); + NF_WriteText(1, 0, 1, 3, "START: Exit"); + NF_UpdateTextLayers(); + + while (1) + { + NE_WaitForVBL(NE_UPDATE_ANIMATIONS); + + // At this point we are in the vertical blank period. This is where 2D + // elements have to be updated to avoid flickering. + + // Update the scroll of the backgrounds + for (int n = 0; n < 3; n ++) + NF_ScrollBg(1, n + 1, bg_x[n], 0); + + // Copy shadow OAM copy to the OAM of the 2D sub engine + oamUpdate(&oamSub); + + // Start processing a new frame after the 2D elements have been updated. + + scanKeys(); + uint32_t keys = keysHeld(); + + if (keys & KEY_START) + break; + + if (keys & KEY_RIGHT) + NE_ModelRotate(Model, 0, 2, 0); + if (keys & KEY_LEFT) + NE_ModelRotate(Model, 0, -2, 0); + if (keys & KEY_UP) + NE_ModelRotate(Model, 0, 0, 2); + if (keys & KEY_DOWN) + NE_ModelRotate(Model, 0, 0, -2); + + if (keys & KEY_L) + { + bg_x[0] -= 2; + if (bg_x[0] < 0) + bg_x[0] = 0; + } + + if (keys & KEY_R) + { + bg_x[0] += 2; + if (bg_x[0] > 1152) + bg_x[0] = 1152; + } + + // For the parallax effect, calculate the scroll of the second layer + // based on the scroll of the first one. + bg_x[1] = bg_x[0] / 2; + + // Move sprite + pj_x += pj_speed; + if ((pj_x < 0) || (pj_x > 191)) + { + pj_speed = -pj_speed; + if (pj_speed > 0) + NF_HflipSprite(1, 0, false); + else + NF_HflipSprite(1, 0, true); + } + NF_MoveSprite(1, 0, pj_x, pj_y); + + // Animate sprite + pj_anim_ticks++; + if (pj_anim_ticks > 5) + { + pj_anim_ticks = 0; + pj_frame++; + if (pj_frame > 11) + pj_frame = 0; + NF_SpriteFrame(1, 0, pj_frame); + } + + // Refresh shadow OAM copy + NF_SpriteOamSet(1); + + // Draw 3D scene + NE_Process(Draw3DScene); + } + + return 0; +} diff --git a/readme.rst b/readme.rst new file mode 100644 index 0000000..5b846ef --- /dev/null +++ b/readme.rst @@ -0,0 +1,259 @@ +ArchitectDS +=========== + +This is a build system for NDS ROMs meant to be used with BlocksDS. It allows +you to easily define source directories, libraries, etc; and define the location +of assets and their destination (NitroFS or CPU data). + +- ARM9 and ARM7 binaries can have a custom list of libraries, definitions and + source code directories. + +- If an ARM7 isn't defined, it will use the default ARM7 binary of BlocksDS. + +- Assets such as images and audio files can be converted as part of the build + process and added to NitroFS or the CPU binary as data. + +- An arbitrary number of DSP binaries can be built, and they can be stored in + NitroFS or in a CPU binary as data. + +- Popular NDS libraries and tools are supported: + + - grit: Converted assets are saved as GRF files in NitroFS, or as binary files + if they need to be added as data to a CPU binary as an array. + + - Maxmod: Soundbanks can be generated to NitroFS or added as data to the CPU. + + - NFlib: Assets are converted and saved to NitroFS. Shared palettes are + supported. + + - Nitro Engine: Static and animated models are supported. + + - ptexconv: Used to generate textures in Tex4x4 format. + + - libxm7, dswifi, gbajpg and other libraries that don't require special + tooling are also supported. + +Note that this is still an early version of the build system. If you need a +feature, or a suggestion, feel free to create issues in the repository. + +For an example of using Nitro Engine, NFlib and libnds at the same time, check +`this example `__. + +For an example of using the DSP, check `this example `__. + +For an example of debug/release builds, check `this example +`__. + +Dependencies +------------ + +You need to install Ninja and Python 3. In Ubuntu or Debian simply run: + +.. code:: bash + + sudo apt install python3 ninja-build + +Setup +----- + +If you don't want to install it in your system, you can just copy the +``architectds`` folder to your project. Then, you will be able to import the module +with: + +.. code:: python + + from architectds import * + +If you want to install it in your system instead of copying the folder, follow +the steps below: + +.. code:: bash + + # Create and activate venv + sudo apt install python3-venv + python3 -m venv env + source env/bin/activate + + # Install dependencies + pip3 install wheel setuptools + + # Create wheel + python3 setup.py bdist_wheel + + # Install wheel + pip3 install dist/architectds-*-py3-none-any.whl + +Examples +-------- + +There are lots of examples that show how to use most features. To build any of +the examples, run ``python3 build.py`` in the folder of the example. + +- **libnds/**: Examples with the default BlocksDS libraries. + + - ``all``: It shows how to do most things supported by libnds and other very + common libraries: + + - DSP: One binary stored in NitroFS, one binary added to the ARM9 as data. + - NitroFS: Graphics files converted with grit to GRF format, audio files + converted with mmutil into a soundbank. + - ARM9: Graphics files converted with grit and added as data. Data files + added to the ARM9 binary. Audio files converted into a soundbank with + mmutil and added to the ARM9 binary. + - ARM7: With Maxmod and dswifi. Data files are added to it. + - NDS: NitroFS directories. Custom ROM title, subtitles, and icon. + + - ``arm9``: Simple ROM with only a source file for the ARM9 and default ARM7. + + - ``arm9_arm7``: Example of developing custom ARM9 and ARM7 binaries. + + - ``arm9_nitrofs``: Simple ROM with only a source file for the ARM9, default + ARM7, and NitroFS data files. + + - ``dsp``: Example of loading DSP binaries from memory and NitroFS. + + - ``opengl``: Example of converting graphics and displaying them with OpenGL. + +- **libxm7/**: + + - ``play_songs``: Example that uses libxm7 instead of Maxmod to play music. + +- **maxmod/**: + + - ``audio_as_data``: Example of using Maxmod with ARM9 data as a soundbank. + + - ``audio_in_nitrofs``: Example of using Maxmod with a soundbank in NitroFS. + +- **nflib/**: NFlib examples ported to ArchitectDS. + + - ``3dsprites``: Tiled backgrounds and 3D sprites. + + - ``collisions``: Multiple examples that show pixel-perfect collisions, as + well as tile-based collisions. + + - **graphics/**: + + - ``affine``: Affine backgrounds with and without shared palettes. + + - ``animatedbg``: Animated tiled background. + + - ``backbuffer3``: 16 bit background. + + - ``bg``: Tiled backgrounds. + + - ``bg16bits``: 16 bit backgrounds. + + - ``bgmixed``: Tiled and 8 bit backgrounds. 256 color sprites. Custom fonts. + + - ``bgtiled_spr256``: Tiled backgrounds, 256 color sprites, 8 bit + backgrounds with shared palettes. + + - ``textdemo``: Tiled backgrounds and custom fonts. + +- **nitro_engine/**: Nitro Engine examples ported to ArchitectDS. + + - ``animated_model``: MD5 animated model and 16 bit texture converted with + grit added to the ARM9 as binary data. + + - ``error_handling``: Shows how to have release and debug builds with debug + messages. + + - ``filesystem_animated_model``: MD5 animated model and 16 bit texture + converted with grit and added to NitroFS. + + - ``filesystem_compressed_texture``: Texture converted to Tex4x4 with ptexconv + and saved to NitroFS. + + - ``filesystem_paletted_texture``: Paletted textures converted with grit to + GRF format and saved to NitroFS. + + - ``filesystem_simple_model``: OBJ static model and 16 bit texture converted + with grit and added to NitroFS. + + - ``model_with_vertex_color``: OBJ static model with vertex color information. + + - ``paletted_texture``: Paletted textures converted with grit to GRF format + and saved to the ARM9 as binary data. + + - ``sdroot_animated_model``: MD5 animated model and 16 bit texture converted + with grit and stored in the SD card. + + - ``simple_model``: OBJ static model and 16 bit texture converted with grit + and added to the ARM9 as binary data. + + - ``specular_material``: OBJ static model and 16 bit texture converted with + grit and added to the ARM9 as binary data. + +Usage guide +----------- + +With this build system you need to create an ``Arm9Binary`` object, with a list +of source code directories, defines, include directories, libraries (and things +like CFLAGS, ASFLAGS, CXXFLAGS and LDFLAGS). This object can take any number of +assets through some functions like ``add_data()``, ``add_grit()`` or +``add_tlf()``. Check the examples for more information. + +By default, assets functions will use a default path as destination. To define a +custom output path in any of the functions that include assets, set ``out_dir`` +to the desired path: + +.. code:: python + + # This will use the default path: + arm9.add_grit(['graphics/trees']) + arm9.add_grit(['graphics/food']) + + # This will set a different path: + arm9.add_grit(['graphics/animals'], 'graphics/animals') + arm9.add_grit(['graphics/rocks'], 'graphics/rocks') + +When you're happy with your ARM9 binary, you can do the same thing with an +``Arm7Binary`` object if you want a custom ARM7 binary. If you don't create one, +the default BlocksDS binary will be used. You can also add assets to this binary, +but it only makes sense to use ``add_data()``. + +You can also create a ``NitroFS`` object. This object is only used for assets +that need to be converted. For folders that need to be added as they are, check +the ``NdsRom`` class below. The ``NitroFS`` object can take any number of +graphics files to be converted with ``grit`` or ``ptexconv``, audio files that +are converted with ``mmutil``, or even 3D models to be used with Nitro Engine. + +If you want to store your files in your SD card instead of the NitroFS +filesystem, you can create a ``FatFS`` object instead. It behaves the same way +as ``NitroFS``, but it will use your chosen folder as a root folder for the +generated files. You will need to copy them to your SD card yourself. + +If you want to create DSP binaries, you need to create ``TeakBinary`` objects in +a similar way as ARM binaries. + +Finally, once you have all your objects, you need to create an ``NdsRom`` +object. This object takes a list of binaries (NitroFS, ARM9, ARM7, DSP) and adds +them to the ROM. It can also take a list of paths to directories to be added to +NitroFS right as they are without any modifications. All directories passed in +this list will be added to the root of the filesystem. If a file is found in +multiple trees it will cause an error. + +As mentioned previously, if no ARM7 binary is added to the ROM, the default +BlocksDS binary will be used. + +You can also define the header title and subtitles, and the game icon here. + +Once your objects are ready, ``run_command_line_arguments()`` will check the +arguments passed to the python script: + +- ``python3 build.py``: Create a ``ninja.build`` file and build the ROM. + Equivalent to ``python3 build.py --build``. + +- ``python3 build.py --clean``: Clean all build files. + +- ``python3 build.py --graph``: If you have ``graphviz`` installed in your + system, this will generate a PNG file with the dependency graph of your + project. + +- ``python3 build.py --ninja``: Create a ``ninja.build`` file and exit. + +Note that this is just a python script. At any point in the script you can check +``sys.argv`` for your own arguments and change the build definitions based on +them. The ``debug_build`` example in the ``libnds`` folder and the +``error_handling`` example in the ``nitro_engine`` folder use this to handle +debug and release builds differently in the same project. diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..c1562f8 --- /dev/null +++ b/setup.py @@ -0,0 +1,26 @@ +import os + +from setuptools import setup +from architectds import __author__, __version__ + +def read_file(name): + return open(os.path.join(os.path.dirname(__file__), name)).read() + +setup( + name = 'architectds', + version = __version__, + author = __author__, + description = ( + 'A high-level build system for Nintendo DS homebrew that generates ' + 'files for the ninja build system.' + ), + license = 'MIT', + url = 'https://github.com/blocksds/architectds', + packages = ['architectds'], + long_description=read_file('readme.rst'), + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Topic :: Software Development :: Build Tools', + 'License :: OSI Approved :: MIT License', + ], +)