diff --git a/CMakeLists.txt b/CMakeLists.txt index e73bf5f526e..4d9656c4060 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -476,8 +476,6 @@ option(WITH_FRIBIDI "Enable features relying on fribidi" OFF) option(WITH_HARFBUZZ "Enable features relying on harfbuzz" OFF) # 3D format support -# Disable opencollada when we don't have precompiled libs -option(WITH_OPENCOLLADA "Enable OpenCollada Support (http://www.opencollada.org)" ON) option(WITH_IO_WAVEFRONT_OBJ "Enable Wavefront-OBJ 3D file format support (*.obj)" ON) option(WITH_IO_PLY "Enable PLY 3D file format support (*.ply)" ON) option(WITH_IO_STL "Enable STL 3D file format support (*.stl)" ON) @@ -2779,7 +2777,6 @@ if(FIRST_RUN) info_cfg_option(WITH_INPUT_IME) info_cfg_option(WITH_INTERNATIONAL) info_cfg_option(WITH_MANIFOLD) - info_cfg_option(WITH_OPENCOLLADA) info_cfg_option(WITH_OPENCOLORIO) info_cfg_option(WITH_OPENIMAGEDENOISE) info_cfg_option(WITH_OPENSUBDIV) diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index af93de42f79..4b8b154b5f8 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -58,7 +58,6 @@ include(cmake/epoxy.cmake) include(cmake/alembic.cmake) include(cmake/opensubdiv.cmake) include(cmake/sdl.cmake) -include(cmake/opencollada.cmake) if(UNIX) include(cmake/nasm.cmake) endif() diff --git a/build_files/build_environment/cmake/download.cmake b/build_files/build_environment/cmake/download.cmake index cab987c2ea8..ae16c37b447 100644 --- a/build_files/build_environment/cmake/download.cmake +++ b/build_files/build_environment/cmake/download.cmake @@ -89,7 +89,6 @@ download_source(EPOXY) download_source(ALEMBIC) download_source(OPENSUBDIV) download_source(SDL) -download_source(OPENCOLLADA) download_source(OPENCOLORIO) download_source(MINIZIPNG) download_source(LLVM) diff --git a/build_files/build_environment/cmake/opencollada.cmake b/build_files/build_environment/cmake/opencollada.cmake deleted file mode 100644 index 50cb7ba09f1..00000000000 --- a/build_files/build_environment/cmake/opencollada.cmake +++ /dev/null @@ -1,83 +0,0 @@ -# SPDX-FileCopyrightText: 2002-2022 Blender Authors -# -# SPDX-License-Identifier: GPL-2.0-or-later - -if(UNIX) - set(OPENCOLLADA_EXTRA_ARGS - -DLIBXML2_INCLUDE_DIR=${LIBDIR}/xml2/include/libxml2 - -DLIBXML2_LIBRARIES=${LIBDIR}/xml2/lib/libxml2.a) - - # WARNING: the patch contains mixed UNIX and DOS line endings - # as does the OPENCOLLADA package, if this can be corrected upstream that would be better. - # For now use `sed` to force UNIX line endings so the patch applies. - # Needed as neither ignoring white-space or applying as a binary resolve this problem. - if(APPLE) - set(_dos2unix dos2unix) - else() - set(_dos2unix sed -i "s/\\r//") - endif() - set(PATCH_MAYBE_DOS2UNIX_CMD - ${_dos2unix} - ${BUILD_DIR}/opencollada/src/external_opencollada/CMakeLists.txt - ${BUILD_DIR}/opencollada/src/external_opencollada/Externals/LibXML/CMakeLists.txt - ) -else() - set(OPENCOLLADA_EXTRA_ARGS - -DCMAKE_DEBUG_POSTFIX=_d - -DLIBXML2_INCLUDE_DIR=${LIBDIR}/xml2/include/libxml2 - ) - if(BUILD_MODE STREQUAL Release) - list(APPEND OPENCOLLADA_EXTRA_ARGS -DLIBXML2_LIBRARIES=${LIBDIR}/xml2/lib/libxml2s.lib) - else() - list(APPEND OPENCOLLADA_EXTRA_ARGS -DLIBXML2_LIBRARIES=${LIBDIR}/xml2/lib/libxml2sd.lib) - endif() - set(PATCH_MAYBE_DOS2UNIX_CMD) -endif() - -ExternalProject_Add(external_opencollada - URL file://${PACKAGE_DIR}/${OPENCOLLADA_FILE} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH ${OPENCOLLADA_HASH_TYPE}=${OPENCOLLADA_HASH} - PREFIX ${BUILD_DIR}/opencollada - - PATCH_COMMAND - ${PATCH_MAYBE_DOS2UNIX_CMD} - - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opencollada - ${DEFAULT_CMAKE_FLAGS} - ${OPENCOLLADA_EXTRA_ARGS} - - INSTALL_DIR ${LIBDIR}/opencollada -) - -unset(PATCH_MAYBE_DOS2UNIX_CMD) - -add_dependencies( - external_opencollada - external_xml2 -) - -if(WIN32) - if(BUILD_MODE STREQUAL Release) - ExternalProject_Add_Step(external_opencollada after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/opencollada/ - ${HARVEST_TARGET}/opencollada/ - - DEPENDEES install - ) - endif() - if(BUILD_MODE STREQUAL Debug) - ExternalProject_Add_Step(external_opencollada after_install - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${LIBDIR}/opencollada/lib - ${HARVEST_TARGET}/opencollada/lib - - DEPENDEES install - ) - endif() -else() - harvest(external_opencollada opencollada/include/opencollada opencollada/include "*.h") - harvest(external_opencollada opencollada/lib/opencollada opencollada/lib "*.a") -endif() diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 7ec6a8b4821..702455df28a 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -232,14 +232,6 @@ set(SDL_HOMEPAGE https://www.libsdl.org) set(SDL_LICENSE SPDX:Zlib) set(SDL_COPYRIGHT "Copyright (C) 1997-2020 Sam Lantinga ") -set(OPENCOLLADA_VERSION dfc341ab0b3b23ee307ab8660c0213e64da1eac6) -set(OPENCOLLADA_URI https://github.com/aras-p/OpenCOLLADA/archive/${OPENCOLLADA_VERSION}.tar.gz) -set(OPENCOLLADA_HASH 2120c8c02aab840e81cb87e625a608f7) -set(OPENCOLLADA_HASH_TYPE MD5) -set(OPENCOLLADA_FILE opencollada-${OPENCOLLADA_VERSION}.tar.gz) -set(OPENCOLLADA_LICENSE SPDX:MIT) -set(OPENCOLLADA_COPYRIGHT "Copyright (c) 2008-2009 NetAllied Systems GmbH") - set(OPENCOLORIO_VERSION 2.4.1) set(OPENCOLORIO_URI https://github.com/AcademySoftwareFoundation/OpenColorIO/archive/v${OPENCOLORIO_VERSION}.tar.gz) set(OPENCOLORIO_HASH a11368ef8f001837f29b7dd18dbd2290) diff --git a/build_files/build_environment/cmake/xml2.cmake b/build_files/build_environment/cmake/xml2.cmake index 7b197fda2b7..14d94947585 100644 --- a/build_files/build_environment/cmake/xml2.cmake +++ b/build_files/build_environment/cmake/xml2.cmake @@ -40,7 +40,7 @@ endif() if(UNIX) if(APPLE) - harvest(external_xml2 xml2/lib opencollada/lib "*.a") + harvest(external_xml2 xml2/lib xml2/lib "*.a") else() harvest(external_xml2 xml2/include xml2/include "*.h") harvest(external_xml2 xml2/lib xml2/lib "*.a") diff --git a/build_files/build_environment/dependencies.dot b/build_files/build_environment/dependencies.dot index 6afb219f3f9..b4c071ba603 100644 --- a/build_files/build_environment/dependencies.dot +++ b/build_files/build_environment/dependencies.dot @@ -50,7 +50,6 @@ graph[autosize = false, size = "25.7,8.3!", resolution = 300]; external_numpy -- external_python_site_packages; external_ocloc -- external_igc; external_ocloc -- external_gmmlib; - external_opencollada -- external_xml2; external_opencolorio -- external_yamlcpp; external_opencolorio -- external_expat; external_opencolorio -- external_imath; diff --git a/build_files/build_environment/install_linux_packages.py b/build_files/build_environment/install_linux_packages.py index 93931430d62..ec347616985 100755 --- a/build_files/build_environment/install_linux_packages.py +++ b/build_files/build_environment/install_linux_packages.py @@ -799,14 +799,6 @@ PACKAGES_ALL = ( DISTRO_ID_ARCH: "usd", # No official package, in AUR only currently. }, ), - Package(name="OpenCollada Library", is_mandatory=False, - version="1.6.68", version_short="1.6", version_min="1.6.68", version_mex="1.7", - distro_package_names={DISTRO_ID_DEBIAN: "opencollada-dev", # Useless, very old! - DISTRO_ID_FEDORA: "openCOLLADA-devel", - DISTRO_ID_SUSE: "libopenCOLLADA-devel", - DISTRO_ID_ARCH: "opencollada", - }, - ), Package(name="Embree Library", is_mandatory=False, version="4.3.3", version_short="4.3", version_min="4.3", version_mex="5.0", sub_packages=(), diff --git a/build_files/build_environment/patches/.gitattributes b/build_files/build_environment/patches/.gitattributes deleted file mode 100644 index beb2d800f5b..00000000000 --- a/build_files/build_environment/patches/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Files contains mixed line endings, patch needs to preserve them to apply. -opencollada.diff binary diff --git a/build_files/cmake/Modules/FindOpenCOLLADA.cmake b/build_files/cmake/Modules/FindOpenCOLLADA.cmake deleted file mode 100644 index cda851309ed..00000000000 --- a/build_files/cmake/Modules/FindOpenCOLLADA.cmake +++ /dev/null @@ -1,142 +0,0 @@ -# SPDX-FileCopyrightText: 2011 Blender Authors -# -# SPDX-License-Identifier: BSD-3-Clause - -# - Find OpenCOLLADA library -# Find the native OpenCOLLADA includes and library -# This module defines -# OPENCOLLADA_INCLUDE_DIRS, where to find COLLADABaseUtils/ and -# COLLADAFramework/, Set when OPENCOLLADA_INCLUDE_DIR is found. -# OPENCOLLADA_LIBRARIES, libraries to link against to use OpenCOLLADA. -# OPENCOLLADA_ROOT_DIR, The base directory to search for OpenCOLLADA. -# This can also be an environment variable. -# OPENCOLLADA_FOUND, If false, do not try to use OpenCOLLADA. - -# note about include paths, there are 2 ways includes are set -# -# Where '/usr/include/opencollada' is the root dir: -# /usr/include/opencollada/COLLADABaseUtils/COLLADABUPlatform.h -# -# Where '/opt/opencollada' is the base dir: -# /opt/opencollada/COLLADABaseUtils/include/COLLADABUPlatform.h - -# If `OPENCOLLADA_ROOT_DIR` was defined in the environment, use it. -if(DEFINED OPENCOLLADA_ROOT_DIR) - # Pass. -elseif(DEFINED ENV{OPENCOLLADA_ROOT_DIR}) - set(OPENCOLLADA_ROOT_DIR $ENV{OPENCOLLADA_ROOT_DIR}) -else() - set(OPENCOLLADA_ROOT_DIR "") -endif() - -set(_opencollada_FIND_INCLUDES - COLLADAStreamWriter - COLLADABaseUtils - COLLADAFramework - COLLADASaxFrameworkLoader - GeneratedSaxParser -) - -set(_opencollada_FIND_COMPONENTS - OpenCOLLADAStreamWriter - OpenCOLLADASaxFrameworkLoader - OpenCOLLADAFramework - OpenCOLLADABaseUtils - GeneratedSaxParser - MathMLSolver -) - -# Fedora openCOLLADA package links these statically -# note that order is important here or it won't link -set(_opencollada_FIND_STATIC_COMPONENTS - buffer - ftoa - UTF -) - -set(_opencollada_SEARCH_DIRS - ${OPENCOLLADA_ROOT_DIR} - /opt/lib/opencollada -) - -set(_opencollada_INCLUDES) -foreach(COMPONENT ${_opencollada_FIND_INCLUDES}) - string(TOUPPER ${COMPONENT} UPPERCOMPONENT) - - # need to use this even thouh we are looking for a dir - find_file(OPENCOLLADA_${UPPERCOMPONENT}_INCLUDE_DIR - NAMES - ${COMPONENT}/include - ${COMPONENT} - # Ubuntu ppa needs this. - # Alternative would be to suffix all members of search path - # but this is less trouble, just looks strange. - include/opencollada/${COMPONENT} - include/${COMPONENT}/include - include/${COMPONENT} - HINTS - ${_opencollada_SEARCH_DIRS} - ) - mark_as_advanced(OPENCOLLADA_${UPPERCOMPONENT}_INCLUDE_DIR) - list(APPEND _opencollada_INCLUDES "${OPENCOLLADA_${UPPERCOMPONENT}_INCLUDE_DIR}") -endforeach() - - -set(_opencollada_LIBRARIES) -foreach(COMPONENT ${_opencollada_FIND_COMPONENTS}) - string(TOUPPER ${COMPONENT} UPPERCOMPONENT) - - find_library(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY - NAMES - ${COMPONENT} - HINTS - ${_opencollada_SEARCH_DIRS} - PATH_SUFFIXES - lib64 lib - # Ubuntu ppa needs this. - lib64/opencollada lib/opencollada - ) - mark_as_advanced(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY) - list(APPEND _opencollada_LIBRARIES "${OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY}") -endforeach() - -foreach(COMPONENT ${_opencollada_FIND_STATIC_COMPONENTS}) - string(TOUPPER ${COMPONENT} UPPERCOMPONENT) - - find_library(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY - NAMES - ${COMPONENT} - HINTS - ${_opencollada_SEARCH_DIRS} - PATH_SUFFIXES - lib64 lib - # Ubuntu ppa needs this. - lib64/opencollada lib/opencollada - ) - mark_as_advanced(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY) - if(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY) - list(APPEND _opencollada_LIBRARIES "${OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY}") - endif() -endforeach() - - -# handle the QUIETLY and REQUIRED arguments and set OPENCOLLADA_FOUND to TRUE if -# all listed variables are TRUE -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(OpenCOLLADA DEFAULT_MSG - _opencollada_LIBRARIES _opencollada_INCLUDES) - - -if(OPENCOLLADA_FOUND) - set(OPENCOLLADA_LIBRARIES ${_opencollada_LIBRARIES}) - set(OPENCOLLADA_INCLUDE_DIRS ${_opencollada_INCLUDES}) -endif() - -unset(COMPONENT) -unset(UPPERCOMPONENT) -unset(_opencollada_FIND_COMPONENTS) -unset(_opencollada_FIND_INCLUDES) -unset(_opencollada_FIND_STATIC_COMPONENTS) -unset(_opencollada_INCLUDES) -unset(_opencollada_LIBRARIES) -unset(_opencollada_SEARCH_DIRS) diff --git a/build_files/cmake/config/blender_full.cmake b/build_files/cmake/config/blender_full.cmake index 7ebd66221f6..bd4610712c5 100644 --- a/build_files/cmake/config/blender_full.cmake +++ b/build_files/cmake/config/blender_full.cmake @@ -42,7 +42,6 @@ set(WITH_MOD_REMESH ON CACHE BOOL "" FORCE) set(WITH_UV_SLIM ON CACHE BOOL "" FORCE) set(WITH_NANOVDB ON CACHE BOOL "" FORCE) set(WITH_OPENAL ON CACHE BOOL "" FORCE) -set(WITH_OPENCOLLADA ON CACHE BOOL "" FORCE) set(WITH_OPENCOLORIO ON CACHE BOOL "" FORCE) set(WITH_OPENIMAGEDENOISE ON CACHE BOOL "" FORCE) set(WITH_OPENSUBDIV ON CACHE BOOL "" FORCE) diff --git a/build_files/cmake/config/blender_lite.cmake b/build_files/cmake/config/blender_lite.cmake index e0009c6b8b0..a6056e65cf3 100644 --- a/build_files/cmake/config/blender_lite.cmake +++ b/build_files/cmake/config/blender_lite.cmake @@ -50,7 +50,6 @@ set(WITH_MOD_REMESH OFF CACHE BOOL "" FORCE) set(WITH_UV_SLIM OFF CACHE BOOL "" FORCE) set(WITH_NANOVDB OFF CACHE BOOL "" FORCE) set(WITH_OPENAL OFF CACHE BOOL "" FORCE) -set(WITH_OPENCOLLADA OFF CACHE BOOL "" FORCE) set(WITH_OPENCOLORIO OFF CACHE BOOL "" FORCE) set(WITH_OPENIMAGEDENOISE OFF CACHE BOOL "" FORCE) set(WITH_OPENSUBDIV OFF CACHE BOOL "" FORCE) diff --git a/build_files/cmake/config/blender_release.cmake b/build_files/cmake/config/blender_release.cmake index 259c567fda3..de8629ca4d6 100644 --- a/build_files/cmake/config/blender_release.cmake +++ b/build_files/cmake/config/blender_release.cmake @@ -46,7 +46,6 @@ set(WITH_MOD_REMESH ON CACHE BOOL "" FORCE) set(WITH_UV_SLIM ON CACHE BOOL "" FORCE) set(WITH_NANOVDB ON CACHE BOOL "" FORCE) set(WITH_OPENAL ON CACHE BOOL "" FORCE) -set(WITH_OPENCOLLADA ON CACHE BOOL "" FORCE) set(WITH_OPENCOLORIO ON CACHE BOOL "" FORCE) set(WITH_OPENIMAGEDENOISE ON CACHE BOOL "" FORCE) set(WITH_OPENSUBDIV ON CACHE BOOL "" FORCE) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index 763d32e9586..ad7c52dbd32 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -25,7 +25,7 @@ endfunction() # ------------------------------------------------------------------------ # Find system provided libraries. -# Find system ZLIB, not the pre-compiled one supplied with OpenCollada. +# Find system ZLIB set(ZLIB_ROOT /usr) find_package(ZLIB REQUIRED) find_package(BZip2 REQUIRED) @@ -214,12 +214,6 @@ if(WITH_JACK) string(APPEND PLATFORM_LINKFLAGS " -F/Library/Frameworks -weak_framework jackmp") endif() -if(WITH_OPENCOLLADA) - find_package(OpenCOLLADA) - find_library(XML2_LIBRARIES NAMES xml2 HINTS ${LIBDIR}/opencollada/lib) - print_found_status("XML2" "${XML2_LIBRARIES}") -endif() - if(WITH_SDL) find_package(SDL2) set(SDL_INCLUDE_DIR ${SDL2_INCLUDE_DIRS}) diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 829085c3560..a08c4112c53 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -87,9 +87,7 @@ if(DEFINED LIBDIR) # not need to be ever discovered for the Blender linking. list(REMOVE_ITEM LIB_SUBDIRS ${LIBDIR}/dpcpp) - # NOTE: Make sure "proper" compiled zlib comes first before the one - # which is a part of OpenCollada. They have different ABI, and we - # do need to use the official one. + # NOTE: Make sure "proper" compiled zlib comes first set(CMAKE_PREFIX_PATH ${LIBDIR}/zlib ${LIB_SUBDIRS}) include(platform_old_libs_update) @@ -333,15 +331,6 @@ if(WITH_FFTW3) set_and_warn_library_found("fftw3" FFTW3_FOUND WITH_FFTW3) endif() -if(WITH_OPENCOLLADA) - find_package_wrapper(OpenCOLLADA) - if(OPENCOLLADA_FOUND) - find_package_wrapper(XML2) - else() - set_and_warn_library_found("OpenCollada" OPENCOLLADA_FOUND WITH_OPENCOLLADA) - endif() -endif() - if(WITH_MEM_JEMALLOC) find_package_wrapper(JeMalloc) set_and_warn_library_found("JeMalloc" JEMALLOC_FOUND WITH_MEM_JEMALLOC) @@ -541,13 +530,6 @@ if(WITH_LLVM) find_package_wrapper(Clang) set_and_warn_library_found("Clang" CLANG_FOUND WITH_CLANG) endif() - - # Symbol conflicts with same UTF library used by OpenCollada - if(DEFINED LIBDIR) - if(WITH_OPENCOLLADA AND (${LLVM_VERSION} VERSION_LESS "4.0.0")) - list(REMOVE_ITEM OPENCOLLADA_LIBRARIES ${OPENCOLLADA_UTF_LIBRARY}) - endif() - endif() endif() endif() diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index ae75fcd2d0a..b527f774d50 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -500,45 +500,6 @@ if(WITH_IMAGE_WEBP) set(WEBP_FOUND ON) endif() -if(WITH_OPENCOLLADA) - set(OPENCOLLADA ${LIBDIR}/opencollada) - - set(OPENCOLLADA_INCLUDE_DIRS - ${OPENCOLLADA}/include/opencollada/COLLADAStreamWriter - ${OPENCOLLADA}/include/opencollada/COLLADABaseUtils - ${OPENCOLLADA}/include/opencollada/COLLADAFramework - ${OPENCOLLADA}/include/opencollada/COLLADASaxFrameworkLoader - ${OPENCOLLADA}/include/opencollada/GeneratedSaxParser - ) - - set(OPENCOLLADA_LIBRARIES - optimized ${OPENCOLLADA}/lib/opencollada/OpenCOLLADASaxFrameworkLoader.lib - optimized ${OPENCOLLADA}/lib/opencollada/OpenCOLLADAFramework.lib - optimized ${OPENCOLLADA}/lib/opencollada/OpenCOLLADABaseUtils.lib - optimized ${OPENCOLLADA}/lib/opencollada/OpenCOLLADAStreamWriter.lib - optimized ${OPENCOLLADA}/lib/opencollada/MathMLSolver.lib - optimized ${OPENCOLLADA}/lib/opencollada/GeneratedSaxParser.lib - optimized ${OPENCOLLADA}/lib/opencollada/buffer.lib - optimized ${OPENCOLLADA}/lib/opencollada/ftoa.lib - - debug ${OPENCOLLADA}/lib/opencollada/OpenCOLLADASaxFrameworkLoader_d.lib - debug ${OPENCOLLADA}/lib/opencollada/OpenCOLLADAFramework_d.lib - debug ${OPENCOLLADA}/lib/opencollada/OpenCOLLADABaseUtils_d.lib - debug ${OPENCOLLADA}/lib/opencollada/OpenCOLLADAStreamWriter_d.lib - debug ${OPENCOLLADA}/lib/opencollada/MathMLSolver_d.lib - debug ${OPENCOLLADA}/lib/opencollada/GeneratedSaxParser_d.lib - debug ${OPENCOLLADA}/lib/opencollada/buffer_d.lib - debug ${OPENCOLLADA}/lib/opencollada/ftoa_d.lib - ) - if(EXISTS ${LIBDIR}/xml2/lib/libxml2s.lib) # 3.4 libraries - list(APPEND OPENCOLLADA_LIBRARIES ${LIBDIR}/xml2/lib/libxml2s.lib) - else() - list(APPEND OPENCOLLADA_LIBRARIES ${OPENCOLLADA}/lib/opencollada/xml.lib) - endif() - - list(APPEND OPENCOLLADA_LIBRARIES ${OPENCOLLADA}/lib/opencollada/UTF.lib) -endif() - if(WITH_CODEC_FFMPEG) set(FFMPEG_INCLUDE_DIRS ${LIBDIR}/ffmpeg/include diff --git a/doc/doxygen/doxygen.source.h b/doc/doxygen/doxygen.source.h index 006bad66c5c..b525835484f 100644 --- a/doc/doxygen/doxygen.source.h +++ b/doc/doxygen/doxygen.source.h @@ -288,10 +288,6 @@ /** \defgroup externformats External Formats * \ingroup blender */ -/** \defgroup collada COLLADA - * \ingroup externformats - */ - /** \defgroup avi AVI * \ingroup externformats */ diff --git a/release/license/license.md b/release/license/license.md index 7bf0e7b28d3..161f92b45ce 100644 --- a/release/license/license.md +++ b/release/license/license.md @@ -3101,7 +3101,6 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | [Mesa](https://www.mesa3d.org/) | 23.3.0 | `Copyright (C) 1999-2007 Brian Paul All Rights Reserved.` | | [Ocloc](https://github.com/intel/compute-runtime) | 24.45.31740 | `Copyright (C) 2018-2023 Intel Corporation` | | [oneAPI Level Zero](https://github.com/oneapi-src/level-zero) | 1.19.2 | `Copyright (C) 2019-2024 Intel Corporation` | -| Opencollada | dfc341ab0b3 | `Copyright (c) 2008-2009 NetAllied Systems GmbH` | | [Pugixml](https://pugixml.org/) | 1.10 | `Copyright (c) 2006-2020 Arseny Kapoulkine` | | [QuadriFlow](https://github.com/hjwdzh/QuadriFlow) | 27a6867 | `Copyright (c) 2018 Jingwei Huang, Yichao Zhou, Matthias Niessner, Jonathan Shewchuk and Leonidas Guibas. All rights reserved.` | | [RenderDoc](https://github.com/baldurk/renderdoc/) | d47e79ae079 | `Copyright (c) 2015-2024 Baldur Karlsson; Copyright (c) 2014 Crytek` | diff --git a/scripts/modules/bl_i18n_utils/utils_spell_check.py b/scripts/modules/bl_i18n_utils/utils_spell_check.py index e14df966928..d4437a4d9fe 100644 --- a/scripts/modules/bl_i18n_utils/utils_spell_check.py +++ b/scripts/modules/bl_i18n_utils/utils_spell_check.py @@ -511,7 +511,6 @@ class SpellChecker: "clearcoat", "codec", "codecs", "codepoint", - "collada", "colorspace", "compositing", "crossfade", diff --git a/scripts/presets/operator/wm.collada_export/sl_plus_open_sim_rigged.py b/scripts/presets/operator/wm.collada_export/sl_plus_open_sim_rigged.py deleted file mode 100644 index 311d71c4557..00000000000 --- a/scripts/presets/operator/wm.collada_export/sl_plus_open_sim_rigged.py +++ /dev/null @@ -1,17 +0,0 @@ -import bpy -op = bpy.context.active_operator - -op.apply_modifiers = True -op.export_mesh_type = 0 -op.export_mesh_type_selection = 'view' -op.selected = True -op.include_children = False -op.include_armatures = True -op.include_shapekeys = False -op.deform_bones_only = True -op.active_uv_only = True -op.use_texture_copies = True -op.triangulate = True -op.use_object_instantiation = False -op.sort_by_name = True -op.open_sim = True diff --git a/scripts/presets/operator/wm.collada_export/sl_plus_open_sim_static.py b/scripts/presets/operator/wm.collada_export/sl_plus_open_sim_static.py deleted file mode 100644 index a13ba5c4ccc..00000000000 --- a/scripts/presets/operator/wm.collada_export/sl_plus_open_sim_static.py +++ /dev/null @@ -1,17 +0,0 @@ -import bpy -op = bpy.context.active_operator - -op.apply_modifiers = True -op.export_mesh_type = 0 -op.export_mesh_type_selection = 'view' -op.selected = True -op.include_children = False -op.include_armatures = False -op.include_shapekeys = False -op.deform_bones_only = False -op.active_uv_only = True -op.use_texture_copies = True -op.triangulate = True -op.use_object_instantiation = False -op.sort_by_name = True -op.open_sim = False diff --git a/scripts/startup/bl_operators/presets.py b/scripts/startup/bl_operators/presets.py index fad61f9841d..158363ed364 100644 --- a/scripts/startup/bl_operators/presets.py +++ b/scripts/startup/bl_operators/presets.py @@ -891,8 +891,6 @@ class WM_OT_operator_presets_cleanup(Operator): operators = [ "WM_OT_alembic_export", "WM_OT_alembic_import", - "WM_OT_collada_export", - "WM_OT_collada_import", "WM_OT_obj_export", "WM_OT_obj_import", "WM_OT_ply_export", diff --git a/scripts/startup/bl_ui/space_topbar.py b/scripts/startup/bl_ui/space_topbar.py index 3fd0e34216d..9541274a96a 100644 --- a/scripts/startup/bl_ui/space_topbar.py +++ b/scripts/startup/bl_ui/space_topbar.py @@ -373,8 +373,6 @@ class TOPBAR_MT_file_import(Menu): if bpy.app.build_options.io_fbx: self.layout.operator("wm.fbx_import", text="FBX (.fbx) (experimental)") - if bpy.app.build_options.collada: - self.layout.operator("wm.collada_import", text="Collada (.dae) (Legacy)") class TOPBAR_MT_file_export(Menu): @@ -403,8 +401,6 @@ class TOPBAR_MT_file_export(Menu): self.layout.operator("wm.ply_export", text="Stanford PLY (.ply)") if bpy.app.build_options.io_stl: self.layout.operator("wm.stl_export", text="STL (.stl)") - if bpy.app.build_options.collada: - self.layout.operator("wm.collada_export", text="Collada (.dae) (Legacy)") class TOPBAR_MT_file_external_data(Menu): diff --git a/source/blender/blenkernel/BKE_global.hh b/source/blender/blenkernel/BKE_global.hh index fc0d780d2de..73dfd41e06b 100644 --- a/source/blender/blenkernel/BKE_global.hh +++ b/source/blender/blenkernel/BKE_global.hh @@ -269,7 +269,7 @@ enum { G_DEBUG_DEPSGRAPH_TIME | G_DEBUG_DEPSGRAPH_UID), G_DEBUG_SIMDATA = (1 << 15), /* sim debug data display */ G_DEBUG_GPU = (1 << 16), /* gpu debug */ - G_DEBUG_IO = (1 << 17), /* IO Debugging (for Collada, ...). */ + G_DEBUG_IO = (1 << 17), /* IO Debugging. */ G_DEBUG_GPU_FORCE_WORKAROUNDS = (1 << 18), /* Force GPU workarounds bypassing detection. */ G_DEBUG_GPU_FORCE_VULKAN_LOCAL_READ = (1 << 19), /* Force GPU dynamic rendering local read. */ G_DEBUG_GPU_COMPILE_SHADERS = (1 << 20), /* Compile all statically defined shaders. . */ diff --git a/source/blender/editors/io/CMakeLists.txt b/source/blender/editors/io/CMakeLists.txt index 0b04631f919..35fadbcd1a1 100644 --- a/source/blender/editors/io/CMakeLists.txt +++ b/source/blender/editors/io/CMakeLists.txt @@ -5,7 +5,6 @@ set(INC ../include ../../io/alembic - ../../io/collada ../../io/common ../../io/fbx ../../io/grease_pencil @@ -24,7 +23,6 @@ set(INC_SYS set(SRC io_alembic.cc io_cache.cc - io_collada.cc io_drop_import_file.cc io_fbx_ops.cc io_grease_pencil.cc @@ -37,7 +35,6 @@ set(SRC io_alembic.hh io_cache.hh - io_collada.hh io_drop_import_file.hh io_fbx_ops.hh io_grease_pencil.hh @@ -62,13 +59,6 @@ set(LIB PRIVATE bf::windowmanager ) -if(WITH_OPENCOLLADA) - list(APPEND LIB - bf_io_collada - ) - add_definitions(-DWITH_COLLADA) -endif() - if(WITH_IO_WAVEFRONT_OBJ) list(APPEND LIB bf_io_wavefront_obj diff --git a/source/blender/editors/io/io_collada.cc b/source/blender/editors/io/io_collada.cc deleted file mode 100644 index 56ac624c8f0..00000000000 --- a/source/blender/editors/io/io_collada.cc +++ /dev/null @@ -1,884 +0,0 @@ -/* SPDX-FileCopyrightText: 2008 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ -#ifdef WITH_COLLADA -# include "DNA_space_types.h" - -# include "BLT_translation.hh" - -# include "BLI_fileops.h" -# include "BLI_path_utils.hh" -# include "BLI_string.h" - -# include "BKE_context.hh" -# include "BKE_file_handler.hh" -# include "BKE_report.hh" - -# include "DEG_depsgraph.hh" - -# include "ED_fileselect.hh" -# include "ED_object.hh" -# include "ED_outliner.hh" - -# include "RNA_access.hh" -# include "RNA_define.hh" - -# include "UI_interface.hh" -# include "UI_resources.hh" - -# include "WM_api.hh" -# include "WM_types.hh" - -# include "collada.h" - -# include "io_collada.hh" -# include "io_utils.hh" - -static wmOperatorStatus wm_collada_export_invoke(bContext *C, - wmOperator *op, - const wmEvent * /*event*/) -{ - ED_fileselect_ensure_default_filepath(C, op, ".dae"); - - WM_event_add_fileselect(C, op); - - return OPERATOR_RUNNING_MODAL; -} - -static wmOperatorStatus wm_collada_export_exec(bContext *C, wmOperator *op) -{ - char filepath[FILE_MAX]; - int apply_modifiers; - int global_forward; - int global_up; - int apply_global_orientation; - int export_mesh_type; - int selected; - int include_children; - int include_armatures; - int include_shapekeys; - int deform_bones_only; - - int include_animations; - int include_all_actions; - int sampling_rate; - int keep_smooth_curves; - int keep_keyframes; - int keep_flat_curves; - - int export_animation_type; - int use_texture_copies; - int active_uv_only; - - int triangulate; - int use_object_instantiation; - int use_blender_profile; - int sort_by_name; - int export_object_transformation_type; - int export_animation_transformation_type; - - int open_sim; - int limit_precision; - int keep_bind_info; - - int export_count; - int sample_animations; - - if (!RNA_struct_property_is_set_ex(op->ptr, "filepath", false)) { - BKE_report(op->reports, RPT_ERROR, "No filepath given"); - return OPERATOR_CANCELLED; - } - - RNA_string_get(op->ptr, "filepath", filepath); - BLI_path_extension_ensure(filepath, sizeof(filepath), ".dae"); - - /* Avoid File write exceptions in Collada */ - if (!BLI_exists(filepath)) { - BLI_file_ensure_parent_dir_exists(filepath); - if (!BLI_file_touch(filepath)) { - BKE_report(op->reports, RPT_ERROR, "Can't create export file"); - fprintf(stdout, "Collada export: Can not create: %s\n", filepath); - return OPERATOR_CANCELLED; - } - } - else if (!BLI_file_is_writable(filepath)) { - BKE_report(op->reports, RPT_ERROR, "Can't overwrite export file"); - fprintf(stdout, "Collada export: Can not modify: %s\n", filepath); - return OPERATOR_CANCELLED; - } - - /* Now the exporter can create and write the export file */ - - /* Options panel */ - apply_modifiers = RNA_boolean_get(op->ptr, "apply_modifiers"); - export_mesh_type = RNA_enum_get(op->ptr, "export_mesh_type_selection"); - global_forward = RNA_enum_get(op->ptr, "export_global_forward_selection"); - global_up = RNA_enum_get(op->ptr, "export_global_up_selection"); - apply_global_orientation = RNA_boolean_get(op->ptr, "apply_global_orientation"); - - selected = RNA_boolean_get(op->ptr, "selected"); - include_children = RNA_boolean_get(op->ptr, "include_children"); - include_armatures = RNA_boolean_get(op->ptr, "include_armatures"); - include_shapekeys = RNA_boolean_get(op->ptr, "include_shapekeys"); - - include_animations = RNA_boolean_get(op->ptr, "include_animations"); - include_all_actions = RNA_boolean_get(op->ptr, "include_all_actions"); - export_animation_type = RNA_enum_get(op->ptr, "export_animation_type_selection"); - sample_animations = (export_animation_type == BC_ANIMATION_EXPORT_SAMPLES); - sampling_rate = (sample_animations) ? RNA_int_get(op->ptr, "sampling_rate") : 0; - keep_smooth_curves = RNA_boolean_get(op->ptr, "keep_smooth_curves"); - keep_keyframes = RNA_boolean_get(op->ptr, "keep_keyframes"); - keep_flat_curves = RNA_boolean_get(op->ptr, "keep_flat_curves"); - - deform_bones_only = RNA_boolean_get(op->ptr, "deform_bones_only"); - - use_texture_copies = RNA_boolean_get(op->ptr, "use_texture_copies"); - active_uv_only = RNA_boolean_get(op->ptr, "active_uv_only"); - - triangulate = RNA_boolean_get(op->ptr, "triangulate"); - use_object_instantiation = RNA_boolean_get(op->ptr, "use_object_instantiation"); - use_blender_profile = RNA_boolean_get(op->ptr, "use_blender_profile"); - sort_by_name = RNA_boolean_get(op->ptr, "sort_by_name"); - - export_object_transformation_type = RNA_enum_get(op->ptr, - "export_object_transformation_type_selection"); - export_animation_transformation_type = RNA_enum_get( - op->ptr, "export_animation_transformation_type_selection"); - - open_sim = RNA_boolean_get(op->ptr, "open_sim"); - limit_precision = RNA_boolean_get(op->ptr, "limit_precision"); - keep_bind_info = RNA_boolean_get(op->ptr, "keep_bind_info"); - - Main *bmain = CTX_data_main(C); - - /* get editmode results */ - blender::ed::object::editmode_load(bmain, CTX_data_edit_object(C)); - - // Scene *scene = CTX_data_scene(C); - - ExportSettings export_settings{}; - - export_settings.filepath = filepath; - - export_settings.apply_modifiers = apply_modifiers != 0; - export_settings.global_forward = BC_global_forward_axis(global_forward); - export_settings.global_up = BC_global_up_axis(global_up); - export_settings.apply_global_orientation = apply_global_orientation != 0; - - export_settings.export_mesh_type = BC_export_mesh_type(export_mesh_type); - export_settings.selected = selected != 0; - export_settings.include_children = include_children != 0; - export_settings.include_armatures = include_armatures != 0; - export_settings.include_shapekeys = include_shapekeys != 0; - export_settings.deform_bones_only = deform_bones_only != 0; - export_settings.include_animations = include_animations != 0; - export_settings.include_all_actions = include_all_actions != 0; - export_settings.sampling_rate = sampling_rate; - export_settings.keep_keyframes = keep_keyframes != 0 || sampling_rate < 1; - export_settings.keep_flat_curves = keep_flat_curves != 0; - - export_settings.active_uv_only = active_uv_only != 0; - export_settings.export_animation_type = BC_export_animation_type(export_animation_type); - export_settings.use_texture_copies = use_texture_copies != 0; - - export_settings.triangulate = triangulate != 0; - export_settings.use_object_instantiation = use_object_instantiation != 0; - export_settings.use_blender_profile = use_blender_profile != 0; - export_settings.sort_by_name = sort_by_name != 0; - export_settings.object_transformation_type = BC_export_transformation_type( - export_object_transformation_type); - export_settings.animation_transformation_type = BC_export_transformation_type( - export_animation_transformation_type); - export_settings.keep_smooth_curves = keep_smooth_curves != 0; - - if (export_animation_type != BC_ANIMATION_EXPORT_SAMPLES) { - /* When curves are exported then we can not export as matrix. */ - export_settings.animation_transformation_type = BC_TRANSFORMATION_TYPE_DECOMPOSED; - } - - if (export_settings.animation_transformation_type != BC_TRANSFORMATION_TYPE_DECOMPOSED) { - /* Can not export smooth curves when Matrix export is enabled. */ - export_settings.keep_smooth_curves = false; - } - - if (include_animations) { - export_settings.object_transformation_type = export_settings.animation_transformation_type; - } - - export_settings.open_sim = open_sim != 0; - export_settings.limit_precision = limit_precision != 0; - export_settings.keep_bind_info = keep_bind_info != 0; - - export_count = collada_export(C, &export_settings); - - if (export_count == 0) { - BKE_report(op->reports, RPT_WARNING, "No objects selected -- Created empty export file"); - return OPERATOR_CANCELLED; - } - if (export_count < 0) { - BKE_report(op->reports, RPT_WARNING, "Error during export (see Console)"); - return OPERATOR_CANCELLED; - } - - char buff[100]; - SNPRINTF(buff, "Exported %d Objects", export_count); - BKE_report(op->reports, RPT_INFO, buff); - return OPERATOR_FINISHED; -} - -static void uiCollada_exportSettings(uiLayout *layout, PointerRNA *imfptr) -{ - uiLayout *box, *row, *col, *sub; - bool include_animations = RNA_boolean_get(imfptr, "include_animations"); - int ui_section = RNA_enum_get(imfptr, "prop_bc_export_ui_section"); - - BC_export_animation_type animation_type = BC_export_animation_type( - RNA_enum_get(imfptr, "export_animation_type_selection")); - - BC_export_transformation_type animation_transformation_type = BC_export_transformation_type( - RNA_enum_get(imfptr, "export_animation_transformation_type_selection")); - - bool sampling = animation_type == BC_ANIMATION_EXPORT_SAMPLES; - - /* Export Options: */ - row = &layout->row(false); - row->prop(imfptr, "prop_bc_export_ui_section", UI_ITEM_R_EXPAND, std::nullopt, ICON_NONE); - - uiLayoutSetPropSep(layout, true); - uiLayoutSetPropDecorate(layout, false); - - if (ui_section == BC_UI_SECTION_MAIN) { - /* Export data options. */ - box = &layout->box(); - col = &box->column(false); - col->prop(imfptr, "selected", UI_ITEM_NONE, std::nullopt, ICON_NONE); - sub = &col->column(false); - uiLayoutSetEnabled(sub, RNA_boolean_get(imfptr, "selected")); - sub->prop(imfptr, "include_children", UI_ITEM_NONE, std::nullopt, ICON_NONE); - sub->prop(imfptr, "include_armatures", UI_ITEM_NONE, std::nullopt, ICON_NONE); - sub->prop(imfptr, "include_shapekeys", UI_ITEM_NONE, std::nullopt, ICON_NONE); - - box = &layout->box(); - row = &box->row(false); - row->label(IFACE_("Global Orientation"), ICON_ORIENTATION_GLOBAL); - - box->prop(imfptr, "apply_global_orientation", UI_ITEM_NONE, IFACE_("Apply"), ICON_NONE); - box->prop(imfptr, - "export_global_forward_selection", - UI_ITEM_NONE, - IFACE_("Forward Axis"), - ICON_NONE); - box->prop(imfptr, "export_global_up_selection", UI_ITEM_NONE, IFACE_("Up Axis"), ICON_NONE); - - /* Texture options */ - box = &layout->box(); - box->label(IFACE_("Texture Options"), ICON_TEXTURE_DATA); - - col = &box->column(false); - col->prop(imfptr, "use_texture_copies", UI_ITEM_NONE, std::nullopt, ICON_NONE); - row = &col->row(true, IFACE_("UV")); - row->prop(imfptr, "active_uv_only", UI_ITEM_NONE, IFACE_("Only Selected Map"), ICON_NONE); - } - else if (ui_section == BC_UI_SECTION_GEOMETRY) { - box = &layout->box(); - box->label(IFACE_("Export Data Options"), ICON_MESH_DATA); - - col = &box->column(false); - - col->prop(imfptr, "triangulate", UI_ITEM_NONE, std::nullopt, ICON_NONE); - - row = &col->row(true, IFACE_("Apply Modifiers")); - row->prop(imfptr, "apply_modifiers", UI_ITEM_NONE, "", ICON_NONE); - sub = &row->column(false); - uiLayoutSetActive(sub, RNA_boolean_get(imfptr, "apply_modifiers")); - sub->prop(imfptr, "export_mesh_type_selection", UI_ITEM_NONE, "", ICON_NONE); - - if (RNA_boolean_get(imfptr, "include_animations")) { - col->prop(imfptr, - "export_animation_transformation_type_selection", - UI_ITEM_NONE, - std::nullopt, - ICON_NONE); - } - else { - col->prop(imfptr, - "export_object_transformation_type_selection", - UI_ITEM_NONE, - std::nullopt, - ICON_NONE); - } - } - else if (ui_section == BC_UI_SECTION_ARMATURE) { - /* Armature options */ - box = &layout->box(); - box->label(IFACE_("Armature Options"), ICON_ARMATURE_DATA); - - col = &box->column(false); - col->prop(imfptr, "deform_bones_only", UI_ITEM_NONE, std::nullopt, ICON_NONE); - col->prop(imfptr, "open_sim", UI_ITEM_NONE, std::nullopt, ICON_NONE); - } - else if (ui_section == BC_UI_SECTION_ANIMATION) { - /* Animation options. */ - box = &layout->box(); - box->prop(imfptr, "include_animations", UI_ITEM_NONE, std::nullopt, ICON_NONE); - - col = &box->column(false); - row = &col->row(false); - uiLayoutSetActive(row, include_animations); - row->prop( - imfptr, "export_animation_type_selection", UI_ITEM_R_EXPAND, std::nullopt, ICON_NONE); - - uiLayoutSetActive(row, include_animations && animation_type == BC_ANIMATION_EXPORT_SAMPLES); - if (RNA_boolean_get(imfptr, "include_animations")) { - box->prop(imfptr, - "export_animation_transformation_type_selection", - UI_ITEM_NONE, - std::nullopt, - ICON_NONE); - } - else { - box->prop(imfptr, - "export_object_transformation_type_selection", - UI_ITEM_NONE, - std::nullopt, - ICON_NONE); - } - - row = &col->column(false); - uiLayoutSetActive(row, - include_animations && - (animation_transformation_type == BC_TRANSFORMATION_TYPE_DECOMPOSED || - animation_type == BC_ANIMATION_EXPORT_KEYS)); - row->prop(imfptr, "keep_smooth_curves", UI_ITEM_NONE, std::nullopt, ICON_NONE); - - sub = &col->column(false); - uiLayoutSetActive(sub, sampling && include_animations); - sub->prop(imfptr, "sampling_rate", UI_ITEM_NONE, std::nullopt, ICON_NONE); - sub->prop(imfptr, "keep_keyframes", UI_ITEM_NONE, std::nullopt, ICON_NONE); - - sub = &col->column(false); - uiLayoutSetActive(sub, include_animations); - sub->prop(imfptr, "keep_flat_curves", UI_ITEM_NONE, std::nullopt, ICON_NONE); - sub->prop(imfptr, "include_all_actions", UI_ITEM_NONE, std::nullopt, ICON_NONE); - } - else if (ui_section == BC_UI_SECTION_COLLADA) { - /* Collada options: */ - box = &layout->box(); - row = &box->row(false); - row->label(IFACE_("Collada Options"), ICON_MODIFIER); - - col = &box->column(false); - col->prop(imfptr, "use_object_instantiation", UI_ITEM_NONE, std::nullopt, ICON_NONE); - col->prop(imfptr, "use_blender_profile", UI_ITEM_NONE, std::nullopt, ICON_NONE); - col->prop(imfptr, "sort_by_name", UI_ITEM_NONE, std::nullopt, ICON_NONE); - col->prop(imfptr, "keep_bind_info", UI_ITEM_NONE, std::nullopt, ICON_NONE); - col->prop(imfptr, "limit_precision", UI_ITEM_NONE, std::nullopt, ICON_NONE); - } -} - -static void wm_collada_export_draw(bContext * /*C*/, wmOperator *op) -{ - uiCollada_exportSettings(op->layout, op->ptr); -} - -static bool wm_collada_export_check(bContext * /*C*/, wmOperator *op) -{ - char filepath[FILE_MAX]; - RNA_string_get(op->ptr, "filepath", filepath); - - if (!BLI_path_extension_check(filepath, ".dae")) { - BLI_path_extension_ensure(filepath, FILE_MAX, ".dae"); - RNA_string_set(op->ptr, "filepath", filepath); - return true; - } - - return false; -} - -void WM_OT_collada_export(wmOperatorType *ot) -{ - static const EnumPropertyItem prop_bc_export_mesh_type[] = { - {BC_MESH_TYPE_VIEW, "view", 0, "Viewport", "Apply modifier's viewport settings"}, - {BC_MESH_TYPE_RENDER, "render", 0, "Render", "Apply modifier's render settings"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - static const EnumPropertyItem prop_bc_export_global_forward[] = { - {BC_GLOBAL_FORWARD_X, "X", 0, "X", "Global Forward is positive X Axis"}, - {BC_GLOBAL_FORWARD_Y, "Y", 0, "Y", "Global Forward is positive Y Axis"}, - {BC_GLOBAL_FORWARD_Z, "Z", 0, "Z", "Global Forward is positive Z Axis"}, - {BC_GLOBAL_FORWARD_MINUS_X, "-X", 0, "-X", "Global Forward is negative X Axis"}, - {BC_GLOBAL_FORWARD_MINUS_Y, "-Y", 0, "-Y", "Global Forward is negative Y Axis"}, - {BC_GLOBAL_FORWARD_MINUS_Z, "-Z", 0, "-Z", "Global Forward is negative Z Axis"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - static const EnumPropertyItem prop_bc_export_global_up[] = { - {BC_GLOBAL_UP_X, "X", 0, "X", "Global UP is positive X Axis"}, - {BC_GLOBAL_UP_Y, "Y", 0, "Y", "Global UP is positive Y Axis"}, - {BC_GLOBAL_UP_Z, "Z", 0, "Z", "Global UP is positive Z Axis"}, - {BC_GLOBAL_UP_MINUS_X, "-X", 0, "-X", "Global UP is negative X Axis"}, - {BC_GLOBAL_UP_MINUS_Y, "-Y", 0, "-Y", "Global UP is negative Y Axis"}, - {BC_GLOBAL_UP_MINUS_Z, "-Z", 0, "-Z", "Global UP is negative Z Axis"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - static const EnumPropertyItem prop_bc_export_transformation_type[] = { - {BC_TRANSFORMATION_TYPE_MATRIX, - "matrix", - 0, - "Matrix", - "Use representation for exported transformations"}, - {BC_TRANSFORMATION_TYPE_DECOMPOSED, - "decomposed", - 0, - "Decomposed", - "Use , and representation for exported transformations"}, - {0, nullptr, 0, nullptr, nullptr}}; - - static const EnumPropertyItem prop_bc_export_animation_type[] = { - {BC_ANIMATION_EXPORT_SAMPLES, - "sample", - 0, - "Samples", - "Export Sampled points guided by sampling rate"}, - {BC_ANIMATION_EXPORT_KEYS, - "keys", - 0, - "Curves", - "Export Curves (note: guided by curve keys)"}, - {0, nullptr, 0, nullptr, nullptr}}; - - static const EnumPropertyItem prop_bc_export_ui_section[] = { - {BC_UI_SECTION_MAIN, "main", 0, "Main", "Data export section"}, - {BC_UI_SECTION_GEOMETRY, "geometry", 0, "Geom", "Geometry export section"}, - {BC_UI_SECTION_ARMATURE, "armature", 0, "Arm", "Armature export section"}, - {BC_UI_SECTION_ANIMATION, "animation", 0, "Anim", "Animation export section"}, - {BC_UI_SECTION_COLLADA, "collada", 0, "Extra", "Collada export section"}, - {0, nullptr, 0, nullptr, nullptr}}; - - ot->name = "Export COLLADA (Legacy)"; - ot->description = "Save a Collada file (Deprecated)"; - ot->idname = "WM_OT_collada_export"; - - ot->invoke = wm_collada_export_invoke; - ot->exec = wm_collada_export_exec; - ot->poll = WM_operator_winactive; - ot->check = wm_collada_export_check; - - ot->flag = OPTYPE_PRESET; - - ot->ui = wm_collada_export_draw; - - WM_operator_properties_filesel(ot, - FILE_TYPE_FOLDER | FILE_TYPE_COLLADA, - FILE_BLENDER, - FILE_SAVE, - WM_FILESEL_FILEPATH | WM_FILESEL_SHOW_PROPS, - FILE_DEFAULTDISPLAY, - FILE_SORT_DEFAULT); - - PropertyRNA *prop = RNA_def_string(ot->srna, "filter_glob", "*.dae", 0, "", ""); - RNA_def_property_flag(prop, PROP_HIDDEN); - - RNA_def_enum(ot->srna, - "prop_bc_export_ui_section", - prop_bc_export_ui_section, - 0, - "Export Section", - "Only for User Interface organization"); - - RNA_def_boolean(ot->srna, - "apply_modifiers", - false, - "Apply Modifiers", - "Apply modifiers to exported mesh (non destructive)"); - - RNA_def_int(ot->srna, - "export_mesh_type", - 0, - INT_MIN, - INT_MAX, - "Resolution", - "Modifier resolution for export", - INT_MIN, - INT_MAX); - - RNA_def_enum(ot->srna, - "export_mesh_type_selection", - prop_bc_export_mesh_type, - 0, - "Resolution", - "Modifier resolution for export"); - - RNA_def_enum(ot->srna, - "export_global_forward_selection", - prop_bc_export_global_forward, - BC_DEFAULT_FORWARD, - "Global Forward Axis", - "Global Forward axis for export"); - - RNA_def_enum(ot->srna, - "export_global_up_selection", - prop_bc_export_global_up, - BC_DEFAULT_UP, - "Global Up Axis", - "Global Up axis for export"); - - RNA_def_boolean(ot->srna, - "apply_global_orientation", - false, - "Apply Global Orientation", - "Rotate all root objects to match the global orientation settings " - "otherwise set the global orientation per Collada asset"); - - RNA_def_boolean(ot->srna, "selected", false, "Selection Only", "Export only selected elements"); - - RNA_def_boolean(ot->srna, - "include_children", - false, - "Include Children", - "Export all children of selected objects (even if not selected)"); - - RNA_def_boolean(ot->srna, - "include_armatures", - false, - "Include Armatures", - "Export related armatures (even if not selected)"); - - RNA_def_boolean(ot->srna, - "include_shapekeys", - false, - "Include Shape Keys", - "Export all Shape Keys from Mesh Objects"); - - RNA_def_boolean(ot->srna, - "deform_bones_only", - false, - "Deform Bones Only", - "Only export deforming bones with armatures"); - - RNA_def_boolean( - ot->srna, - "include_animations", - true, - "Include Animations", - "Export animations if available (exporting animations will enforce the decomposition of " - "node transforms into and components)"); - - RNA_def_boolean(ot->srna, - "include_all_actions", - true, - "Include all Actions", - "Export also unassigned actions (this allows you to export entire animation " - "libraries for your character(s))"); - - RNA_def_enum(ot->srna, - "export_animation_type_selection", - prop_bc_export_animation_type, - 0, - "Key Type", - "Type for exported animations (use sample keys or Curve keys)"); - - RNA_def_int(ot->srna, - "sampling_rate", - 1, - 1, - INT_MAX, - "Sampling Rate", - "The distance between 2 keyframes (1 to key every frame)", - 1, - INT_MAX); - - RNA_def_boolean(ot->srna, - "keep_smooth_curves", - false, - "Keep Smooth curves", - "Export also the curve handles (if available) (this does only work when the " - "inverse parent matrix " - "is the unity matrix, otherwise you may end up with odd results)"); - - RNA_def_boolean(ot->srna, - "keep_keyframes", - false, - "Keep Keyframes", - "Use existing keyframes as additional sample points (this helps when you want " - "to keep manual tweaks)"); - - RNA_def_boolean(ot->srna, - "keep_flat_curves", - false, - "All Keyed Curves", - "Export also curves which have only one key or are totally flat"); - - RNA_def_boolean(ot->srna, - "active_uv_only", - false, - "Only Selected UV Map", - "Export only the selected UV Map"); - - RNA_def_boolean(ot->srna, - "use_texture_copies", - true, - "Copy", - "Copy textures to same folder where the .dae file is exported"); - - RNA_def_boolean(ot->srna, - "triangulate", - true, - "Triangulate", - "Export polygons (quads and n-gons) as triangles"); - - RNA_def_boolean(ot->srna, - "use_object_instantiation", - true, - "Use Object Instances", - "Instantiate multiple Objects from same Data"); - - RNA_def_boolean( - ot->srna, - "use_blender_profile", - true, - "Use Blender Profile", - "Export additional Blender specific information (for material, shaders, bones, etc.)"); - - RNA_def_boolean( - ot->srna, "sort_by_name", false, "Sort by Object name", "Sort exported data by Object name"); - - RNA_def_int(ot->srna, - "export_object_transformation_type", - 0, - INT_MIN, - INT_MAX, - "Transform", - "Object Transformation type for translation, scale and rotation", - INT_MIN, - INT_MAX); - - RNA_def_enum(ot->srna, - "export_object_transformation_type_selection", - prop_bc_export_transformation_type, - 0, - "Transform", - "Object Transformation type for translation, scale and rotation"); - - RNA_def_int(ot->srna, - "export_animation_transformation_type", - 0, - INT_MIN, - INT_MAX, - "Transform", - "Transformation type for translation, scale and rotation. " - "Note: The Animation transformation type in the Anim Tab " - "is always equal to the Object transformation type in the Geom tab", - INT_MIN, - INT_MAX); - - RNA_def_enum(ot->srna, - "export_animation_transformation_type_selection", - prop_bc_export_transformation_type, - 0, - "Transform", - "Transformation type for translation, scale and rotation. " - "Note: The Animation transformation type in the Anim Tab " - "is always equal to the Object transformation type in the Geom tab"); - - RNA_def_boolean( - ot->srna, - "open_sim", - false, - "Export to SL/OpenSim", - "Compatibility mode for Second Life, OpenSimulator and other compatible online worlds"); - - RNA_def_boolean(ot->srna, - "limit_precision", - false, - "Limit Precision", - "Reduce the precision of the exported data to 6 digits"); - - RNA_def_boolean( - ot->srna, - "keep_bind_info", - false, - "Keep Bind Info", - "Store Bindpose information in custom bone properties for later use during Collada export"); -} - -static wmOperatorStatus wm_collada_import_exec(bContext *C, wmOperator *op) -{ - char filepath[FILE_MAX]; - int import_units; - int find_chains; - int auto_connect; - int fix_orientation; - int min_chain_length; - - int keep_bind_info; - int custom_normals; - ImportSettings import_settings{}; - - if (!RNA_struct_property_is_set_ex(op->ptr, "filepath", false)) { - BKE_report(op->reports, RPT_ERROR, "No filepath given"); - return OPERATOR_CANCELLED; - } - - /* Options panel */ - import_units = RNA_boolean_get(op->ptr, "import_units"); - custom_normals = RNA_boolean_get(op->ptr, "custom_normals"); - find_chains = RNA_boolean_get(op->ptr, "find_chains"); - auto_connect = RNA_boolean_get(op->ptr, "auto_connect"); - fix_orientation = RNA_boolean_get(op->ptr, "fix_orientation"); - - keep_bind_info = RNA_boolean_get(op->ptr, "keep_bind_info"); - - min_chain_length = RNA_int_get(op->ptr, "min_chain_length"); - - RNA_string_get(op->ptr, "filepath", filepath); - - import_settings.filepath = filepath; - import_settings.import_units = import_units != 0; - import_settings.custom_normals = custom_normals != 0; - import_settings.auto_connect = auto_connect != 0; - import_settings.find_chains = find_chains != 0; - import_settings.fix_orientation = fix_orientation != 0; - import_settings.min_chain_length = min_chain_length; - import_settings.keep_bind_info = keep_bind_info != 0; - - if (collada_import(C, &import_settings)) { - DEG_id_tag_update(&CTX_data_scene(C)->id, ID_RECALC_BASE_FLAGS); - Scene *scene = CTX_data_scene(C); - WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); - WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene); - WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT, scene); - ED_outliner_select_sync_from_object_tag(C); - return OPERATOR_FINISHED; - } - - BKE_report(op->reports, RPT_ERROR, "Parsing errors in Document (see Blender Console)"); - return OPERATOR_CANCELLED; -} - -static void wm_collada_import_settings(uiLayout *layout, PointerRNA *imfptr) -{ - uiLayout *box, *col; - - uiLayoutSetPropSep(layout, true); - uiLayoutSetPropDecorate(layout, false); - - /* Import Options: */ - box = &layout->box(); - box->label(IFACE_("Import Data Options"), ICON_MESH_DATA); - - box->prop(imfptr, "import_units", UI_ITEM_NONE, std::nullopt, ICON_NONE); - box->prop(imfptr, "custom_normals", UI_ITEM_NONE, std::nullopt, ICON_NONE); - - box = &layout->box(); - box->label(IFACE_("Armature Options"), ICON_ARMATURE_DATA); - - col = &box->column(false); - col->prop(imfptr, "fix_orientation", UI_ITEM_NONE, std::nullopt, ICON_NONE); - col->prop(imfptr, "find_chains", UI_ITEM_NONE, std::nullopt, ICON_NONE); - col->prop(imfptr, "auto_connect", UI_ITEM_NONE, std::nullopt, ICON_NONE); - col->prop(imfptr, "min_chain_length", UI_ITEM_NONE, std::nullopt, ICON_NONE); - - box = &layout->box(); - - box->prop(imfptr, "keep_bind_info", UI_ITEM_NONE, std::nullopt, ICON_NONE); -} - -static void wm_collada_import_draw(bContext * /*C*/, wmOperator *op) -{ - wm_collada_import_settings(op->layout, op->ptr); -} - -void WM_OT_collada_import(wmOperatorType *ot) -{ - ot->name = "Import COLLADA (Legacy)"; - ot->description = "Load a Collada file (Deprecated)"; - ot->idname = "WM_OT_collada_import"; - ot->flag = OPTYPE_UNDO | OPTYPE_PRESET; - - ot->invoke = blender::ed::io::filesel_drop_import_invoke; - ot->exec = wm_collada_import_exec; - ot->poll = WM_operator_winactive; - - ot->ui = wm_collada_import_draw; - - WM_operator_properties_filesel(ot, - FILE_TYPE_FOLDER | FILE_TYPE_COLLADA, - FILE_BLENDER, - FILE_OPENFILE, - WM_FILESEL_FILEPATH | WM_FILESEL_SHOW_PROPS, - FILE_DEFAULTDISPLAY, - FILE_SORT_DEFAULT); - - PropertyRNA *prop = RNA_def_string(ot->srna, "filter_glob", "*.dae", 0, "", ""); - RNA_def_property_flag(prop, PROP_HIDDEN); - - RNA_def_boolean(ot->srna, - "import_units", - false, - "Import Units", - "If disabled match import to Blender's current Unit settings, " - "otherwise use the settings from the Imported scene"); - - RNA_def_boolean(ot->srna, - "custom_normals", - true, - "Custom Normals", - "Import custom normals, if available (otherwise Blender will compute them)"); - - RNA_def_boolean(ot->srna, - "fix_orientation", - false, - "Fix Leaf Bones", - "Fix Orientation of Leaf Bones (Collada does only support Joints)"); - - RNA_def_boolean(ot->srna, - "find_chains", - false, - "Find Bone Chains", - "Find best matching Bone Chains and ensure bones in chain are connected"); - - RNA_def_boolean(ot->srna, - "auto_connect", - false, - "Auto Connect", - "Set use_connect for parent bones which have exactly one child bone"); - - RNA_def_int(ot->srna, - "min_chain_length", - 0, - 0, - INT_MAX, - "Minimum Chain Length", - "When searching Bone Chains disregard chains of length below this value", - 0, - INT_MAX); - - RNA_def_boolean( - ot->srna, - "keep_bind_info", - false, - "Keep Bind Info", - "Store Bindpose information in custom bone properties for later use during Collada export"); -} - -namespace blender::ed::io { -void collada_file_handler_add() -{ - auto fh = std::make_unique(); - STRNCPY(fh->idname, "IO_FH_collada"); - STRNCPY(fh->import_operator, "WM_OT_collada_import"); - STRNCPY(fh->label, "Collada"); - STRNCPY(fh->file_extensions_str, ".dae"); - fh->poll_drop = poll_file_object_drop; - bke::file_handler_add(std::move(fh)); -} -} // namespace blender::ed::io - -#endif diff --git a/source/blender/editors/io/io_collada.hh b/source/blender/editors/io/io_collada.hh deleted file mode 100644 index 2fe4d3d9726..00000000000 --- a/source/blender/editors/io/io_collada.hh +++ /dev/null @@ -1,18 +0,0 @@ -/* SPDX-FileCopyrightText: 2007 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup editor/io - */ - -#pragma once - -struct wmOperatorType; - -void WM_OT_collada_export(wmOperatorType *ot); -void WM_OT_collada_import(wmOperatorType *ot); - -namespace blender::ed::io { -void collada_file_handler_add(); -} diff --git a/source/blender/editors/io/io_ops.cc b/source/blender/editors/io/io_ops.cc index 072ba24eb70..0d800a9fd93 100644 --- a/source/blender/editors/io/io_ops.cc +++ b/source/blender/editors/io/io_ops.cc @@ -2,18 +2,10 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -/** \file - * \ingroup collada - */ - #include "io_ops.hh" /* own include */ #include "WM_api.hh" -#ifdef WITH_COLLADA -# include "io_collada.hh" -#endif - #ifdef WITH_ALEMBIC # include "io_alembic.hh" #endif @@ -87,12 +79,6 @@ void ED_operatortypes_io() /* ed::io::fbx_file_handler_add(); TODO: add once not experimental */ #endif -#ifdef WITH_COLLADA - WM_operatortype_append(WM_OT_collada_export); - WM_operatortype_append(WM_OT_collada_import); - ed::io::collada_file_handler_add(); -#endif - WM_operatortype_append(WM_OT_drop_import_file); ED_dropbox_drop_import_file(); } diff --git a/source/blender/editors/space_file/filelist.cc b/source/blender/editors/space_file/filelist.cc index 7419c3fc306..9cd27af453a 100644 --- a/source/blender/editors/space_file/filelist.cc +++ b/source/blender/editors/space_file/filelist.cc @@ -1303,9 +1303,6 @@ static int filelist_geticon_file_type_ex(const FileList *filelist, if (typeflag & FILE_TYPE_BTX) { return ICON_FILE_BLANK; } - if (typeflag & FILE_TYPE_COLLADA) { - return ICON_FILE_3D; - } if (typeflag & FILE_TYPE_ALEMBIC) { return ICON_FILE_3D; } @@ -2796,9 +2793,6 @@ int ED_path_extension_type(const char *path) if (BLI_path_extension_check(path, ".btx")) { return FILE_TYPE_BTX; } - if (BLI_path_extension_check(path, ".dae")) { - return FILE_TYPE_COLLADA; - } if (BLI_path_extension_check(path, ".abc")) { return FILE_TYPE_ALEMBIC; } @@ -2855,7 +2849,6 @@ int ED_file_extension_icon(const char *path) return ICON_FILE_FONT; case FILE_TYPE_BTX: return ICON_FILE_BLANK; - case FILE_TYPE_COLLADA: case FILE_TYPE_ALEMBIC: case FILE_TYPE_OBJECT_IO: return ICON_FILE_3D; diff --git a/source/blender/editors/space_file/filesel.cc b/source/blender/editors/space_file/filesel.cc index d9afa2ba426..75c626d1081 100644 --- a/source/blender/editors/space_file/filesel.cc +++ b/source/blender/editors/space_file/filesel.cc @@ -263,9 +263,6 @@ static FileSelectParams *fileselect_ensure_updated_file_params(SpaceFile *sfile) if ((prop = RNA_struct_find_property(op->ptr, "filter_btx"))) { params->filter |= RNA_property_boolean_get(op->ptr, prop) ? int(FILE_TYPE_BTX) : 0; } - if ((prop = RNA_struct_find_property(op->ptr, "filter_collada"))) { - params->filter |= RNA_property_boolean_get(op->ptr, prop) ? int(FILE_TYPE_COLLADA) : 0; - } if ((prop = RNA_struct_find_property(op->ptr, "filter_alembic"))) { params->filter |= RNA_property_boolean_get(op->ptr, prop) ? int(FILE_TYPE_ALEMBIC) : 0; } diff --git a/source/blender/io/CMakeLists.txt b/source/blender/io/CMakeLists.txt index f1658459fdd..6cea984dec6 100644 --- a/source/blender/io/CMakeLists.txt +++ b/source/blender/io/CMakeLists.txt @@ -30,10 +30,6 @@ if(WITH_ALEMBIC) add_subdirectory(alembic) endif() -if(WITH_OPENCOLLADA) - add_subdirectory(collada) -endif() - if(WITH_USD) add_subdirectory(usd) endif() diff --git a/source/blender/io/collada/AnimationClipExporter.cpp b/source/blender/io/collada/AnimationClipExporter.cpp deleted file mode 100644 index 8dfea48bd0f..00000000000 --- a/source/blender/io/collada/AnimationClipExporter.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* SPDX-FileCopyrightText: 2018-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "AnimationClipExporter.h" - -void AnimationClipExporter::exportAnimationClips(Scene *sce) -{ - openLibrary(); - std::map clips; - - std::vector>::iterator anim_meta_entry; - for (anim_meta_entry = anim_meta.begin(); anim_meta_entry != anim_meta.end(); ++anim_meta_entry) - { - std::vector entry = *anim_meta_entry; - std::string action_id = entry[0]; - std::string action_name = entry[1]; - - std::map::iterator it = clips.find( - action_name); - if (it == clips.end()) { - COLLADASW::ColladaAnimationClip *clip = new COLLADASW::ColladaAnimationClip(action_name); - clips[action_name] = clip; - } - COLLADASW::ColladaAnimationClip *clip = clips[action_name]; - clip->setInstancedAnimation(action_id); - } - - std::map::iterator clips_it; - for (clips_it = clips.begin(); clips_it != clips.end(); clips_it++) { - COLLADASW::ColladaAnimationClip *clip = (COLLADASW::ColladaAnimationClip *)clips_it->second; - addAnimationClip(*clip); - } - - closeLibrary(); -} diff --git a/source/blender/io/collada/AnimationClipExporter.h b/source/blender/io/collada/AnimationClipExporter.h deleted file mode 100644 index 85c16ff7065..00000000000 --- a/source/blender/io/collada/AnimationClipExporter.h +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include - -#include "COLLADASWLibraryAnimationClips.h" -#include "DEG_depsgraph.hh" -#include "ExportSettings.h" - -class AnimationClipExporter : COLLADASW::LibraryAnimationClips { - private: - Depsgraph *depsgraph; - Scene *scene = nullptr; - COLLADASW::StreamWriter *sw; - BCExportSettings &export_settings; - std::vector> anim_meta; - - public: - AnimationClipExporter(Depsgraph *depsgraph, - COLLADASW::StreamWriter *sw, - BCExportSettings &export_settings, - std::vector> anim_meta) - : COLLADASW::LibraryAnimationClips(sw), - depsgraph(depsgraph), - sw(sw), - export_settings(export_settings), - anim_meta(anim_meta) - { - } - - void exportAnimationClips(Scene *sce); -}; diff --git a/source/blender/io/collada/AnimationExporter.cpp b/source/blender/io/collada/AnimationExporter.cpp deleted file mode 100644 index a938e337e6b..00000000000 --- a/source/blender/io/collada/AnimationExporter.cpp +++ /dev/null @@ -1,830 +0,0 @@ -/* SPDX-FileCopyrightText: 2009-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "AnimationExporter.h" -#include "BCAnimationSampler.h" -#include "collada_utils.h" - -#include "BKE_material.hh" - -#include "BLI_listbase.h" -#include "BLI_string.h" - -std::string EMPTY_STRING; - -std::string AnimationExporter::get_axis_name(std::string channel_type, int id) -{ - - static std::map> BC_COLLADA_AXIS_FROM_TYPE = { - {"color", {"R", "G", "B"}}, - {"specular_color", {"R", "G", "B"}}, - {"diffuse_color", {"R", "G", "B"}}, - {"alpha", {"R", "G", "B"}}, - {"scale", {"X", "Y", "Z"}}, - {"location", {"X", "Y", "Z"}}, - {"rotation_euler", {"X", "Y", "Z"}}}; - - std::map>::const_iterator it; - - it = BC_COLLADA_AXIS_FROM_TYPE.find(channel_type); - if (it == BC_COLLADA_AXIS_FROM_TYPE.end()) { - return ""; - } - - const std::vector &subchannel = it->second; - if (id >= subchannel.size()) { - return ""; - } - return subchannel[id]; -} - -bool AnimationExporter::open_animation_container(bool has_container, Object *ob) -{ - if (!has_container) { - char anim_id[200]; - SNPRINTF(anim_id, "action_container-%s", translate_id(id_name(ob)).c_str()); - openAnimation(anim_id, encode_xml(id_name(ob))); - } - return true; -} - -void AnimationExporter::openAnimationWithClip(std::string action_id, std::string action_name) -{ - std::vector anim_meta_entry; - anim_meta_entry.push_back(translate_id(action_id)); - anim_meta_entry.push_back(action_name); - anim_meta.push_back(anim_meta_entry); - - openAnimation(translate_id(action_id), action_name); -} - -void AnimationExporter::close_animation_container(bool has_container) -{ - if (has_container) { - closeAnimation(); - } -} - -bool AnimationExporter::exportAnimations() -{ - Scene *sce = export_settings.get_scene(); - - LinkNode *export_set = this->export_settings.get_export_set(); - bool has_anim_data = bc_has_animations(sce, export_set); - int animation_count = 0; - if (has_anim_data) { - - BCObjectSet animated_subset; - BCAnimationSampler::get_animated_from_export_set(animated_subset, *export_set); - animation_count = animated_subset.size(); - BCAnimationSampler animation_sampler(export_settings, animated_subset); - - try { - animation_sampler.sample_scene(export_settings, /*keyframe_at_end = */ true); - - openLibrary(); - - BCObjectSet::iterator it; - for (it = animated_subset.begin(); it != animated_subset.end(); ++it) { - Object *ob = *it; - exportAnimation(ob, animation_sampler); - } - } - catch (std::invalid_argument &iae) { - fprintf(stderr, "Animation export interrupted"); - fprintf(stderr, "Exception was: %s", iae.what()); - } - - closeLibrary(); - -#if 0 - /* TODO: If all actions shall be exported, we need to call the - * AnimationClipExporter which will figure out which actions - * need to be exported for which objects - */ - if (this->export_settings->include_all_actions) { - AnimationClipExporter ace(eval_ctx, sw, export_settings, anim_meta); - ace.exportAnimationClips(sce); - } -#endif - } - return animation_count; -} - -void AnimationExporter::exportAnimation(Object *ob, BCAnimationSampler &sampler) -{ - bool container_is_open = false; - - /* Transform animations (trans, rot, scale). */ - container_is_open = open_animation_container(container_is_open, ob); - - /* Now take care of the Object Animations - * NOTE: For Armatures the skeletal animation has already been exported (see above) - * However Armatures also can have Object animation. - */ - bool export_as_matrix = this->export_settings.get_animation_transformation_type() == - BC_TRANSFORMATION_TYPE_MATRIX; - - if (export_as_matrix) { - /* export all transform_curves as one single matrix animation */ - export_matrix_animation(ob, sampler); - } - - export_curve_animation_set(ob, sampler, export_as_matrix); - - if (ob->type == OB_ARMATURE && export_as_matrix) { - -#ifdef WITH_MORPH_ANIMATION - /* TODO: This needs to be handled by extra profiles, postponed for now */ - export_morph_animation(ob); -#endif - - /* Export skeletal animation (if any) */ - bArmature *arm = (bArmature *)ob->data; - LISTBASE_FOREACH (Bone *, root_bone, &arm->bonebase) { - export_bone_animations_recursive(ob, root_bone, sampler); - } - } - - close_animation_container(container_is_open); -} - -void AnimationExporter::export_curve_animation_set(Object *ob, - BCAnimationSampler &sampler, - bool export_as_matrix) -{ - BCAnimationCurveMap *curves = sampler.get_curves(ob); - bool keep_flat_curves = this->export_settings.get_keep_flat_curves(); - - BCAnimationCurveMap::iterator it; - for (it = curves->begin(); it != curves->end(); ++it) { - BCAnimationCurve &curve = *it->second; - std::string channel_type = curve.get_channel_type(); - if (channel_type == "rotation_quaternion") { - /* Can not export Quaternion animation in Collada as far as i know) - * Maybe automatically convert to euler rotation? - * Discard for now. */ - continue; - } - - if (export_as_matrix && curve.is_transform_curve()) { - /* All Transform curves will be exported within a single matrix animation, - * see export_matrix_animation() - * No need to export the curves here again. - */ - continue; - } - - if (!keep_flat_curves && !curve.is_animated()) { - continue; - } - - BCAnimationCurve *mcurve = get_modified_export_curve(ob, curve, *curves); - if (mcurve) { - export_curve_animation(ob, *mcurve); - delete mcurve; - } - else { - export_curve_animation(ob, curve); - } - } -} - -void AnimationExporter::export_matrix_animation(Object *ob, BCAnimationSampler &sampler) -{ - bool keep_flat_curves = this->export_settings.get_keep_flat_curves(); - - std::vector frames; - sampler.get_object_frames(frames, ob); - if (!frames.empty()) { - BCMatrixSampleMap samples; - bool is_animated = sampler.get_object_samples(samples, ob); - if (keep_flat_curves || is_animated) { - bAction *action = bc_getSceneObjectAction(ob); - std::string name = encode_xml(id_name(ob)); - std::string action_name = (action == nullptr) ? name + "-action" : id_name(action); - std::string channel_type = "transform"; - std::string axis; - std::string id = bc_get_action_id(action_name, name, channel_type, axis); - - std::string target = translate_id(name) + '/' + channel_type; - - BC_global_rotation_type global_rotation_type = get_global_rotation_type(ob); - export_collada_matrix_animation( - id, name, target, frames, samples, global_rotation_type, ob->parentinv); - } - } -} - -BC_global_rotation_type AnimationExporter::get_global_rotation_type(Object *ob) -{ - bool is_export_root = this->export_settings.is_export_root(ob); - if (!is_export_root) { - return BC_NO_ROTATION; - } - - bool apply_global_rotation = this->export_settings.get_apply_global_orientation(); - - return (apply_global_rotation) ? BC_DATA_ROTATION : BC_OBJECT_ROTATION; -} - -void AnimationExporter::export_bone_animations_recursive(Object *ob, - Bone *bone, - BCAnimationSampler &sampler) -{ - bool keep_flat_curves = this->export_settings.get_keep_flat_curves(); - - std::vector frames; - sampler.get_bone_frames(frames, ob, bone); - - if (!frames.empty()) { - BCMatrixSampleMap samples; - bool is_animated = sampler.get_bone_samples(samples, ob, bone); - if (keep_flat_curves || is_animated) { - export_bone_animation(ob, bone, frames, samples); - } - } - - LISTBASE_FOREACH (Bone *, child, &bone->childbase) { - export_bone_animations_recursive(ob, child, sampler); - } -} - -BCAnimationCurve *AnimationExporter::get_modified_export_curve(Object *ob, - BCAnimationCurve &curve, - BCAnimationCurveMap &curves) -{ - std::string channel_type = curve.get_channel_type(); - BCAnimationCurve *mcurve = nullptr; - if (channel_type == "lens") { - - /* Create an xfov curve */ - - BCCurveKey key(BC_ANIMATION_TYPE_CAMERA, "xfov", 0); - mcurve = new BCAnimationCurve(key, ob); - - /* now tricky part: transform the fcurve */ - BCValueMap lens_values; - curve.get_value_map(lens_values); - - BCAnimationCurve *sensor_curve = nullptr; - BCCurveKey sensor_key(BC_ANIMATION_TYPE_CAMERA, "sensor_width", 0); - BCAnimationCurveMap::iterator cit = curves.find(sensor_key); - if (cit != curves.end()) { - sensor_curve = cit->second; - } - - BCValueMap::const_iterator vit; - for (vit = lens_values.begin(); vit != lens_values.end(); ++vit) { - int frame = vit->first; - float lens_value = vit->second; - - float sensor_value; - if (sensor_curve) { - sensor_value = sensor_curve->get_value(frame); - } - else { - sensor_value = ((Camera *)ob->data)->sensor_x; - } - float value = RAD2DEGF(focallength_to_fov(lens_value, sensor_value)); - mcurve->add_value(value, frame); - } - /* to reset the handles */ - mcurve->clean_handles(); - } - return mcurve; -} - -void AnimationExporter::export_curve_animation(Object *ob, BCAnimationCurve &curve) -{ - std::string channel_target = curve.get_channel_target(); - - /* - * Some curves can not be exported as is and need some conversion - * For more information see implementation of get_modified_export_curve() - * NOTE: if mcurve is not null then it must be deleted at end of this method; - */ - - int channel_index = curve.get_channel_index(); - /* RGB or XYZ or "" */ - std::string channel_type = curve.get_channel_type(); - std::string axis = get_axis_name(channel_type, channel_index); - - std::string action_name; - bAction *action = bc_getSceneObjectAction(ob); - action_name = (action) ? id_name(action) : "constraint_anim"; - - const std::string curve_name = encode_xml(curve.get_animation_name(ob)); - std::string id = bc_get_action_id(action_name, curve_name, channel_target, axis, "."); - - std::string collada_target = translate_id(curve_name); - - if (curve.is_of_animation_type(BC_ANIMATION_TYPE_MATERIAL)) { - int material_index = curve.get_subindex(); - Material *ma = BKE_object_material_get(ob, material_index + 1); - if (ma) { - collada_target = translate_id(id_name(ma)) + "-effect/common/" + - get_collada_sid(curve, axis); - } - } - else { - collada_target += "/" + get_collada_sid(curve, axis); - } - - BC_global_rotation_type global_rotation_type = get_global_rotation_type(ob); - export_collada_curve_animation( - id, curve_name, collada_target, axis, curve, global_rotation_type); -} - -void AnimationExporter::export_bone_animation(Object *ob, - Bone *bone, - BCFrames &frames, - BCMatrixSampleMap &samples) -{ - bAction *action = bc_getSceneObjectAction(ob); - std::string bone_name(bone->name); - std::string name = encode_xml(id_name(ob)); - std::string id = bc_get_action_id(id_name(action), name, bone_name, "pose_matrix"); - std::string target = translate_id(id_name(ob) + "_" + bone_name) + "/transform"; - - BC_global_rotation_type global_rotation_type = get_global_rotation_type(ob); - export_collada_matrix_animation( - id, name, target, frames, samples, global_rotation_type, ob->parentinv); -} - -bool AnimationExporter::is_bone_deform_group(Bone *bone) -{ - bool is_def; - /* Check if current bone is deform */ - if ((bone->flag & BONE_NO_DEFORM) == 0) { - return true; - } - /* Check child bones */ - - LISTBASE_FOREACH (Bone *, child, &bone->childbase) { - /* loop through all the children until deform bone is found, and then return */ - is_def = is_bone_deform_group(child); - if (is_def) { - return true; - } - } - - /* no deform bone found in children also */ - return false; -} - -void AnimationExporter::export_collada_curve_animation( - std::string id, - std::string name, - std::string collada_target, - std::string axis, - BCAnimationCurve &curve, - BC_global_rotation_type global_rotation_type) -{ - BCFrames frames; - BCValues values; - curve.get_frames(frames); - curve.get_values(values); - - fprintf( - stdout, "Export animation curve %s (%d control points)\n", id.c_str(), int(frames.size())); - openAnimation(id, name); - BC_animation_source_type source_type = curve.is_rotation_curve() ? BC_SOURCE_TYPE_ANGLE : - BC_SOURCE_TYPE_VALUE; - - std::string input_id = collada_source_from_values( - BC_SOURCE_TYPE_TIMEFRAME, COLLADASW::InputSemantic::INPUT, frames, id, axis); - std::string output_id = collada_source_from_values( - source_type, COLLADASW::InputSemantic::OUTPUT, values, id, axis); - - bool has_tangents = false; - std::string interpolation_id; - if (this->export_settings.get_keep_smooth_curves()) { - interpolation_id = collada_interpolation_source(curve, id, axis, &has_tangents); - } - else { - interpolation_id = collada_linear_interpolation_source(frames.size(), id); - } - - std::string intangent_id; - std::string outtangent_id; - if (has_tangents) { - intangent_id = collada_tangent_from_curve( - COLLADASW::InputSemantic::IN_TANGENT, curve, id, axis); - outtangent_id = collada_tangent_from_curve( - COLLADASW::InputSemantic::OUT_TANGENT, curve, id, axis); - } - - std::string sampler_id = std::string(id) + SAMPLER_ID_SUFFIX; - - COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id); - - sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(EMPTY_STRING, input_id)); - sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(EMPTY_STRING, output_id)); - sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, - COLLADABU::URI(EMPTY_STRING, interpolation_id)); - - if (has_tangents) { - sampler.addInput(COLLADASW::InputSemantic::IN_TANGENT, - COLLADABU::URI(EMPTY_STRING, intangent_id)); - sampler.addInput(COLLADASW::InputSemantic::OUT_TANGENT, - COLLADABU::URI(EMPTY_STRING, outtangent_id)); - } - - addSampler(sampler); - addChannel(COLLADABU::URI(EMPTY_STRING, sampler_id), collada_target); - - closeAnimation(); -} - -void AnimationExporter::export_collada_matrix_animation( - std::string id, - std::string name, - std::string target, - BCFrames &frames, - BCMatrixSampleMap &samples, - BC_global_rotation_type global_rotation_type, - Matrix &parentinv) -{ - fprintf( - stdout, "Export animation matrix %s (%d control points)\n", id.c_str(), int(frames.size())); - - openAnimationWithClip(id, name); - - std::string input_id = collada_source_from_values( - BC_SOURCE_TYPE_TIMEFRAME, COLLADASW::InputSemantic::INPUT, frames, id, ""); - std::string output_id = collada_source_from_values(samples, id, global_rotation_type, parentinv); - std::string interpolation_id = collada_linear_interpolation_source(frames.size(), id); - - std::string sampler_id = std::string(id) + SAMPLER_ID_SUFFIX; - COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id); - - sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(EMPTY_STRING, input_id)); - sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(EMPTY_STRING, output_id)); - sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, - COLLADABU::URI(EMPTY_STRING, interpolation_id)); - - /* Matrix animation has no tangents */ - - addSampler(sampler); - addChannel(COLLADABU::URI(EMPTY_STRING, sampler_id), target); - - closeAnimation(); -} - -std::string AnimationExporter::get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic) -{ - switch (semantic) { - case COLLADASW::InputSemantic::INPUT: - return INPUT_SOURCE_ID_SUFFIX; - case COLLADASW::InputSemantic::OUTPUT: - return OUTPUT_SOURCE_ID_SUFFIX; - case COLLADASW::InputSemantic::INTERPOLATION: - return INTERPOLATION_SOURCE_ID_SUFFIX; - case COLLADASW::InputSemantic::IN_TANGENT: - return INTANGENT_SOURCE_ID_SUFFIX; - case COLLADASW::InputSemantic::OUT_TANGENT: - return OUTTANGENT_SOURCE_ID_SUFFIX; - default: - break; - } - return ""; -} - -void AnimationExporter::add_source_parameters(COLLADASW::SourceBase::ParameterNameList ¶m, - COLLADASW::InputSemantic::Semantics semantic, - bool is_rot, - const std::string axis, - bool transform) -{ - switch (semantic) { - case COLLADASW::InputSemantic::INPUT: - param.emplace_back("TIME"); - break; - case COLLADASW::InputSemantic::OUTPUT: - if (is_rot) { - param.emplace_back("ANGLE"); - } - else { - if (!axis.empty()) { - param.push_back(axis); - } - else if (transform) { - param.emplace_back("TRANSFORM"); - } - else { - /* assumes if axis isn't specified all axes are added */ - param.emplace_back("X"); - param.emplace_back("Y"); - param.emplace_back("Z"); - } - } - break; - case COLLADASW::InputSemantic::IN_TANGENT: - case COLLADASW::InputSemantic::OUT_TANGENT: - param.emplace_back("X"); - param.emplace_back("Y"); - break; - default: - break; - } -} - -std::string AnimationExporter::collada_tangent_from_curve( - COLLADASW::InputSemantic::Semantics semantic, - BCAnimationCurve &curve, - const std::string &anim_id, - std::string axis_name) -{ - Scene *scene = this->export_settings.get_scene(); - - std::string channel = curve.get_channel_target(); - - const std::string source_id = anim_id + get_semantic_suffix(semantic); - - bool is_angle = (bc_startswith(channel, "rotation") || channel == "spot_size"); - - COLLADASW::FloatSourceF source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(curve.sample_count()); - source.setAccessorStride(2); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - add_source_parameters(param, semantic, is_angle, axis_name, false); - - source.prepareToAppendValues(); - - const FCurve *fcu = curve.get_fcurve(); - int tangent = (semantic == COLLADASW::InputSemantic::IN_TANGENT) ? 0 : 2; - - for (int i = 0; i < fcu->totvert; i++) { - BezTriple &bezt = fcu->bezt[i]; - - float sampled_time = bezt.vec[tangent][0]; - float sampled_val = bezt.vec[tangent][1]; - - if (is_angle) { - sampled_val = RAD2DEGF(sampled_val); - } - - source.appendValues(FRA2TIME(sampled_time)); - source.appendValues(sampled_val); - } - source.finish(); - return source_id; -} - -std::string AnimationExporter::collada_source_from_values( - BC_animation_source_type source_type, - COLLADASW::InputSemantic::Semantics semantic, - std::vector &values, - const std::string &anim_id, - const std::string axis_name) -{ - BlenderContext &blender_context = this->export_settings.get_blender_context(); - Scene *scene = blender_context.get_scene(); - /* T can be float, int or double */ - - int stride = 1; - int entry_count = values.size() / stride; - std::string source_id = anim_id + get_semantic_suffix(semantic); - - COLLADASW::FloatSourceF source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(entry_count); - source.setAccessorStride(stride); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - add_source_parameters(param, semantic, source_type == BC_SOURCE_TYPE_ANGLE, axis_name, false); - - source.prepareToAppendValues(); - - for (int i = 0; i < entry_count; i++) { - float val = values[i]; - switch (source_type) { - case BC_SOURCE_TYPE_TIMEFRAME: - val = FRA2TIME(val); - break; - case BC_SOURCE_TYPE_ANGLE: - val = RAD2DEGF(val); - break; - default: - break; - } - source.appendValues(val); - } - - source.finish(); - - return source_id; -} - -std::string AnimationExporter::collada_source_from_values( - BCMatrixSampleMap &samples, - const std::string &anim_id, - BC_global_rotation_type global_rotation_type, - Matrix &parentinv) -{ - COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT; - std::string source_id = anim_id + get_semantic_suffix(semantic); - - COLLADASW::Float4x4Source source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(samples.size()); - source.setAccessorStride(16); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - add_source_parameters(param, semantic, false, "", true); - - source.prepareToAppendValues(); - - BCMatrixSampleMap::iterator it; - /* could be made configurable */ - int precision = this->export_settings.get_limit_precision() ? 6 : -1; - for (it = samples.begin(); it != samples.end(); it++) { - BCMatrix sample = BCMatrix(*it->second); - BCMatrix global_transform = this->export_settings.get_global_transform(); - DMatrix daemat; - if (this->export_settings.get_apply_global_orientation()) { - sample.apply_transform(global_transform); - } - else { - sample.add_transform(global_transform); - } - sample.get_matrix(daemat, true, precision); - source.appendValues(daemat); - } - - source.finish(); - return source_id; -} - -std::string AnimationExporter::collada_interpolation_source(const BCAnimationCurve &curve, - const std::string &anim_id, - const std::string axis, - bool *has_tangents) -{ - std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION); - - COLLADASW::NameSource source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(curve.sample_count()); - source.setAccessorStride(1); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.emplace_back("INTERPOLATION"); - - source.prepareToAppendValues(); - - *has_tangents = false; - - std::vector frames; - curve.get_frames(frames); - - for (uint i = 0; i < curve.sample_count(); i++) { - float frame = frames[i]; - int ipo = curve.get_interpolation_type(frame); - if (ipo == BEZT_IPO_BEZ) { - source.appendValues(BEZIER_NAME); - *has_tangents = true; - } - else if (ipo == BEZT_IPO_CONST) { - source.appendValues(STEP_NAME); - } - else { - /* BEZT_IPO_LIN */ - source.appendValues(LINEAR_NAME); - } - } - /* unsupported? -- HERMITE, CARDINAL, BSPLINE, NURBS */ - - source.finish(); - - return source_id; -} - -std::string AnimationExporter::collada_linear_interpolation_source(int tot, - const std::string &anim_id) -{ - std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION); - - COLLADASW::NameSource source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(tot); - source.setAccessorStride(1); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.emplace_back("INTERPOLATION"); - - source.prepareToAppendValues(); - - for (int i = 0; i < tot; i++) { - source.appendValues(LINEAR_NAME); - } - - source.finish(); - - return source_id; -} - -std::string AnimationExporter::get_collada_name(std::string channel_type) const -{ - /* - * Translation table to map FCurve animation types to Collada animation. - * TODO: Maybe we can keep the names from the fcurves here instead of - * mapping. However this is what i found in the old code. So keep - * this map for now. - */ - static std::map BC_CHANNEL_BLENDER_TO_COLLADA = { - {"rotation", "rotation"}, - {"rotation_euler", "rotation"}, - {"rotation_quaternion", "rotation"}, - {"scale", "scale"}, - {"location", "location"}, - - /* Materials */ - {"specular_color", "specular"}, - {"diffuse_color", "diffuse"}, - {"ior", "index_of_refraction"}, - {"specular_hardness", "specular_hardness"}, - {"alpha", "alpha"}, - - /* Lights */ - {"color", "color"}, - {"fall_off_angle", "falloff_angle"}, - {"spot_size", "falloff_angle"}, - {"fall_off_exponent", "falloff_exponent"}, - {"spot_blend", "falloff_exponent"}, - /* Special blender profile (TODO: make this more elegant). */ - {"blender/blender_dist", "blender/blender_dist"}, - /* Special blender profile (TODO: make this more elegant). */ - {"distance", "blender/blender_dist"}, - - /* Cameras */ - {"lens", "xfov"}, - {"xfov", "xfov"}, - {"xmag", "xmag"}, - {"zfar", "zfar"}, - {"znear", "znear"}, - {"ortho_scale", "xmag"}, - {"clip_end", "zfar"}, - {"clip_start", "znear"}}; - - std::map::iterator name_it = BC_CHANNEL_BLENDER_TO_COLLADA.find( - channel_type); - if (name_it == BC_CHANNEL_BLENDER_TO_COLLADA.end()) { - return ""; - } - std::string tm_name = name_it->second; - return tm_name; -} - -std::string AnimationExporter::get_collada_sid(const BCAnimationCurve &curve, - const std::string axis_name) -{ - std::string channel_type = curve.get_channel_type(); - std::string tm_name = get_collada_name(channel_type); - - bool is_angle = curve.is_rotation_curve(); - - if (!tm_name.empty()) { - if (is_angle) { - return tm_name + std::string(axis_name) + ".ANGLE"; - } - if (!axis_name.empty()) { - return tm_name + "." + std::string(axis_name); - } - - return tm_name; - } - - return tm_name; -} - -#ifdef WITH_MORPH_ANIMATION -/* TODO: This function needs to be implemented similar to the material animation export - * So we have to update BCSample for this to work. */ -void AnimationExporter::export_morph_animation(Object *ob, BCAnimationSampler &sampler) -{ - Key *key = BKE_key_from_object(ob); - if (!key) { - return; - } - - for (FCurve *fcu : blender::animrig::legacy::fcurves_for_assigned_action(key->adt)) { - BC_animation_transform_type tm_type = get_transform_type(fcu->rna_path); - - create_keyframed_animation(ob, fcu, tm_type, true, sampler); - } -} -#endif diff --git a/source/blender/io/collada/AnimationExporter.h b/source/blender/io/collada/AnimationExporter.h deleted file mode 100644 index d0ecc2a6d0a..00000000000 --- a/source/blender/io/collada/AnimationExporter.h +++ /dev/null @@ -1,224 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include - -#include "BCAnimationCurve.h" - -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_object_types.h" - -#include "COLLADASWInputList.h" -#include "COLLADASWLibraryAnimations.h" -#include "COLLADASWSource.h" - -#include "BCAnimationSampler.h" - -#include - -enum BC_animation_source_type { - BC_SOURCE_TYPE_VALUE, - BC_SOURCE_TYPE_ANGLE, - BC_SOURCE_TYPE_TIMEFRAME, -}; - -enum BC_global_rotation_type { BC_NO_ROTATION, BC_OBJECT_ROTATION, BC_DATA_ROTATION }; - -class AnimationExporter : COLLADASW::LibraryAnimations { - private: - COLLADASW::StreamWriter *sw; - BCExportSettings &export_settings; - - BC_global_rotation_type get_global_rotation_type(Object *ob); - - public: - AnimationExporter(COLLADASW::StreamWriter *sw, BCExportSettings &export_settings) - : COLLADASW::LibraryAnimations(sw), sw(sw), export_settings(export_settings) - { - } - - bool exportAnimations(); - - /** Called for each exported object. */ - void operator()(Object *ob); - - protected: - void export_object_constraint_animation(Object *ob); - - void export_morph_animation(Object *ob); - - void write_bone_animation_matrix(Object *ob_arm, Bone *bone); - - void write_bone_animation(Object *ob_arm, Bone *bone); - - void sample_and_write_bone_animation(Object *ob_arm, Bone *bone, int transform_type); - - void sample_and_write_bone_animation_matrix(Object *ob_arm, Bone *bone); - - void sample_animation(float *v, - std::vector &frames, - int type, - Bone *bone, - Object *ob_arm, - bPoseChannel *pChan); - - void sample_animation(std::vector &mats, - std::vector &frames, - Bone *bone, - Object *ob_arm, - bPoseChannel *pChan); - - /* dae_bone_animation -> add_bone_animation - * (blend this into dae_bone_animation) */ - void dae_bone_animation(std::vector &fra, - float *v, - int tm_type, - int axis, - std::string ob_name, - std::string bone_name); - - void dae_baked_animation(std::vector &fra, Object *ob_arm, Bone *bone); - - void dae_baked_object_animation(std::vector &fra, Object *ob); - - float convert_time(float frame); - - float convert_angle(float angle); - - std::vector> anim_meta; - - /** Main entry point into Animation export (called for each exported object). */ - void exportAnimation(Object *ob, BCAnimationSampler &sampler); - - /** - * Export all animation FCurves of an Object. - * - * \note This uses the keyframes as sample points, - * and exports "baked keyframes" while keeping the tangent information - * of the FCurves intact. This works for simple cases, but breaks - * especially when negative scales are involved in the animation. - * And when parent inverse matrices are involved (when exporting - * object hierarchies) - */ - void export_curve_animation_set(Object *ob, BCAnimationSampler &sampler, bool export_as_matrix); - - /** Export one single curve. */ - void export_curve_animation(Object *ob, BCAnimationCurve &curve); - - /** Export animation as matrix data. */ - void export_matrix_animation(Object *ob, BCAnimationSampler &sampler); - - /** Write bone animations in transform matrix sources (step through the bone hierarchy). */ - void export_bone_animations_recursive(Object *ob_arm, Bone *bone, BCAnimationSampler &sampler); - - /** Export for one bone. */ - void export_bone_animation(Object *ob, Bone *bone, BCFrames &frames, BCMatrixSampleMap &samples); - - /** Call to the low level collada exporter. */ - void export_collada_curve_animation(std::string id, - std::string name, - std::string target, - std::string axis, - BCAnimationCurve &curve, - BC_global_rotation_type global_rotation_type); - - /** Call to the low level collada exporter. */ - void export_collada_matrix_animation(std::string id, - std::string name, - std::string target, - BCFrames &frames, - BCMatrixSampleMap &samples, - BC_global_rotation_type global_rotation_type, - Matrix &parentinv); - - /** - * In some special cases the exported Curve needs to be replaced - * by a modified curve (for collada purposes) - * This method checks if a conversion is necessary and if applicable - * returns a pointer to the modified BCAnimationCurve. - * IMPORTANT: the modified curve must be deleted by the caller when no longer needed - * if no conversion is needed this method returns a NULL; - */ - BCAnimationCurve *get_modified_export_curve(Object *ob, - BCAnimationCurve &curve, - BCAnimationCurveMap &curves); - - /* Helper functions. */ - - void openAnimationWithClip(std::string id, std::string name); - bool open_animation_container(bool has_container, Object *ob); - void close_animation_container(bool has_container); - - /** Input and Output sources (single valued). */ - std::string collada_source_from_values(BC_animation_source_type source_type, - COLLADASW::InputSemantic::Semantics semantic, - std::vector &values, - const std::string &anim_id, - const std::string axis_name); - - /** Output sources (matrix data). * Create a collada matrix source for a set of samples. */ - std::string collada_source_from_values(BCMatrixSampleMap &samples, - const std::string &anim_id, - BC_global_rotation_type global_rotation_type, - Matrix &parentinv); - - /** Interpolation sources. */ - std::string collada_linear_interpolation_source(int tot, const std::string &anim_id); - - /* source ID = animation_name + semantic_suffix */ - - std::string get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic); - - void add_source_parameters(COLLADASW::SourceBase::ParameterNameList ¶m, - COLLADASW::InputSemantic::Semantics semantic, - bool is_rot, - const std::string axis, - bool transform); - - int get_point_in_curve(BCBezTriple &bezt, - COLLADASW::InputSemantic::Semantics semantic, - bool is_angle, - float *values); - int get_point_in_curve(const BCAnimationCurve &curve, - float sample_frame, - COLLADASW::InputSemantic::Semantics semantic, - bool is_angle, - float *values); - - std::string collada_tangent_from_curve(COLLADASW::InputSemantic::Semantics semantic, - BCAnimationCurve &curve, - const std::string &anim_id, - const std::string axis_name); - - std::string collada_interpolation_source(const BCAnimationCurve &curve, - const std::string &anim_id, - std::string axis_name, - bool *has_tangents); - - std::string get_axis_name(std::string channel, int id); - std::string get_collada_name(std::string channel_type) const; - /** - * Assign sid of the animated parameter or transform for rotation, - * axis name is always appended and the value of append_axis is ignored. - */ - std::string get_collada_sid(const BCAnimationCurve &curve, const std::string axis_name); - - /* ===================================== */ - /* Currently unused or not (yet?) needed */ - /* ===================================== */ - - bool is_bone_deform_group(Bone *bone); - -#if 0 - BC_animation_transform_type _get_transform_type(const std::string path); - void get_eul_source_for_quat(std::vector &cache, Object *ob); -#endif - -#ifdef WITH_MORPH_ANIMATION - void export_morph_animation(Object *ob, BCAnimationSampler &sampler); -#endif -}; diff --git a/source/blender/io/collada/AnimationImporter.cpp b/source/blender/io/collada/AnimationImporter.cpp deleted file mode 100644 index e1c07ef80b8..00000000000 --- a/source/blender/io/collada/AnimationImporter.cpp +++ /dev/null @@ -1,1417 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include - -#include "COLLADAFWAnimation.h" -#include "COLLADAFWAnimationCurve.h" -#include "COLLADAFWAnimationList.h" -#include "COLLADAFWCamera.h" -#include "COLLADAFWEffect.h" -#include "COLLADAFWLight.h" -#include "COLLADAFWNode.h" -#include "COLLADAFWRotate.h" -#include "COLLADAFWUniqueId.h" - -#include "DNA_armature_types.h" - -#include "ED_keyframing.hh" - -#include "ANIM_action.hh" -#include "ANIM_action_legacy.hh" -#include "ANIM_animdata.hh" -#include "ANIM_fcurve.hh" - -#include "BLI_math_matrix.h" -#include "BLI_string.h" - -#include "BKE_action.hh" -#include "BKE_armature.hh" -#include "BKE_fcurve.hh" -#include "BKE_object.hh" - -#include "AnimationImporter.h" -#include "ArmatureImporter.h" -#include "collada_utils.h" - -#include - -/* first try node name, if not available (since is optional), fall back to original id */ -template static const char *bc_get_joint_name(T *node) -{ - const std::string &id = node->getName(); - return id.empty() ? node->getOriginalId().c_str() : id.c_str(); -} - -/** - * Ensures that the given ID has an action assigned to it and, for layered - * actions, an assigned slot. - */ -static void ensure_action_and_slot_for_id(Main *bmain, ID &id) -{ - bAction *dna_action = blender::animrig::id_action_ensure(bmain, &id); - BLI_assert(dna_action != nullptr); - - if (blender::animrig::legacy::action_treat_as_legacy(*dna_action)) { - /* We don't ensure a slot for legacy actions, since they don't have slots. */ - return; - } - - blender::animrig::Action &action = dna_action->wrap(); - blender::animrig::Slot *slot = blender::animrig::assign_action_ensure_slot_for_keying(action, - id); - BLI_assert(slot != nullptr); - UNUSED_VARS_NDEBUG(slot); -} - -FCurve *AnimationImporter::create_fcurve(int array_index, const char *rna_path) -{ - FCurve *fcu = BKE_fcurve_create(); - fcu->flag = (FCURVE_VISIBLE | FCURVE_SELECTED); - fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path)); - fcu->array_index = array_index; - return fcu; -} - -void AnimationImporter::add_bezt(FCurve *fcu, - float frame, - float value, - eBezTriple_Interpolation ipo) -{ - // float fps = float(FPS); - BezTriple bez; - memset(&bez, 0, sizeof(BezTriple)); - bez.vec[1][0] = frame; - bez.vec[1][1] = value; - bez.ipo = ipo; /* use default interpolation mode here... */ - bez.f1 = bez.f2 = bez.f3 = SELECT; - bez.h1 = bez.h2 = HD_AUTO; - blender::animrig::insert_bezt_fcurve(fcu, &bez, INSERTKEY_NOFLAGS); - BKE_fcurve_handles_recalc(fcu); -} - -void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve) -{ - COLLADAFW::FloatOrDoubleArray &input = curve->getInputValues(); - COLLADAFW::FloatOrDoubleArray &output = curve->getOutputValues(); - - float fps = float(FPS); - size_t dim = curve->getOutDimension(); - uint i; - - std::vector &fcurves = curve_map[curve->getUniqueId()]; - - switch (dim) { - case 1: /* X, Y, Z or angle */ - case 3: /* XYZ */ - case 4: - case 16: /* matrix */ - { - for (i = 0; i < dim; i++) { - FCurve *fcu = BKE_fcurve_create(); - - fcu->flag = (FCURVE_VISIBLE | FCURVE_SELECTED); - fcu->array_index = 0; - fcu->auto_smoothing = U.auto_smoothing_new; - - for (uint j = 0; j < curve->getKeyCount(); j++) { - BezTriple bez; - memset(&bez, 0, sizeof(BezTriple)); - - /* input, output */ - bez.vec[1][0] = bc_get_float_value(input, j) * fps; - bez.vec[1][1] = bc_get_float_value(output, j * dim + i); - bez.h1 = bez.h2 = HD_AUTO; - - if (curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER || - curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_STEP) - { - COLLADAFW::FloatOrDoubleArray &intan = curve->getInTangentValues(); - COLLADAFW::FloatOrDoubleArray &outtan = curve->getOutTangentValues(); - - /* In-tangent. */ - uint index = 2 * (j * dim + i); - bez.vec[0][0] = bc_get_float_value(intan, index) * fps; - bez.vec[0][1] = bc_get_float_value(intan, index + 1); - - /* Out-tangent. */ - bez.vec[2][0] = bc_get_float_value(outtan, index) * fps; - bez.vec[2][1] = bc_get_float_value(outtan, index + 1); - if (curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER) { - bez.ipo = BEZT_IPO_BEZ; - bez.h1 = bez.h2 = HD_AUTO_ANIM; - } - else { - bez.ipo = BEZT_IPO_CONST; - } - } - else { - bez.ipo = BEZT_IPO_LIN; - } -#if 0 - bez.ipo = U.ipo_new; /* use default interpolation mode here... */ -#endif - bez.f1 = bez.f2 = bez.f3 = SELECT; - - blender::animrig::insert_bezt_fcurve(fcu, &bez, INSERTKEY_NOFLAGS); - } - - BKE_fcurve_handles_recalc(fcu); - - fcurves.push_back(fcu); - unused_curves.push_back(fcu); - } - break; - } - default: - fprintf(stderr, - "Output dimension of %d is not yet supported (animation id = %s)\n", - int(dim), - curve->getOriginalId().c_str()); - } -} - -void AnimationImporter::fcurve_deg_to_rad(FCurve *cu) -{ - for (uint i = 0; i < cu->totvert; i++) { - /* TODO: convert handles too. */ - cu->bezt[i].vec[1][1] *= DEG2RADF(1.0f); - cu->bezt[i].vec[0][1] *= DEG2RADF(1.0f); - cu->bezt[i].vec[2][1] *= DEG2RADF(1.0f); - } -} - -void AnimationImporter::fcurve_scale(FCurve *cu, int scale) -{ - for (uint i = 0; i < cu->totvert; i++) { - /* TODO: convert handles too. */ - cu->bezt[i].vec[1][1] *= scale; - cu->bezt[i].vec[0][1] *= scale; - cu->bezt[i].vec[2][1] *= scale; - } -} - -void AnimationImporter::fcurve_is_used(FCurve *fcu) -{ - unused_curves.erase(std::remove(unused_curves.begin(), unused_curves.end(), fcu), - unused_curves.end()); -} - -AnimationImporter::~AnimationImporter() -{ - /* free unused FCurves */ - for (FCurve *unused_curve : unused_curves) { - BKE_fcurve_free(unused_curve); - } - - if (!unused_curves.empty()) { - fprintf(stderr, "removed %d unused curves\n", int(unused_curves.size())); - } -} - -bool AnimationImporter::write_animation(const COLLADAFW::Animation *anim) -{ - if (anim->getAnimationType() == COLLADAFW::Animation::ANIMATION_CURVE) { - COLLADAFW::AnimationCurve *curve = (COLLADAFW::AnimationCurve *)anim; - - /* XXX Don't know if it's necessary - * Should we check outPhysicalDimension? */ - if (curve->getInPhysicalDimension() != COLLADAFW::PHYSICAL_DIMENSION_TIME) { - fprintf(stderr, "Inputs physical dimension is not time.\n"); - return true; - } - - /* a curve can have mixed interpolation type, - * in this case curve->getInterpolationTypes returns a list of interpolation types per key */ - COLLADAFW::AnimationCurve::InterpolationType interp = curve->getInterpolationType(); - - if (interp != COLLADAFW::AnimationCurve::INTERPOLATION_MIXED) { - switch (interp) { - case COLLADAFW::AnimationCurve::INTERPOLATION_LINEAR: - case COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER: - case COLLADAFW::AnimationCurve::INTERPOLATION_STEP: - animation_to_fcurves(curve); - break; - default: - /* TODO: there are also CARDINAL, HERMITE, BSPLINE and STEP types. */ - fprintf(stderr, - "CARDINAL, HERMITE and BSPLINE anim interpolation types not supported yet.\n"); - break; - } - } - else { - /* not supported yet */ - fprintf(stderr, "MIXED anim interpolation type is not supported yet.\n"); - } - } - else { - fprintf(stderr, "FORMULA animation type is not supported yet.\n"); - } - - return true; -} - -bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList *animlist) -{ - const COLLADAFW::UniqueId &animlist_id = animlist->getUniqueId(); - animlist_map[animlist_id] = animlist; - -#if 0 - - /* should not happen */ - if (uid_animated_map.find(animlist_id) == uid_animated_map.end()) { - return true; - } - - /* for bones rna_path is like: pose.bones["bone-name"].rotation */ - -#endif - - return true; -} - -void AnimationImporter::read_node_transform(COLLADAFW::Node *node, Object *ob) -{ - float mat[4][4]; - TransformReader::get_node_mat(mat, node, &uid_animated_map, ob); - if (ob) { - copy_m4_m4(ob->runtime->object_to_world.ptr(), mat); - BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), false, false); - } -} - -void AnimationImporter::modify_fcurve(std::vector *curves, - const char *rna_path, - int array_index, - int scale) -{ - std::vector::iterator it; - int i; - for (it = curves->begin(), i = 0; it != curves->end(); it++, i++) { - FCurve *fcu = *it; - fcu->rna_path = BLI_strdup(rna_path); - - if (array_index == -1) { - fcu->array_index = i; - } - else { - fcu->array_index = array_index; - } - - if (scale != 1) { - fcurve_scale(fcu, scale); - } - - fcurve_is_used(fcu); - } -} - -void AnimationImporter::unused_fcurve(std::vector *curves) -{ - /* when an error happens and we can't actually use curve remove it from unused_curves */ - std::vector::iterator it; - for (it = curves->begin(); it != curves->end(); it++) { - FCurve *fcu = *it; - fcurve_is_used(fcu); - } -} - -void AnimationImporter::find_frames(std::vector *frames, std::vector *curves) -{ - std::vector::iterator iter; - for (iter = curves->begin(); iter != curves->end(); iter++) { - FCurve *fcu = *iter; - - for (uint k = 0; k < fcu->totvert; k++) { - /* get frame value from bezTriple */ - float fra = fcu->bezt[k].vec[1][0]; - /* if frame already not added add frame to frames */ - if (std::find(frames->begin(), frames->end(), fra) == frames->end()) { - frames->push_back(fra); - } - } - } -} - -static int get_animation_axis_index(const COLLADABU::Math::Vector3 &axis) -{ - int index; - if (COLLADABU::Math::Vector3::UNIT_X == axis) { - index = 0; - } - else if (COLLADABU::Math::Vector3::UNIT_Y == axis) { - index = 1; - } - else if (COLLADABU::Math::Vector3::UNIT_Z == axis) { - index = 2; - } - else { - index = -1; - } - return index; -} - -void AnimationImporter::Assign_transform_animations( - COLLADAFW::Transformation *transform, - const COLLADAFW::AnimationList::AnimationBinding *binding, - std::vector *curves, - bool is_joint, - char *joint_path) -{ - COLLADAFW::Transformation::TransformationType tm_type = transform->getTransformationType(); - bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX; - bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE; - - /* to check if the no of curves are valid */ - bool xyz = - (ELEM(tm_type, COLLADAFW::Transformation::TRANSLATE, COLLADAFW::Transformation::SCALE) && - binding->animationClass == COLLADAFW::AnimationList::POSITION_XYZ); - - if (!((!xyz && curves->size() == 1) || (xyz && curves->size() == 3) || is_matrix)) { - fprintf(stderr, "expected %d curves, got %d\n", xyz ? 3 : 1, int(curves->size())); - return; - } - - char rna_path[100]; - - switch (tm_type) { - case COLLADAFW::Transformation::TRANSLATE: - case COLLADAFW::Transformation::SCALE: { - bool loc = tm_type == COLLADAFW::Transformation::TRANSLATE; - if (is_joint) { - SNPRINTF(rna_path, "%s.%s", joint_path, loc ? "location" : "scale"); - } - else { - STRNCPY(rna_path, loc ? "location" : "scale"); - } - - switch (binding->animationClass) { - case COLLADAFW::AnimationList::POSITION_X: - modify_fcurve(curves, rna_path, 0); - break; - case COLLADAFW::AnimationList::POSITION_Y: - modify_fcurve(curves, rna_path, 1); - break; - case COLLADAFW::AnimationList::POSITION_Z: - modify_fcurve(curves, rna_path, 2); - break; - case COLLADAFW::AnimationList::POSITION_XYZ: - modify_fcurve(curves, rna_path, -1); - break; - default: - unused_fcurve(curves); - fprintf(stderr, - "AnimationClass %d is not supported for %s.\n", - binding->animationClass, - loc ? "TRANSLATE" : "SCALE"); - } - break; - } - - case COLLADAFW::Transformation::ROTATE: { - if (is_joint) { - SNPRINTF(rna_path, "%s.rotation_euler", joint_path); - } - else { - STRNCPY(rna_path, "rotation_euler"); - } - std::vector::iterator iter; - for (iter = curves->begin(); iter != curves->end(); iter++) { - FCurve *fcu = *iter; - - /* if transform is rotation the fcurves values must be turned in to radian. */ - if (is_rotation) { - fcurve_deg_to_rad(fcu); - } - } - const COLLADAFW::Rotate *rot = (COLLADAFW::Rotate *)transform; - const COLLADABU::Math::Vector3 &axis = rot->getRotationAxis(); - - switch (binding->animationClass) { - case COLLADAFW::AnimationList::ANGLE: { - int axis_index = get_animation_axis_index(axis); - if (axis_index >= 0) { - modify_fcurve(curves, rna_path, axis_index); - } - else { - unused_fcurve(curves); - } - break; - } - case COLLADAFW::AnimationList::AXISANGLE: - /* TODO: convert axis-angle to quaternion? or XYZ? */ - default: - unused_fcurve(curves); - fprintf(stderr, - "AnimationClass %d is not supported for ROTATE transformation.\n", - binding->animationClass); - } - break; - } - - case COLLADAFW::Transformation::MATRIX: -#if 0 - { - COLLADAFW::Matrix *mat = (COLLADAFW::Matrix *)transform; - COLLADABU::Math::Matrix4 mat4 = mat->getMatrix(); - switch (binding->animationClass) { - case COLLADAFW::AnimationList::TRANSFORM: - } - } -#endif - unused_fcurve(curves); - break; - case COLLADAFW::Transformation::SKEW: - case COLLADAFW::Transformation::LOOKAT: - unused_fcurve(curves); - fprintf(stderr, "Animation of SKEW and LOOKAT transformations is not supported yet.\n"); - break; - } -} - -void AnimationImporter::Assign_color_animations(const COLLADAFW::UniqueId &listid, - AnimData &adt, - const char *anim_type) -{ - BLI_assert(adt.action != nullptr); - - char rna_path[100]; - STRNCPY(rna_path, anim_type); - - const COLLADAFW::AnimationList *animlist = animlist_map[listid]; - if (animlist == nullptr) { - fprintf(stderr, - "Collada: No animlist found for ID: %s of type %s\n", - listid.toAscii().c_str(), - anim_type); - return; - } - - const COLLADAFW::AnimationList::AnimationBindings &bindings = animlist->getAnimationBindings(); - /* all the curves belonging to the current binding */ - std::vector animcurves; - for (uint j = 0; j < bindings.getCount(); j++) { - animcurves = curve_map[bindings[j].animation]; - - switch (bindings[j].animationClass) { - case COLLADAFW::AnimationList::COLOR_R: - modify_fcurve(&animcurves, rna_path, 0); - break; - case COLLADAFW::AnimationList::COLOR_G: - modify_fcurve(&animcurves, rna_path, 1); - break; - case COLLADAFW::AnimationList::COLOR_B: - modify_fcurve(&animcurves, rna_path, 2); - break; - case COLLADAFW::AnimationList::COLOR_RGB: - case COLLADAFW::AnimationList::COLOR_RGBA: /* to do-> set intensity */ - modify_fcurve(&animcurves, rna_path, -1); - break; - - default: - unused_fcurve(&animcurves); - fprintf(stderr, - "AnimationClass %d is not supported for %s.\n", - bindings[j].animationClass, - "COLOR"); - } - - std::vector::iterator iter; - /* Add the curves of the current animation to the object */ - for (iter = animcurves.begin(); iter != animcurves.end(); iter++) { - FCurve *fcu = *iter; - blender::animrig::action_fcurve_attach( - adt.action->wrap(), adt.slot_handle, *fcu, std::nullopt); - fcurve_is_used(fcu); - } - } -} - -void AnimationImporter::Assign_float_animations(const COLLADAFW::UniqueId &listid, - AnimData &adt, - const char *anim_type) -{ - BLI_assert(adt.action != nullptr); - - char rna_path[100]; - if (animlist_map.find(listid) == animlist_map.end()) { - return; - } - - /* anim_type has animations */ - const COLLADAFW::AnimationList *animlist = animlist_map[listid]; - const COLLADAFW::AnimationList::AnimationBindings &bindings = animlist->getAnimationBindings(); - /* all the curves belonging to the current binding */ - std::vector animcurves; - for (uint j = 0; j < bindings.getCount(); j++) { - animcurves = curve_map[bindings[j].animation]; - - STRNCPY(rna_path, anim_type); - modify_fcurve(&animcurves, rna_path, 0); - std::vector::iterator iter; - /* Add the curves of the current animation to the object */ - for (iter = animcurves.begin(); iter != animcurves.end(); iter++) { - FCurve *fcu = *iter; - /* All anim_types whose values are to be converted from Degree to Radians can be ORed here - */ - if (STREQ("spot_size", anim_type)) { - /* NOTE: Do NOT convert if imported file was made by blender <= 2.69.10 - * Reason: old blender versions stored spot_size in radians (was a bug) - */ - if (this->import_from_version.empty() || - BLI_strcasecmp_natural(this->import_from_version.c_str(), "2.69.10") != -1) - { - fcurve_deg_to_rad(fcu); - } - } - /** XXX What About animation-type "rotation" ? */ - - blender::animrig::action_fcurve_attach( - adt.action->wrap(), adt.slot_handle, *fcu, std::nullopt); - fcurve_is_used(fcu); - } - } -} - -float AnimationImporter::convert_to_focal_length(float in_xfov, - int fov_type, - float aspect, - float sensorx) -{ - /* NOTE: Needs more testing (As we currently have no official test data for this) */ - float xfov = (fov_type == CAMERA_YFOV) ? - (2.0f * atanf(aspect * tanf(DEG2RADF(in_xfov) * 0.5f))) : - DEG2RADF(in_xfov); - return fov_to_focallength(xfov, sensorx); -} - -void AnimationImporter::Assign_lens_animations(const COLLADAFW::UniqueId &listid, - AnimData &adt, - const double aspect, - const Camera *cam, - const char *anim_type, - int fov_type) -{ - BLI_assert(adt.action != nullptr); - - char rna_path[100]; - if (animlist_map.find(listid) == animlist_map.end()) { - return; - } - - /* anim_type has animations */ - const COLLADAFW::AnimationList *animlist = animlist_map[listid]; - const COLLADAFW::AnimationList::AnimationBindings &bindings = animlist->getAnimationBindings(); - /* all the curves belonging to the current binding */ - std::vector animcurves; - for (uint j = 0; j < bindings.getCount(); j++) { - animcurves = curve_map[bindings[j].animation]; - - STRNCPY(rna_path, anim_type); - - modify_fcurve(&animcurves, rna_path, 0); - std::vector::iterator iter; - /* Add the curves of the current animation to the object */ - for (iter = animcurves.begin(); iter != animcurves.end(); iter++) { - FCurve *fcu = *iter; - - for (uint i = 0; i < fcu->totvert; i++) { - fcu->bezt[i].vec[0][1] = convert_to_focal_length( - fcu->bezt[i].vec[0][1], fov_type, aspect, cam->sensor_x); - fcu->bezt[i].vec[1][1] = convert_to_focal_length( - fcu->bezt[i].vec[1][1], fov_type, aspect, cam->sensor_x); - fcu->bezt[i].vec[2][1] = convert_to_focal_length( - fcu->bezt[i].vec[2][1], fov_type, aspect, cam->sensor_x); - } - - blender::animrig::action_fcurve_attach( - adt.action->wrap(), adt.slot_handle, *fcu, std::nullopt); - fcurve_is_used(fcu); - } - } -} - -void AnimationImporter::apply_matrix_curves(Object *ob, - std::vector &animcurves, - COLLADAFW::Node *root, - COLLADAFW::Node *node, - COLLADAFW::Transformation *tm) -{ - bool is_joint = node->getType() == COLLADAFW::Node::JOINT; - const char *bone_name = is_joint ? bc_get_joint_name(node) : nullptr; - char joint_path[200]; - if (is_joint) { - armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path)); - } - - std::vector frames; - find_frames(&frames, &animcurves); - - float irest_dae[4][4]; - float rest[4][4], irest[4][4]; - - if (is_joint) { - get_joint_rest_mat(irest_dae, root, node); - invert_m4(irest_dae); - - Bone *bone = BKE_armature_find_bone_name((bArmature *)ob->data, bone_name); - if (!bone) { - fprintf(stderr, "cannot find bone \"%s\"\n", bone_name); - return; - } - - unit_m4(rest); - copy_m4_m4(rest, bone->arm_mat); - invert_m4_m4(irest, rest); - } - /* new curves to assign matrix transform animation */ - FCurve *newcu[10]; /* if tm_type is matrix, then create 10 curves: 4 rot, 3 loc, 3 scale */ - uint totcu = 10; - const char *tm_str = nullptr; - char rna_path[200]; - for (int i = 0; i < totcu; i++) { - - int axis = i; - - if (i < 4) { - tm_str = "rotation_quaternion"; - axis = i; - } - else if (i < 7) { - tm_str = "location"; - axis = i - 4; - } - else { - tm_str = "scale"; - axis = i - 7; - } - - if (is_joint) { - SNPRINTF(rna_path, "%s.%s", joint_path, tm_str); - } - else { - STRNCPY(rna_path, tm_str); - } - newcu[i] = create_fcurve(axis, rna_path); - newcu[i]->totvert = frames.size(); - } - - if (frames.empty()) { - return; - } - - std::sort(frames.begin(), frames.end()); - - std::vector::iterator it; - - /* sample values at each frame */ - for (it = frames.begin(); it != frames.end(); it++) { - float fra = *it; - - float mat[4][4]; - float matfra[4][4]; - - unit_m4(matfra); - - /* calc object-space mat */ - evaluate_transform_at_frame(matfra, node, fra); - - /* for joints, we need a special matrix */ - if (is_joint) { - /* special matrix: iR * M * iR_dae * R - * where R, iR are bone rest and inverse rest mats in world space (Blender bones), - * iR_dae is joint inverse rest matrix (DAE) - * and M is an evaluated joint world-space matrix (DAE) */ - float temp[4][4], par[4][4]; - - /* calc M */ - calc_joint_parent_mat_rest(par, nullptr, root, node); - mul_m4_m4m4(temp, par, matfra); - - /* calc special matrix */ - mul_m4_series(mat, irest, temp, irest_dae, rest); - } - else { - copy_m4_m4(mat, matfra); - } - - float rot[4], loc[3], scale[3]; - mat4_decompose(loc, rot, scale, mat); - - /* add keys */ - for (int i = 0; i < totcu; i++) { - if (i < 4) { - add_bezt(newcu[i], fra, rot[i]); - } - else if (i < 7) { - add_bezt(newcu[i], fra, loc[i - 4]); - } - else { - add_bezt(newcu[i], fra, scale[i - 7]); - } - } - } - Main *bmain = CTX_data_main(mContext); - - ensure_action_and_slot_for_id(bmain, ob->id); - - /* add curves */ - for (int i = 0; i < totcu; i++) { - if (is_joint) { - add_bone_fcurve(ob, node, newcu[i]); - } - else { - blender::animrig::action_fcurve_attach( - ob->adt->action->wrap(), ob->adt->slot_handle, *newcu[i], std::nullopt); - } -#if 0 - fcurve_is_used(newcu[i]); /* never added to unused */ -#endif - } - - if (is_joint) { - bPoseChannel *chan = BKE_pose_channel_find_name(ob->pose, bone_name); - chan->rotmode = ROT_MODE_QUAT; - } - else { - ob->rotmode = ROT_MODE_QUAT; - } -} - -/* - * This function returns the aspect ration from the Collada camera. - * - * NOTE:COLLADA allows to specify either XFov, or YFov alone. - * In that case the aspect ratio can be determined from - * the viewport aspect ratio (which is 1:1 ?) - * XXX: check this: its probably wrong! - * If both values are specified, then the aspect ration is simply xfov/yfov - * and if aspect ratio is defined, then .. well then its that one. - */ -static double get_aspect_ratio(const COLLADAFW::Camera *camera) -{ - double aspect = camera->getAspectRatio().getValue(); - - if (aspect == 0) { - const double yfov = camera->getYFov().getValue(); - - if (yfov == 0) { - aspect = 1; /* assume yfov and xfov are equal */ - } - else { - const double xfov = camera->getXFov().getValue(); - if (xfov == 0) { - aspect = 1; - } - else { - aspect = xfov / yfov; - } - } - } - return aspect; -} - -void AnimationImporter::translate_Animations( - COLLADAFW::Node *node, - std::map &root_map, - std::multimap &object_map, - std::map FW_object_map, - std::map uid_material_map) -{ - bool is_joint = node->getType() == COLLADAFW::Node::JOINT; - COLLADAFW::UniqueId uid = node->getUniqueId(); - COLLADAFW::Node *root = root_map.find(uid) == root_map.end() ? node : root_map[uid]; - - Object *ob; - if (is_joint) { - ob = armature_importer->get_armature_for_joint(root); - } - else { - ob = object_map.find(uid) == object_map.end() ? nullptr : object_map.find(uid)->second; - } - - if (!ob) { - fprintf(stderr, "cannot find Object for Node with id=\"%s\"\n", node->getOriginalId().c_str()); - return; - } - - AnimationImporter::AnimMix *animType = get_animation_type(node, FW_object_map); - Main *bmain = CTX_data_main(mContext); - - if ((animType->transform) != 0) { - // const char *bone_name = is_joint ? bc_get_joint_name(node) : nullptr; /* UNUSED */ - char joint_path[200]; - - if (is_joint) { - armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path)); - } - - ensure_action_and_slot_for_id(bmain, ob->id); - - const COLLADAFW::TransformationPointerArray &nodeTransforms = node->getTransformations(); - - /* for each transformation in node */ - for (uint i = 0; i < nodeTransforms.getCount(); i++) { - COLLADAFW::Transformation *transform = nodeTransforms[i]; - COLLADAFW::Transformation::TransformationType tm_type = transform->getTransformationType(); - - bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE; - bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX; - - const COLLADAFW::UniqueId &listid = transform->getAnimationList(); - - /* check if transformation has animations */ - if (animlist_map.find(listid) == animlist_map.end()) { - continue; - } - - /* transformation has animations */ - const COLLADAFW::AnimationList *animlist = animlist_map[listid]; - const COLLADAFW::AnimationList::AnimationBindings &bindings = - animlist->getAnimationBindings(); - /* all the curves belonging to the current binding */ - std::vector animcurves; - for (uint j = 0; j < bindings.getCount(); j++) { - animcurves = curve_map[bindings[j].animation]; - if (is_matrix) { - apply_matrix_curves(ob, animcurves, root, node, transform); - } - else { - /* Calculate RNA-paths and array index of F-Curves according to transformation and - * animation class */ - Assign_transform_animations(transform, &bindings[j], &animcurves, is_joint, joint_path); - - std::vector::iterator iter; - /* Add the curves of the current animation to the object */ - for (iter = animcurves.begin(); iter != animcurves.end(); iter++) { - FCurve *fcu = *iter; - blender::animrig::action_fcurve_attach( - ob->adt->action->wrap(), ob->adt->slot_handle, *fcu, std::nullopt); - fcurve_is_used(fcu); - } - } - } - - if (is_rotation && !(is_joint || is_matrix)) { - ob->rotmode = ROT_MODE_EUL; - } - } - } - - if ((animType->light) != 0) { - Light *lamp = (Light *)ob->data; - ensure_action_and_slot_for_id(bmain, lamp->id); - - const COLLADAFW::InstanceLightPointerArray &nodeLights = node->getInstanceLights(); - - for (uint i = 0; i < nodeLights.getCount(); i++) { - const COLLADAFW::Light *light = (COLLADAFW::Light *) - FW_object_map[nodeLights[i]->getInstanciatedObjectId()]; - - if ((animType->light & LIGHT_COLOR) != 0) { - const COLLADAFW::Color *col = &light->getColor(); - const COLLADAFW::UniqueId &listid = col->getAnimationList(); - - Assign_color_animations(listid, *lamp->adt, "color"); - } - if ((animType->light & LIGHT_FOA) != 0) { - const COLLADAFW::AnimatableFloat *foa = &light->getFallOffAngle(); - const COLLADAFW::UniqueId &listid = foa->getAnimationList(); - - Assign_float_animations(listid, *lamp->adt, "spot_size"); - } - if ((animType->light & LIGHT_FOE) != 0) { - const COLLADAFW::AnimatableFloat *foe = &light->getFallOffExponent(); - const COLLADAFW::UniqueId &listid = foe->getAnimationList(); - - Assign_float_animations(listid, *lamp->adt, "spot_blend"); - } - } - } - - if (animType->camera != 0) { - - Camera *cam = (Camera *)ob->data; - ensure_action_and_slot_for_id(bmain, cam->id); - - const COLLADAFW::InstanceCameraPointerArray &nodeCameras = node->getInstanceCameras(); - - for (uint i = 0; i < nodeCameras.getCount(); i++) { - const COLLADAFW::Camera *camera = (COLLADAFW::Camera *) - FW_object_map[nodeCameras[i]->getInstanciatedObjectId()]; - - if ((animType->camera & CAMERA_XFOV) != 0) { - const COLLADAFW::AnimatableFloat *xfov = &camera->getXFov(); - const COLLADAFW::UniqueId &listid = xfov->getAnimationList(); - double aspect = get_aspect_ratio(camera); - Assign_lens_animations(listid, *cam->adt, aspect, cam, "lens", CAMERA_XFOV); - } - - else if ((animType->camera & CAMERA_YFOV) != 0) { - const COLLADAFW::AnimatableFloat *yfov = &camera->getYFov(); - const COLLADAFW::UniqueId &listid = yfov->getAnimationList(); - double aspect = get_aspect_ratio(camera); - Assign_lens_animations(listid, *cam->adt, aspect, cam, "lens", CAMERA_YFOV); - } - - else if ((animType->camera & CAMERA_XMAG) != 0) { - const COLLADAFW::AnimatableFloat *xmag = &camera->getXMag(); - const COLLADAFW::UniqueId &listid = xmag->getAnimationList(); - Assign_float_animations(listid, *cam->adt, "ortho_scale"); - } - - else if ((animType->camera & CAMERA_YMAG) != 0) { - const COLLADAFW::AnimatableFloat *ymag = &camera->getYMag(); - const COLLADAFW::UniqueId &listid = ymag->getAnimationList(); - Assign_float_animations(listid, *cam->adt, "ortho_scale"); - } - - if ((animType->camera & CAMERA_ZFAR) != 0) { - const COLLADAFW::AnimatableFloat *zfar = &camera->getFarClippingPlane(); - const COLLADAFW::UniqueId &listid = zfar->getAnimationList(); - Assign_float_animations(listid, *cam->adt, "clip_end"); - } - - if ((animType->camera & CAMERA_ZNEAR) != 0) { - const COLLADAFW::AnimatableFloat *znear = &camera->getNearClippingPlane(); - const COLLADAFW::UniqueId &listid = znear->getAnimationList(); - Assign_float_animations(listid, *cam->adt, "clip_start"); - } - } - } - if (animType->material != 0) { - const COLLADAFW::InstanceGeometryPointerArray &nodeGeoms = node->getInstanceGeometries(); - for (uint i = 0; i < nodeGeoms.getCount(); i++) { - const COLLADAFW::MaterialBindingArray &matBinds = nodeGeoms[i]->getMaterialBindings(); - for (uint j = 0; j < matBinds.getCount(); j++) { - const COLLADAFW::UniqueId &matuid = matBinds[j].getReferencedMaterial(); - const COLLADAFW::Effect *ef = (COLLADAFW::Effect *)(FW_object_map[matuid]); - if (ef != nullptr) { /* can be nullptr #28909. */ - Material *ma = uid_material_map[matuid]; - if (!ma) { - fprintf(stderr, - "Collada: Node %s refers to undefined material\n", - node->getName().c_str()); - continue; - } - ensure_action_and_slot_for_id(bmain, ma->id); - - const COLLADAFW::CommonEffectPointerArray &commonEffects = ef->getCommonEffects(); - COLLADAFW::EffectCommon *efc = commonEffects[0]; - if ((animType->material & MATERIAL_SHININESS) != 0) { - const COLLADAFW::FloatOrParam *shin = &efc->getShininess(); - const COLLADAFW::UniqueId &listid = shin->getAnimationList(); - Assign_float_animations(listid, *ma->adt, "specular_hardness"); - } - - if ((animType->material & MATERIAL_IOR) != 0) { - const COLLADAFW::FloatOrParam *ior = &efc->getIndexOfRefraction(); - const COLLADAFW::UniqueId &listid = ior->getAnimationList(); - Assign_float_animations(listid, *ma->adt, "raytrace_transparency.ior"); - } - - if ((animType->material & MATERIAL_SPEC_COLOR) != 0) { - const COLLADAFW::ColorOrTexture *cot = &efc->getSpecular(); - const COLLADAFW::UniqueId &listid = cot->getColor().getAnimationList(); - Assign_color_animations(listid, *ma->adt, "specular_color"); - } - - if ((animType->material & MATERIAL_DIFF_COLOR) != 0) { - const COLLADAFW::ColorOrTexture *cot = &efc->getDiffuse(); - const COLLADAFW::UniqueId &listid = cot->getColor().getAnimationList(); - Assign_color_animations(listid, *ma->adt, "diffuse_color"); - } - } - } - } - } - - delete animType; -} - -AnimationImporter::AnimMix *AnimationImporter::get_animation_type( - const COLLADAFW::Node *node, - std::map FW_object_map) -{ - AnimMix *types = new AnimMix(); - - const COLLADAFW::TransformationPointerArray &nodeTransforms = node->getTransformations(); - - /* for each transformation in node */ - for (uint i = 0; i < nodeTransforms.getCount(); i++) { - COLLADAFW::Transformation *transform = nodeTransforms[i]; - const COLLADAFW::UniqueId &listid = transform->getAnimationList(); - - /* check if transformation has animations */ - if (animlist_map.find(listid) == animlist_map.end()) { - continue; - } - - types->transform = types->transform | BC_NODE_TRANSFORM; - break; - } - const COLLADAFW::InstanceLightPointerArray &nodeLights = node->getInstanceLights(); - - for (uint i = 0; i < nodeLights.getCount(); i++) { - const COLLADAFW::Light *light = (COLLADAFW::Light *) - FW_object_map[nodeLights[i]->getInstanciatedObjectId()]; - types->light = setAnimType(&light->getColor(), (types->light), LIGHT_COLOR); - types->light = setAnimType(&light->getFallOffAngle(), (types->light), LIGHT_FOA); - types->light = setAnimType(&light->getFallOffExponent(), (types->light), LIGHT_FOE); - - if (types->light != 0) { - break; - } - } - - const COLLADAFW::InstanceCameraPointerArray &nodeCameras = node->getInstanceCameras(); - for (uint i = 0; i < nodeCameras.getCount(); i++) { - const COLLADAFW::Camera *camera = (COLLADAFW::Camera *) - FW_object_map[nodeCameras[i]->getInstanciatedObjectId()]; - if (camera == nullptr) { - /* Can happen if the node refers to an unknown camera. */ - continue; - } - - const bool is_perspective_type = camera->getCameraType() == COLLADAFW::Camera::PERSPECTIVE; - - int addition; - const COLLADAFW::Animatable *mag; - const COLLADAFW::UniqueId listid = camera->getYMag().getAnimationList(); - if (animlist_map.find(listid) != animlist_map.end()) { - mag = &camera->getYMag(); - addition = (is_perspective_type) ? CAMERA_YFOV : CAMERA_YMAG; - } - else { - mag = &camera->getXMag(); - addition = (is_perspective_type) ? CAMERA_XFOV : CAMERA_XMAG; - } - types->camera = setAnimType(mag, (types->camera), addition); - - types->camera = setAnimType(&camera->getFarClippingPlane(), (types->camera), CAMERA_ZFAR); - types->camera = setAnimType(&camera->getNearClippingPlane(), (types->camera), CAMERA_ZNEAR); - - if (types->camera != 0) { - break; - } - } - - const COLLADAFW::InstanceGeometryPointerArray &nodeGeoms = node->getInstanceGeometries(); - for (uint i = 0; i < nodeGeoms.getCount(); i++) { - const COLLADAFW::MaterialBindingArray &matBinds = nodeGeoms[i]->getMaterialBindings(); - for (uint j = 0; j < matBinds.getCount(); j++) { - const COLLADAFW::UniqueId &matuid = matBinds[j].getReferencedMaterial(); - const COLLADAFW::Effect *ef = (COLLADAFW::Effect *)(FW_object_map[matuid]); - if (ef != nullptr) { /* can be nullptr #28909. */ - const COLLADAFW::CommonEffectPointerArray &commonEffects = ef->getCommonEffects(); - if (!commonEffects.empty()) { - COLLADAFW::EffectCommon *efc = commonEffects[0]; - types->material = setAnimType( - &efc->getShininess(), (types->material), MATERIAL_SHININESS); - types->material = setAnimType( - &efc->getSpecular().getColor(), (types->material), MATERIAL_SPEC_COLOR); - types->material = setAnimType( - &efc->getDiffuse().getColor(), (types->material), MATERIAL_DIFF_COLOR); -#if 0 - types->material = setAnimType(&(efc->get()), (types->material), MATERIAL_TRANSPARENCY); -#endif - types->material = setAnimType( - &efc->getIndexOfRefraction(), (types->material), MATERIAL_IOR); - } - } - } - } - return types; -} - -int AnimationImporter::setAnimType(const COLLADAFW::Animatable *prop, int types, int addition) -{ - int anim_type; - const COLLADAFW::UniqueId &listid = prop->getAnimationList(); - if (animlist_map.find(listid) != animlist_map.end()) { - anim_type = types | addition; - } - else { - anim_type = types; - } - - return anim_type; -} - -void AnimationImporter::evaluate_transform_at_frame(float mat[4][4], - COLLADAFW::Node *node, - float fra) -{ - const COLLADAFW::TransformationPointerArray &tms = node->getTransformations(); - - unit_m4(mat); - - for (uint i = 0; i < tms.getCount(); i++) { - COLLADAFW::Transformation *tm = tms[i]; - COLLADAFW::Transformation::TransformationType type = tm->getTransformationType(); - float m[4][4]; - - unit_m4(m); - - std::string nodename = node->getName().empty() ? node->getOriginalId() : node->getName(); - if (!evaluate_animation(tm, m, fra, nodename.c_str())) { - switch (type) { - case COLLADAFW::Transformation::ROTATE: - dae_rotate_to_mat4(tm, m); - break; - case COLLADAFW::Transformation::TRANSLATE: - dae_translate_to_mat4(tm, m); - break; - case COLLADAFW::Transformation::SCALE: - dae_scale_to_mat4(tm, m); - break; - case COLLADAFW::Transformation::MATRIX: - dae_matrix_to_mat4(tm, m); - break; - default: - fprintf(stderr, "unsupported transformation type %d\n", type); - } - } - - float temp[4][4]; - copy_m4_m4(temp, mat); - - mul_m4_m4m4(mat, temp, m); - } -} - -static void report_class_type_unsupported(const char *path, - const COLLADAFW::AnimationList::AnimationClass animclass, - const COLLADAFW::Transformation::TransformationType type) -{ - if (animclass == COLLADAFW::AnimationList::UNKNOWN_CLASS) { - fprintf(stderr, "%s: UNKNOWN animation class\n", path); - } - else { - fprintf(stderr, - "%s: animation class %d is not supported yet for transformation type %d\n", - path, - animclass, - type); - } -} - -bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm, - float mat[4][4], - float fra, - const char *node_id) -{ - const COLLADAFW::UniqueId &listid = tm->getAnimationList(); - COLLADAFW::Transformation::TransformationType type = tm->getTransformationType(); - - if (!ELEM(type, - COLLADAFW::Transformation::ROTATE, - COLLADAFW::Transformation::SCALE, - COLLADAFW::Transformation::TRANSLATE, - COLLADAFW::Transformation::MATRIX)) - { - fprintf(stderr, "animation of transformation %d is not supported yet\n", type); - return false; - } - - if (animlist_map.find(listid) == animlist_map.end()) { - return false; - } - - const COLLADAFW::AnimationList *animlist = animlist_map[listid]; - const COLLADAFW::AnimationList::AnimationBindings &bindings = animlist->getAnimationBindings(); - - if (bindings.getCount()) { - float vec[3]; - - bool is_scale = (type == COLLADAFW::Transformation::SCALE); - bool is_translate = (type == COLLADAFW::Transformation::TRANSLATE); - - if (is_scale) { - dae_scale_to_v3(tm, vec); - } - else if (is_translate) { - dae_translate_to_v3(tm, vec); - } - - for (uint index = 0; index < bindings.getCount(); index++) { - const COLLADAFW::AnimationList::AnimationBinding &binding = bindings[index]; - std::vector &curves = curve_map[binding.animation]; - COLLADAFW::AnimationList::AnimationClass animclass = binding.animationClass; - char path[100]; - - switch (type) { - case COLLADAFW::Transformation::ROTATE: - SNPRINTF(path, "%s.rotate (binding %u)", node_id, index); - break; - case COLLADAFW::Transformation::SCALE: - SNPRINTF(path, "%s.scale (binding %u)", node_id, index); - break; - case COLLADAFW::Transformation::TRANSLATE: - SNPRINTF(path, "%s.translate (binding %u)", node_id, index); - break; - case COLLADAFW::Transformation::MATRIX: - SNPRINTF(path, "%s.matrix (binding %u)", node_id, index); - break; - default: - break; - } - - if (type == COLLADAFW::Transformation::ROTATE) { - if (curves.size() != 1) { - fprintf(stderr, "expected 1 curve, got %d\n", int(curves.size())); - return false; - } - - /* TODO: support other animation-classes. */ - if (animclass != COLLADAFW::AnimationList::ANGLE) { - report_class_type_unsupported(path, animclass, type); - return false; - } - - COLLADABU::Math::Vector3 &axis = ((COLLADAFW::Rotate *)tm)->getRotationAxis(); - - float ax[3] = {float(axis[0]), float(axis[1]), float(axis[2])}; - float angle = evaluate_fcurve(curves[0], fra); - axis_angle_to_mat4(mat, ax, angle); - - return true; - } - if (is_scale || is_translate) { - bool is_xyz = animclass == COLLADAFW::AnimationList::POSITION_XYZ; - - if ((!is_xyz && curves.size() != 1) || (is_xyz && curves.size() != 3)) { - if (is_xyz) { - fprintf(stderr, "%s: expected 3 curves, got %d\n", path, int(curves.size())); - } - else { - fprintf(stderr, "%s: expected 1 curve, got %d\n", path, int(curves.size())); - } - return false; - } - - switch (animclass) { - case COLLADAFW::AnimationList::POSITION_X: - vec[0] = evaluate_fcurve(curves[0], fra); - break; - case COLLADAFW::AnimationList::POSITION_Y: - vec[1] = evaluate_fcurve(curves[0], fra); - break; - case COLLADAFW::AnimationList::POSITION_Z: - vec[2] = evaluate_fcurve(curves[0], fra); - break; - case COLLADAFW::AnimationList::POSITION_XYZ: - vec[0] = evaluate_fcurve(curves[0], fra); - vec[1] = evaluate_fcurve(curves[1], fra); - vec[2] = evaluate_fcurve(curves[2], fra); - break; - default: - report_class_type_unsupported(path, animclass, type); - break; - } - } - else if (type == COLLADAFW::Transformation::MATRIX) { - /* for now, of matrix animation, - * support only the case when all values are packed into one animation */ - if (curves.size() != 16) { - fprintf(stderr, "%s: expected 16 curves, got %d\n", path, int(curves.size())); - return false; - } - - COLLADABU::Math::Matrix4 matrix; - int mi = 0, mj = 0; - - for (const FCurve *curve : curves) { - matrix.setElement(mi, mj, evaluate_fcurve(curve, fra)); - mj++; - if (mj == 4) { - mi++; - mj = 0; - } - } - UnitConverter::dae_matrix_to_mat4_(mat, matrix); - return true; - } - } - - if (is_scale) { - size_to_mat4(mat, vec); - } - else { - copy_v3_v3(mat[3], vec); - } - - return is_scale || is_translate; - } - - return false; -} - -void AnimationImporter::get_joint_rest_mat(float mat[4][4], - COLLADAFW::Node *root, - COLLADAFW::Node *node) -{ - /* if bind mat is not available, - * use "current" node transform, i.e. all those tms listed inside */ - if (!armature_importer->get_joint_bind_mat(mat, node)) { - float par[4][4], m[4][4]; - - calc_joint_parent_mat_rest(par, nullptr, root, node); - get_node_mat(m, node, nullptr, nullptr); - mul_m4_m4m4(mat, par, m); - } -} - -bool AnimationImporter::calc_joint_parent_mat_rest(float mat[4][4], - float par[4][4], - COLLADAFW::Node *node, - COLLADAFW::Node *end) -{ - float m[4][4]; - - if (node == end) { - par ? copy_m4_m4(mat, par) : unit_m4(mat); - return true; - } - - /* use bind matrix if available or calc "current" world mat */ - if (!armature_importer->get_joint_bind_mat(m, node)) { - if (par) { - float temp[4][4]; - get_node_mat(temp, node, nullptr, nullptr); - mul_m4_m4m4(m, par, temp); - } - else { - get_node_mat(m, node, nullptr, nullptr); - } - } - - COLLADAFW::NodePointerArray &children = node->getChildNodes(); - for (uint i = 0; i < children.getCount(); i++) { - if (calc_joint_parent_mat_rest(mat, m, children[i], end)) { - return true; - } - } - - return false; -} - -void AnimationImporter::add_bone_fcurve(Object *ob, COLLADAFW::Node *node, FCurve *fcu) -{ - BLI_assert(ob->adt != nullptr && ob->adt->action != nullptr); - - const char *bone_name = bc_get_joint_name(node); - - blender::animrig::action_fcurve_attach( - ob->adt->action->wrap(), ob->adt->slot_handle, *fcu, bone_name); -} - -void AnimationImporter::set_import_from_version(std::string import_from_version) -{ - this->import_from_version = import_from_version; -} diff --git a/source/blender/io/collada/AnimationImporter.h b/source/blender/io/collada/AnimationImporter.h deleted file mode 100644 index 3cc758f4109..00000000000 --- a/source/blender/io/collada/AnimationImporter.h +++ /dev/null @@ -1,222 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include -#include - -#include "COLLADAFWAnimation.h" -#include "COLLADAFWAnimationCurve.h" -#include "COLLADAFWAnimationList.h" -#include "COLLADAFWNode.h" -#include "COLLADAFWUniqueId.h" - -#include "BKE_context.hh" - -#include "DNA_anim_types.h" - -#include "DNA_camera_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -// #include "ArmatureImporter.h" -#include "TransformReader.h" - -#include "collada_internal.h" - -class ArmatureImporter; - -class AnimationImporterBase { - public: - // virtual void change_eul_to_quat(Object *ob, bAction *act) = 0; -}; - -class AnimationImporter : private TransformReader, public AnimationImporterBase { - private: - bContext *mContext; - ArmatureImporter *armature_importer; - Scene *scene; - - std::map> curve_map; - std::map uid_animated_map; - // std::map > fcurves_actionGroup_map; - std::map animlist_map; - std::vector unused_curves; - std::map joint_objects; - - FCurve *create_fcurve(int array_index, const char *rna_path); - - void add_bezt(FCurve *fcu, - float frame, - float value, - eBezTriple_Interpolation ipo = BEZT_IPO_LIN); - - /** - * Create one or several fcurves depending on the number of parameters being animated. - */ - void animation_to_fcurves(COLLADAFW::AnimationCurve *curve); - - void fcurve_deg_to_rad(FCurve *cu); - void fcurve_scale(FCurve *cu, int scale); - - void fcurve_is_used(FCurve *fcu); - - int typeFlag; - - std::string import_from_version; - - enum lightAnim { - // INANIMATE = 0, - LIGHT_COLOR = 2, - LIGHT_FOA = 4, - LIGHT_FOE = 8, - }; - - enum cameraAnim { - // INANIMATE = 0, - CAMERA_XFOV = 2, - CAMERA_XMAG = 4, - CAMERA_YFOV = 8, - CAMERA_YMAG = 16, - CAMERA_ZFAR = 32, - CAMERA_ZNEAR = 64, - }; - - enum matAnim { - MATERIAL_SHININESS = 2, - MATERIAL_SPEC_COLOR = 4, - MATERIAL_DIFF_COLOR = 1 << 3, - MATERIAL_TRANSPARENCY = 1 << 4, - MATERIAL_IOR = 1 << 5, - }; - - enum AnimationType { - BC_INANIMATE = 0, - BC_NODE_TRANSFORM = 1, - }; - - struct AnimMix { - int transform; - int light; - int camera; - int material; - int texture; - }; - - public: - AnimationImporter(bContext *C, UnitConverter *conv, ArmatureImporter *arm, Scene *scene) - : TransformReader(conv), mContext(C), armature_importer(arm), scene(scene) - { - } - - ~AnimationImporter(); - - void set_import_from_version(std::string import_from_version); - bool write_animation(const COLLADAFW::Animation *anim); - - /** Called on post-process stage after writeVisualScenes. */ - bool write_animation_list(const COLLADAFW::AnimationList *animlist); - - /** - * \todo refactor read_node_transform to not automatically apply anything, - * but rather return the transform matrix, so caller can do with it what is - * necessary. Same for \ref get_node_mat - */ - void read_node_transform(COLLADAFW::Node *node, Object *ob); - // virtual void change_eul_to_quat(Object *ob, bAction *act); - - void translate_Animations(COLLADAFW::Node *Node, - std::map &root_map, - std::multimap &object_map, - std::map FW_object_map, - std::map uid_material_map); - - /** - * Check if object is animated by checking if animlist_map - * holds the animlist_id of node transforms. - */ - AnimMix *get_animation_type( - const COLLADAFW::Node *node, - std::map FW_object_map); - - void apply_matrix_curves(Object *ob, - std::vector &animcurves, - COLLADAFW::Node *root, - COLLADAFW::Node *node, - COLLADAFW::Transformation *tm); - - /** - * Creates the rna_paths and array indices of fcurves from animations using transformation and - * bound animation class of each animation. - */ - void Assign_transform_animations(COLLADAFW::Transformation *transform, - const COLLADAFW::AnimationList::AnimationBinding *binding, - std::vector *curves, - bool is_joint, - char *joint_path); - - /** - * Creates the rna_paths and array indices of fcurves from animations using color and bound - * animation class of each animation. - */ - void Assign_color_animations(const COLLADAFW::UniqueId &listid, - AnimData &adt, - const char *anim_type); - void Assign_float_animations(const COLLADAFW::UniqueId &listid, - AnimData &adt, - const char *anim_type); - /** - * Lens animations must be stored in COLLADA by using FOV, - * while blender internally uses focal length. - * The imported animation curves must be converted appropriately. - */ - void Assign_lens_animations(const COLLADAFW::UniqueId &listid, - AnimData &adt, - double aspect, - const Camera *cam, - const char *anim_type, - int fov_type); - - int setAnimType(const COLLADAFW::Animatable *prop, int type, int addition); - - /** Sets the rna_path and array index to curve. */ - void modify_fcurve(std::vector *curves, - const char *rna_path, - int array_index, - int scale = 1); - void unused_fcurve(std::vector *curves); - - void find_frames(std::vector *frames, std::vector *curves); - - /** - * Internal, better make it private - * WARNING: evaluates only rotation and only assigns matrix transforms now - * prerequisites: animlist_map, curve_map. - */ - void evaluate_transform_at_frame(float mat[4][4], COLLADAFW::Node *node, float fra); - - /** Return true to indicate that mat contains a sane value. */ - bool evaluate_animation(COLLADAFW::Transformation *tm, - float mat[4][4], - float fra, - const char *node_id); - - /** Gives a world-space mat of joint at rest position. */ - void get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *root, COLLADAFW::Node *node); - - /** * Gives a world-space mat, end's mat not included. */ - bool calc_joint_parent_mat_rest(float mat[4][4], - float par[4][4], - COLLADAFW::Node *node, - COLLADAFW::Node *end); - - float convert_to_focal_length(float in_xfov, int fov_type, float aspect, float sensorx); - - void add_bone_fcurve(Object *ob, COLLADAFW::Node *node, FCurve *fcu); -}; diff --git a/source/blender/io/collada/ArmatureExporter.cpp b/source/blender/io/collada/ArmatureExporter.cpp deleted file mode 100644 index bd3aff68253..00000000000 --- a/source/blender/io/collada/ArmatureExporter.cpp +++ /dev/null @@ -1,345 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "COLLADASWInstanceController.h" - -#include "BKE_armature.hh" - -#include "ED_armature.hh" - -#include "BLI_listbase.h" -#include "BLI_math_matrix.h" - -#include "ArmatureExporter.h" -#include "SceneExporter.h" - -#include "collada_utils.h" - -void ArmatureExporter::add_bone_collections(Object *ob_arm, COLLADASW::Node &node) -{ - bArmature *armature = (bArmature *)ob_arm->data; - - /* Because our importer assumes that "extras" tags have a unique name, it's not possible to - * export a `` element per bone collection. This is why all the names are stored - * in one element, newline-separated. */ - - std::stringstream collection_stream; - std::stringstream visible_stream; - for (const BoneCollection *bcoll : armature->collections_span()) { - collection_stream << bcoll->name << "\n"; - - if (bcoll->flags & BONE_COLLECTION_VISIBLE) { - visible_stream << bcoll->name << "\n"; - } - } - - std::string collection_names = collection_stream.str(); - if (collection_names.length() > 1) { - collection_names.pop_back(); /* Pop off the last `\n`. */ - node.addExtraTechniqueParameter("blender", "collections", collection_names); - } - - std::string visible_names = visible_stream.str(); - if (visible_names.length() > 1) { - visible_names.pop_back(); /* Pop off the last `\n`. */ - node.addExtraTechniqueParameter("blender", "visible_collections", visible_names); - } - - if (armature->runtime.active_collection) { - node.addExtraTechniqueParameter( - "blender", "active_collection", std::string(armature->active_collection_name)); - } -} - -void ArmatureExporter::add_armature_bones(Object *ob_arm, - ViewLayer *view_layer, - SceneExporter *se, - std::vector &child_objects) - -{ - /* write bone nodes */ - - bArmature *armature = (bArmature *)ob_arm->data; - bool is_edited = armature->edbo != nullptr; - - if (!is_edited) { - ED_armature_to_edit(armature); - } - - LISTBASE_FOREACH (Bone *, bone, &armature->bonebase) { - add_bone_node(bone, ob_arm, se, child_objects); - } - - if (!is_edited) { - ED_armature_edit_free(armature); - } -} - -void ArmatureExporter::write_bone_URLs(COLLADASW::InstanceController &ins, - Object *ob_arm, - Bone *bone) -{ - if (bc_is_root_bone(bone, this->export_settings.get_deform_bones_only())) { - std::string joint_id = translate_id(id_name(ob_arm) + "_" + bone->name); - ins.addSkeleton(COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, joint_id)); - } - else { - LISTBASE_FOREACH (Bone *, child, &bone->childbase) { - write_bone_URLs(ins, ob_arm, child); - } - } -} - -bool ArmatureExporter::add_instance_controller(Object *ob) -{ - Object *ob_arm = bc_get_assigned_armature(ob); - bArmature *arm = (bArmature *)ob_arm->data; - - const std::string &controller_id = get_controller_id(ob_arm, ob); - - COLLADASW::InstanceController ins(mSW); - ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id)); - - Mesh *mesh = (Mesh *)ob->data; - if (mesh->deform_verts().is_empty()) { - return false; - } - - /* write root bone URLs */ - LISTBASE_FOREACH (Bone *, bone, &arm->bonebase) { - write_bone_URLs(ins, ob_arm, bone); - } - - InstanceWriter::add_material_bindings( - ins.getBindMaterial(), ob, this->export_settings.get_active_uv_only()); - - ins.add(); - return true; -} - -#if 0 -void ArmatureExporter::operator()(Object *ob) -{ - Object *ob_arm = bc_get_assigned_armature(ob); -} - -bool ArmatureExporter::already_written(Object *ob_arm) -{ - return std::find(written_armatures.begin(), written_armatures.end(), ob_arm) != - written_armatures.end(); -} - -void ArmatureExporter::wrote(Object *ob_arm) -{ - written_armatures.push_back(ob_arm); -} - -void ArmatureExporter::find_objects_using_armature(Object *ob_arm, - std::vector &objects, - Scene *sce) -{ - objects.clear(); - - Base *base = (Base *)sce->base.first; - while (base) { - Object *ob = base->object; - - if (ob->type == OB_MESH && get_assigned_armature(ob) == ob_arm) { - objects.push_back(ob); - } - - base = base->next; - } -} -#endif - -void ArmatureExporter::add_bone_node(Bone *bone, - Object *ob_arm, - SceneExporter *se, - std::vector &child_objects) -{ - if (can_export(bone)) { - std::string node_id = translate_id(id_name(ob_arm) + "_" + bone->name); - std::string node_name = std::string(bone->name); - std::string node_sid = get_joint_sid(bone); - - COLLADASW::Node node(mSW); - - node.setType(COLLADASW::Node::JOINT); - node.setNodeId(node_id); - node.setNodeName(node_name); - node.setNodeSid(node_sid); - - if (this->export_settings.get_use_blender_profile()) { - if (!is_export_root(bone)) { - if (bone->flag & BONE_CONNECTED) { - node.addExtraTechniqueParameter("blender", "connect", true); - } - } - - std::string collection_names; - LISTBASE_FOREACH (const BoneCollectionReference *, bcoll_ref, &bone->runtime.collections) { - collection_names += std::string(bcoll_ref->bcoll->name) + "\n"; - } - if (collection_names.length() > 1) { - collection_names.pop_back(); /* Pop off the last `\n`. */ - node.addExtraTechniqueParameter("blender", "", collection_names, "", "collections"); - } - - bArmature *armature = (bArmature *)ob_arm->data; - EditBone *ebone = bc_get_edit_bone(armature, bone->name); - if (ebone && ebone->roll != 0) { - node.addExtraTechniqueParameter("blender", "roll", ebone->roll); - } - if (bc_is_leaf_bone(bone)) { - Vector head, tail; - const BCMatrix &global_transform = this->export_settings.get_global_transform(); - if (this->export_settings.get_apply_global_orientation()) { - bc_add_global_transform(head, bone->arm_head, global_transform); - bc_add_global_transform(tail, bone->arm_tail, global_transform); - } - else { - copy_v3_v3(head, bone->arm_head); - copy_v3_v3(tail, bone->arm_tail); - } - node.addExtraTechniqueParameter("blender", "tip_x", tail[0] - head[0]); - node.addExtraTechniqueParameter("blender", "tip_y", tail[1] - head[1]); - node.addExtraTechniqueParameter("blender", "tip_z", tail[2] - head[2]); - } - } - - node.start(); - - add_bone_transform(ob_arm, bone, node); - - /* Write nodes of child-objects, remove written objects from list. */ - std::vector::iterator iter = child_objects.begin(); - - while (iter != child_objects.end()) { - Object *ob = *iter; - if (ob->partype == PARBONE && STREQ(ob->parsubstr, bone->name)) { - float backup_parinv[4][4]; - copy_m4_m4(backup_parinv, ob->parentinv); - - /* Crude, temporary change to parentinv - * so transform gets exported correctly. */ - - /* Add bone tail- translation... don't know why - * bone parenting is against the tail of a bone - * and not its head, seems arbitrary. */ - ob->parentinv[3][1] += bone->length; - - /* OPEN_SIM_COMPATIBILITY - * TODO: when such objects are animated as - * single matrix the tweak must be applied - * to the result. */ - if (export_settings.get_open_sim()) { - /* Tweak objects parent-inverse to match compatibility. */ - float temp[4][4]; - - copy_m4_m4(temp, bone->arm_mat); - temp[3][0] = temp[3][1] = temp[3][2] = 0.0f; - - mul_m4_m4m4(ob->parentinv, temp, ob->parentinv); - } - - se->writeNode(ob); - copy_m4_m4(ob->parentinv, backup_parinv); - iter = child_objects.erase(iter); - } - else { - iter++; - } - } - - LISTBASE_FOREACH (Bone *, child, &bone->childbase) { - add_bone_node(child, ob_arm, se, child_objects); - } - node.end(); - } - else { - LISTBASE_FOREACH (Bone *, child, &bone->childbase) { - add_bone_node(child, ob_arm, se, child_objects); - } - } -} - -bool ArmatureExporter::is_export_root(Bone *bone) -{ - Bone *entry = bone->parent; - while (entry) { - if (can_export(entry)) { - return false; - } - entry = entry->parent; - } - return can_export(bone); -} - -void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node &node) -{ - // bPoseChannel *pchan = BKE_pose_channel_find_name(ob_arm->pose, bone->name); - - float mat[4][4]; - float bone_rest_mat[4][4]; /* derived from bone->arm_mat */ - float parent_rest_mat[4][4]; /* derived from bone->parent->arm_mat */ - - bool has_restmat = bc_get_property_matrix(bone, "rest_mat", mat); - - if (!has_restmat) { - - /* Have no rest-pose matrix stored, try old style <= Blender 2.78. */ - - bc_create_restpose_mat(this->export_settings, bone, bone_rest_mat, bone->arm_mat, true); - - if (is_export_root(bone)) { - copy_m4_m4(mat, bone_rest_mat); - } - else { - Matrix parent_inverse; - bc_create_restpose_mat( - this->export_settings, bone->parent, parent_rest_mat, bone->parent->arm_mat, true); - - invert_m4_m4(parent_inverse, parent_rest_mat); - mul_m4_m4m4(mat, parent_inverse, bone_rest_mat); - } - - /* OPEN_SIM_COMPATIBILITY */ - - if (export_settings.get_open_sim()) { - /* Remove rotations vs armature from transform - * parent_rest_rot * mat * irest_rot */ - Matrix workmat; - copy_m4_m4(workmat, bone_rest_mat); - - workmat[3][0] = workmat[3][1] = workmat[3][2] = 0.0f; - invert_m4(workmat); - - mul_m4_m4m4(mat, mat, workmat); - - if (!is_export_root(bone)) { - copy_m4_m4(workmat, parent_rest_mat); - workmat[3][0] = workmat[3][1] = workmat[3][2] = 0.0f; - - mul_m4_m4m4(mat, workmat, mat); - } - } - } - - if (this->export_settings.get_limit_precision()) { - BCMatrix::sanitize(mat, LIMITTED_PRECISION); - } - - TransformWriter::add_joint_transform(node, mat, nullptr, this->export_settings, has_restmat); -} - -std::string ArmatureExporter::get_controller_id(Object *ob_arm, Object *ob) -{ - return translate_id(id_name(ob_arm)) + "_" + translate_id(id_name(ob)) + - SKIN_CONTROLLER_ID_SUFFIX; -} diff --git a/source/blender/io/collada/ArmatureExporter.h b/source/blender/io/collada/ArmatureExporter.h deleted file mode 100644 index fb222f89dce..00000000000 --- a/source/blender/io/collada/ArmatureExporter.h +++ /dev/null @@ -1,93 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include - -#include -#include -#include -#include -#include - -#include "DNA_armature_types.h" -#include "DNA_object_types.h" - -#include "InstanceWriter.h" -#include "TransformWriter.h" - -#include "ExportSettings.h" - -class SceneExporter; - -/* XXX exporter writes wrong data for shared armatures. A separate - * controller should be written for each armature-mesh binding how do - * we make controller ids then? */ -class ArmatureExporter : public COLLADASW::LibraryControllers, - protected TransformWriter, - protected InstanceWriter { - public: - /* XXX exporter writes wrong data for shared armatures. A separate - * controller should be written for each armature-mesh binding how do - * we make controller ids then? */ - ArmatureExporter(BlenderContext &blender_context, - COLLADASW::StreamWriter *sw, - BCExportSettings &export_settings) - : COLLADASW::LibraryControllers(sw), - blender_context(blender_context), - export_settings(export_settings) - { - } - - void add_bone_collections(Object *ob_arm, COLLADASW::Node &node); - - /* write bone nodes */ - void add_armature_bones(Object *ob_arm, - ViewLayer *view_layer, - SceneExporter *se, - std::vector &child_objects); - - bool add_instance_controller(Object *ob); - - private: - BlenderContext &blender_context; - BCExportSettings &export_settings; - -#if 0 - std::vector written_armatures; - - bool already_written(Object *ob_arm); - - void wrote(Object *ob_arm); - - void find_objects_using_armature(Object *ob_arm, std::vector &objects, Scene *sce); -#endif - - /** - * Scene, SceneExporter and the list of child_objects - * are required for writing bone parented objects. - * \param parent_mat: is armature-space. - */ - void add_bone_node(Bone *bone, - Object *ob_arm, - SceneExporter *se, - std::vector &child_objects); - - bool can_export(Bone *bone) - { - return !(export_settings.get_deform_bones_only() && bone->flag & BONE_NO_DEFORM); - } - - bool is_export_root(Bone *bone); - void add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node &node); - - std::string get_controller_id(Object *ob_arm, Object *ob); - - void write_bone_URLs(COLLADASW::InstanceController &ins, Object *ob_arm, Bone *bone); -}; diff --git a/source/blender/io/collada/ArmatureImporter.cpp b/source/blender/io/collada/ArmatureImporter.cpp deleted file mode 100644 index 5556f49465f..00000000000 --- a/source/blender/io/collada/ArmatureImporter.cpp +++ /dev/null @@ -1,1103 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include -#include - -#include "COLLADAFWUniqueId.h" - -#include "DNA_key_types.h" - -#include "BKE_action.hh" -#include "BKE_armature.hh" -#include "BKE_object.hh" -#include "BLI_listbase.h" -#include "BLI_math_matrix.h" -#include "BLI_string.h" -#include "ED_armature.hh" - -#include "ANIM_bone_collections.hh" - -#include "DEG_depsgraph.hh" - -#include "ArmatureImporter.h" -#include "collada_utils.h" - -/* use node name, or fall back to original id if not present (name is optional) */ -template static const char *bc_get_joint_name(T *node) -{ - const std::string &id = node->getName(); - return id.empty() ? node->getOriginalId().c_str() : id.c_str(); -} - -ArmatureImporter::ArmatureImporter(UnitConverter *conv, - MeshImporterBase *mesh, - Main *bmain, - Scene *sce, - ViewLayer *view_layer, - const ImportSettings *import_settings) - : TransformReader(conv), - m_bmain(bmain), - scene(sce), - view_layer(view_layer), - unit_converter(conv), - import_settings(import_settings), - empty(nullptr), - mesh_importer(mesh) -{ -} - -ArmatureImporter::~ArmatureImporter() -{ - /* free skin controller data if we forget to do this earlier */ - std::map::iterator it; - for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) { - it->second.free(); - } -} - -#if 0 -JointData *ArmatureImporter::get_joint_data(COLLADAFW::Node *node); -{ - const COLLADAFW::UniqueId &joint_id = node->getUniqueId(); - - if (joint_id_to_joint_index_map.find(joint_id) == joint_id_to_joint_index_map.end()) { - fprintf( - stderr, "Cannot find a joint index by joint id for %s.\n", node->getOriginalId().c_str()); - return nullptr; - } - - int joint_index = joint_id_to_joint_index_map[joint_id]; - - return &joint_index_to_joint_info_map[joint_index]; -} -#endif - -int ArmatureImporter::create_bone(SkinInfo *skin, - COLLADAFW::Node *node, - EditBone *parent, - int totchild, - float parent_mat[4][4], - bArmature *arm, - std::vector &layer_labels) -{ - float mat[4][4]; - float joint_inv_bind_mat[4][4]; - float joint_bind_mat[4][4]; - int chain_length = 0; - - /* Checking if bone is already made. */ - std::vector::iterator it; - it = std::find(finished_joints.begin(), finished_joints.end(), node); - if (it != finished_joints.end()) { - return chain_length; - } - - EditBone *bone = ED_armature_ebone_add(arm, bc_get_joint_name(node)); - totbone++; - - /* - * We use the inv_bind_shape matrix to apply the armature bind pose as its rest pose. - */ - - std::map::iterator skin_it; - bool bone_is_skinned = false; - for (skin_it = skin_by_data_uid.begin(); skin_it != skin_by_data_uid.end(); skin_it++) { - - SkinInfo *b = &skin_it->second; - if (b->get_joint_inv_bind_matrix(joint_inv_bind_mat, node)) { - - /* get original world-space matrix */ - invert_m4_m4(mat, joint_inv_bind_mat); - copy_m4_m4(joint_bind_mat, mat); - /* And make local to armature */ - Object *ob_arm = skin->BKE_armature_from_object(); - if (ob_arm) { - float invmat[4][4]; - invert_m4_m4(invmat, ob_arm->object_to_world().ptr()); - mul_m4_m4m4(mat, invmat, mat); - } - - bone_is_skinned = true; - break; - } - } - - /* create a bone even if there's no joint data for it (i.e. it has no influence) */ - if (!bone_is_skinned) { - get_node_mat(mat, node, nullptr, nullptr, parent_mat); - } - - if (parent) { - bone->parent = parent; - } - - float loc[3], size[3], rot[3][3]; - BoneExtensionMap &extended_bones = bone_extension_manager.getExtensionMap(arm); - BoneExtended &be = add_bone_extended(bone, node, totchild, layer_labels, extended_bones); - - for (const std::string &bcoll_name : be.get_bone_collections()) { - BoneCollection *bcoll = ANIM_armature_bonecoll_get_by_name(arm, bcoll_name.c_str()); - if (bcoll) { - ANIM_armature_bonecoll_assign_editbone(bcoll, bone); - } - } - - float *tail = be.get_tail(); - int use_connect = be.get_use_connect(); - - switch (use_connect) { - case 1: - bone->flag |= BONE_CONNECTED; - break; - case -1: /* Connect type not specified */ - case 0: - bone->flag &= ~BONE_CONNECTED; - break; - } - - if (be.has_roll()) { - bone->roll = be.get_roll(); - } - else { - float angle; - mat4_to_loc_rot_size(loc, rot, size, mat); - mat3_to_vec_roll(rot, nullptr, &angle); - bone->roll = angle; - } - copy_v3_v3(bone->head, mat[3]); - - if (bone_is_skinned && this->import_settings->keep_bind_info) { - float rest_mat[4][4]; - get_node_mat(rest_mat, node, nullptr, nullptr, nullptr); - bc_set_IDPropertyMatrix(bone, "bind_mat", joint_bind_mat); - bc_set_IDPropertyMatrix(bone, "rest_mat", rest_mat); - } - - add_v3_v3v3(bone->tail, bone->head, tail); /* tail must be non zero */ - - /* find smallest bone length in armature (used later for leaf bone length) */ - if (parent) { - - if (use_connect == 1) { - copy_v3_v3(parent->tail, bone->head); - } - - /* guess reasonable leaf bone length */ - float length = len_v3v3(parent->head, bone->head); - if ((length < leaf_bone_length || totbone == 0) && length > MINIMUM_BONE_LENGTH) { - leaf_bone_length = length; - } - } - - COLLADAFW::NodePointerArray &children = node->getChildNodes(); - - for (uint i = 0; i < children.getCount(); i++) { - int cl = create_bone(skin, children[i], bone, children.getCount(), mat, arm, layer_labels); - chain_length = std::max(cl, chain_length); - } - - bone->length = len_v3v3(bone->head, bone->tail); - joint_by_uid[node->getUniqueId()] = node; - finished_joints.push_back(node); - - be.set_chain_length(chain_length + 1); - - return chain_length + 1; -} - -void ArmatureImporter::fix_leaf_bone_hierarchy(bArmature *armature, - Bone *bone, - bool fix_orientation) -{ - if (bone == nullptr) { - return; - } - - if (bc_is_leaf_bone(bone)) { - BoneExtensionMap &extended_bones = bone_extension_manager.getExtensionMap(armature); - BoneExtended *be = extended_bones[bone->name]; - EditBone *ebone = bc_get_edit_bone(armature, bone->name); - fix_leaf_bone(armature, ebone, be, fix_orientation); - } - - LISTBASE_FOREACH (Bone *, child, &bone->childbase) { - fix_leaf_bone_hierarchy(armature, child, fix_orientation); - } -} - -void ArmatureImporter::fix_leaf_bone(bArmature *armature, - EditBone *ebone, - BoneExtended *be, - bool fix_orientation) -{ - if (be == nullptr || !be->has_tail()) { - - /* Collada only knows Joints, Here we guess a reasonable leaf bone length */ - float leaf_length = (leaf_bone_length == FLT_MAX) ? 1.0 : leaf_bone_length; - - float vec[3]; - - if (fix_orientation && ebone->parent != nullptr) { - EditBone *parent = ebone->parent; - sub_v3_v3v3(vec, ebone->head, parent->head); - if (len_squared_v3(vec) < MINIMUM_BONE_LENGTH) { - sub_v3_v3v3(vec, parent->tail, parent->head); - } - } - else { - vec[2] = 0.1f; - sub_v3_v3v3(vec, ebone->tail, ebone->head); - } - - normalize_v3_v3(vec, vec); - mul_v3_fl(vec, leaf_length); - add_v3_v3v3(ebone->tail, ebone->head, vec); - } -} - -void ArmatureImporter::fix_parent_connect(bArmature *armature, Bone *bone) -{ - /* armature has no bones */ - if (bone == nullptr) { - return; - } - - if (bone->parent && bone->flag & BONE_CONNECTED) { - copy_v3_v3(bone->parent->tail, bone->head); - } - - LISTBASE_FOREACH (Bone *, child, &bone->childbase) { - fix_parent_connect(armature, child); - } -} - -void ArmatureImporter::connect_bone_chains(bArmature *armature, - Bone *parentbone, - int max_chain_length) -{ - BoneExtensionMap &extended_bones = bone_extension_manager.getExtensionMap(armature); - BoneExtended *dominant_child = nullptr; - int maxlen = 0; - - if (parentbone == nullptr) { - return; - } - - Bone *child = (Bone *)parentbone->childbase.first; - if (child && (import_settings->find_chains || child->next == nullptr)) { - for (; child; child = child->next) { - BoneExtended *be = extended_bones[child->name]; - if (be != nullptr) { - int chain_len = be->get_chain_length(); - if (chain_len <= max_chain_length) { - if (chain_len > maxlen) { - dominant_child = be; - maxlen = chain_len; - } - else if (chain_len == maxlen) { - dominant_child = nullptr; - } - } - } - } - } - - BoneExtended *pbe = extended_bones[parentbone->name]; - if (dominant_child != nullptr) { - /* Found a valid chain. Now connect current bone with that chain. */ - EditBone *pebone = bc_get_edit_bone(armature, parentbone->name); - EditBone *cebone = bc_get_edit_bone(armature, dominant_child->get_name()); - if (pebone && !(cebone->flag & BONE_CONNECTED)) { - float vec[3]; - sub_v3_v3v3(vec, cebone->head, pebone->head); - - /* - * It is possible that the child's head is located on the parents head. - * When this happens, then moving the parent's tail to the child's head - * would result in a zero sized bone and Blender would silently remove the bone. - * So we move the tail only when the resulting bone has a minimum length: - */ - - if (len_squared_v3(vec) > MINIMUM_BONE_LENGTH) { - copy_v3_v3(pebone->tail, cebone->head); - pbe->set_tail(pebone->tail); /* To make fix_leafbone happy. */ - if (pbe && pbe->get_chain_length() >= this->import_settings->min_chain_length) { - - BoneExtended *cbe = extended_bones[cebone->name]; - cbe->set_use_connect(true); - - cebone->flag |= BONE_CONNECTED; - pbe->set_leaf_bone(false); - printf("Connect Bone chain: parent (%s --> %s) child)\n", pebone->name, cebone->name); - } - } - } - LISTBASE_FOREACH (Bone *, ch, &parentbone->childbase) { - ArmatureImporter::connect_bone_chains(armature, ch, UNLIMITED_CHAIN_MAX); - } - } - else if (maxlen > 1 && maxlen > this->import_settings->min_chain_length) { - /* Try again with smaller chain length */ - ArmatureImporter::connect_bone_chains(armature, parentbone, maxlen - 1); - } - else { - /* can't connect this Bone. Proceed with children ... */ - if (pbe) { - pbe->set_leaf_bone(true); - } - LISTBASE_FOREACH (Bone *, ch, &parentbone->childbase) { - ArmatureImporter::connect_bone_chains(armature, ch, UNLIMITED_CHAIN_MAX); - } - } -} - -#if 0 -void ArmatureImporter::set_leaf_bone_shapes(Object *ob_arm) -{ - bPose *pose = ob_arm->pose; - - std::vector::iterator it; - for (it = leaf_bones.begin(); it != leaf_bones.end(); it++) { - LeafBone &leaf = *it; - - bPoseChannel *pchan = BKE_pose_channel_find_name(pose, leaf.name); - if (pchan) { - pchan->custom = get_empty_for_leaves(); - } - else { - fprintf(stderr, "Cannot find a pose channel for leaf bone %s\n", leaf.name); - } - } -} - -void ArmatureImporter::set_euler_rotmode() -{ - /* just set rotmode = ROT_MODE_EUL on pose channel for each joint */ - - std::map::iterator it; - - for (it = joint_by_uid.begin(); it != joint_by_uid.end(); it++) { - - COLLADAFW::Node *joint = it->second; - - std::map::iterator sit; - - for (sit = skin_by_data_uid.begin(); sit != skin_by_data_uid.end(); sit++) { - SkinInfo &skin = sit->second; - - if (skin.uses_joint_or_descendant(joint)) { - bPoseChannel *pchan = skin.get_pose_channel_from_node(joint); - - if (pchan) { - pchan->rotmode = ROT_MODE_EUL; - } - else { - fprintf(stderr, "Cannot find pose channel for %s.\n", get_joint_name(joint)); - } - - break; - } - } - } -} -#endif - -Object *ArmatureImporter::get_empty_for_leaves() -{ - if (empty) { - return empty; - } - - empty = bc_add_object(m_bmain, scene, view_layer, OB_EMPTY, nullptr); - empty->empty_drawtype = OB_EMPTY_SPHERE; - - return empty; -} - -#if 0 -Object *ArmatureImporter::find_armature(COLLADAFW::Node *node) -{ - JointData *jd = get_joint_data(node); - if (jd) { - return jd->ob_arm; - } - - COLLADAFW::NodePointerArray &children = node->getChildNodes(); - for (int i = 0; i < children.getCount(); i++) { - Object *ob_arm = find_armature(children[i]); - if (ob_arm) { - return ob_arm; - } - } - - return nullptr; -} - -ArmatureJoints &ArmatureImporter::get_armature_joints(Object *ob_arm) -{ - /* try finding it */ - std::vector::iterator it; - for (it = armature_joints.begin(); it != armature_joints.end(); it++) { - if ((*it).ob_arm == ob_arm) { - return *it; - } - } - - /* not found, create one */ - ArmatureJoints aj; - aj.ob_arm = ob_arm; - armature_joints.push_back(aj); - - return armature_joints.back(); -} -#endif -void ArmatureImporter::create_armature_bones(Main *bmain, std::vector &arm_objs) -{ - std::vector::iterator ri; - std::vector layer_labels; - - /* if there is an armature created for root_joint next root_joint */ - for (ri = root_joints.begin(); ri != root_joints.end(); ri++) { - COLLADAFW::Node *node = *ri; - if (get_armature_for_joint(node) != nullptr) { - continue; - } - - Object *ob_arm = joint_parent_map[node->getUniqueId()]; - if (!ob_arm) { - continue; - } - - /* Assumption that joint_parent_map only lists armatures is apparently wrong (it can be meshes, - * too), this needs to be checked again, for now prevent a crash though. */ - if (ob_arm->type != OB_ARMATURE) { - continue; - } - - bArmature *armature = (bArmature *)ob_arm->data; - if (!armature) { - continue; - } - - const char *bone_name = bc_get_joint_name(node); - Bone *bone = BKE_armature_find_bone_name(armature, bone_name); - if (bone) { - fprintf(stderr, - "Reuse of child bone [%s] as root bone in same Armature is not supported.\n", - bone_name); - continue; - } - - ED_armature_to_edit(armature); - - create_bone( - nullptr, node, nullptr, node->getChildNodes().getCount(), nullptr, armature, layer_labels); - if (this->import_settings->find_chains) { - connect_bone_chains(armature, (Bone *)armature->bonebase.first, UNLIMITED_CHAIN_MAX); - } - - /* exit armature edit mode to populate the Armature object */ - ED_armature_from_edit(bmain, armature); - ED_armature_edit_free(armature); - ED_armature_to_edit(armature); - - fix_leaf_bone_hierarchy( - armature, (Bone *)armature->bonebase.first, this->import_settings->fix_orientation); - unskinned_armature_map[node->getUniqueId()] = ob_arm; - - ED_armature_from_edit(bmain, armature); - ED_armature_edit_free(armature); - - set_bone_transformation_type(node, ob_arm); - - int index = std::find(arm_objs.begin(), arm_objs.end(), ob_arm) - arm_objs.begin(); - if (index == 0) { - arm_objs.push_back(ob_arm); - } - - DEG_id_tag_update(&ob_arm->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); - } -} - -Object *ArmatureImporter::create_armature_bones(Main *bmain, SkinInfo &skin) -{ - /* just do like so: - * - get armature - * - enter editmode - * - add edit bones and head/tail properties using matrices and parent-child info - * - exit edit mode - * - set a sphere shape to leaf bones */ - Object *ob_arm = nullptr; - - /* - * find if there's another skin sharing at least one bone with this skin - * if so, use that skin's armature - */ - - /** - * Pseudo-code: - *
-   * find_node_in_tree(node, root_joint)
-   *
-   * skin::find_root_joints(root_joints):
-   *     std::vector root_joints;
-   *     for each root in root_joints:
-   *         for each joint in joints:
-   *             if find_node_in_tree(joint, root):
-   *                 if (std::find(root_joints.begin(), root_joints.end(), root) ==
-   * root_joints.end()) root_joints.push_back(root);
-   *
-   * for (each skin B with armature) {
-   *     find all root joints for skin B
-   *
-   *     for each joint X in skin A:
-   *         for each root joint R in skin B:
-   *             if (find_node_in_tree(X, R)) {
-   *                 shared = 1;
-   *                 goto endloop;
-   *             }
-   * }
-   *
-   * endloop:
-   * 
- */ - - SkinInfo *a = &skin; - Object *shared = nullptr; - std::vector skin_root_joints; - std::vector layer_labels; - - std::map::iterator it; - for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) { - SkinInfo *b = &it->second; - if (b == a || b->BKE_armature_from_object() == nullptr) { - continue; - } - - skin_root_joints.clear(); - - b->find_root_joints(root_joints, joint_by_uid, skin_root_joints); - - std::vector::iterator ri; - for (ri = skin_root_joints.begin(); ri != skin_root_joints.end(); ri++) { - COLLADAFW::Node *node = *ri; - if (a->uses_joint_or_descendant(node)) { - shared = b->BKE_armature_from_object(); - break; - } - } - - if (shared != nullptr) { - break; - } - } - - if (!shared && !this->joint_parent_map.empty()) { - /* All armatures have been created while creating the Node tree. - * The Collada exporter currently does not create a - * strict relationship between geometries and armatures - * So when we reimport a Blender collada file, then we have - * to guess what is meant. - * XXX This is not safe when we have more than one armatures - * in the import. */ - shared = this->joint_parent_map.begin()->second; - } - - if (shared) { - ob_arm = skin.set_armature(shared); - } - else { - ob_arm = skin.create_armature(m_bmain, scene, view_layer); /* once for every armature */ - } - - /* enter armature edit mode */ - bArmature *armature = (bArmature *)ob_arm->data; - ED_armature_to_edit(armature); - - totbone = 0; - // bone_direction_row = 1; /* TODO: don't default to Y but use asset and based on it decide on */ - /* default row */ - - /* create bones */ - /* TODO: - * check if bones have already been created for a given joint */ - - std::vector::iterator ri; - for (ri = root_joints.begin(); ri != root_joints.end(); ri++) { - COLLADAFW::Node *node = *ri; - /* for shared armature check if bone tree is already created */ - if (shared && std::find(skin_root_joints.begin(), skin_root_joints.end(), node) != - skin_root_joints.end()) - { - continue; - } - - /* since root_joints may contain joints for multiple controllers, we need to filter */ - if (skin.uses_joint_or_descendant(node)) { - - create_bone( - &skin, node, nullptr, node->getChildNodes().getCount(), nullptr, armature, layer_labels); - - if (joint_parent_map.find(node->getUniqueId()) != joint_parent_map.end() && - !skin.get_parent()) - { - skin.set_parent(joint_parent_map[node->getUniqueId()]); - } - } - } - - /* exit armature edit mode to populate the Armature object */ - ED_armature_from_edit(bmain, armature); - ED_armature_edit_free(armature); - - for (ri = root_joints.begin(); ri != root_joints.end(); ri++) { - COLLADAFW::Node *node = *ri; - set_bone_transformation_type(node, ob_arm); - } - - ED_armature_to_edit(armature); - if (this->import_settings->find_chains) { - connect_bone_chains(armature, (Bone *)armature->bonebase.first, UNLIMITED_CHAIN_MAX); - } - fix_leaf_bone_hierarchy( - armature, (Bone *)armature->bonebase.first, this->import_settings->fix_orientation); - ED_armature_from_edit(bmain, armature); - ED_armature_edit_free(armature); - - DEG_id_tag_update(&ob_arm->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); - - return ob_arm; -} - -void ArmatureImporter::set_bone_transformation_type(const COLLADAFW::Node *node, Object *ob_arm) -{ - bPoseChannel *pchan = BKE_pose_channel_find_name(ob_arm->pose, bc_get_joint_name(node)); - if (pchan) { - pchan->rotmode = node_is_decomposed(node) ? ROT_MODE_EUL : ROT_MODE_QUAT; - } - - COLLADAFW::NodePointerArray childnodes = node->getChildNodes(); - for (int index = 0; index < childnodes.getCount(); index++) { - node = childnodes[index]; - set_bone_transformation_type(node, ob_arm); - } -} - -void ArmatureImporter::set_pose(Object *ob_arm, - COLLADAFW::Node *root_node, - const char *parentname, - float parent_mat[4][4]) -{ - const char *bone_name = bc_get_joint_name(root_node); - float mat[4][4]; - float obmat[4][4]; - - /* object-space */ - get_node_mat(obmat, root_node, nullptr, nullptr); - bool is_decomposed = node_is_decomposed(root_node); - - // if (*edbone) - bPoseChannel *pchan = BKE_pose_channel_find_name(ob_arm->pose, bone_name); - pchan->rotmode = (is_decomposed) ? ROT_MODE_EUL : ROT_MODE_QUAT; - - // else fprintf ( "", - - /* get world-space */ - if (parentname) { - mul_m4_m4m4(mat, parent_mat, obmat); - bPoseChannel *parchan = BKE_pose_channel_find_name(ob_arm->pose, parentname); - - mul_m4_m4m4(pchan->pose_mat, parchan->pose_mat, mat); - } - else { - - copy_m4_m4(mat, obmat); - float invObmat[4][4]; - invert_m4_m4(invObmat, ob_arm->object_to_world().ptr()); - mul_m4_m4m4(pchan->pose_mat, invObmat, mat); - } - -#if 0 - float angle = 0.0f; - mat4_to_axis_angle(ax, &angle, mat); - pchan->bone->roll = angle; -#endif - - COLLADAFW::NodePointerArray &children = root_node->getChildNodes(); - for (uint i = 0; i < children.getCount(); i++) { - set_pose(ob_arm, children[i], bone_name, mat); - } -} - -bool ArmatureImporter::node_is_decomposed(const COLLADAFW::Node *node) -{ - const COLLADAFW::TransformationPointerArray &nodeTransforms = node->getTransformations(); - for (uint i = 0; i < nodeTransforms.getCount(); i++) { - COLLADAFW::Transformation *transform = nodeTransforms[i]; - COLLADAFW::Transformation::TransformationType tm_type = transform->getTransformationType(); - if (tm_type == COLLADAFW::Transformation::MATRIX) { - return false; - } - } - return true; -} - -void ArmatureImporter::add_root_joint(COLLADAFW::Node *node, Object *parent) -{ - root_joints.push_back(node); - if (parent) { - joint_parent_map[node->getUniqueId()] = parent; - } -} - -#if 0 -void ArmatureImporter::add_root_joint(COLLADAFW::Node *node) -{ - // root_joints.push_back(node); - Object *ob_arm = find_armature(node); - if (ob_arm) { - get_armature_joints(ob_arm).root_joints.push_back(node); - } -# ifdef COLLADA_DEBUG - else { - fprintf(stderr, "%s cannot be added to armature.\n", get_joint_name(node)); - } -# endif -} -#endif - -void ArmatureImporter::make_armatures(bContext *C, std::vector &objects_to_scale) -{ - Main *bmain = CTX_data_main(C); - std::vector arm_objs; - std::map::iterator it; - - /* TODO: Make this work for more than one armature in the import file. */ - leaf_bone_length = FLT_MAX; - - for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) { - - SkinInfo &skin = it->second; - - Object *ob_arm = create_armature_bones(bmain, skin); - - /* link armature with a mesh object */ - const COLLADAFW::UniqueId &uid = skin.get_controller_uid(); - const COLLADAFW::UniqueId *guid = get_geometry_uid(uid); - if (guid != nullptr) { - Object *ob = mesh_importer->get_object_by_geom_uid(*guid); - if (ob) { - skin.link_armature(C, ob, joint_by_uid, this); - - std::vector::iterator ob_it = std::find( - objects_to_scale.begin(), objects_to_scale.end(), ob); - - if (ob_it != objects_to_scale.end()) { - int index = ob_it - objects_to_scale.begin(); - objects_to_scale.erase(objects_to_scale.begin() + index); - } - - if (std::find(objects_to_scale.begin(), objects_to_scale.end(), ob_arm) == - objects_to_scale.end()) - { - objects_to_scale.push_back(ob_arm); - } - - if (std::find(arm_objs.begin(), arm_objs.end(), ob_arm) == arm_objs.end()) { - arm_objs.push_back(ob_arm); - } - } - else { - fprintf(stderr, "Cannot find object to link armature with.\n"); - } - } - else { - fprintf(stderr, "Cannot find geometry to link armature with.\n"); - } - - /* set armature parent if any */ - Object *par = skin.get_parent(); - if (par) { - bc_set_parent(skin.BKE_armature_from_object(), par, C, false); - } - - /* free memory stolen from SkinControllerData */ - skin.free(); - } - - /* for bones without skins */ - create_armature_bones(bmain, arm_objs); - - /* Fix bone relations */ - std::vector::iterator ob_arm_it; - for (ob_arm_it = arm_objs.begin(); ob_arm_it != arm_objs.end(); ob_arm_it++) { - - Object *ob_arm = *ob_arm_it; - bArmature *armature = (bArmature *)ob_arm->data; - - /* and step back to edit mode to fix the leaf nodes */ - ED_armature_to_edit(armature); - - fix_parent_connect(armature, (Bone *)armature->bonebase.first); - - ED_armature_from_edit(bmain, armature); - ED_armature_edit_free(armature); - } -} - -#if 0 -/* link with meshes, create vertex groups, assign weights */ -void ArmatureImporter::link_armature(Object *ob_arm, - const COLLADAFW::UniqueId &geom_id, - const COLLADAFW::UniqueId &controller_data_id) -{ - Object *ob = mesh_importer->get_object_by_geom_uid(geom_id); - - if (!ob) { - fprintf(stderr, "Cannot find object by geometry UID.\n"); - return; - } - - if (skin_by_data_uid.find(controller_data_id) == skin_by_data_uid.end()) { - fprintf(stderr, "Cannot find skin info by controller data UID.\n"); - return; - } - - SkinInfo &skin = skin_by_data_uid[conroller_data_id]; - - /* create vertex groups */ -} -#endif - -bool ArmatureImporter::write_skin_controller_data(const COLLADAFW::SkinControllerData *data) -{ - /* at this stage we get vertex influence info that should go into mesh->verts and ob->defbase - * there's no info to which object this should be long so we associate it with - * skin controller data UID. */ - - /* don't forget to call BKE_object_defgroup_unique_name before we copy */ - - /* controller data uid -> [armature] -> joint data, - * [mesh object] */ - - SkinInfo skin(unit_converter); - skin.borrow_skin_controller_data(data); - - /* store join inv bind matrix to use it later in armature construction */ - const COLLADAFW::Matrix4Array &inv_bind_mats = data->getInverseBindMatrices(); - for (uint i = 0; i < data->getJointsCount(); i++) { - skin.add_joint(inv_bind_mats[i]); - } - - skin_by_data_uid[data->getUniqueId()] = skin; - - return true; -} - -bool ArmatureImporter::write_controller(const COLLADAFW::Controller *controller) -{ - /* - create and store armature object */ - const COLLADAFW::UniqueId &con_id = controller->getUniqueId(); - - if (controller->getControllerType() == COLLADAFW::Controller::CONTROLLER_TYPE_SKIN) { - COLLADAFW::SkinController *co = (COLLADAFW::SkinController *)controller; - /* to be able to find geom id by controller id */ - geom_uid_by_controller_uid[con_id] = co->getSource(); - - const COLLADAFW::UniqueId &data_uid = co->getSkinControllerData(); - if (skin_by_data_uid.find(data_uid) == skin_by_data_uid.end()) { - fprintf(stderr, "Cannot find skin by controller data UID.\n"); - return true; - } - - skin_by_data_uid[data_uid].set_controller(co); - } - /* morph controller */ - else if (controller->getControllerType() == COLLADAFW::Controller::CONTROLLER_TYPE_MORPH) { - COLLADAFW::MorphController *co = (COLLADAFW::MorphController *)controller; - /* to be able to find geom id by controller id */ - geom_uid_by_controller_uid[con_id] = co->getSource(); - /* Shape keys are applied in DocumentImporter->finish() */ - morph_controllers.push_back(co); - } - - return true; -} - -void ArmatureImporter::make_shape_keys(bContext *C) -{ - Main *bmain = CTX_data_main(C); - std::vector::iterator mc; - float weight; - - for (mc = morph_controllers.begin(); mc != morph_controllers.end(); mc++) { - /* Controller data */ - COLLADAFW::UniqueIdArray &morphTargetIds = (*mc)->getMorphTargets(); - COLLADAFW::FloatOrDoubleArray &morphWeights = (*mc)->getMorphWeights(); - - /* Prerequisite: all the geometries must be imported and mesh objects must be made. */ - Object *source_ob = this->mesh_importer->get_object_by_geom_uid((*mc)->getSource()); - - if (source_ob) { - - Mesh *source_me = (Mesh *)source_ob->data; - /* insert key to source mesh */ - Key *key = source_me->key = BKE_key_add(bmain, (ID *)source_me); - key->type = KEY_RELATIVE; - KeyBlock *kb; - - /* insert basis key */ - kb = BKE_keyblock_add_ctime(key, "Basis", false); - BKE_keyblock_convert_from_mesh(source_me, key, kb); - - /* insert other shape keys */ - for (int i = 0; i < morphTargetIds.getCount(); i++) { - /* Better to have a separate map of morph objects, - * This will do for now since only mesh morphing is imported. */ - - Mesh *mesh = this->mesh_importer->get_mesh_by_geom_uid(morphTargetIds[i]); - - if (mesh) { - mesh->key = key; - std::string morph_name = *this->mesh_importer->get_geometry_name(mesh->id.name); - - kb = BKE_keyblock_add_ctime(key, morph_name.c_str(), false); - BKE_keyblock_convert_from_mesh(mesh, key, kb); - - /* apply weights */ - weight = morphWeights.getFloatValues()->getData()[i]; - kb->curval = weight; - } - else { - fprintf(stderr, "Morph target geometry not found.\n"); - } - } - } - else { - fprintf(stderr, "Morph target object not found.\n"); - } - } -} - -COLLADAFW::UniqueId *ArmatureImporter::get_geometry_uid(const COLLADAFW::UniqueId &controller_uid) -{ - if (geom_uid_by_controller_uid.find(controller_uid) == geom_uid_by_controller_uid.end()) { - return nullptr; - } - - return &geom_uid_by_controller_uid[controller_uid]; -} - -Object *ArmatureImporter::get_armature_for_joint(COLLADAFW::Node *node) -{ - std::map::iterator it; - for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) { - SkinInfo &skin = it->second; - - if (skin.uses_joint_or_descendant(node)) { - return skin.BKE_armature_from_object(); - } - } - - std::map::iterator arm; - for (arm = unskinned_armature_map.begin(); arm != unskinned_armature_map.end(); arm++) { - if (arm->first == node->getUniqueId()) { - return arm->second; - } - } - return nullptr; -} - -void ArmatureImporter::set_tags_map(TagsMap &tags_map) -{ - this->uid_tags_map = tags_map; -} - -void ArmatureImporter::get_rna_path_for_joint(COLLADAFW::Node *node, - char *joint_path, - size_t joint_path_maxncpy) -{ - char bone_name_esc[sizeof(Bone::name) * 2]; - BLI_str_escape(bone_name_esc, bc_get_joint_name(node), sizeof(bone_name_esc)); - BLI_snprintf(joint_path, joint_path_maxncpy, "pose.bones[\"%s\"]", bone_name_esc); -} - -bool ArmatureImporter::get_joint_bind_mat(float m[4][4], COLLADAFW::Node *joint) -{ - std::map::iterator it; - bool found = false; - for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) { - SkinInfo &skin = it->second; - if (skin.get_joint_inv_bind_matrix(m, joint)) { - invert_m4(m); - found = true; - break; - } - } - - return found; -} - -BoneExtended &ArmatureImporter::add_bone_extended(EditBone *bone, - COLLADAFW::Node *node, - int sibcount, - std::vector &layer_labels, - BoneExtensionMap &extended_bones) -{ - BoneExtended *be = new BoneExtended(bone); - extended_bones[bone->name] = be; - - TagsMap::iterator etit; - ExtraTags *et = nullptr; - etit = uid_tags_map.find(node->getUniqueId().toAscii()); - - bool has_connect = false; - int connect_type = -1; - - if (etit != uid_tags_map.end()) { - - float tail[3] = {FLT_MAX, FLT_MAX, FLT_MAX}; - float roll = 0; - - et = etit->second; - - bool has_tail = false; - has_tail |= et->setData("tip_x", &tail[0]); - has_tail |= et->setData("tip_y", &tail[1]); - has_tail |= et->setData("tip_z", &tail[2]); - - has_connect = et->setData("connect", &connect_type); - bool has_roll = et->setData("roll", &roll); - - be->set_bone_collections(et->dataSplitString("collections")); - - if (has_tail && !has_connect) { - /* got a bone tail definition but no connect info -> bone is not connected */ - has_connect = true; - connect_type = 0; - } - - if (has_tail) { - be->set_tail(tail); - } - if (has_roll) { - be->set_roll(roll); - } - } - - if (!has_connect && this->import_settings->auto_connect) { - /* Auto connect only when parent has exactly one child. */ - connect_type = sibcount == 1; - } - - be->set_use_connect(connect_type); - be->set_leaf_bone(true); - - return *be; -} diff --git a/source/blender/io/collada/ArmatureImporter.h b/source/blender/io/collada/ArmatureImporter.h deleted file mode 100644 index f9bc21cb65e..00000000000 --- a/source/blender/io/collada/ArmatureImporter.h +++ /dev/null @@ -1,181 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "COLLADAFWMorphController.h" -#include "COLLADAFWNode.h" -#include "COLLADAFWUniqueId.h" - -#include "BKE_context.hh" -#include "BKE_key.hh" - -#include "DNA_armature_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "ED_armature.hh" - -#include "AnimationImporter.h" -#include "ExtraTags.h" -#include "MeshImporter.h" -#include "SkinInfo.h" -#include "TransformReader.h" - -#include -#include - -#include "ImportSettings.h" -#include "collada_internal.h" -#include "collada_utils.h" - -#define UNLIMITED_CHAIN_MAX INT_MAX -#define MINIMUM_BONE_LENGTH 0.000001f - -class ArmatureImporter : private TransformReader { - private: - Main *m_bmain; - Scene *scene; - ViewLayer *view_layer; - UnitConverter *unit_converter; - const ImportSettings *import_settings; - - // std::map joint_index_to_joint_info_map; - // std::map joint_id_to_joint_index_map; - BoneExtensionManager bone_extension_manager; - // int bone_direction_row; /* XXX not used */ - float leaf_bone_length; - int totbone; - /* XXX not used */ - // float min_angle; /* minimum angle between bone head-tail and a row of bone matrix */ - -#if 0 - struct ArmatureJoints { - Object *ob_arm; - std::vector root_joints; - }; - std::vector armature_joints; -#endif - - Object *empty; /* empty for leaf bones */ - - std::map geom_uid_by_controller_uid; - std::map joint_by_uid; /* contains all joints */ - std::vector root_joints; - std::vector finished_joints; - std::vector morph_controllers; - std::map joint_parent_map; - std::map unskinned_armature_map; - - MeshImporterBase *mesh_importer; - - /* This is used to store data passed in write_controller_data. - * Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members - * so that arrays don't get freed until we free them explicitly. */ - - std::map - skin_by_data_uid; /* data UID = skin controller data UID */ -#if 0 - JointData *get_joint_data(COLLADAFW::Node *node); -#endif - - int create_bone(SkinInfo *skin, - COLLADAFW::Node *node, - EditBone *parent, - int totchild, - float parent_mat[4][4], - bArmature *arm, - std::vector &layer_labels); - - BoneExtended &add_bone_extended(EditBone *bone, - COLLADAFW::Node *node, - int sibcount, - std::vector &layer_labels, - BoneExtensionMap &extended_bones); - - /** - * Collada only knows Joints, hence bones at the end of a bone chain - * don't have a defined length. This function guesses reasonable - * tail locations for the affected bones (nodes which don't have any connected child) - * Hint: The extended_bones set gets populated in ArmatureImporter::create_bone - */ - void fix_leaf_bone_hierarchy(bArmature *armature, Bone *bone, bool fix_orientation); - void fix_leaf_bone(bArmature *armature, EditBone *ebone, BoneExtended *be, bool fix_orientation); - void fix_parent_connect(bArmature *armature, Bone *bone); - void connect_bone_chains(bArmature *armature, Bone *bone, int max_chain_length); - - void set_pose(Object *ob_arm, - COLLADAFW::Node *root_node, - const char *parentname, - float parent_mat[4][4]); - - void set_bone_transformation_type(const COLLADAFW::Node *node, Object *ob_arm); - bool node_is_decomposed(const COLLADAFW::Node *node); -#if 0 - void set_leaf_bone_shapes(Object *ob_arm); - void set_euler_rotmode(); -#endif - - Object *get_empty_for_leaves(); - -#if 0 - Object *find_armature(COLLADAFW::Node *node); - - ArmatureJoints &get_armature_joints(Object *ob_arm); -#endif - - Object *create_armature_bones(Main *bmain, SkinInfo &skin); - void create_armature_bones(Main *bmain, std::vector &arm_objs); - - /** TagsMap typedef for uid_tags_map. */ - using TagsMap = std::map; - TagsMap uid_tags_map; - - public: - ArmatureImporter(UnitConverter *conv, - MeshImporterBase *mesh, - Main *bmain, - Scene *sce, - ViewLayer *view_layer, - const ImportSettings *import_settings); - ~ArmatureImporter(); - - /** - * root - if this joint is the top joint in hierarchy, if a joint - * is a child of a node (not joint), root should be true since - * this is where we build armature bones from - */ - void add_root_joint(COLLADAFW::Node *node, Object *parent); - - /** Here we add bones to armatures, having armatures previously created in write_controller. */ - void make_armatures(bContext *C, std::vector &objects_to_scale); - - void make_shape_keys(bContext *C); - -#if 0 - /** Link with meshes, create vertex groups, assign weights. */ - void link_armature(Object *ob_arm, - const COLLADAFW::UniqueId &geom_id, - const COLLADAFW::UniqueId &controller_data_id); -#endif - - bool write_skin_controller_data(const COLLADAFW::SkinControllerData *data); - - bool write_controller(const COLLADAFW::Controller *controller); - - COLLADAFW::UniqueId *get_geometry_uid(const COLLADAFW::UniqueId &controller_uid); - - Object *get_armature_for_joint(COLLADAFW::Node *node); - - void get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t joint_path_maxncpy); - - /** Gives a world-space mat. */ - bool get_joint_bind_mat(float m[4][4], COLLADAFW::Node *joint); - - void set_tags_map(TagsMap &tags_map); -}; diff --git a/source/blender/io/collada/BCAnimationCurve.cpp b/source/blender/io/collada/BCAnimationCurve.cpp deleted file mode 100644 index e3b37f01af7..00000000000 --- a/source/blender/io/collada/BCAnimationCurve.cpp +++ /dev/null @@ -1,701 +0,0 @@ -/* SPDX-FileCopyrightText: 2008 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "DNA_anim_types.h" -#include "DNA_camera_types.h" -#include "DNA_light_types.h" -#include "DNA_material_types.h" - -#include "BLI_string.h" - -#include "BKE_material.hh" - -#include "RNA_access.hh" -#include "RNA_path.hh" - -#include "ANIM_fcurve.hh" - -#include "BCAnimationCurve.h" - -#include "collada_utils.h" - -#include - -BCAnimationCurve::BCAnimationCurve() -{ - this->curve_key.set_object_type(BC_ANIMATION_TYPE_OBJECT); - this->fcurve = nullptr; - this->curve_is_local_copy = false; -} - -BCAnimationCurve::BCAnimationCurve(const BCAnimationCurve &other) -{ - this->min = other.min; - this->max = other.max; - this->fcurve = other.fcurve; - this->curve_key = other.curve_key; - this->curve_is_local_copy = false; - this->id_ptr = other.id_ptr; - - /* The fcurve of the new instance is a copy and can be modified */ - - get_edit_fcurve(); -} - -BCAnimationCurve::BCAnimationCurve(BCCurveKey key, Object *ob, FCurve *fcu) -{ - this->min = 0; - this->max = 0; - this->curve_key = key; - this->fcurve = fcu; - this->curve_is_local_copy = false; - init_pointer_rna(ob); -} - -BCAnimationCurve::BCAnimationCurve(const BCCurveKey &key, Object *ob) -{ - this->curve_key = key; - this->fcurve = nullptr; - this->curve_is_local_copy = false; - init_pointer_rna(ob); -} - -void BCAnimationCurve::init_pointer_rna(Object *ob) -{ - switch (this->curve_key.get_animation_type()) { - case BC_ANIMATION_TYPE_BONE: { - bArmature *arm = (bArmature *)ob->data; - id_ptr = RNA_id_pointer_create(&arm->id); - break; - } - case BC_ANIMATION_TYPE_OBJECT: { - id_ptr = RNA_id_pointer_create(&ob->id); - break; - } - case BC_ANIMATION_TYPE_MATERIAL: { - Material *ma = BKE_object_material_get(ob, curve_key.get_subindex() + 1); - id_ptr = RNA_id_pointer_create(&ma->id); - break; - } - case BC_ANIMATION_TYPE_CAMERA: { - Camera *camera = (Camera *)ob->data; - id_ptr = RNA_id_pointer_create(&camera->id); - break; - } - case BC_ANIMATION_TYPE_LIGHT: { - Light *lamp = (Light *)ob->data; - id_ptr = RNA_id_pointer_create(&lamp->id); - break; - } - default: - fprintf( - stderr, "BC_animation_curve_type %d not supported", this->curve_key.get_array_index()); - break; - } -} - -void BCAnimationCurve::delete_fcurve(FCurve *fcu) -{ - BKE_fcurve_free(fcu); -} - -FCurve *BCAnimationCurve::create_fcurve(int array_index, const char *rna_path) -{ - FCurve *fcu = BKE_fcurve_create(); - fcu->flag = (FCURVE_VISIBLE | FCURVE_SELECTED); - fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path)); - fcu->array_index = array_index; - return fcu; -} - -void BCAnimationCurve::create_bezt(float frame, float output) -{ - FCurve *fcu = get_edit_fcurve(); - BezTriple bez; - memset(&bez, 0, sizeof(BezTriple)); - bez.vec[1][0] = frame; - bez.vec[1][1] = output; - bez.ipo = U.ipo_new; /* use default interpolation mode here... */ - bez.f1 = bez.f2 = bez.f3 = SELECT; - bez.h1 = bez.h2 = HD_AUTO; - blender::animrig::insert_bezt_fcurve(fcu, &bez, INSERTKEY_NOFLAGS); - BKE_fcurve_handles_recalc(fcu); -} - -BCAnimationCurve::~BCAnimationCurve() -{ - if (curve_is_local_copy && fcurve) { - // fprintf(stderr, "removed fcurve %s\n", fcurve->rna_path); - delete_fcurve(fcurve); - this->fcurve = nullptr; - } -} - -bool BCAnimationCurve::is_of_animation_type(BC_animation_type type) const -{ - return curve_key.get_animation_type() == type; -} - -std::string BCAnimationCurve::get_channel_target() const -{ - const std::string path = curve_key.get_path(); - - if (bc_startswith(path, "pose.bones")) { - return bc_string_after(path, "pose.bones"); - } - return bc_string_after(path, "."); -} - -std::string BCAnimationCurve::get_channel_type() const -{ - const std::string channel = get_channel_target(); - return bc_string_after(channel, "."); -} - -std::string BCAnimationCurve::get_channel_posebone() const -{ - const std::string channel = get_channel_target(); - std::string pose_bone_name = bc_string_before(channel, "."); - if (pose_bone_name == channel) { - pose_bone_name = ""; - } - else { - pose_bone_name = bc_string_after(pose_bone_name, "\"["); - pose_bone_name = bc_string_before(pose_bone_name, "]\""); - } - return pose_bone_name; -} - -std::string BCAnimationCurve::get_animation_name(Object *ob) const -{ - std::string name; - - switch (curve_key.get_animation_type()) { - case BC_ANIMATION_TYPE_OBJECT: { - name = id_name(ob); - break; - } - case BC_ANIMATION_TYPE_BONE: { - if (fcurve == nullptr || fcurve->rna_path == nullptr) { - name = ""; - } - else { - char boneName[MAXBONENAME]; - if (BLI_str_quoted_substr(fcurve->rna_path, "pose.bones[", boneName, sizeof(boneName))) { - name = id_name(ob) + "_" + std::string(boneName); - } - else { - name = ""; - } - } - break; - } - case BC_ANIMATION_TYPE_CAMERA: { - Camera *camera = (Camera *)ob->data; - name = id_name(ob) + "-" + id_name(camera) + "-camera"; - break; - } - case BC_ANIMATION_TYPE_LIGHT: { - Light *lamp = (Light *)ob->data; - name = id_name(ob) + "-" + id_name(lamp) + "-light"; - break; - } - case BC_ANIMATION_TYPE_MATERIAL: { - Material *ma = BKE_object_material_get(ob, this->curve_key.get_subindex() + 1); - name = id_name(ob) + "-" + id_name(ma) + "-material"; - break; - } - default: { - name = ""; - } - } - - return name; -} - -int BCAnimationCurve::get_channel_index() const -{ - return curve_key.get_array_index(); -} - -int BCAnimationCurve::get_subindex() const -{ - return curve_key.get_subindex(); -} - -std::string BCAnimationCurve::get_rna_path() const -{ - return curve_key.get_path(); -} - -int BCAnimationCurve::sample_count() const -{ - if (fcurve == nullptr) { - return 0; - } - return fcurve->totvert; -} - -int BCAnimationCurve::closest_index_above(const float sample_frame, const int start_at) const -{ - if (fcurve == nullptr) { - return -1; - } - - const int cframe = fcurve->bezt[start_at].vec[1][0]; /* inaccurate! */ - - if (fabs(cframe - sample_frame) < 0.00001) { - return start_at; - } - return (fcurve->totvert > start_at + 1) ? start_at + 1 : start_at; -} - -int BCAnimationCurve::closest_index_below(const float sample_frame) const -{ - if (fcurve == nullptr) { - return -1; - } - - float lower_frame = sample_frame; - float upper_frame = sample_frame; - int lower_index = 0; - int upper_index = 0; - - for (int fcu_index = 0; fcu_index < fcurve->totvert; fcu_index++) { - upper_index = fcu_index; - - const int cframe = fcurve->bezt[fcu_index].vec[1][0]; /* inaccurate! */ - if (cframe <= sample_frame) { - lower_frame = cframe; - lower_index = fcu_index; - } - if (cframe >= sample_frame) { - upper_frame = cframe; - break; - } - } - - if (lower_index == upper_index) { - return lower_index; - } - - const float fraction = float(sample_frame - lower_frame) / (upper_frame - lower_frame); - return (fraction < 0.5) ? lower_index : upper_index; -} - -int BCAnimationCurve::get_interpolation_type(float sample_frame) const -{ - const int index = closest_index_below(sample_frame); - if (index < 0) { - return BEZT_IPO_BEZ; - } - return fcurve->bezt[index].ipo; -} - -FCurve *BCAnimationCurve::get_fcurve() const -{ - return fcurve; -} - -FCurve *BCAnimationCurve::get_edit_fcurve() -{ - if (!curve_is_local_copy) { - const int index = curve_key.get_array_index(); - const std::string &path = curve_key.get_path(); - fcurve = create_fcurve(index, path.c_str()); - - /* Caution here: - * Replacing the pointer here is OK only because the original value - * of FCurve was a const pointer into Blender territory. We do not - * touch that! We use the local copy to prepare data for export. */ - - curve_is_local_copy = true; - } - return fcurve; -} - -void BCAnimationCurve::clean_handles() -{ - using namespace blender::animrig; - if (fcurve == nullptr) { - fcurve = get_edit_fcurve(); - } - - const KeyframeSettings settings = get_keyframe_settings(true); - - /* Keep old bezt data for copy). */ - BezTriple *old_bezts = fcurve->bezt; - int totvert = fcurve->totvert; - fcurve->bezt = nullptr; - fcurve->totvert = 0; - - for (int i = 0; i < totvert; i++) { - BezTriple *bezt = &old_bezts[i]; - float x = bezt->vec[1][0]; - float y = bezt->vec[1][1]; - insert_vert_fcurve(fcurve, {x, y}, settings, INSERTKEY_NOFLAGS); - BezTriple *lastb = fcurve->bezt + (fcurve->totvert - 1); - lastb->f1 = lastb->f2 = lastb->f3 = 0; - } - - /* now free the memory used by the old BezTriples */ - if (old_bezts) { - MEM_freeN(old_bezts); - } -} - -bool BCAnimationCurve::is_transform_curve() const -{ - std::string channel_type = this->get_channel_type(); - return (is_rotation_curve() || channel_type == "scale" || channel_type == "location"); -} - -bool BCAnimationCurve::is_rotation_curve() const -{ - std::string channel_type = this->get_channel_type(); - return ELEM(channel_type, "rotation", "rotation_euler", "rotation_quaternion"); -} - -float BCAnimationCurve::get_value(const float frame) -{ - if (fcurve) { - return evaluate_fcurve(fcurve, frame); - } - return 0; /* TODO: handle case where neither sample nor fcu exist */ -} - -void BCAnimationCurve::update_range(float val) -{ - min = std::min(val, min); - max = std::max(val, max); -} - -void BCAnimationCurve::init_range(float val) -{ - min = max = val; -} - -void BCAnimationCurve::adjust_range(const int frame_index) -{ - if (fcurve && fcurve->totvert > 1) { - const float eval = evaluate_fcurve(fcurve, frame_index); - - int first_frame = fcurve->bezt[0].vec[1][0]; - if (first_frame == frame_index) { - init_range(eval); - } - else { - update_range(eval); - } - } -} - -void BCAnimationCurve::add_value(const float val, const int frame_index) -{ - using namespace blender::animrig; - const KeyframeSettings settings = get_keyframe_settings(true); - FCurve *fcu = get_edit_fcurve(); - fcu->auto_smoothing = U.auto_smoothing_new; - insert_vert_fcurve(fcu, {float(frame_index), val}, settings, INSERTKEY_NOFLAGS); - - if (fcu->totvert == 1) { - init_range(val); - } - else { - update_range(val); - } -} - -bool BCAnimationCurve::add_value_from_matrix(const BCSample &sample, const int frame_index) -{ - int array_index = curve_key.get_array_index(); - - /* transformation curves are fed directly from the transformation matrix - * to resolve parent inverse matrix issues with object hierarchies. - * Maybe this can be unified with the - */ - const std::string channel_target = get_channel_target(); - float val = 0; - /* Pick the value from the sample according to the definition of the FCurve */ - bool good = sample.get_value(channel_target, array_index, &val); - if (good) { - add_value(val, frame_index); - } - return good; -} - -bool BCAnimationCurve::add_value_from_rna(const int frame_index) -{ - PointerRNA ptr; - PropertyRNA *prop; - float value = 0.0f; - int array_index = curve_key.get_array_index(); - const std::string full_path = curve_key.get_full_path(); - - /* get property to read from, and get value as appropriate */ - bool path_resolved = RNA_path_resolve_full( - &id_ptr, full_path.c_str(), &ptr, &prop, &array_index); - if (!path_resolved && array_index == 0) { - const std::string rna_path = curve_key.get_path(); - path_resolved = RNA_path_resolve_full(&id_ptr, rna_path.c_str(), &ptr, &prop, &array_index); - } - - if (path_resolved) { - bool is_array = RNA_property_array_check(prop); - if (is_array) { - /* array */ - if ((array_index >= 0) && (array_index < RNA_property_array_length(&ptr, prop))) { - switch (RNA_property_type(prop)) { - case PROP_BOOLEAN: - value = float(RNA_property_boolean_get_index(&ptr, prop, array_index)); - break; - case PROP_INT: - value = float(RNA_property_int_get_index(&ptr, prop, array_index)); - break; - case PROP_FLOAT: - value = RNA_property_float_get_index(&ptr, prop, array_index); - break; - default: - break; - } - } - else { - fprintf(stderr, - "Out of Bounds while reading data for Curve %s\n", - curve_key.get_full_path().c_str()); - return false; - } - } - else { - /* not an array */ - switch (RNA_property_type(prop)) { - case PROP_BOOLEAN: - value = float(RNA_property_boolean_get(&ptr, prop)); - break; - case PROP_INT: - value = float(RNA_property_int_get(&ptr, prop)); - break; - case PROP_FLOAT: - value = RNA_property_float_get(&ptr, prop); - break; - case PROP_ENUM: - value = float(RNA_property_enum_get(&ptr, prop)); - break; - default: - fprintf(stderr, - "property type %d not supported for Curve %s\n", - RNA_property_type(prop), - curve_key.get_full_path().c_str()); - return false; - break; - } - } - } - else { - /* path couldn't be resolved */ - fprintf(stderr, "Path not recognized for Curve %s\n", curve_key.get_full_path().c_str()); - return false; - } - - add_value(value, frame_index); - return true; -} - -void BCAnimationCurve::get_value_map(BCValueMap &value_map) -{ - value_map.clear(); - if (fcurve == nullptr) { - return; - } - - for (int i = 0; i < fcurve->totvert; i++) { - const float frame = fcurve->bezt[i].vec[1][0]; - const float val = fcurve->bezt[i].vec[1][1]; - value_map[frame] = val; - } -} - -void BCAnimationCurve::get_frames(BCFrames &frames) const -{ - frames.clear(); - if (fcurve) { - for (int i = 0; i < fcurve->totvert; i++) { - const float val = fcurve->bezt[i].vec[1][0]; - frames.push_back(val); - } - } -} - -void BCAnimationCurve::get_values(BCValues &values) const -{ - values.clear(); - if (fcurve) { - for (int i = 0; i < fcurve->totvert; i++) { - const float val = fcurve->bezt[i].vec[1][1]; - values.push_back(val); - } - } -} - -bool BCAnimationCurve::is_animated() -{ - static float MIN_DISTANCE = 0.00001; - return fabs(max - min) > MIN_DISTANCE; -} - -bool BCAnimationCurve::is_keyframe(int frame) -{ - if (this->fcurve == nullptr) { - return false; - } - - for (int i = 0; i < fcurve->totvert; i++) { - const int cframe = nearbyint(fcurve->bezt[i].vec[1][0]); - if (cframe == frame) { - return true; - } - if (cframe > frame) { - break; - } - } - return false; -} - -/* Needed for adding a BCAnimationCurve into a BCAnimationCurveSet */ -inline bool operator<(const BCAnimationCurve &lhs, const BCAnimationCurve &rhs) -{ - std::string lhtgt = lhs.get_channel_target(); - std::string rhtgt = rhs.get_channel_target(); - if (lhtgt == rhtgt) { - const int lha = lhs.get_channel_index(); - const int rha = rhs.get_channel_index(); - return lha < rha; - } - - return lhtgt < rhtgt; -} - -BCCurveKey::BCCurveKey() -{ - this->key_type = BC_ANIMATION_TYPE_OBJECT; - this->rna_path = ""; - this->curve_array_index = 0; - this->curve_subindex = -1; -} - -BCCurveKey::BCCurveKey(const BC_animation_type type, - const std::string path, - const int array_index, - const int subindex) -{ - this->key_type = type; - this->rna_path = path; - this->curve_array_index = array_index; - this->curve_subindex = subindex; -} - -void BCCurveKey::operator=(const BCCurveKey &other) -{ - this->key_type = other.key_type; - this->rna_path = other.rna_path; - this->curve_array_index = other.curve_array_index; - this->curve_subindex = other.curve_subindex; -} - -std::string BCCurveKey::get_full_path() const -{ - return this->rna_path + '[' + std::to_string(this->curve_array_index) + ']'; -} - -std::string BCCurveKey::get_path() const -{ - return this->rna_path; -} - -int BCCurveKey::get_array_index() const -{ - return this->curve_array_index; -} - -int BCCurveKey::get_subindex() const -{ - return this->curve_subindex; -} - -void BCCurveKey::set_object_type(BC_animation_type object_type) -{ - this->key_type = object_type; -} - -BC_animation_type BCCurveKey::get_animation_type() const -{ - return this->key_type; -} - -bool BCCurveKey::operator<(const BCCurveKey &other) const -{ - /* needed for using this class as key in maps and sets */ - if (this->key_type != other.key_type) { - return this->key_type < other.key_type; - } - - if (this->curve_subindex != other.curve_subindex) { - return this->curve_subindex < other.curve_subindex; - } - - if (this->rna_path != other.rna_path) { - return this->rna_path < other.rna_path; - } - - return this->curve_array_index < other.curve_array_index; -} - -BCBezTriple::BCBezTriple(BezTriple &bezt) : bezt(bezt) {} - -float BCBezTriple::get_frame() const -{ - return bezt.vec[1][0]; -} - -float BCBezTriple::get_time(Scene *scene) const -{ - return FRA2TIME(bezt.vec[1][0]); -} - -float BCBezTriple::get_value() const -{ - return bezt.vec[1][1]; -} - -float BCBezTriple::get_angle() const -{ - return RAD2DEGF(get_value()); -} - -void BCBezTriple::get_in_tangent(Scene *scene, float point[2], bool as_angle) const -{ - get_tangent(scene, point, as_angle, 0); -} - -void BCBezTriple::get_out_tangent(Scene *scene, float point[2], bool as_angle) const -{ - get_tangent(scene, point, as_angle, 2); -} - -void BCBezTriple::get_tangent(Scene *scene, float point[2], bool as_angle, int index) const -{ - point[0] = FRA2TIME(bezt.vec[index][0]); - if (bezt.ipo != BEZT_IPO_BEZ) { - /* We're in a mixed interpolation scenario, set zero as it's irrelevant but value might contain - * unused data */ - point[0] = 0; - point[1] = 0; - } - else if (as_angle) { - point[1] = RAD2DEGF(bezt.vec[index][1]); - } - else { - point[1] = bezt.vec[index][1]; - } -} diff --git a/source/blender/io/collada/BCAnimationCurve.h b/source/blender/io/collada/BCAnimationCurve.h deleted file mode 100644 index bbc12d23242..00000000000 --- a/source/blender/io/collada/BCAnimationCurve.h +++ /dev/null @@ -1,132 +0,0 @@ -/* SPDX-FileCopyrightText: 2008 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include -#include -#include - -#include "BCSampleData.h" - -#include "BKE_fcurve.hh" - -#include "RNA_types.hh" - -#include "ED_anim_api.hh" - -using TangentPoint = float[2]; - -using BCFrameSet = std::set; -using BCFrames = std::vector; -using BCValues = std::vector; -using BCTimes = std::vector; -using BCValueMap = std::map; - -enum BC_animation_type { - BC_ANIMATION_TYPE_OBJECT, - BC_ANIMATION_TYPE_BONE, - BC_ANIMATION_TYPE_CAMERA, - BC_ANIMATION_TYPE_MATERIAL, - BC_ANIMATION_TYPE_LIGHT, -}; - -class BCCurveKey { - private: - BC_animation_type key_type; - std::string rna_path; - int curve_array_index; - int curve_subindex; /* only needed for materials */ - - public: - BCCurveKey(); - BCCurveKey(const BC_animation_type type, - const std::string path, - int array_index, - int subindex = -1); - void operator=(const BCCurveKey &other); - std::string get_full_path() const; - std::string get_path() const; - int get_array_index() const; - int get_subindex() const; - void set_object_type(BC_animation_type object_type); - BC_animation_type get_animation_type() const; - bool operator<(const BCCurveKey &other) const; -}; - -class BCBezTriple { - public: - BezTriple &bezt; - - BCBezTriple(BezTriple &bezt); - float get_frame() const; - float get_time(Scene *scene) const; - float get_value() const; - float get_angle() const; - void get_in_tangent(Scene *scene, float point[2], bool as_angle) const; - void get_out_tangent(Scene *scene, float point[2], bool as_angle) const; - void get_tangent(Scene *scene, float point[2], bool as_angle, int index) const; -}; - -class BCAnimationCurve { - private: - BCCurveKey curve_key; - float min = 0; - float max = 0; - - bool curve_is_local_copy = false; - FCurve *fcurve; - PointerRNA id_ptr; - void init_pointer_rna(Object *ob); - void delete_fcurve(FCurve *fcu); - FCurve *create_fcurve(int array_index, const char *rna_path); - void create_bezt(float frame, float output); - void update_range(float val); - void init_range(float val); - - public: - BCAnimationCurve(); - BCAnimationCurve(const BCAnimationCurve &other); - BCAnimationCurve(const BCCurveKey &key, Object *ob); - BCAnimationCurve(BCCurveKey key, Object *ob, FCurve *fcu); - ~BCAnimationCurve(); - - bool is_of_animation_type(BC_animation_type type) const; - int get_interpolation_type(float sample_frame) const; - bool is_animated(); - bool is_transform_curve() const; - bool is_rotation_curve() const; - bool is_keyframe(int frame); - void adjust_range(int frame); - - std::string get_animation_name(Object *ob) const; /* XXX: this is COLLADA specific. */ - std::string get_channel_target() const; - std::string get_channel_type() const; - std::string get_channel_posebone() const; /* returns "" if channel is not a bone channel */ - - int get_channel_index() const; - int get_subindex() const; - std::string get_rna_path() const; - FCurve *get_fcurve() const; - int sample_count() const; - - float get_value(float frame); - void get_values(BCValues &values) const; - void get_value_map(BCValueMap &value_map); - - void get_frames(BCFrames &frames) const; - - /* Curve edit functions create a copy of the underlying #FCurve. */ - FCurve *get_edit_fcurve(); - bool add_value_from_rna(int frame); - bool add_value_from_matrix(const BCSample &sample, int frame); - void add_value(float val, int frame); - void clean_handles(); - - /* experimental stuff */ - int closest_index_above(float sample_frame, int start_at) const; - int closest_index_below(float sample_frame) const; -}; - -using BCAnimationCurveMap = std::map; diff --git a/source/blender/io/collada/BCAnimationSampler.cpp b/source/blender/io/collada/BCAnimationSampler.cpp deleted file mode 100644 index 916b1785ee5..00000000000 --- a/source/blender/io/collada/BCAnimationSampler.cpp +++ /dev/null @@ -1,618 +0,0 @@ -/* SPDX-FileCopyrightText: 2008 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include -#include - -#include "BCAnimationCurve.h" -#include "BCAnimationSampler.h" -#include "BCMath.h" -#include "ExportSettings.h" -#include "collada_utils.h" - -#include "BKE_action.hh" -#include "BKE_constraint.h" -#include "BKE_material.hh" - -#include "BLI_listbase.h" -#include "BLI_string.h" - -#include "DNA_anim_types.h" -#include "DNA_constraint_types.h" -#include "DNA_scene_types.h" - -#include "ED_object.hh" - -#include "ANIM_action_legacy.hh" - -static std::string EMPTY_STRING; -static BCAnimationCurveMap BCEmptyAnimationCurves; - -BCAnimationSampler::BCAnimationSampler(BCExportSettings &export_settings, BCObjectSet &object_set) - : export_settings(export_settings) -{ - BCObjectSet::iterator it; - for (it = object_set.begin(); it != object_set.end(); ++it) { - Object *ob = *it; - add_object(ob); - } -} - -BCAnimationSampler::~BCAnimationSampler() -{ - BCAnimationObjectMap::iterator it; - for (it = objects.begin(); it != objects.end(); ++it) { - BCAnimation *animation = it->second; - delete animation; - } -} - -void BCAnimationSampler::add_object(Object *ob) -{ - BlenderContext blender_context = export_settings.get_blender_context(); - BCAnimation *animation = new BCAnimation(blender_context.get_context(), ob); - objects[ob] = animation; - - initialize_keyframes(animation->frame_set, ob); - initialize_curves(animation->curve_map, ob); -} - -BCAnimationCurveMap *BCAnimationSampler::get_curves(Object *ob) -{ - BCAnimation &animation = *objects[ob]; - if (animation.curve_map.empty()) { - initialize_curves(animation.curve_map, ob); - } - return &animation.curve_map; -} - -static void get_sample_frames(BCFrameSet &sample_frames, - int sampling_rate, - bool keyframe_at_end, - Scene *scene) -{ - sample_frames.clear(); - - if (sampling_rate < 1) { - return; /* no sample frames in this case */ - } - - float sfra = scene->r.sfra; - float efra = scene->r.efra; - - int frame_index; - for (frame_index = nearbyint(sfra); frame_index < efra; frame_index += sampling_rate) { - sample_frames.insert(frame_index); - } - - if (frame_index >= efra && keyframe_at_end) { - sample_frames.insert(efra); - } -} - -static bool is_object_keyframe(Object *ob, int frame_index) -{ - return false; -} - -static void add_keyframes_from(AnimData *adt, BCFrameSet &frameset) -{ - for (FCurve *fcu : blender::animrig::legacy::fcurves_for_assigned_action(adt)) { - BezTriple *bezt = fcu->bezt; - for (int i = 0; i < fcu->totvert; bezt++, i++) { - int frame_index = nearbyint(bezt->vec[1][0]); - frameset.insert(frame_index); - } - } -} - -void BCAnimationSampler::check_property_is_animated( - BCAnimation &animation, float *ref, float *val, std::string data_path, int length) -{ - for (int array_index = 0; array_index < length; array_index++) { - if (!bc_in_range(ref[length], val[length], 0.00001)) { - BCCurveKey key(BC_ANIMATION_TYPE_OBJECT, data_path, array_index); - BCAnimationCurveMap::iterator it = animation.curve_map.find(key); - if (it == animation.curve_map.end()) { - animation.curve_map[key] = new BCAnimationCurve(key, animation.get_reference()); - } - } - } -} - -void BCAnimationSampler::update_animation_curves(BCAnimation &animation, - BCSample &sample, - Object *ob, - int frame) -{ - BCAnimationCurveMap::iterator it; - for (it = animation.curve_map.begin(); it != animation.curve_map.end(); ++it) { - BCAnimationCurve *curve = it->second; - if (curve->is_transform_curve()) { - curve->add_value_from_matrix(sample, frame); - } - else { - curve->add_value_from_rna(frame); - } - } -} - -BCSample &BCAnimationSampler::sample_object(Object *ob, int frame_index, bool for_opensim) -{ - BCSample &ob_sample = sample_data.add(ob, frame_index); -#if 0 - if (export_settings.get_apply_global_orientation()) { - const BCMatrix &global_transform = export_settings.get_global_transform(); - ob_sample.get_matrix(global_transform); - } -#endif - - if (ob->type == OB_ARMATURE) { - LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) { - Bone *bone = pchan->bone; - Matrix bmat; - if (bc_bone_matrix_local_get(ob, bone, bmat, for_opensim)) { - - ob_sample.add_bone_matrix(bone, bmat); - } - } - } - return ob_sample; -} - -void BCAnimationSampler::sample_scene(BCExportSettings &export_settings, bool keyframe_at_end) -{ - BlenderContext blender_context = export_settings.get_blender_context(); - int sampling_rate = export_settings.get_sampling_rate(); - bool for_opensim = export_settings.get_open_sim(); - bool keep_keyframes = export_settings.get_keep_keyframes(); - BC_export_animation_type export_animation_type = export_settings.get_export_animation_type(); - - Scene *scene = blender_context.get_scene(); - BCFrameSet scene_sample_frames; - get_sample_frames(scene_sample_frames, sampling_rate, keyframe_at_end, scene); - - int startframe = scene->r.sfra; - int endframe = scene->r.efra; - - for (int frame_index = startframe; frame_index <= endframe; frame_index++) { - /* Loop over all frames and decide for each frame if sampling is necessary */ - bool is_scene_sample_frame = false; - bool needs_update = true; - if (scene_sample_frames.find(frame_index) != scene_sample_frames.end()) { - bc_update_scene(blender_context, frame_index); - needs_update = false; - is_scene_sample_frame = true; - } - - bool needs_sampling = is_scene_sample_frame || keep_keyframes || - export_animation_type == BC_ANIMATION_EXPORT_KEYS; - if (!needs_sampling) { - continue; - } - - BCAnimationObjectMap::iterator obit; - for (obit = objects.begin(); obit != objects.end(); ++obit) { - Object *ob = obit->first; - BCAnimation *animation = obit->second; - BCFrameSet &object_keyframes = animation->frame_set; - if (is_scene_sample_frame || object_keyframes.find(frame_index) != object_keyframes.end()) { - - if (needs_update) { - bc_update_scene(blender_context, frame_index); - needs_update = false; - } - - BCSample &sample = sample_object(ob, frame_index, for_opensim); - update_animation_curves(*animation, sample, ob, frame_index); - } - } - } -} - -bool BCAnimationSampler::is_animated_by_constraint(Object *ob, - ListBase *conlist, - std::set &animated_objects) -{ - LISTBASE_FOREACH (bConstraint *, con, conlist) { - ListBase targets = {nullptr, nullptr}; - - if (!bc_validateConstraints(con)) { - continue; - } - - if (BKE_constraint_targets_get(con, &targets)) { - Object *obtar; - bool found = false; - - LISTBASE_FOREACH (bConstraintTarget *, ct, &targets) { - obtar = ct->tar; - if (obtar) { - if (animated_objects.find(obtar) != animated_objects.end()) { - found = true; - break; - } - } - } - BKE_constraint_targets_flush(con, &targets, true); - return found; - } - } - return false; -} - -void BCAnimationSampler::find_depending_animated(std::set &animated_objects, - std::set &candidates) -{ - bool found_more; - do { - found_more = false; - std::set::iterator it; - for (it = candidates.begin(); it != candidates.end(); ++it) { - Object *cob = *it; - ListBase *conlist = blender::ed::object::constraint_active_list(cob); - if (is_animated_by_constraint(cob, conlist, animated_objects)) { - animated_objects.insert(cob); - candidates.erase(cob); - found_more = true; - break; - } - } - } while (found_more && !candidates.empty()); -} - -void BCAnimationSampler::get_animated_from_export_set(std::set &animated_objects, - LinkNode &export_set) -{ - /* Check if this object is animated. That is: Check if it has its own action, or: - * - * - Check if it has constraints to other objects. - * - at least one of the other objects is animated as well. - */ - - animated_objects.clear(); - std::set candidates; - - LinkNode *node; - for (node = &export_set; node; node = node->next) { - Object *cob = (Object *)node->link; - if (bc_has_animations(cob)) { - animated_objects.insert(cob); - } - else { - ListBase conlist = cob->constraints; - if (conlist.first) { - candidates.insert(cob); - } - } - } - find_depending_animated(animated_objects, candidates); -} - -void BCAnimationSampler::get_object_frames(BCFrames &frames, Object *ob) -{ - sample_data.get_frames(ob, frames); -} - -void BCAnimationSampler::get_bone_frames(BCFrames &frames, Object *ob, Bone *bone) -{ - sample_data.get_frames(ob, bone, frames); -} - -bool BCAnimationSampler::get_bone_samples(BCMatrixSampleMap &samples, Object *ob, Bone *bone) -{ - sample_data.get_matrices(ob, bone, samples); - return bc_is_animated(samples); -} - -bool BCAnimationSampler::get_object_samples(BCMatrixSampleMap &samples, Object *ob) -{ - sample_data.get_matrices(ob, samples); - return bc_is_animated(samples); -} - -#if 0 -/** - * Add sampled values to #FCurve - * If no #FCurve exists, create a temporary #FCurve; - * \note The temporary #FCurve will later be removed when the - * #BCAnimationSampler is removed (by its destructor). - * - * \param curve: The curve to which the data is added. - * \param matrices: The set of matrix values from where the data is taken. - * \param animation_type: - * - #BC_ANIMATION_EXPORT_SAMPLES: Use all matrix data. - * - #BC_ANIMATION_EXPORT_KEYS: Only take data from matrices for keyframes. - */ -void BCAnimationSampler::add_value_set(BCAnimationCurve &curve, - BCFrameSampleMap &samples, - BC_export_animation_type animation_type) -{ - int array_index = curve.get_array_index(); - const BC_animation_transform_type tm_type = curve.get_transform_type(); - - BCFrameSampleMap::iterator it; - for (it = samples.begin(); it != samples.end(); ++it) { - const int frame_index = nearbyint(it->first); - if (animation_type == BC_ANIMATION_EXPORT_SAMPLES || curve.is_keyframe(frame_index)) { - - const BCSample *sample = it->second; - float val = 0; - - int subindex = curve.get_subindex(); - bool good; - if (subindex == -1) { - good = sample->get_value(tm_type, array_index, &val); - } - else { - good = sample->get_value(tm_type, array_index, &val, subindex); - } - - if (good) { - curve.add_value(val, frame_index); - } - } - } - curve.remove_unused_keyframes(); - curve.calchandles(); -} -#endif - -void BCAnimationSampler::generate_transform(Object *ob, - const BCCurveKey &key, - BCAnimationCurveMap &curves) -{ - BCAnimationCurveMap::const_iterator it = curves.find(key); - if (it == curves.end()) { - curves[key] = new BCAnimationCurve(key, ob); - } -} - -void BCAnimationSampler::generate_transforms(Object *ob, - const std::string prep, - const BC_animation_type type, - BCAnimationCurveMap &curves) -{ - generate_transform(ob, BCCurveKey(type, prep + "location", 0), curves); - generate_transform(ob, BCCurveKey(type, prep + "location", 1), curves); - generate_transform(ob, BCCurveKey(type, prep + "location", 2), curves); - generate_transform(ob, BCCurveKey(type, prep + "rotation_euler", 0), curves); - generate_transform(ob, BCCurveKey(type, prep + "rotation_euler", 1), curves); - generate_transform(ob, BCCurveKey(type, prep + "rotation_euler", 2), curves); - generate_transform(ob, BCCurveKey(type, prep + "scale", 0), curves); - generate_transform(ob, BCCurveKey(type, prep + "scale", 1), curves); - generate_transform(ob, BCCurveKey(type, prep + "scale", 2), curves); -} - -void BCAnimationSampler::generate_transforms(Object *ob, Bone *bone, BCAnimationCurveMap &curves) -{ - std::string prep = "pose.bones[\"" + std::string(bone->name) + "\"]."; - generate_transforms(ob, prep, BC_ANIMATION_TYPE_BONE, curves); - - LISTBASE_FOREACH (Bone *, child, &bone->childbase) { - generate_transforms(ob, child, curves); - } -} - -void BCAnimationSampler::initialize_keyframes(BCFrameSet &frameset, Object *ob) -{ - frameset.clear(); - add_keyframes_from(ob->adt, frameset); - add_keyframes_from(bc_getSceneCameraAnimData(ob), frameset); - add_keyframes_from(bc_getSceneLightAnimData(ob), frameset); - - for (int a = 0; a < ob->totcol; a++) { - Material *ma = BKE_object_material_get(ob, a + 1); - add_keyframes_from(bc_getSceneMaterialAnimData(ma), frameset); - } -} - -void BCAnimationSampler::initialize_curves(BCAnimationCurveMap &curves, Object *ob) -{ - BC_animation_type object_type = BC_ANIMATION_TYPE_OBJECT; - - for (FCurve *fcu : blender::animrig::legacy::fcurves_for_assigned_action(ob->adt)) { - object_type = BC_ANIMATION_TYPE_OBJECT; - if (ob->type == OB_ARMATURE) { - char boneName[MAXBONENAME]; - if (BLI_str_quoted_substr(fcu->rna_path, "pose.bones[", boneName, sizeof(boneName))) { - object_type = BC_ANIMATION_TYPE_BONE; - } - } - - /* Adding action curves on object */ - BCCurveKey key(object_type, fcu->rna_path, fcu->array_index); - curves[key] = new BCAnimationCurve(key, ob, fcu); - } - - /* Add missing curves */ - object_type = BC_ANIMATION_TYPE_OBJECT; - generate_transforms(ob, EMPTY_STRING, object_type, curves); - if (ob->type == OB_ARMATURE) { - bArmature *arm = (bArmature *)ob->data; - LISTBASE_FOREACH (Bone *, root_bone, &arm->bonebase) { - generate_transforms(ob, root_bone, curves); - } - } - - /* Add curves on Object->data actions */ - AnimData *adt = nullptr; - if (ob->type == OB_CAMERA) { - adt = bc_getSceneCameraAnimData(ob); - object_type = BC_ANIMATION_TYPE_CAMERA; - } - else if (ob->type == OB_LAMP) { - adt = bc_getSceneLightAnimData(ob); - object_type = BC_ANIMATION_TYPE_LIGHT; - } - - /* Add light action or Camera action */ - for (FCurve *fcu : blender::animrig::legacy::fcurves_for_assigned_action(adt)) { - BCCurveKey key(object_type, fcu->rna_path, fcu->array_index); - curves[key] = new BCAnimationCurve(key, ob, fcu); - } - - /* Add curves on Object->material actions. */ - object_type = BC_ANIMATION_TYPE_MATERIAL; - for (int a = 0; a < ob->totcol; a++) { - /* Export Material parameter animations. */ - Material *ma = BKE_object_material_get(ob, a + 1); - if (ma) { - adt = bc_getSceneMaterialAnimData(ma); - // isMatAnim = true; - for (FCurve *fcu : blender::animrig::legacy::fcurves_for_assigned_action(adt)) { - BCCurveKey key(object_type, fcu->rna_path, fcu->array_index, a); - curves[key] = new BCAnimationCurve(key, ob, fcu); - } - } - } -} - -/* ==================================================================== */ - -BCSample &BCSampleFrame::add(Object *ob) -{ - BCSample *sample = new BCSample(ob); - sampleMap[ob] = sample; - return *sample; -} - -const BCSample *BCSampleFrame::get_sample(Object *ob) const -{ - BCSampleMap::const_iterator it = sampleMap.find(ob); - if (it == sampleMap.end()) { - return nullptr; - } - return it->second; -} - -const BCMatrix *BCSampleFrame::get_sample_matrix(Object *ob) const -{ - BCSampleMap::const_iterator it = sampleMap.find(ob); - if (it == sampleMap.end()) { - return nullptr; - } - BCSample *sample = it->second; - return &sample->get_matrix(); -} - -const BCMatrix *BCSampleFrame::get_sample_matrix(Object *ob, Bone *bone) const -{ - BCSampleMap::const_iterator it = sampleMap.find(ob); - if (it == sampleMap.end()) { - return nullptr; - } - - BCSample *sample = it->second; - const BCMatrix *bc_bone = sample->get_matrix(bone); - return bc_bone; -} - -bool BCSampleFrame::has_sample_for(Object *ob) const -{ - return sampleMap.find(ob) != sampleMap.end(); -} - -bool BCSampleFrame::has_sample_for(Object *ob, Bone *bone) const -{ - const BCMatrix *bc_bone = get_sample_matrix(ob, bone); - return bc_bone; -} - -/* ==================================================================== */ - -BCSample &BCSampleFrameContainer::add(Object *ob, int frame_index) -{ - BCSampleFrame &frame = sample_frames[frame_index]; - return frame.add(ob); -} - -/* ====================================================== */ -/* Below are the getters which we need to export the data */ -/* ====================================================== */ - -BCSampleFrame *BCSampleFrameContainer::get_frame(int frame_index) -{ - BCSampleFrameMap::iterator it = sample_frames.find(frame_index); - BCSampleFrame *frame = (it == sample_frames.end()) ? nullptr : &it->second; - return frame; -} - -int BCSampleFrameContainer::get_frames(std::vector &frames) const -{ - frames.clear(); /* safety; */ - BCSampleFrameMap::const_iterator it; - for (it = sample_frames.begin(); it != sample_frames.end(); ++it) { - frames.push_back(it->first); - } - return frames.size(); -} - -int BCSampleFrameContainer::get_frames(Object *ob, BCFrames &frames) const -{ - frames.clear(); /* safety; */ - BCSampleFrameMap::const_iterator it; - for (it = sample_frames.begin(); it != sample_frames.end(); ++it) { - const BCSampleFrame &frame = it->second; - if (frame.has_sample_for(ob)) { - frames.push_back(it->first); - } - } - return frames.size(); -} - -int BCSampleFrameContainer::get_frames(Object *ob, Bone *bone, BCFrames &frames) const -{ - frames.clear(); /* safety; */ - BCSampleFrameMap::const_iterator it; - for (it = sample_frames.begin(); it != sample_frames.end(); ++it) { - const BCSampleFrame &frame = it->second; - if (frame.has_sample_for(ob, bone)) { - frames.push_back(it->first); - } - } - return frames.size(); -} - -int BCSampleFrameContainer::get_samples(Object *ob, BCFrameSampleMap &samples) const -{ - samples.clear(); /* safety; */ - BCSampleFrameMap::const_iterator it; - for (it = sample_frames.begin(); it != sample_frames.end(); ++it) { - const BCSampleFrame &frame = it->second; - const BCSample *sample = frame.get_sample(ob); - if (sample) { - samples[it->first] = sample; - } - } - return samples.size(); -} - -int BCSampleFrameContainer::get_matrices(Object *ob, BCMatrixSampleMap &samples) const -{ - samples.clear(); /* safety; */ - BCSampleFrameMap::const_iterator it; - for (it = sample_frames.begin(); it != sample_frames.end(); ++it) { - const BCSampleFrame &frame = it->second; - const BCMatrix *matrix = frame.get_sample_matrix(ob); - if (matrix) { - samples[it->first] = matrix; - } - } - return samples.size(); -} - -int BCSampleFrameContainer::get_matrices(Object *ob, Bone *bone, BCMatrixSampleMap &samples) const -{ - samples.clear(); /* safety; */ - BCSampleFrameMap::const_iterator it; - for (it = sample_frames.begin(); it != sample_frames.end(); ++it) { - const BCSampleFrame &frame = it->second; - const BCMatrix *sample = frame.get_sample_matrix(ob, bone); - if (sample) { - samples[it->first] = sample; - } - } - return samples.size(); -} diff --git a/source/blender/io/collada/BCAnimationSampler.h b/source/blender/io/collada/BCAnimationSampler.h deleted file mode 100644 index d50725074a9..00000000000 --- a/source/blender/io/collada/BCAnimationSampler.h +++ /dev/null @@ -1,186 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "BCAnimationCurve.h" -#include "BCSampleData.h" -#include "collada_utils.h" - -#include "BKE_action.hh" -#include "BKE_lib_id.hh" - -/* Collection of animation curves */ -class BCAnimation { - private: - Object *reference = nullptr; - bContext *mContext; - - public: - BCFrameSet frame_set; - BCAnimationCurveMap curve_map; - - BCAnimation(bContext *C, Object *ob) : mContext(C) - { - Main *bmain = CTX_data_main(mContext); - reference = (Object *)BKE_id_copy(bmain, &ob->id); - id_us_min(&reference->id); - } - - ~BCAnimation() - { - BCAnimationCurveMap::iterator it; - for (it = curve_map.begin(); it != curve_map.end(); ++it) { - delete it->second; - } - - if (reference && reference->id.us == 0) { - Main *bmain = CTX_data_main(mContext); - BKE_id_delete(bmain, &reference->id); - } - curve_map.clear(); - } - - Object *get_reference() - { - return reference; - } -}; - -using BCAnimationObjectMap = std::map; - -class BCSampleFrame { - - /* Each frame on the timeline that needs to be sampled will have - * one BCSampleFrame where we collect sample information about all objects - * that need to be sampled for that frame. */ - - private: - BCSampleMap sampleMap; - - public: - ~BCSampleFrame() - { - BCSampleMap::iterator it; - for (it = sampleMap.begin(); it != sampleMap.end(); ++it) { - BCSample *sample = it->second; - delete sample; - } - sampleMap.clear(); - } - - BCSample &add(Object *ob); - - /* Following methods return NULL if object is not in the sampleMap. */ - - /** Get the matrix for the given key, returns Unity when the key does not exist. */ - const BCSample *get_sample(Object *ob) const; - const BCMatrix *get_sample_matrix(Object *ob) const; - /** Get the matrix for the given Bone, returns Unity when the Object is not sampled. */ - const BCMatrix *get_sample_matrix(Object *ob, Bone *bone) const; - - /** Check if the key is in this BCSampleFrame. */ - bool has_sample_for(Object *ob) const; - /** Check if the Bone is in this BCSampleFrame. */ - bool has_sample_for(Object *ob, Bone *bone) const; -}; - -using BCSampleFrameMap = std::map; - -class BCSampleFrameContainer { - - /* - * The BCSampleFrameContainer stores a map of BCSampleFrame objects - * with the timeline frame as key. - * - * Some details on the purpose: - * An Animation is made of multiple FCurves where each FCurve can - * have multiple keyframes. When we want to export the animation we - * also can decide whether we want to export the keyframes or a set - * of sample frames at equidistant locations (sample period). - * In any case we must resample first need to resample it fully - * to resolve things like: - * - * - animations by constraints - * - animations by drivers - * - * For this purpose we need to step through the entire animation and - * then sample each frame that contains at least one keyFrame or - * sampleFrame. Then for each frame we have to store the transform - * information for all exported objects in a BCSampleframe - * - * The entire set of BCSampleframes is finally collected into - * a BCSampleframneContainer - */ - - private: - BCSampleFrameMap sample_frames; - - public: - ~BCSampleFrameContainer() = default; - - BCSample &add(Object *ob, int frame_index); - /** Return either the #BCSampleFrame or NULL if frame does not exist. */ - BCSampleFrame *get_frame(int frame_index); - - /** Return a list of all frames that need to be sampled. */ - int get_frames(std::vector &frames) const; - int get_frames(Object *ob, BCFrames &frames) const; - int get_frames(Object *ob, Bone *bone, BCFrames &frames) const; - - int get_samples(Object *ob, BCFrameSampleMap &samples) const; - int get_matrices(Object *ob, BCMatrixSampleMap &samples) const; - int get_matrices(Object *ob, Bone *bone, BCMatrixSampleMap &samples) const; -}; - -class BCAnimationSampler { - private: - BCExportSettings &export_settings; - BCSampleFrameContainer sample_data; - BCAnimationObjectMap objects; - - void generate_transform(Object *ob, const BCCurveKey &key, BCAnimationCurveMap &curves); - void generate_transforms(Object *ob, - const std::string prep, - const BC_animation_type type, - BCAnimationCurveMap &curves); - void generate_transforms(Object *ob, Bone *bone, BCAnimationCurveMap &curves); - - void initialize_curves(BCAnimationCurveMap &curves, Object *ob); - /** - * Collect all keyframes from all animation curves related to the object. - * The bc_get... functions check for NULL and correct object type. - * The #add_keyframes_from() function checks for NULL. - */ - void initialize_keyframes(BCFrameSet &frameset, Object *ob); - BCSample &sample_object(Object *ob, int frame_index, bool for_opensim); - void update_animation_curves(BCAnimation &animation, - BCSample &sample, - Object *ob, - int frame_index); - void check_property_is_animated( - BCAnimation &animation, float *ref, float *val, std::string data_path, int length); - - public: - BCAnimationSampler(BCExportSettings &export_settings, BCObjectSet &object_set); - ~BCAnimationSampler(); - - void add_object(Object *ob); - - void sample_scene(BCExportSettings &export_settings, bool keyframe_at_end); - - BCAnimationCurveMap *get_curves(Object *ob); - void get_object_frames(BCFrames &frames, Object *ob); - bool get_object_samples(BCMatrixSampleMap &samples, Object *ob); - void get_bone_frames(BCFrames &frames, Object *ob, Bone *bone); - bool get_bone_samples(BCMatrixSampleMap &samples, Object *ob, Bone *bone); - - static void get_animated_from_export_set(std::set &animated_objects, - LinkNode &export_set); - static void find_depending_animated(std::set &animated_objects, - std::set &candidates); - static bool is_animated_by_constraint(Object *ob, - ListBase *conlist, - std::set &animated_objects); -}; diff --git a/source/blender/io/collada/BCMath.cpp b/source/blender/io/collada/BCMath.cpp deleted file mode 100644 index 41bef6a93ac..00000000000 --- a/source/blender/io/collada/BCMath.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* SPDX-FileCopyrightText: 2008 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BCMath.h" -#include "BlenderContext.h" - -#include "BLI_math_matrix.h" - -void BCQuat::rotate_to(Matrix &mat_to) -{ - Quat qd; - Matrix matd; - Matrix mati; - Matrix mat_from; - - quat_to_mat4(mat_from, q); - - /* Calculate the difference matrix matd between mat_from and mat_to */ - invert_m4_m4(mati, mat_from); - mul_m4_m4m4(matd, mati, mat_to); - - mat4_to_quat(qd, matd); - - mul_qt_qtqt(q, qd, q); /* rotate to the final rotation to mat_to */ -} - -BCMatrix::BCMatrix(const BCMatrix &mat) -{ - set_transform(mat.matrix); -} - -BCMatrix::BCMatrix(Matrix &mat) -{ - set_transform(mat); -} - -BCMatrix::BCMatrix(Object *ob) -{ - set_transform(ob); -} - -BCMatrix::BCMatrix() -{ - unit(); -} - -BCMatrix::BCMatrix(BC_global_forward_axis global_forward_axis, BC_global_up_axis global_up_axis) -{ - float mrot[3][3]; - float mat[4][4]; - mat3_from_axis_conversion( - global_forward_axis, global_up_axis, BC_DEFAULT_FORWARD, BC_DEFAULT_UP, mrot); - copy_m4_m3(mat, mrot); - set_transform(mat); -} - -void BCMatrix::add_transform(const Matrix &mat, bool inverted) -{ - add_transform(this->matrix, mat, this->matrix, inverted); -} - -void BCMatrix::add_transform(const BCMatrix &mat, bool inverted) -{ - add_transform(this->matrix, mat.matrix, this->matrix, inverted); -} - -void BCMatrix::apply_transform(const BCMatrix &mat, bool inverted) -{ - apply_transform(this->matrix, mat.matrix, this->matrix, inverted); -} - -void BCMatrix::add_transform(Matrix &to, - const Matrix &transform, - const Matrix &from, - bool inverted) -{ - if (inverted) { - Matrix globinv; - invert_m4_m4(globinv, transform); - add_transform(to, globinv, from, /*inverted=*/false); - } - else { - mul_m4_m4m4(to, transform, from); - } -} - -void BCMatrix::apply_transform(Matrix &to, - const Matrix &transform, - const Matrix &from, - bool inverse) -{ - Matrix globinv; - invert_m4_m4(globinv, transform); - if (inverse) { - add_transform(to, globinv, from, /*inverted=*/false); - } - else { - mul_m4_m4m4(to, transform, from); - mul_m4_m4m4(to, to, globinv); - } -} - -void BCMatrix::add_inverted_transform(Matrix &to, const Matrix &transform, const Matrix &from) -{ - Matrix workmat; - invert_m4_m4(workmat, transform); - mul_m4_m4m4(to, workmat, from); -} - -void BCMatrix::set_transform(Object *ob) -{ - Matrix lmat; - - BKE_object_matrix_local_get(ob, lmat); - copy_m4_m4(matrix, lmat); - - mat4_decompose(this->loc, this->q, this->size, lmat); - quat_to_compatible_eul(this->rot, ob->rot, this->q); -} - -void BCMatrix::set_transform(Matrix &mat) -{ - copy_m4_m4(matrix, mat); - mat4_decompose(this->loc, this->q, this->size, mat); - quat_to_eul(this->rot, this->q); -} - -void BCMatrix::copy(Matrix &r, Matrix &a) -{ - /* destination comes first: */ - memcpy(r, a, sizeof(Matrix)); -} - -void BCMatrix::transpose(Matrix &mat) -{ - transpose_m4(mat); -} - -void BCMatrix::sanitize(Matrix &mat, int precision) -{ - for (auto &row : mat) { - for (float &cell : row) { - double val = double(cell); - val = double_round(val, precision); - cell = float(val); - } - } -} - -void BCMatrix::sanitize(DMatrix &mat, int precision) -{ - for (auto &row : mat) { - for (double &cell : row) { - cell = double_round(cell, precision); - } - } -} - -void BCMatrix::unit() -{ - unit_m4(this->matrix); - mat4_decompose(this->loc, this->q, this->size, this->matrix); - quat_to_eul(this->rot, this->q); -} - -void BCMatrix::get_matrix(DMatrix &mat, const bool transposed, const int precision) const -{ - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - float val = (transposed) ? matrix[j][i] : matrix[i][j]; - if (precision >= 0) { - val = floor(val * pow(10, precision) + 0.5) / pow(10, precision); - } - mat[i][j] = val; - } - } -} - -void BCMatrix::get_matrix(Matrix &mat, - const bool transposed, - const int precision, - const bool inverted) const -{ - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - float val = (transposed) ? matrix[j][i] : matrix[i][j]; - if (precision >= 0) { - val = floor(val * pow(10, precision) + 0.5) / pow(10, precision); - } - mat[i][j] = val; - } - } - - if (inverted) { - invert_m4(mat); - } -} - -bool BCMatrix::in_range(const BCMatrix &other, float distance) const -{ - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - if (fabs(other.matrix[i][j] - matrix[i][j]) > distance) { - return false; - } - } - } - return true; -} - -float (&BCMatrix::location() const)[3] -{ - return loc; -} - -float (&BCMatrix::rotation() const)[3] -{ - return rot; -} - -float (&BCMatrix::scale() const)[3] -{ - return size; -} - -float (&BCMatrix::quat() const)[4] -{ - return q; -} diff --git a/source/blender/io/collada/BCMath.h b/source/blender/io/collada/BCMath.h deleted file mode 100644 index baaca3e14fc..00000000000 --- a/source/blender/io/collada/BCMath.h +++ /dev/null @@ -1,97 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "BKE_object.hh" -#include "BLI_math_rotation.h" -#include "BLI_math_vector.h" -#include "BlenderTypes.h" - -class BCQuat { - private: - mutable Quat q; - - public: - BCQuat(const BCQuat &other) - { - copy_v4_v4(q, other.q); - } - - BCQuat(Quat &other) - { - copy_v4_v4(q, other); - } - - BCQuat() - { - unit_qt(q); - } - - Quat &quat() - { - return q; - } - - void rotate_to(Matrix &mat_to); -}; - -class BCMatrix { - - private: - mutable float matrix[4][4]; - mutable float size[3]; - mutable float rot[3]; - mutable float loc[3]; - mutable float q[4]; - - void unit(); - void copy(Matrix &r, Matrix &a); - - public: - float (&location() const)[3]; - float (&rotation() const)[3]; - float (&scale() const)[3]; - float (&quat() const)[4]; - - BCMatrix(BC_global_forward_axis global_forward_axis, BC_global_up_axis global_up_axis); - BCMatrix(const BCMatrix &mat); - BCMatrix(Matrix &mat); - BCMatrix(Object *ob); - BCMatrix(); - - /** - * We need double here because the OpenCollada API needs it. - * precision = -1 indicates to not limit the precision. - */ - void get_matrix(DMatrix &matrix, bool transposed = false, int precision = -1) const; - void get_matrix(Matrix &matrix, - bool transposed = false, - int precision = -1, - bool inverted = false) const; - void set_transform(Object *ob); - void set_transform(Matrix &mat); - void add_transform(Matrix &to, - const Matrix &transform, - const Matrix &from, - bool inverted = false); - void apply_transform(Matrix &to, - const Matrix &transform, - const Matrix &from, - bool inverse = false); - void add_inverted_transform(Matrix &to, const Matrix &transform, const Matrix &from); - void add_transform(const Matrix &matrix, bool inverted = false); - void add_transform(const BCMatrix &matrix, bool inverted = false); - void apply_transform(const BCMatrix &matrix, bool inverted = false); - - bool in_range(const BCMatrix &other, float distance) const; - - static void sanitize(Matrix &matrix, int precision); - static void sanitize(DMatrix &matrix, int precision); - static void transpose(Matrix &matrix); -}; diff --git a/source/blender/io/collada/BCSampleData.cpp b/source/blender/io/collada/BCSampleData.cpp deleted file mode 100644 index 8ad012ed734..00000000000 --- a/source/blender/io/collada/BCSampleData.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* SPDX-FileCopyrightText: 2008 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "BCSampleData.h" -#include "collada_utils.h" - -BCSample::~BCSample() -{ - BCBoneMatrixMap::iterator it; - for (it = bonemats.begin(); it != bonemats.end(); ++it) { - delete it->second; - } -} - -void BCSample::add_bone_matrix(Bone *bone, Matrix &mat) -{ - BCMatrix *matrix; - BCBoneMatrixMap::const_iterator it = bonemats.find(bone); - if (it != bonemats.end()) { - throw std::invalid_argument("bone " + std::string(bone->name) + " already defined before"); - } - matrix = new BCMatrix(mat); - bonemats[bone] = matrix; -} - -bool BCSample::get_value(std::string channel_target, const int array_index, float *val) const -{ - std::string bname = bc_string_before(channel_target, "."); - std::string channel_type = bc_string_after(channel_target, "."); - - const BCMatrix *matrix = &obmat; - if (bname != channel_target) { - bname = bname.substr(2); - bname = bc_string_before(bname, "\""); - BCBoneMatrixMap::const_iterator it; - for (it = bonemats.begin(); it != bonemats.end(); ++it) { - Bone *bone = it->first; - if (bname == bone->name) { - matrix = it->second; - break; - } - } - } - else { - matrix = &obmat; - } - - if (channel_type == "location") { - *val = matrix->location()[array_index]; - } - else if (channel_type == "scale") { - *val = matrix->scale()[array_index]; - } - else if (ELEM(channel_type, "rotation", "rotation_euler")) { - *val = matrix->rotation()[array_index]; - } - else if (channel_type == "rotation_quaternion") { - *val = matrix->quat()[array_index]; - } - else { - *val = 0; - return false; - } - - return true; -} - -const BCMatrix *BCSample::get_matrix(Bone *bone) const -{ - BCBoneMatrixMap::const_iterator it = bonemats.find(bone); - if (it == bonemats.end()) { - return nullptr; - } - return it->second; -} - -const BCMatrix &BCSample::get_matrix() const -{ - return obmat; -} diff --git a/source/blender/io/collada/BCSampleData.h b/source/blender/io/collada/BCSampleData.h deleted file mode 100644 index 770d1ee7069..00000000000 --- a/source/blender/io/collada/BCSampleData.h +++ /dev/null @@ -1,37 +0,0 @@ -/* SPDX-FileCopyrightText: 2008 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include -#include - -#include "BCMath.h" - -#include "DNA_armature_types.h" -#include "DNA_object_types.h" - -using BCBoneMatrixMap = std::map; - -class BCSample { - private: - BCMatrix obmat; - BCBoneMatrixMap bonemats; /* For Armature animation */ - - public: - BCSample(Object *ob) : obmat(ob) {} - - ~BCSample(); - - void add_bone_matrix(Bone *bone, Matrix &mat); - - /** Get channel value. */ - bool get_value(std::string channel_target, int array_index, float *val) const; - const BCMatrix &get_matrix() const; - const BCMatrix *get_matrix(Bone *bone) const; /* returns NULL if bone is not animated */ -}; - -using BCSampleMap = std::map; -using BCFrameSampleMap = std::map; -using BCMatrixSampleMap = std::map; diff --git a/source/blender/io/collada/BlenderContext.cpp b/source/blender/io/collada/BlenderContext.cpp deleted file mode 100644 index 2f1e2d349f3..00000000000 --- a/source/blender/io/collada/BlenderContext.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* SPDX-FileCopyrightText: 2009-2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include - -#include "BlenderContext.h" -#include "ExportSettings.h" - -#include "BKE_layer.hh" -#include "BKE_scene.hh" - -#include "BLI_listbase.h" - -bool bc_is_base_node(LinkNode *export_set, Object *ob, const Scene *scene, ViewLayer *view_layer) -{ - Object *root = bc_get_highest_exported_ancestor_or_self(export_set, ob, scene, view_layer); - return (root == ob); -} - -Object *bc_get_highest_exported_ancestor_or_self(LinkNode *export_set, - Object *ob, - const Scene *scene, - ViewLayer *view_layer) -{ - Object *ancestor = ob; - while (ob->parent) { - if (bc_is_in_Export_set(export_set, ob->parent, scene, view_layer)) { - ancestor = ob->parent; - } - ob = ob->parent; - } - return ancestor; -} - -void bc_get_children(std::vector &child_set, - Object *ob, - const Scene *scene, - ViewLayer *view_layer) -{ - BKE_view_layer_synced_ensure(scene, view_layer); - LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { - Object *cob = base->object; - if (cob->parent == ob) { - switch (ob->type) { - case OB_MESH: - case OB_CAMERA: - case OB_LAMP: - case OB_EMPTY: - case OB_ARMATURE: - child_set.push_back(cob); - default: - break; - } - } - } -} - -bool bc_is_in_Export_set(LinkNode *export_set, - Object *ob, - const Scene *scene, - ViewLayer *view_layer) -{ - bool to_export = (BLI_linklist_index(export_set, ob) != -1); - - if (!to_export) { - /* Mark this object as to_export even if it is not in the - * export list, but it contains children to export. */ - - std::vector children; - bc_get_children(children, ob, scene, view_layer); - for (Object *child : children) { - if (bc_is_in_Export_set(export_set, child, scene, view_layer)) { - to_export = true; - break; - } - } - } - return to_export; -} - -int bc_is_marked(Object *ob) -{ - return ob && (ob->id.tag & ID_TAG_DOIT); -} - -void bc_remove_mark(Object *ob) -{ - ob->id.tag &= ~ID_TAG_DOIT; -} - -void bc_set_mark(Object *ob) -{ - ob->id.tag |= ID_TAG_DOIT; -} - -BlenderContext::BlenderContext(bContext *C) -{ - context = C; - main = CTX_data_main(C); - scene = CTX_data_scene(C); - view_layer = CTX_data_view_layer(C); - depsgraph = nullptr; /* create only when needed */ -} - -bContext *BlenderContext::get_context() -{ - return context; -} - -Depsgraph *BlenderContext::get_depsgraph() -{ - if (!depsgraph) { - depsgraph = BKE_scene_ensure_depsgraph(main, scene, view_layer); - } - return depsgraph; -} - -Scene *BlenderContext::get_scene() -{ - return scene; -} - -Scene *BlenderContext::get_evaluated_scene() -{ - Scene *scene_eval = DEG_get_evaluated_scene(get_depsgraph()); - return scene_eval; -} - -Object *BlenderContext::get_evaluated_object(Object *ob) -{ - Object *ob_eval = DEG_get_evaluated(depsgraph, ob); - return ob_eval; -} - -ViewLayer *BlenderContext::get_view_layer() -{ - return view_layer; -} - -Main *BlenderContext::get_main() -{ - return main; -} diff --git a/source/blender/io/collada/BlenderContext.h b/source/blender/io/collada/BlenderContext.h deleted file mode 100644 index e82f2564b98..00000000000 --- a/source/blender/io/collada/BlenderContext.h +++ /dev/null @@ -1,59 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "BKE_context.hh" -#include "BKE_main.hh" -#include "BLI_linklist.h" -#include "BlenderTypes.h" -#include "DEG_depsgraph.hh" -#include "DEG_depsgraph_query.hh" -#include "DNA_layer_types.h" -#include "DNA_object_types.h" - -static const BC_global_forward_axis BC_DEFAULT_FORWARD = BC_GLOBAL_FORWARD_Y; -static const BC_global_up_axis BC_DEFAULT_UP = BC_GLOBAL_UP_Z; - -bool bc_is_in_Export_set(LinkNode *export_set, - Object *ob, - const Scene *scene, - ViewLayer *view_layer); -bool bc_is_base_node(LinkNode *export_set, Object *ob, const Scene *scene, ViewLayer *view_layer); -/** - * Returns the highest selected ancestor - * returns NULL if no ancestor is selected - * IMPORTANT: This function expects that all exported objects have set: - * `ob->id.tag & ID_TAG_DOIT` - */ -Object *bc_get_highest_exported_ancestor_or_self(LinkNode *export_set, - Object *ob, - const Scene *scene, - ViewLayer *view_layer); -int bc_is_marked(Object *ob); -void bc_remove_mark(Object *ob); -void bc_set_mark(Object *ob); - -class BlenderContext { - private: - bContext *context; - Depsgraph *depsgraph; - Scene *scene; - ViewLayer *view_layer; - Main *main; - - public: - BlenderContext(bContext *C); - bContext *get_context(); - Depsgraph *get_depsgraph(); - Scene *get_scene(); - Scene *get_evaluated_scene(); - Object *get_evaluated_object(Object *ob); - ViewLayer *get_view_layer(); - Main *get_main(); -}; diff --git a/source/blender/io/collada/BlenderTypes.h b/source/blender/io/collada/BlenderTypes.h deleted file mode 100644 index 0b82f20298c..00000000000 --- a/source/blender/io/collada/BlenderTypes.h +++ /dev/null @@ -1,33 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -using Vector = float[3]; -using Quat = float[4]; -using Color = float[4]; -using Matrix = float[4][4]; -using DMatrix = double[4][4]; - -enum BC_global_forward_axis { - BC_GLOBAL_FORWARD_X = 0, - BC_GLOBAL_FORWARD_Y = 1, - BC_GLOBAL_FORWARD_Z = 2, - BC_GLOBAL_FORWARD_MINUS_X = 3, - BC_GLOBAL_FORWARD_MINUS_Y = 4, - BC_GLOBAL_FORWARD_MINUS_Z = 5 -}; - -enum BC_global_up_axis { - BC_GLOBAL_UP_X = 0, - BC_GLOBAL_UP_Y = 1, - BC_GLOBAL_UP_Z = 2, - BC_GLOBAL_UP_MINUS_X = 3, - BC_GLOBAL_UP_MINUS_Y = 4, - BC_GLOBAL_UP_MINUS_Z = 5 -}; diff --git a/source/blender/io/collada/CMakeLists.txt b/source/blender/io/collada/CMakeLists.txt deleted file mode 100644 index 32cbb4cb2e6..00000000000 --- a/source/blender/io/collada/CMakeLists.txt +++ /dev/null @@ -1,127 +0,0 @@ -# SPDX-FileCopyrightText: 2006 Blender Authors -# -# SPDX-License-Identifier: GPL-2.0-or-later - -remove_strict_flags() -find_file(OPENCOLLADA_ANIMATION_CLIP - NAMES - COLLADAFWAnimationClip.h - PATHS - ${OPENCOLLADA_INCLUDE_DIRS} - NO_DEFAULT_PATH -) - -if(OPENCOLLADA_ANIMATION_CLIP) - add_definitions(-DWITH_OPENCOLLADA_ANIMATION_CLIP) -endif() - -# In CMAKE version 3.21 and up, we can instead use the NO_CACHE option for -# find_file so we don't need to clear it from the cache here. -unset(OPENCOLLADA_ANIMATION_CLIP CACHE) - -set(INC - . - ../../editors/include - ../../ikplugin - ../../makesrna - ../../../../intern/iksolver/extern -) - -set(INC_SYS - ${OPENCOLLADA_INCLUDE_DIRS} -) - -set(SRC - AnimationClipExporter.cpp - AnimationExporter.cpp - AnimationImporter.cpp - ArmatureExporter.cpp - ArmatureImporter.cpp - BCAnimationCurve.cpp - BCAnimationSampler.cpp - BCMath.cpp - BCSampleData.cpp - BlenderContext.cpp - CameraExporter.cpp - ControllerExporter.cpp - DocumentExporter.cpp - DocumentImporter.cpp - EffectExporter.cpp - ErrorHandler.cpp - ExportSettings.cpp - ExtraHandler.cpp - ExtraTags.cpp - GeometryExporter.cpp - ImageExporter.cpp - ImportSettings.cpp - InstanceWriter.cpp - LightExporter.cpp - MaterialExporter.cpp - Materials.cpp - MeshImporter.cpp - SceneExporter.cpp - SkinInfo.cpp - TransformReader.cpp - TransformWriter.cpp - collada.cpp - collada_internal.cpp - collada_utils.cpp - - AnimationClipExporter.h - AnimationExporter.h - AnimationImporter.h - ArmatureExporter.h - ArmatureImporter.h - BCAnimationCurve.h - BCAnimationSampler.h - BCMath.h - BCSampleData.h - BlenderContext.h - BlenderTypes.h - CameraExporter.h - ControllerExporter.h - DocumentExporter.h - DocumentImporter.h - EffectExporter.h - ErrorHandler.h - ExportSettings.h - ExtraHandler.h - ExtraTags.h - GeometryExporter.h - ImageExporter.h - ImportSettings.h - InstanceWriter.h - LightExporter.h - MaterialExporter.h - Materials.h - MeshImporter.h - SceneExporter.h - SkinInfo.h - TransformReader.h - TransformWriter.h - collada.h - collada_internal.h - collada_utils.h -) - -set(LIB - ${OPENCOLLADA_LIBRARIES} - ${XML2_LIBRARIES} - PRIVATE bf::animrig - PRIVATE bf::blenkernel - PRIVATE bf::blenlib - PRIVATE bf::blentranslation - PRIVATE bf::bmesh - PRIVATE bf::depsgraph - PRIVATE bf::dna - PRIVATE bf::imbuf - PRIVATE bf::intern::guardedalloc - PRIVATE bf::nodes - PRIVATE bf::windowmanager -) - -if(WITH_BUILDINFO) - add_definitions(-DWITH_BUILDINFO) -endif() - -blender_add_lib(bf_io_collada "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/io/collada/CameraExporter.cpp b/source/blender/io/collada/CameraExporter.cpp deleted file mode 100644 index 00fbb3a6d47..00000000000 --- a/source/blender/io/collada/CameraExporter.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include - -#include "COLLADASWCamera.h" - -#include "DNA_camera_types.h" - -#include "CameraExporter.h" - -#include "collada_internal.h" - -CamerasExporter::CamerasExporter(COLLADASW::StreamWriter *sw, BCExportSettings &export_settings) - : COLLADASW::LibraryCameras(sw), export_settings(export_settings) -{ -} - -template -void forEachCameraObjectInExportSet(Scene *sce, Functor &f, LinkNode *export_set) -{ - LinkNode *node; - for (node = export_set; node; node = node->next) { - Object *ob = (Object *)node->link; - - if (ob->type == OB_CAMERA && ob->data) { - f(ob, sce); - } - } -} - -void CamerasExporter::exportCameras(Scene *sce) -{ - openLibrary(); - - forEachCameraObjectInExportSet(sce, *this, this->export_settings.get_export_set()); - - closeLibrary(); -} -void CamerasExporter::operator()(Object *ob, Scene *sce) -{ - Camera *cam = (Camera *)ob->data; - std::string cam_id(get_camera_id(ob)); - std::string cam_name(id_name(cam)); - - switch (cam->type) { - case CAM_CUSTOM: - case CAM_PANO: - case CAM_PERSP: { - COLLADASW::PerspectiveOptic persp(mSW); - persp.setXFov(RAD2DEGF(focallength_to_fov(cam->lens, cam->sensor_x)), "xfov"); - persp.setAspectRatio(float(sce->r.xsch) / float(sce->r.ysch), false, "aspect_ratio"); - persp.setZFar(cam->clip_end, false, "zfar"); - persp.setZNear(cam->clip_start, false, "znear"); - COLLADASW::Camera ccam(mSW, &persp, cam_id, cam_name); - exportBlenderProfile(ccam, cam); - addCamera(ccam); - - break; - } - case CAM_ORTHO: - default: { - COLLADASW::OrthographicOptic ortho(mSW); - ortho.setXMag(cam->ortho_scale / 2, "xmag"); - ortho.setAspectRatio(float(sce->r.xsch) / float(sce->r.ysch), false, "aspect_ratio"); - ortho.setZFar(cam->clip_end, false, "zfar"); - ortho.setZNear(cam->clip_start, false, "znear"); - COLLADASW::Camera ccam(mSW, &ortho, cam_id, cam_name); - exportBlenderProfile(ccam, cam); - addCamera(ccam); - break; - } - } -} -bool CamerasExporter::exportBlenderProfile(COLLADASW::Camera &cm, Camera *cam) -{ - cm.addExtraTechniqueParameter("blender", "shiftx", cam->shiftx); - cm.addExtraTechniqueParameter("blender", "shifty", cam->shifty); - cm.addExtraTechniqueParameter("blender", "dof_distance", cam->dof.focus_distance); - return true; -} diff --git a/source/blender/io/collada/CameraExporter.h b/source/blender/io/collada/CameraExporter.h deleted file mode 100644 index e2a79b63c05..00000000000 --- a/source/blender/io/collada/CameraExporter.h +++ /dev/null @@ -1,29 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "COLLADASWLibraryCameras.h" -#include "COLLADASWStreamWriter.h" - -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "DNA_camera_types.h" -#include "ExportSettings.h" - -class CamerasExporter : COLLADASW::LibraryCameras { - public: - CamerasExporter(COLLADASW::StreamWriter *sw, BCExportSettings &export_settings); - void exportCameras(Scene *sce); - void operator()(Object *ob, Scene *sce); - - private: - bool exportBlenderProfile(COLLADASW::Camera &cm, Camera *cam); - BCExportSettings &export_settings; -}; diff --git a/source/blender/io/collada/ControllerExporter.cpp b/source/blender/io/collada/ControllerExporter.cpp deleted file mode 100644 index ea13207df41..00000000000 --- a/source/blender/io/collada/ControllerExporter.cpp +++ /dev/null @@ -1,628 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "COLLADASWBaseInputElement.h" -#include "COLLADASWInstanceController.h" -#include "COLLADASWPrimitves.h" -#include "COLLADASWSource.h" - -#include "DNA_action_types.h" -#include "DNA_meshdata_types.h" - -#include "BKE_action.hh" -#include "BKE_armature.hh" -#include "BKE_deform.hh" -#include "BKE_key.hh" -#include "BKE_lib_id.hh" -#include "BKE_mesh.hh" - -#include "ED_armature.hh" - -#include "BLI_listbase.h" -#include "BLI_math_matrix.h" - -#include "ControllerExporter.h" -#include "GeometryExporter.h" - -#include "collada_utils.h" - -bool ControllerExporter::is_skinned_mesh(Object *ob) -{ - return bc_get_assigned_armature(ob) != nullptr; -} - -void ControllerExporter::write_bone_URLs(COLLADASW::InstanceController &ins, - Object *ob_arm, - Bone *bone) -{ - if (bc_is_root_bone(bone, this->export_settings.get_deform_bones_only())) { - std::string node_id = translate_id(id_name(ob_arm) + "_" + bone->name); - ins.addSkeleton(COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, node_id)); - } - else { - LISTBASE_FOREACH (Bone *, child, &bone->childbase) { - write_bone_URLs(ins, ob_arm, child); - } - } -} - -bool ControllerExporter::add_instance_controller(Object *ob) -{ - Object *ob_arm = bc_get_assigned_armature(ob); - bArmature *arm = (bArmature *)ob_arm->data; - - const std::string &controller_id = get_controller_id(ob_arm, ob); - - COLLADASW::InstanceController ins(mSW); - ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id)); - - Mesh *mesh = (Mesh *)ob->data; - if (mesh->deform_verts().is_empty()) { - return false; - } - - /* write root bone URLs */ - LISTBASE_FOREACH (Bone *, bone, &arm->bonebase) { - write_bone_URLs(ins, ob_arm, bone); - } - - InstanceWriter::add_material_bindings( - ins.getBindMaterial(), ob, this->export_settings.get_active_uv_only()); - - ins.add(); - return true; -} - -void ControllerExporter::export_controllers() -{ - Scene *sce = blender_context.get_scene(); - openLibrary(); - - GeometryFunctor gf; - gf.forEachMeshObjectInExportSet( - sce, *this, this->export_settings.get_export_set()); - - closeLibrary(); -} - -void ControllerExporter::operator()(Object *ob) -{ - Object *ob_arm = bc_get_assigned_armature(ob); - Key *key = BKE_key_from_object(ob); - - if (ob_arm) { - export_skin_controller(ob, ob_arm); - } - if (key && this->export_settings.get_include_shapekeys()) { - export_morph_controller(ob, key); - } -} -#if 0 - -bool ArmatureExporter::already_written(Object *ob_arm) -{ - return std::find(written_armatures.begin(), written_armatures.end(), ob_arm) != - written_armatures.end(); -} - -void ArmatureExporter::wrote(Object *ob_arm) -{ - written_armatures.push_back(ob_arm); -} - -void ArmatureExporter::find_objects_using_armature(Object *ob_arm, - std::vector &objects, - Scene *sce) -{ - objects.clear(); - - Base *base = (Base *)sce->base.first; - while (base) { - Object *ob = base->object; - - if (ob->type == OB_MESH && get_assigned_armature(ob) == ob_arm) { - objects.push_back(ob); - } - - base = base->next; - } -} -#endif - -std::string ControllerExporter::get_controller_id(Object *ob_arm, Object *ob) -{ - return translate_id(id_name(ob_arm)) + "_" + translate_id(id_name(ob)) + - SKIN_CONTROLLER_ID_SUFFIX; -} - -std::string ControllerExporter::get_controller_id(Key *key, Object *ob) -{ - return translate_id(id_name(ob)) + MORPH_CONTROLLER_ID_SUFFIX; -} - -void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm) -{ - /* joint names - * joint inverse bind matrices - * vertex weights */ - - /* input: - * joint names: ob -> vertex group names - * vertex group weights: mesh->dvert -> groups -> index, weight */ - - bool use_instantiation = this->export_settings.get_use_object_instantiation(); - Mesh *mesh; - - if (((Mesh *)ob->data)->deform_verts().is_empty()) { - return; - } - - mesh = bc_get_mesh_copy(blender_context, - ob, - this->export_settings.get_export_mesh_type(), - this->export_settings.get_apply_modifiers(), - this->export_settings.get_triangulate()); - - std::string controller_name = id_name(ob_arm); - std::string controller_id = get_controller_id(ob_arm, ob); - - openSkin(controller_id, - controller_name, - COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob, use_instantiation))); - - add_bind_shape_mat(ob); - - const ListBase *defbase = BKE_object_defgroup_list(ob); - std::string joints_source_id = add_joints_source(ob_arm, defbase, controller_id); - std::string inv_bind_mat_source_id = add_inv_bind_mats_source(ob_arm, defbase, controller_id); - - std::list vcounts; - std::list joints; - std::list weights; - - { - int i, j; - - /* def group index -> joint index */ - std::vector joint_index_by_def_index; - const bDeformGroup *def; - - for (def = (const bDeformGroup *)defbase->first, i = 0, j = 0; def; def = def->next, i++) { - if (is_bone_defgroup(ob_arm, def)) { - joint_index_by_def_index.push_back(j++); - } - else { - joint_index_by_def_index.push_back(-1); - } - } - - const MDeformVert *dvert = mesh->deform_verts().data(); - int oob_counter = 0; - for (i = 0; i < mesh->verts_num; i++) { - const MDeformVert *vert = &dvert[i]; - std::map jw; - - /* We're normalizing the weights later */ - float sumw = 0.0f; - - for (j = 0; j < vert->totweight; j++) { - uint idx = vert->dw[j].def_nr; - if (idx >= joint_index_by_def_index.size()) { - /* XXX: Maybe better find out where and - * why the Out Of Bound indexes get created? */ - oob_counter += 1; - } - else { - int joint_index = joint_index_by_def_index[idx]; - if (joint_index != -1 && vert->dw[j].weight > 0.0f) { - jw[joint_index] += vert->dw[j].weight; - sumw += vert->dw[j].weight; - } - } - } - - if (sumw > 0.0f) { - float invsumw = 1.0f / sumw; - vcounts.push_back(jw.size()); - for (auto &index_and_weight : jw) { - joints.push_back(index_and_weight.first); - weights.push_back(invsumw * index_and_weight.second); - } - } - else { - vcounts.push_back(0); -#if 0 - vcounts.push_back(1); - joints.push_back(-1); - weights.push_back(1.0f); -#endif - } - } - - if (oob_counter > 0) { - fprintf(stderr, - "Ignored %d Vertex weights which use index to non existing VGroup %zu.\n", - oob_counter, - joint_index_by_def_index.size()); - } - } - - std::string weights_source_id = add_weights_source(mesh, controller_id, weights); - add_joints_element(defbase, joints_source_id, inv_bind_mat_source_id); - add_vertex_weights_element(weights_source_id, joints_source_id, vcounts, joints); - - BKE_id_free(nullptr, mesh); - - closeSkin(); - closeController(); -} - -void ControllerExporter::export_morph_controller(Object *ob, Key *key) -{ - bool use_instantiation = this->export_settings.get_use_object_instantiation(); - Mesh *mesh; - - mesh = bc_get_mesh_copy(blender_context, - ob, - this->export_settings.get_export_mesh_type(), - this->export_settings.get_apply_modifiers(), - this->export_settings.get_triangulate()); - - std::string controller_name = id_name(ob) + "-morph"; - std::string controller_id = get_controller_id(key, ob); - - openMorph( - controller_id, - controller_name, - COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob, use_instantiation))); - - std::string targets_id = add_morph_targets(key, ob); - std::string morph_weights_id = add_morph_weights(key, ob); - - COLLADASW::TargetsElement targets(mSW); - - COLLADASW::InputList &input = targets.getInputList(); - - input.push_back(COLLADASW::Input( - COLLADASW::InputSemantic::MORPH_TARGET, /* constant declared in COLLADASWInputList.h */ - COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, targets_id))); - input.push_back( - COLLADASW::Input(COLLADASW::InputSemantic::MORPH_WEIGHT, - COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, morph_weights_id))); - targets.add(); - - BKE_id_free(nullptr, mesh); - - /* support for animations - * can also try the base element and param alternative */ - add_weight_extras(key); - closeMorph(); - closeController(); -} - -std::string ControllerExporter::add_morph_targets(Key *key, Object *ob) -{ - std::string source_id = translate_id(id_name(ob)) + TARGETS_SOURCE_ID_SUFFIX; - - COLLADASW::IdRefSource source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(key->totkey - 1); - source.setAccessorStride(1); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.emplace_back("IDREF"); - - source.prepareToAppendValues(); - - KeyBlock *kb = (KeyBlock *)key->block.first; - /* skip the basis */ - kb = kb->next; - for (; kb; kb = kb->next) { - std::string geom_id = get_geometry_id(ob, false) + "_morph_" + translate_id(kb->name); - source.appendValues(geom_id); - } - - source.finish(); - - return source_id; -} - -std::string ControllerExporter::add_morph_weights(Key *key, Object *ob) -{ - std::string source_id = translate_id(id_name(ob)) + WEIGHTS_SOURCE_ID_SUFFIX; - - COLLADASW::FloatSourceF source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(key->totkey - 1); - source.setAccessorStride(1); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.emplace_back("MORPH_WEIGHT"); - - source.prepareToAppendValues(); - - KeyBlock *kb = (KeyBlock *)key->block.first; - /* skip the basis */ - kb = kb->next; - for (; kb; kb = kb->next) { - float weight = kb->curval; - source.appendValues(weight); - } - source.finish(); - - return source_id; -} - -void ControllerExporter::add_weight_extras(Key *key) -{ - /* can also try the base element and param alternative */ - COLLADASW::BaseExtraTechnique extra; - - KeyBlock *kb = (KeyBlock *)key->block.first; - /* skip the basis */ - kb = kb->next; - for (; kb; kb = kb->next) { - /* XXX why is the weight not used here and set to 0.0? - * float weight = kb->curval; */ - extra.addExtraTechniqueParameter("KHR", "morph_weights", 0.000, "MORPH_WEIGHT_TO_TARGET"); - } -} - -void ControllerExporter::add_joints_element(const ListBase *defbase, - const std::string &joints_source_id, - const std::string &inv_bind_mat_source_id) -{ - COLLADASW::JointsElement joints(mSW); - COLLADASW::InputList &input = joints.getInputList(); - - input.push_back(COLLADASW::Input( - COLLADASW::InputSemantic::JOINT, /* constant declared in COLLADASWInputList.h */ - COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, joints_source_id))); - input.push_back( - COLLADASW::Input(COLLADASW::InputSemantic::BINDMATRIX, - COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, inv_bind_mat_source_id))); - joints.add(); -} - -void ControllerExporter::add_bind_shape_mat(Object *ob) -{ - double bind_mat[4][4]; - float f_obmat[4][4]; - BKE_object_matrix_local_get(ob, f_obmat); - - if (export_settings.get_apply_global_orientation()) { - /* do nothing, rotation is going to be applied to the Data */ - } - else { - bc_add_global_transform(f_obmat, export_settings.get_global_transform()); - } - - // UnitConverter::mat4_to_dae_double(bind_mat, ob->object_to_world().ptr()); - UnitConverter::mat4_to_dae_double(bind_mat, f_obmat); - if (this->export_settings.get_limit_precision()) { - BCMatrix::sanitize(bind_mat, LIMITTED_PRECISION); - } - - addBindShapeTransform(bind_mat); -} - -std::string ControllerExporter::add_joints_source(Object *ob_arm, - const ListBase *defbase, - const std::string &controller_id) -{ - std::string source_id = controller_id + JOINTS_SOURCE_ID_SUFFIX; - - int totjoint = 0; - LISTBASE_FOREACH (bDeformGroup *, def, defbase) { - if (is_bone_defgroup(ob_arm, def)) { - totjoint++; - } - } - - COLLADASW::NameSource source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(totjoint); - source.setAccessorStride(1); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.emplace_back("JOINT"); - - source.prepareToAppendValues(); - - LISTBASE_FOREACH (bDeformGroup *, def, defbase) { - Bone *bone = get_bone_from_defgroup(ob_arm, def); - if (bone) { - source.appendValues(get_joint_sid(bone)); - } - } - - source.finish(); - - return source_id; -} - -std::string ControllerExporter::add_inv_bind_mats_source(Object *ob_arm, - const ListBase *defbase, - const std::string &controller_id) -{ - std::string source_id = controller_id + BIND_POSES_SOURCE_ID_SUFFIX; - - int totjoint = 0; - LISTBASE_FOREACH (bDeformGroup *, def, defbase) { - if (is_bone_defgroup(ob_arm, def)) { - totjoint++; - } - } - - COLLADASW::FloatSourceF source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(totjoint); // BLI_listbase_count(defbase)); - source.setAccessorStride(16); - - source.setParameterTypeName(&COLLADASW::CSWC::CSW_VALUE_TYPE_FLOAT4x4); - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.emplace_back("TRANSFORM"); - - source.prepareToAppendValues(); - - bPose *pose = ob_arm->pose; - bArmature *arm = (bArmature *)ob_arm->data; - - int flag = arm->flag; - - /* put armature in rest position */ - if (!(arm->flag & ARM_RESTPOS)) { - Depsgraph *depsgraph = blender_context.get_depsgraph(); - Scene *scene = blender_context.get_scene(); - - arm->flag |= ARM_RESTPOS; - BKE_pose_where_is(depsgraph, scene, ob_arm); - } - - LISTBASE_FOREACH (bDeformGroup *, def, defbase) { - if (is_bone_defgroup(ob_arm, def)) { - bPoseChannel *pchan = BKE_pose_channel_find_name(pose, def->name); - - float mat[4][4]; - float world[4][4]; - float inv_bind_mat[4][4]; - - float bind_mat[4][4]; /* derived from bone->arm_mat */ - - bool has_bindmat = bc_get_property_matrix(pchan->bone, "bind_mat", bind_mat); - - if (!has_bindmat) { - - /* Have no bind matrix stored, try old style <= Blender 2.78 */ - - bc_create_restpose_mat( - this->export_settings, pchan->bone, bind_mat, pchan->bone->arm_mat, true); - - /* SL/OPEN_SIM COMPATIBILITY */ - if (export_settings.get_open_sim()) { - float loc[3]; - float rot[3] = {0, 0, 0}; - float scale[3]; - bc_decompose(bind_mat, loc, nullptr, nullptr, scale); - - /* Only translations, no rotation vs armature */ - loc_eulO_size_to_mat4(bind_mat, loc, rot, scale, 6); - } - } - - /* make world-space matrix (bind_mat is armature-space) */ - mul_m4_m4m4(world, ob_arm->object_to_world().ptr(), bind_mat); - - if (!has_bindmat) { - if (export_settings.get_apply_global_orientation()) { - bc_apply_global_transform(world, export_settings.get_global_transform()); - } - } - - invert_m4_m4(mat, world); - UnitConverter::mat4_to_dae(inv_bind_mat, mat); - if (this->export_settings.get_limit_precision()) { - BCMatrix::sanitize(inv_bind_mat, LIMITTED_PRECISION); - } - source.appendValues(inv_bind_mat); - } - } - - /* back from rest position */ - if (!(flag & ARM_RESTPOS)) { - Depsgraph *depsgraph = blender_context.get_depsgraph(); - Scene *scene = blender_context.get_scene(); - arm->flag = flag; - BKE_pose_where_is(depsgraph, scene, ob_arm); - } - - source.finish(); - - return source_id; -} - -Bone *ControllerExporter::get_bone_from_defgroup(Object *ob_arm, const bDeformGroup *def) -{ - bPoseChannel *pchan = BKE_pose_channel_find_name(ob_arm->pose, def->name); - return pchan ? pchan->bone : nullptr; -} - -bool ControllerExporter::is_bone_defgroup(Object *ob_arm, const bDeformGroup *def) -{ - return get_bone_from_defgroup(ob_arm, def) != nullptr; -} - -std::string ControllerExporter::add_weights_source(Mesh *mesh, - const std::string &controller_id, - const std::list &weights) -{ - std::string source_id = controller_id + WEIGHTS_SOURCE_ID_SUFFIX; - - COLLADASW::FloatSourceF source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(weights.size()); - source.setAccessorStride(1); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.emplace_back("WEIGHT"); - - source.prepareToAppendValues(); - - for (float weight : weights) { - source.appendValues(weight); - } - - source.finish(); - - return source_id; -} - -void ControllerExporter::add_vertex_weights_element(const std::string &weights_source_id, - const std::string &joints_source_id, - const std::list &vcounts, - const std::list &joints) -{ - COLLADASW::VertexWeightsElement weightselem(mSW); - COLLADASW::InputList &input = weightselem.getInputList(); - - int offset = 0; - input.push_back(COLLADASW::Input( - COLLADASW::InputSemantic::JOINT, /* constant declared in COLLADASWInputList.h */ - COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, joints_source_id), - offset++)); - input.push_back( - COLLADASW::Input(COLLADASW::InputSemantic::WEIGHT, - COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, weights_source_id), - offset++)); - - weightselem.setCount(vcounts.size()); - - /* write number of deformers per vertex */ - COLLADASW::PrimitivesBase::VCountList vcountlist; - - vcountlist.resize(vcounts.size()); - std::copy(vcounts.begin(), vcounts.end(), vcountlist.begin()); - - weightselem.prepareToAppendVCountValues(); - weightselem.appendVertexCount(vcountlist); - - weightselem.CloseVCountAndOpenVElement(); - - /* write deformer index - weight index pairs */ - int weight_index = 0; - for (int joint_index : joints) { - weightselem.appendValues(joint_index, weight_index++); - } - - weightselem.finish(); -} diff --git a/source/blender/io/collada/ControllerExporter.h b/source/blender/io/collada/ControllerExporter.h deleted file mode 100644 index 34252cb726d..00000000000 --- a/source/blender/io/collada/ControllerExporter.h +++ /dev/null @@ -1,117 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include -#include -// #include - -#include "COLLADASWInstanceController.h" -#include "COLLADASWLibraryControllers.h" -#include "COLLADASWStreamWriter.h" - -#include "DNA_armature_types.h" -#include "DNA_key_types.h" -#include "DNA_listBase.h" -#include "DNA_mesh_types.h" -#include "DNA_object_types.h" - -#include "InstanceWriter.h" -#include "TransformWriter.h" - -#include "ExportSettings.h" - -class SceneExporter; - -class ControllerExporter : public COLLADASW::LibraryControllers, - protected TransformWriter, - protected InstanceWriter { - private: - BlenderContext &blender_context; - BCExportSettings export_settings; - - public: - /* XXX exporter writes wrong data for shared armatures. A separate - * controller should be written for each armature-mesh binding how do - * we make controller ids then? */ - ControllerExporter(BlenderContext &blender_context, - COLLADASW::StreamWriter *sw, - BCExportSettings &export_settings) - : COLLADASW::LibraryControllers(sw), - blender_context(blender_context), - export_settings(export_settings) - { - } - - bool is_skinned_mesh(Object *ob); - - bool add_instance_controller(Object *ob); - - void export_controllers(); - - void operator()(Object *ob); - - private: -#if 0 - std::vector written_armatures; - - bool already_written(Object *ob_arm); - - void wrote(Object *ob_arm); - - void find_objects_using_armature(Object *ob_arm, std::vector &objects, Scene *sce); -#endif - - std::string get_controller_id(Object *ob_arm, Object *ob); - - std::string get_controller_id(Key *key, Object *ob); - - /** `ob` should be of type OB_MESH, both arguments are required. */ - void export_skin_controller(Object *ob, Object *ob_arm); - - void export_morph_controller(Object *ob, Key *key); - - void add_joints_element(const ListBase *defbase, - const std::string &joints_source_id, - const std::string &inv_bind_mat_source_id); - - void add_bind_shape_mat(Object *ob); - - std::string add_morph_targets(Key *key, Object *ob); - - std::string add_morph_weights(Key *key, Object *ob); - - /** - * Added to implement support for animations. - */ - void add_weight_extras(Key *key); - - std::string add_joints_source(Object *ob_arm, - const ListBase *defbase, - const std::string &controller_id); - - std::string add_inv_bind_mats_source(Object *ob_arm, - const ListBase *defbase, - const std::string &controller_id); - - Bone *get_bone_from_defgroup(Object *ob_arm, const bDeformGroup *def); - - bool is_bone_defgroup(Object *ob_arm, const bDeformGroup *def); - - std::string add_weights_source(Mesh *mesh, - const std::string &controller_id, - const std::list &weights); - - void add_vertex_weights_element(const std::string &weights_source_id, - const std::string &joints_source_id, - const std::list &vcount, - const std::list &joints); - - void write_bone_URLs(COLLADASW::InstanceController &ins, Object *ob_arm, Bone *bone); -}; diff --git a/source/blender/io/collada/DocumentExporter.cpp b/source/blender/io/collada/DocumentExporter.cpp deleted file mode 100644 index e0c6a39f7df..00000000000 --- a/source/blender/io/collada/DocumentExporter.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/* SPDX-FileCopyrightText: 2009-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include -#include - -#include "COLLADASWAsset.h" -#include "COLLADASWCamera.h" -#include "COLLADASWException.h" -#include "COLLADASWScene.h" - -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "BLI_fileops.h" -#include "BLI_path_utils.hh" -#include "BLI_string.h" - -#include "BKE_animsys.h" -#include "BKE_appdir.hh" -#include "BKE_blender_version.h" -#include "BKE_customdata.hh" -#include "BKE_fcurve.hh" - -#include "ED_keyframing.hh" -#ifdef WITH_BUILDINFO -extern "C" char build_commit_date[]; -extern "C" char build_commit_time[]; -extern "C" char build_hash[]; -#endif - -#include "RNA_access.hh" - -#include "DocumentExporter.h" -#include "collada_internal.h" -#include "collada_utils.h" - -/* can probably go after refactor is complete */ - -#include "AnimationExporter.h" -#include "ArmatureExporter.h" -#include "CameraExporter.h" -#include "ControllerExporter.h" -#include "EffectExporter.h" -#include "GeometryExporter.h" -#include "ImageExporter.h" -#include "LightExporter.h" -#include "MaterialExporter.h" -#include "SceneExporter.h" - -#include - -const char *bc_CustomData_get_layer_name(const CustomData *data, const eCustomDataType type, int n) -{ - int layer_index = CustomData_get_layer_index(data, type); - if (layer_index < 0) { - return nullptr; - } - - return data->layers[layer_index + n].name; -} - -const char *bc_CustomData_get_active_layer_name(const CustomData *data, const eCustomDataType type) -{ - /* get the layer index of the active layer of type */ - int layer_index = CustomData_get_active_layer_index(data, type); - if (layer_index < 0) { - return nullptr; - } - - return data->layers[layer_index].name; -} - -DocumentExporter::DocumentExporter(BlenderContext &blender_context, - ExportSettings *export_settings) - : blender_context(blender_context), - export_settings(BCExportSettings(export_settings, blender_context)) -{ -} - -static COLLADABU::NativeString make_temp_filepath(const char *name, const char *extension) -{ - char tempfile[FILE_MAX]; - - if (name == nullptr) { - name = "untitled"; - } - - BLI_path_join(tempfile, sizeof(tempfile), BKE_tempdir_session(), name); - - if (extension) { - BLI_path_extension_ensure(tempfile, FILE_MAX, extension); - } - - COLLADABU::NativeString native_filename = COLLADABU::NativeString( - tempfile, COLLADABU::NativeString::ENCODING_UTF8); - return native_filename; -} - -/* TODO: it would be better to instantiate animations rather than create a new one per object - * COLLADA allows this through multiple s in . - * For this to work, we need to know objects that use a certain action. */ - -int DocumentExporter::exportCurrentScene() -{ - Scene *sce = blender_context.get_scene(); - bContext *C = blender_context.get_context(); - - PointerRNA unit_settings; - PropertyRNA *system; /* unused, *scale; */ - - clear_global_id_map(); - - COLLADABU::NativeString native_filename = make_temp_filepath(nullptr, ".dae"); - COLLADASW::StreamWriter *writer; - try { - writer = new COLLADASW::StreamWriter(native_filename); - } - catch (COLLADASW::StreamWriterException &e) { - e.printMessage(); - fprintf(stderr, "Collada: No Objects will be exported.\n"); - return 1; - } - - /* open */ - writer->startDocument(); - - /* */ - COLLADASW::Asset asset(writer); - - PointerRNA sceneptr = RNA_id_pointer_create(&sce->id); - unit_settings = RNA_pointer_get(&sceneptr, "unit_settings"); - system = RNA_struct_find_property(&unit_settings, "system"); - // scale = RNA_struct_find_property(&unit_settings, "scale_length"); - - std::string unitname = "meter"; - float linearmeasure = RNA_float_get(&unit_settings, "scale_length"); - - switch (RNA_property_enum_get(&unit_settings, system)) { - case USER_UNIT_NONE: - case USER_UNIT_METRIC: - if (linearmeasure == 0.001f) { - unitname = "millimeter"; - } - else if (linearmeasure == 0.01f) { - unitname = "centimeter"; - } - else if (linearmeasure == 0.1f) { - unitname = "decimeter"; - } - else if (linearmeasure == 1.0f) { - unitname = "meter"; - } - else if (linearmeasure == 1000.0f) { - unitname = "kilometer"; - } - break; - case USER_UNIT_IMPERIAL: - if (linearmeasure == 0.0254f) { - unitname = "inch"; - } - else if (linearmeasure == 0.3048f) { - unitname = "foot"; - } - else if (linearmeasure == 0.9144f) { - unitname = "yard"; - } - break; - default: - break; - } - - asset.setUnit(unitname, linearmeasure); - asset.setUpAxisType(COLLADASW::Asset::Z_UP); - asset.getContributor().mAuthor = "Blender User"; - char version_buf[128]; -#ifdef WITH_BUILDINFO - SNPRINTF(version_buf, - "Blender %s commit date:%s, commit time:%s, hash:%s", - BKE_blender_version_string(), - build_commit_date, - build_commit_time, - build_hash); -#else - SNPRINTF(version_buf, "Blender %s", BKE_blender_version_string()); -#endif - asset.getContributor().mAuthoringTool = version_buf; - asset.add(); - - LinkNode *export_set = this->export_settings.get_export_set(); - /* */ - if (bc_has_object_type(export_set, OB_CAMERA)) { - CamerasExporter ce(writer, this->export_settings); - ce.exportCameras(sce); - } - - /* */ - if (bc_has_object_type(export_set, OB_LAMP)) { - LightsExporter le(writer, this->export_settings); - le.exportLights(sce); - } - - /* */ - EffectsExporter ee(writer, this->export_settings, key_image_map); - ee.exportEffects(C, sce); - - /* */ - ImagesExporter ie(writer, this->export_settings, key_image_map); - ie.exportImages(sce); - - /* */ - MaterialsExporter me(writer, this->export_settings); - me.exportMaterials(sce); - - /* */ - if (bc_has_object_type(export_set, OB_MESH)) { - GeometryExporter ge(blender_context, writer, this->export_settings); - ge.exportGeom(); - } - - /* */ - ArmatureExporter arm_exporter(blender_context, writer, this->export_settings); - ControllerExporter controller_exporter(blender_context, writer, this->export_settings); - if (bc_has_object_type(export_set, OB_ARMATURE) || this->export_settings.get_include_shapekeys()) - { - controller_exporter.export_controllers(); - } - - /* */ - - SceneExporter se(blender_context, writer, &arm_exporter, this->export_settings); - - if (this->export_settings.get_include_animations()) { - /* */ - AnimationExporter ae(writer, this->export_settings); - ae.exportAnimations(); - } - - se.exportScene(); - - /* */ - std::string scene_name(translate_id(id_name(sce))); - COLLADASW::Scene scene(writer, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, scene_name)); - scene.add(); - - /* close */ - writer->endDocument(); - delete writer; - - /* Finally move the created document into place */ - fprintf(stdout, "Collada export to: %s\n", this->export_settings.get_filepath()); - int status = BLI_rename_overwrite(native_filename.c_str(), this->export_settings.get_filepath()); - if (status != 0) { - status = BLI_copy(native_filename.c_str(), this->export_settings.get_filepath()); - BLI_delete(native_filename.c_str(), false, false); - } - return status; -} - -/* - * NOTES: - * - * AnimationExporter::sample_animation enables all curves on armature, this is undesirable for a - * user - */ diff --git a/source/blender/io/collada/DocumentExporter.h b/source/blender/io/collada/DocumentExporter.h deleted file mode 100644 index 440be4135f0..00000000000 --- a/source/blender/io/collada/DocumentExporter.h +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "BlenderContext.h" -#include "collada_utils.h" - -class DocumentExporter { - public: - DocumentExporter(BlenderContext &blender_context, ExportSettings *export_settings); - int exportCurrentScene(); - - private: - BlenderContext &blender_context; - BCExportSettings export_settings; - KeyImageMap key_image_map; -}; diff --git a/source/blender/io/collada/DocumentImporter.cpp b/source/blender/io/collada/DocumentImporter.cpp deleted file mode 100644 index ad9290bf22f..00000000000 --- a/source/blender/io/collada/DocumentImporter.cpp +++ /dev/null @@ -1,1139 +0,0 @@ -/* SPDX-FileCopyrightText: 2009-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -/* TODO: - * * name imported objects - * * import object rotation as euler */ - -#include -#include - -#include "COLLADAFWArrayPrimitiveType.h" -#include "COLLADAFWCamera.h" -#include "COLLADAFWLibraryNodes.h" -#include "COLLADAFWLight.h" -#include "COLLADAFWRoot.h" -#include "COLLADAFWVisualScene.h" - -#include "COLLADASaxFWLLoader.h" - -#include "BLI_fileops.h" -#include "BLI_math_matrix.h" - -#include "BKE_camera.h" -#include "BKE_collection.hh" -#include "BKE_constraint.h" -#include "BKE_fcurve.hh" -#include "BKE_global.hh" -#include "BKE_image.hh" -#include "BKE_layer.hh" -#include "BKE_lib_id.hh" -#include "BKE_light.h" -#include "BKE_material.hh" -#include "BKE_scene.hh" - -#include "BLI_path_utils.hh" - -#include "DNA_camera_types.h" -#include "DNA_light_types.h" - -#include "RNA_access.hh" - -#include "WM_api.hh" -#include "WM_types.hh" - -#include "DEG_depsgraph.hh" -#include "DEG_depsgraph_build.hh" - -#include "DocumentImporter.h" -#include "ErrorHandler.h" -#include "ExtraHandler.h" - -#include "Materials.h" -#include "collada_internal.h" -#include "collada_utils.h" - -/* - * COLLADA Importer limitations: - * - no multiple scene import, all objects are added to active scene - */ - -DocumentImporter::DocumentImporter(bContext *C, const ImportSettings *import_settings) - : import_settings(import_settings), - mImportStage(Fetching_Scene_data), - mContext(C), - view_layer(CTX_data_view_layer(mContext)), - armature_importer(&unit_converter, - &mesh_importer, - CTX_data_main(C), - CTX_data_scene(C), - view_layer, - import_settings), - mesh_importer(&unit_converter, - import_settings->custom_normals, - &armature_importer, - CTX_data_main(C), - CTX_data_scene(C), - view_layer), - anim_importer(C, &unit_converter, &armature_importer, CTX_data_scene(C)) -{ -} - -DocumentImporter::~DocumentImporter() -{ - TagsMap::iterator etit; - etit = uid_tags_map.begin(); - while (etit != uid_tags_map.end()) { - delete etit->second; - etit++; - } -} - -bool DocumentImporter::import() -{ - ErrorHandler errorHandler; - COLLADASaxFWL::Loader loader(&errorHandler); - COLLADAFW::Root root(&loader, this); - ExtraHandler *ehandler = new ExtraHandler(this, &(this->anim_importer)); - - loader.registerExtraDataCallbackHandler(ehandler); - - /* deselect all to select new objects */ - BKE_view_layer_base_deselect_all(CTX_data_scene(mContext), view_layer); - - std::string mFilename = std::string(this->import_settings->filepath); - const std::string encodedFilename = bc_url_encode(mFilename); - if (!root.loadDocument(encodedFilename)) { - fprintf(stderr, "COLLADAFW::Root::loadDocument() returned false on 1st pass\n"); - delete ehandler; - return false; - } - - if (errorHandler.hasError()) { - delete ehandler; - return false; - } - - /** TODO: set up scene graph and such here. */ - mImportStage = Fetching_Controller_data; - COLLADASaxFWL::Loader loader2; - COLLADAFW::Root root2(&loader2, this); - - if (!root2.loadDocument(encodedFilename)) { - fprintf(stderr, "COLLADAFW::Root::loadDocument() returned false on 2nd pass\n"); - delete ehandler; - return false; - } - - delete ehandler; - - return true; -} - -void DocumentImporter::cancel(const COLLADAFW::String &errorMessage) -{ - /* TODO: if possible show error info - * - * Should we get rid of invisible Meshes that were created so far - * or maybe create objects at coordinate space origin? - * - * The latter sounds better. */ -} - -void DocumentImporter::start() {} - -void DocumentImporter::finish() -{ - if (mImportStage == Fetching_Controller_data) { - return; - } - - Main *bmain = CTX_data_main(mContext); - /* TODO: create a new scene except the selected - - * use current blender scene for it */ - Scene *sce = CTX_data_scene(mContext); - unit_converter.calculate_scale(*sce); - - std::vector *objects_to_scale = new std::vector(); - - /** TODO: Break up and put into 2-pass parsing of DAE. */ - std::vector::iterator sit; - for (sit = vscenes.begin(); sit != vscenes.end(); sit++) { - PointerRNA unit_settings; - PropertyRNA *system, *scale; - - /* for scene unit settings: system, scale_length */ - - PointerRNA sceneptr = RNA_id_pointer_create(&sce->id); - unit_settings = RNA_pointer_get(&sceneptr, "unit_settings"); - system = RNA_struct_find_property(&unit_settings, "system"); - scale = RNA_struct_find_property(&unit_settings, "scale_length"); - - if (this->import_settings->import_units) { - - switch (unit_converter.isMetricSystem()) { - case UnitConverter::Metric: - RNA_property_enum_set(&unit_settings, system, USER_UNIT_METRIC); - break; - case UnitConverter::Imperial: - RNA_property_enum_set(&unit_settings, system, USER_UNIT_IMPERIAL); - break; - default: - RNA_property_enum_set(&unit_settings, system, USER_UNIT_NONE); - break; - } - float unit_factor = unit_converter.getLinearMeter(); - RNA_property_float_set(&unit_settings, scale, unit_factor); - fprintf(stdout, "Collada: Adjusting Blender units to Importset units: %f.\n", unit_factor); - } - - /* Write nodes to scene */ - fprintf(stderr, "+-- Import Scene --------\n"); - const COLLADAFW::NodePointerArray &roots = (*sit)->getRootNodes(); - for (uint i = 0; i < roots.getCount(); i++) { - std::vector *objects_done = write_node(roots[i], nullptr, sce, nullptr, false); - objects_to_scale->insert( - objects_to_scale->end(), objects_done->begin(), objects_done->end()); - delete objects_done; - } - } - - mesh_importer.optimize_material_assignements(); - - armature_importer.set_tags_map(this->uid_tags_map); - armature_importer.make_armatures(mContext, *objects_to_scale); - armature_importer.make_shape_keys(mContext); - -#if 0 - armature_importer.fix_animation(); -#endif - - for (const COLLADAFW::VisualScene *vscene : vscenes) { - const COLLADAFW::NodePointerArray &roots = vscene->getRootNodes(); - - for (uint i = 0; i < roots.getCount(); i++) { - translate_anim_recursive(roots[i], nullptr, nullptr); - } - } - - if (!libnode_ob.empty()) { - - fprintf(stderr, "| Cleanup: free %d library nodes\n", int(libnode_ob.size())); - /* free all library_nodes */ - std::vector::iterator it; - for (it = libnode_ob.begin(); it != libnode_ob.end(); it++) { - Object *ob = *it; - BKE_scene_collections_object_remove(bmain, sce, ob, true); - } - libnode_ob.clear(); - } - - bc_match_scale(objects_to_scale, unit_converter, !this->import_settings->import_units); - - delete objects_to_scale; - - /* update scene */ - DEG_id_tag_update(&sce->id, ID_RECALC_SYNC_TO_EVAL); - DEG_relations_tag_update(bmain); - WM_event_add_notifier(mContext, NC_OBJECT | ND_TRANSFORM, nullptr); -} - -void DocumentImporter::translate_anim_recursive(COLLADAFW::Node *node, - COLLADAFW::Node *par = nullptr, - Object *parob = nullptr) -{ - /* The split in #29246, root_map must point at actual root when - * calculating bones in apply_curves_as_matrix. - actual root is the root node. - * This has to do with inverse bind poses being world space - * (the sources for skinned bones' rest-poses) and the way - * non-skinning nodes have their "rest-pose" recursively calculated. - * XXX TODO: design issue, how to support unrelated joints taking - * part in skinning. */ - if (par) { // && par->getType() == COLLADAFW::Node::JOINT) { - /* If par is root if there's no corresponding key in root_map. */ - if (root_map.find(par->getUniqueId()) == root_map.end()) { - root_map[node->getUniqueId()] = node; - } - else { - root_map[node->getUniqueId()] = root_map[par->getUniqueId()]; - } - } - -#if 0 - COLLADAFW::Transformation::TransformationType types[] = { - COLLADAFW::Transformation::ROTATE, - COLLADAFW::Transformation::SCALE, - COLLADAFW::Transformation::TRANSLATE, - COLLADAFW::Transformation::MATRIX, - }; - - Object *ob; -#endif - uint i; - - if (node->getType() == COLLADAFW::Node::JOINT && par == nullptr) { - /* For Skeletons without root node we have to simulate the - * root node here and recursively enter the same function - * XXX: maybe this can be made more elegant. */ - translate_anim_recursive(node, node, parob); - } - else { - anim_importer.translate_Animations( - node, root_map, object_map, FW_object_map, uid_material_map); - COLLADAFW::NodePointerArray &children = node->getChildNodes(); - for (i = 0; i < children.getCount(); i++) { - translate_anim_recursive(children[i], node, nullptr); - } - } -} - -std::string DocumentImporter::get_import_version(const COLLADAFW::FileInfo *asset) -{ - const char AUTORING_TOOL[] = "authoring_tool"; - const std::string BLENDER("Blender "); - const COLLADAFW::FileInfo::ValuePairPointerArray &valuePairs = asset->getValuePairArray(); - for (size_t i = 0, count = valuePairs.getCount(); i < count; i++) { - const COLLADAFW::FileInfo::ValuePair *valuePair = valuePairs[i]; - const COLLADAFW::String &key = valuePair->first; - const COLLADAFW::String &value = valuePair->second; - if (key == AUTORING_TOOL) { - if (value.compare(0, BLENDER.length(), BLENDER) == 0) { - /* Was made with Blender, now get version string */ - std::string v = value.substr(BLENDER.length()); - std::string::size_type n = v.find(" "); - if (n > 0) { - return v.substr(0, n); - } - } - } - } - return ""; -} - -bool DocumentImporter::writeGlobalAsset(const COLLADAFW::FileInfo *asset) -{ - unit_converter.read_asset(asset); - import_from_version = get_import_version(asset); - anim_importer.set_import_from_version(import_from_version); - return true; -} - -bool DocumentImporter::writeScene(const COLLADAFW::Scene *scene) -{ - /* XXX could store the scene id, but do nothing for now */ - return true; -} -Object *DocumentImporter::create_camera_object(COLLADAFW::InstanceCamera *camera, Scene *sce) -{ - const COLLADAFW::UniqueId &cam_uid = camera->getInstanciatedObjectId(); - if (uid_camera_map.find(cam_uid) == uid_camera_map.end()) { - // fprintf(stderr, "Couldn't find camera by UID.\n"); - return nullptr; - } - - Main *bmain = CTX_data_main(mContext); - Object *ob = bc_add_object(bmain, sce, view_layer, OB_CAMERA, nullptr); - Camera *cam = uid_camera_map[cam_uid]; - Camera *old_cam = (Camera *)ob->data; - ob->data = cam; - BKE_id_free_us(bmain, old_cam); - return ob; -} - -Object *DocumentImporter::create_light_object(COLLADAFW::InstanceLight *lamp, Scene *sce) -{ - const COLLADAFW::UniqueId &lamp_uid = lamp->getInstanciatedObjectId(); - if (uid_light_map.find(lamp_uid) == uid_light_map.end()) { - fprintf(stderr, "Couldn't find light by UID.\n"); - return nullptr; - } - - Main *bmain = CTX_data_main(mContext); - Object *ob = bc_add_object(bmain, sce, view_layer, OB_LAMP, nullptr); - Light *la = uid_light_map[lamp_uid]; - Light *old_light = (Light *)ob->data; - ob->data = la; - BKE_id_free_us(bmain, old_light); - return ob; -} - -Object *DocumentImporter::create_instance_node(Object *source_ob, - COLLADAFW::Node *source_node, - COLLADAFW::Node *instance_node, - Scene *sce, - bool is_library_node) -{ - // fprintf(stderr, "create under node id=%s from node id=%s\n", instance_node ? - // instance_node->getOriginalId().c_str() : nullptr, source_node ? - // source_node->getOriginalId().c_str() : nullptr); - - Main *bmain = CTX_data_main(mContext); - Object *obn = (Object *)BKE_id_copy(bmain, &source_ob->id); - id_us_min(&obn->id); - DEG_id_tag_update(&obn->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION); - BKE_collection_object_add_from(bmain, sce, source_ob, obn); - - if (instance_node) { - anim_importer.read_node_transform(instance_node, obn); - /* if we also have a source_node (always ;), take its - * transformation matrix and apply it to the newly instantiated - * object to account for node hierarchy transforms in `.dae`. */ - if (source_node) { - COLLADABU::Math::Matrix4 mat4 = source_node->getTransformationMatrix(); - COLLADABU::Math::Matrix4 bmat4 = - mat4.transpose(); /* transpose to get blender row-major order */ - float mat[4][4]; - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - mat[i][j] = bmat4[i][j]; - } - } - /* calc new matrix and apply */ - mul_m4_m4m4(obn->runtime->object_to_world.ptr(), obn->object_to_world().ptr(), mat); - BKE_object_apply_mat4(obn, obn->object_to_world().ptr(), false, false); - } - } - else { - anim_importer.read_node_transform(source_node, obn); - } - - /*DAG_relations_tag_update(CTX_data_main(mContext));*/ - - COLLADAFW::NodePointerArray &children = source_node->getChildNodes(); - if (children.getCount()) { - for (uint i = 0; i < children.getCount(); i++) { - COLLADAFW::Node *child_node = children[i]; - const COLLADAFW::UniqueId &child_id = child_node->getUniqueId(); - if (object_map.find(child_id) == object_map.end()) { - continue; - } - COLLADAFW::InstanceNodePointerArray &inodes = child_node->getInstanceNodes(); - Object *new_child = nullptr; - if (inodes.getCount()) { /* \todo loop through instance nodes */ - const COLLADAFW::UniqueId &id = inodes[0]->getInstanciatedObjectId(); - fprintf(stderr, "Doing %d child nodes\n", int(node_map.count(id))); - new_child = create_instance_node( - object_map.find(id)->second, node_map[id], child_node, sce, is_library_node); - } - else { - new_child = create_instance_node( - object_map.find(child_id)->second, child_node, nullptr, sce, is_library_node); - } - bc_set_parent(new_child, obn, mContext, true); - - if (is_library_node) { - libnode_ob.push_back(new_child); - } - } - } - - return obn; -} - -void DocumentImporter::create_constraints(ExtraTags *et, Object *ob) -{ - if (et && et->isProfile("blender")) { - short type = 0; - et->setData("type", &type); - BKE_constraint_add_for_object(ob, "Test_con", type); - } -} - -void DocumentImporter::report_unknown_reference(const COLLADAFW::Node &node, - const std::string object_type) -{ - std::string id = node.getOriginalId(); - std::string name = node.getName(); - fprintf(stderr, - "error: node id=\"%s\", name=\"%s\" refers to an undefined %s.\n", - id.c_str(), - name.c_str(), - object_type.c_str()); -} - -std::vector *DocumentImporter::write_node(COLLADAFW::Node *node, - COLLADAFW::Node *parent_node, - Scene *sce, - Object *par, - bool is_library_node) -{ - Main *bmain = CTX_data_main(mContext); - Object *ob = nullptr; - bool is_joint = node->getType() == COLLADAFW::Node::JOINT; - bool read_transform = true; - std::string id = node->getOriginalId(); - std::string name = node->getName(); - - /* if node has child nodes write them */ - COLLADAFW::NodePointerArray &child_nodes = node->getChildNodes(); - - std::vector *objects_done = new std::vector(); - std::vector *root_objects = new std::vector(); - - fprintf( - stderr, "| %s id='%s', name='%s'\n", is_joint ? "JOINT" : "NODE ", id.c_str(), name.c_str()); - - if (is_joint) { - if (parent_node == nullptr && !is_library_node) { - /* A Joint on root level is a skeleton without root node. - * Here we add the armature "on the fly": */ - par = bc_add_object(bmain, sce, view_layer, OB_ARMATURE, std::string("Armature").c_str()); - objects_done->push_back(par); - root_objects->push_back(par); - object_map.insert(std::pair(node->getUniqueId(), par)); - node_map[node->getUniqueId()] = node; - } - if (parent_node == nullptr || parent_node->getType() != COLLADAFW::Node::JOINT) { - armature_importer.add_root_joint(node, par); - } - - if (parent_node == nullptr) { - /* for skeletons without root node all has been done above. - * Skeletons with root node are handled further down. */ - goto finally; - } - } - else { - COLLADAFW::InstanceGeometryPointerArray &geom = node->getInstanceGeometries(); - COLLADAFW::InstanceCameraPointerArray &camera = node->getInstanceCameras(); - COLLADAFW::InstanceLightPointerArray &lamp = node->getInstanceLights(); - COLLADAFW::InstanceControllerPointerArray &controller = node->getInstanceControllers(); - COLLADAFW::InstanceNodePointerArray &inst_node = node->getInstanceNodes(); - size_t geom_done = 0; - size_t camera_done = 0; - size_t lamp_done = 0; - size_t controller_done = 0; - size_t inst_done = 0; - - /* XXX linking object with the first , though a node may have more of - * them... maybe join multiple meshes into 1, and link object with it? not - * sure... */ - while (geom_done < geom.getCount()) { - ob = mesh_importer.create_mesh_object(node, geom[geom_done], false, uid_material_map); - if (ob == nullptr) { - report_unknown_reference(*node, "instance_mesh"); - } - else { - objects_done->push_back(ob); - if (parent_node == nullptr) { - root_objects->push_back(ob); - } - } - geom_done++; - } - while (camera_done < camera.getCount()) { - ob = create_camera_object(camera[camera_done], sce); - if (ob == nullptr) { - report_unknown_reference(*node, "instance_camera"); - } - else { - objects_done->push_back(ob); - if (parent_node == nullptr) { - root_objects->push_back(ob); - } - } - camera_done++; - } - while (lamp_done < lamp.getCount()) { - ob = create_light_object(lamp[lamp_done], sce); - if (ob == nullptr) { - report_unknown_reference(*node, "instance_light"); - } - else { - objects_done->push_back(ob); - if (parent_node == nullptr) { - root_objects->push_back(ob); - } - } - lamp_done++; - } - while (controller_done < controller.getCount()) { - COLLADAFW::InstanceGeometry *geometry = (COLLADAFW::InstanceGeometry *) - controller[controller_done]; - ob = mesh_importer.create_mesh_object(node, geometry, true, uid_material_map); - if (ob == nullptr) { - report_unknown_reference(*node, "instance_controller"); - } - else { - objects_done->push_back(ob); - if (parent_node == nullptr) { - root_objects->push_back(ob); - } - } - controller_done++; - } - /* XXX instance_node is not supported yet */ - while (inst_done < inst_node.getCount()) { - const COLLADAFW::UniqueId &node_id = inst_node[inst_done]->getInstanciatedObjectId(); - if (object_map.find(node_id) == object_map.end()) { - fprintf(stderr, - "Cannot find object for node referenced by .\n", - inst_node[inst_done]->getName().c_str()); - ob = nullptr; - } - else { - std::pair::iterator, - std::multimap::iterator> - pair_iter = object_map.equal_range(node_id); - for (std::multimap::iterator it2 = pair_iter.first; - it2 != pair_iter.second; - it2++) - { - Object *source_ob = (Object *)it2->second; - COLLADAFW::Node *source_node = node_map[node_id]; - ob = create_instance_node(source_ob, source_node, node, sce, is_library_node); - objects_done->push_back(ob); - if (parent_node == nullptr) { - root_objects->push_back(ob); - } - } - } - inst_done++; - - read_transform = false; - } - - /* if node is empty - create empty object - * XXX empty node may not mean it is empty object, not sure about this */ - if ((geom_done + camera_done + lamp_done + controller_done + inst_done) < 1) { - /* Check if Object is armature, by checking if immediate child is a JOINT node. */ - if (is_armature(node)) { - ExtraTags *et = getExtraTags(node->getUniqueId()); - ob = bc_add_armature(node, et, bmain, sce, view_layer, OB_ARMATURE, name.c_str()); - } - else { - ob = bc_add_object(bmain, sce, view_layer, OB_EMPTY, nullptr); - } - objects_done->push_back(ob); - if (parent_node == nullptr) { - root_objects->push_back(ob); - } - } - - /* XXX: if there are multiple instances, only one is stored. */ - - if (!ob) { - goto finally; - } - - for (Object *ob : *objects_done) { - std::string nodename = node->getName().empty() ? node->getOriginalId() : node->getName(); - BKE_libblock_rename(*bmain, ob->id, (char *)nodename.c_str()); - object_map.insert(std::pair(node->getUniqueId(), ob)); - node_map[node->getUniqueId()] = node; - - if (is_library_node) { - libnode_ob.push_back(ob); - } - } - - // create_constraints(et, ob); - } - - for (Object *ob : *objects_done) { - if (read_transform) { - anim_importer.read_node_transform(node, ob); /* overwrites location set earlier */ - } - - if (!is_joint) { - if (par && ob) { - ob->parent = par; - ob->partype = PAROBJECT; - ob->parsubstr[0] = 0; - - // bc_set_parent(ob, par, mContext, false); - } - } - } - - if (objects_done->empty()) { - ob = nullptr; - } - else { - ob = *objects_done->begin(); - } - - for (uint i = 0; i < child_nodes.getCount(); i++) { - std::vector *child_objects; - child_objects = write_node(child_nodes[i], node, sce, ob, is_library_node); - delete child_objects; - } - -finally: - delete objects_done; - - return root_objects; -} - -bool DocumentImporter::writeVisualScene(const COLLADAFW::VisualScene *visualScene) -{ - if (mImportStage == Fetching_Controller_data) { - return true; - } - - /* This method called on post process after writeGeometry, writeMaterial, etc. */ - - /* For each in : - * create an Object - * if Mesh (previously created in writeGeometry) to which corresponds exists, - * link Object with that mesh. - * - * Update: since we cannot link a Mesh with Object in - * writeGeometry because does not reference , - * we link Objects with Meshes here. - */ - vscenes.push_back(visualScene); - - return true; -} - -bool DocumentImporter::writeLibraryNodes(const COLLADAFW::LibraryNodes *libraryNodes) -{ - if (mImportStage == Fetching_Controller_data) { - return true; - } - - Scene *sce = CTX_data_scene(mContext); - - const COLLADAFW::NodePointerArray &nodes = libraryNodes->getNodes(); - - fprintf(stderr, "+-- Read Library nodes ----------\n"); - for (uint i = 0; i < nodes.getCount(); i++) { - std::vector *child_objects; - child_objects = write_node(nodes[i], nullptr, sce, nullptr, true); - delete child_objects; - } - return true; -} - -bool DocumentImporter::writeGeometry(const COLLADAFW::Geometry *geom) -{ - if (mImportStage == Fetching_Controller_data) { - return true; - } - - return mesh_importer.write_geometry(geom); -} - -bool DocumentImporter::writeMaterial(const COLLADAFW::Material *cmat) -{ - if (mImportStage == Fetching_Controller_data) { - return true; - } - - Main *bmain = CTX_data_main(mContext); - const std::string &str_mat_id = cmat->getName().empty() ? cmat->getOriginalId() : - cmat->getName(); - Material *ma = BKE_material_add(bmain, (char *)str_mat_id.c_str()); - id_us_min(&ma->id); - - this->uid_effect_map[cmat->getInstantiatedEffect()] = ma; - this->uid_material_map[cmat->getUniqueId()] = ma; - - return true; -} - -void DocumentImporter::write_profile_COMMON(COLLADAFW::EffectCommon *ef, Material *ma) -{ - MaterialNode matNode = MaterialNode(mContext, ef, ma, uid_image_map); - - /* Direct mapping to principled BSDF Shader */ - matNode.set_diffuse(ef->getDiffuse()); - matNode.set_emission(ef->getEmission()); - matNode.set_ior(ef->getIndexOfRefraction()); - matNode.set_alpha(ef->getOpaqueMode(), ef->getTransparent(), ef->getTransparency()); - - /* following mapping still needs to be verified */ -#if 0 - /* needs rework to be done for 2.81 */ - matNode.set_shininess(ef->getShininess()); -#endif - matNode.set_reflectivity(ef->getReflectivity()); - - /* not supported by principled BSDF */ - matNode.set_ambient(ef->getAmbient()); - matNode.set_specular(ef->getSpecular()); - matNode.set_reflective(ef->getReflective()); - - matNode.update_material_nodetree(); -} - -bool DocumentImporter::writeEffect(const COLLADAFW::Effect *effect) -{ - if (mImportStage == Fetching_Controller_data) { - return true; - } - - const COLLADAFW::UniqueId &uid = effect->getUniqueId(); - - if (uid_effect_map.find(uid) == uid_effect_map.end()) { - fprintf(stderr, "Couldn't find a material by UID.\n"); - return true; - } - - Material *ma = uid_effect_map[uid]; - std::map::iterator iter; - for (iter = uid_material_map.begin(); iter != uid_material_map.end(); iter++) { - if (iter->second == ma) { - this->FW_object_map[iter->first] = effect; - break; - } - } - COLLADAFW::CommonEffectPointerArray common_efs = effect->getCommonEffects(); - if (common_efs.getCount() < 1) { - fprintf(stderr, "Couldn't find .\n"); - return true; - } - /* XXX TODO: Take all s - * Currently only first is supported */ - COLLADAFW::EffectCommon *ef = common_efs[0]; - write_profile_COMMON(ef, ma); - this->FW_object_map[effect->getUniqueId()] = effect; - - return true; -} - -bool DocumentImporter::writeCamera(const COLLADAFW::Camera *camera) -{ - if (mImportStage == Fetching_Controller_data) { - return true; - } - - Main *bmain = CTX_data_main(mContext); - Camera *cam = nullptr; - std::string cam_id, cam_name; - - ExtraTags *et = getExtraTags(camera->getUniqueId()); - cam_id = camera->getOriginalId(); - cam_name = camera->getName(); - if (cam_name.empty()) { - cam = (Camera *)BKE_camera_add(bmain, (char *)cam_id.c_str()); - } - else { - cam = (Camera *)BKE_camera_add(bmain, (char *)cam_name.c_str()); - } - - if (!cam) { - fprintf(stderr, "Cannot create camera.\n"); - return true; - } - - if (et && et->isProfile("blender")) { - et->setData("shiftx", &(cam->shiftx)); - et->setData("shifty", &(cam->shifty)); - et->setData("dof_distance", &(cam->dof.focus_distance)); - } - cam->clip_start = camera->getNearClippingPlane().getValue(); - cam->clip_end = camera->getFarClippingPlane().getValue(); - - COLLADAFW::Camera::CameraType type = camera->getCameraType(); - switch (type) { - case COLLADAFW::Camera::ORTHOGRAPHIC: { - cam->type = CAM_ORTHO; - break; - } - case COLLADAFW::Camera::PERSPECTIVE: { - cam->type = CAM_PERSP; - break; - } - case COLLADAFW::Camera::UNDEFINED_CAMERATYPE: { - fprintf(stderr, "Current camera type is not supported.\n"); - cam->type = CAM_PERSP; - break; - } - } - - switch (camera->getDescriptionType()) { - case COLLADAFW::Camera::ASPECTRATIO_AND_Y: { - switch (cam->type) { - case CAM_ORTHO: { - double ymag = 2 * camera->getYMag().getValue(); - double aspect = camera->getAspectRatio().getValue(); - double xmag = aspect * ymag; - cam->ortho_scale = float(xmag); - break; - } - case CAM_PERSP: - default: { - double yfov = camera->getYFov().getValue(); - double aspect = camera->getAspectRatio().getValue(); - - /* NOTE: Needs more testing (As we currently have no official test data for this) */ - - double xfov = 2.0f * atanf(aspect * tanf(DEG2RADF(yfov) * 0.5f)); - cam->lens = fov_to_focallength(xfov, cam->sensor_x); - break; - } - } - break; - } - /* XXX correct way to do following four is probably to get also render - * size and determine proper settings from that somehow */ - case COLLADAFW::Camera::ASPECTRATIO_AND_X: - case COLLADAFW::Camera::SINGLE_X: - case COLLADAFW::Camera::X_AND_Y: { - switch (cam->type) { - case CAM_ORTHO: - cam->ortho_scale = float(camera->getXMag().getValue() * 2.0); - break; - case CAM_PERSP: - default: { - double x = camera->getXFov().getValue(); - /* X is in degrees, cam->lens is in millimeters. */ - cam->lens = fov_to_focallength(DEG2RADF(x), cam->sensor_x); - break; - } - } - break; - } - case COLLADAFW::Camera::SINGLE_Y: { - switch (cam->type) { - case CAM_ORTHO: - cam->ortho_scale = float(camera->getYMag().getValue()); - break; - case CAM_PERSP: - default: { - double yfov = camera->getYFov().getValue(); - /* yfov is in degrees, cam->lens is in millimeters. */ - cam->lens = fov_to_focallength(DEG2RADF(yfov), cam->sensor_x); - break; - } - } - break; - } - case COLLADAFW::Camera::UNDEFINED: - /* read nothing, use blender defaults. */ - break; - } - - this->uid_camera_map[camera->getUniqueId()] = cam; - this->FW_object_map[camera->getUniqueId()] = camera; - /* XXX import camera options */ - return true; -} - -bool DocumentImporter::writeImage(const COLLADAFW::Image *image) -{ - if (mImportStage == Fetching_Controller_data) { - return true; - } - - const std::string &imagepath = image->getImageURI().toNativePath(); - - char dir[FILE_MAX]; - char absolute_path[FILE_MAX]; - const char *workpath; - - BLI_path_split_dir_part(this->import_settings->filepath, dir, sizeof(dir)); - BLI_path_join(absolute_path, sizeof(absolute_path), dir, imagepath.c_str()); - if (BLI_exists(absolute_path)) { - workpath = absolute_path; - } - else { - /* Maybe imagepath was already absolute ? */ - if (!BLI_exists(imagepath.c_str())) { - fprintf(stderr, "|! Image not found: %s\n", imagepath.c_str()); - return true; - } - workpath = imagepath.c_str(); - } - - Image *ima = BKE_image_load_exists(CTX_data_main(mContext), workpath); - if (!ima) { - fprintf(stderr, "|! Cannot create image: %s\n", workpath); - return true; - } - this->uid_image_map[image->getUniqueId()] = ima; - fprintf(stderr, "| import Image: %s\n", workpath); - return true; -} - -bool DocumentImporter::writeLight(const COLLADAFW::Light *light) -{ - if (mImportStage == Fetching_Controller_data) { - return true; - } - - Main *bmain = CTX_data_main(mContext); - Light *lamp = nullptr; - std::string la_id, la_name; - - ExtraTags *et = getExtraTags(light->getUniqueId()); -#if 0 - TagsMap::iterator etit; - ExtraTags *et = 0; - etit = uid_tags_map.find(light->getUniqueId().toAscii()); - if (etit != uid_tags_map.end()) { - et = etit->second; - } -#endif - - la_id = light->getOriginalId(); - la_name = light->getName(); - if (la_name.empty()) { - lamp = (Light *)BKE_light_add(bmain, (char *)la_id.c_str()); - } - else { - lamp = (Light *)BKE_light_add(bmain, (char *)la_name.c_str()); - } - - if (!lamp) { - fprintf(stderr, "Cannot create light.\n"); - return true; - } - - /* if we find an ExtraTags for this, use that instead. */ - if (et && et->isProfile("blender")) { - et->setData("type", &(lamp->type)); - et->setData("flag", &(lamp->flag)); - et->setData("mode", &(lamp->mode)); - et->setData("red", &(lamp->r)); - et->setData("green", &(lamp->g)); - et->setData("blue", &(lamp->b)); - et->setData("energy", &(lamp->energy)); - et->setData("spotsize", &(lamp->spotsize)); - lamp->spotsize = DEG2RADF(lamp->spotsize); - et->setData("spotblend", &(lamp->spotblend)); - et->setData("clipsta", &(lamp->clipsta)); - et->setData("clipend", &(lamp->att_dist)); - et->setData("radius", &(lamp->radius)); - et->setData("area_shape", &(lamp->area_shape)); - et->setData("area_size", &(lamp->area_size)); - et->setData("area_sizey", &(lamp->area_sizey)); - et->setData("area_sizez", &(lamp->area_sizez)); - } - else { - // float d = 25.0f; /* UNUSED. */ - float e = 1.0f; - - if (light->getColor().isValid()) { - COLLADAFW::Color col = light->getColor(); - lamp->r = col.getRed(); - lamp->g = col.getGreen(); - lamp->b = col.getBlue(); - } - - lamp->energy = e; - - switch (light->getLightType()) { - case COLLADAFW::Light::AMBIENT_LIGHT: { - lamp->type = LA_SUN; /* TODO: needs more thoughts. */ - break; - } - case COLLADAFW::Light::SPOT_LIGHT: { - lamp->type = LA_SPOT; - lamp->spotsize = DEG2RADF(light->getFallOffAngle().getValue()); - lamp->spotblend = light->getFallOffExponent().getValue(); - break; - } - case COLLADAFW::Light::DIRECTIONAL_LIGHT: { - /* our sun is very strong, so pick a smaller energy level */ - lamp->type = LA_SUN; - break; - } - case COLLADAFW::Light::POINT_LIGHT: { - lamp->type = LA_LOCAL; - break; - } - case COLLADAFW::Light::UNDEFINED: { - fprintf(stderr, "Current light type is not supported.\n"); - lamp->type = LA_LOCAL; - break; - } - } - } - - this->uid_light_map[light->getUniqueId()] = lamp; - this->FW_object_map[light->getUniqueId()] = light; - return true; -} - -bool DocumentImporter::writeAnimation(const COLLADAFW::Animation *anim) -{ - if (mImportStage == Fetching_Controller_data) { - return true; - } - - return anim_importer.write_animation(anim); -} - -bool DocumentImporter::writeAnimationList(const COLLADAFW::AnimationList *animationList) -{ - if (mImportStage == Fetching_Controller_data) { - return true; - } - - // return true; - return anim_importer.write_animation_list(animationList); -} - -#if WITH_OPENCOLLADA_ANIMATION_CLIP -bool DocumentImporter::writeAnimationClip(const COLLADAFW::AnimationClip *animationClip) -{ - /* Since opencollada 1.6.68: called on post-process stage after writeVisualScenes. */ - - if (mImportStage == Fetching_Controller_data) { - return true; - } - - return true; - /* TODO: implement import of AnimationClips */ - // return animation_clip_importer.write_animation_clip(animationClip); -} -#endif - -bool DocumentImporter::writeSkinControllerData(const COLLADAFW::SkinControllerData *skin) -{ - return armature_importer.write_skin_controller_data(skin); -} - -bool DocumentImporter::writeController(const COLLADAFW::Controller *controller) -{ - if (mImportStage == Fetching_Controller_data) { - return true; - } - - return armature_importer.write_controller(controller); -} - -bool DocumentImporter::writeFormulas(const COLLADAFW::Formulas *formulas) -{ - return true; -} - -bool DocumentImporter::writeKinematicsScene(const COLLADAFW::KinematicsScene *kinematicsScene) -{ - return true; -} - -ExtraTags *DocumentImporter::getExtraTags(const COLLADAFW::UniqueId &uid) -{ - if (uid_tags_map.find(uid.toAscii()) == uid_tags_map.end()) { - return nullptr; - } - return uid_tags_map[uid.toAscii()]; -} - -bool DocumentImporter::addExtraTags(const COLLADAFW::UniqueId &uid, ExtraTags *extra_tags) -{ - uid_tags_map[uid.toAscii()] = extra_tags; - return true; -} - -bool DocumentImporter::is_armature(COLLADAFW::Node *node) -{ - COLLADAFW::NodePointerArray &child_nodes = node->getChildNodes(); - for (uint i = 0; i < child_nodes.getCount(); i++) { - if (child_nodes[i]->getType() == COLLADAFW::Node::JOINT) { - return true; - } - } - - /* no child is JOINT */ - return false; -} diff --git a/source/blender/io/collada/DocumentImporter.h b/source/blender/io/collada/DocumentImporter.h deleted file mode 100644 index f587369baf6..00000000000 --- a/source/blender/io/collada/DocumentImporter.h +++ /dev/null @@ -1,213 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "COLLADAFWController.h" -#include "COLLADAFWEffect.h" -#include "COLLADAFWEffectCommon.h" -#include "COLLADAFWIWriter.h" -#include "COLLADAFWImage.h" -#include "COLLADAFWMaterial.h" - -#include "AnimationImporter.h" -#include "ArmatureImporter.h" -#include "ImportSettings.h" -#include "MeshImporter.h" - -struct bContext; - -/** Importer class. */ -class DocumentImporter : COLLADAFW::IWriter { - public: - /** Enumeration to denote the stage of import */ - enum ImportStage { - Fetching_Scene_data, /* First pass to collect all data except controller */ - Fetching_Controller_data, /* Second pass to collect controller data */ - }; - /** Constructor */ - DocumentImporter(bContext *C, const ImportSettings *import_settings); - - /** Destructor */ - ~DocumentImporter() override; - - /** Function called by blender UI */ - bool import(); - - /** these should not be here */ - Object *create_camera_object(COLLADAFW::InstanceCamera *, Scene *); - Object *create_light_object(COLLADAFW::InstanceLight *, Scene *); - Object *create_instance_node(Object *, COLLADAFW::Node *, COLLADAFW::Node *, Scene *, bool); - /** - * To create constraints off node tags. Assumes only constraint data in - * current with blender profile. - */ - void create_constraints(ExtraTags *et, Object *ob); - std::vector *write_node(COLLADAFW::Node *, COLLADAFW::Node *, Scene *, Object *, bool); - void write_profile_COMMON(COLLADAFW::EffectCommon *, Material *); - - void translate_anim_recursive(COLLADAFW::Node *, COLLADAFW::Node *, Object *); - - /** - * This method will be called if an error in the loading process occurred and the loader cannot - * continue to load. The writer should undo all operations that have been performed. - * \param errorMessage: A message containing information about the error that occurred. - */ - void cancel(const COLLADAFW::String &errorMessage) override; - - /** This is the method called. The writer hast to prepare to receive data. */ - void start() override; - - /** - * This method is called after the last write* method. - * No other methods will be called after this. - */ - void finish() override; - - /** - * When this method is called, the writer must write the global document asset. - * \return The writer should return true, if writing succeeded, false otherwise. - */ - bool writeGlobalAsset(const COLLADAFW::FileInfo * /*asset*/) override; - /** - * If the imported file was made with Blender, return the Blender version used, - * otherwise return an empty std::string - */ - std::string get_import_version(const COLLADAFW::FileInfo *asset); - - /** - * When this method is called, the writer must write the scene. - * \return The writer should return true, if writing succeeded, false otherwise. - */ - bool writeScene(const COLLADAFW::Scene * /*scene*/) override; - - /** - * When this method is called, the writer must write the entire visual scene. - * Return The writer should return true, if writing succeeded, false otherwise. - */ - bool writeVisualScene(const COLLADAFW::VisualScene * /*visualScene*/) override; - - /** - * When this method is called, the writer must handle all nodes contained in the - * library nodes. - * \return The writer should return true, if writing succeeded, false otherwise. - */ - bool writeLibraryNodes(const COLLADAFW::LibraryNodes * /*libraryNodes*/) override; - - /** - * This function is called only for animations that pass COLLADAFW::validate. - */ - bool writeAnimation(const COLLADAFW::Animation * /*animation*/) override; - - /** - * Called on post-process stage after writeVisualScenes. - */ - bool writeAnimationList(const COLLADAFW::AnimationList * /*animationList*/) override; - -#if WITH_OPENCOLLADA_ANIMATION_CLIP - /* Please enable this when building with Collada 1.6.65 or newer (also in DocumentImporter.cpp) - */ - bool writeAnimationClip(const COLLADAFW::AnimationClip *animationClip) override; -#endif - - /** - * When this method is called, the writer must write the geometry. - * \return The writer should return true, if writing succeeded, false otherwise. - */ - bool writeGeometry(const COLLADAFW::Geometry * /*geometry*/) override; - - /** - * When this method is called, the writer must write the material. - * \return The writer should return true, if writing succeeded, false otherwise. - */ - bool writeMaterial(const COLLADAFW::Material * /*material*/) override; - - /** - * When this method is called, the writer must write the effect. - * \return The writer should return true, if writing succeeded, false otherwise. - */ - bool writeEffect(const COLLADAFW::Effect * /*effect*/) override; - - /** - * When this method is called, the writer must write the camera. - * \return The writer should return true, if writing succeeded, false otherwise. - */ - bool writeCamera(const COLLADAFW::Camera * /*camera*/) override; - - /** - * When this method is called, the writer must write the image. - * \return The writer should return true, if writing succeeded, false otherwise. - */ - bool writeImage(const COLLADAFW::Image * /*image*/) override; - - /** - * When this method is called, the writer must write the light. - * \return The writer should return true, if writing succeeded, false otherwise. - */ - bool writeLight(const COLLADAFW::Light * /*light*/) override; - - /** - * When this method is called, the writer must write the skin controller data. - * \return The writer should return true, if writing succeeded, false otherwise. - */ - bool writeSkinControllerData( - const COLLADAFW::SkinControllerData * /*skinControllerData*/) override; - - /** This is called on post-process, before writeVisualScenes. */ - bool writeController(const COLLADAFW::Controller * /*controller*/) override; - - bool writeFormulas(const COLLADAFW::Formulas * /*formulas*/) override; - - bool writeKinematicsScene(const COLLADAFW::KinematicsScene * /*kinematicsScene*/) override; - - /** Add element and data for UniqueId */ - bool addExtraTags(const COLLADAFW::UniqueId &uid, ExtraTags *extra_tags); - /** Get an existing #ExtraTags for uid */ - ExtraTags *getExtraTags(const COLLADAFW::UniqueId &uid); - - bool is_armature(COLLADAFW::Node *node); - - private: - const ImportSettings *import_settings; - - /** Current import stage we're in. */ - ImportStage mImportStage; - - bContext *mContext; - ViewLayer *view_layer; - - UnitConverter unit_converter; - ArmatureImporter armature_importer; - MeshImporter mesh_importer; - AnimationImporter anim_importer; - - /** TagsMap typedef for uid_tags_map. */ - using TagsMap = std::map; - /** Tags map of unique id as a string and ExtraTags instance. */ - TagsMap uid_tags_map; - - UidImageMap uid_image_map; - std::map uid_material_map; - std::map uid_effect_map; - std::map uid_camera_map; - std::map uid_light_map; - std::map material_texture_mapping_map; - std::multimap object_map; - std::map node_map; - std::vector vscenes; - std::vector libnode_ob; - - std::map - root_map; /* find root joint by child joint uid, for bone tree evaluation during resampling - */ - std::map FW_object_map; - - std::string import_from_version; - - void report_unknown_reference(const COLLADAFW::Node &node, const std::string object_type); -}; diff --git a/source/blender/io/collada/EffectExporter.cpp b/source/blender/io/collada/EffectExporter.cpp deleted file mode 100644 index e88be52c4d5..00000000000 --- a/source/blender/io/collada/EffectExporter.cpp +++ /dev/null @@ -1,298 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include - -#include "COLLADASWEffectProfile.h" - -#include "EffectExporter.h" -#include "MaterialExporter.h" -#include "Materials.h" - -#include "collada_internal.h" -#include "collada_utils.h" - -#include "DNA_mesh_types.h" - -#include "BKE_collection.hh" -#include "BKE_customdata.hh" -#include "BKE_material.hh" - -static std::string getActiveUVLayerName(Object *ob) -{ - Mesh *mesh = (Mesh *)ob->data; - - int num_layers = CustomData_number_of_layers(&mesh->corner_data, CD_PROP_FLOAT2); - if (num_layers) { - return std::string(bc_CustomData_get_active_layer_name(&mesh->corner_data, CD_PROP_FLOAT2)); - } - - return ""; -} - -EffectsExporter::EffectsExporter(COLLADASW::StreamWriter *sw, - BCExportSettings &export_settings, - KeyImageMap &key_image_map) - : COLLADASW::LibraryEffects(sw), export_settings(export_settings), key_image_map(key_image_map) -{ -} - -bool EffectsExporter::hasEffects(Scene *sce) -{ - bool result = false; - FOREACH_SCENE_OBJECT_BEGIN (sce, ob) { - int a; - for (a = 0; a < ob->totcol; a++) { - Material *ma = BKE_object_material_get(ob, a + 1); - - /* no material, but check all of the slots */ - if (!ma) { - continue; - } - - result = true; - break; - } - } - FOREACH_SCENE_OBJECT_END; - return result; -} - -void EffectsExporter::exportEffects(bContext *C, Scene *sce) -{ - if (hasEffects(sce)) { - this->mContext = C; - this->scene = sce; - openLibrary(); - MaterialFunctor mf; - mf.forEachMaterialInExportSet( - sce, *this, this->export_settings.get_export_set()); - - closeLibrary(); - } -} - -void EffectsExporter::set_shader_type(COLLADASW::EffectProfile &ep, Material *ma) -{ - /* XXX check if BLINN and PHONG can be supported as well */ - ep.setShaderType(COLLADASW::EffectProfile::LAMBERT); -} - -void EffectsExporter::set_transparency(COLLADASW::EffectProfile &ep, Material *ma) -{ - double alpha = bc_get_alpha(ma); - if (alpha < 1) { - /* workaround use to avoid wrong handling of by other tools */ - COLLADASW::ColorOrTexture cot = bc_get_cot(0, 0, 0, alpha); - ep.setTransparent(cot, false, "alpha"); - ep.setOpaque(COLLADASW::EffectProfile::A_ONE); - } -} - -void EffectsExporter::set_diffuse_color(COLLADASW::EffectProfile &ep, Material *ma) -{ - COLLADASW::ColorOrTexture cot = bc_get_base_color(ma); - ep.setDiffuse(cot, false, "diffuse"); -} - -void EffectsExporter::set_ambient(COLLADASW::EffectProfile &ep, Material *ma) -{ - COLLADASW::ColorOrTexture cot = bc_get_ambient(ma); - ep.setAmbient(cot, false, "ambient"); -} -void EffectsExporter::set_specular(COLLADASW::EffectProfile &ep, Material *ma) -{ - COLLADASW::ColorOrTexture cot = bc_get_specular(ma); - ep.setSpecular(cot, false, "specular"); -} -void EffectsExporter::set_reflective(COLLADASW::EffectProfile &ep, Material *ma) -{ - COLLADASW::ColorOrTexture cot = bc_get_reflective(ma); - ep.setReflective(cot, false, "reflective"); -} - -void EffectsExporter::set_reflectivity(COLLADASW::EffectProfile &ep, Material *ma) -{ - double reflectivity = bc_get_reflectivity(ma); - if (reflectivity > 0.0) { - ep.setReflectivity(reflectivity, false, "specular"); - } -} - -void EffectsExporter::set_emission(COLLADASW::EffectProfile &ep, Material *ma) -{ - COLLADASW::ColorOrTexture cot = bc_get_emission(ma); - ep.setEmission(cot, false, "emission"); -} - -void EffectsExporter::set_ior(COLLADASW::EffectProfile &ep, Material *ma) -{ - double alpha = bc_get_ior(ma); - ep.setIndexOfRefraction(alpha, false, "ior"); -} - -void EffectsExporter::set_shininess(COLLADASW::EffectProfile &ep, Material *ma) -{ - double shininess = bc_get_shininess(ma); - ep.setShininess(shininess, false, "shininess"); -} - -void EffectsExporter::get_images(Material *ma, KeyImageMap &material_image_map) -{ - if (!ma->use_nodes) { - return; - } - - MaterialNode material = MaterialNode(mContext, ma, key_image_map); - Image *image = material.get_diffuse_image(); - if (image == nullptr) { - return; - } - - std::string uid(id_name(image)); - std::string key = translate_id(uid); - - if (material_image_map.find(key) == material_image_map.end()) { - material_image_map[key] = image; - key_image_map[key] = image; - } -} - -void EffectsExporter::create_image_samplers(COLLADASW::EffectProfile &ep, - KeyImageMap &material_image_map, - std::string &active_uv) -{ - KeyImageMap::iterator iter; - - for (iter = material_image_map.begin(); iter != material_image_map.end(); iter++) { - - Image *image = iter->second; - std::string uid(id_name(image)); - std::string key = translate_id(uid); - - COLLADASW::Sampler *sampler = new COLLADASW::Sampler( - COLLADASW::Sampler::SAMPLER_TYPE_2D, - key + COLLADASW::Sampler::SAMPLER_SID_SUFFIX, - key + COLLADASW::Sampler::SURFACE_SID_SUFFIX); - - sampler->setImageId(key); - - ep.setDiffuse(createTexture(image, active_uv, sampler), false, "diffuse"); - } -} - -void EffectsExporter::operator()(Material *ma, Object *ob) -{ - KeyImageMap material_image_map; - - openEffect(get_effect_id(ma)); - - COLLADASW::EffectProfile ep(mSW); - ep.setProfileType(COLLADASW::EffectProfile::COMMON); - ep.openProfile(); - set_shader_type(ep, ma); /* creates a Lambert Shader for now */ - - COLLADASW::ColorOrTexture cot; - - set_diffuse_color(ep, ma); - set_emission(ep, ma); - set_ior(ep, ma); - set_reflectivity(ep, ma); - set_transparency(ep, ma); - - /* TODO: */ -#if 0 - set_shininess(ep, ma); /* Shininess not supported for lambert. */ - set_ambient(ep, ma); - set_specular(ep, ma); -#endif - - get_images(ma, material_image_map); - std::string active_uv(getActiveUVLayerName(ob)); - create_image_samplers(ep, material_image_map, active_uv); - -#if 0 - uint a, b; - for (a = 0, b = 0; a < tex_indices.size(); a++) { - MTex *t = ma->mtex[tex_indices[a]]; - Image *ima = t->tex->ima; - - /* Image not set for texture */ - if (!ima) { - continue; - } - - std::string key(id_name(ima)); - key = translate_id(key); - - /* create only one / pair for each unique image */ - if (im_samp_map.find(key) == im_samp_map.end()) { - /* */ - COLLADASW::Sampler sampler(COLLADASW::Sampler::SAMPLER_TYPE_2D, - key + COLLADASW::Sampler::SAMPLER_SID_SUFFIX, - key + COLLADASW::Sampler::SURFACE_SID_SUFFIX); - sampler.setImageId(key); - /* copy values to arrays since they will live longer */ - samplers[a] = sampler; - - /* store pointers so they can be used later when we create s */ - samp_surf[b] = &samplers[a]; - // samp_surf[b][1] = &surfaces[a]; - - im_samp_map[key] = b; - b++; - } - } - - for (a = 0; a < tex_indices.size(); a++) { - MTex *t = ma->mtex[tex_indices[a]]; - Image *ima = t->tex->ima; - - if (!ima) { - continue; - } - - std::string key(id_name(ima)); - key = translate_id(key); - int i = im_samp_map[key]; - std::string uvname = strlen(t->uvname) ? t->uvname : active_uv; - COLLADASW::Sampler *sampler = (COLLADASW::Sampler *) - samp_surf[i]; /* possibly uninitialized memory ... */ - writeTextures(ep, key, sampler, t, ima, uvname); - } -#endif - - /* performs the actual writing */ - ep.addProfileElements(); - ep.addExtraTechniques(mSW); - - ep.closeProfile(); - closeEffect(); -} - -COLLADASW::ColorOrTexture EffectsExporter::createTexture(Image *ima, - std::string &uv_layer_name, - COLLADASW::Sampler *sampler - /*COLLADASW::Surface *surface*/) -{ - - COLLADASW::Texture texture(translate_id(id_name(ima))); - texture.setTexcoord(uv_layer_name); - // texture.setSurface(*surface); - texture.setSampler(*sampler); - - COLLADASW::ColorOrTexture cot(texture); - return cot; -} - -COLLADASW::ColorOrTexture EffectsExporter::getcol(float r, float g, float b, float a) -{ - COLLADASW::Color color(r, g, b, a); - COLLADASW::ColorOrTexture cot(color); - return cot; -} diff --git a/source/blender/io/collada/EffectExporter.h b/source/blender/io/collada/EffectExporter.h deleted file mode 100644 index 0bb759fe798..00000000000 --- a/source/blender/io/collada/EffectExporter.h +++ /dev/null @@ -1,73 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include - -#include "COLLADASWColorOrTexture.h" -#include "COLLADASWLibraryEffects.h" -#include "COLLADASWSampler.h" -#include "COLLADASWStreamWriter.h" - -#include "DNA_image_types.h" -#include "DNA_material_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "ExportSettings.h" -#include "collada_utils.h" - -class EffectsExporter : COLLADASW::LibraryEffects { - public: - EffectsExporter(COLLADASW::StreamWriter *sw, - BCExportSettings &export_settings, - KeyImageMap &key_image_map); - void exportEffects(bContext *C, Scene *sce); - - void operator()(Material *ma, Object *ob); - - COLLADASW::ColorOrTexture createTexture(Image *ima, - std::string &uv_layer_name, - COLLADASW::Sampler *sampler - /*COLLADASW::Surface *surface*/); - - COLLADASW::ColorOrTexture getcol(float r, float g, float b, float a); - - private: - void set_shader_type(COLLADASW::EffectProfile &ep, Material *ma); - - void set_diffuse_color(COLLADASW::EffectProfile &ep, Material *ma); - void set_emission(COLLADASW::EffectProfile &ep, Material *ma); - void set_ior(COLLADASW::EffectProfile &ep, Material *ma); - void set_shininess(COLLADASW::EffectProfile &ep, Material *ma); - void set_reflectivity(COLLADASW::EffectProfile &ep, Material *ma); - void set_transparency(COLLADASW::EffectProfile &ep, Material *ma); - void set_ambient(COLLADASW::EffectProfile &ep, Material *ma); - void set_specular(COLLADASW::EffectProfile &ep, Material *ma); - void set_reflective(COLLADASW::EffectProfile &ep, Material *ma); - - void get_images(Material *ma, KeyImageMap &material_image_map); - void create_image_samplers(COLLADASW::EffectProfile &ep, - KeyImageMap &material_image_map, - std::string &active_uv); - - void writeTextures(COLLADASW::EffectProfile &ep, - std::string &key, - COLLADASW::Sampler *sampler, - MTex *t, - Image *ima, - std::string &uvname); - - bool hasEffects(Scene *sce); - - BCExportSettings &export_settings; - KeyImageMap &key_image_map; - Scene *scene; - bContext *mContext; -}; diff --git a/source/blender/io/collada/ErrorHandler.cpp b/source/blender/io/collada/ErrorHandler.cpp deleted file mode 100644 index 536d1429fbf..00000000000 --- a/source/blender/io/collada/ErrorHandler.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* SPDX-FileCopyrightText: 2011-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ -#include "ErrorHandler.h" -#include - -#include "COLLADASaxFWLIError.h" -#include "COLLADASaxFWLSaxFWLError.h" -#include "COLLADASaxFWLSaxParserError.h" - -#include "GeneratedSaxParserParserError.h" - -#include - -#include "BLI_utildefines.h" - -//-------------------------------------------------------------------- -ErrorHandler::ErrorHandler() : mError(false) {} - -//-------------------------------------------------------------------- -bool ErrorHandler::handleError(const COLLADASaxFWL::IError *error) -{ - /* This method must return false when Collada should continue. - * See https://github.com/KhronosGroup/OpenCOLLADA/issues/442 - */ - bool isError = true; - std::string error_context; - std::string error_message; - - if (error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXPARSER) { - error_context = "Schema validation"; - - COLLADASaxFWL::SaxParserError *saxParserError = (COLLADASaxFWL::SaxParserError *)error; - const GeneratedSaxParser::ParserError &parserError = saxParserError->getError(); - error_message = parserError.getErrorMessage(); - - if (parserError.getErrorType() == - GeneratedSaxParser::ParserError::ERROR_VALIDATION_MIN_OCCURS_UNMATCHED) - { - if (STREQ(parserError.getElement(), "effect")) { - isError = false; - } - } - - else if (parserError.getErrorType() == - GeneratedSaxParser::ParserError:: - ERROR_VALIDATION_SEQUENCE_PREVIOUS_SIBLING_NOT_PRESENT) - { - if (!(STREQ(parserError.getElement(), "extra") && - STREQ(parserError.getAdditionalText().c_str(), "sibling: fx_profile_abstract"))) - { - isError = false; - } - } - - else if (parserError.getErrorType() == - GeneratedSaxParser::ParserError::ERROR_COULD_NOT_OPEN_FILE) - { - isError = true; - error_context = "File access"; - } - - else if (parserError.getErrorType() == - GeneratedSaxParser::ParserError::ERROR_REQUIRED_ATTRIBUTE_MISSING) - { - isError = true; - } - - else { - isError = (parserError.getSeverity() != - GeneratedSaxParser::ParserError::Severity::SEVERITY_ERROR_NONCRITICAL); - } - } - else if (error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXFWL) { - error_context = "Sax FWL"; - COLLADASaxFWL::SaxFWLError *saxFWLError = (COLLADASaxFWL::SaxFWLError *)error; - error_message = saxFWLError->getErrorMessage(); - - /* - * Accept non critical errors as warnings (i.e. texture not found) - * This makes the importer more graceful, so it now imports what makes sense. - */ - - isError = (saxFWLError->getSeverity() != COLLADASaxFWL::IError::SEVERITY_ERROR_NONCRITICAL); - } - else { - error_context = "OpenCollada"; - error_message = error->getFullErrorMessage(); - isError = true; - } - - std::string severity = (isError) ? "Error" : "Warning"; - std::cout << error_context << " (" << severity << "): " << error_message << std::endl; - if (isError) { - std::cout << "The Collada import has been forced to stop." << std::endl; - std::cout << "Please fix the reported error and then try again."; - mError = true; - } - return isError; -} diff --git a/source/blender/io/collada/ErrorHandler.h b/source/blender/io/collada/ErrorHandler.h deleted file mode 100644 index 46fb45cd7d4..00000000000 --- a/source/blender/io/collada/ErrorHandler.h +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "COLLADASaxFWLIErrorHandler.h" - -/** \brief Handler class for parser errors - */ -class ErrorHandler : public COLLADASaxFWL::IErrorHandler { - public: - /** Constructor. */ - ErrorHandler(); - - /** handle any error thrown by the parser. */ - bool handleError(const COLLADASaxFWL::IError *error) override; - /** True if there was an error during parsing. */ - bool hasError() - { - return mError; - } - - private: - /** Disable default copy constructor. */ - ErrorHandler(const ErrorHandler &pre); - /** Disable default assignment operator. */ - const ErrorHandler &operator=(const ErrorHandler &pre); - /** Hold error status. */ - bool mError; -}; diff --git a/source/blender/io/collada/ExportSettings.cpp b/source/blender/io/collada/ExportSettings.cpp deleted file mode 100644 index a73973bb03c..00000000000 --- a/source/blender/io/collada/ExportSettings.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* SPDX-FileCopyrightText: 2002-2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "ExportSettings.h" diff --git a/source/blender/io/collada/ExportSettings.h b/source/blender/io/collada/ExportSettings.h deleted file mode 100644 index 6c66944b687..00000000000 --- a/source/blender/io/collada/ExportSettings.h +++ /dev/null @@ -1,282 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "BLI_linklist.h" -#include "BlenderContext.h" - -#ifdef __cplusplus -# include "BCMath.h" -# include - -extern "C" { -#endif - -enum BC_export_mesh_type { - BC_MESH_TYPE_VIEW, - BC_MESH_TYPE_RENDER, -}; - -enum BC_export_transformation_type { - BC_TRANSFORMATION_TYPE_MATRIX, - BC_TRANSFORMATION_TYPE_DECOMPOSED, -}; - -enum BC_export_animation_type { - BC_ANIMATION_EXPORT_SAMPLES, - BC_ANIMATION_EXPORT_KEYS, -}; - -enum BC_ui_export_section { - BC_UI_SECTION_MAIN, - BC_UI_SECTION_GEOMETRY, - BC_UI_SECTION_ARMATURE, - BC_UI_SECTION_ANIMATION, - BC_UI_SECTION_COLLADA, -}; - -struct ExportSettings { - bool apply_modifiers; - BC_global_forward_axis global_forward; - BC_global_up_axis global_up; - bool apply_global_orientation; - - BC_export_mesh_type export_mesh_type; - - bool selected; - bool include_children; - bool include_armatures; - bool include_shapekeys; - bool deform_bones_only; - bool include_animations; - bool include_all_actions; - int sampling_rate; - bool keep_smooth_curves; - bool keep_keyframes; - bool keep_flat_curves; - - bool active_uv_only; - BC_export_animation_type export_animation_type; - bool use_texture_copies; - - bool triangulate; - bool use_object_instantiation; - bool use_blender_profile; - bool sort_by_name; - BC_export_transformation_type object_transformation_type; - BC_export_transformation_type animation_transformation_type; - - bool open_sim; - bool limit_precision; - bool keep_bind_info; - - char *filepath; - LinkNode *export_set; -}; - -#ifdef __cplusplus -} - -void bc_get_children(std::vector &child_set, - Object *ob, - const Scene *scene, - ViewLayer *view_layer); - -class BCExportSettings { - - private: - const ExportSettings &export_settings; - BlenderContext &blender_context; - const BCMatrix global_transform; - - public: - BCExportSettings(ExportSettings *exportSettings, BlenderContext &blenderContext) - : export_settings(*exportSettings), - blender_context(blenderContext), - global_transform(BCMatrix(exportSettings->global_forward, exportSettings->global_up)) - { - } - - const BCMatrix &get_global_transform() - { - return global_transform; - } - - bool get_apply_modifiers() - { - return export_settings.apply_modifiers; - } - - BC_global_forward_axis get_global_forward() - { - return export_settings.global_forward; - } - - BC_global_up_axis get_global_up() - { - return export_settings.global_up; - } - - bool get_apply_global_orientation() - { - return export_settings.apply_global_orientation; - } - - BC_export_mesh_type get_export_mesh_type() - { - return export_settings.export_mesh_type; - } - - bool get_selected() - { - return export_settings.selected; - } - - bool get_include_children() - { - return export_settings.include_children; - } - - bool get_include_armatures() - { - return export_settings.include_armatures; - } - - bool get_include_shapekeys() - { - return export_settings.include_shapekeys; - } - - bool get_deform_bones_only() - { - return export_settings.deform_bones_only; - } - - bool get_include_animations() - { - return export_settings.include_animations; - } - - bool get_include_all_actions() - { - return export_settings.include_all_actions; - } - - int get_sampling_rate() - { - return export_settings.sampling_rate; - } - - bool get_keep_smooth_curves() - { - return export_settings.keep_smooth_curves; - } - - bool get_keep_keyframes() - { - return export_settings.keep_keyframes; - } - - bool get_keep_flat_curves() - { - return export_settings.keep_flat_curves; - } - - bool get_active_uv_only() - { - return export_settings.active_uv_only; - } - - BC_export_animation_type get_export_animation_type() - { - return export_settings.export_animation_type; - } - - bool get_use_texture_copies() - { - return export_settings.use_texture_copies; - } - - bool get_triangulate() - { - return export_settings.triangulate; - } - - bool get_use_object_instantiation() - { - return export_settings.use_object_instantiation; - } - - bool get_use_blender_profile() - { - return export_settings.use_blender_profile; - } - - bool get_sort_by_name() - { - return export_settings.sort_by_name; - } - - BC_export_transformation_type get_object_transformation_type() - { - return export_settings.object_transformation_type; - } - - BC_export_transformation_type get_animation_transformation_type() - { - return export_settings.animation_transformation_type; - } - - bool get_open_sim() - { - return export_settings.open_sim; - } - - bool get_limit_precision() - { - return export_settings.limit_precision; - } - - bool get_keep_bind_info() - { - return export_settings.keep_bind_info; - } - - char *get_filepath() - { - return export_settings.filepath; - } - - LinkNode *get_export_set() - { - return export_settings.export_set; - } - - BlenderContext &get_blender_context() - { - return blender_context; - } - - Scene *get_scene() - { - return blender_context.get_scene(); - } - - ViewLayer *get_view_layer() - { - return blender_context.get_view_layer(); - } - - bool is_export_root(Object *ob) - { - return bc_is_base_node(get_export_set(), ob, get_scene(), get_view_layer()); - } -}; - -#endif diff --git a/source/blender/io/collada/ExtraHandler.cpp b/source/blender/io/collada/ExtraHandler.cpp deleted file mode 100644 index 48e7373ee45..00000000000 --- a/source/blender/io/collada/ExtraHandler.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* SPDX-FileCopyrightText: 2011-2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include -#include - -#include "BLI_string.h" - -#include "ExtraHandler.h" - -ExtraHandler::ExtraHandler(DocumentImporter *dimp, AnimationImporter *aimp) - : currentExtraTags(nullptr) -{ - this->dimp = dimp; - this->aimp = aimp; -} - -bool ExtraHandler::elementBegin(const char *elementName, const char **attributes) -{ - /* \todo attribute handling for profile tags */ - currentElement = std::string(elementName); - // addToSidTree(attributes[0], attributes[1]); - return true; -} - -bool ExtraHandler::elementEnd(const char *elementName) -{ - return true; -} - -bool ExtraHandler::textData(const char *text, size_t textLength) -{ - char buf[1024]; - - if (currentElement.length() == 0 || currentExtraTags == nullptr) { - return false; - } - - BLI_strncpy(buf, text, textLength + 1); - currentExtraTags->addTag(currentElement, std::string(buf)); - return true; -} - -bool ExtraHandler::parseElement(const char *profileName, - const ulong &elementHash, - const COLLADAFW::UniqueId &uniqueId) -{ - /* implement for backwards compatibility, new version added object parameter */ - return parseElement(profileName, elementHash, uniqueId, nullptr); -} - -bool ExtraHandler::parseElement(const char *profileName, - const ulong &elementHash, - const COLLADAFW::UniqueId &uniqueId, - COLLADAFW::Object *object) -{ - if (BLI_strcaseeq(profileName, "blender")) { -#if 0 - printf("In parseElement for supported profile %s for id %s\n", - profileName, - uniqueId.toAscii().c_str()); -#endif - currentUid = uniqueId; - ExtraTags *et = dimp->getExtraTags(uniqueId); - if (!et) { - et = new ExtraTags(std::string(profileName)); - dimp->addExtraTags(uniqueId, et); - } - currentExtraTags = et; - return true; - } - // printf("In parseElement for unsupported profile %s for id %s\n", profileName, - // uniqueId.toAscii().c_str()); - return false; -} diff --git a/source/blender/io/collada/ExtraHandler.h b/source/blender/io/collada/ExtraHandler.h deleted file mode 100644 index 6cd91364098..00000000000 --- a/source/blender/io/collada/ExtraHandler.h +++ /dev/null @@ -1,61 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include -#include - -#include "COLLADASaxFWLIExtraDataCallbackHandler.h" - -#include "AnimationImporter.h" -#include "DocumentImporter.h" - -/** \brief Handler class for \ data, through which different - * profiles can be handled - */ -class ExtraHandler : public COLLADASaxFWL::IExtraDataCallbackHandler { - public: - /** Constructor. */ - ExtraHandler(DocumentImporter *dimp, AnimationImporter *aimp); - - /** Handle the beginning of an element. */ - bool elementBegin(const char *elementName, const char **attributes) override; - - /** Handle the end of an element. */ - bool elementEnd(const char *elementName) override; - - /** Receive the data in text format. */ - bool textData(const char *text, size_t textLength) override; - - /** Method to ask, if the current callback handler want to read the data of the given extra - * element. */ - bool parseElement(const char *profileName, - const unsigned long &elementHash, - const COLLADAFW::UniqueId &uniqueId, - COLLADAFW::Object *object) override; - - /** For backwards compatibility with older OpenCollada, new version added object parameter */ - bool parseElement(const char *profileName, - const unsigned long &elementHash, - const COLLADAFW::UniqueId &uniqueId); - - private: - /** Disable default copy constructor. */ - ExtraHandler(const ExtraHandler &pre); - /** Disable default assignment operator. */ - const ExtraHandler &operator=(const ExtraHandler &pre); - - /** Handle to DocumentImporter for interface to extra element data saving. */ - DocumentImporter *dimp; - AnimationImporter *aimp; - /** Holds Id of element for which XML elements are handled. */ - COLLADAFW::UniqueId currentUid; - ExtraTags *currentExtraTags; - std::string currentElement; -}; diff --git a/source/blender/io/collada/ExtraTags.cpp b/source/blender/io/collada/ExtraTags.cpp deleted file mode 100644 index aad60035834..00000000000 --- a/source/blender/io/collada/ExtraTags.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* SPDX-FileCopyrightText: 2002-2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include -#include - -#include - -#include "ExtraTags.h" - -ExtraTags::ExtraTags(std::string profile) -{ - this->profile = profile; - this->tags = std::map(); -} - -ExtraTags::~ExtraTags() = default; - -bool ExtraTags::isProfile(std::string profile) -{ - return this->profile == profile; -} - -bool ExtraTags::addTag(std::string tag, std::string data) -{ - tags[tag] = data; - - return true; -} - -int ExtraTags::asInt(std::string tag, bool *r_ok) -{ - if (tags.find(tag) == tags.end()) { - *r_ok = false; - return -1; - } - *r_ok = true; - return atoi(tags[tag].c_str()); -} - -float ExtraTags::asFloat(std::string tag, bool *r_ok) -{ - if (tags.find(tag) == tags.end()) { - *r_ok = false; - return -1.0f; - } - *r_ok = true; - return float(atof(tags[tag].c_str())); -} - -std::string ExtraTags::asString(std::string tag, bool *r_ok) -{ - if (tags.find(tag) == tags.end()) { - *r_ok = false; - return ""; - } - *r_ok = true; - return tags[tag]; -} - -bool ExtraTags::setData(std::string tag, short *data) -{ - bool ok = false; - int tmp = asInt(tag, &ok); - if (ok) { - *data = short(tmp); - } - return ok; -} - -bool ExtraTags::setData(std::string tag, int *data) -{ - bool ok = false; - int tmp = asInt(tag, &ok); - if (ok) { - *data = tmp; - } - return ok; -} - -bool ExtraTags::setData(std::string tag, float *data) -{ - bool ok = false; - float tmp = asFloat(tag, &ok); - if (ok) { - *data = tmp; - } - return ok; -} - -bool ExtraTags::setData(std::string tag, char *data) -{ - bool ok = false; - int tmp = asInt(tag, &ok); - if (ok) { - *data = char(tmp); - } - return ok; -} - -std::string ExtraTags::setData(std::string tag, std::string &data) -{ - bool ok = false; - std::string tmp = asString(tag, &ok); - return (ok) ? tmp : data; -} - -std::vector ExtraTags::dataSplitString(const std::string &tag) -{ - bool ok = false; - const std::string value = asString(tag, &ok); - if (!ok) { - return std::vector(); - } - - std::vector values; - - const std::regex newline_re("[^\\s][^\\r\\n]+"); - const std::sregex_token_iterator end; - std::sregex_token_iterator iter(value.begin(), value.end(), newline_re); - for (; iter != end; iter++) { - values.push_back(*iter); - } - - return values; -} diff --git a/source/blender/io/collada/ExtraTags.h b/source/blender/io/collada/ExtraTags.h deleted file mode 100644 index 9595a7fd5e7..00000000000 --- a/source/blender/io/collada/ExtraTags.h +++ /dev/null @@ -1,65 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include -#include -#include - -/** \brief Class for saving \ tags for a specific UniqueId. - */ -class ExtraTags { - public: - /** Constructor. */ - ExtraTags(const std::string profile); - - /** Destructor. */ - virtual ~ExtraTags(); - - /** Handle the beginning of an element. */ - bool addTag(std::string tag, std::string data); - - /** Set given short pointer to value of tag, if it exists. */ - bool setData(std::string tag, short *data); - - /** Set given int pointer to value of tag, if it exists. */ - bool setData(std::string tag, int *data); - - /** Set given float pointer to value of tag, if it exists. */ - bool setData(std::string tag, float *data); - - /** Set given char pointer to value of tag, if it exists. */ - bool setData(std::string tag, char *data); - std::string setData(std::string tag, std::string &data); - - /** Get a string from the data, and split it by newlines. */ - std::vector dataSplitString(const std::string &tag); - - /** Return true if the extra tags is for specified profile. */ - bool isProfile(std::string profile); - - private: - /** Disable default copy constructor. */ - ExtraTags(const ExtraTags &pre); - /** Disable default assignment operator. */ - const ExtraTags &operator=(const ExtraTags &pre); - - /** The profile for which the tags are. */ - std::string profile; - - /** Map of tag and text pairs. */ - std::map tags; - - /** Get text data for tag as an int. */ - int asInt(std::string tag, bool *r_ok); - /** Get text data for tag as a float. */ - float asFloat(std::string tag, bool *r_ok); - /** Get text data for tag as a string. */ - std::string asString(std::string tag, bool *r_ok); -}; diff --git a/source/blender/io/collada/GeometryExporter.cpp b/source/blender/io/collada/GeometryExporter.cpp deleted file mode 100644 index 0acf25ead4b..00000000000 --- a/source/blender/io/collada/GeometryExporter.cpp +++ /dev/null @@ -1,706 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include - -#include "COLLADABUUtils.h" -#include "COLLADASWPrimitves.h" -#include "COLLADASWSource.h" -#include "COLLADASWVertices.h" - -#include "GeometryExporter.h" - -#include "DNA_key_types.h" -#include "DNA_meshdata_types.h" - -#include "BLI_math_vector_types.hh" -#include "BLI_string.h" - -#include "BKE_attribute.hh" -#include "BKE_customdata.hh" -#include "BKE_key.hh" -#include "BKE_lib_id.hh" -#include "BKE_material.hh" -#include "BKE_mesh.hh" - -#include "collada_internal.h" -#include "collada_utils.h" - -using blender::float3; -using blender::Span; - -void GeometryExporter::exportGeom() -{ - Scene *sce = blender_context.get_scene(); - openLibrary(); - - GeometryFunctor gf; - gf.forEachMeshObjectInExportSet( - sce, *this, this->export_settings.get_export_set()); - - closeLibrary(); -} - -void GeometryExporter::operator()(Object *ob) -{ - bool use_instantiation = this->export_settings.get_use_object_instantiation(); - Mesh *mesh = bc_get_mesh_copy(blender_context, - ob, - this->export_settings.get_export_mesh_type(), - this->export_settings.get_apply_modifiers(), - this->export_settings.get_triangulate()); - - std::string geom_id = get_geometry_id(ob, use_instantiation); - std::vector nor; - std::vector norind; - - /* Skip if linked geometry was already exported from another reference */ - if (use_instantiation && exportedGeometry.find(geom_id) != exportedGeometry.end()) { - return; - } - - std::string geom_name = (use_instantiation) ? id_name(ob->data) : id_name(ob); - geom_name = encode_xml(geom_name); - - exportedGeometry.insert(geom_id); - - bool has_color = CustomData_has_layer(&mesh->fdata_legacy, CD_MCOL); - - create_normals(nor, norind, mesh); - - /* openMesh(geoId, geoName, meshId) */ - openMesh(geom_id, geom_name); - - /* writes for vertex coords */ - createVertsSource(geom_id, mesh); - - /* writes for normal coords */ - createNormalsSource(geom_id, mesh, nor); - - bool has_uvs = CustomData_has_layer(&mesh->corner_data, CD_PROP_FLOAT2); - - /* writes for uv coords if mesh has uv coords */ - if (has_uvs) { - createTexcoordsSource(geom_id, mesh); - } - - if (has_color) { - createVertexColorSource(geom_id, mesh); - } - /* */ - - COLLADASW::Vertices verts(mSW); - verts.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::VERTEX)); - COLLADASW::InputList &input_list = verts.getInputList(); - COLLADASW::Input input(COLLADASW::InputSemantic::POSITION, - getUrlBySemantics(geom_id, COLLADASW::InputSemantic::POSITION)); - input_list.push_back(input); - verts.add(); - - createLooseEdgeList(ob, mesh, geom_id); - - /* Only create poly-lists if number of faces > 0. */ - if (mesh->totface_legacy > 0) { - /* XXX slow */ - if (ob->totcol) { - for (int a = 0; a < ob->totcol; a++) { - create_mesh_primitive_list(a, has_uvs, has_color, ob, mesh, geom_id, norind); - } - } - else { - create_mesh_primitive_list(0, has_uvs, has_color, ob, mesh, geom_id, norind); - } - } - - closeMesh(); - - closeGeometry(); - - if (this->export_settings.get_include_shapekeys()) { - Key *key = BKE_key_from_object(ob); - if (key) { - blender::MutableSpan positions = mesh->vert_positions_for_write(); - KeyBlock *kb = (KeyBlock *)key->block.first; - /* skip the basis */ - kb = kb->next; - for (; kb; kb = kb->next) { - BKE_keyblock_convert_to_mesh(kb, positions); - export_key_mesh(ob, mesh, kb); - } - } - } - - BKE_id_free(nullptr, mesh); -} - -void GeometryExporter::export_key_mesh(Object *ob, Mesh *mesh, KeyBlock *kb) -{ - std::string geom_id = get_geometry_id(ob, false) + "_morph_" + translate_id(kb->name); - std::vector nor; - std::vector norind; - - if (exportedGeometry.find(geom_id) != exportedGeometry.end()) { - return; - } - - std::string geom_name = kb->name; - - exportedGeometry.insert(geom_id); - - bool has_color = CustomData_has_layer(&mesh->fdata_legacy, CD_MCOL); - - create_normals(nor, norind, mesh); - - // openMesh(geoId, geoName, meshId) - openMesh(geom_id, geom_name); - - /* writes for vertex coords */ - createVertsSource(geom_id, mesh); - - /* writes for normal coords */ - createNormalsSource(geom_id, mesh, nor); - - bool has_uvs = CustomData_has_layer(&mesh->corner_data, CD_PROP_FLOAT2); - - /* writes for uv coords if mesh has uv coords */ - if (has_uvs) { - createTexcoordsSource(geom_id, mesh); - } - - if (has_color) { - createVertexColorSource(geom_id, mesh); - } - - /* */ - - COLLADASW::Vertices verts(mSW); - verts.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::VERTEX)); - COLLADASW::InputList &input_list = verts.getInputList(); - COLLADASW::Input input(COLLADASW::InputSemantic::POSITION, - getUrlBySemantics(geom_id, COLLADASW::InputSemantic::POSITION)); - input_list.push_back(input); - verts.add(); - - // createLooseEdgeList(ob, mesh, geom_id, norind); - - /* XXX slow */ - if (ob->totcol) { - for (int a = 0; a < ob->totcol; a++) { - create_mesh_primitive_list(a, has_uvs, has_color, ob, mesh, geom_id, norind); - } - } - else { - create_mesh_primitive_list(0, has_uvs, has_color, ob, mesh, geom_id, norind); - } - - closeMesh(); - - closeGeometry(); -} - -void GeometryExporter::createLooseEdgeList(Object *ob, Mesh *mesh, std::string &geom_id) -{ - using namespace blender; - const Span edges = mesh->edges(); - int edges_in_linelist = 0; - std::vector edge_list; - int index; - - /* Find all loose edges in Mesh - * and save vertex indices in edge_list */ - const bke::LooseEdgeCache &loose_edges = mesh->loose_edges(); - if (loose_edges.count > 0) { - for (const int64_t i : edges.index_range()) { - if (loose_edges.is_loose_bits[i]) { - const int2 &edge = edges[i]; - edges_in_linelist += 1; - edge_list.push_back(edge[0]); - edge_list.push_back(edge[1]); - } - } - } - - if (edges_in_linelist > 0) { - /* Create the list of loose edges */ - COLLADASW::Lines lines(mSW); - - lines.setCount(edges_in_linelist); - - COLLADASW::InputList &til = lines.getInputList(); - - /* creates in for vertices */ - COLLADASW::Input input1(COLLADASW::InputSemantic::VERTEX, - getUrlBySemantics(geom_id, COLLADASW::InputSemantic::VERTEX), - 0); - til.push_back(input1); - - lines.prepareToAppendValues(); - - for (index = 0; index < edges_in_linelist; index++) { - lines.appendValues(edge_list[2 * index + 1]); - lines.appendValues(edge_list[2 * index]); - } - lines.finish(); - } -} - -static void prepareToAppendValues(bool is_triangulated, - COLLADASW::PrimitivesBase &primitive_list, - std::vector &vcount_list) -{ - /* performs the actual writing */ - if (is_triangulated) { - ((COLLADASW::Triangles &)primitive_list).prepareToAppendValues(); - } - else { - /* sets */ - primitive_list.setVCountList(vcount_list); - ((COLLADASW::Polylist &)primitive_list).prepareToAppendValues(); - } -} - -static void finish_and_delete_primitive_List(bool is_triangulated, - COLLADASW::PrimitivesBase *primitive_list) -{ - if (is_triangulated) { - ((COLLADASW::Triangles *)primitive_list)->finish(); - } - else { - ((COLLADASW::Polylist *)primitive_list)->finish(); - } - delete primitive_list; -} - -static COLLADASW::PrimitivesBase *create_primitive_list(bool is_triangulated, - COLLADASW::StreamWriter *mSW) -{ - COLLADASW::PrimitivesBase *primitive_list; - - if (is_triangulated) { - primitive_list = new COLLADASW::Triangles(mSW); - } - else { - primitive_list = new COLLADASW::Polylist(mSW); - } - return primitive_list; -} - -static bool collect_vertex_counts_per_poly(Mesh *mesh, - int material_index, - std::vector &vcount_list) -{ - using namespace blender; - const blender::OffsetIndices faces = mesh->faces(); - const blender::bke::AttributeAccessor attributes = mesh->attributes(); - const blender::VArray material_indices = *attributes.lookup_or_default( - "material_index", bke::AttrDomain::Face, 0); - bool is_triangulated = true; - - /* Expecting that the material index is always 0 if the mesh has no materials assigned */ - for (const int i : faces.index_range()) { - if (material_indices[i] == material_index) { - const int vertex_count = faces[i].size(); - vcount_list.push_back(vertex_count); - if (vertex_count != 3) { - is_triangulated = false; - } - } - } - return is_triangulated; -} - -std::string GeometryExporter::makeVertexColorSourceId(std::string &geom_id, const char *layer_name) -{ - std::string result = getIdBySemantics(geom_id, COLLADASW::InputSemantic::COLOR) + "-" + - layer_name; - return result; -} - -void GeometryExporter::create_mesh_primitive_list(short material_index, - bool has_uvs, - bool has_color, - Object *ob, - Mesh *mesh, - std::string &geom_id, - std::vector &norind) -{ - using namespace blender; - const blender::OffsetIndices faces = mesh->faces(); - const Span corner_verts = mesh->corner_verts(); - - std::vector vcount_list; - - bool is_triangulated = collect_vertex_counts_per_poly(mesh, material_index, vcount_list); - int polygon_count = vcount_list.size(); - - /* no faces using this material */ - if (polygon_count == 0) { - fprintf( - stderr, "%s: material with index %d is not used.\n", id_name(ob).c_str(), material_index); - return; - } - - Material *ma = ob->totcol ? BKE_object_material_get(ob, material_index + 1) : nullptr; - COLLADASW::PrimitivesBase *primitive_list = create_primitive_list(is_triangulated, mSW); - - /* sets count attribute in ``. */ - primitive_list->setCount(polygon_count); - - /* sets material name */ - if (ma) { - std::string material_id = get_material_id(ma); - std::ostringstream ostr; - ostr << translate_id(material_id); - primitive_list->setMaterial(ostr.str()); - } - - COLLADASW::Input vertex_input(COLLADASW::InputSemantic::VERTEX, - getUrlBySemantics(geom_id, COLLADASW::InputSemantic::VERTEX), - 0); - COLLADASW::Input normals_input(COLLADASW::InputSemantic::NORMAL, - getUrlBySemantics(geom_id, COLLADASW::InputSemantic::NORMAL), - 1); - - COLLADASW::InputList &til = primitive_list->getInputList(); - til.push_back(vertex_input); - til.push_back(normals_input); - - /* if mesh has uv coords writes for TEXCOORD */ - int num_layers = CustomData_number_of_layers(&mesh->corner_data, CD_PROP_FLOAT2); - int active_uv = CustomData_get_active_layer(&mesh->corner_data, CD_PROP_FLOAT2); - for (int i = 0; i < num_layers; i++) { - if (!this->export_settings.get_active_uv_only() || i == active_uv) { - - // char *name = CustomData_get_layer_name(&mesh->ldata, CD_PROP_FLOAT2, i); - COLLADASW::Input texcoord_input( - COLLADASW::InputSemantic::TEXCOORD, - makeUrl(makeTexcoordSourceId(geom_id, i, this->export_settings.get_active_uv_only())), - 2, /* this is only until we have optimized UV sets */ - this->export_settings.get_active_uv_only() ? 0 : i /* set (0,1,2,...) */ - ); - til.push_back(texcoord_input); - } - } - - int totlayer_mcol = CustomData_number_of_layers(&mesh->corner_data, CD_PROP_BYTE_COLOR); - if (totlayer_mcol > 0) { - int map_index = 0; - - for (int a = 0; a < totlayer_mcol; a++) { - const char *layer_name = bc_CustomData_get_layer_name( - &mesh->corner_data, CD_PROP_BYTE_COLOR, a); - COLLADASW::Input input4(COLLADASW::InputSemantic::COLOR, - makeUrl(makeVertexColorSourceId(geom_id, layer_name)), - (has_uvs) ? 3 : 2, /* all color layers have same index order */ - map_index /* set number equals color map index */ - ); - til.push_back(input4); - map_index++; - } - } - - /* performs the actual writing */ - prepareToAppendValues(is_triangulated, *primitive_list, vcount_list); - - const blender::bke::AttributeAccessor attributes = mesh->attributes(); - const blender::VArray material_indices = *attributes.lookup_or_default( - "material_index", bke::AttrDomain::Face, 0); - - /*

*/ - int texindex = 0; - for (const int i : faces.index_range()) { - const blender::IndexRange poly = faces[i]; - int loop_count = poly.size(); - - if (material_indices[i] == material_index) { - BCPolygonNormalsIndices normal_indices = norind[i]; - - for (int j = 0; j < loop_count; j++) { - const int vert = corner_verts[poly[j]]; - primitive_list->appendValues(vert); - primitive_list->appendValues(normal_indices[j]); - if (has_uvs) { - primitive_list->appendValues(texindex + j); - } - - if (has_color) { - primitive_list->appendValues(texindex + j); - } - } - } - - texindex += loop_count; - } - - finish_and_delete_primitive_List(is_triangulated, primitive_list); -} - -void GeometryExporter::createVertsSource(std::string geom_id, Mesh *mesh) -{ - const Span positions = mesh->vert_positions(); - - COLLADASW::FloatSourceF source(mSW); - source.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::POSITION)); - source.setArrayId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::POSITION) + - ARRAY_ID_SUFFIX); - source.setAccessorCount(positions.size()); - source.setAccessorStride(3); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.emplace_back("X"); - param.emplace_back("Y"); - param.emplace_back("Z"); - /* main function, it creates , */ - source.prepareToAppendValues(); - /* appends data to */ - for (const int i : positions.index_range()) { - Vector co; - if (export_settings.get_apply_global_orientation()) { - float co_c[3]; - copy_v3_v3(co_c, positions[i]); - bc_add_global_transform(co, co_c, export_settings.get_global_transform()); - } - else { - copy_v3_v3(co, positions[i]); - } - source.appendValues(co[0], co[1], co[2]); - } - - source.finish(); -} - -void GeometryExporter::createVertexColorSource(std::string geom_id, Mesh *mesh) -{ - /* Find number of vertex color layers */ - int totlayer_mcol = CustomData_number_of_layers(&mesh->corner_data, CD_PROP_BYTE_COLOR); - if (totlayer_mcol == 0) { - return; - } - - int map_index = 0; - for (int a = 0; a < totlayer_mcol; a++) { - - map_index++; - const MLoopCol *mloopcol = (const MLoopCol *)CustomData_get_layer_n( - &mesh->corner_data, CD_PROP_BYTE_COLOR, a); - - COLLADASW::FloatSourceF source(mSW); - - const char *layer_name = bc_CustomData_get_layer_name( - &mesh->corner_data, CD_PROP_BYTE_COLOR, a); - std::string layer_id = makeVertexColorSourceId(geom_id, layer_name); - source.setId(layer_id); - - source.setNodeName(layer_name); - - source.setArrayId(layer_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(mesh->corners_num); - source.setAccessorStride(4); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.emplace_back("R"); - param.emplace_back("G"); - param.emplace_back("B"); - param.emplace_back("A"); - - source.prepareToAppendValues(); - - const blender::OffsetIndices faces = mesh->faces(); - for (const int i : faces.index_range()) { - for (const int corner : faces[i]) { - const MLoopCol *mlc = &mloopcol[corner]; - source.appendValues(mlc->r / 255.0f, mlc->g / 255.0f, mlc->b / 255.0f, mlc->a / 255.0f); - } - } - - source.finish(); - } -} - -std::string GeometryExporter::makeTexcoordSourceId(std::string &geom_id, - int layer_index, - bool is_single_layer) -{ - char suffix[20]; - if (is_single_layer) { - suffix[0] = '\0'; - } - else { - SNPRINTF(suffix, "-%d", layer_index); - } - return getIdBySemantics(geom_id, COLLADASW::InputSemantic::TEXCOORD) + suffix; -} - -void GeometryExporter::createTexcoordsSource(std::string geom_id, Mesh *mesh) -{ - int totuv = mesh->corners_num; - const blender::OffsetIndices faces = mesh->faces(); - - int num_layers = CustomData_number_of_layers(&mesh->corner_data, CD_PROP_FLOAT2); - - /* write for each layer - * each will get id like meshName + "map-channel-1" */ - int active_uv_index = CustomData_get_active_layer_index(&mesh->corner_data, CD_PROP_FLOAT2); - for (int a = 0; a < num_layers; a++) { - int layer_index = CustomData_get_layer_index_n(&mesh->corner_data, CD_PROP_FLOAT2, a); - if (!this->export_settings.get_active_uv_only() || layer_index == active_uv_index) { - const blender::float2 *uv_map = static_cast( - CustomData_get_layer_n(&mesh->corner_data, CD_PROP_FLOAT2, a)); - - COLLADASW::FloatSourceF source(mSW); - std::string layer_id = makeTexcoordSourceId( - geom_id, a, this->export_settings.get_active_uv_only()); - source.setId(layer_id); - source.setArrayId(layer_id + ARRAY_ID_SUFFIX); - - source.setAccessorCount(totuv); - source.setAccessorStride(2); - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.emplace_back("S"); - param.emplace_back("T"); - - source.prepareToAppendValues(); - - for (const int i : faces.index_range()) { - for (const int corner : faces[i]) { - source.appendValues(uv_map[corner][0], uv_map[corner][1]); - } - } - - source.finish(); - } - } -} - -bool operator<(const Normal &a, const Normal &b) -{ - /* Only needed to sort normal vectors and find() them later in a map. */ - return a.x < b.x || (a.x == b.x && (a.y < b.y || (a.y == b.y && a.z < b.z))); -} - -void GeometryExporter::createNormalsSource(std::string geom_id, - Mesh *mesh, - std::vector &nor) -{ - COLLADASW::FloatSourceF source(mSW); - source.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::NORMAL)); - source.setArrayId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::NORMAL) + ARRAY_ID_SUFFIX); - source.setAccessorCount(ulong(nor.size())); - source.setAccessorStride(3); - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.emplace_back("X"); - param.emplace_back("Y"); - param.emplace_back("Z"); - - source.prepareToAppendValues(); - - std::vector::iterator it; - for (it = nor.begin(); it != nor.end(); it++) { - Normal &n = *it; - - Vector no{n.x, n.y, n.z}; - if (export_settings.get_apply_global_orientation()) { - bc_add_global_transform(no, export_settings.get_global_transform()); - } - source.appendValues(no[0], no[1], no[2]); - } - - source.finish(); -} - -void GeometryExporter::create_normals(std::vector &normals, - std::vector &polygons_normals, - Mesh *mesh) -{ - using namespace blender; - std::map shared_normal_indices; - int last_normal_index = -1; - - const Span positions = mesh->vert_positions(); - const Span vert_normals = mesh->vert_normals(); - const blender::OffsetIndices faces = mesh->faces(); - const Span corner_verts = mesh->corner_verts(); - - const bke::AttributeAccessor attributes = mesh->attributes(); - const VArray sharp_faces = *attributes.lookup_or_default( - "sharp_face", bke::AttrDomain::Face, false); - - blender::Span corner_normals; - if (mesh->normals_domain() == blender::bke::MeshNormalDomain::Corner) { - corner_normals = mesh->corner_normals(); - } - - for (const int face_index : faces.index_range()) { - const IndexRange face = faces[face_index]; - bool use_vert_normals = !corner_normals.is_empty() || !sharp_faces[face_index]; - - if (!use_vert_normals) { - /* For flat faces use face normal as vertex normal: */ - - const float3 vector = blender::bke::mesh::face_normal_calc(positions, - corner_verts.slice(face)); - - Normal n = {vector[0], vector[1], vector[2]}; - normals.push_back(n); - last_normal_index++; - } - - BCPolygonNormalsIndices poly_indices; - for (const int corner : face) { - if (use_vert_normals) { - float normalized[3]; - - if (!corner_normals.is_empty()) { - normalize_v3_v3(normalized, corner_normals[corner]); - } - else { - copy_v3_v3(normalized, vert_normals[corner_verts[corner]]); - normalize_v3(normalized); - } - Normal n = {normalized[0], normalized[1], normalized[2]}; - - if (shared_normal_indices.find(n) != shared_normal_indices.end()) { - poly_indices.add_index(shared_normal_indices[n]); - } - else { - last_normal_index++; - poly_indices.add_index(last_normal_index); - shared_normal_indices[n] = last_normal_index; - normals.push_back(n); - } - } - else { - poly_indices.add_index(last_normal_index); - } - } - - polygons_normals.push_back(poly_indices); - } -} - -std::string GeometryExporter::getIdBySemantics(std::string geom_id, - COLLADASW::InputSemantic::Semantics type, - std::string other_suffix) -{ - return geom_id + getSuffixBySemantic(type) + other_suffix; -} - -COLLADASW::URI GeometryExporter::getUrlBySemantics(std::string geom_id, - COLLADASW::InputSemantic::Semantics type, - std::string other_suffix) -{ - - std::string id(getIdBySemantics(geom_id, type, other_suffix)); - return COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, id); -} - -COLLADASW::URI GeometryExporter::makeUrl(std::string id) -{ - return COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, id); -} diff --git a/source/blender/io/collada/GeometryExporter.h b/source/blender/io/collada/GeometryExporter.h deleted file mode 100644 index 58c21a33d4c..00000000000 --- a/source/blender/io/collada/GeometryExporter.h +++ /dev/null @@ -1,123 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include -#include -#include - -#include "COLLADASWInputList.h" -#include "COLLADASWLibraryGeometries.h" -#include "COLLADASWStreamWriter.h" - -#include "DNA_key_types.h" -#include "DNA_mesh_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "BlenderContext.h" -#include "ExportSettings.h" -#include "collada_utils.h" - -class Normal { - public: - float x; - float y; - float z; - - friend bool operator<(const Normal &, const Normal &); -}; - -bool operator<(const Normal &, const Normal &); - -/* TODO: optimize UV sets by making indexed list with duplicates removed */ -class GeometryExporter : COLLADASW::LibraryGeometries { - struct Face { - unsigned int v1, v2, v3, v4; - }; - - public: - /* TODO: optimize UV sets by making indexed list with duplicates removed */ - GeometryExporter(BlenderContext &blender_context, - COLLADASW::StreamWriter *sw, - BCExportSettings &export_settings) - : COLLADASW::LibraryGeometries(sw), - blender_context(blender_context), - export_settings(export_settings) - { - } - - void exportGeom(); - - void operator()(Object *ob); - - void createLooseEdgeList(Object *ob, Mesh *mesh, std::string &geom_id); - - /** Powerful because it handles both cases when there is material and when there's not. */ - void create_mesh_primitive_list(short material_index, - bool has_uvs, - bool has_color, - Object *ob, - Mesh *mesh, - std::string &geom_id, - std::vector &norind); - - /** Creates for positions. */ - void createVertsSource(std::string geom_id, Mesh *mesh); - - void createVertexColorSource(std::string geom_id, Mesh *mesh); - - std::string makeTexcoordSourceId(std::string &geom_id, int layer_index, bool is_single_layer); - - /** Creates for texture-coordinates. */ - void createTexcoordsSource(std::string geom_id, Mesh *mesh); - - /** Creates for normals. */ - void createNormalsSource(std::string geom_id, Mesh *mesh, std::vector &nor); - - void create_normals(std::vector &nor, - std::vector &polygons_normals, - Mesh *mesh); - - std::string getIdBySemantics(std::string geom_id, - COLLADASW::InputSemantic::Semantics type, - std::string other_suffix = ""); - std::string makeVertexColorSourceId(std::string &geom_id, const char *layer_name); - - COLLADASW::URI getUrlBySemantics(std::string geom_id, - COLLADASW::InputSemantic::Semantics type, - std::string other_suffix = ""); - - COLLADASW::URI makeUrl(std::string id); - - void export_key_mesh(Object *ob, Mesh *mesh, KeyBlock *kb); - - private: - std::set exportedGeometry; - BlenderContext &blender_context; - BCExportSettings &export_settings; - - Mesh *get_mesh(Scene *sce, Object *ob, int apply_modifiers); -}; - -struct GeometryFunctor { - /* f should have - * void operator()(Object *ob) */ - template - void forEachMeshObjectInExportSet(Scene *sce, Functor &f, LinkNode *export_set) - { - LinkNode *node; - for (node = export_set; node; node = node->next) { - Object *ob = (Object *)node->link; - if (ob->type == OB_MESH) { - f(ob); - } - } - } -}; diff --git a/source/blender/io/collada/ImageExporter.cpp b/source/blender/io/collada/ImageExporter.cpp deleted file mode 100644 index d917b108d47..00000000000 --- a/source/blender/io/collada/ImageExporter.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "COLLADABUURI.h" -#include "COLLADASWImage.h" - -#include "DNA_image_types.h" - -#include "BKE_image.hh" -#include "BKE_image_format.hh" -#include "BKE_library.hh" -#include "BKE_main.hh" - -#include "BLI_fileops.h" -#include "BLI_path_utils.hh" -#include "BLI_string.h" - -#include "IMB_imbuf_types.hh" - -#include "ImageExporter.h" - -ImagesExporter::ImagesExporter(COLLADASW::StreamWriter *sw, - BCExportSettings &export_settings, - KeyImageMap &key_image_map) - : COLLADASW::LibraryImages(sw), export_settings(export_settings), key_image_map(key_image_map) -{ - /* pass */ -} - -void ImagesExporter::export_UV_Image(Image *image, bool use_copies) -{ - std::string name(id_name(image)); - std::string translated_name(translate_id(name)); - - ImBuf *imbuf = BKE_image_acquire_ibuf(image, nullptr, nullptr); - if (!imbuf) { - fprintf(stderr, "Collada export: image does not exist:\n%s\n", image->filepath); - return; - } - - bool is_dirty = BKE_image_is_dirty(image); - - ImageFormatData imageFormat; - BKE_image_format_from_imbuf(&imageFormat, imbuf); - - short image_source = image->source; - bool is_generated = image_source == IMA_SRC_GENERATED; - bool is_packed = BKE_image_has_packedfile(image); - - char export_path[FILE_MAX]; - char source_path[FILE_MAX]; - char export_dir[FILE_MAX]; - char export_file[FILE_MAX]; - - /* Destination folder for exported assets */ - BLI_path_split_dir_part(this->export_settings.get_filepath(), export_dir, sizeof(export_dir)); - - if (is_generated || is_dirty || use_copies || is_packed) { - - /* make absolute destination path */ - - STRNCPY(export_file, name.c_str()); - BKE_image_path_ext_from_imformat_ensure(export_file, sizeof(export_file), &imageFormat); - - BLI_path_join(export_path, sizeof(export_path), export_dir, export_file); - - BLI_file_ensure_parent_dir_exists(export_path); - } - - if (is_generated || is_dirty || is_packed) { - - /* This image in its current state only exists in Blender memory. - * So we have to export it. The export will keep the image state intact, - * so the exported file will not be associated with the image. */ - - if (BKE_imbuf_write_as(imbuf, export_path, &imageFormat, true) == false) { - fprintf(stderr, "Collada export: Cannot export image to:\n%s\n", export_path); - return; - } - STRNCPY(export_path, export_file); - } - else { - - /* make absolute source path */ - STRNCPY(source_path, image->filepath); - BLI_path_abs(source_path, ID_BLEND_PATH_FROM_GLOBAL(&image->id)); - BLI_path_normalize(source_path); - - if (use_copies) { - - /* This image is already located on the file system. - * But we want to create copies here. - * To move images into the same export directory. - * NOTE: If an image is already located in the export folder, - * then skip the copy (as it would result in a file copy error). */ - - if (BLI_path_cmp(source_path, export_path) != 0) { - if (BLI_copy(source_path, export_path) != 0) { - fprintf(stderr, - "Collada export: Cannot copy image:\n source:%s\ndest :%s\n", - source_path, - export_path); - return; - } - } - - STRNCPY(export_path, export_file); - } - else { - - /* Do not make any copies, but use the source path directly as reference - * to the original image */ - - STRNCPY(export_path, source_path); - } - } - - /* Set name also to mNameNC. - * This helps other viewers import files exported from Blender better. */ - COLLADASW::Image img(COLLADABU::URI(COLLADABU::URI::nativePathToUri(export_path)), - translated_name, - translated_name); - img.add(mSW); - fprintf(stdout, "Collada export: Added image: %s\n", export_file); - - BKE_image_release_ibuf(image, imbuf, nullptr); -} - -void ImagesExporter::exportImages(Scene *sce) -{ - bool use_texture_copies = this->export_settings.get_use_texture_copies(); - openLibrary(); - - KeyImageMap::iterator iter; - for (iter = key_image_map.begin(); iter != key_image_map.end(); iter++) { - - Image *image = iter->second; - export_UV_Image(image, use_texture_copies); - } - - closeLibrary(); -} diff --git a/source/blender/io/collada/ImageExporter.h b/source/blender/io/collada/ImageExporter.h deleted file mode 100644 index fc369fe063b..00000000000 --- a/source/blender/io/collada/ImageExporter.h +++ /dev/null @@ -1,31 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "COLLADASWLibraryImages.h" -#include "COLLADASWStreamWriter.h" - -#include "DNA_image_types.h" -#include "DNA_scene_types.h" - -#include "ExportSettings.h" -#include "collada_utils.h" - -class ImagesExporter : COLLADASW::LibraryImages { - public: - ImagesExporter(COLLADASW::StreamWriter *sw, - BCExportSettings &export_settings, - KeyImageMap &key_image_map); - void exportImages(Scene *sce); - - private: - BCExportSettings &export_settings; - KeyImageMap &key_image_map; - void export_UV_Image(Image *image, bool use_copies); -}; diff --git a/source/blender/io/collada/ImportSettings.cpp b/source/blender/io/collada/ImportSettings.cpp deleted file mode 100644 index fd511c3dc25..00000000000 --- a/source/blender/io/collada/ImportSettings.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* SPDX-FileCopyrightText: 2002-2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "ImportSettings.h" diff --git a/source/blender/io/collada/ImportSettings.h b/source/blender/io/collada/ImportSettings.h deleted file mode 100644 index 21f0eedec89..00000000000 --- a/source/blender/io/collada/ImportSettings.h +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -struct ImportSettings { - bool import_units; - bool custom_normals; - bool find_chains; - bool auto_connect; - bool fix_orientation; - int min_chain_length; - char *filepath; - bool keep_bind_info; -}; diff --git a/source/blender/io/collada/InstanceWriter.cpp b/source/blender/io/collada/InstanceWriter.cpp deleted file mode 100644 index da0b6d4e5f6..00000000000 --- a/source/blender/io/collada/InstanceWriter.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include -#include - -#include "COLLADASWInstanceMaterial.h" - -#include "BKE_customdata.hh" -#include "BKE_material.hh" - -#include "DNA_mesh_types.h" - -#include "InstanceWriter.h" -#include "collada_internal.h" -#include "collada_utils.h" - -void InstanceWriter::add_material_bindings(COLLADASW::BindMaterial &bind_material, - Object *ob, - bool active_uv_only) -{ - for (int a = 0; a < ob->totcol; a++) { - Material *ma = BKE_object_material_get(ob, a + 1); - - COLLADASW::InstanceMaterialList &iml = bind_material.getInstanceMaterialList(); - - if (ma) { - std::string matid(get_material_id(ma)); - matid = translate_id(matid); - std::ostringstream ostr; - ostr << matid; - COLLADASW::InstanceMaterial im(ostr.str(), - COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, matid)); - - /* Create for each uv map. */ - Mesh *mesh = (Mesh *)ob->data; - - int num_layers = CustomData_number_of_layers(&mesh->corner_data, CD_PROP_FLOAT2); - - int map_index = 0; - int active_uv_index = CustomData_get_active_layer_index(&mesh->corner_data, CD_PROP_FLOAT2); - for (int b = 0; b < num_layers; b++) { - if (!active_uv_only || b == active_uv_index) { - const char *name = bc_CustomData_get_layer_name(&mesh->corner_data, CD_PROP_FLOAT2, b); - im.push_back(COLLADASW::BindVertexInput(name, "TEXCOORD", map_index++)); - } - } - - iml.push_back(im); - } - } -} diff --git a/source/blender/io/collada/InstanceWriter.h b/source/blender/io/collada/InstanceWriter.h deleted file mode 100644 index 7c0076a60bb..00000000000 --- a/source/blender/io/collada/InstanceWriter.h +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "COLLADASWBindMaterial.h" - -#include "DNA_object_types.h" - -class InstanceWriter { - protected: - void add_material_bindings(COLLADASW::BindMaterial &bind_material, - Object *ob, - bool active_uv_only); -}; diff --git a/source/blender/io/collada/LightExporter.cpp b/source/blender/io/collada/LightExporter.cpp deleted file mode 100644 index 4570782067c..00000000000 --- a/source/blender/io/collada/LightExporter.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include - -#include "COLLADASWColor.h" -#include "COLLADASWLight.h" - -#include "DNA_light_types.h" -#include "LightExporter.h" -#include "collada_internal.h" - -#include "BKE_light.h" - -template -void forEachLightObjectInExportSet(Scene *sce, Functor &f, LinkNode *export_set) -{ - LinkNode *node; - for (node = export_set; node; node = node->next) { - Object *ob = (Object *)node->link; - - if (ob->type == OB_LAMP && ob->data) { - f(ob); - } - } -} - -LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw, BCExportSettings &export_settings) - : COLLADASW::LibraryLights(sw), export_settings(export_settings) -{ -} - -void LightsExporter::exportLights(Scene *sce) -{ - openLibrary(); - - forEachLightObjectInExportSet(sce, *this, this->export_settings.get_export_set()); - - closeLibrary(); -} - -void LightsExporter::operator()(Object *ob) -{ - Light *la = (Light *)ob->data; - std::string la_id(get_light_id(ob)); - std::string la_name(id_name(la)); - blender::float3 color = BKE_light_power(*la) * BKE_light_color(*la); - if (la->mode & LA_UNNORMALIZED) { - color *= BKE_light_area(*la, ob->runtime->object_to_world); - } - COLLADASW::Color col(color[0], color[1], color[2]); - - /* sun */ - if (la->type == LA_SUN) { - COLLADASW::DirectionalLight cla(mSW, la_id, la_name); - cla.setColor(col, false, "color"); - exportBlenderProfile(cla, la); - addLight(cla); - } - - /* spot */ - else if (la->type == LA_SPOT) { - COLLADASW::SpotLight cla(mSW, la_id, la_name); - cla.setColor(col, false, "color"); - cla.setFallOffAngle(RAD2DEGF(la->spotsize), false, "fall_off_angle"); - cla.setFallOffExponent(la->spotblend, false, "fall_off_exponent"); - exportBlenderProfile(cla, la); - addLight(cla); - } - /* lamp */ - else if (la->type == LA_LOCAL) { - COLLADASW::PointLight cla(mSW, la_id, la_name); - cla.setColor(col, false, "color"); - exportBlenderProfile(cla, la); - addLight(cla); - } - /* area light is not supported - * it will be exported as a local lamp */ - else { - COLLADASW::PointLight cla(mSW, la_id, la_name); - cla.setColor(col, false, "color"); - exportBlenderProfile(cla, la); - addLight(cla); - } -} - -bool LightsExporter::exportBlenderProfile(COLLADASW::Light &cla, Light *la) -{ - cla.addExtraTechniqueParameter("blender", "type", la->type); - cla.addExtraTechniqueParameter("blender", "flag", la->flag); - cla.addExtraTechniqueParameter("blender", "mode", la->mode); - cla.addExtraTechniqueParameter("blender", "red", la->r); - cla.addExtraTechniqueParameter("blender", "green", la->g); - cla.addExtraTechniqueParameter("blender", "blue", la->b); - cla.addExtraTechniqueParameter("blender", "energy", la->energy, "blender_energy"); - cla.addExtraTechniqueParameter("blender", "spotsize", RAD2DEGF(la->spotsize)); - cla.addExtraTechniqueParameter("blender", "spotblend", la->spotblend); - cla.addExtraTechniqueParameter("blender", "clipsta", la->clipsta); - cla.addExtraTechniqueParameter("blender", "clipend", la->att_dist); - cla.addExtraTechniqueParameter("blender", "radius", la->radius); - cla.addExtraTechniqueParameter("blender", "area_shape", la->area_shape); - cla.addExtraTechniqueParameter("blender", "area_size", la->area_size); - cla.addExtraTechniqueParameter("blender", "area_sizey", la->area_sizey); - cla.addExtraTechniqueParameter("blender", "area_sizez", la->area_sizez); - - return true; -} diff --git a/source/blender/io/collada/LightExporter.h b/source/blender/io/collada/LightExporter.h deleted file mode 100644 index f9238de30f0..00000000000 --- a/source/blender/io/collada/LightExporter.h +++ /dev/null @@ -1,29 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "COLLADASWLibraryLights.h" -#include "COLLADASWStreamWriter.h" - -#include "DNA_light_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "ExportSettings.h" - -class LightsExporter : COLLADASW::LibraryLights { - public: - LightsExporter(COLLADASW::StreamWriter *sw, BCExportSettings &export_settings); - void exportLights(Scene *sce); - void operator()(Object *ob); - - private: - bool exportBlenderProfile(COLLADASW::Light &cla, Light *la); - BCExportSettings &export_settings; -}; diff --git a/source/blender/io/collada/MaterialExporter.cpp b/source/blender/io/collada/MaterialExporter.cpp deleted file mode 100644 index 66d602df181..00000000000 --- a/source/blender/io/collada/MaterialExporter.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* SPDX-FileCopyrightText: 2002-2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "MaterialExporter.h" -#include "COLLADABUUtils.h" -#include "collada_internal.h" - -MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw, - BCExportSettings &export_settings) - : COLLADASW::LibraryMaterials(sw), export_settings(export_settings) -{ - /* pass */ -} - -void MaterialsExporter::exportMaterials(Scene *sce) -{ - if (hasMaterials(sce)) { - openLibrary(); - - MaterialFunctor mf; - mf.forEachMaterialInExportSet( - sce, *this, this->export_settings.get_export_set()); - - closeLibrary(); - } -} - -bool MaterialsExporter::hasMaterials(Scene *sce) -{ - LinkNode *node; - for (node = this->export_settings.get_export_set(); node; node = node->next) { - Object *ob = (Object *)node->link; - int a; - for (a = 0; a < ob->totcol; a++) { - Material *ma = BKE_object_material_get(ob, a + 1); - - /* no material, but check all of the slots */ - if (!ma) { - continue; - } - - return true; - } - } - return false; -} - -void MaterialsExporter::operator()(Material *ma, Object *ob) -{ - std::string mat_name = encode_xml(id_name(ma)); - std::string mat_id = get_material_id(ma); - std::string eff_id = get_effect_id(ma); - - openMaterial(mat_id, mat_name); - addInstanceEffect(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, eff_id)); - - closeMaterial(); -} diff --git a/source/blender/io/collada/MaterialExporter.h b/source/blender/io/collada/MaterialExporter.h deleted file mode 100644 index 922dfe607ec..00000000000 --- a/source/blender/io/collada/MaterialExporter.h +++ /dev/null @@ -1,79 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include -#include - -#include "COLLADASWLibraryMaterials.h" -#include "COLLADASWStreamWriter.h" - -#include "BKE_material.hh" - -#include "DNA_material_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "ExportSettings.h" -#include "GeometryExporter.h" -#include "collada_internal.h" - -class MaterialsExporter : COLLADASW::LibraryMaterials { - public: - MaterialsExporter(COLLADASW::StreamWriter *sw, BCExportSettings &export_settings); - void exportMaterials(Scene *sce); - void operator()(Material *ma, Object *ob); - - private: - bool hasMaterials(Scene *sce); - BCExportSettings &export_settings; -}; - -/* Used in `forEachMaterialInScene`. */ -template class ForEachMaterialFunctor { - std::vector - mMat; /* contains list of material names, to avoid duplicate calling of f */ - Functor *f; - - public: - ForEachMaterialFunctor(Functor *f) : f(f) {} - - void operator()(Object *ob) - { - int a; - for (a = 0; a < ob->totcol; a++) { - - Material *ma = BKE_object_material_get(ob, a + 1); - - if (!ma) { - continue; - } - - std::string translated_id = translate_id(id_name(ma)); - if (find(mMat.begin(), mMat.end(), translated_id) == mMat.end()) { - (*this->f)(ma, ob); - - mMat.push_back(translated_id); - } - } - } -}; - -struct MaterialFunctor { - /* calls f for each unique material linked to each object in sce - * f should have */ - // void operator()(Material *ma) - template - void forEachMaterialInExportSet(Scene *sce, Functor &f, LinkNode *export_set) - { - ForEachMaterialFunctor matfunc(&f); - GeometryFunctor gf; - gf.forEachMeshObjectInExportSet>(sce, matfunc, export_set); - } -}; diff --git a/source/blender/io/collada/Materials.cpp b/source/blender/io/collada/Materials.cpp deleted file mode 100644 index fa18cac1946..00000000000 --- a/source/blender/io/collada/Materials.cpp +++ /dev/null @@ -1,447 +0,0 @@ -/* SPDX-FileCopyrightText: 2018-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "Materials.h" - -#include "BLI_listbase.h" -#include "BLI_string.h" - -#include "BKE_node.hh" -#include "BKE_node_legacy_types.hh" -#include "BKE_node_runtime.hh" -#include "BKE_node_tree_update.hh" - -MaterialNode::MaterialNode(bContext *C, Material *ma, KeyImageMap &key_image_map) - : mContext(C), material(ma), effect(nullptr), key_image_map(&key_image_map) -{ - bNodeTree *new_ntree = prepare_material_nodetree(); - setShaderType(); - if (new_ntree) { - shader_node = add_node(SH_NODE_BSDF_PRINCIPLED, 0, 300, ""); - output_node = add_node(SH_NODE_OUTPUT_MATERIAL, 300, 300, ""); - add_link(shader_node, 0, output_node, 0); - } -} - -MaterialNode::MaterialNode(bContext *C, - COLLADAFW::EffectCommon *ef, - Material *ma, - UidImageMap &uid_image_map) - : mContext(C), material(ma), effect(ef), uid_image_map(&uid_image_map) -{ - prepare_material_nodetree(); - setShaderType(); - - std::map nmap; -#if 0 - nmap["main"] = add_node(C, ntree, SH_NODE_BSDF_PRINCIPLED, -300, 300); - nmap["emission"] = add_node(C, ntree, SH_NODE_EMISSION, -300, 500, "emission"); - nmap["add"] = add_node(C, ntree, SH_NODE_ADD_SHADER, 100, 400); - nmap["transparent"] = add_node(C, ntree, SH_NODE_BSDF_TRANSPARENT, 100, 200); - nmap["mix"] = add_node(C, ntree, SH_NODE_MIX_SHADER, 400, 300, "transparency"); - nmap["out"] = add_node(C, ntree, SH_NODE_OUTPUT_MATERIAL, 600, 300); - nmap["out"]->flag &= ~NODE_SELECT; - - add_link(ntree, nmap["emission"], 0, nmap["add"], 0); - add_link(ntree, nmap["main"], 0, nmap["add"], 1); - add_link(ntree, nmap["add"], 0, nmap["mix"], 1); - add_link(ntree, nmap["transparent"], 0, nmap["mix"], 2); - - add_link(ntree, nmap["mix"], 0, nmap["out"], 0); - /* experimental, probably not used. */ - make_group(C, ntree, nmap); -#else - shader_node = add_node(SH_NODE_BSDF_PRINCIPLED, 0, 300, ""); - output_node = add_node(SH_NODE_OUTPUT_MATERIAL, 300, 300, ""); - add_link(shader_node, 0, output_node, 0); -#endif -} - -void MaterialNode::setShaderType() -{ -#if 0 - COLLADAFW::EffectCommon::ShaderType shader = ef->getShaderType(); - /* Currently we only support PBR based shaders */ - /* TODO: simulate the effects with PBR */ - - /* blinn */ - if (shader == COLLADAFW::EffectCommon::SHADER_BLINN) { - ma->spec_shader = MA_SPEC_BLINN; - ma->spec = ef->getShininess().getFloatValue(); - } - /* phong */ - else if (shader == COLLADAFW::EffectCommon::SHADER_PHONG) { - ma->spec_shader = MA_SPEC_PHONG; - ma->har = ef->getShininess().getFloatValue(); - } - /* lambert */ - else if (shader == COLLADAFW::EffectCommon::SHADER_LAMBERT) { - ma->diff_shader = MA_DIFF_LAMBERT; - } - /* default - lambert */ - else { - ma->diff_shader = MA_DIFF_LAMBERT; - fprintf(stderr, "Current shader type is not supported, default to lambert.\n"); - } -#endif -} - -bNodeTree *MaterialNode::prepare_material_nodetree() -{ - if (material->nodetree) { - ntree = material->nodetree; - return nullptr; - } - - blender::bke::node_tree_add_tree_embedded( - nullptr, &material->id, "Shader Nodetree", "ShaderNodeTree"); - material->use_nodes = true; - ntree = material->nodetree; - return ntree; -} - -void MaterialNode::update_material_nodetree() -{ - BKE_ntree_update_after_single_tree_change(*CTX_data_main(mContext), *ntree); -} - -bNode *MaterialNode::add_node(int node_type, int locx, int locy, std::string label) -{ - bNode *node = blender::bke::node_add_static_node(mContext, *ntree, node_type); - if (node) { - if (label.length() > 0) { - STRNCPY(node->label, label.c_str()); - } - node->location[0] = locx; - node->location[1] = locy; - node->flag |= NODE_SELECT; - } - node_map[label] = node; - return node; -} - -void MaterialNode::add_link(bNode *from_node, int from_index, bNode *to_node, int to_index) -{ - bNodeSocket *from_socket = (bNodeSocket *)BLI_findlink(&from_node->outputs, from_index); - bNodeSocket *to_socket = (bNodeSocket *)BLI_findlink(&to_node->inputs, to_index); - - blender::bke::node_add_link(*ntree, *from_node, *from_socket, *to_node, *to_socket); -} - -void MaterialNode::add_link(bNode *from_node, - const char *from_label, - bNode *to_node, - const char *to_label) -{ - bNodeSocket *from_socket = blender::bke::node_find_socket(*from_node, SOCK_OUT, from_label); - bNodeSocket *to_socket = blender::bke::node_find_socket(*to_node, SOCK_IN, to_label); - - if (from_socket && to_socket) { - blender::bke::node_add_link(*ntree, *from_node, *from_socket, *to_node, *to_socket); - } -} - -void MaterialNode::set_reflectivity(COLLADAFW::FloatOrParam &val) -{ - float reflectivity = val.getFloatValue(); - if (reflectivity >= 0) { - bNodeSocket *socket = blender::bke::node_find_socket(*shader_node, SOCK_IN, "Metallic"); - ((bNodeSocketValueFloat *)socket->default_value)->value = reflectivity; - material->metallic = reflectivity; - } -} - -#if 0 -/* needs rework to be done for 2.81 */ -void MaterialNode::set_shininess(COLLADAFW::FloatOrParam &val) -{ - float roughness = val.getFloatValue(); - if (roughness >= 0) { - bNodeSocket *socket = blender::bke::node_find_socket(*shader_node, SOCK_IN, "Roughness"); - ((bNodeSocketValueFloat *)socket->default_value)->value = roughness; - } -} -#endif - -void MaterialNode::set_ior(COLLADAFW::FloatOrParam &val) -{ - float ior = val.getFloatValue(); - if (ior < 0) { - fprintf(stderr, - "IOR of negative value is not allowed for materials (using Blender default value " - "instead)\n"); - return; - } - - bNodeSocket *socket = blender::bke::node_find_socket(*shader_node, SOCK_IN, "IOR"); - ((bNodeSocketValueFloat *)socket->default_value)->value = ior; -} - -void MaterialNode::set_alpha(COLLADAFW::EffectCommon::OpaqueMode mode, - COLLADAFW::ColorOrTexture &cot, - COLLADAFW::FloatOrParam &val) -{ - /* Handling the alpha value according to the Collada 1.4 reference guide - * see page 7-5 Determining Transparency (Opacity). */ - - if (effect == nullptr) { - return; - } - - if (cot.isColor() || !cot.isValid()) { - /* transparent_cot is either a color or not defined */ - - float transparent_alpha; - if (cot.isValid()) { - COLLADAFW::Color col = cot.getColor(); - transparent_alpha = col.getAlpha(); - } - else { - /* no transparent color defined */ - transparent_alpha = 1; - } - - float transparency_alpha = val.getFloatValue(); - if (transparency_alpha < 0) { - /* transparency is not defined */ - transparency_alpha = 1; /* set to opaque */ - } - - float alpha = transparent_alpha * transparency_alpha; - if (mode == COLLADAFW::EffectCommon::RGB_ZERO) { - alpha = 1 - alpha; - } - - bNodeSocket *socket = blender::bke::node_find_socket(*shader_node, SOCK_IN, "Alpha"); - ((bNodeSocketValueFloat *)socket->default_value)->value = alpha; - material->a = alpha; - } - else if (cot.isTexture()) { - int locy = -300 * (node_map.size() - 2); - add_texture_node(cot, -300, locy, "Alpha"); - } -} - -void MaterialNode::set_diffuse(COLLADAFW::ColorOrTexture &cot) -{ - int locy = -300 * (node_map.size() - 2); - - if (cot.isTexture()) { - bNode *texture_node = add_texture_node(cot, -300, locy, "Base Color"); - if (texture_node != nullptr) { - add_link(texture_node, 0, shader_node, 0); - } - } - else { - bNodeSocket *socket = blender::bke::node_find_socket(*shader_node, SOCK_IN, "Base Color"); - float *fcol = (float *)socket->default_value; - - if (cot.isColor()) { - COLLADAFW::Color col = cot.getColor(); - fcol[0] = material->r = col.getRed(); - fcol[1] = material->g = col.getGreen(); - fcol[2] = material->b = col.getBlue(); - fcol[3] = material->a = col.getAlpha(); - } - else { - /* no diffuse term = same as black */ - fcol[0] = material->r = 0.0f; - fcol[1] = material->g = 0.0f; - fcol[2] = material->b = 0.0f; - fcol[3] = material->a = 1.0f; - } - } -} - -Image *MaterialNode::get_diffuse_image() -{ - ntree->ensure_topology_cache(); - const blender::Span nodes = ntree->nodes_by_type("ShaderNodeBsdfPrincipled"); - if (nodes.is_empty()) { - return nullptr; - } - const bNode *shader = nodes.first(); - - const bNodeSocket *in_socket = blender::bke::node_find_socket(*shader, SOCK_IN, "Base Color"); - if (in_socket == nullptr) { - return nullptr; - } - - const bNodeLink *link = in_socket->link; - if (link == nullptr) { - return nullptr; - } - - const bNode *texture = link->fromnode; - if (texture == nullptr) { - return nullptr; - } - - if (texture->type_legacy != SH_NODE_TEX_IMAGE) { - return nullptr; - } - - Image *image = (Image *)texture->id; - return image; -} - -static bNodeSocket *set_color(bNode *node, COLLADAFW::Color col) -{ - bNodeSocket *socket = (bNodeSocket *)BLI_findlink(&node->outputs, 0); - float *fcol = (float *)socket->default_value; - fcol[0] = col.getRed(); - fcol[1] = col.getGreen(); - fcol[2] = col.getBlue(); - - return socket; -} - -void MaterialNode::set_ambient(COLLADAFW::ColorOrTexture &cot) -{ - int locy = -300 * (node_map.size() - 2); - if (cot.isColor()) { - COLLADAFW::Color col = cot.getColor(); - bNode *node = add_node(SH_NODE_RGB, -300, locy, "Ambient"); - set_color(node, col); - /* TODO: Connect node */ - } - /* texture */ - else if (cot.isTexture()) { - add_texture_node(cot, -300, locy, "Ambient"); - /* TODO: Connect node */ - } -} - -void MaterialNode::set_reflective(COLLADAFW::ColorOrTexture &cot) -{ - int locy = -300 * (node_map.size() - 2); - if (cot.isColor()) { - COLLADAFW::Color col = cot.getColor(); - bNode *node = add_node(SH_NODE_RGB, -300, locy, "Reflective"); - set_color(node, col); - /* TODO: Connect node */ - } - /* texture */ - else if (cot.isTexture()) { - add_texture_node(cot, -300, locy, "Reflective"); - /* TODO: Connect node */ - } -} - -void MaterialNode::set_emission(COLLADAFW::ColorOrTexture &cot) -{ - int locy = -300 * (node_map.size() - 2); - if (cot.isColor()) { - COLLADAFW::Color col = cot.getColor(); - bNodeSocket *socket = blender::bke::node_find_socket(*shader_node, SOCK_IN, "Emission Color"); - float *fcol = (float *)socket->default_value; - - fcol[0] = col.getRed(); - fcol[1] = col.getGreen(); - fcol[2] = col.getBlue(); - fcol[3] = col.getAlpha(); - } - // texture - else if (cot.isTexture()) { - bNode *texture_node = add_texture_node(cot, -300, locy, "Emission Color"); - if (texture_node != nullptr) { - add_link(texture_node, "Color", shader_node, "Emission Color"); - } - } - - bNodeSocket *socket = blender::bke::node_find_socket(*shader_node, SOCK_IN, "Emission Strength"); - if (socket) { - *(float *)socket->default_value = 1.0f; - } -} - -void MaterialNode::set_opacity(COLLADAFW::ColorOrTexture &cot) -{ - if (effect == nullptr) { - return; - } - - int locy = -300 * (node_map.size() - 2); - if (cot.isColor()) { - COLLADAFW::Color col = effect->getTransparent().getColor(); - float alpha = effect->getTransparency().getFloatValue(); - - if (col.isValid()) { - alpha *= col.getAlpha(); /* Assuming A_ONE opaque mode */ - } - - bNodeSocket *socket = blender::bke::node_find_socket(*shader_node, SOCK_IN, "Alpha"); - ((bNodeSocketValueFloat *)socket->default_value)->value = alpha; - } - /* texture */ - else if (cot.isTexture()) { - add_texture_node(cot, -300, locy, "Alpha"); - /* TODO: Connect node */ - } -} - -void MaterialNode::set_specular(COLLADAFW::ColorOrTexture &cot) -{ - bool has_specularity = true; - int locy = -300 * (node_map.size() - 2); - if (cot.isColor()) { - COLLADAFW::Color col = cot.getColor(); - - if (col.getRed() == 0 && col.getGreen() == 0 && col.getBlue() == 0) { - has_specularity = false; - } - else { - bNode *node = add_node(SH_NODE_RGB, -300, locy, "Specular IOR Level"); - set_color(node, col); - /* TODO: Connect node */ - } - } - else if (cot.isTexture()) { - add_texture_node(cot, -300, locy, "Specular IOR Level"); - /* TODO: Connect node */ - } - else { - /* no specular term) */ - has_specularity = false; - } - - if (!has_specularity) { - /* If specularity is black or not defined reset the Specular value to 0 - * TODO: This is a solution only for a corner case. We must find a better - * way to handle specularity in general. Also note that currently we - * do not export specularity values, see EffectExporter::operator() */ - bNodeSocket *socket = blender::bke::node_find_socket( - *shader_node, SOCK_IN, "Specular IOR Level"); - ((bNodeSocketValueFloat *)socket->default_value)->value = 0.0f; - } -} - -bNode *MaterialNode::add_texture_node(COLLADAFW::ColorOrTexture &cot, - int locx, - int locy, - std::string label) -{ - if (effect == nullptr) { - return nullptr; - } - - UidImageMap &image_map = *uid_image_map; - - COLLADAFW::Texture ctex = cot.getTexture(); - - COLLADAFW::SamplerPointerArray &samp_array = effect->getSamplerPointerArray(); - COLLADAFW::Sampler *sampler = samp_array[ctex.getSamplerId()]; - - const COLLADAFW::UniqueId &ima_uid = sampler->getSourceImage(); - - if (image_map.find(ima_uid) == image_map.end()) { - fprintf(stderr, "Couldn't find an image by UID.\n"); - return nullptr; - } - - Image *ima = image_map[ima_uid]; - bNode *texture_node = add_node(SH_NODE_TEX_IMAGE, locx, locy, label); - texture_node->id = &ima->id; - return texture_node; -} diff --git a/source/blender/io/collada/Materials.h b/source/blender/io/collada/Materials.h deleted file mode 100644 index e9ae62e5273..00000000000 --- a/source/blender/io/collada/Materials.h +++ /dev/null @@ -1,62 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include -#include - -#include "BKE_context.hh" -#include "BKE_node.hh" -#include "DNA_material_types.h" -#include "DNA_node_types.h" - -#include "COLLADAFWEffectCommon.h" -#include "collada_utils.h" - -using NodeMap = std::map; - -class MaterialNode { - - private: - bContext *mContext; - Material *material; - COLLADAFW::EffectCommon *effect; - UidImageMap *uid_image_map = nullptr; - KeyImageMap *key_image_map = nullptr; - - NodeMap node_map; - bNodeTree *ntree; - - bNode *shader_node; - bNode *output_node; - - /** Returns null if material already has a node tree. */ - bNodeTree *prepare_material_nodetree(); - bNode *add_node(int node_type, int locx, int locy, std::string label); - void add_link(bNode *from_node, int from_index, bNode *to_node, int to_index); - void add_link(bNode *from_node, const char *from_label, bNode *to_node, const char *to_label); - bNode *add_texture_node(COLLADAFW::ColorOrTexture &cot, int locx, int locy, std::string label); - void setShaderType(); - - public: - MaterialNode(bContext *C, COLLADAFW::EffectCommon *ef, Material *ma, UidImageMap &uid_image_map); - MaterialNode(bContext *C, Material *ma, KeyImageMap &key_image_map); - Image *get_diffuse_image(); - - void set_diffuse(COLLADAFW::ColorOrTexture &cot); - void set_specular(COLLADAFW::ColorOrTexture &cot); - void set_ambient(COLLADAFW::ColorOrTexture &cot); - void set_reflective(COLLADAFW::ColorOrTexture &cot); - void set_emission(COLLADAFW::ColorOrTexture &cot); - void set_opacity(COLLADAFW::ColorOrTexture &cot); - void set_reflectivity(COLLADAFW::FloatOrParam &val); - void set_shininess(COLLADAFW::FloatOrParam &val); - void set_ior(COLLADAFW::FloatOrParam &val); - void set_alpha(COLLADAFW::EffectCommon::OpaqueMode mode, - COLLADAFW::ColorOrTexture &cot, - COLLADAFW::FloatOrParam &val); - - void update_material_nodetree(); -}; diff --git a/source/blender/io/collada/MeshImporter.cpp b/source/blender/io/collada/MeshImporter.cpp deleted file mode 100644 index e180cd7480a..00000000000 --- a/source/blender/io/collada/MeshImporter.cpp +++ /dev/null @@ -1,1184 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include - -#include "COLLADAFWMeshPrimitive.h" -#include "COLLADAFWMeshVertexData.h" -#include "COLLADAFWPolygons.h" - -#include "BKE_attribute.hh" -#include "BKE_customdata.hh" -#include "BKE_global.hh" -#include "BKE_lib_id.hh" -#include "BKE_material.hh" -#include "BKE_mesh.hh" -#include "BKE_mesh_runtime.hh" -#include "BKE_object.hh" - -#include "DNA_meshdata_types.h" - -#include "ArmatureImporter.h" -#include "MeshImporter.h" -#include "collada_utils.h" - -using blender::float3; -using blender::MutableSpan; - -/* get node name, or fall back to original id if not present (name is optional) */ -template static std::string bc_get_dae_name(T *node) -{ - return node->getName().empty() ? node->getOriginalId() : node->getName(); -} - -static const char *bc_primTypeToStr(COLLADAFW::MeshPrimitive::PrimitiveType type) -{ - switch (type) { - case COLLADAFW::MeshPrimitive::LINES: - return "LINES"; - case COLLADAFW::MeshPrimitive::LINE_STRIPS: - return "LINESTRIPS"; - case COLLADAFW::MeshPrimitive::POLYGONS: - return "POLYGONS"; - case COLLADAFW::MeshPrimitive::POLYLIST: - return "POLYLIST"; - case COLLADAFW::MeshPrimitive::TRIANGLES: - return "TRIANGLES"; - case COLLADAFW::MeshPrimitive::TRIANGLE_FANS: - return "TRIANGLE_FANS"; - case COLLADAFW::MeshPrimitive::TRIANGLE_STRIPS: - return "TRIANGLE_STRIPS"; - case COLLADAFW::MeshPrimitive::POINTS: - return "POINTS"; - case COLLADAFW::MeshPrimitive::UNDEFINED_PRIMITIVE_TYPE: - return "UNDEFINED_PRIMITIVE_TYPE"; - } - return "UNKNOWN"; -} - -static const char *bc_geomTypeToStr(COLLADAFW::Geometry::GeometryType type) -{ - switch (type) { - case COLLADAFW::Geometry::GEO_TYPE_MESH: - return "MESH"; - case COLLADAFW::Geometry::GEO_TYPE_SPLINE: - return "SPLINE"; - case COLLADAFW::Geometry::GEO_TYPE_CONVEX_MESH: - return "CONVEX_MESH"; - case COLLADAFW::Geometry::GEO_TYPE_UNKNOWN: - default: - return "UNKNOWN"; - } -} - -UVDataWrapper::UVDataWrapper(COLLADAFW::MeshVertexData &vdata) : mVData(&vdata) {} - -#ifdef COLLADA_DEBUG -void WVDataWrapper::print() -{ - fprintf(stderr, "UVs:\n"); - switch (mVData->getType()) { - case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT: { - COLLADAFW::ArrayPrimitiveType *values = mVData->getFloatValues(); - if (values->getCount()) { - for (int i = 0; i < values->getCount(); i += 2) { - fprintf(stderr, "%.1f, %.1f\n", (*values)[i], (*values)[i + 1]); - } - } - break; - } - case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE: { - COLLADAFW::ArrayPrimitiveType *values = mVData->getDoubleValues(); - if (values->getCount()) { - for (int i = 0; i < values->getCount(); i += 2) { - fprintf(stderr, "%.1f, %.1f\n", float((*values)[i]), float((*values)[i + 1])); - } - } - break; - } - } - fprintf(stderr, "\n"); -} -#endif - -void UVDataWrapper::getUV(int uv_index, float *uv) -{ - int stride = mVData->getStride(0); - if (stride == 0) { - stride = 2; - } - - switch (mVData->getType()) { - case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT: { - COLLADAFW::ArrayPrimitiveType *values = mVData->getFloatValues(); - if (values->empty()) { - return; - } - uv[0] = (*values)[uv_index * stride]; - uv[1] = (*values)[uv_index * stride + 1]; - break; - } - case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE: { - COLLADAFW::ArrayPrimitiveType *values = mVData->getDoubleValues(); - if (values->empty()) { - return; - } - uv[0] = float((*values)[uv_index * stride]); - uv[1] = float((*values)[uv_index * stride + 1]); - break; - } - case COLLADAFW::MeshVertexData::DATA_TYPE_UNKNOWN: - default: - fprintf(stderr, "MeshImporter.getUV(): unknown data type\n"); - } -} - -VCOLDataWrapper::VCOLDataWrapper(COLLADAFW::MeshVertexData &vdata) : mVData(&vdata) {} - -template -static void colladaAddColor(T values, MLoopCol *mloopcol, int v_index, int stride) -{ - if (values->empty() || values->getCount() < (v_index + 1) * stride) { - fprintf(stderr, - "VCOLDataWrapper.getvcol(): Out of Bounds error: index %d points outside value " - "list of length %zd (with stride=%d) \n", - v_index, - values->getCount(), - stride); - return; - } - - mloopcol->r = unit_float_to_uchar_clamp((*values)[v_index * stride]); - mloopcol->g = unit_float_to_uchar_clamp((*values)[v_index * stride + 1]); - mloopcol->b = unit_float_to_uchar_clamp((*values)[v_index * stride + 2]); - if (stride == 4) { - mloopcol->a = unit_float_to_uchar_clamp((*values)[v_index * stride + 3]); - } -} - -void VCOLDataWrapper::get_vcol(int v_index, MLoopCol *mloopcol) -{ - int stride = mVData->getStride(0); - if (stride == 0) { - stride = 3; - } - - switch (mVData->getType()) { - case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT: { - COLLADAFW::ArrayPrimitiveType *values = mVData->getFloatValues(); - colladaAddColor *>(values, mloopcol, v_index, stride); - break; - } - case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE: { - COLLADAFW::ArrayPrimitiveType *values = mVData->getDoubleValues(); - colladaAddColor *>(values, mloopcol, v_index, stride); - break; - } - default: - fprintf(stderr, "VCOLDataWrapper.getvcol(): unknown data type\n"); - } -} - -MeshImporter::MeshImporter(UnitConverter *unitconv, - bool use_custom_normals, - ArmatureImporter *arm, - Main *bmain, - Scene *sce, - ViewLayer *view_layer) - : unitconverter(unitconv), - use_custom_normals(use_custom_normals), - m_bmain(bmain), - scene(sce), - view_layer(view_layer), - armature_importer(arm) -{ - /* pass */ -} - -bool MeshImporter::set_poly_indices(int *face_verts, - int loop_index, - const uint *indices, - int loop_count) -{ - bool broken_loop = false; - for (int index = 0; index < loop_count; index++) { - - /* Test if loop defines a hole */ - if (!broken_loop) { - for (int i = 0; i < index; i++) { - if (indices[i] == indices[index]) { - /* duplicate index -> not good */ - broken_loop = true; - } - } - } - - *face_verts = indices[index]; - face_verts++; - } - return broken_loop; -} - -void MeshImporter::set_vcol(MLoopCol *mloopcol, - VCOLDataWrapper &vob, - int loop_index, - COLLADAFW::IndexList &index_list, - int count) -{ - int index; - for (index = 0; index < count; index++, mloopcol++) { - int v_index = index_list.getIndex(index + loop_index); - vob.get_vcol(v_index, mloopcol); - } -} - -void MeshImporter::set_face_uv(blender::float2 *mloopuv, - UVDataWrapper &uvs, - int start_index, - COLLADAFW::IndexList &index_list, - int count) -{ - /* per face vertex indices, this means for quad we have 4 indices, not 8 */ - COLLADAFW::UIntValuesArray &indices = index_list.getIndices(); - - for (int index = 0; index < count; index++) { - int uv_index = indices[index + start_index]; - uvs.getUV(uv_index, mloopuv[index]); - } -} - -#ifdef COLLADA_DEBUG -void MeshImporter::print_index_list(COLLADAFW::IndexList &index_list) -{ - fprintf(stderr, "Index list for \"%s\":\n", index_list.getName().c_str()); - for (int i = 0; i < index_list.getIndicesCount(); i += 2) { - fprintf(stderr, "%u, %u\n", index_list.getIndex(i), index_list.getIndex(i + 1)); - } - fprintf(stderr, "\n"); -} -#endif - -bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh) -{ - COLLADAFW::MeshPrimitiveArray &prim_arr = mesh->getMeshPrimitives(); - - const std::string &name = bc_get_dae_name(mesh); - - for (uint i = 0; i < prim_arr.getCount(); i++) { - - COLLADAFW::MeshPrimitive *mp = prim_arr[i]; - COLLADAFW::MeshPrimitive::PrimitiveType type = mp->getPrimitiveType(); - - const char *type_str = bc_primTypeToStr(type); - - /* OpenCollada passes POLYGONS type for ``. */ - if (ELEM(type, COLLADAFW::MeshPrimitive::POLYLIST, COLLADAFW::MeshPrimitive::POLYGONS)) { - - COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons *)mp; - COLLADAFW::Polygons::VertexCountArray &vca = mpvc->getGroupedVerticesVertexCountArray(); - - int hole_count = 0; - int nonface_count = 0; - - for (uint j = 0; j < vca.getCount(); j++) { - int count = vca[j]; - if (abs(count) < 3) { - nonface_count++; - } - - if (count < 0) { - hole_count++; - } - } - - if (hole_count > 0) { - fprintf(stderr, - "WARNING: Primitive %s in %s: %d holes not imported (unsupported)\n", - type_str, - name.c_str(), - hole_count); - } - - if (nonface_count > 0) { - fprintf(stderr, - "WARNING: Primitive %s in %s: %d faces with vertex count < 3 (rejected)\n", - type_str, - name.c_str(), - nonface_count); - } - } - - else if (type == COLLADAFW::MeshPrimitive::LINES) { - /* TODO: Add Checker for line syntax here */ - } - - else if (!ELEM(type, - COLLADAFW::MeshPrimitive::TRIANGLES, - COLLADAFW::MeshPrimitive::TRIANGLE_FANS)) - { - fprintf(stderr, "ERROR: Primitive type %s is not supported.\n", type_str); - return false; - } - } - - return true; -} - -void MeshImporter::read_vertices(COLLADAFW::Mesh *mesh, Mesh *blender_mesh) -{ - /* vertices */ - COLLADAFW::MeshVertexData &pos = mesh->getPositions(); - if (pos.empty()) { - return; - } - - int stride = pos.getStride(0); - if (stride == 0) { - stride = 3; - } - - blender_mesh->verts_num = pos.getFloatValues()->getCount() / stride; - CustomData_add_layer_named( - &blender_mesh->vert_data, CD_PROP_FLOAT3, CD_CONSTRUCT, blender_mesh->verts_num, "position"); - MutableSpan positions = blender_mesh->vert_positions_for_write(); - for (const int i : positions.index_range()) { - get_vector(positions[i], pos, i, stride); - } -} - -bool MeshImporter::primitive_has_useable_normals(COLLADAFW::MeshPrimitive *mp) -{ - - bool has_useable_normals = false; - - int normals_count = mp->getNormalIndices().getCount(); - if (normals_count > 0) { - int index_count = mp->getPositionIndices().getCount(); - if (index_count == normals_count) { - has_useable_normals = true; - } - else { - fprintf(stderr, - "Warning: Number of normals %d is different from the number of vertices %d, " - "skipping normals\n", - normals_count, - index_count); - } - } - - return has_useable_normals; -} - -bool MeshImporter::primitive_has_faces(COLLADAFW::MeshPrimitive *mp) -{ - - bool has_faces = false; - int type = mp->getPrimitiveType(); - switch (type) { - case COLLADAFW::MeshPrimitive::TRIANGLES: - case COLLADAFW::MeshPrimitive::TRIANGLE_FANS: - case COLLADAFW::MeshPrimitive::POLYLIST: - case COLLADAFW::MeshPrimitive::POLYGONS: { - has_faces = true; - break; - } - default: { - has_faces = false; - break; - } - } - return has_faces; -} - -static std::string extract_vcolname(const COLLADAFW::String &collada_id) -{ - std::string colname = collada_id; - int spos = colname.find("-mesh-colors-"); - if (spos != std::string::npos) { - colname = colname.substr(spos + 13); - } - return colname; -} - -void MeshImporter::allocate_poly_data(COLLADAFW::Mesh *collada_mesh, Mesh *mesh) -{ - COLLADAFW::MeshPrimitiveArray &prim_arr = collada_mesh->getMeshPrimitives(); - int total_poly_count = 0; - int total_loop_count = 0; - - /* collect edge_count and face_count from all parts */ - for (int i = 0; i < prim_arr.getCount(); i++) { - COLLADAFW::MeshPrimitive *mp = prim_arr[i]; - int type = mp->getPrimitiveType(); - switch (type) { - case COLLADAFW::MeshPrimitive::TRIANGLES: - case COLLADAFW::MeshPrimitive::TRIANGLE_FANS: - case COLLADAFW::MeshPrimitive::POLYLIST: - case COLLADAFW::MeshPrimitive::POLYGONS: { - COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons *)mp; - size_t prim_poly_count = mpvc->getFaceCount(); - - size_t prim_loop_count = 0; - for (int index = 0; index < prim_poly_count; index++) { - int vcount = get_vertex_count(mpvc, index); - if (vcount > 0) { - prim_loop_count += vcount; - total_poly_count++; - } - else { - /* TODO: this is a hole and not another polygon! */ - } - } - - total_loop_count += prim_loop_count; - - break; - } - default: - break; - } - } - - /* Add the data containers */ - if (total_poly_count > 0) { - mesh->faces_num = total_poly_count; - mesh->corners_num = total_loop_count; - BKE_mesh_face_offsets_ensure_alloc(mesh); - CustomData_add_layer_named( - &mesh->corner_data, CD_PROP_INT32, CD_SET_DEFAULT, mesh->corners_num, ".corner_vert"); - - uint totuvset = collada_mesh->getUVCoords().getInputInfosArray().getCount(); - for (int i = 0; i < totuvset; i++) { - if (collada_mesh->getUVCoords().getLength(i) == 0) { - totuvset = 0; - break; - } - } - - if (totuvset > 0) { - for (int i = 0; i < totuvset; i++) { - COLLADAFW::MeshVertexData::InputInfos *info = - collada_mesh->getUVCoords().getInputInfosArray()[i]; - COLLADAFW::String &uvname = info->mName; - /* Allocate space for UV_data */ - CustomData_add_layer_named( - &mesh->corner_data, CD_PROP_FLOAT2, CD_SET_DEFAULT, mesh->corners_num, uvname); - } - /* activate the first uv map */ - CustomData_set_layer_active(&mesh->corner_data, CD_PROP_FLOAT2, 0); - } - - int totcolset = collada_mesh->getColors().getInputInfosArray().getCount(); - if (totcolset > 0) { - for (int i = 0; i < totcolset; i++) { - COLLADAFW::MeshVertexData::InputInfos *info = - collada_mesh->getColors().getInputInfosArray()[i]; - COLLADAFW::String colname = extract_vcolname(info->mName); - CustomData_add_layer_named( - &mesh->corner_data, CD_PROP_BYTE_COLOR, CD_SET_DEFAULT, mesh->corners_num, colname); - } - BKE_id_attributes_active_color_set( - &mesh->id, CustomData_get_layer_name(&mesh->corner_data, CD_PROP_BYTE_COLOR, 0)); - BKE_id_attributes_default_color_set( - &mesh->id, CustomData_get_layer_name(&mesh->corner_data, CD_PROP_BYTE_COLOR, 0)); - } - } -} - -uint MeshImporter::get_vertex_count(COLLADAFW::Polygons *mp, int index) -{ - int type = mp->getPrimitiveType(); - int result; - switch (type) { - case COLLADAFW::MeshPrimitive::TRIANGLES: - case COLLADAFW::MeshPrimitive::TRIANGLE_FANS: { - result = 3; - break; - } - case COLLADAFW::MeshPrimitive::POLYLIST: - case COLLADAFW::MeshPrimitive::POLYGONS: { - result = mp->getGroupedVerticesVertexCountArray()[index]; - break; - } - default: { - result = -1; - break; - } - } - return result; -} - -uint MeshImporter::get_loose_edge_count(COLLADAFW::Mesh *mesh) -{ - COLLADAFW::MeshPrimitiveArray &prim_arr = mesh->getMeshPrimitives(); - int loose_edge_count = 0; - - /* collect edge_count and face_count from all parts */ - for (int i = 0; i < prim_arr.getCount(); i++) { - COLLADAFW::MeshPrimitive *mp = prim_arr[i]; - int type = mp->getPrimitiveType(); - switch (type) { - case COLLADAFW::MeshPrimitive::LINES: { - size_t prim_totface = mp->getFaceCount(); - loose_edge_count += prim_totface; - break; - } - default: - break; - } - } - return loose_edge_count; -} - -void MeshImporter::mesh_add_edges(Mesh *mesh, int len) -{ - CustomData edge_data; - int totedge; - - if (len == 0) { - return; - } - - totedge = mesh->edges_num + len; - - /* Update custom-data. */ - CustomData_init_layout_from( - &mesh->edge_data, &edge_data, CD_MASK_MESH.emask, CD_SET_DEFAULT, totedge); - CustomData_copy_data(&mesh->edge_data, &edge_data, 0, 0, mesh->edges_num); - - if (!CustomData_has_layer_named(&edge_data, CD_PROP_INT32_2D, ".edge_verts")) { - CustomData_add_layer_named(&edge_data, CD_PROP_INT32_2D, CD_CONSTRUCT, totedge, ".edge_verts"); - } - - CustomData_free(&mesh->edge_data); - mesh->edge_data = edge_data; - - BKE_mesh_runtime_clear_cache(mesh); - - mesh->edges_num = totedge; -} - -void MeshImporter::read_lines(COLLADAFW::Mesh *mesh, Mesh *blender_mesh) -{ - uint loose_edge_count = get_loose_edge_count(mesh); - if (loose_edge_count > 0) { - - uint face_edge_count = blender_mesh->edges_num; - // uint total_edge_count = loose_edge_count + face_edge_count; /* UNUSED. */ - - mesh_add_edges(blender_mesh, loose_edge_count); - MutableSpan edges = blender_mesh->edges_for_write(); - blender::int2 *edge = edges.data() + face_edge_count; - - COLLADAFW::MeshPrimitiveArray &prim_arr = mesh->getMeshPrimitives(); - - for (int index = 0; index < prim_arr.getCount(); index++) { - COLLADAFW::MeshPrimitive *mp = prim_arr[index]; - - int type = mp->getPrimitiveType(); - if (type == COLLADAFW::MeshPrimitive::LINES) { - uint edge_count = mp->getFaceCount(); - uint *indices = mp->getPositionIndices().getData(); - - for (int j = 0; j < edge_count; j++, edge++) { - (*edge)[0] = indices[2 * j]; - (*edge)[1] = indices[2 * j + 1]; - } - } - } - } -} - -void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh, - Mesh *mesh, - blender::Vector &loop_normals) -{ - using namespace blender; - uint i; - - allocate_poly_data(collada_mesh, mesh); - - UVDataWrapper uvs(collada_mesh->getUVCoords()); - VCOLDataWrapper vcol(collada_mesh->getColors()); - - MutableSpan face_offsets = mesh->face_offsets_for_write(); - MutableSpan corner_verts = mesh->corner_verts_for_write(); - int face_index = 0; - int loop_index = 0; - - MaterialIdPrimitiveArrayMap mat_prim_map; - - bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); - bke::SpanAttributeWriter material_indices = attributes.lookup_or_add_for_write_span( - "material_index", bke::AttrDomain::Face); - bke::SpanAttributeWriter sharp_faces = attributes.lookup_or_add_for_write_span( - "sharp_face", bke::AttrDomain::Face); - - COLLADAFW::MeshPrimitiveArray &prim_arr = collada_mesh->getMeshPrimitives(); - COLLADAFW::MeshVertexData &nor = collada_mesh->getNormals(); - - for (i = 0; i < prim_arr.getCount(); i++) { - - COLLADAFW::MeshPrimitive *mp = prim_arr[i]; - - /* faces */ - size_t prim_faces_num = mp->getFaceCount(); - uint *position_indices = mp->getPositionIndices().getData(); - uint *normal_indices = mp->getNormalIndices().getData(); - - bool mp_has_normals = primitive_has_useable_normals(mp); - bool mp_has_faces = primitive_has_faces(mp); - - int collada_meshtype = mp->getPrimitiveType(); - - if (collada_meshtype == COLLADAFW::MeshPrimitive::LINES) { - continue; /* read the lines later after all the rest is done */ - } - - /* Since we cannot set `poly->mat_nr` here, we store a portion of `mesh->mpoly` in Primitive. - */ - Primitive prim = {face_index, &material_indices.span[face_index], 0}; - - /* If MeshPrimitive is TRIANGLE_FANS we split it into triangles - * The first triangle-fan vertex will be the first vertex in every triangle - * XXX The proper function of TRIANGLE_FANS is not tested!!! - * XXX In particular the handling of the normal_indices is very wrong */ - /* TODO: UV, vertex color and custom normal support */ - if (collada_meshtype == COLLADAFW::MeshPrimitive::TRIANGLE_FANS) { - uint grouped_vertex_count = mp->getGroupedVertexElementsCount(); - for (uint group_index = 0; group_index < grouped_vertex_count; group_index++) { - uint first_vertex = position_indices[0]; /* Store first triangle-fan vertex. */ - uint first_normal = normal_indices[0]; /* Store first triangle-fan vertex normal. */ - uint vertex_count = mp->getGroupedVerticesVertexCount(group_index); - - for (uint vertex_index = 0; vertex_index < vertex_count - 2; vertex_index++) { - /* For each triangle store indices of its 3 vertices */ - uint triangle_vertex_indices[3] = { - first_vertex, position_indices[1], position_indices[2]}; - face_offsets[face_index] = loop_index; - set_poly_indices(&corner_verts[loop_index], loop_index, triangle_vertex_indices, 3); - - if (mp_has_normals) { /* vertex normals, same implementation as for the triangles */ - /* The same for vertices normals. */ - uint vertex_normal_indices[3] = {first_normal, normal_indices[1], normal_indices[2]}; - sharp_faces.span[face_index] = is_flat_face(vertex_normal_indices, nor, 3); - normal_indices++; - } - - face_index++; - loop_index += 3; - prim.faces_num++; - } - - /* Moving cursor to the next triangle fan. */ - if (mp_has_normals) { - normal_indices += 2; - } - - position_indices += 2; - } - } - - if (ELEM(collada_meshtype, - COLLADAFW::MeshPrimitive::POLYLIST, - COLLADAFW::MeshPrimitive::POLYGONS, - COLLADAFW::MeshPrimitive::TRIANGLES)) - { - COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons *)mp; - uint start_index = 0; - - COLLADAFW::IndexListArray &index_list_array_uvcoord = mp->getUVCoordIndicesArray(); - COLLADAFW::IndexListArray &index_list_array_vcolor = mp->getColorIndicesArray(); - - int invalid_loop_holes = 0; - for (uint j = 0; j < prim_faces_num; j++) { - - /* Vertices in polygon: */ - int vcount = get_vertex_count(mpvc, j); - if (vcount < 0) { - continue; /* TODO: add support for holes */ - } - - face_offsets[face_index] = loop_index; - bool broken_loop = set_poly_indices( - &corner_verts[loop_index], loop_index, position_indices, vcount); - if (broken_loop) { - invalid_loop_holes += 1; - } - - for (uint uvset_index = 0; uvset_index < index_list_array_uvcoord.getCount(); - uvset_index++) - { - COLLADAFW::IndexList &index_list = *index_list_array_uvcoord[uvset_index]; - blender::float2 *mloopuv = static_cast( - CustomData_get_layer_named_for_write( - &mesh->corner_data, CD_PROP_FLOAT2, index_list.getName(), mesh->corners_num)); - if (mloopuv == nullptr) { - fprintf(stderr, - "Collada import: Mesh [%s] : Unknown reference to TEXCOORD [#%s].\n", - mesh->id.name, - index_list.getName().c_str()); - } - else { - set_face_uv(mloopuv + loop_index, - uvs, - start_index, - *index_list_array_uvcoord[uvset_index], - vcount); - } - } - - if (mp_has_normals) { - /* If it turns out that we have complete custom normals for each poly - * and we want to use custom normals, this will be overridden. */ - sharp_faces.span[face_index] = is_flat_face(normal_indices, nor, vcount); - - if (use_custom_normals) { - /* Store the custom normals for later application. */ - float vert_normal[3]; - uint *cur_normal = normal_indices; - for (int k = 0; k < vcount; k++, cur_normal++) { - get_vector(vert_normal, nor, *cur_normal, 3); - normalize_v3(vert_normal); - loop_normals.append(vert_normal); - } - } - } - - if (mp->hasColorIndices()) { - int vcolor_count = index_list_array_vcolor.getCount(); - - for (uint vcolor_index = 0; vcolor_index < vcolor_count; vcolor_index++) { - - COLLADAFW::IndexList &color_index_list = *mp->getColorIndices(vcolor_index); - COLLADAFW::String colname = extract_vcolname(color_index_list.getName()); - MLoopCol *mloopcol = (MLoopCol *)CustomData_get_layer_named_for_write( - &mesh->corner_data, CD_PROP_BYTE_COLOR, colname, mesh->corners_num); - if (mloopcol == nullptr) { - fprintf(stderr, - "Collada import: Mesh [%s] : Unknown reference to VCOLOR [#%s].\n", - mesh->id.name, - color_index_list.getName().c_str()); - } - else { - set_vcol(mloopcol + loop_index, vcol, start_index, color_index_list, vcount); - } - } - } - - face_index++; - loop_index += vcount; - start_index += vcount; - prim.faces_num++; - - if (mp_has_normals) { - normal_indices += vcount; - } - - position_indices += vcount; - } - - if (invalid_loop_holes > 0) { - fprintf(stderr, - "Collada import: Mesh [%s] : contains %d unsupported loops (holes).\n", - mesh->id.name, - invalid_loop_holes); - } - } - - if (mp_has_faces) { - mat_prim_map[mp->getMaterialId()].push_back(prim); - } - } - - geom_uid_mat_mapping_map[collada_mesh->getUniqueId()] = mat_prim_map; - material_indices.finish(); -} - -void MeshImporter::get_vector(float v[3], COLLADAFW::MeshVertexData &arr, int i, int stride) -{ - i *= stride; - - switch (arr.getType()) { - case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT: { - COLLADAFW::ArrayPrimitiveType *values = arr.getFloatValues(); - if (values->empty()) { - return; - } - - v[0] = (*values)[i++]; - v[1] = (*values)[i++]; - if (stride >= 3) { - v[2] = (*values)[i]; - } - else { - v[2] = 0.0f; - } - break; - } - case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE: { - COLLADAFW::ArrayPrimitiveType *values = arr.getDoubleValues(); - if (values->empty()) { - return; - } - - v[0] = float((*values)[i++]); - v[1] = float((*values)[i++]); - if (stride >= 3) { - v[2] = float((*values)[i]); - } - else { - v[2] = 0.0f; - } - break; - } - default: - break; - } -} - -bool MeshImporter::is_flat_face(uint *nind, COLLADAFW::MeshVertexData &nor, int count) -{ - float a[3], b[3]; - - get_vector(a, nor, *nind, 3); - normalize_v3(a); - - nind++; - - for (int i = 1; i < count; i++, nind++) { - get_vector(b, nor, *nind, 3); - normalize_v3(b); - - float dp = dot_v3v3(a, b); - - if (dp < 0.99999f || dp > 1.00001f) { - return false; - } - } - - return true; -} - -Object *MeshImporter::get_object_by_geom_uid(const COLLADAFW::UniqueId &geom_uid) -{ - if (uid_object_map.find(geom_uid) != uid_object_map.end()) { - return uid_object_map[geom_uid]; - } - return nullptr; -} - -Mesh *MeshImporter::get_mesh_by_geom_uid(const COLLADAFW::UniqueId &geom_uid) -{ - if (uid_mesh_map.find(geom_uid) != uid_mesh_map.end()) { - return uid_mesh_map[geom_uid]; - } - return nullptr; -} - -std::string *MeshImporter::get_geometry_name(const std::string &mesh_name) -{ - if (this->mesh_geom_map.find(mesh_name) != this->mesh_geom_map.end()) { - return &this->mesh_geom_map[mesh_name]; - } - return nullptr; -} - -static bool bc_has_out_of_bound_indices(Mesh *mesh) -{ - for (const int vert_i : mesh->corner_verts()) { - if (vert_i >= mesh->verts_num) { - return true; - } - } - return false; -} - -/** - * this function checks if both objects have the same - * materials assigned to Object (in the same order) - * returns true if condition matches, otherwise false; - */ -static bool bc_has_same_material_configuration(Object *ob1, Object *ob2) -{ - if (ob1->totcol != ob2->totcol) { - return false; /* not same number of materials */ - } - if (ob1->totcol == 0) { - return false; /* no material at all */ - } - - for (int index = 0; index < ob1->totcol; index++) { - if (ob1->matbits[index] != ob2->matbits[index]) { - return false; /* shouldn't happen */ - } - if (ob1->matbits[index] == 0) { - return false; /* shouldn't happen */ - } - if (ob1->mat[index] != ob2->mat[index]) { - return false; /* different material assignment */ - } - } - return true; -} - -/** - * Caution here: This code assumes that all materials are assigned to Object - * and no material is assigned to Data. - * That is true right after the objects have been imported. - */ -static void bc_copy_materials_to_data(Object *ob, Mesh *mesh) -{ - for (int index = 0; index < ob->totcol; index++) { - ob->matbits[index] = 0; - mesh->mat[index] = ob->mat[index]; - } -} - -/** - * Remove all references to materials from the object. - */ -static void bc_remove_materials_from_object(Object *ob, Mesh *mesh) -{ - for (int index = 0; index < ob->totcol; index++) { - ob->matbits[index] = 0; - ob->mat[index] = nullptr; - } -} - -std::vector MeshImporter::get_all_users_of(Mesh *reference_mesh) -{ - std::vector mesh_users; - for (Object *ob : imported_objects) { - if (bc_is_marked(ob)) { - bc_remove_mark(ob); - Mesh *mesh = (Mesh *)ob->data; - if (mesh == reference_mesh) { - mesh_users.push_back(ob); - } - } - } - return mesh_users; -} - -void MeshImporter::optimize_material_assignements() -{ - for (Object *ob : imported_objects) { - Mesh *mesh = (Mesh *)ob->data; - if (ID_REAL_USERS(&mesh->id) == 1) { - bc_copy_materials_to_data(ob, mesh); - bc_remove_materials_from_object(ob, mesh); - bc_remove_mark(ob); - } - else if (ID_REAL_USERS(&mesh->id) > 1) { - bool can_move = true; - std::vector mesh_users = get_all_users_of(mesh); - if (mesh_users.size() > 1) { - Object *ref_ob = mesh_users[0]; - for (int index = 1; index < mesh_users.size(); index++) { - if (!bc_has_same_material_configuration(ref_ob, mesh_users[index])) { - can_move = false; - break; - } - } - if (can_move) { - bc_copy_materials_to_data(ref_ob, mesh); - for (Object *object : mesh_users) { - bc_remove_materials_from_object(object, mesh); - bc_remove_mark(object); - } - } - } - } - } -} - -void MeshImporter::assign_material_to_geom( - COLLADAFW::MaterialBinding cmaterial, - std::map &uid_material_map, - Object *ob, - const COLLADAFW::UniqueId *geom_uid, - short mat_index) -{ - const COLLADAFW::UniqueId &ma_uid = cmaterial.getReferencedMaterial(); - - /* do we know this material? */ - if (uid_material_map.find(ma_uid) == uid_material_map.end()) { - - fprintf(stderr, "Cannot find material by UID.\n"); - return; - } - - /* first time we get geom_uid, ma_uid pair. Save for later check. */ - materials_mapped_to_geom.insert( - std::pair(*geom_uid, ma_uid)); - - Material *ma = uid_material_map[ma_uid]; - - /* Attention! This temporarily assigns material to object on purpose! - * See note above. */ - ob->actcol = 0; - BKE_object_material_assign(m_bmain, ob, ma, mat_index + 1, BKE_MAT_ASSIGN_OBJECT); - - MaterialIdPrimitiveArrayMap &mat_prim_map = geom_uid_mat_mapping_map[*geom_uid]; - COLLADAFW::MaterialId mat_id = cmaterial.getMaterialId(); - - /* assign material indices to mesh faces */ - if (mat_prim_map.find(mat_id) != mat_prim_map.end()) { - - std::vector &prims = mat_prim_map[mat_id]; - - std::vector::iterator it; - - for (it = prims.begin(); it != prims.end(); it++) { - Primitive &prim = *it; - - for (int i = 0; i < prim.faces_num; i++) { - prim.material_indices[i] = mat_index; - } - } - } -} - -Object *MeshImporter::create_mesh_object( - COLLADAFW::Node *node, - COLLADAFW::InstanceGeometry *geom, - bool isController, - std::map &uid_material_map) -{ - const COLLADAFW::UniqueId *geom_uid = &geom->getInstanciatedObjectId(); - - /* check if node instantiates controller or geometry */ - if (isController) { - - geom_uid = armature_importer->get_geometry_uid(*geom_uid); - - if (!geom_uid) { - fprintf(stderr, "Couldn't find a mesh UID by controller's UID.\n"); - return nullptr; - } - } - else { - - if (uid_mesh_map.find(*geom_uid) == uid_mesh_map.end()) { - /* this could happen if a mesh was not created - * (e.g. if it contains unsupported geometry) */ - fprintf(stderr, "Couldn't find a mesh by UID.\n"); - return nullptr; - } - } - if (!uid_mesh_map[*geom_uid]) { - return nullptr; - } - - /* name Object */ - const std::string &id = node->getName().empty() ? node->getOriginalId() : node->getName(); - const char *name = id.length() ? id.c_str() : nullptr; - - /* add object */ - Object *ob = bc_add_object(m_bmain, scene, view_layer, OB_MESH, name); - bc_set_mark(ob); /* used later for material assignment optimization */ - - /* store object pointer for ArmatureImporter */ - uid_object_map[*geom_uid] = ob; - imported_objects.push_back(ob); - - /* replace ob->data freeing the old one */ - Mesh *old_mesh = (Mesh *)ob->data; - Mesh *new_mesh = uid_mesh_map[*geom_uid]; - - BKE_mesh_assign_object(m_bmain, ob, new_mesh); - - /* Because BKE_mesh_assign_object would have already decreased it... */ - id_us_plus(&old_mesh->id); - - BKE_id_free_us(m_bmain, old_mesh); - - COLLADAFW::MaterialBindingArray &mat_array = geom->getMaterialBindings(); - - /* loop through geom's materials */ - for (uint i = 0; i < mat_array.getCount(); i++) { - - if (mat_array[i].getReferencedMaterial().isValid()) { - assign_material_to_geom(mat_array[i], uid_material_map, ob, geom_uid, i); - } - else { - fprintf(stderr, "invalid referenced material for %s\n", mat_array[i].getName().c_str()); - } - } - - /* clean up the mesh */ - BKE_mesh_validate((Mesh *)ob->data, false, false); - - return ob; -} - -bool MeshImporter::write_geometry(const COLLADAFW::Geometry *geom) -{ - using namespace blender; - if (geom->getType() != COLLADAFW::Geometry::GEO_TYPE_MESH) { - /* TODO: report warning */ - fprintf(stderr, "Mesh type %s is not supported\n", bc_geomTypeToStr(geom->getType())); - return true; - } - - COLLADAFW::Mesh *mesh = (COLLADAFW::Mesh *)geom; - - if (!is_nice_mesh(mesh)) { - fprintf(stderr, "Ignoring mesh %s\n", bc_get_dae_name(mesh).c_str()); - return true; - } - - const std::string &str_geom_id = mesh->getName().empty() ? mesh->getOriginalId() : - mesh->getName(); - Mesh *blender_mesh = BKE_mesh_add(m_bmain, (char *)str_geom_id.c_str()); - id_us_min( - &blender_mesh->id); /* is already 1 here, but will be set later in BKE_mesh_assign_object */ - - /* store the Mesh pointer to link it later with an Object - * mesh_geom_map needed to map mesh to its geometry name (for shape key naming) */ - this->uid_mesh_map[mesh->getUniqueId()] = blender_mesh; - this->mesh_geom_map[std::string(blender_mesh->id.name)] = str_geom_id; - - read_vertices(mesh, blender_mesh); - - blender::Vector loop_normals; - read_polys(mesh, blender_mesh, loop_normals); - - blender::bke::mesh_calc_edges(*blender_mesh, false, false); - - /* We must apply custom normals after edges have been calculated, because - * bke::mesh_set_custom_normals()'s internals expect mesh->medge to be populated - * and for the MLoops to have correct edge indices. */ - if (use_custom_normals && !loop_normals.is_empty()) { - /* bke::mesh_set_custom_normals()'s internals also expect that each corner - * has a valid vertex index, which may not be the case due to the existing - * logic in read_faces(). This check isn't necessary in the no-custom-normals - * case because the invalid MLoops get stripped in a later step. */ - if (bc_has_out_of_bound_indices(blender_mesh)) { - fprintf(stderr, "Can't apply custom normals, encountered invalid loop vert indices!\n"); - } - /* There may be a mismatch in lengths if one or more of the MeshPrimitives in - * the Geometry had missing or otherwise invalid normals. */ - else if (blender_mesh->corners_num != loop_normals.size()) { - fprintf(stderr, - "Can't apply custom normals, mesh->corners_num != loop_normals.size() (%d != %d)\n", - blender_mesh->corners_num, - int(loop_normals.size())); - } - else { - bke::mesh_set_custom_normals(*blender_mesh, loop_normals); - } - } - - /* read_lines() must be called after the face edges have been generated. - * Otherwise the loose edges will be silently deleted again. */ - read_lines(mesh, blender_mesh); - - return true; -} diff --git a/source/blender/io/collada/MeshImporter.h b/source/blender/io/collada/MeshImporter.h deleted file mode 100644 index dbf45b01fba..00000000000 --- a/source/blender/io/collada/MeshImporter.h +++ /dev/null @@ -1,238 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include -#include - -#include "COLLADAFWIndexList.h" -#include "COLLADAFWInstanceGeometry.h" -#include "COLLADAFWMaterialBinding.h" -#include "COLLADAFWMesh.h" -#include "COLLADAFWMeshVertexData.h" -#include "COLLADAFWNode.h" -#include "COLLADAFWPolygons.h" -#include "COLLADAFWTypes.h" -#include "COLLADAFWUniqueId.h" - -#include "collada_utils.h" - -#include "BLI_math_vector_types.hh" - -#include "DNA_material_types.h" -#include "DNA_mesh_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -class ArmatureImporter; -struct MLoopCol; - -/* only for ArmatureImporter to "see" MeshImporter::get_object_by_geom_uid */ -class MeshImporterBase { - public: - virtual Object *get_object_by_geom_uid(const COLLADAFW::UniqueId &geom_uid) = 0; - virtual Mesh *get_mesh_by_geom_uid(const COLLADAFW::UniqueId &mesh_uid) = 0; - virtual std::string *get_geometry_name(const std::string &mesh_name) = 0; -}; - -class UVDataWrapper { - COLLADAFW::MeshVertexData *mVData; - - public: - UVDataWrapper(COLLADAFW::MeshVertexData &vdata); - -#ifdef COLLADA_DEBUG - void print(); -#endif - - void getUV(int uv_index, float *uv); -}; - -class VCOLDataWrapper { - COLLADAFW::MeshVertexData *mVData; - - public: - VCOLDataWrapper(COLLADAFW::MeshVertexData &vdata); - void get_vcol(int v_index, MLoopCol *mloopcol); -}; - -class MeshImporter : public MeshImporterBase { - private: - UnitConverter *unitconverter; - bool use_custom_normals; - - Main *m_bmain; - Scene *scene; - ViewLayer *view_layer; - - ArmatureImporter *armature_importer; - - std::map mesh_geom_map; /* needed for correct shape key naming */ - std::map uid_mesh_map; /* geometry unique id-to-mesh map */ - std::map uid_object_map; /* geom UID-to-object */ - std::vector imported_objects; /* list of imported objects */ - - /* this structure is used to assign material indices to faces - * it holds a portion of Mesh faces and corresponds to a DAE primitive list - * (``, ``, etc.) */ - struct Primitive { - int face_index; - int *material_indices; - uint faces_num; - }; - using MaterialIdPrimitiveArrayMap = std::map>; - /* crazy name! */ - std::map geom_uid_mat_mapping_map; - /* < materials that have already been mapped to a geometry. - * A pair/of geom UID and mat UID, one geometry can have several materials. */ - std::multimap materials_mapped_to_geom; - - bool set_poly_indices(int *face_verts, int loop_index, const uint *indices, int loop_count); - - void set_face_uv(blender::float2 *mloopuv, - UVDataWrapper &uvs, - int start_index, - COLLADAFW::IndexList &index_list, - int count); - - void set_vcol(MLoopCol *mloopcol, - VCOLDataWrapper &vob, - int loop_index, - COLLADAFW::IndexList &index_list, - int count); - -#ifdef COLLADA_DEBUG - void print_index_list(COLLADAFW::IndexList &index_list); -#endif - - /** - * Checks if mesh has supported primitive types: - * `lines`, `polylist`, `triangles`, `triangle_fans`. - */ - bool is_nice_mesh(COLLADAFW::Mesh *mesh); - - void read_vertices(COLLADAFW::Mesh *mesh, Mesh *blender_mesh); - - /** - * Condition 1: The Primitive has normals - * condition 2: The number of normals equals the number of faces. - * return true if both conditions apply. - * return false otherwise. - */ - bool primitive_has_useable_normals(COLLADAFW::MeshPrimitive *mp); - /** - * Assume that only TRIANGLES, TRIANGLE_FANS, POLYLIST and POLYGONS - * have faces. (to be verified). - */ - bool primitive_has_faces(COLLADAFW::MeshPrimitive *mp); - - /** - * This function is copied from `source/blender/editors/mesh/mesh_data.cc` - * - * TODO: (As discussed with sergey-) : - * Maybe move this function to `blenderkernel/intern/mesh.cc`. - * and add definition to BKE_mesh.c. - */ - static void mesh_add_edges(Mesh *mesh, int len); - - uint get_loose_edge_count(COLLADAFW::Mesh *mesh); - - /** - * Return the number of faces by summing up - * the face-counts of the parts. - * HINT: This is done because `mesh->getFacesCount()` does - * count loose edges as extra faces, which is not what we want here. - */ - void allocate_poly_data(COLLADAFW::Mesh *collada_mesh, Mesh *mesh); - - /* TODO: import uv set names */ - /** - * Read all faces from TRIANGLES, TRIANGLE_FANS, POLYLIST, POLYGON - * IMPORTANT: This function MUST be called before read_lines() - * Otherwise we will lose all edges from faces (see read_lines() above) - * - * TODO: import uv set names. - */ - void read_polys(COLLADAFW::Mesh *mesh, - Mesh *blender_mesh, - blender::Vector &loop_normals); - /** - * Read all loose edges. - * IMPORTANT: This function assumes that all edges from existing - * faces have already been generated and added to me->medge - * So this function MUST be called after read_faces() (see below) - */ - void read_lines(COLLADAFW::Mesh *mesh, Mesh *blender_mesh); - uint get_vertex_count(COLLADAFW::Polygons *mp, int index); - - void get_vector(float v[3], COLLADAFW::MeshVertexData &arr, int i, int stride); - - bool is_flat_face(uint *nind, COLLADAFW::MeshVertexData &nor, int count); - - /** - * Returns the list of Users of the given Mesh object. - * NOTE: This function uses the object user flag to control - * which objects have already been processed. - */ - std::vector get_all_users_of(Mesh *reference_mesh); - - public: - MeshImporter(UnitConverter *unitconv, - bool use_custom_normals, - ArmatureImporter *arm, - Main *bmain, - Scene *sce, - ViewLayer *view_layer); - - Object *get_object_by_geom_uid(const COLLADAFW::UniqueId &geom_uid) override; - - Mesh *get_mesh_by_geom_uid(const COLLADAFW::UniqueId &geom_uid) override; - - /** - * - * During import all materials have been assigned to Object. - * Now we iterate over the imported objects and optimize - * the assignments as follows: - * - * for each imported geometry: - * if number of users is 1: - * get the user (object) - * move the materials from Object to Data - * else: - * determine which materials are assigned to the first user - * check if all other users have the same materials in the same order - * if the check is positive: - * Add the materials of the first user to the geometry - * adjust all other users accordingly. - */ - void optimize_material_assignements(); - - /** - * We do not know in advance which objects will share geometries. - * And we do not know either if the objects which share geometries - * come along with different materials. So we first create the objects - * and assign the materials to Object, then in a later cleanup we decide - * which materials shall be moved to the created geometries. Also see - * optimize_material_assignements() above. - */ - void assign_material_to_geom(COLLADAFW::MaterialBinding cmaterial, - std::map &uid_material_map, - Object *ob, - const COLLADAFW::UniqueId *geom_uid, - short mat_index); - - Object *create_mesh_object(COLLADAFW::Node *node, - COLLADAFW::InstanceGeometry *geom, - bool isController, - std::map &uid_material_map); - - /** Create a mesh storing a pointer in a map so it can be retrieved later by geometry UID. */ - bool write_geometry(const COLLADAFW::Geometry *geom); - std::string *get_geometry_name(const std::string &mesh_name) override; -}; diff --git a/source/blender/io/collada/SceneExporter.cpp b/source/blender/io/collada/SceneExporter.cpp deleted file mode 100644 index dba95f0cf10..00000000000 --- a/source/blender/io/collada/SceneExporter.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/* SPDX-FileCopyrightText: 2011-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "COLLADASWInstanceCamera.h" -#include "COLLADASWInstanceGeometry.h" -#include "COLLADASWInstanceLight.h" - -#include "BLI_listbase.h" - -#include "BKE_collection.hh" -#include "BKE_constraint.h" - -#include "SceneExporter.h" -#include "collada_utils.h" - -void SceneExporter::exportScene() -{ - Scene *scene = blender_context.get_scene(); - - /* */ - std::string name = id_name(scene); - openVisualScene(translate_id(name), encode_xml(name)); - exportHierarchy(); - closeVisualScene(); - closeLibrary(); -} - -void SceneExporter::exportHierarchy() -{ - LinkNode *node; - ColladaBaseNodes base_objects; - - /* Ensure all objects in the export_set are marked */ - for (node = this->export_settings.get_export_set(); node; node = node->next) { - Object *ob = (Object *)node->link; - ob->id.tag |= ID_TAG_DOIT; - } - - /* Now find all exportable base objects (highest in export hierarchy) */ - for (node = this->export_settings.get_export_set(); node; node = node->next) { - Object *ob = (Object *)node->link; - if (this->export_settings.is_export_root(ob)) { - switch (ob->type) { - case OB_MESH: - case OB_CAMERA: - case OB_LAMP: - case OB_EMPTY: - case OB_ARMATURE: - base_objects.add(ob); - break; - } - } - } - - /* And now export the base objects: */ - for (int index = 0; index < base_objects.size(); index++) { - Object *ob = base_objects.get(index); - writeNode(ob); - if (bc_is_marked(ob)) { - bc_remove_mark(ob); - } - } -} - -void SceneExporter::writeNodeList(std::vector &child_objects, Object *parent) -{ - /* TODO: Handle the case where a parent is not exported - * Actually i am not even sure if this can be done at all - * in a good way. - * I really prefer to enforce the export of hidden - * elements in an object hierarchy. When the children of - * the hidden elements are exported as well. */ - for (auto *child : child_objects) { - writeNode(child); - if (bc_is_marked(child)) { - bc_remove_mark(child); - } - } -} - -void SceneExporter::writeNode(Object *ob) -{ - const Scene *scene = blender_context.get_scene(); - ViewLayer *view_layer = blender_context.get_view_layer(); - - std::vector child_objects; - bc_get_children(child_objects, ob, scene, view_layer); - bool can_export = bc_is_in_Export_set( - this->export_settings.get_export_set(), ob, scene, view_layer); - - /* Add associated armature first if available */ - bool armature_exported = false; - Object *ob_arm = bc_get_assigned_armature(ob); - - if (ob_arm != nullptr) { - armature_exported = bc_is_in_Export_set( - this->export_settings.get_export_set(), ob_arm, scene, view_layer); - if (armature_exported && bc_is_marked(ob_arm)) { - writeNode(ob_arm); - bc_remove_mark(ob_arm); - armature_exported = true; - } - } - - if (can_export) { - COLLADASW::Node colladaNode(mSW); - colladaNode.setNodeId(translate_id(id_name(ob))); - colladaNode.setNodeName(encode_xml(id_name(ob))); - colladaNode.setType(COLLADASW::Node::NODE); - - colladaNode.start(); - if (ob->type == OB_MESH && armature_exported) { - /* for skinned mesh we write obmat in */ - TransformWriter::add_node_transform_identity(colladaNode, this->export_settings); - } - else { - TransformWriter::add_node_transform_ob(colladaNode, ob, this->export_settings); - } - - /* */ - if (ob->type == OB_MESH) { - bool instance_controller_created = false; - if (armature_exported) { - instance_controller_created = arm_exporter->add_instance_controller(ob); - } - if (!instance_controller_created) { - COLLADASW::InstanceGeometry instGeom(mSW); - instGeom.setUrl(COLLADASW::URI( - COLLADABU::Utils::EMPTY_STRING, - get_geometry_id(ob, this->export_settings.get_use_object_instantiation()))); - instGeom.setName(encode_xml(id_name(ob))); - InstanceWriter::add_material_bindings( - instGeom.getBindMaterial(), ob, this->export_settings.get_active_uv_only()); - instGeom.add(); - } - } - - /* */ - else if (ob->type == OB_ARMATURE) { - arm_exporter->add_bone_collections(ob, colladaNode); - arm_exporter->add_armature_bones(ob, view_layer, this, child_objects); - } - - /* */ - else if (ob->type == OB_CAMERA) { - COLLADASW::InstanceCamera instCam( - mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_camera_id(ob))); - instCam.add(); - } - - /* */ - else if (ob->type == OB_LAMP) { - COLLADASW::InstanceLight instLa( - mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob))); - instLa.add(); - } - - /* empty object */ - else if (ob->type == OB_EMPTY) { /* TODO: handle groups (OB_DUPLICOLLECTION */ - if ((ob->transflag & OB_DUPLICOLLECTION) == OB_DUPLICOLLECTION && ob->instance_collection) { - Collection *collection = ob->instance_collection; - // printf("group detected '%s'\n", group->id.name + 2); - FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (collection, object) { - printf("\t%s\n", object->id.name); - } - FOREACH_COLLECTION_OBJECT_RECURSIVE_END; - } - - if (BLI_listbase_is_empty(&ob->constraints) == false) { - bConstraint *con = (bConstraint *)ob->constraints.first; - while (con) { - std::string con_name(encode_xml(con->name)); - std::string con_tag = con_name + "_constraint"; - printf("%s\n", con_name.c_str()); - printf("%s\n\n", con_tag.c_str()); - colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "type", con->type); - colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "enforce", con->enforce); - colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "flag", con->flag); - colladaNode.addExtraTechniqueChildParameter( - "blender", con_tag, "headtail", con->headtail); - colladaNode.addExtraTechniqueChildParameter( - "blender", con_tag, "lin_error", con->lin_error); - colladaNode.addExtraTechniqueChildParameter( - "blender", con_tag, "own_space", con->ownspace); - colladaNode.addExtraTechniqueChildParameter( - "blender", con_tag, "rot_error", con->rot_error); - colladaNode.addExtraTechniqueChildParameter( - "blender", con_tag, "tar_space", con->tarspace); - colladaNode.addExtraTechniqueChildParameter( - "blender", con_tag, "lin_error", con->lin_error); - - /* not ideal: add the target object name as another parameter. - * No real mapping in the `.dae`. - * Need support for multiple target objects also. */ - - ListBase targets = {nullptr, nullptr}; - if (BKE_constraint_targets_get(con, &targets)) { - Object *obtar; - - LISTBASE_FOREACH (bConstraintTarget *, ct, &targets) { - obtar = ct->tar; - std::string tar_id((obtar) ? id_name(obtar) : ""); - colladaNode.addExtraTechniqueChildParameter("blender", con_tag, "target_id", tar_id); - } - - BKE_constraint_targets_flush(con, &targets, true); - } - - con = con->next; - } - } - } - bc_remove_mark(ob); - writeNodeList(child_objects, ob); - colladaNode.end(); - } - else { - writeNodeList(child_objects, ob); - } -} diff --git a/source/blender/io/collada/SceneExporter.h b/source/blender/io/collada/SceneExporter.h deleted file mode 100644 index eb11f93a834..00000000000 --- a/source/blender/io/collada/SceneExporter.h +++ /dev/null @@ -1,46 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include - -#include "DNA_object_types.h" - -#include "COLLADASWLibraryVisualScenes.h" - -#include "ArmatureExporter.h" -#include "ExportSettings.h" - -class SceneExporter : COLLADASW::LibraryVisualScenes, - protected TransformWriter, - protected InstanceWriter { - public: - SceneExporter(BlenderContext &blender_context, - COLLADASW::StreamWriter *sw, - ArmatureExporter *arm, - BCExportSettings &export_settings) - : COLLADASW::LibraryVisualScenes(sw), - blender_context(blender_context), - arm_exporter(arm), - export_settings(export_settings) - { - } - - void exportScene(); - - private: - BlenderContext &blender_context; - friend class ArmatureExporter; - ArmatureExporter *arm_exporter; - BCExportSettings &export_settings; - - void exportHierarchy(); - void writeNodeList(std::vector &child_objects, Object *parent); - void writeNode(Object *ob); -}; diff --git a/source/blender/io/collada/SkinInfo.cpp b/source/blender/io/collada/SkinInfo.cpp deleted file mode 100644 index d9e6bd9b530..00000000000 --- a/source/blender/io/collada/SkinInfo.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include - -#include "BLI_listbase.h" -#include "BLI_math_matrix.h" - -#include "DNA_armature_types.h" -#include "DNA_modifier_types.h" -#include "DNA_scene_types.h" - -#include "BKE_action.hh" -#include "BKE_deform.hh" -#include "BKE_object.hh" -#include "BKE_object_deform.h" - -#include "ED_mesh.hh" -#include "ED_object.hh" -#include "ED_object_vgroup.hh" - -#include "SkinInfo.h" -#include "collada_utils.h" - -/* use name, or fall back to original id if name not present (name is optional) */ -template static const char *bc_get_joint_name(T *node) -{ - const std::string &id = node->getName(); - return id.empty() ? node->getOriginalId().c_str() : id.c_str(); -} - -SkinInfo::SkinInfo() = default; - -SkinInfo::SkinInfo(const SkinInfo &skin) - : weights(skin.weights), - joint_data(skin.joint_data), - unit_converter(skin.unit_converter), - ob_arm(skin.ob_arm), - controller_uid(skin.controller_uid), - parent(skin.parent) -{ - copy_m4_m4(bind_shape_matrix, (float(*)[4])skin.bind_shape_matrix); - - transfer_uint_array_data_const(skin.joints_per_vertex, joints_per_vertex); - transfer_uint_array_data_const(skin.weight_indices, weight_indices); - transfer_int_array_data_const(skin.joint_indices, joint_indices); -} - -SkinInfo::SkinInfo(UnitConverter *conv) : unit_converter(conv), ob_arm(nullptr), parent(nullptr) {} - -template void SkinInfo::transfer_array_data(T &src, T &dest) -{ - dest.setData(src.getData(), src.getCount()); - src.yieldOwnerShip(); - dest.yieldOwnerShip(); -} - -void SkinInfo::transfer_int_array_data_const(const COLLADAFW::IntValuesArray &src, - COLLADAFW::IntValuesArray &dest) -{ - dest.setData((int *)src.getData(), src.getCount()); - dest.yieldOwnerShip(); -} - -void SkinInfo::transfer_uint_array_data_const(const COLLADAFW::UIntValuesArray &src, - COLLADAFW::UIntValuesArray &dest) -{ - dest.setData((uint *)src.getData(), src.getCount()); - dest.yieldOwnerShip(); -} - -void SkinInfo::borrow_skin_controller_data(const COLLADAFW::SkinControllerData *skin) -{ - transfer_array_data((COLLADAFW::UIntValuesArray &)skin->getJointsPerVertex(), joints_per_vertex); - transfer_array_data((COLLADAFW::UIntValuesArray &)skin->getWeightIndices(), weight_indices); - transfer_array_data((COLLADAFW::IntValuesArray &)skin->getJointIndices(), joint_indices); - // transfer_array_data(skin->getWeights(), weights); - - /* cannot transfer data for FloatOrDoubleArray, copy values manually */ - const COLLADAFW::FloatOrDoubleArray &weight = skin->getWeights(); - for (uint i = 0; i < weight.getValuesCount(); i++) { - weights.push_back(bc_get_float_value(weight, i)); - } - - UnitConverter::dae_matrix_to_mat4_(bind_shape_matrix, skin->getBindShapeMatrix()); -} - -void SkinInfo::free() -{ - joints_per_vertex.releaseMemory(); - weight_indices.releaseMemory(); - joint_indices.releaseMemory(); - // weights.releaseMemory(); -} - -void SkinInfo::add_joint(const COLLADABU::Math::Matrix4 &matrix) -{ - JointData jd; - UnitConverter::dae_matrix_to_mat4_(jd.inv_bind_mat, matrix); - joint_data.push_back(jd); -} - -void SkinInfo::set_controller(const COLLADAFW::SkinController *co) -{ - controller_uid = co->getUniqueId(); - - /* fill in joint UIDs */ - const COLLADAFW::UniqueIdArray &joint_uids = co->getJoints(); - for (uint i = 0; i < joint_uids.getCount(); i++) { - joint_data[i].joint_uid = joint_uids[i]; - - /* store armature pointer */ - // JointData& jd = joint_index_to_joint_info_map[i]; - // jd.ob_arm = ob_arm; - - /* now we'll be able to get inv bind matrix from joint id */ - // joint_id_to_joint_index_map[joint_ids[i]] = i; - } -} - -Object *SkinInfo::create_armature(Main *bmain, Scene *scene, ViewLayer *view_layer) -{ - ob_arm = bc_add_object(bmain, scene, view_layer, OB_ARMATURE, nullptr); - return ob_arm; -} - -Object *SkinInfo::set_armature(Object *ob_arm) -{ - if (this->ob_arm) { - return this->ob_arm; - } - - this->ob_arm = ob_arm; - return ob_arm; -} - -bool SkinInfo::get_joint_inv_bind_matrix(float inv_bind_mat[4][4], COLLADAFW::Node *node) -{ - const COLLADAFW::UniqueId &uid = node->getUniqueId(); - std::vector::iterator it; - for (it = joint_data.begin(); it != joint_data.end(); it++) { - if ((*it).joint_uid == uid) { - copy_m4_m4(inv_bind_mat, (*it).inv_bind_mat); - return true; - } - } - - return false; -} - -Object *SkinInfo::BKE_armature_from_object() -{ - return ob_arm; -} - -const COLLADAFW::UniqueId &SkinInfo::get_controller_uid() -{ - return controller_uid; -} - -bool SkinInfo::uses_joint_or_descendant(COLLADAFW::Node *node) -{ - const COLLADAFW::UniqueId &uid = node->getUniqueId(); - std::vector::iterator it; - for (it = joint_data.begin(); it != joint_data.end(); it++) { - if ((*it).joint_uid == uid) { - return true; - } - } - - COLLADAFW::NodePointerArray &children = node->getChildNodes(); - for (uint i = 0; i < children.getCount(); i++) { - if (uses_joint_or_descendant(children[i])) { - return true; - } - } - - return false; -} - -void SkinInfo::link_armature(bContext *C, - Object *ob, - std::map &joint_by_uid, - TransformReader *tm) -{ - Main *bmain = CTX_data_main(C); - Scene *scene = CTX_data_scene(C); - - ModifierData *md = blender::ed::object::modifier_add( - nullptr, bmain, scene, ob, nullptr, eModifierType_Armature); - ArmatureModifierData *amd = (ArmatureModifierData *)md; - amd->object = ob_arm; - -#if 1 - /* XXX Why do we enforce objects to be children of Armatures if they weren't so before? */ - if (!BKE_object_is_child_recursive(ob_arm, ob)) { - bc_set_parent(ob, ob_arm, C); - } -#else - Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - - ob->parent = ob_arm; - ob->partype = PAROBJECT; - - invert_m4_m4(ob->parentinv, BKE_object_calc_parent(depsgraph, scene, ob).ptr()); - - DEG_id_tag_update(&obn->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); -#endif - copy_m4_m4(ob->runtime->object_to_world.ptr(), bind_shape_matrix); - BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), false, false); - - amd->deformflag = ARM_DEF_VGROUP; - - /* create all vertex groups */ - std::vector::iterator it; - int joint_index; - for (it = joint_data.begin(), joint_index = 0; it != joint_data.end(); it++, joint_index++) { - const char *name = "Group"; - - /* skip joints that have invalid UID */ - if ((*it).joint_uid == COLLADAFW::UniqueId::INVALID) { - continue; - } - - /* name group by joint node name */ - - if (joint_by_uid.find((*it).joint_uid) != joint_by_uid.end()) { - name = bc_get_joint_name(joint_by_uid[(*it).joint_uid]); - } - - BKE_object_defgroup_add_name(ob, name); - } - - /* - number of joints per vertex - joints_per_vertex - * - [[bone index, weight index] * joints per vertex] * vertices - weight indices - * ^ bone index can be -1 meaning weight toward bind shape, how to express this in Blender? - * - * for each vertex in weight indices - * for each bone index in vertex - * add vertex to group at group index - * treat group index -1 specially - * - * get def group by index with BLI_findlink */ - - for (uint vertex = 0, weight = 0; vertex < joints_per_vertex.getCount(); vertex++) { - - uint limit = weight + joints_per_vertex[vertex]; - for (; weight < limit; weight++) { - int joint = joint_indices[weight], joint_weight = weight_indices[weight]; - - /* -1 means "weight towards the bind shape", we just don't assign it to any group */ - if (joint != -1) { - const ListBase *defbase = BKE_object_defgroup_list(ob); - bDeformGroup *def = (bDeformGroup *)BLI_findlink(defbase, joint); - - blender::ed::object::vgroup_vert_add( - ob, def, vertex, weights[joint_weight], WEIGHT_REPLACE); - } - } - } -} - -bPoseChannel *SkinInfo::get_pose_channel_from_node(COLLADAFW::Node *node) -{ - return BKE_pose_channel_find_name(ob_arm->pose, bc_get_joint_name(node)); -} - -void SkinInfo::set_parent(Object *_parent) -{ - parent = _parent; -} - -Object *SkinInfo::get_parent() -{ - return parent; -} - -void SkinInfo::find_root_joints(const std::vector &root_joints, - std::map &joint_by_uid, - std::vector &result) -{ - std::vector::const_iterator it; - /* for each root_joint */ - for (it = root_joints.begin(); it != root_joints.end(); it++) { - COLLADAFW::Node *root = *it; - std::vector::iterator ji; - /* for each joint_data in this skin */ - for (ji = joint_data.begin(); ji != joint_data.end(); ji++) { - if (joint_by_uid.find((*ji).joint_uid) != joint_by_uid.end()) { - /* get joint node from joint map */ - COLLADAFW::Node *joint = joint_by_uid[(*ji).joint_uid]; - - /* find if joint node is in the tree belonging to the root_joint */ - if (find_node_in_tree(joint, root)) { - if (std::find(result.begin(), result.end(), root) == result.end()) { - result.push_back(root); - } - } - } - } - } -} - -bool SkinInfo::find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root) -{ - if (node == tree_root) { - return true; - } - - COLLADAFW::NodePointerArray &children = tree_root->getChildNodes(); - for (uint i = 0; i < children.getCount(); i++) { - if (find_node_in_tree(node, children[i])) { - return true; - } - } - - return false; -} diff --git a/source/blender/io/collada/SkinInfo.h b/source/blender/io/collada/SkinInfo.h deleted file mode 100644 index 07b26c30dca..00000000000 --- a/source/blender/io/collada/SkinInfo.h +++ /dev/null @@ -1,121 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include -#include - -#include "COLLADAFWNode.h" -#include "COLLADAFWSkinController.h" -#include "COLLADAFWSkinControllerData.h" -#include "COLLADAFWTypes.h" -#include "COLLADAFWUniqueId.h" - -#include "BKE_context.hh" -#include "DNA_object_types.h" - -#include "TransformReader.h" -#include "collada_internal.h" - -/** - * This is used to store data passed in write_controller_data. - * Arrays from #COLLADAFW::SkinControllerData lose ownership, so do this class members - * so that arrays don't get freed until we free them explicitly. - */ -class SkinInfo { - private: - /* to build armature bones from inverse bind matrices */ - struct JointData { - float inv_bind_mat[4][4]; /* joint inverse bind matrix */ - COLLADAFW::UniqueId joint_uid; /* joint node UID */ - // Object *ob_arm; /* armature object */ - }; - - float bind_shape_matrix[4][4]; - - /* data from COLLADAFW::SkinControllerData, each array should be freed */ - COLLADAFW::UIntValuesArray joints_per_vertex; - COLLADAFW::UIntValuesArray weight_indices; - COLLADAFW::IntValuesArray joint_indices; - // COLLADAFW::FloatOrDoubleArray weights; - std::vector weights; - - std::vector joint_data; /* index to this vector is joint index */ - - UnitConverter *unit_converter; - - Object *ob_arm; - COLLADAFW::UniqueId controller_uid; - Object *parent; - - public: - SkinInfo(); - SkinInfo(const SkinInfo &skin); - SkinInfo(UnitConverter *conv); - - /** Nobody owns the data after this, so it should be freed manually with releaseMemory. */ - template void transfer_array_data(T &src, T &dest); - - /** When src is const we cannot `src.yieldOwnerShip`, this is used by copy constructor. */ - void transfer_int_array_data_const(const COLLADAFW::IntValuesArray &src, - COLLADAFW::IntValuesArray &dest); - - void transfer_uint_array_data_const(const COLLADAFW::UIntValuesArray &src, - COLLADAFW::UIntValuesArray &dest); - - void borrow_skin_controller_data(const COLLADAFW::SkinControllerData *skin); - - void free(); - - /** - * Using inverse bind matrices to construct armature - * it is safe to invert them to get the original matrices - * because if they are inverse matrices, they can be inverted. - */ - void add_joint(const COLLADABU::Math::Matrix4 &matrix); - - void set_controller(const COLLADAFW::SkinController *co); - - /** Called from write_controller. */ - Object *create_armature(Main *bmain, Scene *scene, ViewLayer *view_layer); - - Object *set_armature(Object *ob_arm); - - bool get_joint_inv_bind_matrix(float inv_bind_mat[4][4], COLLADAFW::Node *node); - - Object *BKE_armature_from_object(); - - const COLLADAFW::UniqueId &get_controller_uid(); - - /** - * Check if this skin controller references a joint or any descendant of it - * - * some nodes may not be referenced by SkinController, - * in this case to determine if the node belongs to this armature, - * we need to search down the tree. - */ - bool uses_joint_or_descendant(COLLADAFW::Node *node); - - void link_armature(bContext *C, - Object *ob, - std::map &joint_by_uid, - TransformReader *tm); - - bPoseChannel *get_pose_channel_from_node(COLLADAFW::Node *node); - - void set_parent(Object *_parent); - - Object *get_parent(); - - void find_root_joints(const std::vector &root_joints, - std::map &joint_by_uid, - std::vector &result); - - bool find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root); -}; diff --git a/source/blender/io/collada/TransformReader.cpp b/source/blender/io/collada/TransformReader.cpp deleted file mode 100644 index d2a4c835cdf..00000000000 --- a/source/blender/io/collada/TransformReader.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "COLLADAFWMatrix.h" -#include "COLLADAFWRotate.h" -#include "COLLADAFWScale.h" -#include "COLLADAFWTranslate.h" - -#include "TransformReader.h" - -#include "BLI_math_matrix.h" -#include "BLI_math_rotation.h" - -TransformReader::TransformReader(UnitConverter *conv) : unit_converter(conv) -{ - /* pass */ -} - -void TransformReader::get_node_mat(float mat[4][4], - COLLADAFW::Node *node, - std::map *animation_map, - Object *ob) -{ - get_node_mat(mat, node, animation_map, ob, nullptr); -} - -void TransformReader::get_node_mat(float mat[4][4], - COLLADAFW::Node *node, - std::map *animation_map, - Object *ob, - float parent_mat[4][4]) -{ - float cur[4][4]; - float copy[4][4]; - - unit_m4(mat); - - for (uint i = 0; i < node->getTransformations().getCount(); i++) { - - COLLADAFW::Transformation *tm = node->getTransformations()[i]; - COLLADAFW::Transformation::TransformationType type = tm->getTransformationType(); - - switch (type) { - case COLLADAFW::Transformation::MATRIX: - /* When matrix AND Trans/Rot/Scale are defined for a node, - * then this is considered as redundant information. - * So if we find a Matrix we use that and return. */ - dae_matrix_to_mat4(tm, mat); - if (parent_mat) { - mul_m4_m4m4(mat, parent_mat, mat); - } - return; - case COLLADAFW::Transformation::TRANSLATE: - dae_translate_to_mat4(tm, cur); - break; - case COLLADAFW::Transformation::ROTATE: - dae_rotate_to_mat4(tm, cur); - break; - case COLLADAFW::Transformation::SCALE: - dae_scale_to_mat4(tm, cur); - break; - case COLLADAFW::Transformation::LOOKAT: - fprintf(stderr, "|! LOOKAT transformations are not supported yet.\n"); - break; - case COLLADAFW::Transformation::SKEW: - fprintf(stderr, "|! SKEW transformations are not supported yet.\n"); - break; - } - - copy_m4_m4(copy, mat); - mul_m4_m4m4(mat, copy, cur); - - if (animation_map) { - /* AnimationList that drives this Transformation */ - const COLLADAFW::UniqueId &anim_list_id = tm->getAnimationList(); - - /* store this so later we can link animation data with ob */ - Animation anim = {ob, node, tm}; - (*animation_map)[anim_list_id] = anim; - } - } - - if (parent_mat) { - mul_m4_m4m4(mat, parent_mat, mat); - } -} - -void TransformReader::dae_rotate_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]) -{ - COLLADAFW::Rotate *ro = (COLLADAFW::Rotate *)tm; - COLLADABU::Math::Vector3 &axis = ro->getRotationAxis(); - const float angle = float(DEG2RAD(ro->getRotationAngle())); - const float ax[] = {float(axis[0]), float(axis[1]), float(axis[2])}; -#if 0 - float quat[4]; - axis_angle_to_quat(quat, axis, angle); - quat_to_mat4(m, quat); -#endif - axis_angle_to_mat4(m, ax, angle); -} - -void TransformReader::dae_translate_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]) -{ - COLLADAFW::Translate *tra = (COLLADAFW::Translate *)tm; - COLLADABU::Math::Vector3 &t = tra->getTranslation(); - - unit_m4(m); - - m[3][0] = float(t[0]); - m[3][1] = float(t[1]); - m[3][2] = float(t[2]); -} - -void TransformReader::dae_scale_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]) -{ - COLLADABU::Math::Vector3 &s = ((COLLADAFW::Scale *)tm)->getScale(); - float size[3] = {float(s[0]), float(s[1]), float(s[2])}; - size_to_mat4(m, size); -} - -void TransformReader::dae_matrix_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]) -{ - UnitConverter::dae_matrix_to_mat4_(m, ((COLLADAFW::Matrix *)tm)->getMatrix()); -} - -void TransformReader::dae_translate_to_v3(COLLADAFW::Transformation *tm, float v[3]) -{ - dae_vector3_to_v3(((COLLADAFW::Translate *)tm)->getTranslation(), v); -} - -void TransformReader::dae_scale_to_v3(COLLADAFW::Transformation *tm, float v[3]) -{ - dae_vector3_to_v3(((COLLADAFW::Scale *)tm)->getScale(), v); -} - -void TransformReader::dae_vector3_to_v3(const COLLADABU::Math::Vector3 &v3, float v[3]) -{ - v[0] = v3.x; - v[1] = v3.y; - v[2] = v3.z; -} diff --git a/source/blender/io/collada/TransformReader.h b/source/blender/io/collada/TransformReader.h deleted file mode 100644 index 229b41ecdb2..00000000000 --- a/source/blender/io/collada/TransformReader.h +++ /dev/null @@ -1,54 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include - -#include "COLLADAFWNode.h" -#include "COLLADAFWTransformation.h" -#include "COLLADAFWUniqueId.h" -#include "Math/COLLADABUMathVector3.h" - -#include "DNA_object_types.h" - -#include "collada_internal.h" - -// struct Object; - -class TransformReader { - protected: - UnitConverter *unit_converter; - - public: - struct Animation { - Object *ob; - COLLADAFW::Node *node; - COLLADAFW::Transformation *tm; /* which transform is animated by an AnimationList->id */ - }; - - TransformReader(UnitConverter *conv); - - void get_node_mat(float mat[4][4], - COLLADAFW::Node *node, - std::map *animation_map, - Object *ob); - void get_node_mat(float mat[4][4], - COLLADAFW::Node *node, - std::map *animation_map, - Object *ob, - float parent_mat[4][4]); - - void dae_rotate_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]); - void dae_translate_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]); - void dae_scale_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]); - void dae_matrix_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]); - void dae_translate_to_v3(COLLADAFW::Transformation *tm, float v[3]); - void dae_scale_to_v3(COLLADAFW::Transformation *tm, float v[3]); - void dae_vector3_to_v3(const COLLADABU::Math::Vector3 &v3, float v[3]); -}; diff --git a/source/blender/io/collada/TransformWriter.cpp b/source/blender/io/collada/TransformWriter.cpp deleted file mode 100644 index 888ce4ef937..00000000000 --- a/source/blender/io/collada/TransformWriter.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "BLI_math_matrix.h" - -#include "BKE_object.hh" - -#include "TransformWriter.h" - -#include "collada_utils.h" - -void TransformWriter::add_joint_transform(COLLADASW::Node &node, - float mat[4][4], - float parent_mat[4][4], - BCExportSettings &export_settings, - bool has_restmat) -{ - float local[4][4]; - - if (parent_mat) { - float invpar[4][4]; - invert_m4_m4(invpar, parent_mat); - mul_m4_m4m4(local, invpar, mat); - } - else { - copy_m4_m4(local, mat); - } - - if (!has_restmat && export_settings.get_apply_global_orientation()) { - bc_apply_global_transform(local, export_settings.get_global_transform()); - } - - double dmat[4][4]; - UnitConverter::mat4_to_dae_double(dmat, local); - - if (export_settings.get_object_transformation_type() == BC_TRANSFORMATION_TYPE_MATRIX) { - node.addMatrix("transform", dmat); - } - else { - float loc[3], rot[3], scale[3]; - bc_decompose(local, loc, rot, nullptr, scale); - add_transform(node, loc, rot, scale); - } -} - -void TransformWriter::add_node_transform_ob(COLLADASW::Node &node, - Object *ob, - BCExportSettings &export_settings) -{ - bool limit_precision = export_settings.get_limit_precision(); - - /* Export the local Matrix (relative to the object parent, - * be it an object, bone or vertices (one or more)). */ - Matrix f_obmat; - BKE_object_matrix_local_get(ob, f_obmat); - - if (export_settings.get_apply_global_orientation()) { - bc_apply_global_transform(f_obmat, export_settings.get_global_transform()); - } - else { - bc_add_global_transform(f_obmat, export_settings.get_global_transform()); - } - - switch (export_settings.get_object_transformation_type()) { - case BC_TRANSFORMATION_TYPE_MATRIX: { - double d_obmat[4][4]; - UnitConverter::mat4_to_dae_double(d_obmat, f_obmat); - - if (limit_precision) { - BCMatrix::sanitize(d_obmat, LIMITTED_PRECISION); - } - node.addMatrix("transform", d_obmat); - break; - } - case BC_TRANSFORMATION_TYPE_DECOMPOSED: { - float loc[3], rot[3], scale[3]; - bc_decompose(f_obmat, loc, rot, nullptr, scale); - if (limit_precision) { - bc_sanitize_v3(loc, LIMITTED_PRECISION); - bc_sanitize_v3(rot, LIMITTED_PRECISION); - bc_sanitize_v3(scale, LIMITTED_PRECISION); - } - add_transform(node, loc, rot, scale); - break; - } - } -} - -void TransformWriter::add_node_transform_identity(COLLADASW::Node &node, - BCExportSettings &export_settings) -{ - BC_export_transformation_type transformation_type = - export_settings.get_object_transformation_type(); - switch (transformation_type) { - case BC_TRANSFORMATION_TYPE_MATRIX: { - BCMatrix mat; - DMatrix d_obmat; - mat.get_matrix(d_obmat); - node.addMatrix("transform", d_obmat); - break; - } - default: { - float loc[3] = {0.0f, 0.0f, 0.0f}; - float scale[3] = {1.0f, 1.0f, 1.0f}; - float rot[3] = {0.0f, 0.0f, 0.0f}; - add_transform(node, loc, rot, scale); - break; - } - } -} - -void TransformWriter::add_transform(COLLADASW::Node &node, - const float loc[3], - const float rot[3], - const float scale[3]) -{ - node.addScale("scale", scale[0], scale[1], scale[2]); - node.addRotateZ("rotationZ", RAD2DEGF(rot[2])); - node.addRotateY("rotationY", RAD2DEGF(rot[1])); - node.addRotateX("rotationX", RAD2DEGF(rot[0])); - node.addTranslate("location", loc[0], loc[1], loc[2]); -} diff --git a/source/blender/io/collada/TransformWriter.h b/source/blender/io/collada/TransformWriter.h deleted file mode 100644 index eb5843e28be..00000000000 --- a/source/blender/io/collada/TransformWriter.h +++ /dev/null @@ -1,34 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "COLLADASWNode.h" - -#include "DNA_object_types.h" - -#include "ExportSettings.h" - -class TransformWriter { - protected: - void add_joint_transform(COLLADASW::Node &node, - float mat[4][4], - float parent_mat[4][4], - BCExportSettings &export_settings, - bool has_restmat); - - void add_node_transform_ob(COLLADASW::Node &node, Object *ob, BCExportSettings &export_settings); - - void add_node_transform_identity(COLLADASW::Node &node, BCExportSettings &export_settings); - - private: - void add_transform(COLLADASW::Node &node, - const float loc[3], - const float rot[3], - const float scale[3]); -}; diff --git a/source/blender/io/collada/collada.cpp b/source/blender/io/collada/collada.cpp deleted file mode 100644 index cc53bd5c4ff..00000000000 --- a/source/blender/io/collada/collada.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* SPDX-FileCopyrightText: 2009-2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "collada.h" -#include "DocumentExporter.h" -#include "DocumentImporter.h" -#include "ExportSettings.h" -#include "ImportSettings.h" - -#include "BKE_context.hh" - -#include "BLI_linklist.h" - -static void print_import_header(ImportSettings &import_settings) -{ - fprintf(stderr, "+-- Collada Import parameters------\n"); - fprintf(stderr, "| input file : %s\n", import_settings.filepath); - fprintf(stderr, "| use units : %s\n", (import_settings.import_units) ? "yes" : "no"); - fprintf(stderr, "| custom normals : %s\n", (import_settings.custom_normals) ? "yes" : "no"); - fprintf(stderr, "| autoconnect : %s\n", (import_settings.auto_connect) ? "yes" : "no"); - fprintf(stderr, "+-- Armature Import parameters ----\n"); - fprintf(stderr, "| find bone chains: %s\n", (import_settings.find_chains) ? "yes" : "no"); - fprintf(stderr, "| min chain len : %d\n", import_settings.min_chain_length); - fprintf(stderr, "| fix orientation : %s\n", (import_settings.fix_orientation) ? "yes" : "no"); - fprintf(stderr, "| keep bind info : %s\n", (import_settings.keep_bind_info) ? "yes" : "no"); -} - -static void print_import_footer(int status) -{ - fprintf(stderr, "+----------------------------------\n"); - fprintf(stderr, "| Collada Import : %s\n", (status) ? "OK" : "FAIL"); - fprintf(stderr, "+----------------------------------\n"); -} - -int collada_import(bContext *C, ImportSettings *import_settings) -{ - print_import_header(*import_settings); - DocumentImporter imp(C, import_settings); - int status = imp.import() ? 1 : 0; - print_import_footer(status); - - return status; -} - -int collada_export(bContext *C, ExportSettings *export_settings) -{ - BlenderContext blender_context(C); - const Scene *scene = blender_context.get_scene(); - ViewLayer *view_layer = blender_context.get_view_layer(); - - int includeFilter = OB_REL_NONE; - if (export_settings->include_armatures) { - includeFilter |= OB_REL_MOD_ARMATURE; - } - if (export_settings->include_children) { - includeFilter |= OB_REL_CHILDREN_RECURSIVE; - } - - /* Fetch the complete set of exported objects - * ATTENTION: Invisible objects will not be exported - */ - eObjectSet objectSet = (export_settings->selected) ? OB_SET_SELECTED : OB_SET_ALL; - export_settings->export_set = BKE_object_relational_superset( - scene, view_layer, objectSet, (eObRelationTypes)includeFilter); - - int export_count = BLI_linklist_count(export_settings->export_set); - - if (export_count == 0) { - if (export_settings->selected) { - fprintf(stderr, - "Collada: Found no objects to export.\nPlease ensure that all objects which shall " - "be exported are also visible in the 3D Viewport.\n"); - } - else { - fprintf(stderr, "Collada: Your scene seems to be empty. No Objects will be exported.\n"); - } - } - else { - if (export_settings->sort_by_name) { - bc_bubble_sort_by_Object_name(export_settings->export_set); - } - } - - DocumentExporter exporter(blender_context, export_settings); - int status = exporter.exportCurrentScene(); - - BLI_linklist_free(export_settings->export_set, nullptr); - - return (status) ? -1 : export_count; -} diff --git a/source/blender/io/collada/collada.h b/source/blender/io/collada/collada.h deleted file mode 100644 index fb49efca1b1..00000000000 --- a/source/blender/io/collada/collada.h +++ /dev/null @@ -1,25 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include - -#include "ExportSettings.h" -#include "ImportSettings.h" - -#include "RNA_types.hh" - -struct bContext; - -/* - * both return 1 on success, 0 on error - */ -int collada_import(struct bContext *C, ImportSettings *import_settings); - -int collada_export(struct bContext *C, ExportSettings *export_settings); diff --git a/source/blender/io/collada/collada_internal.cpp b/source/blender/io/collada/collada_internal.cpp deleted file mode 100644 index dc8d6aa54a9..00000000000 --- a/source/blender/io/collada/collada_internal.cpp +++ /dev/null @@ -1,330 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2022 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "collada_internal.h" - -#include "BLI_math_matrix.h" -#include "BLI_math_rotation.h" - -#include "BKE_armature.hh" - -#include "RNA_access.hh" - -#include - -UnitConverter::UnitConverter() : up_axis(COLLADAFW::FileInfo::Z_UP) -{ - axis_angle_to_mat4_single(x_up_mat4, 'Y', -M_PI_2); - axis_angle_to_mat4_single(y_up_mat4, 'X', M_PI_2); - - unit_m4(z_up_mat4); - unit_m4(scale_mat4); -} - -void UnitConverter::read_asset(const COLLADAFW::FileInfo *asset) -{ - unit = asset->getUnit(); - up_axis = asset->getUpAxisType(); -} - -UnitConverter::UnitSystem UnitConverter::isMetricSystem() -{ - switch (unit.getLinearUnitUnit()) { - case COLLADAFW::FileInfo::Unit::MILLIMETER: - case COLLADAFW::FileInfo::Unit::CENTIMETER: - case COLLADAFW::FileInfo::Unit::DECIMETER: - case COLLADAFW::FileInfo::Unit::METER: - case COLLADAFW::FileInfo::Unit::KILOMETER: - return UnitConverter::Metric; - case COLLADAFW::FileInfo::Unit::INCH: - case COLLADAFW::FileInfo::Unit::FOOT: - case COLLADAFW::FileInfo::Unit::YARD: - return UnitConverter::Imperial; - default: - return UnitConverter::None; - } -} - -float UnitConverter::getLinearMeter() -{ - return float(unit.getLinearUnitMeter()); -} - -void UnitConverter::convertVector3(COLLADABU::Math::Vector3 &vec, float *v) -{ - v[0] = vec.x; - v[1] = vec.y; - v[2] = vec.z; -} - -/* TODO: need also for angle conversion, time conversion... */ - -void UnitConverter::dae_matrix_to_mat4_(float out[4][4], const COLLADABU::Math::Matrix4 &in) -{ - /* in DAE, matrices use columns vectors, (see comments in COLLADABUMathMatrix4.h) - * so here, to make a blender matrix, we swap columns and rows. */ - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - out[i][j] = in[j][i]; - } - } -} - -void UnitConverter::mat4_to_dae(float out[4][4], float in[4][4]) -{ - transpose_m4_m4(out, in); -} - -void UnitConverter::mat4_to_dae_double(double out[4][4], float in[4][4]) -{ - float mat[4][4]; - - mat4_to_dae(mat, in); - - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - out[i][j] = mat[i][j]; - } - } -} - -float (&UnitConverter::get_rotation())[4][4] -{ - switch (up_axis) { - case COLLADAFW::FileInfo::X_UP: - return x_up_mat4; - break; - case COLLADAFW::FileInfo::Y_UP: - return y_up_mat4; - break; - default: - return z_up_mat4; - break; - } -} - -float (&UnitConverter::get_scale())[4][4] -{ - return scale_mat4; -} - -void UnitConverter::calculate_scale(Scene &sce) -{ - PointerRNA unit_settings; - PropertyRNA *system_ptr, *scale_ptr; - PointerRNA scene_ptr = RNA_id_pointer_create(&sce.id); - - unit_settings = RNA_pointer_get(&scene_ptr, "unit_settings"); - system_ptr = RNA_struct_find_property(&unit_settings, "system"); - scale_ptr = RNA_struct_find_property(&unit_settings, "scale_length"); - - int type = RNA_property_enum_get(&unit_settings, system_ptr); - - float bl_scale; - - switch (type) { - case USER_UNIT_NONE: - bl_scale = 1.0; /* map 1 Blender unit to 1 Meter. */ - break; - - case USER_UNIT_METRIC: - bl_scale = RNA_property_float_get(&unit_settings, scale_ptr); - break; - - default: - bl_scale = RNA_property_float_get(&unit_settings, scale_ptr); - /* It looks like the conversion to Imperial is done implicitly. - * So nothing to do here. */ - break; - } - - float rescale[3]; - rescale[0] = rescale[1] = rescale[2] = getLinearMeter() / bl_scale; - - size_to_mat4(scale_mat4, rescale); -} - -/** - * Translation map. - * Used to translate every COLLADA id to a valid id, no matter what "wrong" letters may be - * included. Look at the IDREF XSD declaration for more. - * Follows strictly the COLLADA XSD declaration which explicitly allows non-English chars, - * like special chars (e.g. micro sign), umlauts and so on. - * The COLLADA spec also allows additional chars for member access ('.'), these - * must obviously be removed too, otherwise they would be heavily misinterpreted. - */ -const uchar translate_start_name_map[256] = { - - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 95, 95, 95, 95, - 95, 95, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 95, 95, 95, 95, 95, - - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, -}; - -const uchar translate_name_map[256] = { - - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 45, 95, 95, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 95, 95, 95, 95, 95, 95, 95, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 95, 95, 95, 95, - 95, 95, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 95, 95, 95, 95, 95, - - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, -}; - -using map_string_list = std::map>; -map_string_list global_id_map; - -void clear_global_id_map() -{ - global_id_map.clear(); -} - -std::string translate_id(const char *idString) -{ - std::string id = std::string(idString); - return translate_id(id); -} - -std::string translate_id(const std::string &id) -{ - if (id.empty()) { - return id; - } - - std::string id_translated = id; - id_translated[0] = translate_start_name_map[uint(id_translated[0])]; - for (uint i = 1; i < id_translated.size(); i++) { - id_translated[i] = translate_name_map[uint(id_translated[i])]; - } - /* It's so much workload now, the if () should speed up things. */ - if (id_translated != id) { - /* Search duplicates. */ - map_string_list::iterator iter = global_id_map.find(id_translated); - if (iter != global_id_map.end()) { - uint i = 0; - bool found = false; - for (i = 0; i < iter->second.size(); i++) { - if (id == iter->second[i]) { - found = true; - break; - } - } - bool convert = false; - if (found) { - if (i > 0) { - convert = true; - } - } - else { - convert = true; - global_id_map[id_translated].push_back(id); - } - if (convert) { - std::stringstream out; - out << ++i; - id_translated += out.str(); - } - } - else { - global_id_map[id_translated].push_back(id); - } - } - return id_translated; -} - -std::string id_name(void *id) -{ - return ((ID *)id)->name + 2; -} - -std::string encode_xml(const std::string &xml) -{ - const std::map escape{ - {'<', "<"}, {'>', ">"}, {'"', """}, {'\'', "'"}, {'&', "&"}}; - - std::map::const_iterator it; - std::string encoded_xml; - - for (char c : xml) { - it = escape.find(c); - - if (it == escape.end()) { - encoded_xml += c; - } - else { - encoded_xml += it->second; - } - } - return encoded_xml; -} - -std::string get_geometry_id(Object *ob) -{ - return translate_id(id_name(ob->data)) + "-mesh"; -} - -std::string get_geometry_id(Object *ob, bool use_instantiation) -{ - std::string geom_name = (use_instantiation) ? id_name(ob->data) : id_name(ob); - - return translate_id(geom_name) + "-mesh"; -} - -std::string get_light_id(Object *ob) -{ - return translate_id(id_name(ob)) + "-light"; -} - -std::string get_joint_sid(Bone *bone) -{ - return translate_id(bone->name); -} -static std::string get_joint_sid(EditBone *bone) -{ - return translate_id(bone->name); -} - -std::string get_camera_id(Object *ob) -{ - return translate_id(id_name(ob)) + "-camera"; -} - -std::string get_effect_id(Material *mat) -{ - return translate_id(id_name(mat)) + "-effect"; -} - -std::string get_material_id(Material *mat) -{ - return translate_id(id_name(mat)) + "-material"; -} - -std::string get_morph_id(Object *ob) -{ - return translate_id(id_name(ob)) + "-morph"; -} diff --git a/source/blender/io/collada/collada_internal.h b/source/blender/io/collada/collada_internal.h deleted file mode 100644 index c6463dda82e..00000000000 --- a/source/blender/io/collada/collada_internal.h +++ /dev/null @@ -1,80 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include - -#include "COLLADAFWFileInfo.h" -#include "Math/COLLADABUMathMatrix4.h" - -#include "DNA_armature_types.h" -#include "DNA_material_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -class UnitConverter { - private: - COLLADAFW::FileInfo::Unit unit; - COLLADAFW::FileInfo::UpAxisType up_axis; - - float x_up_mat4[4][4]; - float y_up_mat4[4][4]; - float z_up_mat4[4][4]; - float scale_mat4[4][4]; - - public: - enum UnitSystem { - None, - Metric, - Imperial, - }; - - /* Initialize with Z_UP, since Blender uses right-handed, z-up */ - UnitConverter(); - - void read_asset(const COLLADAFW::FileInfo *asset); - - void convertVector3(COLLADABU::Math::Vector3 &vec, float *v); - - UnitConverter::UnitSystem isMetricSystem(); - - float getLinearMeter(); - - /* TODO: need also for angle conversion, time conversion... */ - - static void dae_matrix_to_mat4_(float out[4][4], const COLLADABU::Math::Matrix4 &in); - static void mat4_to_dae(float out[4][4], float in[4][4]); - static void mat4_to_dae_double(double out[4][4], float in[4][4]); - - float (&get_rotation())[4][4]; - float (&get_scale())[4][4]; - void calculate_scale(Scene &sce); -}; - -extern void clear_global_id_map(); -/** Look at documentation of translate_map */ -extern std::string translate_id(const std::string &id); -/** Look at documentation of translate_map */ -extern std::string translate_id(const char *idString); - -extern std::string id_name(void *id); -extern std::string encode_xml(const std::string &xml); - -extern std::string get_geometry_id(Object *ob); -extern std::string get_geometry_id(Object *ob, bool use_instantiation); - -extern std::string get_light_id(Object *ob); - -extern std::string get_joint_sid(Bone *bone); - -extern std::string get_camera_id(Object *ob); -extern std::string get_morph_id(Object *ob); - -extern std::string get_effect_id(Material *mat); -extern std::string get_material_id(Material *mat); diff --git a/source/blender/io/collada/collada_utils.cpp b/source/blender/io/collada/collada_utils.cpp deleted file mode 100644 index 089eadd5139..00000000000 --- a/source/blender/io/collada/collada_utils.cpp +++ /dev/null @@ -1,1317 +0,0 @@ -/* SPDX-FileCopyrightText: 2010-2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#include "COLLADAFWMeshVertexData.h" -#include "COLLADAFWNode.h" - -#include -#include - -#include "DNA_armature_types.h" -#include "DNA_constraint_types.h" -#include "DNA_customdata_types.h" -#include "DNA_key_types.h" -#include "DNA_mesh_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" - -#include "BLI_linklist.h" -#include "BLI_listbase.h" -#include "BLI_math_matrix.h" -#include "BLI_string.h" - -#include "BKE_action.hh" -#include "BKE_armature.hh" -#include "BKE_constraint.h" -#include "BKE_context.hh" -#include "BKE_customdata.hh" -#include "BKE_global.hh" -#include "BKE_idprop.hh" -#include "BKE_key.hh" -#include "BKE_layer.hh" -#include "BKE_lib_id.hh" -#include "BKE_material.hh" -#include "BKE_mesh.hh" -#include "BKE_mesh_legacy_convert.hh" -#include "BKE_mesh_runtime.hh" -#include "BKE_mesh_wrapper.hh" -#include "BKE_node.hh" -#include "BKE_node_legacy_types.hh" -#include "BKE_node_runtime.hh" -#include "BKE_object.hh" -#include "BKE_scene.hh" - -#include "ANIM_action.hh" -#include "ANIM_action_legacy.hh" -#include "ANIM_bone_collections.hh" - -#include "ED_node.hh" -#include "ED_object.hh" -#include "ED_screen.hh" - -#include "WM_api.hh" /* XXX hrm, see if we can do without this */ -#include "WM_types.hh" - -#include "bmesh.hh" -#include "bmesh_tools.hh" - -#include "DEG_depsgraph.hh" -#include "DEG_depsgraph_query.hh" - -#include "BlenderContext.h" -#include "ExportSettings.h" -#include "ExtraTags.h" -#include "collada_utils.h" - -float bc_get_float_value(const COLLADAFW::FloatOrDoubleArray &array, uint index) -{ - if (index >= array.getValuesCount()) { - return 0.0f; - } - - if (array.getType() == COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT) { - return array.getFloatValues()->getData()[index]; - } - - return array.getDoubleValues()->getData()[index]; -} - -int bc_test_parent_loop(Object *par, Object *ob) -{ - /* Copied from `editors/object/object_relations.cc`. */ - - /* test if 'ob' is a parent somewhere in par's parents */ - - if (par == nullptr) { - return 0; - } - if (ob == par) { - return 1; - } - - return bc_test_parent_loop(par->parent, ob); -} - -bool bc_validateConstraints(bConstraint *con) -{ - const bConstraintTypeInfo *cti = BKE_constraint_typeinfo_get(con); - - /* these we can skip completely (invalid constraints...) */ - if (cti == nullptr) { - return false; - } - if (con->flag & (CONSTRAINT_DISABLE | CONSTRAINT_OFF)) { - return false; - } - - /* these constraints can't be evaluated anyway */ - if (cti->evaluate_constraint == nullptr) { - return false; - } - - /* influence == 0 should be ignored */ - if (con->enforce == 0.0f) { - return false; - } - - /* validation passed */ - return true; -} - -bool bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space) -{ - Scene *scene = CTX_data_scene(C); - int partype = blender::ed::object::PAR_OBJECT; - const bool xmirror = false; - const bool keep_transform = false; - - if (par && is_parent_space) { - mul_m4_m4m4(ob->runtime->object_to_world.ptr(), - par->object_to_world().ptr(), - ob->object_to_world().ptr()); - } - - bool ok = blender::ed::object::parent_set( - nullptr, C, scene, ob, par, partype, xmirror, keep_transform, nullptr); - return ok; -} - -std::vector bc_getSceneActions(const bContext *C, Object *ob, bool all_actions) -{ - std::vector actions; - if (all_actions) { - Main *bmain = CTX_data_main(C); - ID *id; - - for (id = (ID *)bmain->actions.first; id; id = (ID *)(id->next)) { - bAction *act = (bAction *)id; - /* XXX This currently creates too many actions. - * TODO: Need to check if the action is compatible to the given object. */ - actions.push_back(act); - } - } - else { - bAction *action = bc_getSceneObjectAction(ob); - actions.push_back(action); - } - - return actions; -} - -std::string bc_get_action_id(const std::string &action_name, - const std::string &ob_name, - const std::string &channel_type, - const std::string &axis_name, - const std::string &axis_separator) -{ - std::string result = action_name + "_" + channel_type; - if (ob_name.length() > 0) { - result = ob_name + "_" + result; - } - if (axis_name.length() > 0) { - result += axis_separator + axis_name; - } - return translate_id(result); -} - -void bc_update_scene(BlenderContext &blender_context, float ctime) -{ - Main *bmain = blender_context.get_main(); - Scene *scene = blender_context.get_scene(); - Depsgraph *depsgraph = blender_context.get_depsgraph(); - - /* See remark in `physics_fluid.cc` lines 395...) */ - // BKE_scene_update_for_newframe(ev_context, bmain, scene, scene->lay); - BKE_scene_frame_set(scene, ctime); - ED_update_for_newframe(bmain, depsgraph); -} - -Object *bc_add_object(Main *bmain, Scene *scene, ViewLayer *view_layer, int type, const char *name) -{ - Object *ob = BKE_object_add_only_object(bmain, type, name); - - ob->data = BKE_object_obdata_add_from_type(bmain, type, name); - DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION); - - LayerCollection *layer_collection = BKE_layer_collection_get_active(view_layer); - BKE_collection_object_add(bmain, layer_collection->collection, ob); - - BKE_view_layer_synced_ensure(scene, view_layer); - Base *base = BKE_view_layer_base_find(view_layer, ob); - /* TODO: is setting active needed? */ - BKE_view_layer_base_select_and_set_active(view_layer, base); - - return ob; -} - -static void bc_add_armature_collections(COLLADAFW::Node *node, - ExtraTags *node_extra_tags, - bArmature *arm) -{ - if (!node_extra_tags) { - /* No 'extra' tags means that there are no bone collections. */ - return; - } - - std::vector collection_names = node_extra_tags->dataSplitString("collections"); - std::vector visible_names = node_extra_tags->dataSplitString("visible_collections"); - std::set visible_names_set(visible_names.begin(), visible_names.end()); - for (const std::string &name : collection_names) { - BoneCollection *bcoll = ANIM_armature_bonecoll_new(arm, name.c_str()); - if (visible_names_set.find(name) == visible_names_set.end()) { - ANIM_bonecoll_hide(arm, bcoll); - } - else { - ANIM_bonecoll_show(arm, bcoll); - } - } - - std::string active_name; - active_name = node_extra_tags->setData("active_collection", active_name); - ANIM_armature_bonecoll_active_name_set(arm, active_name.c_str()); -} - -Object *bc_add_armature(COLLADAFW::Node *node, - ExtraTags *node_extra_tags, - Main *bmain, - Scene *scene, - ViewLayer *view_layer, - int type, - const char *name) -{ - Object *ob = bc_add_object(bmain, scene, view_layer, type, name); - bc_add_armature_collections(node, node_extra_tags, reinterpret_cast(ob->data)); - return ob; -} - -Mesh *bc_get_mesh_copy(BlenderContext &blender_context, - Object *ob, - BC_export_mesh_type export_mesh_type, - bool apply_modifiers, - bool triangulate) -{ - const Mesh *tmpmesh = nullptr; - if (apply_modifiers) { -#if 0 /* Not supported by new system currently... */ - switch (export_mesh_type) { - case BC_MESH_TYPE_VIEW: { - dm = mesh_create_derived_view(depsgraph, scene, ob, &mask); - break; - } - case BC_MESH_TYPE_RENDER: { - dm = mesh_create_derived_render(depsgraph, scene, ob, &mask); - break; - } - } -#else - Depsgraph *depsgraph = blender_context.get_depsgraph(); - const Object *ob_eval = DEG_get_evaluated(depsgraph, ob); - tmpmesh = BKE_object_get_evaluated_mesh(ob_eval); -#endif - } - else { - tmpmesh = (Mesh *)ob->data; - } - - Mesh *mesh = BKE_mesh_copy_for_eval(*tmpmesh); - - /* Ensure data exists if currently in edit mode. */ - BKE_mesh_wrapper_ensure_mdata(mesh); - - if (triangulate) { - bc_triangulate_mesh(mesh); - } - BKE_mesh_tessface_ensure(mesh); - - return mesh; -} - -Object *bc_get_assigned_armature(Object *ob) -{ - Object *ob_arm = nullptr; - - if (ob->parent && ob->partype == PARSKEL && ob->parent->type == OB_ARMATURE) { - ob_arm = ob->parent; - } - else { - LISTBASE_FOREACH (ModifierData *, mod, &ob->modifiers) { - if (mod->type == eModifierType_Armature) { - ob_arm = ((ArmatureModifierData *)mod)->object; - } - } - } - - return ob_arm; -} - -bool bc_has_object_type(LinkNode *export_set, short obtype) -{ - LinkNode *node; - - for (node = export_set; node; node = node->next) { - Object *ob = (Object *)node->link; - /* XXX: why is this checking for ob->data? - we could be looking for empties. */ - if (ob->type == obtype && ob->data) { - return true; - } - } - return false; -} - -void bc_bubble_sort_by_Object_name(LinkNode *export_set) -{ - /* Use bubble sort algorithm for sorting the export set. */ - - bool sorted = false; - LinkNode *node; - for (node = export_set; node->next && !sorted; node = node->next) { - - sorted = true; - - LinkNode *current; - for (current = export_set; current->next; current = current->next) { - Object *a = (Object *)current->link; - Object *b = (Object *)current->next->link; - - if (strcmp(a->id.name, b->id.name) > 0) { - current->link = b; - current->next->link = a; - sorted = false; - } - } - } -} - -bool bc_is_root_bone(Bone *aBone, bool deform_bones_only) -{ - if (deform_bones_only) { - Bone *root = nullptr; - Bone *bone = aBone; - while (bone) { - if (!(bone->flag & BONE_NO_DEFORM)) { - root = bone; - } - bone = bone->parent; - } - return (aBone == root); - } - - return !(aBone->parent); -} - -int bc_get_active_UVLayer(Object *ob) -{ - Mesh *mesh = (Mesh *)ob->data; - return CustomData_get_active_layer_index(&mesh->corner_data, CD_PROP_FLOAT2); -} - -std::string bc_url_encode(const std::string &data) -{ - /* XXX We probably do not need to do a full encoding. - * But in case that is necessary,then it can be added here. - */ - return bc_replace_string(data, "#", "%23"); -} - -std::string bc_replace_string(std::string data, - const std::string &pattern, - const std::string &replacement) -{ - size_t pos = 0; - while ((pos = data.find(pattern, pos)) != std::string::npos) { - data.replace(pos, pattern.length(), replacement); - pos += replacement.length(); - } - return data; -} - -void bc_match_scale(Object *ob, UnitConverter &bc_unit, bool scale_to_scene) -{ - if (scale_to_scene) { - mul_m4_m4m4( - ob->runtime->object_to_world.ptr(), bc_unit.get_scale(), ob->object_to_world().ptr()); - } - mul_m4_m4m4( - ob->runtime->object_to_world.ptr(), bc_unit.get_rotation(), ob->object_to_world().ptr()); - BKE_object_apply_mat4(ob, ob->object_to_world().ptr(), false, false); -} - -void bc_match_scale(std::vector *objects_done, - UnitConverter &bc_unit, - bool scale_to_scene) -{ - for (Object *ob : *objects_done) { - if (ob->parent == nullptr) { - bc_match_scale(ob, bc_unit, scale_to_scene); - } - } -} - -void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], float *size) -{ - if (size) { - mat4_to_size(size, mat); - } - - if (eul) { - mat4_to_eul(eul, mat); - } - - if (quat) { - mat4_to_quat(quat, mat); - } - - if (loc) { - copy_v3_v3(loc, mat[3]); - } -} - -void bc_rotate_from_reference_quat(float quat_to[4], float quat_from[4], float mat_to[4][4]) -{ - float qd[4]; - float matd[4][4]; - float mati[4][4]; - float mat_from[4][4]; - quat_to_mat4(mat_from, quat_from); - - /* Calculate the difference matrix matd between mat_from and mat_to */ - invert_m4_m4(mati, mat_from); - mul_m4_m4m4(matd, mati, mat_to); - - mat4_to_quat(qd, matd); - - mul_qt_qtqt(quat_to, qd, quat_from); /* rot is the final rotation corresponding to mat_to */ -} - -void bc_triangulate_mesh(Mesh *mesh) -{ - bool use_beauty = false; - bool tag_only = false; - - /* XXX: The triangulation method selection could be offered in the UI. */ - int quad_method = MOD_TRIANGULATE_QUAD_SHORTEDGE; - - const BMeshCreateParams bm_create_params{}; - BMesh *bm = BM_mesh_create(&bm_mesh_allocsize_default, &bm_create_params); - BMeshFromMeshParams bm_from_me_params{}; - bm_from_me_params.calc_face_normal = true; - bm_from_me_params.calc_vert_normal = true; - BM_mesh_bm_from_me(bm, mesh, &bm_from_me_params); - BM_mesh_triangulate(bm, quad_method, use_beauty, 4, tag_only, nullptr, nullptr, nullptr); - - BMeshToMeshParams bm_to_me_params{}; - bm_to_me_params.calc_object_remap = false; - BM_mesh_bm_to_me(nullptr, bm, mesh, &bm_to_me_params); - BM_mesh_free(bm); -} - -bool bc_is_leaf_bone(Bone *bone) -{ - LISTBASE_FOREACH (Bone *, child, &bone->childbase) { - if (child->flag & BONE_CONNECTED) { - return false; - } - } - return true; -} - -EditBone *bc_get_edit_bone(bArmature *armature, const char *name) -{ - LISTBASE_FOREACH (EditBone *, eBone, armature->edbo) { - if (STREQ(name, eBone->name)) { - return eBone; - } - } - - return nullptr; -} -int bc_set_layer(int bitfield, int layer) -{ - return bc_set_layer(bitfield, layer, true); /* enable */ -} - -int bc_set_layer(int bitfield, int layer, bool enable) -{ - int bit = 1u << layer; - - if (enable) { - bitfield |= bit; - } - else { - bitfield &= ~bit; - } - - return bitfield; -} - -BoneExtensionMap &BoneExtensionManager::getExtensionMap(bArmature *armature) -{ - std::string key = armature->id.name; - BoneExtensionMap *result = extended_bone_maps[key]; - if (result == nullptr) { - result = new BoneExtensionMap(); - extended_bone_maps[key] = result; - } - return *result; -} - -BoneExtensionManager::~BoneExtensionManager() -{ - std::map::iterator map_it; - for (map_it = extended_bone_maps.begin(); map_it != extended_bone_maps.end(); ++map_it) { - BoneExtensionMap *extended_bones = map_it->second; - for (auto &extended_bone : *extended_bones) { - delete extended_bone.second; - } - extended_bones->clear(); - delete extended_bones; - } -} - -BoneExtended::BoneExtended(EditBone *aBone) -{ - this->set_name(aBone->name); - this->chain_length = 0; - this->is_leaf = false; - this->tail[0] = 0.0f; - this->tail[1] = 0.5f; - this->tail[2] = 0.0f; - this->use_connect = -1; - this->roll = 0; - - this->has_custom_tail = false; - this->has_custom_roll = false; -} - -char *BoneExtended::get_name() -{ - return name; -} - -void BoneExtended::set_name(const char *aName) -{ - STRNCPY(name, aName); -} - -int BoneExtended::get_chain_length() -{ - return chain_length; -} - -void BoneExtended::set_chain_length(const int aLength) -{ - chain_length = aLength; -} - -void BoneExtended::set_leaf_bone(bool state) -{ - is_leaf = state; -} - -bool BoneExtended::is_leaf_bone() -{ - return is_leaf; -} - -void BoneExtended::set_roll(float roll) -{ - this->roll = roll; - this->has_custom_roll = true; -} - -bool BoneExtended::has_roll() -{ - return this->has_custom_roll; -} - -float BoneExtended::get_roll() -{ - return this->roll; -} - -void BoneExtended::set_tail(const float vec[]) -{ - this->tail[0] = vec[0]; - this->tail[1] = vec[1]; - this->tail[2] = vec[2]; - this->has_custom_tail = true; -} - -bool BoneExtended::has_tail() -{ - return this->has_custom_tail; -} - -float *BoneExtended::get_tail() -{ - return this->tail; -} - -inline bool isInteger(const std::string &s) -{ - if (s.empty() || (!isdigit(s[0]) && (s[0] != '-') && (s[0] != '+'))) { - return false; - } - - char *p; - strtol(s.c_str(), &p, 10); - - return (*p == 0); -} - -void BoneExtended::set_bone_collections(std::vector bone_collections) -{ - this->bone_collections = bone_collections; -} -const std::vector &BoneExtended::get_bone_collections() -{ - return this->bone_collections; -} - -void BoneExtended::set_use_connect(int use_connect) -{ - this->use_connect = use_connect; -} - -int BoneExtended::get_use_connect() -{ - return this->use_connect; -} - -void bc_set_IDPropertyMatrix(EditBone *ebone, const char *key, float mat[4][4]) -{ - IDProperty *idgroup = ebone->prop; - if (idgroup == nullptr) { - idgroup = blender::bke::idprop::create_group("RNA_EditBone ID properties").release(); - ebone->prop = idgroup; - } - - IDProperty *data = blender::bke::idprop::create( - key, blender::Span(reinterpret_cast(mat), 16)) - .release(); - - IDP_AddToGroup(idgroup, data); -} - -#if 0 -/** - * Stores a Float value as a custom bone property - * - * NOTE: This function is currently not needed. Keep for future usage - */ -static void bc_set_IDProperty(EditBone *ebone, const char *key, float value) -{ - if (ebone->prop == nullptr) { - IDPropertyTemplate val = {0}; - ebone->prop = blender::bke::idprop::create_group( "RNA_EditBone ID properties").release(); - } - - IDProperty *pgroup = (IDProperty *)ebone->prop; - IDP_AddToGroup(pgroup, blender::bke::idprop::create(key, value).release()); -} -#endif - -IDProperty *bc_get_IDProperty(Bone *bone, const std::string &key) -{ - return (bone->prop == nullptr) ? nullptr : IDP_GetPropertyFromGroup(bone->prop, key.c_str()); -} - -float bc_get_property(Bone *bone, const std::string &key, float def) -{ - float result = def; - IDProperty *property = bc_get_IDProperty(bone, key); - if (property) { - switch (property->type) { - case IDP_INT: - result = float(IDP_Int(property)); - break; - case IDP_FLOAT: - result = IDP_Float(property); - break; - case IDP_DOUBLE: - result = float(IDP_Double(property)); - break; - case IDP_BOOLEAN: - result = float(IDP_Bool(property)); - break; - default: - result = def; - } - } - return result; -} - -bool bc_get_property_matrix(Bone *bone, const std::string &key, float mat[4][4]) -{ - IDProperty *property = bc_get_IDProperty(bone, key); - if (property && property->type == IDP_ARRAY && property->len == 16) { - float *array = (float *)IDP_Array(property); - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - mat[i][j] = array[4 * i + j]; - } - } - return true; - } - return false; -} - -void bc_get_property_vector(Bone *bone, const std::string &key, float val[3], const float def[3]) -{ - val[0] = bc_get_property(bone, key + "_x", def[0]); - val[1] = bc_get_property(bone, key + "_y", def[1]); - val[2] = bc_get_property(bone, key + "_z", def[2]); -} - -/** - * Check if vector exist stored in 3 custom properties (used in Blender <= 2.78) - */ -static bool has_custom_props(Bone *bone, bool enabled, const std::string &key) -{ - if (!enabled) { - return false; - } - - return (bc_get_IDProperty(bone, key + "_x") || bc_get_IDProperty(bone, key + "_y") || - bc_get_IDProperty(bone, key + "_z")); -} - -void bc_enable_fcurves(AnimData *adt, const char *bone_name) -{ - if (adt == nullptr) { - return; - } - - char prefix[200]; - - if (bone_name) { - char bone_name_esc[sizeof(Bone::name) * 2]; - BLI_str_escape(bone_name_esc, bone_name, sizeof(bone_name_esc)); - SNPRINTF(prefix, "pose.bones[\"%s\"]", bone_name_esc); - } - - for (FCurve *fcu : blender::animrig::legacy::fcurves_for_assigned_action(adt)) { - if (bone_name) { - if (STREQLEN(fcu->rna_path, prefix, strlen(prefix))) { - fcu->flag &= ~FCURVE_DISABLED; - } - else { - fcu->flag |= FCURVE_DISABLED; - } - } - else { - fcu->flag &= ~FCURVE_DISABLED; - } - } -} - -bool bc_bone_matrix_local_get(Object *ob, Bone *bone, Matrix &mat, bool for_opensim) -{ - - /* Ok, lets be super cautious and check if the bone exists */ - bPose *pose = ob->pose; - bPoseChannel *pchan = BKE_pose_channel_find_name(pose, bone->name); - if (!pchan) { - return false; - } - - bPoseChannel *parchan = pchan->parent; - - bc_enable_fcurves(ob->adt, bone->name); - float ipar[4][4]; - - if (bone->parent) { - invert_m4_m4(ipar, parchan->pose_mat); - mul_m4_m4m4(mat, ipar, pchan->pose_mat); - } - else { - copy_m4_m4(mat, pchan->pose_mat); - } - - /* OPEN_SIM_COMPATIBILITY - * AFAIK animation to second life is via BVH, but no - * reason to not have the collada-animation be correct */ - if (for_opensim) { - float temp[4][4]; - copy_m4_m4(temp, bone->arm_mat); - temp[3][0] = temp[3][1] = temp[3][2] = 0.0f; - invert_m4(temp); - - mul_m4_m4m4(mat, mat, temp); - - if (bone->parent) { - copy_m4_m4(temp, bone->parent->arm_mat); - temp[3][0] = temp[3][1] = temp[3][2] = 0.0f; - - mul_m4_m4m4(mat, temp, mat); - } - } - bc_enable_fcurves(ob->adt, nullptr); - return true; -} - -bool bc_is_animated(BCMatrixSampleMap &values) -{ - static float MIN_DISTANCE = 0.00001; - - if (values.size() < 2) { - return false; /* need at least 2 entries to be not flat */ - } - - BCMatrixSampleMap::iterator it; - const BCMatrix *refmat = nullptr; - for (it = values.begin(); it != values.end(); ++it) { - const BCMatrix *matrix = it->second; - - if (refmat == nullptr) { - refmat = matrix; - continue; - } - - if (!matrix->in_range(*refmat, MIN_DISTANCE)) { - return true; - } - } - return false; -} - -bool bc_has_animations(Object *ob) -{ - /* Check for object, light and camera transform animations */ - if (blender::animrig::legacy::assigned_action_has_keyframes(ob->adt) || - blender::animrig::legacy::assigned_action_has_keyframes(bc_getSceneLightAnimData(ob)) || - blender::animrig::legacy::assigned_action_has_keyframes(bc_getSceneCameraAnimData(ob))) - { - return true; - } - - /* Check Material Effect parameter animations. */ - for (int a = 0; a < ob->totcol; a++) { - Material *ma = BKE_object_material_get(ob, a + 1); - if (!ma) { - continue; - } - if (blender::animrig::legacy::assigned_action_has_keyframes(bc_getSceneMaterialAnimData(ma))) { - return true; - } - } - - Key *key = BKE_key_from_object(ob); - if (key && blender::animrig::legacy::assigned_action_has_keyframes(key->adt)) { - return true; - } - - return false; -} - -bool bc_has_animations(Scene *sce, LinkNode *export_set) -{ - LinkNode *node; - if (export_set) { - for (node = export_set; node; node = node->next) { - Object *ob = (Object *)node->link; - - if (bc_has_animations(ob)) { - return true; - } - } - } - return false; -} - -void bc_add_global_transform(Matrix &to_mat, - const Matrix &from_mat, - const BCMatrix &global_transform, - const bool invert) -{ - copy_m4_m4(to_mat, from_mat); - bc_add_global_transform(to_mat, global_transform, invert); -} - -void bc_add_global_transform(Vector &to_vec, - const Vector &from_vec, - const BCMatrix &global_transform, - const bool invert) -{ - copy_v3_v3(to_vec, from_vec); - bc_add_global_transform(to_vec, global_transform, invert); -} - -void bc_add_global_transform(Matrix &to_mat, const BCMatrix &global_transform, const bool invert) -{ - BCMatrix mat(to_mat); - mat.add_transform(global_transform, invert); - mat.get_matrix(to_mat); -} - -void bc_add_global_transform(Vector &to_vec, const BCMatrix &global_transform, const bool invert) -{ - Matrix mat; - Vector from_vec; - copy_v3_v3(from_vec, to_vec); - global_transform.get_matrix(mat, false, 6, invert); - mul_v3_m4v3(to_vec, mat, from_vec); -} - -void bc_apply_global_transform(Matrix &to_mat, const BCMatrix &global_transform, const bool invert) -{ - BCMatrix mat(to_mat); - mat.apply_transform(global_transform, invert); - mat.get_matrix(to_mat); -} - -void bc_apply_global_transform(Vector &to_vec, const BCMatrix &global_transform, const bool invert) -{ - Matrix transform; - global_transform.get_matrix(transform); - mul_v3_m4v3(to_vec, transform, to_vec); -} - -void bc_create_restpose_mat(BCExportSettings &export_settings, - Bone *bone, - float to_mat[4][4], - float from_mat[4][4], - bool use_local_space) -{ - float loc[3]; - float rot[3]; - float scale[3]; - static const float V0[3] = {0, 0, 0}; - - if (!has_custom_props(bone, export_settings.get_keep_bind_info(), "restpose_loc") && - !has_custom_props(bone, export_settings.get_keep_bind_info(), "restpose_rot") && - !has_custom_props(bone, export_settings.get_keep_bind_info(), "restpose_scale")) - { - /* No need */ - copy_m4_m4(to_mat, from_mat); - return; - } - - bc_decompose(from_mat, loc, rot, nullptr, scale); - loc_eulO_size_to_mat4(to_mat, loc, rot, scale, 6); - - if (export_settings.get_keep_bind_info()) { - bc_get_property_vector(bone, "restpose_loc", loc, loc); - - if (use_local_space && bone->parent) { - Bone *b = bone; - while (b->parent) { - b = b->parent; - float ploc[3]; - bc_get_property_vector(b, "restpose_loc", ploc, V0); - loc[0] += ploc[0]; - loc[1] += ploc[1]; - loc[2] += ploc[2]; - } - } - } - - if (export_settings.get_keep_bind_info()) { - if (bc_get_IDProperty(bone, "restpose_rot_x")) { - rot[0] = DEG2RADF(bc_get_property(bone, "restpose_rot_x", 0)); - } - if (bc_get_IDProperty(bone, "restpose_rot_y")) { - rot[1] = DEG2RADF(bc_get_property(bone, "restpose_rot_y", 0)); - } - if (bc_get_IDProperty(bone, "restpose_rot_z")) { - rot[2] = DEG2RADF(bc_get_property(bone, "restpose_rot_z", 0)); - } - } - - if (export_settings.get_keep_bind_info()) { - bc_get_property_vector(bone, "restpose_scale", scale, scale); - } - - loc_eulO_size_to_mat4(to_mat, loc, rot, scale, 6); -} - -void bc_sanitize_v3(float v[3], int precision) -{ - for (int i = 0; i < 3; i++) { - double val = double(v[i]); - val = double_round(val, precision); - v[i] = float(val); - } -} - -void bc_sanitize_v3(double v[3], int precision) -{ - for (int i = 0; i < 3; i++) { - v[i] = double_round(v[i], precision); - } -} - -void bc_copy_m4_farray(float r[4][4], float *a) -{ - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - r[i][j] = *a++; - } - } -} - -void bc_copy_farray_m4(float *r, float a[4][4]) -{ - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - *r++ = a[i][j]; - } - } -} - -void bc_copy_darray_m4d(double *r, double a[4][4]) -{ - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - *r++ = a[i][j]; - } - } -} - -void bc_copy_v44_m4d(std::vector> &r, double (&a)[4][4]) -{ - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - r[i][j] = a[i][j]; - } - } -} - -void bc_copy_m4d_v44(double (&r)[4][4], std::vector> &a) -{ - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - r[i][j] = a[i][j]; - } - } -} - -/** - * Returns name of Active UV Layer or empty String if no active UV Layer defined - */ -static std::string bc_get_active_uvlayer_name(Mesh *mesh) -{ - int num_layers = CustomData_number_of_layers(&mesh->corner_data, CD_PROP_FLOAT2); - if (num_layers) { - const char *layer_name = bc_CustomData_get_active_layer_name(&mesh->corner_data, - CD_PROP_FLOAT2); - if (layer_name) { - return std::string(layer_name); - } - } - return ""; -} - -/** - * Returns name of Active UV Layer or empty String if no active UV Layer defined. - * Assuming the Object is of type MESH - */ -static std::string bc_get_active_uvlayer_name(Object *ob) -{ - Mesh *mesh = (Mesh *)ob->data; - return bc_get_active_uvlayer_name(mesh); -} - -/** - * Returns UV Layer name or empty string if layer index is out of range - */ -static std::string bc_get_uvlayer_name(Mesh *mesh, int layer) -{ - int num_layers = CustomData_number_of_layers(&mesh->corner_data, CD_PROP_FLOAT2); - if (num_layers && layer < num_layers) { - const char *layer_name = bc_CustomData_get_layer_name( - &mesh->corner_data, CD_PROP_FLOAT2, layer); - if (layer_name) { - return std::string(layer_name); - } - } - return ""; -} - -static bNodeTree *prepare_material_nodetree(Material *ma) -{ - if (ma->nodetree == nullptr) { - blender::bke::node_tree_add_tree_embedded( - nullptr, &ma->id, "Shader Nodetree", "ShaderNodeTree"); - ma->use_nodes = true; - } - return ma->nodetree; -} - -static bNode *bc_add_node( - bContext *C, bNodeTree *ntree, int node_type, int locx, int locy, const std::string &label) -{ - bNode *node = blender::bke::node_add_static_node(C, *ntree, node_type); - if (node) { - if (label.length() > 0) { - STRNCPY(node->label, label.c_str()); - } - node->location[0] = locx; - node->location[1] = locy; - node->flag |= NODE_SELECT; - } - return node; -} - -static bNode *bc_add_node(bContext *C, bNodeTree *ntree, int node_type, int locx, int locy) -{ - return bc_add_node(C, ntree, node_type, locx, locy, ""); -} - -static void bc_node_add_link( - bNodeTree *ntree, bNode *from_node, int from_index, bNode *to_node, int to_index) -{ - bNodeSocket *from_socket = (bNodeSocket *)BLI_findlink(&from_node->outputs, from_index); - bNodeSocket *to_socket = (bNodeSocket *)BLI_findlink(&to_node->inputs, to_index); - - blender::bke::node_add_link(*ntree, *from_node, *from_socket, *to_node, *to_socket); -} - -void bc_add_default_shader(bContext *C, Material *ma) -{ - bNodeTree *ntree = prepare_material_nodetree(ma); - std::map nmap; -#if 0 - nmap["main"] = bc_add_node(C, ntree, SH_NODE_BSDF_PRINCIPLED, -300, 300); - nmap["emission"] = bc_add_node(C, ntree, SH_NODE_EMISSION, -300, 500, "emission"); - nmap["add"] = bc_add_node(C, ntree, SH_NODE_ADD_SHADER, 100, 400); - nmap["transparent"] = bc_add_node(C, ntree, SH_NODE_BSDF_TRANSPARENT, 100, 200); - nmap["mix"] = bc_add_node(C, ntree, SH_NODE_MIX_SHADER, 400, 300, "transparency"); - nmap["out"] = bc_add_node(C, ntree, SH_NODE_OUTPUT_MATERIAL, 600, 300); - nmap["out"]->flag &= ~NODE_SELECT; - - bc_node_add_link(ntree, nmap["emission"], 0, nmap["add"], 0); - bc_node_add_link(ntree, nmap["main"], 0, nmap["add"], 1); - bc_node_add_link(ntree, nmap["add"], 0, nmap["mix"], 1); - bc_node_add_link(ntree, nmap["transparent"], 0, nmap["mix"], 2); - - bc_node_add_link(ntree, nmap["mix"], 0, nmap["out"], 0); - /* experimental, probably not used. */ - bc_make_group(C, ntree, nmap); -#else - nmap["main"] = bc_add_node(C, ntree, SH_NODE_BSDF_PRINCIPLED, 0, 300); - nmap["out"] = bc_add_node(C, ntree, SH_NODE_OUTPUT_MATERIAL, 300, 300); - bc_node_add_link(ntree, nmap["main"], 0, nmap["out"], 0); -#endif -} - -COLLADASW::ColorOrTexture bc_get_base_color(Material *ma) -{ - /* for alpha see bc_get_alpha() */ - Color default_color = {ma->r, ma->g, ma->b, 1.0}; - bNode *shader = bc_get_master_shader(ma); - if (ma->use_nodes && shader) { - return bc_get_cot_from_shader(shader, "Base Color", default_color, false); - } - - return bc_get_cot(default_color); -} - -COLLADASW::ColorOrTexture bc_get_emission(Material *ma) -{ - Color default_color = {0, 0, 0, 1}; /* default black */ - bNode *shader = bc_get_master_shader(ma); - if (!(ma->use_nodes && shader)) { - return bc_get_cot(default_color); - } - - double emission_strength = 0.0; - bc_get_float_from_shader(shader, emission_strength, "Emission Strength"); - if (emission_strength == 0.0) { - return bc_get_cot(default_color); - } - - COLLADASW::ColorOrTexture cot = bc_get_cot_from_shader(shader, "Emission Color", default_color); - - /* If using texture, emission strength is not supported. */ - COLLADASW::Color col = cot.getColor(); - double final_color[3] = {col.getRed(), col.getGreen(), col.getBlue()}; - mul_v3db_db(final_color, emission_strength); - - /* Collada does not support HDR colors, so clamp to 1 keeping channels proportional. */ - double max_color = fmax(fmax(final_color[0], final_color[1]), final_color[2]); - if (max_color > 1.0) { - mul_v3db_db(final_color, 1.0 / max_color); - } - - cot.getColor().set(final_color[0], final_color[1], final_color[2], col.getAlpha()); - - return cot; -} - -COLLADASW::ColorOrTexture bc_get_ambient(Material *ma) -{ - Color default_color = {0, 0, 0, 1.0}; - return bc_get_cot(default_color); -} - -COLLADASW::ColorOrTexture bc_get_specular(Material *ma) -{ - Color default_color = {0, 0, 0, 1.0}; - return bc_get_cot(default_color); -} - -COLLADASW::ColorOrTexture bc_get_reflective(Material *ma) -{ - Color default_color = {0, 0, 0, 1.0}; - return bc_get_cot(default_color); -} - -double bc_get_alpha(Material *ma) -{ - double alpha = ma->a; /* fallback if no socket found */ - bNode *master_shader = bc_get_master_shader(ma); - if (ma->use_nodes && master_shader) { - bc_get_float_from_shader(master_shader, alpha, "Alpha"); - } - return alpha; -} - -double bc_get_ior(Material *ma) -{ - double ior = -1; /* fallback if no socket found */ - bNode *master_shader = bc_get_master_shader(ma); - if (ma->use_nodes && master_shader) { - bc_get_float_from_shader(master_shader, ior, "IOR"); - } - return ior; -} - -double bc_get_shininess(Material *ma) -{ - double ior = -1; /* fallback if no socket found */ - bNode *master_shader = bc_get_master_shader(ma); - if (ma->use_nodes && master_shader) { - bc_get_float_from_shader(master_shader, ior, "Roughness"); - } - return ior; -} - -double bc_get_reflectivity(Material *ma) -{ - double reflectivity = ma->spec; /* fallback if no socket found */ - bNode *master_shader = bc_get_master_shader(ma); - if (ma->use_nodes && master_shader) { - bc_get_float_from_shader(master_shader, reflectivity, "Metallic"); - } - return reflectivity; -} - -bool bc_get_float_from_shader(bNode *shader, double &val, std::string nodeid) -{ - bNodeSocket *socket = blender::bke::node_find_socket(*shader, SOCK_IN, nodeid); - if (socket) { - bNodeSocketValueFloat *ref = (bNodeSocketValueFloat *)socket->default_value; - val = double(ref->value); - return true; - } - return false; -} - -COLLADASW::ColorOrTexture bc_get_cot_from_shader(bNode *shader, - std::string nodeid, - const Color &default_color, - bool with_alpha) -{ - bNodeSocket *socket = blender::bke::node_find_socket(*shader, SOCK_IN, nodeid); - if (socket) { - bNodeSocketValueRGBA *dcol = (bNodeSocketValueRGBA *)socket->default_value; - float *col = dcol->value; - return bc_get_cot(col, with_alpha); - } - - return bc_get_cot(default_color, with_alpha); -} - -bNode *bc_get_master_shader(Material *ma) -{ - bNodeTree *nodetree = ma->nodetree; - if (nodetree) { - for (bNode *node : nodetree->all_nodes()) { - if (node->typeinfo->type_legacy == SH_NODE_BSDF_PRINCIPLED) { - return node; - } - } - } - return nullptr; -} - -COLLADASW::ColorOrTexture bc_get_cot(float r, float g, float b, float a) -{ - COLLADASW::Color color(r, g, b, a); - COLLADASW::ColorOrTexture cot(color); - return cot; -} - -COLLADASW::ColorOrTexture bc_get_cot(const Color col, bool with_alpha) -{ - COLLADASW::Color color(col[0], col[1], col[2], (with_alpha) ? col[3] : 1.0); - COLLADASW::ColorOrTexture cot(color); - return cot; -} diff --git a/source/blender/io/collada/collada_utils.h b/source/blender/io/collada/collada_utils.h deleted file mode 100644 index acf5cff54ef..00000000000 --- a/source/blender/io/collada/collada_utils.h +++ /dev/null @@ -1,456 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -/** \file - * \ingroup collada - */ - -#pragma once - -#include "COLLADAFWFloatOrDoubleArray.h" -#include "COLLADAFWTypes.h" -#include "COLLADASWColorOrTexture.h" - -#include -#include -#include -#include - -#include "DNA_anim_types.h" -#include "DNA_camera_types.h" -#include "DNA_constraint_types.h" -#include "DNA_light_types.h" -#include "DNA_mesh_types.h" -#include "DNA_object_types.h" - -#include "DNA_customdata_types.h" -#include "DNA_scene_types.h" -#include "DNA_texture_types.h" - -#include "RNA_access.hh" - -#include "BLI_linklist.h" - -#include "BKE_context.hh" -#include "BKE_main.hh" -#include "BKE_node.hh" -#include "BKE_object.hh" -#include "BKE_scene.hh" - -#include "BCSampleData.h" -#include "BlenderContext.h" -#include "ExportSettings.h" -#include "collada_internal.h" - -constexpr int LIMITTED_PRECISION = 6; - -using UidImageMap = std::map; -using KeyImageMap = std::map; -using TexIndexTextureArrayMap = std::map>; -using BCObjectSet = std::set; - -namespace COLLADAFW { -class Node; -} -class ExtraTags; - -extern void bc_update_scene(BlenderContext &blender_context, float ctime); - -/* Action helpers */ - -std::vector bc_getSceneActions(const bContext *C, Object *ob, bool all_actions); - -/* Action and Animdata helpers */ - -/* Return Object's Action or nullptr. */ -inline bAction *bc_getSceneObjectAction(Object *ob) -{ - return (ob->adt && ob->adt->action) ? ob->adt->action : nullptr; -} - -/* Return Light's AnimData or nullptr. */ -inline AnimData *bc_getSceneLightAnimData(Object *ob) -{ - if (ob->type != OB_LAMP) { - return nullptr; - } - - Light *lamp = (Light *)ob->data; - return lamp->adt; -} - -/* Return Camera's AnimData or nullptr. */ -inline AnimData *bc_getSceneCameraAnimData(Object *ob) -{ - if (ob->type != OB_CAMERA) { - return nullptr; - } - - const Camera *camera = (const Camera *)ob->data; - return camera->adt; -} - -/* Return Material's AnimData or nullptr. */ -inline AnimData *bc_getSceneMaterialAnimData(Material *ma) -{ - if (ma == nullptr) { - return nullptr; - } - - return ma->adt; -} - -std::string bc_get_action_id(const std::string &action_name, - const std::string &ob_name, - const std::string &channel_type, - const std::string &axis_name, - const std::string &axis_separator = "_"); - -extern float bc_get_float_value(const COLLADAFW::FloatOrDoubleArray &array, unsigned int index); -extern int bc_test_parent_loop(Object *par, Object *ob); - -extern bool bc_validateConstraints(bConstraint *con); - -bool bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space = true); -extern Object *bc_add_object( - Main *bmain, Scene *scene, ViewLayer *view_layer, int type, const char *name); -extern Object *bc_add_armature(COLLADAFW::Node *node, - ExtraTags *node_extra_tags, - Main *bmain, - Scene *scene, - ViewLayer *view_layer, - int type, - const char *name); -extern Mesh *bc_get_mesh_copy(BlenderContext &blender_context, - Object *ob, - BC_export_mesh_type export_mesh_type, - bool apply_modifiers, - bool triangulate); - -extern Object *bc_get_assigned_armature(Object *ob); -extern bool bc_has_object_type(LinkNode *export_set, short obtype); - -extern const char *bc_CustomData_get_layer_name(const CustomData *data, - eCustomDataType type, - int n); -extern const char *bc_CustomData_get_active_layer_name(const CustomData *data, - eCustomDataType type); - -extern void bc_bubble_sort_by_Object_name(LinkNode *export_set); -/** - * Check if a bone is the top most exportable bone in the bone hierarchy. - * When deform_bones_only == false, then only bones with NO parent - * can be root bones. Otherwise the top most deform bones in the hierarchy - * are root bones. - */ -extern bool bc_is_root_bone(Bone *aBone, bool deform_bones_only); -extern int bc_get_active_UVLayer(Object *ob); - -inline std::string bc_string_after(const std::string &s, const std::string &probe) -{ - size_t i = s.rfind(probe); - if (i != std::string::npos) { - return (s.substr(i + probe.length(), s.length() - i)); - } - return s; -} - -inline std::string bc_string_before(const std::string &s, const std::string &probe) -{ - size_t i = s.find(probe); - if (i != std::string::npos) { - return s.substr(0, i); - } - return s; -} - -inline bool bc_startswith(std::string const &value, std::string const &starting) -{ - if (starting.size() > value.size()) { - return false; - } - return (value.substr(0, starting.size()) == starting); -} - -inline bool bc_endswith(const std::string &value, const std::string &ending) -{ - if (ending.size() > value.size()) { - return false; - } - - return value.compare(value.size() - ending.size(), ending.size(), ending) == 0; -} - -#if 0 /* UNUSED */ -inline bool bc_endswith(std::string const &value, std::string const &ending) -{ - if (ending.size() > value.size()) { - return false; - } - return std::equal(ending.rbegin(), ending.rend(), value.rbegin()); -} -#endif - -extern std::string bc_replace_string(std::string data, - const std::string &pattern, - const std::string &replacement); -extern std::string bc_url_encode(const std::string &data); -/** - * Calculate a re-scale factor such that the imported scene's scale - * is preserved. I.e. 1 meter in the import will also be - * 1 meter in the current scene. - */ -extern void bc_match_scale(Object *ob, UnitConverter &bc_unit, bool scale_to_scene); -extern void bc_match_scale(std::vector *objects_done, - UnitConverter &bc_unit, - bool scale_to_scene); - -/** - * Convenience function to get only the needed components of a matrix. - */ -extern void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], float *size); -/** - * Create rotation_quaternion from a delta rotation and a reference quat - * - * Input: - * mat_from: The rotation matrix before rotation - * mat_to : The rotation matrix after rotation - * qref : the quat corresponding to mat_from - * - * Output: - * rot : the calculated result (quaternion). - */ -extern void bc_rotate_from_reference_quat(float quat_to[4], - float quat_from[4], - float mat_to[4][4]); - -extern void bc_triangulate_mesh(Mesh *mesh); -/** - * A bone is a leaf when it has no children or all children are not connected. - */ -extern bool bc_is_leaf_bone(Bone *bone); -extern EditBone *bc_get_edit_bone(bArmature *armature, const char *name); -extern int bc_set_layer(int bitfield, int layer, bool enable); -extern int bc_set_layer(int bitfield, int layer); - -inline bool bc_in_range(float a, float b, float range) -{ - return fabsf(a - b) < range; -} -void bc_copy_m4_farray(float r[4][4], float *a); -void bc_copy_farray_m4(float *r, float a[4][4]); -void bc_copy_darray_m4d(double *r, double a[4][4]); -void bc_copy_m4d_v44(double (&r)[4][4], std::vector> &a); -void bc_copy_v44_m4d(std::vector> &r, double (&a)[4][4]); - -void bc_sanitize_v3(double v[3], int precision); -void bc_sanitize_v3(float v[3], int precision); - -/** - * Get a custom property when it exists. - * This function is also used to check if a property exists. - */ -extern IDProperty *bc_get_IDProperty(Bone *bone, const std::string &key); -extern void bc_set_IDProperty(EditBone *ebone, const char *key, float value); -/** - * Stores a 4*4 matrix as a custom bone property array of size 16. - */ -extern void bc_set_IDPropertyMatrix(EditBone *ebone, const char *key, float mat[4][4]); - -/** - * Read a custom bone property and convert to float - * Return def if the property does not exist. - */ -extern float bc_get_property(Bone *bone, const std::string &key, float def); -/** - * Get a vector that is stored in 3 custom properties (used in Blender <= 2.78). - */ -extern void bc_get_property_vector(Bone *bone, - const std::string &key, - float val[3], - const float def[3]); -/** - * Read a custom bone property and convert to matrix - * Return true if conversion was successful - * - * Return false if: - * - the property does not exist - * - is not an array of size 16 - */ -extern bool bc_get_property_matrix(Bone *bone, const std::string &key, float mat[4][4]); - -extern void bc_enable_fcurves(bAction *act, const char *bone_name); -extern bool bc_bone_matrix_local_get(Object *ob, Bone *bone, Matrix &mat, bool for_opensim); -extern bool bc_is_animated(BCMatrixSampleMap &values); -extern bool bc_has_animations(Scene *sce, LinkNode *export_set); -extern bool bc_has_animations(Object *ob); - -extern void bc_add_global_transform(Matrix &to_mat, - const Matrix &from_mat, - const BCMatrix &global_transform, - bool invert = false); -extern void bc_add_global_transform(Vector &to_vec, - const Vector &from_vec, - const BCMatrix &global_transform, - bool invert = false); -extern void bc_add_global_transform(Vector &to_vec, - const BCMatrix &global_transform, - bool invert = false); -extern void bc_add_global_transform(Matrix &to_mat, - const BCMatrix &global_transform, - bool invert = false); -extern void bc_apply_global_transform(Matrix &to_mat, - const BCMatrix &global_transform, - bool invert = false); -extern void bc_apply_global_transform(Vector &to_vec, - const BCMatrix &global_transform, - bool invert = false); -/** - * Check if custom information about bind matrix exists and modify the from_mat - * accordingly. - * - * \note This is old style for Blender <= 2.78 only kept for compatibility. - */ -extern void bc_create_restpose_mat(BCExportSettings &export_settings, - Bone *bone, - float to_mat[4][4], - float from_mat[4][4], - bool use_local_space); - -class ColladaBaseNodes { - private: - std::vector base_objects; - - public: - void add(Object *ob) - { - base_objects.push_back(ob); - } - - bool contains(Object *ob) - { - std::vector::iterator it = std::find(base_objects.begin(), base_objects.end(), ob); - return (it != base_objects.end()); - } - - int size() - { - return base_objects.size(); - } - - Object *get(int index) - { - return base_objects[index]; - } -}; - -class BCPolygonNormalsIndices { - std::vector normal_indices; - - public: - void add_index(unsigned int index) - { - normal_indices.push_back(index); - } - - unsigned int operator[](unsigned int i) - { - return normal_indices[i]; - } -}; - -class BoneExtended { - - private: - char name[MAXBONENAME]; - int chain_length; - bool is_leaf; - float tail[3]; - float roll; - - std::vector bone_collections; - - int use_connect; - bool has_custom_tail; - bool has_custom_roll; - - public: - /** - * BoneExtended is a helper class needed for the Bone chain finder - * See ArmatureImporter::fix_leaf_bones() - * and ArmatureImporter::connect_bone_chains() - */ - BoneExtended(EditBone *aBone); - - void set_name(const char *aName); - char *get_name(); - - void set_chain_length(int aLength); - int get_chain_length(); - - void set_leaf_bone(bool state); - bool is_leaf_bone(); - - void set_bone_collections(std::vector bone_collections); - const std::vector &get_bone_collections(); - - void set_roll(float roll); - bool has_roll(); - float get_roll(); - - void set_tail(const float vec[]); - float *get_tail(); - bool has_tail(); - - void set_use_connect(int use_connect); - int get_use_connect(); -}; - -/* a map to store bone extension maps - * std:string : an armature name - * BoneExtended * : a map that contains extra data for bones - */ -using BoneExtensionMap = std::map; - -/* - * A class to organize bone extension data for multiple Armatures. - * this is needed for the case where a Collada file contains 2 or more - * separate armatures. - */ -class BoneExtensionManager { - private: - std::map extended_bone_maps; - - public: - /** - * This method creates a new extension map when needed. - * \note The ~BoneExtensionManager destructor takes care - * to delete the created maps when the manager is removed. - */ - BoneExtensionMap &getExtensionMap(bArmature *armature); - ~BoneExtensionManager(); -}; - -void bc_add_default_shader(bContext *C, Material *ma); -bNode *bc_get_master_shader(Material *ma); - -COLLADASW::ColorOrTexture bc_get_base_color(Material *ma); -COLLADASW::ColorOrTexture bc_get_emission(Material *ma); -COLLADASW::ColorOrTexture bc_get_ambient(Material *ma); -COLLADASW::ColorOrTexture bc_get_specular(Material *ma); -COLLADASW::ColorOrTexture bc_get_reflective(Material *ma); - -double bc_get_reflectivity(Material *ma); -double bc_get_alpha(Material *ma); -double bc_get_ior(Material *ma); -double bc_get_shininess(Material *ma); - -bool bc_get_float_from_shader(bNode *shader, double &val, std::string nodeid); -COLLADASW::ColorOrTexture bc_get_cot_from_shader(bNode *shader, - std::string nodeid, - const Color &default_color, - bool with_alpha = true); - -COLLADASW::ColorOrTexture bc_get_cot(float r, float g, float b, float a); -COLLADASW::ColorOrTexture bc_get_cot(const Color col, bool with_alpha = true); diff --git a/source/blender/io/collada/version.conf b/source/blender/io/collada/version.conf deleted file mode 100644 index d39af7a53df..00000000000 --- a/source/blender/io/collada/version.conf +++ /dev/null @@ -1 +0,0 @@ -463ba8a2ef5a021ce21df614dde29e0ee800e10b diff --git a/source/blender/makesdna/DNA_space_enums.h b/source/blender/makesdna/DNA_space_enums.h index f9d1ba76264..533f3fdd730 100644 --- a/source/blender/makesdna/DNA_space_enums.h +++ b/source/blender/makesdna/DNA_space_enums.h @@ -632,7 +632,7 @@ typedef enum eFileSel_File_Types { /** represents folders for filtering */ FILE_TYPE_FOLDER = (1 << 11), FILE_TYPE_BTX = (1 << 12), - FILE_TYPE_COLLADA = (1 << 13), + FILE_TYPE_UNUSED_13 = (1 << 13), /* Was FILE_TYPE_COLLADA */ /** from filter_glob operator property */ FILE_TYPE_OPERATOR = (1 << 14), FILE_TYPE_BUNDLE = (1 << 15), diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index e9f2f8f5e3c..b421e57f5cf 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -356,10 +356,6 @@ if(WITH_WASAPI) add_definitions(-DWITH_WASAPI) endif() -if(WITH_OPENCOLLADA) - add_definitions(-DWITH_COLLADA) -endif() - if(WITH_INTERNATIONAL) add_definitions(-DWITH_INTERNATIONAL) endif() diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt index ab54ee12b77..36d8e93d390 100644 --- a/source/blender/python/intern/CMakeLists.txt +++ b/source/blender/python/intern/CMakeLists.txt @@ -300,10 +300,6 @@ if(WITH_MOD_FLUID) add_definitions(-DWITH_FLUID) endif() -if(WITH_OPENCOLLADA) - add_definitions(-DWITH_COLLADA) -endif() - if(WITH_IO_WAVEFRONT_OBJ) add_definitions(-DWITH_IO_WAVEFRONT_OBJ) endif() diff --git a/source/blender/python/intern/bpy_app_build_options.cc b/source/blender/python/intern/bpy_app_build_options.cc index 37c969909b8..ccd5881f4e6 100644 --- a/source/blender/python/intern/bpy_app_build_options.cc +++ b/source/blender/python/intern/bpy_app_build_options.cc @@ -44,7 +44,6 @@ static PyStructSequence_Field app_builtopts_info_fields[] = { {"libmv", nullptr}, {"mod_oceansim", nullptr}, {"mod_remesh", nullptr}, - {"collada", nullptr}, {"io_wavefront_obj", nullptr}, {"io_ply", nullptr}, {"io_stl", nullptr}, @@ -238,12 +237,6 @@ static PyObject *make_builtopts_info() SetObjIncref(Py_False); #endif -#ifdef WITH_COLLADA - SetObjIncref(Py_True); -#else - SetObjIncref(Py_False); -#endif - #ifdef WITH_IO_WAVEFRONT_OBJ SetObjIncref(Py_True); #else diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt index 0af626db003..40500aa3277 100644 --- a/source/blender/windowmanager/CMakeLists.txt +++ b/source/blender/windowmanager/CMakeLists.txt @@ -140,10 +140,6 @@ if(WITH_VULKAN_BACKEND) add_definitions(-DWITH_VULKAN_BACKEND) endif() -if(WITH_OPENCOLLADA) - add_definitions(-DWITH_COLLADA) -endif() - if(WITH_CODEC_FFMPEG) list(APPEND INC_SYS ${FFMPEG_INCLUDE_DIRS} diff --git a/source/blender/windowmanager/intern/wm_operator_props.cc b/source/blender/windowmanager/intern/wm_operator_props.cc index 4ce21fd507d..04ed0a6c460 100644 --- a/source/blender/windowmanager/intern/wm_operator_props.cc +++ b/source/blender/windowmanager/intern/wm_operator_props.cc @@ -167,9 +167,6 @@ void WM_operator_properties_filesel(wmOperatorType *ot, prop = RNA_def_boolean( ot->srna, "filter_btx", (filter & FILE_TYPE_BTX) != 0, "Filter btx files", ""); RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); - prop = RNA_def_boolean( - ot->srna, "filter_collada", (filter & FILE_TYPE_COLLADA) != 0, "Filter COLLADA files", ""); - RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); prop = RNA_def_boolean( ot->srna, "filter_alembic", (filter & FILE_TYPE_ALEMBIC) != 0, "Filter Alembic files", ""); RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); diff --git a/source/creator/creator_args.cc b/source/creator/creator_args.cc index 8161928c09a..df5637dccc3 100644 --- a/source/creator/creator_args.cc +++ b/source/creator/creator_args.cc @@ -1367,7 +1367,7 @@ static int arg_handle_debug_mode_generic_set(int /*argc*/, const char ** /*argv* static const char arg_handle_debug_mode_io_doc[] = "\n\t" - "Enable debug messages for I/O (Collada, ...)."; + "Enable debug messages for I/O."; static int arg_handle_debug_mode_io(int /*argc*/, const char ** /*argv*/, void * /*data*/) { G.debug |= G_DEBUG_IO; diff --git a/source/creator/symbols_apple.map b/source/creator/symbols_apple.map index ab094fa8fb9..02ad2e6f1d3 100644 --- a/source/creator/symbols_apple.map +++ b/source/creator/symbols_apple.map @@ -8,7 +8,6 @@ blosc* *ceres* *cineon* *clang* -*COLLADA* cu* decodeInstruction *default_error_condition* diff --git a/tests/files/collada/animation/suzannes_parent_inverse.blend b/tests/files/collada/animation/suzannes_parent_inverse.blend deleted file mode 100644 index 59b455c558d..00000000000 --- a/tests/files/collada/animation/suzannes_parent_inverse.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7405cbe736c12ada23cfce1716e46a45a223c020ca6dcfb19b211a12b84c8a58 -size 421665 diff --git a/tests/files/collada/animation/suzannes_parent_inverse_keyframes_channels.dae b/tests/files/collada/animation/suzannes_parent_inverse_keyframes_channels.dae deleted file mode 100644 index a14cf81d5e4..00000000000 --- a/tests/files/collada/animation/suzannes_parent_inverse_keyframes_channels.dae +++ /dev/null @@ -1,1552 +0,0 @@ - - - - - Blender User - Blender 2.79.3 commit date:2018-02-27, commit time:16:08, hash:05b5958 - - 2018-02-27T20:26:49 - 2018-02-27T20:26:49 - - Z_UP - - - - - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
- - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
- - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
-
- - - - 0.04166662 3.333333 6.666666 - - - - - - - - -2.356725 3.856727 -0.123757 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 -2.356725 2.236111 3.856727 5.555555 -0.123757 - - - - - - - - - 1.138889 -2.356725 4.444444 3.856727 7.777778 -0.123757 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 1.34602e-7 1.88604e-7 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 1.34602e-7 2.236111 1.88604e-7 5.555555 0 - - - - - - - - - 1.138889 1.34602e-7 4.444444 1.88604e-7 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 1.99819 1.596267 3.340024 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 1.99819 2.236111 1.596267 5.555555 3.340024 - - - - - - - - - 1.138889 1.99819 4.444444 1.596267 7.777778 3.340024 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 2.35109e-6 1.80792e-6 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 2.35109e-6 2.236111 1.80792e-6 5.555555 0 - - - - - - - - - 1.138889 2.35109e-6 4.444444 1.80792e-6 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - -40 -4.999996 8.96462e-6 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 -40 2.236111 -9.937504 5.555555 8.96462e-6 - - - - - - - - - 1.138889 -40 4.444444 8.10623e-6 7.777778 8.96462e-6 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - -6.45955e-6 4.79073e-6 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 -6.45955e-6 2.236111 4.79073e-6 5.555555 0 - - - - - - - - - 1.138889 -6.45955e-6 4.444444 4.79073e-6 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 0.9999999 1 1 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 0.9999999 2.236111 1 5.555555 1 - - - - - - - - - 1.138889 0.9999999 4.444444 1 7.777778 1 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 1 1 1 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 1 2.236111 1 5.555555 1 - - - - - - - - - 1.138889 1 4.444444 1 7.777778 1 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 1 1 1 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 1 2.236111 1 5.555555 1 - - - - - - - - - 1.138889 1 4.444444 1 7.777778 1 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - -1.5 4.368637 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 -1.5 2.236111 4.368637 5.555555 0 - - - - - - - - - 1.138889 -1.5 4.444444 4.368637 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 0 4.7307e-7 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 0 2.236111 4.7307e-7 5.555555 0 - - - - - - - - - 1.138889 0 4.444444 4.7307e-7 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 2.598076 0.8932691 3 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 2.598076 2.236111 0.8932691 5.555555 3 - - - - - - - - - 1.138889 2.598076 4.444444 0.8932691 7.777778 3 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 1.19091e-6 -6.73503e-7 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 1.19091e-6 2.236111 -6.73503e-7 5.555555 0 - - - - - - - - - 1.138889 1.19091e-6 4.444444 -6.73503e-7 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - -30 100 -1.28066e-6 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 -30 2.236111 100 5.555555 -1.28066e-6 - - - - - - - - - 1.138889 -30 4.444444 100 7.777778 -1.28066e-6 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - -4.44456e-6 6.73505e-7 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 -4.44456e-6 2.236111 6.73505e-7 5.555555 0 - - - - - - - - - 1.138889 -4.44456e-6 4.444444 6.73505e-7 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 0.9999999 1 1 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 0.9999999 2.236111 1 5.555555 1 - - - - - - - - - 1.138889 0.9999999 4.444444 1 7.777778 1 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 1 1 1 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 1 2.236111 1 5.555555 1 - - - - - - - - - 1.138889 1 4.444444 1 7.777778 1 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 0.9999999 1 1 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 0.9999999 2.236111 1 5.555555 1 - - - - - - - - - 1.138889 0.9999999 4.444444 1 7.777778 1 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 0 0 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 0 2.236111 0 5.555555 0 - - - - - - - - - 1.138889 0 4.444444 0 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 0 0 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 0 2.236111 0 5.555555 0 - - - - - - - - - 1.138889 0 4.444444 0 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 0 0 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 0 2.236111 0 5.555555 0 - - - - - - - - - 1.138889 0 4.444444 0 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 0 0 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 0 2.236111 0 5.555555 0 - - - - - - - - - 1.138889 0 4.444444 0 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - -10 -45 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 -10 2.236111 -45 5.555555 0 - - - - - - - - - 1.138889 -10 4.444444 -45 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - -1.3574e-6 0 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 -1.3574e-6 2.236111 0 5.555555 0 - - - - - - - - - 1.138889 -1.3574e-6 4.444444 0 7.777778 0 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 1 1 1 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 1 2.236111 1 5.555555 1 - - - - - - - - - 1.138889 1 4.444444 1 7.777778 1 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 1 1 1 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 1 2.236111 1 5.555555 1 - - - - - - - - - 1.138889 1 4.444444 1 7.777778 1 - - - - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 1 1 1 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - -1.055556 1 2.236111 1 5.555555 1 - - - - - - - - - 1.138889 1 4.444444 1 7.777778 1 - - - - - - - - - - - - - - - - - - - - - 0 0 0 - 0 0 1 0 - 0 1 0 0 - 1 0 0 0 - 1 1 1 - - - 0 1.82077e-14 3 - 0 0 1 -1.44715e-13 - 0 1 0 -8.53774e-7 - 1 0 0 -3.81667e-14 - 1 1 0.9999999 - - - -0.1237571 -4.5685e-8 3.340024 - 0 0 1 1.87494e-12 - 0 1 0 5.97642e-6 - 1 0 0 -9.79611e-13 - 1 1 1 - - - - - - - - - -
\ No newline at end of file diff --git a/tests/files/collada/animation/suzannes_parent_inverse_keyframes_matrix.dae b/tests/files/collada/animation/suzannes_parent_inverse_keyframes_matrix.dae deleted file mode 100644 index 602fc39343c..00000000000 --- a/tests/files/collada/animation/suzannes_parent_inverse_keyframes_matrix.dae +++ /dev/null @@ -1,232 +0,0 @@ - - - - - Blender User - Blender 2.79.3 commit date:2018-02-27, commit time:16:08, hash:05b5958 - - 2018-02-27T20:29:11 - 2018-02-27T20:29:11 - - Z_UP - - - - - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
- - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
- - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
-
- - - - 0.04166662 3.333333 6.666666 - - - - - - - - 0.766044 0 -0.642788 -2.356726 0 1 0 0 0.642787 0 0.766044 1.99819 0 0 0 1 0.996195 0 -0.087156 3.856727 0 1 0 0 0.087156 0 0.996195 1.596267 0 0 0 1 1 0 0 -0.123757 0 1 0 0 0 0 1 3.340024 0 0 0 1 - - - - - - - - LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 0.866025 0 -0.5 -1.5 0 1 0 0 0.5 0 0.866025 2.598076 0 0 0 1 -0.173648 0 0.984808 4.368637 0 1 0 0 -0.984808 0 -0.173648 0.893269 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 3 0 0 0 1 - - - - - - - - LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 0.04166662 3.333333 6.666666 - - - - - - - - 0.984808 0 -0.173648 0 0 1 0 0 0.173648 0 0.984808 0 0 0 0 1 0.707107 0 -0.707107 0 0 1 0 0 0.707107 0 0.707107 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 - - - - - - - - LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - - - 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 - - - 1 8.60423e-16 -2.98023e-8 0 -2.52576e-15 1 4.44089e-16 1.82077e-14 1.49012e-8 -6.66134e-16 0.9999999 3 0 0 0 1 - - - 1 -2.63678e-15 2.08616e-7 -0.1237571 3.27238e-14 1 2.44249e-14 -4.5685e-8 -1.04308e-7 -1.70974e-14 1 3.340024 0 0 0 1 - - - - - - - - - -
\ No newline at end of file diff --git a/tests/files/collada/animation/suzannes_parent_inverse_sample_10_channels.dae b/tests/files/collada/animation/suzannes_parent_inverse_sample_10_channels.dae deleted file mode 100644 index 5391eb18015..00000000000 --- a/tests/files/collada/animation/suzannes_parent_inverse_sample_10_channels.dae +++ /dev/null @@ -1,312 +0,0 @@ - - - - - Blender User - Blender 2.79.3 commit date:2018-02-27, commit time:16:08, hash:05b5958 - - 2018-02-27T20:33:20 - 2018-02-27T20:33:20 - - Z_UP - - - - - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
- - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
- - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
-
- - - - 0.04166662 0.4583333 0.875 1.291667 1.708333 2.125 2.541667 2.958333 3.375 3.791667 4.208333 4.625 5.041666 5.458333 5.875 6.291666 6.666666 - - - - - - - - -2.356726 1.34602e-7 1.99819 -2.083254 1.36979e-7 1.9805 -1.36366 1.43233e-7 1.933954 -0.3491704 1.5205e-7 1.86833 0.8089857 1.62116e-7 1.793413 1.959581 1.72116e-7 1.718986 2.951387 1.80736e-7 1.65483 3.633174 1.86661e-7 1.610726 3.854876 1.88495e-7 1.597077 3.651654 1.76534e-7 1.686105 3.177883 1.48648e-7 1.893652 2.526856 0 2.178852 1.791866 0 2.500834 1.066205 0 2.818729 0.4431658 0 3.091668 0.01604151 0 3.278781 -0.123757 0 3.340024 - - - - - - - - - - LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 0.04166662 0.4583333 0.875 1.291667 1.708333 2.125 2.541667 2.958333 3.375 3.791667 4.208333 4.625 5.041666 5.458333 5.875 6.291666 6.666666 - - - - - - - - -40 -38.66685 -35.11514 -30.01648 -24.04244 -17.86465 -12.15468 -7.584165 -4.814831 -3.208088 -2.005647 -1.148911 -0.5792731 -0.2381668 -0.06697338 -0.007110834 8.96462e-6 - - - - - - - - LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 0.04166662 0.4583333 0.875 1.291667 1.708333 2.125 2.541667 2.958333 3.375 3.791667 4.208333 4.625 5.041666 5.458333 5.875 6.291666 6.666666 - - - - - - - - -1.5 0 2.598076 -1.241705 0 2.523042 -0.5620448 1.2098e-7 2.325605 0.3961459 1.89402e-7 2.047255 1.49003 2.67514e-7 1.729488 2.576774 3.45116e-7 1.413796 3.513539 4.12009e-7 1.141671 4.157491 4.57992e-7 0.9546059 4.366606 4.7285e-7 0.8942486 4.143567 4.48698e-7 1.001807 3.623597 3.92391e-7 1.252557 2.909086 3.15018e-7 1.597123 2.102423 2.27667e-7 1.986127 1.306 1.41424e-7 2.370194 0.622206 0 2.699947 0.1534315 0 2.926009 0 0 3 - - - - - - - - - - LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 0.04166662 0.4583333 0.875 1.291667 1.708333 2.125 2.541667 2.958333 3.375 3.791667 4.208333 4.625 5.041666 5.458333 5.875 6.291666 6.666666 - - - - - - - - -30.00001 -24.27835 -9.222743 12.00277 36.23411 60.30726 81.05817 95.32273 99.95352 94.84805 82.9457 66.59024 48.12538 29.89492 14.24258 3.512099 -1.28066e-6 - - - - - - - - LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 0.04166662 0.4583333 0.875 1.291667 1.708333 2.125 2.541667 2.958333 3.375 3.791667 4.208333 4.625 5.041666 5.458333 5.875 6.291666 6.666666 - - - - - - - - -10 -11.54045 -15.59388 -21.30844 -27.83226 -34.3135 -39.90027 -43.74074 -44.97908 -42.68162 -37.32557 -29.96561 -21.65643 -13.45271 -6.409161 -1.580452 0 - - - - - - - - LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - - - 0 0 0 - 0 0 1 0 - 0 1 0 0 - 1 0 0 0 - 1 1 1 - - - 0 1.82077e-14 3 - 0 0 1 -1.44715e-13 - 0 1 0 -8.53774e-7 - 1 0 0 -3.81667e-14 - 1 1 0.9999999 - - - -0.1237571 -4.5685e-8 3.340024 - 0 0 1 1.87494e-12 - 0 1 0 5.97642e-6 - 1 0 0 -9.79611e-13 - 1 1 1 - - - - - - - - - -
\ No newline at end of file diff --git a/tests/files/collada/animation/suzannes_parent_inverse_sample_10_matrix.dae b/tests/files/collada/animation/suzannes_parent_inverse_sample_10_matrix.dae deleted file mode 100644 index 9e9d70fd199..00000000000 --- a/tests/files/collada/animation/suzannes_parent_inverse_sample_10_matrix.dae +++ /dev/null @@ -1,232 +0,0 @@ - - - - - Blender User - Blender 2.79.3 commit date:2018-02-27, commit time:16:08, hash:05b5958 - - 2018-02-27T20:33:37 - 2018-02-27T20:33:37 - - Z_UP - - - - - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
- - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
- - - - 0.4375 -0.765625 0.1640625 -0.4375 -0.765625 0.1640625 0.5 -0.6875 0.09375 -0.5 -0.6875 0.09375 0.546875 -0.578125 0.0546875 -0.546875 -0.578125 0.0546875 0.3515625 -0.6171875 -0.0234375 -0.3515625 -0.6171875 -0.0234375 0.3515625 -0.71875 0.03125 -0.3515625 -0.71875 0.03125 0.3515625 -0.78125 0.1328125 -0.3515625 -0.78125 0.1328125 0.2734375 -0.796875 0.1640625 -0.2734375 -0.796875 0.1640625 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.15625 -0.6484375 0.0546875 -0.15625 -0.6484375 0.0546875 0.078125 -0.65625 0.2421875 -0.078125 -0.65625 0.2421875 0.140625 -0.7421875 0.2421875 -0.140625 -0.7421875 0.2421875 0.2421875 -0.796875 0.2421875 -0.2421875 -0.796875 0.2421875 0.2734375 -0.796875 0.328125 -0.2734375 -0.796875 0.328125 0.203125 -0.7421875 0.390625 -0.203125 -0.7421875 0.390625 0.15625 -0.6484375 0.4375 -0.15625 -0.6484375 0.4375 0.3515625 -0.6171875 0.515625 -0.3515625 -0.6171875 0.515625 0.3515625 -0.71875 0.453125 -0.3515625 -0.71875 0.453125 0.3515625 -0.78125 0.359375 -0.3515625 -0.78125 0.359375 0.4375 -0.765625 0.328125 -0.4375 -0.765625 0.328125 0.5 -0.6875 0.390625 -0.5 -0.6875 0.390625 0.546875 -0.578125 0.4375 -0.546875 -0.578125 0.4375 0.625 -0.5625 0.2421875 -0.625 -0.5625 0.2421875 0.5625 -0.671875 0.2421875 -0.5625 -0.671875 0.2421875 0.46875 -0.7578125 0.2421875 -0.46875 -0.7578125 0.2421875 0.4765625 -0.7734375 0.2421875 -0.4765625 -0.7734375 0.2421875 0.4453125 -0.78125 0.3359375 -0.4453125 -0.78125 0.3359375 0.3515625 -0.8046875 0.375 -0.3515625 -0.8046875 0.375 0.265625 -0.8203125 0.3359375 -0.265625 -0.8203125 0.3359375 0.2265625 -0.8203125 0.2421875 -0.2265625 -0.8203125 0.2421875 0.265625 -0.8203125 0.15625 -0.265625 -0.8203125 0.15625 0.3515625 -0.828125 0.2421875 -0.3515625 -0.828125 0.2421875 0.3515625 -0.8046875 0.1171875 -0.3515625 -0.8046875 0.1171875 0.4453125 -0.78125 0.15625 -0.4453125 -0.78125 0.15625 0 -0.7421875 0.4296875 0 -0.8203125 0.3515625 0 -0.734375 -0.6796875 0 -0.78125 -0.3203125 0 -0.796875 -0.1875 0 -0.71875 -0.7734375 0 -0.6015625 0.40625 0 -0.5703125 0.5703125 0 0.546875 0.8984375 0 0.8515625 0.5625 0 0.828125 0.0703125 0 0.3515625 -0.3828125 0.203125 -0.5625 -0.1875 -0.203125 -0.5625 -0.1875 0.3125 -0.5703125 -0.4375 -0.3125 -0.5703125 -0.4375 0.3515625 -0.5703125 -0.6953125 -0.3515625 -0.5703125 -0.6953125 0.3671875 -0.53125 -0.890625 -0.3671875 -0.53125 -0.890625 0.328125 -0.5234375 -0.9453125 -0.328125 -0.5234375 -0.9453125 0.1796875 -0.5546875 -0.96875 -0.1796875 -0.5546875 -0.96875 0 -0.578125 -0.984375 0.4375 -0.53125 -0.140625 -0.4375 -0.53125 -0.140625 0.6328125 -0.5390625 -0.0390625 -0.6328125 -0.5390625 -0.0390625 0.828125 -0.4453125 0.1484375 -0.828125 -0.4453125 0.1484375 0.859375 -0.59375 0.4296875 -0.859375 -0.59375 0.4296875 0.7109375 -0.625 0.484375 -0.7109375 -0.625 0.484375 0.4921875 -0.6875 0.6015625 -0.4921875 -0.6875 0.6015625 0.3203125 -0.734375 0.7578125 -0.3203125 -0.734375 0.7578125 0.15625 -0.7578125 0.71875 -0.15625 -0.7578125 0.71875 0.0625 -0.75 0.4921875 -0.0625 -0.75 0.4921875 0.1640625 -0.7734375 0.4140625 -0.1640625 -0.7734375 0.4140625 0.125 -0.765625 0.3046875 -0.125 -0.765625 0.3046875 0.203125 -0.7421875 0.09375 -0.203125 -0.7421875 0.09375 0.375 -0.703125 0.015625 -0.375 -0.703125 0.015625 0.4921875 -0.671875 0.0625 -0.4921875 -0.671875 0.0625 0.625 -0.6484375 0.1875 -0.625 -0.6484375 0.1875 0.640625 -0.6484375 0.296875 -0.640625 -0.6484375 0.296875 0.6015625 -0.6640625 0.375 -0.6015625 -0.6640625 0.375 0.4296875 -0.71875 0.4375 -0.4296875 -0.71875 0.4375 0.25 -0.7578125 0.46875 -0.25 -0.7578125 0.46875 0 -0.734375 -0.765625 0.109375 -0.734375 -0.71875 -0.109375 -0.734375 -0.71875 0.1171875 -0.7109375 -0.8359375 -0.1171875 -0.7109375 -0.8359375 0.0625 -0.6953125 -0.8828125 -0.0625 -0.6953125 -0.8828125 0 -0.6875 -0.890625 0 -0.75 -0.1953125 0 -0.7421875 -0.140625 0.1015625 -0.7421875 -0.1484375 -0.1015625 -0.7421875 -0.1484375 0.125 -0.75 -0.2265625 -0.125 -0.75 -0.2265625 0.0859375 -0.7421875 -0.2890625 -0.0859375 -0.7421875 -0.2890625 0.3984375 -0.671875 -0.046875 -0.3984375 -0.671875 -0.046875 0.6171875 -0.625 0.0546875 -0.6171875 -0.625 0.0546875 0.7265625 -0.6015625 0.203125 -0.7265625 -0.6015625 0.203125 0.7421875 -0.65625 0.375 -0.7421875 -0.65625 0.375 0.6875 -0.7265625 0.4140625 -0.6875 -0.7265625 0.4140625 0.4375 -0.796875 0.546875 -0.4375 -0.796875 0.546875 0.3125 -0.8359375 0.640625 -0.3125 -0.8359375 0.640625 0.203125 -0.8515625 0.6171875 -0.203125 -0.8515625 0.6171875 0.1015625 -0.84375 0.4296875 -0.1015625 -0.84375 0.4296875 0.125 -0.8125 -0.1015625 -0.125 -0.8125 -0.1015625 0.2109375 -0.7109375 -0.4453125 -0.2109375 -0.7109375 -0.4453125 0.25 -0.6875 -0.703125 -0.25 -0.6875 -0.703125 0.265625 -0.6640625 -0.8203125 -0.265625 -0.6640625 -0.8203125 0.234375 -0.6328125 -0.9140625 -0.234375 -0.6328125 -0.9140625 0.1640625 -0.6328125 -0.9296875 -0.1640625 -0.6328125 -0.9296875 0 -0.640625 -0.9453125 0 -0.7265625 0.046875 0 -0.765625 0.2109375 0.328125 -0.7421875 0.4765625 -0.328125 -0.7421875 0.4765625 0.1640625 -0.75 0.140625 -0.1640625 -0.75 0.140625 0.1328125 -0.7578125 0.2109375 -0.1328125 -0.7578125 0.2109375 0.1171875 -0.734375 -0.6875 -0.1171875 -0.734375 -0.6875 0.078125 -0.75 -0.4453125 -0.078125 -0.75 -0.4453125 0 -0.75 -0.4453125 0 -0.7421875 -0.328125 0.09375 -0.78125 -0.2734375 -0.09375 -0.78125 -0.2734375 0.1328125 -0.796875 -0.2265625 -0.1328125 -0.796875 -0.2265625 0.109375 -0.78125 -0.1328125 -0.109375 -0.78125 -0.1328125 0.0390625 -0.78125 -0.125 -0.0390625 -0.78125 -0.125 0 -0.828125 -0.203125 0.046875 -0.8125 -0.1484375 -0.046875 -0.8125 -0.1484375 0.09375 -0.8125 -0.15625 -0.09375 -0.8125 -0.15625 0.109375 -0.828125 -0.2265625 -0.109375 -0.828125 -0.2265625 0.078125 -0.8046875 -0.25 -0.078125 -0.8046875 -0.25 0 -0.8046875 -0.2890625 0.2578125 -0.5546875 -0.3125 -0.2578125 -0.5546875 -0.3125 0.1640625 -0.7109375 -0.2421875 -0.1640625 -0.7109375 -0.2421875 0.1796875 -0.7109375 -0.3125 -0.1796875 -0.7109375 -0.3125 0.234375 -0.5546875 -0.25 -0.234375 -0.5546875 -0.25 0 -0.6875 -0.875 0.046875 -0.6875 -0.8671875 -0.046875 -0.6875 -0.8671875 0.09375 -0.7109375 -0.8203125 -0.09375 -0.7109375 -0.8203125 0.09375 -0.7265625 -0.7421875 -0.09375 -0.7265625 -0.7421875 0 -0.65625 -0.78125 0.09375 -0.6640625 -0.75 -0.09375 -0.6640625 -0.75 0.09375 -0.640625 -0.8125 -0.09375 -0.640625 -0.8125 0.046875 -0.6328125 -0.8515625 -0.046875 -0.6328125 -0.8515625 0 -0.6328125 -0.859375 0.171875 -0.78125 0.21875 -0.171875 -0.78125 0.21875 0.1875 -0.7734375 0.15625 -0.1875 -0.7734375 0.15625 0.3359375 -0.7578125 0.4296875 -0.3359375 -0.7578125 0.4296875 0.2734375 -0.7734375 0.421875 -0.2734375 -0.7734375 0.421875 0.421875 -0.7734375 0.3984375 -0.421875 -0.7734375 0.3984375 0.5625 -0.6953125 0.3515625 -0.5625 -0.6953125 0.3515625 0.5859375 -0.6875 0.2890625 -0.5859375 -0.6875 0.2890625 0.578125 -0.6796875 0.1953125 -0.578125 -0.6796875 0.1953125 0.4765625 -0.71875 0.1015625 -0.4765625 -0.71875 0.1015625 0.375 -0.7421875 0.0625 -0.375 -0.7421875 0.0625 0.2265625 -0.78125 0.109375 -0.2265625 -0.78125 0.109375 0.1796875 -0.78125 0.296875 -0.1796875 -0.78125 0.296875 0.2109375 -0.78125 0.375 -0.2109375 -0.78125 0.375 0.234375 -0.7578125 0.359375 -0.234375 -0.7578125 0.359375 0.1953125 -0.7578125 0.296875 -0.1953125 -0.7578125 0.296875 0.2421875 -0.7578125 0.125 -0.2421875 -0.7578125 0.125 0.375 -0.7265625 0.0859375 -0.375 -0.7265625 0.0859375 0.4609375 -0.703125 0.1171875 -0.4609375 -0.703125 0.1171875 0.546875 -0.671875 0.2109375 -0.546875 -0.671875 0.2109375 0.5546875 -0.671875 0.28125 -0.5546875 -0.671875 0.28125 0.53125 -0.6796875 0.3359375 -0.53125 -0.6796875 0.3359375 0.4140625 -0.75 0.390625 -0.4140625 -0.75 0.390625 0.28125 -0.765625 0.3984375 -0.28125 -0.765625 0.3984375 0.3359375 -0.75 0.40625 -0.3359375 -0.75 0.40625 0.203125 -0.75 0.171875 -0.203125 -0.75 0.171875 0.1953125 -0.75 0.2265625 -0.1953125 -0.75 0.2265625 0.109375 -0.609375 0.4609375 -0.109375 -0.609375 0.4609375 0.1953125 -0.6171875 0.6640625 -0.1953125 -0.6171875 0.6640625 0.3359375 -0.59375 0.6875 -0.3359375 -0.59375 0.6875 0.484375 -0.5546875 0.5546875 -0.484375 -0.5546875 0.5546875 0.6796875 -0.4921875 0.453125 -0.6796875 -0.4921875 0.453125 0.796875 -0.4609375 0.40625 -0.796875 -0.4609375 0.40625 0.7734375 -0.375 0.1640625 -0.7734375 -0.375 0.1640625 0.6015625 -0.4140625 0 -0.6015625 -0.4140625 0 0.4375 -0.46875 -0.09375 -0.4375 -0.46875 -0.09375 0 -0.2890625 0.8984375 0 0.078125 0.984375 0 0.671875 -0.1953125 0 -0.1875 -0.4609375 0 -0.4609375 -0.9765625 0 -0.34375 -0.8046875 0 -0.3203125 -0.5703125 0 -0.28125 -0.484375 0.8515625 -0.0546875 0.234375 -0.8515625 -0.0546875 0.234375 0.859375 0.046875 0.3203125 -0.859375 0.046875 0.3203125 0.7734375 0.4375 0.265625 -0.7734375 0.4375 0.265625 0.4609375 0.703125 0.4375 -0.4609375 0.703125 0.4375 0.734375 -0.0703125 -0.046875 -0.734375 -0.0703125 -0.046875 0.59375 0.1640625 -0.125 -0.59375 0.1640625 -0.125 0.640625 0.4296875 -0.0078125 -0.640625 0.4296875 -0.0078125 0.3359375 0.6640625 0.0546875 -0.3359375 0.6640625 0.0546875 0.234375 -0.40625 -0.3515625 -0.234375 -0.40625 -0.3515625 0.1796875 -0.2578125 -0.4140625 -0.1796875 -0.2578125 -0.4140625 0.2890625 -0.3828125 -0.7109375 -0.2890625 -0.3828125 -0.7109375 0.25 -0.390625 -0.5 -0.25 -0.390625 -0.5 0.328125 -0.3984375 -0.9140625 -0.328125 -0.3984375 -0.9140625 0.140625 -0.3671875 -0.7578125 -0.140625 -0.3671875 -0.7578125 0.125 -0.359375 -0.5390625 -0.125 -0.359375 -0.5390625 0.1640625 -0.4375 -0.9453125 -0.1640625 -0.4375 -0.9453125 0.21875 -0.4296875 -0.28125 -0.21875 -0.4296875 -0.28125 0.2109375 -0.46875 -0.2265625 -0.2109375 -0.46875 -0.2265625 0.203125 -0.5 -0.171875 -0.203125 -0.5 -0.171875 0.2109375 -0.1640625 -0.390625 -0.2109375 -0.1640625 -0.390625 0.296875 0.265625 -0.3125 -0.296875 0.265625 -0.3125 0.34375 0.5390625 -0.1484375 -0.34375 0.5390625 -0.1484375 0.453125 0.3828125 0.8671875 -0.453125 0.3828125 0.8671875 0.453125 0.0703125 0.9296875 -0.453125 0.0703125 0.9296875 0.453125 -0.234375 0.8515625 -0.453125 -0.234375 0.8515625 0.4609375 -0.4296875 0.5234375 -0.4609375 -0.4296875 0.5234375 0.7265625 -0.3359375 0.40625 -0.7265625 -0.3359375 0.40625 0.6328125 -0.28125 0.453125 -0.6328125 -0.28125 0.453125 0.640625 -0.0546875 0.703125 -0.640625 -0.0546875 0.703125 0.796875 -0.125 0.5625 -0.796875 -0.125 0.5625 0.796875 0.1171875 0.6171875 -0.796875 0.1171875 0.6171875 0.640625 0.1953125 0.75 -0.640625 0.1953125 0.75 0.640625 0.4453125 0.6796875 -0.640625 0.4453125 0.6796875 0.796875 0.359375 0.5390625 -0.796875 0.359375 0.5390625 0.6171875 0.5859375 0.328125 -0.6171875 0.5859375 0.328125 0.484375 0.546875 0.0234375 -0.484375 0.546875 0.0234375 0.8203125 0.203125 0.328125 -0.8203125 0.203125 0.328125 0.40625 -0.1484375 -0.171875 -0.40625 -0.1484375 -0.171875 0.4296875 0.2109375 -0.1953125 -0.4296875 0.2109375 -0.1953125 0.890625 0.234375 0.40625 -0.890625 0.234375 0.40625 0.7734375 0.125 -0.140625 -0.7734375 0.125 -0.140625 1.039062 0.328125 -0.1015625 -1.039062 0.328125 -0.1015625 1.28125 0.4296875 0.0546875 -1.28125 0.4296875 0.0546875 1.351562 0.421875 0.3203125 -1.351562 0.421875 0.3203125 1.234375 0.421875 0.5078125 -1.234375 0.421875 0.5078125 1.023437 0.3125 0.4765625 -1.023437 0.3125 0.4765625 1.015625 0.2890625 0.4140625 -1.015625 0.2890625 0.4140625 1.1875 0.390625 0.4375 -1.1875 0.390625 0.4375 1.265625 0.40625 0.2890625 -1.265625 0.40625 0.2890625 1.210937 0.40625 0.078125 -1.210937 0.40625 0.078125 1.03125 0.3046875 -0.0390625 -1.03125 0.3046875 -0.0390625 0.828125 0.1328125 -0.0703125 -0.828125 0.1328125 -0.0703125 0.921875 0.21875 0.359375 -0.921875 0.21875 0.359375 0.9453125 0.2890625 0.3046875 -0.9453125 0.2890625 0.3046875 0.8828125 0.2109375 -0.0234375 -0.8828125 0.2109375 -0.0234375 1.039062 0.3671875 0 -1.039062 0.3671875 0 1.1875 0.4453125 0.09375 -1.1875 0.4453125 0.09375 1.234375 0.4453125 0.25 -1.234375 0.4453125 0.25 1.171875 0.4375 0.359375 -1.171875 0.4375 0.359375 1.023437 0.359375 0.34375 -1.023437 0.359375 0.34375 0.84375 0.2109375 0.2890625 -0.84375 0.2109375 0.2890625 0.8359375 0.2734375 0.171875 -0.8359375 0.2734375 0.171875 0.7578125 0.2734375 0.09375 -0.7578125 0.2734375 0.09375 0.8203125 0.2734375 0.0859375 -0.8203125 0.2734375 0.0859375 0.84375 0.2734375 0.015625 -0.84375 0.2734375 0.015625 0.8125 0.2734375 -0.015625 -0.8125 0.2734375 -0.015625 0.7265625 0.0703125 0 -0.7265625 0.0703125 0 0.71875 0.171875 -0.0234375 -0.71875 0.171875 -0.0234375 0.71875 0.1875 0.0390625 -0.71875 0.1875 0.0390625 0.796875 0.2109375 0.203125 -0.796875 0.2109375 0.203125 0.890625 0.265625 0.2421875 -0.890625 0.265625 0.2421875 0.890625 0.3203125 0.234375 -0.890625 0.3203125 0.234375 0.8125 0.3203125 -0.015625 -0.8125 0.3203125 -0.015625 0.8515625 0.3203125 0.015625 -0.8515625 0.3203125 0.015625 0.828125 0.3203125 0.078125 -0.828125 0.3203125 0.078125 0.765625 0.3203125 0.09375 -0.765625 0.3203125 0.09375 0.84375 0.3203125 0.171875 -0.84375 0.3203125 0.171875 1.039062 0.4140625 0.328125 -1.039062 0.4140625 0.328125 1.1875 0.484375 0.34375 -1.1875 0.484375 0.34375 1.257812 0.4921875 0.2421875 -1.257812 0.4921875 0.2421875 1.210937 0.484375 0.0859375 -1.210937 0.484375 0.0859375 1.046875 0.421875 0 -1.046875 0.421875 0 0.8828125 0.265625 -0.015625 -0.8828125 0.265625 -0.015625 0.953125 0.34375 0.2890625 -0.953125 0.34375 0.2890625 0.890625 0.328125 0.109375 -0.890625 0.328125 0.109375 0.9375 0.3359375 0.0625 -0.9375 0.3359375 0.0625 1 0.3671875 0.125 -1 0.3671875 0.125 0.9609375 0.3515625 0.171875 -0.9609375 0.3515625 0.171875 1.015625 0.375 0.234375 -1.015625 0.375 0.234375 1.054687 0.3828125 0.1875 -1.054687 0.3828125 0.1875 1.109375 0.390625 0.2109375 -1.109375 0.390625 0.2109375 1.085937 0.390625 0.2734375 -1.085937 0.390625 0.2734375 1.023437 0.484375 0.4375 -1.023437 0.484375 0.4375 1.25 0.546875 0.46875 -1.25 0.546875 0.46875 1.367187 0.5 0.296875 -1.367187 0.5 0.296875 1.3125 0.53125 0.0546875 -1.3125 0.53125 0.0546875 1.039062 0.4921875 -0.0859375 -1.039062 0.4921875 -0.0859375 0.7890625 0.328125 -0.125 -0.7890625 0.328125 -0.125 0.859375 0.3828125 0.3828125 -0.859375 0.3828125 0.3828125 - - - - - - - - - - 0.6649926 -0.7193631 -0.2007525 -0.6649926 -0.7193631 -0.2007525 0.8294267 -0.4689242 -0.303581 -0.8294267 -0.4689242 -0.303581 0.4155485 -0.4449307 -0.7933198 -0.4155485 -0.4449307 -0.7933198 0.35995 -0.7819605 -0.5088949 -0.35995 -0.7819605 -0.5088949 -0.07866579 -0.8383526 -0.5394226 0.07866579 -0.8383526 -0.5394226 -0.2696272 -0.4685325 -0.8412957 0.2696272 -0.4685325 -0.8412957 -0.7706565 -0.5419657 -0.3352043 0.7706565 -0.5419657 -0.3352043 -0.468941 -0.8616503 -0.1940445 0.468941 -0.8616503 -0.1940445 -0.4767313 -0.8581163 0.1906925 0.4767313 -0.8581163 0.1906925 -0.7672025 -0.5521418 0.3264042 0.7672025 -0.5521418 0.3264042 -0.2519275 -0.5181691 0.8173331 0.2519275 -0.5181691 0.8173331 -0.09493291 -0.816423 0.5695974 0.09493291 -0.816423 0.5695974 0.3667423 -0.7596805 0.5370155 -0.3667423 -0.7596805 0.5370155 0.4140549 -0.4898296 0.7672194 -0.4140549 -0.4898296 0.7672194 0.8277474 -0.477141 0.2952474 -0.8277474 -0.477141 0.2952474 0.6713447 -0.7144586 0.197092 -0.6713447 -0.7144586 0.197092 0.8111072 0.4866642 0.3244429 -0.8111072 0.4866642 0.3244429 0.2051525 0.5333965 0.82061 -0.2051525 0.5333965 0.82061 -0.4223141 0.4607063 0.7806413 0.4223141 0.4607063 0.7806413 -0.8240606 0.4657734 0.3224585 0.8240606 0.4657734 0.3224585 -0.8137336 0.4649906 -0.3487429 0.8137336 0.4649906 -0.3487429 -0.4223141 0.4607063 -0.7806413 0.4223141 0.4607063 -0.7806413 0.2051525 0.5333965 -0.82061 -0.2051525 0.5333965 -0.82061 0.7994771 0.487486 -0.3509899 -0.7994771 0.487486 -0.3509899 0.4000391 -0.9143752 -0.06234371 -0.4000391 -0.9143752 -0.06234371 0.3069375 -0.9354286 -0.1753928 -0.3069375 -0.9354286 -0.1753928 0.09451156 -0.9784727 -0.1834636 -0.09451156 -0.9784727 -0.1834636 -0.06235319 -0.9976517 -0.02834236 0.06235319 -0.9976517 -0.02834236 -0.06235718 -0.9977157 0.02598214 0.06235718 -0.9977157 0.02598214 0.09956103 -0.9798906 0.1729218 -0.09956103 -0.9798906 0.1729218 0.3035711 -0.9383106 0.1655842 -0.3035711 -0.9383106 0.1655842 0.4001634 -0.9146592 0.05716615 -0.4001634 -0.9146592 0.05716615 0.1230915 -0.492366 -0.8616405 -0.1230915 -0.492366 -0.8616405 0.2189862 -0.4520101 -0.864715 -0.2189862 -0.4520101 -0.864715 0.5901979 -0.6667885 -0.4550381 -0.5901979 -0.6667885 -0.4550381 0.7688937 -0.6373724 -0.05058509 -0.7688937 -0.6373724 -0.05058509 0.7796494 -0.6197212 0.0899595 -0.7796494 -0.6197212 0.0899595 0.3241412 -0.4738742 -0.8187648 -0.3241412 -0.4738742 -0.8187648 0.3857302 -0.6417068 -0.6628911 -0.3857302 -0.6417068 -0.6628911 0.6894679 -0.5906072 -0.4193056 -0.6894679 -0.5906072 -0.4193056 0.6587508 -0.6587508 -0.3634487 -0.6587508 -0.6587508 -0.3634487 0.5465481 -0.7509096 0.3707022 -0.5465481 -0.7509096 0.3707022 0.5064471 -0.5706447 0.6464334 -0.5064471 -0.5706447 0.6464334 0.6092444 -0.6015325 0.516701 -0.6092444 -0.6015325 0.516701 -0.04406523 -0.7491095 0.660979 0.04406523 -0.7491095 0.660979 -0.7246141 -0.611014 0.318742 0.7246141 -0.611014 0.318742 -0.5880344 -0.5880344 0.5553658 0.5880344 -0.5880344 0.5553658 0.5360536 -0.7482415 -0.3908724 -0.5360536 -0.7482415 -0.3908724 0.2206949 -0.8551928 -0.4689767 -0.2206949 -0.8551928 -0.4689767 -0.07939517 -0.8429403 -0.5321166 0.07939517 -0.8429403 -0.5321166 -0.08246493 -0.7489628 -0.6574605 0.08246493 -0.7489628 -0.6574605 0.04570257 -0.8226472 -0.5667125 -0.04570257 -0.8226472 -0.5667125 0.2784283 -0.9365317 -0.2130398 -0.2784283 -0.9365317 -0.2130398 0.3813028 -0.9062849 -0.1823621 -0.3813028 -0.9062849 -0.1823621 0.335744 -0.896916 -0.2877805 -0.335744 -0.896916 -0.2877805 0.3762403 -0.9245594 0.06027621 -0.3762403 -0.9245594 0.06027621 -0.1352164 -0.9538902 0.2679743 0.1352164 -0.9538902 0.2679743 0.3960911 -0.8101864 -0.4320994 -0.3960911 -0.8101864 -0.4320994 0.1855565 -0.9509773 -0.2474087 -0.1855565 -0.9509773 -0.2474087 0.009906888 -0.9807858 -0.1948362 -0.009906888 -0.9807858 -0.1948362 0.07206583 -0.7137953 -0.6966368 -0.07206583 -0.7137953 -0.6966368 0.1863356 -0.7985816 -0.5723168 -0.1863356 -0.7985816 -0.5723168 0.315685 -0.9093881 -0.2708434 -0.315685 -0.9093881 -0.2708434 0.3063019 -0.9515661 -0.02648138 -0.3063019 -0.9515661 -0.02648138 0.3265503 -0.9361107 -0.1306201 -0.3265503 -0.9361107 -0.1306201 -0.01367473 -0.9982557 0.05743384 0.01367473 -0.9982557 0.05743384 -0.002625882 -0.9978395 -0.0656473 0.002625882 -0.9978395 -0.0656473 0 -1 0 0.8173927 0.04418337 -0.574384 -0.8173927 0.04418337 -0.574384 0.9493627 0.2143722 0.2296845 -0.9493627 0.2143722 0.2296845 0.08247858 0.4123931 0.9072648 -0.08247858 0.4123931 0.9072648 -0.8836245 -0.3046981 0.3554811 0.8836245 -0.3046981 0.3554811 0.4207063 -0.2218269 -0.8796585 -0.4207063 -0.2218269 -0.8796585 0.2873479 -0.766261 -0.5746958 -0.2873479 -0.766261 -0.5746958 -0.6542239 -0.4579568 0.601886 0.6542239 -0.4579568 0.601886 0.1052267 -0.6050537 0.7892006 -0.1052267 -0.6050537 0.7892006 0.7581755 -0.5832119 0.291606 -0.7581755 -0.5832119 0.291606 0.3889222 -0.5833833 -0.7130241 -0.3889222 -0.5833833 -0.7130241 0.04627448 -0.9717641 0.2313724 -0.04627448 -0.9717641 0.2313724 0.03348034 -0.9151307 -0.4017647 -0.03348034 -0.9151307 -0.4017647 -0.4451628 -0.8808541 -0.1610163 0.4451628 -0.8808541 -0.1610163 -0.2182179 -0.8728716 -0.4364358 0.2182179 -0.8728716 -0.4364358 0.4340643 -0.8915916 -0.1290461 -0.4340643 -0.8915916 -0.1290461 0.3007528 -0.9523839 0.05012542 -0.3007528 -0.9523839 0.05012542 0.8122852 -0.4995684 0.3010386 -0.8122852 -0.4995684 0.3010386 0.8753095 -0.4093359 0.257444 -0.8753095 -0.4093359 0.257444 0.9384845 -0.3059586 0.160113 -0.9384845 -0.3059586 0.160113 0.2237061 -0.7227428 -0.6539102 -0.2237061 -0.7227428 -0.6539102 -0.15361 -0.9677431 -0.199693 0.15361 -0.9677431 -0.199693 -0.2732748 -0.9564619 -0.102478 0.2732748 -0.9564619 -0.102478 -0.09759002 -0.9759002 0.19518 0.09759002 -0.9759002 0.19518 -0.158235 -0.2712601 0.9494103 0.158235 -0.2712601 0.9494103 -0.6934296 -0.1327844 0.7081835 0.6934296 -0.1327844 0.7081835 -1 0 0 1 0 0 0.3051412 -0.1181191 -0.9449533 -0.3051412 -0.1181191 -0.9449533 0.02981424 -0.9540557 -0.2981424 -0.02981424 -0.9540557 -0.2981424 0.1352925 -0.9277203 -0.3478951 -0.1352925 -0.9277203 -0.3478951 -0.508542 -0.815786 -0.2754602 0.508542 -0.815786 -0.2754602 -0.3842773 -0.9222655 -0.04192113 0.3842773 -0.9222655 -0.04192113 -0.2082883 -0.9773527 0.03738504 0.2082883 -0.9773527 0.03738504 -0.5720776 -0.6674239 -0.4767314 0.5720776 -0.6674239 -0.4767314 -0.1369221 -0.6435338 -0.7530716 0.1369221 -0.6435338 -0.7530716 0.4088432 -0.6814053 -0.6070702 -0.4088432 -0.6814053 -0.6070702 0.5740305 -0.7070375 -0.4130219 -0.5740305 -0.7070375 -0.4130219 0.5665345 -0.8183277 -0.09684348 -0.5665345 -0.8183277 -0.09684348 0.5703355 -0.812892 0.1180004 -0.5703355 -0.812892 0.1180004 0.4822895 -0.6718792 0.5621168 -0.4822895 -0.6718792 0.5621168 0.260407 -0.747255 0.6113904 -0.260407 -0.747255 0.6113904 0.1639564 -0.9181563 0.3607042 -0.1639564 -0.9181563 0.3607042 -0.01781988 -0.9682163 0.249479 0.01781988 -0.9682163 0.249479 0.3273389 -0.8481054 -0.4166132 -0.3273389 -0.8481054 -0.4166132 0.2810701 -0.9235162 -0.2609937 -0.2810701 -0.9235162 -0.2609937 -0.2541925 -0.7149165 -0.6513683 0.2541925 -0.7149165 -0.6513683 -0.02601569 -0.5333228 -0.8455117 0.02601569 -0.5333228 -0.8455117 -0.3518083 -0.8990658 -0.2605988 0.3518083 -0.8990658 -0.2605988 -0.3523084 -0.9358193 -0.01100963 0.3523084 -0.9358193 -0.01100963 -0.1316537 -0.8776913 0.4607879 0.1316537 -0.8776913 0.4607879 -0.03421926 -0.7870439 0.6159474 0.03421926 -0.7870439 0.6159474 0.3602627 -0.7277307 0.5836256 -0.3602627 -0.7277307 0.5836256 0.4987838 -0.6858277 0.5299578 -0.4987838 -0.6858277 0.5299578 0.6666667 -0.6666667 -0.3333333 -0.6666667 -0.6666667 -0.3333333 0.8164662 -0.572745 -0.07311636 -0.8164662 -0.572745 -0.07311636 0.7840097 -0.6097853 0.1161496 -0.7840097 -0.6097853 0.1161496 -0.5306292 0.2461473 0.8110759 0.5306292 0.2461473 0.8110759 -0.8511092 0.3729579 0.3694804 0.8511092 0.3729579 0.3694804 -0.2445859 0.433121 0.8675159 0.2445859 0.433121 0.8675159 0.5923819 0.3030059 0.746506 -0.5923819 0.3030059 0.746506 0.368548 0.3117768 0.875767 -0.368548 0.3117768 0.875767 0.2821402 0.2879877 0.9151284 -0.2821402 0.2879877 0.9151284 0.8561315 0.4990766 0.1340206 -0.8561315 0.4990766 0.1340206 0.5342262 0.4375769 -0.7232764 -0.5342262 0.4375769 -0.7232764 0.3849029 0.4367999 -0.8130533 -0.3849029 0.4367999 -0.8130533 0.2335186 0.7800172 -0.5805534 -0.2335186 0.7800172 -0.5805534 0.2448657 0.9678026 -0.05830132 -0.2448657 0.9678026 -0.05830132 0.1162712 0.8836613 -0.4534577 -0.1162712 0.8836613 -0.4534577 0.1151957 0.1388255 -0.9835941 -0.1151957 0.1388255 -0.9835941 0.1183664 0.2259723 -0.9669157 -0.1183664 0.2259723 -0.9669157 0.9597363 0.2807739 -0.008508265 -0.9597363 0.2807739 -0.008508265 0.9318681 0.3241936 0.1628507 -0.9318681 0.3241936 0.1628507 0.1626056 0.9864742 0.0206952 -0.1626056 0.9864742 0.0206952 -0.0187661 0.9758383 -0.217687 0.0187661 0.9758383 -0.217687 0.7537763 0.5883908 -0.2926051 -0.7537763 0.5883908 -0.2926051 0.919601 0.3678404 0.1379401 -0.919601 0.3678404 0.1379401 0.9297361 0.1943994 0.3127294 -0.9297361 0.1943994 0.3127294 0.9120181 0.2328557 0.3376408 -0.9120181 0.2328557 0.3376408 0.9406906 0.06068968 0.3337934 -0.9406906 0.06068968 0.3337934 0.1760902 0.4402255 -0.880451 -0.1760902 0.4402255 -0.880451 0.3707845 0.7990834 -0.4732702 -0.3707845 0.7990834 -0.4732702 0.3106682 0.4660024 -0.8284486 -0.3106682 0.4660024 -0.8284486 0.2793394 0.1286923 -0.9515292 -0.2793394 0.1286923 -0.9515292 0.3138732 0.1807149 -0.9321083 -0.3138732 0.1807149 -0.9321083 0.9761607 0.06086373 -0.2083413 -0.9761607 0.06086373 -0.2083413 0.8267247 -0.2447269 -0.5065916 -0.8267247 -0.2447269 -0.5065916 0.3448535 0.9314862 -0.1157995 -0.3448535 0.9314862 -0.1157995 0.1202607 -0.2354946 0.9644064 -0.1202607 -0.2354946 0.9644064 0.1275126 0.1851369 0.9744049 -0.1275126 0.1851369 0.9744049 0.3492263 0.7241385 0.594697 -0.3492263 0.7241385 0.594697 0.4152507 0.1448549 0.8981003 -0.4152507 0.1448549 0.8981003 0.18454 -0.6862581 0.7035587 -0.18454 -0.6862581 0.7035587 0.6055635 -0.1608238 0.779377 -0.6055635 -0.1608238 0.779377 0.7033007 0.2052644 0.6806135 -0.7033007 0.2052644 0.6806135 0.6679444 0.7166309 0.200725 -0.6679444 0.7166309 0.200725 0.4947742 0.7527564 0.4342308 -0.4947742 0.7527564 0.4342308 0.6423233 0.1761209 0.7459238 -0.6423233 0.1761209 0.7459238 0.7182253 -0.1529664 0.6787886 -0.7182253 -0.1529664 0.6787886 0.7388278 -0.5443658 0.3972399 -0.7388278 -0.5443658 0.3972399 0.3427715 0.1578876 0.9260557 -0.3427715 0.1578876 0.9260557 0.2269829 -0.7867459 0.5740295 -0.2269829 -0.7867459 0.5740295 -0.172189 0.9794906 0.1046379 0.172189 0.9794906 0.1046379 0.04246038 -0.4013195 0.9149535 -0.04246038 -0.4013195 0.9149535 -0.1615719 -0.9694316 0.1846536 0.1615719 -0.9694316 0.1846536 0.9791494 -0.04833197 0.1973083 -0.9791494 -0.04833197 0.1973083 0.9469682 -0.3079218 0.09184479 -0.9469682 -0.3079218 0.09184479 0.9794499 0.06613647 0.190536 -0.9794499 0.06613647 0.190536 0.9937747 0.1069533 0.03119468 -0.9937747 0.1069533 0.03119468 0.7115634 -0.05005973 -0.7008364 -0.7115634 -0.05005973 -0.7008364 0.3721604 -0.08465123 -0.9243002 -0.3721604 -0.08465123 -0.9243002 0.4465289 -0.2310097 -0.8644342 -0.4465289 -0.2310097 -0.8644342 0.6065792 -0.2404887 -0.7577776 -0.6065792 -0.2404887 -0.7577776 0.7324889 -0.2406749 -0.6368169 -0.7324889 -0.2406749 -0.6368169 0.2637323 -0.8532518 -0.4498963 -0.2637323 -0.8532518 -0.4498963 0.556817 0.7673321 -0.3180509 -0.556817 0.7673321 -0.3180509 0.5004315 0.8189989 -0.2807298 -0.5004315 0.8189989 -0.2807298 0.3189541 0.4204846 -0.8493887 -0.3189541 0.4204846 -0.8493887 0.7197588 0.2793026 -0.6355606 -0.7197588 0.2793026 -0.6355606 0.4972049 0.7473325 -0.4407737 -0.4972049 0.7473325 -0.4407737 0.3505592 -0.8556661 0.3807148 -0.3505592 -0.8556661 0.3807148 0.4565509 -0.8730145 0.171485 -0.4565509 -0.8730145 0.171485 0.2582621 -0.9602985 0.1054873 -0.2582621 -0.9602985 0.1054873 0.2455276 -0.9660632 -0.0802378 -0.2455276 -0.9660632 -0.0802378 0.4642925 -0.8836535 -0.05990868 -0.4642925 -0.8836535 -0.05990868 0.6224616 -0.7209807 -0.3045136 -0.6224616 -0.7209807 -0.3045136 0.4500206 -0.6027062 0.6589588 -0.4500206 -0.6027062 0.6589588 -0.2666636 -0.4884154 0.8308676 0.2666636 -0.4884154 0.8308676 -0.8283948 -0.5111373 0.2291305 0.8283948 -0.5111373 0.2291305 -0.5250614 -0.7727319 -0.3566455 0.5250614 -0.7727319 -0.3566455 0.4546374 -0.6872839 -0.5665208 -0.4546374 -0.6872839 -0.5665208 0.6996007 -0.5552387 -0.4497433 -0.6996007 -0.5552387 -0.4497433 0.7220095 0.1126443 -0.6826519 -0.7220095 0.1126443 -0.6826519 -0.191904 -0.9388245 0.2859746 0.191904 -0.9388245 0.2859746 0.9048077 0.2047485 -0.3733649 -0.9048077 0.2047485 -0.3733649 0.1034175 -0.9824666 0.1551263 -0.1034175 -0.9824666 0.1551263 0.08405643 -0.3530371 0.9318258 -0.08405643 -0.3530371 0.9318258 0.6446058 -0.7593986 -0.08830213 -0.6446058 -0.7593986 -0.08830213 0.4309354 -0.7678485 0.4740289 -0.4309354 -0.7678485 0.4740289 0.8032348 -0.3462219 -0.4847106 -0.8032348 -0.3462219 -0.4847106 0.5811215 -0.7013535 -0.4127966 -0.5811215 -0.7013535 -0.4127966 0.5910009 -0.6822047 -0.4304821 -0.5910009 -0.6822047 -0.4304821 0.9818147 0.05914545 -0.1803936 -0.9818147 0.05914545 -0.1803936 0.9104858 0.117482 -0.3965018 -0.9104858 0.117482 -0.3965018 0.997202 0.07252377 -0.01813089 -0.997202 0.07252377 -0.01813089 0.7313104 -0.1924501 -0.6543304 -0.7313104 -0.1924501 -0.6543304 0.7867185 -0.1072798 -0.6079188 -0.7867185 -0.1072798 -0.6079188 0.7022469 -0.1170411 -0.7022469 -0.7022469 -0.1170411 -0.7022469 0.1840475 0.05112427 0.9815869 -0.1840475 0.05112427 0.9815869 0.9351897 -0.1283593 0.3300669 -0.9351897 -0.1283593 0.3300669 0.663348 -0.05527895 -0.7462666 -0.663348 -0.05527895 -0.7462666 -0.008521497 -0.07669371 0.9970183 0.008521497 -0.07669371 0.9970183 0.6236913 -0.3353812 -0.7060657 -0.6236913 -0.3353812 -0.7060657 0.2733122 -0.3587222 -0.8925351 -0.2733122 -0.3587222 -0.8925351 -0.832769 0.2199767 -0.5080415 0.832769 0.2199767 -0.5080415 -0.8339089 0.4980813 0.2377206 0.8339089 0.4980813 0.2377206 -0.5654641 0.2538818 0.7847257 0.5654641 0.2538818 0.7847257 -0.05596464 -0.06715762 0.9961717 0.05596464 -0.06715762 0.9961717 0.1444979 -0.9892554 0.02223044 -0.1444979 -0.9892554 0.02223044 0.3274517 -0.942664 0.06449806 -0.3274517 -0.942664 0.06449806 0.3126667 -0.9495805 0.02316045 -0.3126667 -0.9495805 0.02316045 0.1709884 -0.9848932 0.02735811 -0.1709884 -0.9848932 0.02735811 0.3486585 -0.892906 0.2848795 -0.3486585 -0.892906 0.2848795 0.4005825 -0.9156172 -0.03433561 -0.4005825 -0.9156172 -0.03433561 0.2571941 -0.9644779 -0.06027984 -0.2571941 -0.9644779 -0.06027984 0.06369656 -0.997913 -0.01061606 -0.06369656 -0.997913 -0.01061606 -0.3637005 -0.6100783 0.7039365 0.3637005 -0.6100783 0.7039365 0.629882 -0.7758812 0.03545689 -0.629882 -0.7758812 0.03545689 0.44721 -0.8717259 -0.2002433 -0.44721 -0.8717259 -0.2002433 0.5071631 -0.8348431 -0.2140623 -0.5071631 -0.8348431 -0.2140623 0.5258231 -0.8092594 0.2619342 -0.5258231 -0.8092594 0.2619342 0.2979641 -0.757979 0.580246 -0.2979641 -0.757979 0.580246 0.09303778 0.08050078 -0.992403 -0.09303778 0.08050078 -0.992403 0.5005804 -0.007970988 -0.8656534 -0.5005804 -0.007970988 -0.8656534 0.9285162 -0.2747906 -0.2496955 -0.9285162 -0.2747906 -0.2496955 0.8392603 0.03778016 0.5424158 -0.8392603 0.03778016 0.5424158 -0.2355346 0.2589082 0.9367445 0.2355346 0.2589082 0.9367445 -0.4499189 0.1285483 0.8837694 0.4499189 0.1285483 0.8837694 -0.5383637 0.8426563 -0.009752929 0.5383637 0.8426563 -0.009752929 -0.1910403 0.9812865 -0.02409738 0.1910403 0.9812865 -0.02409738 0.4046244 0.9140966 0.0265811 -0.4046244 0.9140966 0.0265811 -0.7818682 -0.01967787 0.6231332 0.7818682 -0.01967787 0.6231332 0.5427734 0.81416 -0.2062538 -0.5427734 0.81416 -0.2062538 -0.2473983 0.2945219 -0.9230661 0.2473983 0.2945219 -0.9230661 - - - - - - - - - - - - - - - 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 -

46 0 0 0 2 0 44 0 3 1 1 1 47 1 45 1 44 2 2 2 4 2 42 2 5 3 3 3 45 3 43 3 2 4 8 4 6 4 4 4 7 5 9 5 3 5 5 5 0 6 10 6 8 6 2 6 9 7 11 7 1 7 3 7 10 8 12 8 14 8 8 8 15 9 13 9 11 9 9 9 8 10 14 10 16 10 6 10 17 11 15 11 9 11 7 11 14 12 20 12 18 12 16 12 19 13 21 13 15 13 17 13 12 14 22 14 20 14 14 14 21 15 23 15 13 15 15 15 22 16 24 16 26 16 20 16 27 17 25 17 23 17 21 17 20 18 26 18 28 18 18 18 29 19 27 19 21 19 19 19 26 20 32 20 30 20 28 20 31 21 33 21 27 21 29 21 24 22 34 22 32 22 26 22 33 23 35 23 25 23 27 23 34 24 36 24 38 24 32 24 39 25 37 25 35 25 33 25 32 26 38 26 40 26 30 26 41 27 39 27 33 27 31 27 38 28 44 28 42 28 40 28 43 29 45 29 39 29 41 29 36 30 46 30 44 30 38 30 45 31 47 31 37 31 39 31 46 32 36 32 50 32 48 32 51 33 37 33 47 33 49 33 36 34 34 34 52 34 50 34 53 35 35 35 37 35 51 35 34 36 24 36 54 36 52 36 55 37 25 37 35 37 53 37 24 38 22 38 56 38 54 38 57 39 23 39 25 39 55 39 22 40 12 40 58 40 56 40 59 41 13 41 23 41 57 41 12 42 10 42 62 42 58 42 63 43 11 43 13 43 59 43 10 44 0 44 64 44 62 44 65 45 1 45 11 45 63 45 0 46 46 46 48 46 64 46 49 47 47 47 1 47 65 47 60 48 64 48 48 48 49 49 65 49 61 49 62 50 64 50 60 50 61 51 65 51 63 51 60 52 58 52 62 52 63 53 59 53 61 53 60 54 56 54 58 54 59 55 57 55 61 55 60 56 54 56 56 56 57 57 55 57 61 57 60 58 52 58 54 58 55 59 53 59 61 59 60 60 50 60 52 60 53 61 51 61 61 61 60 62 48 62 50 62 51 63 49 63 61 63 88 64 173 64 175 64 90 64 175 65 174 65 89 65 90 65 86 66 171 66 173 66 88 66 174 67 172 67 87 67 89 67 84 68 169 68 171 68 86 68 172 69 170 69 85 69 87 69 82 70 167 70 169 70 84 70 170 71 168 71 83 71 85 71 80 72 165 72 167 72 82 72 168 73 166 73 81 73 83 73 78 74 91 74 145 74 163 74 146 75 92 75 79 75 164 75 91 76 93 76 147 76 145 76 148 77 94 77 92 77 146 77 93 78 95 78 149 78 147 78 150 79 96 79 94 79 148 79 95 80 97 80 151 80 149 80 152 81 98 81 96 81 150 81 97 82 99 82 153 82 151 82 154 83 100 83 98 83 152 83 99 84 101 84 155 84 153 84 156 85 102 85 100 85 154 85 101 86 103 86 157 86 155 86 158 87 104 87 102 87 156 87 103 88 105 88 159 88 157 88 160 89 106 89 104 89 158 89 105 90 107 90 161 90 159 90 162 91 108 91 106 91 160 91 107 92 66 92 67 92 161 92 67 93 66 93 108 93 162 93 109 94 127 94 159 94 161 94 160 95 128 95 110 95 162 95 127 96 178 96 157 96 159 96 158 97 179 97 128 97 160 97 125 98 155 98 157 98 178 98 158 99 156 99 126 99 179 99 123 100 153 100 155 100 125 100 156 101 154 101 124 101 126 101 121 102 151 102 153 102 123 102 154 103 152 103 122 103 124 103 119 104 149 104 151 104 121 104 152 105 150 105 120 105 122 105 117 106 147 106 149 106 119 106 150 107 148 107 118 107 120 107 115 108 145 108 147 108 117 108 148 109 146 109 116 109 118 109 113 110 163 110 145 110 115 110 146 111 164 111 114 111 116 111 113 112 180 112 176 112 163 112 176 113 181 113 114 113 164 113 109 114 161 114 67 114 111 114 67 115 162 115 110 115 112 115 111 116 67 116 177 116 182 116 177 117 67 117 112 117 183 117 176 118 180 118 182 118 177 118 183 119 181 119 176 119 177 119 134 120 136 120 175 120 173 120 175 121 136 121 135 121 174 121 132 122 134 122 173 122 171 122 174 123 135 123 133 123 172 123 130 124 132 124 171 124 169 124 172 125 133 125 131 125 170 125 165 126 186 126 184 126 167 126 185 127 187 127 166 127 168 127 130 128 169 128 167 128 184 128 168 129 170 129 131 129 185 129 143 130 189 130 188 130 186 130 188 131 189 131 144 131 187 131 184 132 186 132 188 132 68 132 188 133 187 133 185 133 68 133 129 134 130 134 184 134 68 134 185 134 131 134 129 134 68 134 141 135 192 135 190 135 143 135 191 136 193 136 142 136 144 136 139 137 194 137 192 137 141 137 193 138 195 138 140 138 142 138 138 139 196 139 194 139 139 139 195 140 197 140 138 140 140 140 137 141 70 141 196 141 138 141 197 142 70 142 137 142 138 142 189 143 143 143 190 143 69 143 191 144 144 144 189 144 69 144 69 145 190 145 205 145 207 145 206 146 191 146 69 146 207 146 70 147 198 147 199 147 196 147 200 148 198 148 70 148 197 148 196 149 199 149 201 149 194 149 202 150 200 150 197 150 195 150 194 151 201 151 203 151 192 151 204 152 202 152 195 152 193 152 192 153 203 153 205 153 190 153 206 154 204 154 193 154 191 154 198 155 203 155 201 155 199 155 202 156 204 156 198 156 200 156 198 157 207 157 205 157 203 157 206 158 207 158 198 158 204 158 138 159 139 159 163 159 176 159 164 160 140 160 138 160 176 160 139 161 141 161 210 161 163 161 211 162 142 162 140 162 164 162 141 163 143 163 212 163 210 163 213 164 144 164 142 164 211 164 143 165 186 165 165 165 212 165 166 166 187 166 144 166 213 166 80 167 208 167 212 167 165 167 213 168 209 168 81 168 166 168 208 169 214 169 210 169 212 169 211 170 215 170 209 170 213 170 78 171 163 171 210 171 214 171 211 172 164 172 79 172 215 172 130 173 129 173 71 173 221 173 71 174 129 174 131 174 222 174 132 175 130 175 221 175 219 175 222 176 131 176 133 176 220 176 134 177 132 177 219 177 217 177 220 178 133 178 135 178 218 178 136 179 134 179 217 179 216 179 218 180 135 180 136 180 216 180 216 181 217 181 228 181 230 181 229 182 218 182 216 182 230 182 217 183 219 183 226 183 228 183 227 184 220 184 218 184 229 184 219 185 221 185 224 185 226 185 225 186 222 186 220 186 227 186 221 187 71 187 223 187 224 187 223 188 71 188 222 188 225 188 223 189 230 189 228 189 224 189 229 190 230 190 223 190 225 190 224 191 228 191 226 191 227 192 229 192 225 192 182 193 180 193 233 193 231 193 234 194 181 194 183 194 232 194 111 195 182 195 231 195 253 195 232 196 183 196 112 196 254 196 109 197 111 197 253 197 255 197 254 198 112 198 110 198 256 198 180 199 113 199 251 199 233 199 252 200 114 200 181 200 234 200 113 201 115 201 249 201 251 201 250 202 116 202 114 202 252 202 115 203 117 203 247 203 249 203 248 204 118 204 116 204 250 204 117 205 119 205 245 205 247 205 246 206 120 206 118 206 248 206 119 207 121 207 243 207 245 207 244 208 122 208 120 208 246 208 121 209 123 209 241 209 243 209 242 210 124 210 122 210 244 210 123 211 125 211 239 211 241 211 240 212 126 212 124 212 242 212 125 213 178 213 235 213 239 213 236 214 179 214 126 214 240 214 178 215 127 215 237 215 235 215 238 216 128 216 179 216 236 216 127 217 109 217 255 217 237 217 256 218 110 218 128 218 238 218 237 219 255 219 257 219 275 219 258 220 256 220 238 220 276 220 235 221 237 221 275 221 277 221 276 222 238 222 236 222 278 222 239 223 235 223 277 223 273 223 278 224 236 224 240 224 274 224 241 225 239 225 273 225 271 225 274 226 240 226 242 226 272 226 243 227 241 227 271 227 269 227 272 228 242 228 244 228 270 228 245 229 243 229 269 229 267 229 270 230 244 230 246 230 268 230 247 231 245 231 267 231 265 231 268 232 246 232 248 232 266 232 249 233 247 233 265 233 263 233 266 234 248 234 250 234 264 234 251 235 249 235 263 235 261 235 264 236 250 236 252 236 262 236 233 237 251 237 261 237 279 237 262 238 252 238 234 238 280 238 255 239 253 239 259 239 257 239 260 240 254 240 256 240 258 240 253 241 231 241 281 241 259 241 282 242 232 242 254 242 260 242 231 243 233 243 279 243 281 243 280 244 234 244 232 244 282 244 66 245 107 245 283 245 72 245 284 246 108 246 66 246 72 246 107 247 105 247 285 247 283 247 286 248 106 248 108 248 284 248 105 249 103 249 287 249 285 249 288 250 104 250 106 250 286 250 103 251 101 251 289 251 287 251 290 252 102 252 104 252 288 252 101 253 99 253 291 253 289 253 292 254 100 254 102 254 290 254 99 255 97 255 293 255 291 255 294 256 98 256 100 256 292 256 97 257 95 257 295 257 293 257 296 258 96 258 98 258 294 258 95 259 93 259 297 259 295 259 298 260 94 260 96 260 296 260 93 261 91 261 299 261 297 261 300 262 92 262 94 262 298 262 307 263 308 263 327 263 337 263 328 264 308 264 307 264 338 264 306 265 307 265 337 265 335 265 338 266 307 266 306 266 336 266 305 267 306 267 335 267 339 267 336 268 306 268 305 268 340 268 88 269 90 269 305 269 339 269 305 270 90 270 89 270 340 270 86 271 88 271 339 271 333 271 340 272 89 272 87 272 334 272 84 273 86 273 333 273 329 273 334 274 87 274 85 274 330 274 82 275 84 275 329 275 331 275 330 276 85 276 83 276 332 276 329 277 335 277 337 277 331 277 338 278 336 278 330 278 332 278 329 279 333 279 339 279 335 279 340 280 334 280 330 280 336 280 325 281 331 281 337 281 327 281 338 282 332 282 326 282 328 282 80 283 82 283 331 283 325 283 332 284 83 284 81 284 326 284 208 285 341 285 343 285 214 285 344 286 342 286 209 286 215 286 80 287 325 287 341 287 208 287 342 288 326 288 81 288 209 288 78 289 214 289 343 289 345 289 344 290 215 290 79 290 346 290 78 291 345 291 299 291 91 291 300 292 346 292 79 292 92 292 76 293 323 293 351 293 303 293 352 294 324 294 76 294 303 294 303 295 351 295 349 295 77 295 350 296 352 296 303 296 77 296 77 297 349 297 347 297 304 297 348 298 350 298 77 298 304 298 304 299 347 299 327 299 308 299 328 300 348 300 304 300 308 300 325 301 327 301 347 301 341 301 348 302 328 302 326 302 342 302 295 303 297 303 317 303 309 303 318 304 298 304 296 304 310 304 75 305 315 305 323 305 76 305 324 306 316 306 75 306 76 306 301 307 357 307 355 307 302 307 356 308 358 308 301 308 302 308 302 309 355 309 353 309 74 309 354 310 356 310 302 310 74 310 74 311 353 311 315 311 75 311 316 312 354 312 74 312 75 312 291 313 293 313 361 313 363 313 362 314 294 314 292 314 364 314 363 315 361 315 367 315 365 315 368 316 362 316 364 316 366 316 365 317 367 317 369 317 371 317 370 318 368 318 366 318 372 318 371 319 369 319 375 319 373 319 376 320 370 320 372 320 374 320 313 321 377 321 373 321 375 321 374 322 378 322 314 322 376 322 315 323 353 323 373 323 377 323 374 324 354 324 316 324 378 324 353 325 355 325 371 325 373 325 372 326 356 326 354 326 374 326 355 327 357 327 365 327 371 327 366 328 358 328 356 328 372 328 357 329 359 329 363 329 365 329 364 330 360 330 358 330 366 330 289 331 291 331 363 331 359 331 364 332 292 332 290 332 360 332 73 333 359 333 357 333 301 333 358 334 360 334 73 334 301 334 283 335 285 335 287 335 289 335 288 336 286 336 284 336 290 336 283 337 289 337 359 337 73 337 360 338 290 338 284 338 73 338 72 339 283 339 73 339 73 340 284 340 72 340 293 341 295 341 309 341 361 341 310 342 296 342 294 342 362 342 309 343 311 343 367 343 361 343 368 344 312 344 310 344 362 344 311 345 381 345 369 345 367 345 370 346 382 346 312 346 368 346 313 347 375 347 369 347 381 347 370 348 376 348 314 348 382 348 347 349 349 349 385 349 383 349 386 350 350 350 348 350 384 350 317 351 383 351 385 351 319 351 386 352 384 352 318 352 320 352 297 353 299 353 383 353 317 353 384 354 300 354 298 354 318 354 299 355 343 355 341 355 383 355 342 356 344 356 300 356 384 356 341 357 347 357 383 357 384 358 348 358 342 358 299 359 345 359 343 359 344 360 346 360 300 360 313 361 321 361 379 361 377 361 380 362 322 362 314 362 378 362 315 363 377 363 379 363 323 363 380 364 378 364 316 364 324 364 319 365 385 365 379 365 321 365 380 366 386 366 320 366 322 366 349 367 351 367 379 367 385 367 380 368 352 368 350 368 386 368 323 369 379 369 351 369 352 370 380 370 324 370 399 371 387 371 413 371 401 371 414 372 388 372 400 372 402 372 399 373 401 373 403 373 397 373 404 374 402 374 400 374 398 374 397 375 403 375 405 375 395 375 406 376 404 376 398 376 396 376 395 377 405 377 407 377 393 377 408 378 406 378 396 378 394 378 393 379 407 379 409 379 391 379 410 380 408 380 394 380 392 380 391 381 409 381 411 381 389 381 412 382 410 382 392 382 390 382 409 383 419 383 417 383 411 383 418 384 420 384 410 384 412 384 407 385 421 385 419 385 409 385 420 386 422 386 408 386 410 386 405 387 423 387 421 387 407 387 422 388 424 388 406 388 408 388 403 389 425 389 423 389 405 389 424 390 426 390 404 390 406 390 401 391 427 391 425 391 403 391 426 392 428 392 402 392 404 392 401 393 413 393 415 393 427 393 416 394 414 394 402 394 428 394 317 395 319 395 443 395 441 395 444 396 320 396 318 396 442 396 319 397 389 397 411 397 443 397 412 398 390 398 320 398 444 398 309 399 317 399 441 399 311 399 442 400 318 400 310 400 312 400 381 401 429 401 413 401 387 401 414 402 430 402 382 402 388 402 411 403 417 403 439 403 443 403 440 404 418 404 412 404 444 404 437 405 445 405 443 405 439 405 444 406 446 406 438 406 440 406 433 407 445 407 437 407 435 407 438 408 446 408 434 408 436 408 431 409 447 409 445 409 433 409 446 410 448 410 432 410 434 410 429 411 447 411 431 411 449 411 432 412 448 412 430 412 450 412 413 413 429 413 449 413 415 413 450 414 430 414 414 414 416 414 311 415 447 415 429 415 381 415 430 416 448 416 312 416 382 416 311 417 441 417 445 417 447 417 446 418 442 418 312 418 448 418 441 419 443 419 445 419 446 420 444 420 442 420 415 421 449 421 451 421 475 421 452 422 450 422 416 422 476 422 449 423 431 423 461 423 451 423 462 424 432 424 450 424 452 424 431 425 433 425 459 425 461 425 460 426 434 426 432 426 462 426 433 427 435 427 457 427 459 427 458 428 436 428 434 428 460 428 435 429 437 429 455 429 457 429 456 430 438 430 436 430 458 430 437 431 439 431 453 431 455 431 454 432 440 432 438 432 456 432 439 433 417 433 473 433 453 433 474 434 418 434 440 434 454 434 427 435 415 435 475 435 463 435 476 436 416 436 428 436 464 436 425 437 427 437 463 437 465 437 464 438 428 438 426 438 466 438 423 439 425 439 465 439 467 439 466 440 426 440 424 440 468 440 421 441 423 441 467 441 469 441 468 442 424 442 422 442 470 442 419 443 421 443 469 443 471 443 470 444 422 444 420 444 472 444 417 445 419 445 471 445 473 445 472 446 420 446 418 446 474 446 457 447 455 447 479 447 477 447 480 448 456 448 458 448 478 448 477 449 479 449 481 449 483 449 482 450 480 450 478 450 484 450 483 451 481 451 487 451 485 451 488 452 482 452 484 452 486 452 485 453 487 453 489 453 491 453 490 454 488 454 486 454 492 454 463 455 475 455 485 455 491 455 486 456 476 456 464 456 492 456 451 457 483 457 485 457 475 457 486 458 484 458 452 458 476 458 451 459 461 459 477 459 483 459 478 460 462 460 452 460 484 460 457 461 477 461 461 461 459 461 462 462 478 462 458 462 460 462 453 463 473 463 479 463 455 463 480 464 474 464 454 464 456 464 471 465 481 465 479 465 473 465 480 466 482 466 472 466 474 466 469 467 487 467 481 467 471 467 482 468 488 468 470 468 472 468 467 469 489 469 487 469 469 469 488 470 490 470 468 470 470 470 465 471 491 471 489 471 467 471 490 472 492 472 466 472 468 472 463 473 491 473 465 473 466 474 492 474 464 474 391 475 389 475 503 475 501 475 504 476 390 476 392 476 502 476 393 477 391 477 501 477 499 477 502 478 392 478 394 478 500 478 395 479 393 479 499 479 497 479 500 480 394 480 396 480 498 480 397 481 395 481 497 481 495 481 498 482 396 482 398 482 496 482 399 483 397 483 495 483 493 483 496 484 398 484 400 484 494 484 387 485 399 485 493 485 505 485 494 486 400 486 388 486 506 486 493 487 501 487 503 487 505 487 504 488 502 488 494 488 506 488 493 489 495 489 499 489 501 489 500 490 496 490 494 490 502 490 495 491 497 491 499 491 500 492 498 492 496 492 313 493 381 493 387 493 505 493 388 494 382 494 314 494 506 494 313 495 505 495 503 495 321 495 504 496 506 496 314 496 322 496 319 497 321 497 503 497 389 497 504 498 322 498 320 498 390 498

-
-
-
-
- - - - 0.04166662 0.4583333 0.875 1.291667 1.708333 2.125 2.541667 2.958333 3.375 3.791667 4.208333 4.625 5.041666 5.458333 5.875 6.291666 6.666666 - - - - - - - - 0.766044 0 -0.642788 -2.356726 0 1 0 0 0.642787 0 0.766044 1.99819 0 0 0 1 0.780792 0 -0.624791 -2.083254 0 1 0 0 0.624791 0 0.780792 1.9805 0 0 0 1 0.817998 0 -0.575221 -1.36366 0 1 0 0 0.575221 0 0.817998 1.933954 0 0 0 1 0.865882 0 -0.500249 -0.34917 0 1 0 0 0.500249 0 0.865882 1.86833 0 0 0 1 0.913244 0 -0.407413 0.808986 0 1 0 0 0.407413 0 0.913244 1.793413 0 0 0 1 0.951784 0 -0.306769 1.959581 0 1 0 0 0.30677 0 0.951784 1.718986 0 0 0 1 0.977583 0 -0.210552 2.951387 0 1 0 0 0.210552 0 0.977583 1.65483 0 0 0 1 0.991252 0 -0.131982 3.633174 0 1 0 0 0.131982 0 0.991252 1.610726 0 0 0 1 0.996471 0 -0.083936 3.854877 0 1 0 0 0.083936 0 0.996471 1.597077 0 0 0 1 0.998433 0 -0.055962 3.651654 0 1 0 0 0.055962 0 0.998433 1.686105 0 0 0 1 0.999388 0 -0.034998 3.177883 0 1 0 0 0.034998 0 0.999387 1.893652 0 0 0 1 0.999799 0 -0.020051 2.526856 0 1 0 0 0.020051 0 0.999799 2.178852 0 0 0 1 0.999949 0 -0.01011 1.791866 0 1 0 0 0.01011 0 0.999949 2.500834 0 0 0 1 0.999992 0 -0.004157 1.066205 0 1 0 0 0.004157 0 0.999992 2.818729 0 0 0 1 0.999999 0 -0.001169 0.443166 0 1 0 0 0.001169 0 0.999999 3.091668 0 0 0 1 1 0 -1.24e-4 0.016042 0 1 0 0 1.24e-4 0 1 3.278781 0 0 0 1 1 0 0 -0.123757 0 1 0 0 0 0 1 3.340024 0 0 0 1 - - - - - - - - LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 0.04166662 0.4583333 0.875 1.291667 1.708333 2.125 2.541667 2.958333 3.375 3.791667 4.208333 4.625 5.041666 5.458333 5.875 6.291666 6.666666 - - - - - - - - 0.866025 0 -0.5 -1.5 0 1 0 0 0.5 0 0.866025 2.598076 0 0 0 1 0.911559 0 -0.41117 -1.241705 0 1 0 0 0.41117 0 0.911559 2.523042 0 0 0 1 0.987073 0 -0.160273 -0.562045 0 1 0 0 0.160273 0 0.987073 2.325605 0 0 0 1 0.978138 0 0.207959 0.396146 0 1 0 0 -0.207959 0 0.978137 2.047256 0 0 0 1 0.806608 0 0.591086 1.49003 0 1 0 0 -0.591086 0 0.806608 1.729488 0 0 0 1 0.495349 0 0.868694 2.576774 0 1 0 0 -0.868694 0 0.495349 1.413796 0 0 0 1 0.155432 0 0.987847 3.513539 0 1 0 0 -0.987847 0 0.155432 1.141671 0 0 0 1 -0.092766 0 0.995688 4.157491 0 1 0 0 -0.995688 0 -0.092766 0.954606 0 0 0 1 -0.172849 0 0.984948 4.366606 0 1 0 0 -0.984948 0 -0.172849 0.894249 0 0 0 1 -0.084513 0 0.996422 4.143567 0 1 0 0 -0.996422 0 -0.084513 1.001807 0 0 0 1 0.12281 0 0.99243 3.623597 0 1 0 0 -0.99243 0 0.12281 1.252557 0 0 0 1 0.397304 0 0.917687 2.909086 0 1 0 0 -0.917687 0 0.397304 1.597123 0 0 0 1 0.667503 0 0.744607 2.102423 0 1 0 0 -0.744607 0 0.667503 1.986127 0 0 0 1 0.866941 0 0.498411 1.306 0 1 0 0 -0.498411 0 0.866941 2.370194 0 0 0 1 0.969263 0 0.246028 0.622206 0 1 0 0 -0.246028 0 0.969263 2.699947 0 0 0 1 0.998122 0 0.061259 0.153432 0 1 0 0 -0.061259 0 0.998122 2.926009 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 3 0 0 0 1 - - - - - - - - LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 0.04166662 0.4583333 0.875 1.291667 1.708333 2.125 2.541667 2.958333 3.375 3.791667 4.208333 4.625 5.041666 5.458333 5.875 6.291666 6.666666 - - - - - - - - 0.984808 0 -0.173648 0 0 1 0 0 0.173648 0 0.984808 0 0 0 0 1 0.979784 0 -0.20006 0 0 1 0 0 0.20006 0 0.979784 0 0 0 0 1 0.963191 0 -0.268817 0 0 1 0 0 0.268817 0 0.963191 0 0 0 0 1 0.931638 0 -0.363388 0 0 1 0 0 0.363388 0 0.931638 0 0 0 0 1 0.884318 0 -0.466885 0 0 1 0 0 0.466885 0 0.884318 0 0 0 0 1 0.825966 0 -0.563721 0 0 1 0 0 0.563721 0 0.825966 0 0 0 0 1 0.767162 0 -0.641453 0 0 1 0 0 0.641453 0 0.767162 0 0 0 0 1 0.722476 0 -0.691396 0 0 1 0 0 0.691396 0 0.722476 0 0 0 0 1 0.707365 0 -0.706849 0 0 1 0 0 0.706849 0 0.707365 0 0 0 0 1 0.735132 0 -0.677924 0 0 1 0 0 0.677924 0 0.735132 0 0 0 0 1 0.795203 0 -0.606343 0 0 1 0 0 0.606343 0 0.795203 0 0 0 0 1 0.866325 0 -0.49948 0 0 1 0 0 0.49948 0 0.866325 0 0 0 0 1 0.929413 0 -0.36904 0 0 1 0 0 0.36904 0 0.929413 0 0 0 0 1 0.972562 0 -0.232643 0 0 1 0 0 0.232643 0 0.972562 0 0 0 0 1 0.99375 0 -0.111628 0 0 1 0 0 0.111628 0 0.99375 0 0 0 0 1 0.99962 0 -0.027581 0 0 1 0 0 0.027581 0 0.99962 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 - - - - - - - - LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - - - 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 - - - 1 8.60423e-16 -2.98023e-8 0 -2.52576e-15 1 4.44089e-16 1.82077e-14 1.49012e-8 -6.66134e-16 0.9999999 3 0 0 0 1 - - - 1 -2.63678e-15 2.08616e-7 -0.1237571 3.27238e-14 1 2.44249e-14 -4.5685e-8 -1.04308e-7 -1.70974e-14 1 3.340024 0 0 0 1 - - - - - - - - - -
\ No newline at end of file diff --git a/tests/files/collada/mesh/mesh_simple.blend b/tests/files/collada/mesh/mesh_simple.blend deleted file mode 100644 index 2f5131fac03..00000000000 --- a/tests/files/collada/mesh/mesh_simple.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d7137924dfe7f7a38d2a5ef5357f1c3e5fecd1c1dbd1925eb6647286ad71fef -size 97764 diff --git a/tests/files/collada/mesh/mesh_simple_001.dae b/tests/files/collada/mesh/mesh_simple_001.dae deleted file mode 100644 index 3e1a035fceb..00000000000 --- a/tests/files/collada/mesh/mesh_simple_001.dae +++ /dev/null @@ -1,176 +0,0 @@ - - - - - Blender User - Blender 2.79.2 commit date:2018-02-23, commit time:14:31, hash:71e0025 - - 2018-02-23T16:26:44 - 2018-02-23T16:26:44 - - Z_UP - - - - - - - - - 0 0 0 1 - - - 0 0 0 1 - - - 0.8 0 0 1 - - - 0.5 0.5 0.5 1 - - - 50 - - - 1 - - - - - - - - - - - 0 0 0 1 - - - 0 0 0 1 - - - 0 0.8 0 1 - - - 0.5 0.5 0.5 1 - - - 50 - - - 1 - - - - - - - - - - - 0 0 0 1 - - - 0 0 0 1 - - - 0 0 0.8 1 - - - 0.5 0.5 0.5 1 - - - 50 - - - 1 - - - - - - - - - - - - - - - - - - - - - - -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -2 -2 2 -2 2 2 2 -2 2 2 2 2 -2 -2 -2 -2 2 -2 2 -2 -2 2 2 -2 -2 -2 3 -2 2 3 2 -2 3 2 2 3 - - - - - - - - - - -1 0 0 0 1 0 1 0 0 0 -1 0 0 -0.7071068 0.7071068 0.7071068 0 -0.7071068 -0.7071068 0 -0.7071068 0 -0.7071068 -0.7071068 0 0.7071068 -0.7071068 0 0.7071068 0.7071068 -0.7071068 0 0.7071068 0.7071068 0 0.7071068 - - - - - - - - - - - - - -

18 19 18 10 8 16 17 9 11 19

-
- - - - 4 4 4 4 -

5 5 7 5 11 5 10 5 3 6 1 6 8 6 9 6 1 7 5 7 10 7 8 7 7 8 3 8 9 8 11 8

-
- - - - 4 4 4 4 -

0 0 1 0 3 0 2 0 2 1 3 1 7 1 6 1 6 2 7 2 5 2 4 2 4 3 5 3 1 3 0 3

-
- - - - 4 4 4 4 -

4 4 0 4 12 4 14 4 2 9 6 9 15 9 13 9 0 10 2 10 13 10 12 10 6 11 4 11 14 11 15 11

-
-
-
-
- - - - - 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 - - - - - - - - - - - - - - - -
\ No newline at end of file diff --git a/tests/python/CMakeLists.txt b/tests/python/CMakeLists.txt index c1ae5aad16d..9f0d178270e 100644 --- a/tests/python/CMakeLists.txt +++ b/tests/python/CMakeLists.txt @@ -1322,27 +1322,6 @@ if(WITH_UI_TESTS) endif() -# ------------------------------------------------------------------------------ -# COLLADA Tests -# ------------------------------------------------------------------------------ - -if(TEST_SRC_DIR_EXISTS) - function(collada_test module test_name blend_file) - add_blender_test( - bf_io_collada_${module}_${test_name} - ${TEST_SRC_DIR}/collada/${module}/${blend_file} - --python ${CMAKE_CURRENT_LIST_DIR}/${module}/test_${module}_${test_name}.py -- - --testdir ${TEST_SRC_DIR}/collada/${module} - ) - endfunction() - - # Tests are disabled because they only work on Windows - # Tests will be redone completely to work reliable - # - # collada_test(mesh simple mesh_simple.blend) - # collada_test(animation simple suzannes_parent_inverse.blend) -endif() - # ------------------------------------------------------------------------------ # VIEW LAYER Tests # ------------------------------------------------------------------------------ diff --git a/tests/python/collada/animation/test_animation_simple.py b/tests/python/collada/animation/test_animation_simple.py deleted file mode 100644 index 3d86bbabfb8..00000000000 --- a/tests/python/collada/animation/test_animation_simple.py +++ /dev/null @@ -1,283 +0,0 @@ -#!/usr/bin/env python3 -# SPDX-FileCopyrightText: 2018-2023 Blender Authors -# -# SPDX-License-Identifier: GPL-2.0-or-later - -""" -Call as follows: -python collada_mesh_simple.py --blender PATH_TO_BLENDER_EXE --testdir tests/files/collada/mesh -""" - -import sys -import bpy -import argparse -import functools -import shutil -import tempfile -import unittest -import difflib -import pathlib -from pathlib import Path - - -def with_tempdir(wrapped): - """Creates a temporary directory for the function, cleaning up after it returns normally. - - When the wrapped function raises an exception, the contents of the temporary directory - remain available for manual inspection. - - The wrapped function is called with an extra positional argument containing - the pathlib.Path() of the temporary directory. - """ - - @functools.wraps(wrapped) - def decorator(*args, **kwargs): - dirname = tempfile.mkdtemp(prefix='blender-collada-test') - # print("Using tempdir %s" % dirname) - try: - retval = wrapped(*args, pathlib.Path(dirname), **kwargs) - except: - print('Exception in %s, not cleaning up temporary directory %s' % (wrapped, dirname)) - raise - else: - shutil.rmtree(dirname) - return retval - - return decorator - - -LINE = "+----------------------------------------------------------------" - - -class AbstractColladaTest(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.testdir = pathlib.Path(args.testdir) - - def checkdae(self, reference, export): - """ - collada verifier checks if exported dae file is the same as reference dae - """ - - ref = open(reference) - exp = open(export) - diff = difflib.unified_diff(ref.readlines(), exp.readlines(), lineterm='', n=0) - ref.close() - exp.close() - - diff_count = 0 - for line in diff: - error = True - for prefix in ('---', '+++', '@@'): - # Ignore diff metadata - if line.startswith(prefix): - error = False - break - else: - # Ignore time stamps - for ignore in ('', '', ''): - if line[1:].strip().startswith(ignore): - error = False - break - if error: - diff_count += 1 - pline = line.strip() - if diff_count == 1: - print("\n%s" % LINE) - print("|Test has errors:") - print(LINE) - pre = "reference" if pline[0] == "-" else "generated" - print("| %s:%s" % (pre, pline[1:])) - - if diff_count > 0: - print(LINE) - print("ref :%s" % reference) - print("test:%s" % export) - print("%s\n" % LINE) - - return diff_count == 0 - - -class MeshExportTest4(AbstractColladaTest): - @with_tempdir - def test_export_animation_suzannes_sample_matrix(self, tempdir: pathlib.Path): - test = "suzannes_parent_inverse_sample_10_matrix" - reference_dae = self.testdir / Path("%s.dae" % test) - outfile = tempdir / Path("%s_out.dae" % test) - - bpy.ops.wm.collada_export( - filepath=str(outfile), - check_existing=True, - filemode=8, - display_type='DEFAULT', - sort_method='FILE_SORT_ALPHA', - apply_modifiers=True, - export_mesh_type=0, - export_mesh_type_selection='view', - selected=True, - include_children=True, - include_armatures=True, - include_shapekeys=False, - deform_bones_only=False, - include_animations=True, - sample_animations=True, - sampling_rate=10, - active_uv_only=False, - use_texture_copies=True, - triangulate=False, - use_object_instantiation=True, - use_blender_profile=True, - sort_by_name=False, - export_transformation_type=0, - export_transformation_type_selection='matrix', - export_texture_type=0, - export_texture_type_selection='mat', - open_sim=False, - limit_precision=True, - keep_bind_info=False, - ) - - # Now check the resulting Collada file. - if not self.checkdae(reference_dae, outfile): - self.fail() - - -class MeshExportTest3(AbstractColladaTest): - @with_tempdir - def test_export_animation_suzannes_sample_locrotscale(self, tempdir: pathlib.Path): - test = "suzannes_parent_inverse_sample_10_channels" - reference_dae = self.testdir / Path("%s.dae" % test) - outfile = tempdir / Path("%s_out.dae" % test) - - bpy.ops.wm.collada_export( - filepath=str(outfile), - check_existing=True, - filemode=8, - display_type='DEFAULT', - sort_method='FILE_SORT_ALPHA', - apply_modifiers=True, - export_mesh_type=0, - export_mesh_type_selection='view', - selected=True, - include_children=True, - include_armatures=True, - include_shapekeys=False, - deform_bones_only=False, - include_animations=True, - sample_animations=True, - sampling_rate=10, - active_uv_only=False, - use_texture_copies=True, - triangulate=False, - use_object_instantiation=True, - use_blender_profile=True, - sort_by_name=False, - export_transformation_type=0, - export_transformation_type_selection='transrotloc', - export_texture_type=0, - export_texture_type_selection='mat', - open_sim=False, - limit_precision=True, - keep_bind_info=False, - ) - - # Now check the resulting Collada file. - if not self.checkdae(reference_dae, outfile): - self.fail() - - -class MeshExportTest2(AbstractColladaTest): - @with_tempdir - def test_export_animation_suzannes_keyframe_matrix(self, tempdir: pathlib.Path): - test = "suzannes_parent_inverse_keyframes_matrix" - reference_dae = self.testdir / Path("%s.dae" % test) - outfile = tempdir / Path("%s_out.dae" % test) - - bpy.ops.wm.collada_export( - filepath=str(outfile), - check_existing=True, - filemode=8, - display_type='DEFAULT', - sort_method='FILE_SORT_ALPHA', - apply_modifiers=True, - export_mesh_type=0, - export_mesh_type_selection='view', - selected=True, - include_children=True, - include_armatures=True, - include_shapekeys=False, - deform_bones_only=False, - include_animations=True, - sample_animations=False, - sampling_rate=1, - active_uv_only=False, - use_texture_copies=True, - triangulate=False, - use_object_instantiation=True, - use_blender_profile=True, - sort_by_name=False, - export_transformation_type=0, - export_transformation_type_selection='matrix', - export_texture_type=0, - export_texture_type_selection='mat', - open_sim=False, - limit_precision=True, - keep_bind_info=False, - ) - - # Now check the resulting Collada file. - if not self.checkdae(reference_dae, outfile): - self.fail() - - -class MeshExportTest1(AbstractColladaTest): - @with_tempdir - def test_export_animation_suzannes_keyframe_locrotscale(self, tempdir: pathlib.Path): - test = "suzannes_parent_inverse_keyframes_channels" - reference_dae = self.testdir / Path("%s.dae" % test) - outfile = tempdir / Path("%s_out.dae" % test) - - bpy.ops.wm.collada_export( - filepath=str(outfile), - check_existing=True, - filemode=8, - display_type='DEFAULT', - sort_method='FILE_SORT_ALPHA', - apply_modifiers=True, - export_mesh_type=0, - export_mesh_type_selection='view', - selected=True, - include_children=True, - include_armatures=True, - include_shapekeys=False, - deform_bones_only=False, - include_animations=True, - sample_animations=False, - sampling_rate=1, - active_uv_only=False, - use_texture_copies=True, - triangulate=False, - use_object_instantiation=True, - use_blender_profile=True, - sort_by_name=False, - export_transformation_type=0, - export_transformation_type_selection='transrotloc', - export_texture_type=0, - export_texture_type_selection='mat', - open_sim=False, - limit_precision=True, - keep_bind_info=False, - ) - - # Now check the resulting Collada file. - if not self.checkdae(reference_dae, outfile): - self.fail() - - -if __name__ == '__main__': - sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []) - parser = argparse.ArgumentParser() - parser.add_argument('--testdir', required=True) - args, remaining = parser.parse_known_args() - unittest.main(argv=sys.argv[0:1] + remaining) diff --git a/tests/python/collada/mesh/test_mesh_simple.py b/tests/python/collada/mesh/test_mesh_simple.py deleted file mode 100644 index 20806100ee5..00000000000 --- a/tests/python/collada/mesh/test_mesh_simple.py +++ /dev/null @@ -1,149 +0,0 @@ -#!/usr/bin/env python3 -# SPDX-FileCopyrightText: 2018-2023 Blender Authors -# -# SPDX-License-Identifier: GPL-2.0-or-later - -""" -Call as follows: -python collada_mesh_simple.py --blender PATH_TO_BLENDER_EXE --testdir tests/files/collada/mesh -""" - -import sys -import bpy -import argparse -import functools -import shutil -import tempfile -import unittest -import difflib -import pathlib -from pathlib import Path - - -def with_tempdir(wrapped): - """Creates a temporary directory for the function, cleaning up after it returns normally. - - When the wrapped function raises an exception, the contents of the temporary directory - remain available for manual inspection. - - The wrapped function is called with an extra positional argument containing - the pathlib.Path() of the temporary directory. - """ - - @functools.wraps(wrapped) - def decorator(*args, **kwargs): - dirname = tempfile.mkdtemp(prefix='blender-collada-test') - # print("Using tempdir %s" % dirname) - try: - retval = wrapped(*args, pathlib.Path(dirname), **kwargs) - except: - print('Exception in %s, not cleaning up temporary directory %s' % (wrapped, dirname)) - raise - else: - shutil.rmtree(dirname) - return retval - - return decorator - - -LINE = "+----------------------------------------------------------------" - - -class AbstractColladaTest(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.testdir = pathlib.Path(args.testdir) - - def checkdae(self, reference, export): - """ - collada verifier checks if exported dae file is the same as reference dae - """ - - ref = open(reference) - exp = open(export) - diff = difflib.unified_diff(ref.readlines(), exp.readlines(), lineterm='', n=0) - ref.close() - exp.close() - - diff_count = 0 - for line in diff: - error = True - for prefix in ('---', '+++', '@@'): - # Ignore diff metadata - if line.startswith(prefix): - error = False - break - else: - # Ignore time stamps - for ignore in ('', '', ''): - if line[1:].strip().startswith(ignore): - error = False - break - if error: - diff_count += 1 - pline = line.strip() - if diff_count == 1: - print("\n%s" % LINE) - print("|Test has errors:") - print(LINE) - pre = "reference" if pline[0] == "-" else "generated" - print("| %s:%s" % (pre, pline[1:])) - - if diff_count > 0: - print(LINE) - print("ref :%s" % reference) - print("test:%s" % export) - print("%s\n" % LINE) - - return diff_count == 0 - - -class MeshExportTest(AbstractColladaTest): - @with_tempdir - def test_export_single_mesh(self, tempdir: pathlib.Path): - test = "mesh_simple_001" - reference_dae = self.testdir / Path("%s.dae" % test) - outfile = tempdir / Path("%s_out.dae" % test) - - bpy.ops.wm.collada_export( - filepath=str(outfile), - check_existing=True, - filemode=8, - display_type="DEFAULT", - sort_method="FILE_SORT_ALPHA", - apply_modifiers=False, - export_mesh_type=0, - export_mesh_type_selection="view", - selected=False, - include_children=False, - include_armatures=False, - include_shapekeys=True, - deform_bones_only=False, - sampling_rate=0, - active_uv_only=False, - use_texture_copies=True, - triangulate=False, - use_object_instantiation=True, - use_blender_profile=True, - sort_by_name=False, - export_transformation_type=0, - export_transformation_type_selection="matrix", - export_texture_type=0, - export_texture_type_selection="mat", - open_sim=False, - limit_precision=False, - keep_bind_info=False, - ) - - # Now check the resulting Collada file. - if not self.checkdae(reference_dae, outfile): - self.fail() - - -if __name__ == '__main__': - sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []) - parser = argparse.ArgumentParser() - parser.add_argument('--testdir', required=True) - args, remaining = parser.parse_known_args() - unittest.main(argv=sys.argv[0:1] + remaining) diff --git a/tools/utils/git_log_review_commits_advanced.py b/tools/utils/git_log_review_commits_advanced.py index 0e46a0a827d..9e444366cc2 100755 --- a/tools/utils/git_log_review_commits_advanced.py +++ b/tools/utils/git_log_review_commits_advanced.py @@ -195,7 +195,6 @@ BUGFIX_CATEGORIES = ( ("System / Misc", ( "Audio", - "Collada", "File I/O", "Other", "Python", diff --git a/tools/utils_api/bpy_introspect_ui.py b/tools/utils_api/bpy_introspect_ui.py index 094e83eaef3..75420e52f23 100644 --- a/tools/utils_api/bpy_introspect_ui.py +++ b/tools/utils_api/bpy_introspect_ui.py @@ -316,7 +316,6 @@ def fake_main(): bpy.app.build_options.fluid = True bpy.app.build_options.freestyle = True bpy.app.build_options.mod_fluid = True - bpy.app.build_options.collada = True bpy.app.build_options.international = True bpy.app.build_options.mod_smoke = True bpy.app.build_options.alembic = True diff --git a/tools/utils_doc/code_layout_diagram.py b/tools/utils_doc/code_layout_diagram.py index e166ee8eed1..b7e8c175221 100644 --- a/tools/utils_doc/code_layout_diagram.py +++ b/tools/utils_doc/code_layout_diagram.py @@ -326,7 +326,6 @@ SECTIONS = ( ("materialx", "A standard for representing materials. Used by USD, Hydra & Blender's shader nodes."), ("mesa", "Used for it's software OpenGL implementation."), ("openal", "Cross platform audio output."), - ("opencollada", "Support for the COLLADA 3D interchange file format."), ("opencolorio", "A solution for highly precise, performant, and consistent color management."), ("openexr", "EXR image-format support."), ("openimagedenoise", "Denoising filters for images rendered with ray tracing. Used by Cycles."),